OwnerMind coaches

Four distinct coach identities, the first-run selection, in-app presence, and the change-coach handover. Drawn in the language the app actually shipspackages/sana-ui on origin/develop exports DeskRoot, Masthead, ContextBar, ReviewLane, Proposal, rendering omhead / rulebar / ctxbar / orient. Those are the Desk classes verbatim, so this pack uses the real stylesheet rather than a lookalike.

The constraint that shaped every name on this page

A coach signals style, never authority. So none of the four has a financial background — not a softened one, none. Their crafts are story editing, teaching argument, wire editing and archiving: chosen for how a person listens and presses, and chosen because they make a credential claim structurally impossible rather than merely discouraged. There is no CFA to omit if nobody was ever in finance.

This sits on OwnerMind's standing rule — show, structure, compare, calculate, journal, question; never score, rank, recommend or size. A coach changes how the questions sound, never what the answer is. Two users with different coaches and identical inputs must reach identical arithmetic.

One coach by style, many specialists by topic

Worth stating before the roster, because the app already has ten named agents and these four are not more of them:

Existing agentsNew coaches
AxisTopic — evidence, accounting, moat, valuationStyle — how they talk to you
How manyMany; you consult whichever fits the questionOne, permanent, until you change it
ChosenPer question, in the Review LaneOnce at first sign-in
ExamplesMira Chen · Elias Ward · Priya Raman · Tessa Morgan · Julian ParkNadia Halim · Daniel Osei · June Sato · Arthur Lindqvist

Keeping these axes separate is what stops the roster becoming fourteen faces with no organising idea. Your coach is the voice that greets you and holds your history; the specialists are who your coach brings in.

The roster

NH

Nadia Halim

Steady guide

Spent ten years as a documentary story editor, sitting with hundreds of hours of footage until the through-line showed itself. She is used to long projects that only make sense in retrospect, and to resisting the cut that would feel satisfying too early.

UnhurriedOrienting Names where you areRarely interrupts
Sounds likeYou have three threads open and one of them is nearly finished. Want to close that one before we start the next?
DO

Daniel Osei

Rigorous questioner

Taught argumentation for a decade and ran a university debate programme where students had to argue the side they disagreed with. He is more interested in whether reasoning holds than in whether he agrees with the conclusion.

Presses on reasoningAsks for falsifiers Comfortable with silenceNever scores you
Sounds likeWhat would have to be true for the opposite of this to hold? If you can't answer that yet, it might be the next thing to look at.
JS

June Sato

Concise partner

Worked the wire desk of a daily newsroom, where a story had to be accurate and eighty words. She learned to find the one operative fact quickly and to say when something is not yet worth writing.

Short answersOne question at a time Says when to stopNo preamble
Sounds likeTwo of your four inputs are still assumptions. Which one matters most? Start there.
AL

Arthur Lindqvist

Reflective mentor

Spent his career as an archivist of personal papers, reading how people's thinking changed across decades of letters and notebooks. He is unusually good at noticing when someone has quietly changed their mind without saying so.

Connects to your past notesSlow, warm Notices driftQuotes you to you
Sounds likeIn March you wrote that the moat was the switching cost. You haven't mentioned it since. Has your view moved, or has it just gone quiet?

Faces, and why they are drawn this way

Tavus-ready by construction, not by retrofit. Every portrait sits in a fixed circular crop with a flat, low-contrast field behind the head and no detail near the jaw, so a still image and a talking-head loop occupy exactly the same frame. Swapping one for the other changes nothing else on the page — no reflow, no second layout to maintain. The CourseVenture companion faces are the direct precedent.

The coloured fields on this page are placeholders standing in for real portraits. What is being specified is the frame, the safe area, the sizes and the states:

SizeWhereVideo
xl 132pxFirst-run selection, handoverLoop on hover / on select
lg 84pxRoster cardsStill, loop on hover
md 52pxCoach dock headerLoop while speaking
sm 34pxReview Lane rosterStill
xs 26pxInline in a proposalStill

