The generic assistant path — Discover through Live, then Guest on the phone.
The template-agnostic MASTER build contract for every surface an assistant passes through — in the 8-section shape (design-canon.md § “Assistant-flow mockup structure”) the five per-assistant flow files inherit.
card → live → monitored → reactivated pre: Overview → Personalize → Connect → Try · post: Pulse → Overview → Personalize → Connect mobile 375 default · desktop 1180 for seated sheets & splits · tablet 768 progressive status color = exceptions only · white glows onlyWidths here sample a fluid continuum — content
scales continuously; structure steps only at sm 640 · md 768 ·
lg 1024; radius/hairlines/pills never scale. Kit: design-canon.md
U8.
This file is the canonical, template-agnostic structure an assistant moves through on MystFlo — every surface of its life, regardless of which template it is: the Explore pre card → share → Team → the pre detail sheet (Overview → Personalize → Connect → Try) → activation and its five real outcomes → the Pulse wall, status ladder, Needs your attention inbox (8c) and post detail sheet → edit-class gating while live → “Waiting on you” → reactivation → the split → Billing. It is the PRIMARY build contract for these surfaces (mockup-artifact-first): the numbered archetypes in docs/design/archetypes/ are the per-frame pass-bar, and the five per-assistant flow files in this folder inherit this file's structure and must not contradict it. Frames are drawn on On-Brand Support (TMPL-9P3X) as the worked example — that content is illustrative; the structure, slots and locks are the contract.
prd-as-*.md.ASST-* id lead everywhere (cards, sheets, usage rows); template name steps down to the sub-line. Pre-activation surfaces carry template identity (TMPL-*).+N doorway; sort required-not-connected first; verbs Reconnect / Pending only; never a cost signal.activate-assistant pipeline produces, drawn as full states, not a spinner.
FOUNDER LANE — one generic assistant, six phases · numbers = this file's frames
§1 DISCOVER §2 SET UP §3 ACTIVATE §4 LIVE
┌────────────────┐ ┌────────────────────────┐ ┌───────────────┐ ┌─────────────────────┐
│ 1 Explore │ │ 3 Overview │ │ 7 Activation │ │ 8 Pulse wall │
│ pre card │──►│ 4a·4b Personalize │──►│ five │──►│ 8b status ladder │
│ 1b Share │ │ (phone·browser) │ │ outcomes │ │ 9·9b post sheet │
│ 2 Team │ │ 5·5b Connect+pickers │ │ (R12) │ │ 10·11 post tabs │
└────────────────┘ │ 6 Try │ └───────────────┘ │ 12 Waiting on you │
└────────────────────────┘ └──────────┬──────────┘
│ pause · stop
§6 MONEY §5 CHANGE ▼
┌─────────────────────┐ ┌───────────────────────────────────────┐
│ 15 Billing rows │◄──│ 13·13b Reactivation │◄──────── from §4
│ wallet · usage │ │ 9c·9d·13c·13d Edit-class gating (A6) │
│ by assistant │ │ 14 The split — apps · funds · Brain │
└─────────────────────┘ └───────────────────────────────────────┘
pre detail tabs: Overview → Personalize → Connect → Try (frames 3–6)
post detail tabs: Pulse → Overview → Personalize → Connect (frames 9–11 · 9c · 9d)
Phase vocabulary: no single PRD
locks a journey for the template-agnostic master, so this file uses the canon U10 fallback
order — discover → set up → activate → live → change → money — which is also section 6's
§1–§6 grouping. Per-assistant flow files reproduce their own PRD's journey diagram verbatim
instead. The lifecycle state machine itself (activate → run → pause/resume/stop →
reactivate, every transition audited and billed) is owned by
prd-pl-assistant-lifecycle.md; the pre-tab pipeline by
prd-pl-activation-wizard.md.
Whoever opens it lands on a preview of this assistant — they can look around without an account.
Archetype: assistant-summary-card.md.
Whoever opens it lands on a preview of this assistant — they can look around without an account.
Whoever opens it lands on a preview of this assistant — they can look around without an account.
Archetype: assistant-summary-card.md (both variants).
It reads your Brain — prices, policies, hours, FAQs, and your brand voice — and answers guests in the voice you confirmed. Anything it can't ground in your knowledge gets handed to you.
Archetype: assistant-detail-tabs.md.
What it answers on its own — Brain values are prefilled below.
Full Brain readiness — what's confirmed, what still needs you — lives on Connect →.
expands in place — Google Sheets · Google Calendar · Gmail · Slack · Shopify · Calendly · Airtable
canActivate → Activate (white). Live → View in Pulse. Full label set: #sec-5c and explore.html #f9.Connect white/no-chevron → Connected ⌄ → Reconnect ⌄ → Pending ⌄, disconnect/reconnect in ITS menu). The badge carries a caret ONLY when ≥2 apps are actually in play for that role — real alternatives, or several connected at once. Single-app rows get no caret and NO ⊘ coming soon placeholder (that affordance is deleted, not stubbed). Today with a caret: Storage (3 destinations) · Waitlist+Launch Communication (WhatsApp + Resend). Without: this frame's Communication and Payment, Alerts, AI Model.Both tiers drawn per R22. Archetype: assistant-detail-tabs.md.
The three leftover honesty rules on one compact frame. Connect is finished (no Reconnect). Wallet is still loading. Brain has one Optional row — not a blocker. Header is quiet Continue to Try, never amber Complete Setup, never Activate.
usePaymentMethods / the first payment fetch is in flight. A first-paint Wallet ✕ is a FAIL only after the bar has settled (~1s). Does not rewire canProceed.ready: true). Contrast #sec-5, where Dates & capacity is a blocker and “before it can take a booking” is correct.bc-act, no amber class) even while its status glyph is dim ○; amber is reserved for a row the gate itself flags blocking (never re-derived from status alone — a required field the gate marks satisfied stays muted even if its display status is unverified). This frame previously rendered "Add in Brain →" amber on the Optional row, contradicting its own "not a blocker" note — fixed to match #sec-5.canActivate is still false (Try not finished) → quiet Continue to Try. Amber Complete Setup is only for incomplete Connect/Personalize (or guests). Activate is white primary and only when canActivate. Full four-label set: explore.html #f9.Every Connect row is TWO controls with one job each. Badge = which apps are in play for the role (default seeded from Personalize/channel choices) — carries a ▾ only when ≥2 apps are actually in play. Status button = connection lifecycle only (Connect white/no-chevron → Connected ⌄ → Reconnect ⌄ → Pending ⌄); disconnect/reconnect/switch-account live in ITS menu. The two never conflate.
Pass 3 (2026-08-10) adds one rule that runs through every frame below: there is ONE control species, and an impossible action is greyed and explained — never removed. Wherever a connection's lifecycle is shown — the row, and every app inside an expanded picker — it is the same button with its chevron INSIDE it. The disambiguation list's old Connected ✓ text + underlined Disconnect link is deleted. A connected status button ALWAYS carries its chevron, and a menu item that can't fire (Disconnect on MystFlo AI, Reconnect while Pending, a row-level action on a multi-app row) renders greyed with its reason on the line beneath it. 375 first, then the 640 stack boundary, then desktop.
Why this does NOT reopen the badge-caret rule: the two controls are asked different questions. The badge answers “which app?” — with one app in play there is no list, so a caret would open onto nothing, and that affordance stays deleted (2026-08-09 stands). The status button answers “what can I do with this connection?” — and there is always an answer, including “not this one, and here's why.” The test: does opening it tell her something the collapsed state didn't? A one-app badge: no. A menu with a greyed, explained item: yes.
Read the two arrows separately. The badge ▾ appears once, on Storage (3 real destinations) — one app in play everywhere else, so no caret and no ⊘ coming soon row behind an empty arrow (the 2026-08-07 placeholder stays deleted). The status ⌄ appears on EVERY connected row including AI Model, because every connection has an answer to “what can I do here?” — even when the answer is “nothing, and here's why” (AI Model's menu, two frames down). Below 640px every row stacks the status button onto its own line — one rule, all rows (see the 640 pair below).
Two apps in play on one role — the badge NAMES both and earns its ▾ (several connected at once counts the same as real alternatives). The channel picks were made in Personalize; the badge default reads them back. No AI Model row — WAITL1 uses no AI (absence, not exception).
One app in play, so the target is unambiguous and Disconnect fires directly — no ellipsis, no which-app step. Two taps from collapsed to done. The standalone "Switch account" button (T1164) is retired into this menu; its Active-assistant muted/live behavior is shipped (frame 9d). .dim = muted-but-tappable (it opens an explainer), which is a different thing from .off = greyed-and-explained in the next two frames.
This is the pass-3 rule at its hardest case. Nothing here can fire — and the control does NOT collapse to a bare "Connected" chip. The chevron stays, the menu opens, and it answers the question the founder actually had: can I turn this off? — no, and here's why. That is real content, not a stub. Contrast with the badge: a one-app badge caret would open onto a list that says nothing the collapsed badge didn't, which is why THAT affordance is still deleted. Build: this retires ConnectionStatusButton's hasAnyMenuAction fallback for role rows — see the build note at the foot of this section.
AI Model was never the only case — this row is the other half of the same defect. The 2026-08-10 ruling names "Storage and AI Model", and this is Storage: MystfloStorageRow, the internal, zero-click destination. Structurally it IS the AI Model frame directly above — nothing external exists to disconnect, so its one item is .off and the menu still opens to say so. Note the badge carries no ▾: internal storage has no picker, so control 1 has nothing to open (2026-08-09 badge rule, untouched) while control 2 still answers what can I do here?. Drawing both Storage rows together is deliberate — fixing one and not the other is exactly how this shipped half-done the first time.
Same badge word, one caret's difference, and a different reason entirely — that is why these two are drawn side by side. This is StorageRoleRow, which DOES own a picker (three destination groups), so "disconnect" isn't the verb that applies: the founder doesn't sever storage, she sends it somewhere else. The item greys and points at the badge — the same ROUTE as the multi-app row two frames down, reached by a different road. Read this against AC-EXPLORE-17b, not AC-EXPLORE-17: Storage is a pick-one-of-N role, so it is explicitly NOT the "≥2 apps running at once" ambiguity case and never says "N apps run here". It greys under AC-EXPLORE-21 (an item that cannot fire) — 17b's "keeps a LIVE row-level action" governs the ambiguity rule, and does not license a live Disconnect that has nothing to disconnect. Build: the badge name inside the reason is READ FROM THE ROW, never hardcoded — same derivation lesson as the multi-app count (#3310); a founder who has picked Google Sheets must read "Pick a different destination in Google Sheets ▾ above."
Pending used to simply OMIT Reconnect — correct behavior, invisible reasoning. Greyed-and-explained keeps the menu's shape identical across all four states, so the founder learns one menu instead of four, and the verb ledger stays honest: Pending means we're waiting on the provider, so Reconnect genuinely cannot help. Disconnect stays live — walking away is always hers.
The correctness rule is unchanged: an action never fires against an unnamed app. What changes is how that's expressed. Pass 2 routed it as a hand-off — Disconnect… put the BADGE into a "which app?" mode. Pass 3 states it plainly instead: a row-level disconnect is one of the things that isn't possible here, so it takes the same greyed-and-explained treatment as MystFlo AI, and the founder is sent to the badge — which was always the control that answers "which app?". The two controls now never touch. Three taps to act (badge ▾ → that app's Connected ⌄ → Disconnect), one species the whole way.
This frame replaces the old “DISCONNECT WHICH APP?” list. Gone: the Connected ✓ green text and the underlined Disconnect link — two elements, neither of them a button, doing control 2's job in a second species. Each app now carries the identical status button, one tier down (.mini: 10.5px, same pill, chevron inside), and its menu is the same menu — Disconnect, Reconnect, Switch account, greyed-and-explained where they don't apply. The list has one title, not two: it is always “which apps are in play”, never re-titled by whatever the founder was trying to do.
Down here the app IS named, so the action is live and the label says the target out loud — “Disconnect Resend”, never a bare “Disconnect” that the founder has to trust. WhatsApp is untouched and keeps sending. This is the tap that the greyed row-level item pointed her to.
Never a bare row-level "Reconnect" when two apps run: the status line NAMES the broken app while still collapsed (B2's reserved slot — the descriptive line stays put). WhatsApp is untouched and keeps sending.
Expanded, each app carries its OWN status button — and health is carried by the button's own label + colour (Reconnect, amber), which is exactly how the row-level button carries it. No separate Expired chip beside a link: one control per app, saying its state and holding its actions. Reconnecting never touches WhatsApp.
Picking an app that isn't connected surfaces Connect — white, and the one legitimate no-chevron state: there is no connection yet, so control 2 has no lifecycle to hold and the button IS the action. That is not the collapsed-affordance defect pass 3 bans — it's the difference between “this control has more to say” (chevron) and “this control does one thing” (no chevron). Tapping it opens the LEFT co-edit slide sheet (next frame), never a nested modal. The ⊘ Gmail row is legal HERE — inside a multi-app picker it's a real roadmap alternative among ≥2 live groups, not a placeholder propping up an empty caret.
Sends your launch emails from your own address.
◄ tap the peek edge to go back — your setup is untouched
Stack-rule decision (this pass): one structural boundary at sm 640px for ALL Connect rows — below it every status button drops to its own line, above it every row is inline. Pass 1 mixed the two (Communication stacked at ~600 while Alerts/Storage stayed inline because their content happened to fit) — content-driven per-row reflow is exactly what canon U8 bans: structure changes at NAMED breakpoints, nowhere else. A list where sibling rows disagree reads as two different row types.
Inline tier of the same three rows, one carrying the expired state — the named-app status line sits in B2's reserved slot, so row height never jumps and the status column stays aligned.
Both controls drawn open together so the relationship reads at mid-tier: the row menu anchors under its own trigger and says what it CAN'T do plus where to go; the badge's list expands in the row's own space and carries the live buttons. The reason line renders here identically to 375 — it is not a hover tooltip, so nothing about it is desktop-only.
Connect (white, no chevron — the button IS the action) → Connected ⌄ → Reconnect ⌄ → Pending ⌄ (T336 five-state contract). Chevron INSIDE the pill, never a caret parked beside it. The identical control renders one tier down (.mini) for every app inside an expanded picker. Its menu holds Disconnect / Reconnect / Switch account (T1164 retired into it; Active-muted behavior shipped 2026-08-17)..off (--fg-30, cursor:not-allowed, aria-disabled, no red on a dead Disconnect) with its reason on an always-visible line underneath — never a hover tooltip. Three live cases: MystFlo AI (product gate) · Reconnect while Pending (waiting on the provider) · any row-level action on a multi-app row (no named target).Connect → PageSlideOver slides the real Connects page in from the LEFT (R35 mechanic, frame 14) — never a nested modal. Shipped.Sends your launch emails from your own address.
◄ tap the peek edge to go back — your setup is untouched
⊘ coming soon placeholder. Unchanged by pass 3 — AC-CONN3-01 ↗ (§ Connect apps rule 7/7a).Connect white/no-chevron · Connected ⌄ · Reconnect ⌄ · Pending ⌄ — and its menu is the ONLY home for Disconnect / Reconnect / Switch account (T1164 standalone button retired) — AC-CONN3-01 ↗ · AC-EXPLORE-18 ↗.hasAnyMenuAction's static role="status" chip is retired for role-mode rows; interactive={false} (the picker-modal categories) is untouched — NEW (PRD debt · pass 3).ai_model (“MystFlo AI is the default option at the moment.”) · Reconnect while Pending · any row-level action on a ≥2-app role — NEW (PRD debt · pass 3).MystfloStorageRow (internal, no picker, no badge caret): “MystFlo Storage is where your records live — there's nothing to disconnect.” StorageRoleRow (owns the 3-group destination picker, badge caret present): “Pick a different destination in {badge} ▾ above.” — badge name DERIVED from the row, never hardcoded (#3310 lesson) — AC-EXPLORE-20 ↗ · AC-EXPLORE-21 ↗.ConnectionStatusButton (.mini tier), showing that app's own state and holding that app's own menu; the Connected ✓ text + underlined Disconnect link pair is deleted. Health is still three-state — a never-connected or just-disconnected app reads Connect, never “Connected ✓” — AC-EXPLORE-17 ↗ (control species is NEW (PRD debt · pass 3)).Disconnect… → which-app mode — NEW (PRD debt · pass 3)).AiModelPicker, badge "MystFlo AI", status "Connected", no badge caret — AC-EXPLORE-08 ↗.sm 640px for every Connect row — AC-CONN3-04 ↗.Connect, which opens the LEFT co-edit slide sheet (R35 / PageSlideOver, frame 14's mechanic) — never a nested modal — shipped.⊘ … coming soon stub. The stub announced an unbuilt FEATURE to justify an otherwise-empty arrow. A greyed item explains, in the present tense, why an action this control genuinely owns everywhere else doesn't apply HERE. Rule of thumb: legal when the item names an action the control already owns elsewhere; illegal when it names a feature that doesn't exist yet. ⊘ Gmail · coming soon inside a ≥2-group picker stays legal on its own separate grounds (a real alternative among real ones).disabled menu item can't reliably take keyboard focus either, so the hover/focus path fails twice over. Long-press is undiscoverable and collides with iOS selection. The reason is one short sentence: it costs a line and buys a founder who never has to guess. It renders identically at 375, 768 and desktop — a reason only desktop users can read is a reason the phone user doesn't have. Reuses the shipped .smenu-note vocabulary as .smenu-why, not a new overlay species (a tooltip over a menu is a second overlay on one job)..off = cannot act, reason inline, aria-disabled, cursor:not-allowed. .dim = muted but tappable, opens an explainer WITH actions (9d's Switch-account-while-Active .notice + “Pause to switch” / “Start a new instance →”). The dividing line: if the reason comes with a path forward the founder can take right now, it earns the notice panel; if it's purely informational, it's an inline line..off drops to --fg-30 flat..mini tier. The per-app button renders 10.5px/3px-9px visually but keeps the 44×44 hit area the row-level button already carries below sm (min-h-[44px] sm:min-h-0 in ConnectionStatusButton) — visual density is not hit density.DestinationPicker.tsx (2026-05-22 Template-first lock; the ① MystFlo Storage group remains the one honest drawn delta, #3251) — if copy reads awkwardly the fix is a component change, not a mockup rewrite.sm 640px for every Connect row — below it every status button drops to its own line, above it every row is inline. Canon U8: structure changes at named breakpoints only; pass-1's content-driven mix (Communication stacked at ~600 while Alerts/Storage stayed inline) is the defect this retires. AppRow.tsx's deliberate inline-at-all-widths cluster is knowingly reversed for the status control.⊘ coming soon still lives: only INSIDE a picker that already has ≥2 live groups (Gmail under Email; Supabase's create-new) — a roadmap alternative among real ones, never a stub propping up an otherwise-empty caret. AI Model additionally stays caret-free as a PRODUCT gate (BYOK_AI_HIDDEN, #2514) until a second provider is genuinely selectable — then the ≥2 rule grants the caret by itself (F3)..app-st "Connected ✓" + underlined .app-act "Disconnect" — DELETED and redrawn as per-app status buttons (those frames are replaced, not kept alongside); with them goes the C2-derived neutral-underline treatment for in-picker actions, which existed only to serve that shape. ② ConnectionStatusButton's hasAnyMenuAction fallback for role rows — the static role="status" chip with no chevron, which is exactly why Storage and AI Model render a bare "Connected" today. ③ Pass 2's Disconnect… / Reconnect… ellipsis labels and the which-app MODE they opened.(current) + coming soon single-provider expand (that frame is deleted, not redrawn). Also still in force from 2026-08-04/05/06/07: label/badge split · one Storage row, three destinations · verbatim picker copy · one list, no tiers · decision-in-Personalize, connection-in-Connect (the badge default reads those picks back).⊘ coming soon stub behind an empty one. Pass 3 governs control 2 only. The two rules disagree on the surface and agree underneath: show an affordance when opening it says something new.AppRow/RoleRow COMING_SOON_COPY shells and structural carets must be REMOVED. PR #3288 shipped pass 2's two-control split. Pass 3 adds: always-open status menu (retire the hasAnyMenuAction fallback for role rows; KEEP the interactive={false} branch for the picker-modal categories), .off disabled items + inline reason lines, per-app .mini status buttons inside pickers, the greyed row-level action on multi-app rows, and — added 2026-08-10 after design review caught it half-delivered — the explained Disconnect on BOTH Storage rows (MystfloStorageRow internal · StorageRoleRow picker-owning), which the ruling named alongside AI Model from the start. Pass 2 leftovers still open: multi-app badge + aggregated status, expired-names-the-app status line. Connect → slide sheet and Switch-account muted/live shipped 2026-08-17.design-lessons.md flex-col-row-container-stretches-bare-children): the new .mini button lands inside .pick-row, and the <sm stack rule puts flex-col on row containers. Wrap it — <div className="flex-shrink-0"><ConnectionStatusButton …/></div> — and audit EVERY direct child of any container that gains flex-col, in both render trees, before calling this shipped.Components: ConnectionStatusButton.tsx (T336 five-state, built — gains always-open menu, .off items, Switch account) · ChannelGroupRow.tsx BroadcastPickRow (carries the per-app .mini control; DisambiguateAppRow is the RETIRED pass-2 shape — do not rebuild it) · DestinationPicker.tsx (built, ① MystFlo Storage group shipped #3251) · AiModelPicker.tsx (no badge caret — product gate; gains the explained Disconnect) · MystfloStorageRow.tsx + StorageRoleRow.tsx (the two Storage rows — both gain the chevron + their own explained Disconnect; their file comments still describe the retired chevron-less fallback as correct and need rewriting with the fix). Contract: prd-pl-activation-wizard.md § Connect apps (rules 7a/9a CORRECTED to this pass in PR #3308, merged 2026-08-10 — plus AC-EXPLORE-20/21 minted and AC-EXPLORE-17 rewritten). Kit: design-decisions.md 2026-08-09 + 2026-08-10.
Pause anytime.
A test row on your sheet + the confirmation on your own WhatsApp. Free.
Both tiers drawn per R22. A real pre-activation chat sandbox is a deferred post-launch decision (ledger).
It reads your Brain — prices, policies, hours, FAQs, and your brand voice — and answers guests in the voice you confirmed. Anything it can't ground in your knowledge gets handed to you.
Brain readiness lives on Connect →.
tablet 768 — progressive: split engages where width allows, else the mobile pattern holds
Reconnect WhatsApp and add your policies to continue.
Your word for this instance — you can rename it anytime from its Details header.
Runs on your WhatsApp from the moment you activate. Pause anytime.
We'll add a test row to your sheet and send the confirmation to your own WhatsApp — so you see exactly what a guest sees. Free.
About 20 seconds. Stay on this screen.
outcome (c) — partially active
Both tiers drawn per R22; Pulse card twins for (c)/(e) above. Archetype: pulse-surface.md.
About 20 seconds. Stay on this screen.
WhatsApp rejected the message send, so we stopped before activating anything.
Still stuck? Message us — we'll look at the run.
Your signup page is open and taking names right now.
It's answering on your WhatsApp from right now.
$0.50 per session · pause anytime
Signups keep working. Only the launch blast is blocked until the wording is fixed.
Resubmitting goes back into review — same open-ended window.
Deferred — issue #2732.
Money detail lives in Billing — one home per account metric.
LogsTab.tsx) renders a footer row below the run feed: “This assistant's activity.” + a link routing to the account-wide Pulse Runs tab — not drawn in the frames above (documentation note only, no new frame).Both tiers drawn per R22. Archetype: assistant-detail-tabs.md.
Wording changes apply on your next run. Structural changes need a quick pause first, so nothing breaks mid-run.
Resume when you're ready — MystFlo never auto-resumes for you.
src/lib/fieldEditPolicy.ts + locked-row UI on post Personalize. Switch account stays in the status menu and mutes via onSwitchAccountMuted while Active — it is not hidden.Spec: prd-pl-assistant-lifecycle.md §A6. Archetype: assistant-detail-tabs.md.
Post-activation adds one thing to frame 5b's contract: a run-status risk. Switching a connection mid-run can land a message or a charge on the wrong account, so while the assistant is Active the Switch-account item is muted — visible, still tappable, and it explains itself. Everything else is 5b unchanged: one control species, chevron inside, impossible actions greyed rather than removed. 375 first, then desktop.
Mobile tier for this frame lives with the rest of the phone journey — 13d · mobile ↓ (one note, both tiers; the file's §5 desktop / §6 mobile split).
No standalone "Switch account" button (T1164 retired) and no badge caret — one app in play per role here, so the badges carry nothing. Both rows still carry their status chevron, because the status button always has something to say (5b's pass-3 rule). The action lives in that menu; while Active it stays visible but MUTED, and tapping it opens this notice instead of acting. Reconnect (same-account repair) is unaffected and still appears if a connection breaks.
Paused (or Stopped) lifts the mute — the menu item goes live and resolves through the existing verdict-matrix mechanic (ALLOW / ALLOW+REPROVISION / HARD-BLOCK), then Resume. On a MULTI-app row this item greys out with its reason and points at the badge, exactly like Disconnect does (frame 5b) — the row-level control never guesses which account she meant.
.dim flavour, and that survives 5b's new greyed-item rule rather than collapsing into it. 5b's .off is "cannot act, here's why" as a flat inline line. This item is different in kind: it IS tappable, and what it opens is a decision with two live paths ("Pause to switch" / "Start a new instance →"). The dividing rule, now written once for the whole system: a reason that carries actions gets the notice panel; a reason that is purely informational gets the inline line. Mobile mirrors added this pass — 9d was desktop-only, which canon U8 doesn't allow for a signed frame.Spec: prd-pl-assistant-lifecycle.md §A6 (to be updated to this shape). Archetype: assistant-detail-tabs.md.
Ana's name is filled in per person. Wrong words, wrong dates, wrong link? Edit in Personalize → — this screen only reviews, tests, and sends.
This can't be unsent, and there's no retry. Nothing goes out until you tap it.
Refunds, deposits, and changes — in your words. Your assistants quote these directly.
◄ tap the peek edge to go back — your setup is untouched
Reconnect to keep replies going out from this number.
◄ tap the peek edge to go back — your setup is untouched
Runs draw from this. Nothing else is charged.
◄ tap the peek edge to go back — your setup is untouched
Connect still has no Billing link. The only setup path into Billing is the card chip on Top up. Same slide mechanic, same host — the pane swaps destination.
The card Top up will charge. Invoices and usage stay on Billing — not on Connect.
◄ tap the peek edge to go back to Top up — Connect never opened Billing
One component (`PageSlideOver`, `modalTokens.slide.split.*`), same 0.45s expo settle, same peek-edge/Esc return:
| Connect-tab row | Left pane opens | Anchored at |
| 01 Apps (Reconnect / first connect) | Connects page | that app's row |
| 02 Funds (tap the balance) | Top-up pane | amount + card chip |
| Card chip on Top-up | Billing page | the card / payment-method block |
| 03 Brain (Add/Edit in Brain) | Brain page | that section |
Spec: modal-slide-choreography-architecture.md.
Frame 14 draws the split at rest. These are the moments between “she taps Connect” and “she's back on her row”, plus the tier the split doesn't engage at. Drawn on the Connects destination — it is the only one of the destinations that can leave the tab — but loading, error, settle and abandon are mechanic-level and read identically for Top-up, Change card, and Brain.
Two rulings run through every frame below. ① The geometry does not mirror for Connect. LEFT 40% stays the real page, RIGHT 60% stays the host wizard — the 2026-07-26 axis lock holds here with no Connect-specific exception (reasoning in the design notes). ② The connect form IS the pane's content, never a sheet inside it. The pane opens already focused on the app the row named; there is no directory to walk back through and no second overlay.
Sends your launch emails from your own address.
You'll land back on Connect with this row ticked.
The split engages at ≥1024 only (modalTokens.slide.split.engageBreakpoint) — so 768–1023 gets the same push 375 does. This is the right answer, not a shortfall: 40/60 of a 1024 viewport is 410/614, and a 614px host pane falls below the 640px stack boundary the Connect rows just locked (AC-CONN3-04 ↗) — every row would restack while she's away, so the surface she returns to isn't the one she left. The push freezes the wizard exactly as it was. Wording correction to R35 note (d): it reads “Mobile 375: no split on any destination” — the real rule is below 1024, on every tier, and 375 is only its narrowest sample. Scope: this rules the R35 destination split only; the separate open question about the Personalize preview split at 768–1023 (activation PRD, flagged 2026-07-24) is a different surface and is NOT decided here.
◄ tap the peek edge to go back — your setup is untouched
Sends your launch emails from your own address.
Resend didn't accept that key. Copy it again from Resend — it starts with re_ and has no spaces.
◄ tap the peek edge to go back — your setup is untouched
Launch emails will send from your own address.
◄ taking you back to Connect…
One more thing — where should the signups land?
Connect — never a red the founder can't act on from the right — AC-CONN3-01 ↗ · shipped.PaneScopeContext containment stays for genuinely secondary asks raised from inside a pane (a permission prompt, a resource picker overlay) — AC-PANE-01 ↗ · AC-PANE-03 ↗.ConnectionModal's body must become a form component the Connects page can render inline, and ConnectsPage needs a focus prop + masthead strip in the same shape BrainPage.focusSection / TeamPage.focusTab already use. That is a component extraction, not a new overlay mode.Connect), line “Resend is open on the left…”. Submit fires → Connecting…. Success → Connected ⌄ + a transient emerald line that clears. Failure → back to Connect + the warn line. Frame 14's existing frames label the pane-open moment Connecting… / Reconnecting… — that verb belongs to the post-submit state; at pane-open nothing is connecting yet. Same correction applies to destination (2)'s Reconnecting….Connected ⌄; a permanent green line would become another thing to skip.{templateId, role, app}) alongside the sessionStorage bridge the Connects page already keeps for the auth round trip, and the return URL already has the parameter that reopens the wizard.Components: PageSlideOver.tsx (page: 'connects' shipped) · ConnectsPage.tsx (embedded + focusProvider + masthead strip shipped) · ConnectionModal.tsx (body extracted to an inline form) · PaneScopeContext.tsx (shipped #2248 — containment already works). Spec: modal-slide-choreography-architecture.md §1. Kit: design-decisions.md 2026-06-23 + 2026-07-26.
Archetypes: assistant-summary-card.md, pulse-surface.md.
Both tiers drawn per R22. Archetype: pulse-surface.md (self-check #6).
#attention-panel. No #health-alerts fallback.isAssistantNeedsAttention + resolvePulseHealth in src/lib/assistantStatus.ts. UI: AttentionPanel.tsx.375 phones. Pulse Overview companion: pulse.html frames 1 / 1c / 1-m. Archetype: pulse-surface.md.
It reads your Brain — prices, policies, hours, FAQs, and your brand voice — and answers guests in the voice you confirmed. Anything it can't ground in your knowledge gets handed to you.
It reads your Brain — prices, policies, hours, FAQs, and your brand voice — and answers guests in the voice you confirmed. Anything it can't ground in your knowledge gets handed to you.
Both tiers drawn per R22. Archetype: assistant-detail-tabs.md (post-tab list + self-check #7).
Changes take effect on the next run. Nothing already answered is rewritten. Brain readiness lives on Connect →.
Changes take effect on the next run. Brain readiness lives on Connect →.
Archetype: assistant-detail-tabs.md.
Nobody gets the same wave twice.
Wrong words? Edit in Personalize →
101–500 people is the $0.50 band. This one can't be unsent, and there's no retry — nothing goes out until you tap it.
We'll tell you the moment it's approved — you don't have to check back.
Your signup page is live and collecting. We'll put this back on your Pulse card the moment there's someone to send to.
No recipients, no charge.
Rename it first? Autumn retreat support ✎
375 — the same seven steps stack vertically, one box per row, the thread running down the left.
The 02b row is the bypass the “Don't ask me next time” checkbox buys — shipped today (`ReactivationConfigReview.tsx:134`). Preflight still runs; only the chooser disappears.
Mobile tier of 9d ↑. Both rows keep their status chevron even where the badge carries none — the two arrows answer different questions (5b). The muted Switch account… is the .dim flavour: tappable, and what it opens is a decision with two live paths, so it earns the notice panel rather than 5b's inline .off reason line.
No badge caret (one app per role) and no standalone button — Switch account lives in the status menu, visible but MUTED while Active; tapping it opens this notice, never acts. Reconnect still appears if a connection breaks. Cropped to the apps section under demonstration; AI Model / Storage (B3) are omitted from the crop, not the tab.
Paused lifts the mute — same item, same place, now live; it opens the switch on the app it targets, then Resume. The menu's SHAPE never changes between Active and Paused, so she learns one menu and only a line's muting moves. On a multi-app row this item instead greys out with its reason and points at the badge, exactly like Disconnect (frame 5b).
Refunds, deposits, and changes — in your words.
You'll land back on Connect with this row ticked.
Same push, same peek-edge/Esc return, on every destination — this Brain example is drawn once and stands for Connects and Top-up too. Change card is the next frame.
Runs draw from this. Nothing else is charged.
The card Top up will charge.
Connect never opened Billing.
There is no split below 1024, so every state below is the same full-screen push — the 768 tablet tier is this same frame, wider (drawn in the desktop half). The peek edge is the only way back, on every state.
The wizard already told us which app — only Resend's own form is loading.
Sends your launch emails from your own address.
Resend didn't accept that key. Copy it again from Resend — it starts with re_ and has no spaces.
Going back now leaves the row exactly as it was — nothing half-saved.
Launch emails will send from your own address.
◄ taking you back to Connect…
Leaving the push is navigation, not cancelling. Nothing submitted → nothing saved and no confirm dialog; already submitted → it lands on its own and this row flips itself.
No push reopens — the job it was opened for is done. She never presses a “continue” to get her own work back.
Runs draw from this. Nothing else is charged.
App costs (WhatsApp, Stripe) go to your connected accounts.
Both tiers drawn per R22.
.off, never removed). In context: frames 8, 8b. Full-page seating: pulse.html.presentation="sheet" — 375 bottom sheet + desktop seated sheet, full-width band chrome. In context: frames 3, 9b, 10. Pass-bar: archetypes/assistant-detail-tabs.md, sheet-slide-panel.md.BYOK_AI_HIDDEN — nothing here renders at launch
AUTO-only is locked (#2514, 2026-07-19). Reopening needs BOTH gates cleared: OpenAI/Gemini actually functioning in the manual model chain (not just Anthropic today), and per-model output quality evaluated.
sheet | airtable | stripe), which makes it easy to assume it's a connectable Storage provider. It is not — there is no connect flow. Showing it struck-out here is cheaper than someone re-deriving that later."$1,890" → "$1890" is not a price change, but a string comparison says it is — and that is what makes the Brain's stale-listing flag untrustworthy (#3320). Structured entry removes the ambiguity where it is created rather than guessing at it later.USD / EUR / GBP / IDR. $ alone means USD, AUD, CAD, SGD or NZD — a symbol meaning five things cannot be compared, summed, or safely quoted to a customer in another market. ONE currency per offering; mixed-currency tiers are not a real case and are not drawn.display is composed ONCE at save (from USD 1,890) and stored. It is never recomposed at render, so the D1 rule holds: no surface derives a price. The tiers underneath are what let an assistant answer “how much is the private room?”.Apr 12–19 & Oct 4–11 — two occurrences. A single start→end row cannot hold it. Each occurrence is one date or a range; “+ add another” repeats it.Service.duration exists. “7 nights, 8 days” is how LONG it lasts, not WHEN it runs — a retreat has two occurrences and one duration. It never belongs in the date control.prd-pl-brain.md § “Structured value beside the written form”; acceptance AC-OFFVAL-01..08.brain.html 28g (the offering correction editors). Same field types, same rules — this frame is the wizard's rendering of them..off + always-visible reason line, no hover tooltip): Disconnect on ai_model, Reconnect while Pending, any row-level action on a ≥2-app row. Every app inside a picker carries the same button one tier down (.mini) — the Connected ✓ text + underlined Disconnect link pair is DELETED, and with it the pass-2 “Disconnect… → which-app MODE” hand-off; the badge owns “which app” at all times. Expired tokens still name their app collapsed. Connect on an unconnected pick → left co-edit slide sheet (shipped). Stack rule: one boundary at sm 640, every row. 375 + 640-pair + 768 + desktop tiers drawn..dim = tappable, opens a reason WITH live paths (this frame's notice panel); .off = cannot act, purely informational reason on an inline line (5b). Reconnect stays available in every state; on a multi-app row Switch account greys out and points at the badge, same as Disconnect. Shipped 2026-08-17. Cropped, apps section only; mobile tier at 13d.PageSlideOver has a live 'connects' case, ConnectsPage takes no focus prop, and ConnectionModal's body needs extracting to an inline form. Two questions left deliberately open: expired-draft / cross-device return, and whether a return that landed a further choice should reopen the pane.Mirrored into kit `design-decisions.md` + archetypes: `assistant-detail-tabs.md`, `assistant-summary-card.md`, `pulse-surface.md`.