The field colours are deliberately outside the --pos / --neg / --warn scale, so a coach's identity can never be misread as a status signal.

Presence panel v2 — revised 31 Jul on Khoa’s feedback

Roster, selection and handover stand as delivered. The panel is rebuilt to the order asked for: coach face at the top as the identity anchor, specialist faces directly beneath (hover or keyboard focus reveals the role; on touch the first tap reveals and a second brings them in, so one control teaches itself), one always-on box holding the coach’s standing read, then the chat lane with the dock at the bottom and responses streaming above it.

What “super smooth creamy chat” actually required

Four decisions, and all four have to survive the build or the feel goes:

The panel slides away, and the stage works alone

Added on Khoa’s follow-up. The mechanism was already shipped — .app3 transitions its grid columns and .app3.drawer-closed collapses the third to zero — so it is reused, not reinvented. Three things are new:

The one build decision that carries the contract

The app streams with useChat from @ai-sdk/react and renders through AgentMarkdown — i.e. prose. So a draft card must not be parsed back out of that prose. It has to arrive as a structured stream part (an AI SDK data part or tool result) carrying field, value, provenance and specialist, which the panel renders as a card.

Regexing markdown for something that looks like a proposal is how “the contract lives inline, never loose text” quietly stops being true — and it would fail silently, which is the worst kind. This is the difference between the constraint being enforced and merely intended.

The assets — two commits, deliberately

Both files ship in /assets alongside a manifest and the CSS to consume them. They are two independent changes and should land as two commits, so the defect fix is visible on its own rather than buried inside a feature.

Commit 1 — fix the index-5 double-booking (a live defect)

Sofia Bennett and Lena Ortiz both render avatar: 5 today, so two agents wear the same face in the Review Lane. Lena moves to a new index 9.

The live sheet is not touched. Not re-laid, not reordered, not re-encoded — the nine shipped portraits keep their exact bytes and their exact indices. A separate 1.6 KB strip carries the new cells.

I tried the obvious thing first and it was wrong: rebuilding one larger sheet re-encodes every existing portrait. My own check caught it — a lossy round-trip changed every pixel of all nine faces, so "append-only" was false. Saving losslessly fixed the pixels but took the file from 117 KB to 818 KB. Appending a small strip costs nothing and risks nothing.

Commit 2 — the coach sheet

A separate 2 KB 2×2 sheet with its own c0c3 namespace. Coaches are a different axis from specialists, so they get their own asset and their own numbering — continuing the agent sequence is how a coach ends up rendering a specialist's face after a later insert.

The portraits are placeholders, and that is a real limit

The existing nine are photorealistic head-and-shoulders portraits. I have no image generation in this environment, so I cannot produce four matching faces — and I will not ship a fabricated likeness dressed up as finished work.

What I have produced instead is silhouettes at the measured framing: 418 px cells, head top at 7.3% of cell height, shoulders spanning 29.5–70.8% at 62% height, all measured off the live sheet rather than guessed. The crop is therefore already correct and a real still is a pure asset swap with zero layout change.

My recommendation on how the real ones should be made: take them as stills from each coach's Tavus replica, not from a separate generation pass. Generate the portraits first and the still and the video are two different people the moment Tavus is wired — which is exactly the mismatch this brief asked us to avoid. That makes replica casting the real blocker, and it is a cheaper decision to make now than to unpick later.

For Charlene — what this drops into

The existing shape on origin/develop (apps/web/components/MemoWorkspaceApp.tsx) is:

{ name, role, avatar: number, expertise, useWhen, bio }

These four fit it directly. role takes the anchor (“Steady guide”), bio takes the background, useWhen takes the choosing sentence. Two notes worth having before you start:

Open for Khoa

Sana · design · 31 Jul 2026 · clickable pack, not a build spec · schema and roster read from origin/develop, faces are placeholders