Pulse is the monitor — Overview, lists, detail, Activity.
The monitor surface — Overview glance (Runs this week · Attention · MTD Cost — Health folded into Attention 2026-08-22), Active/Past card walls, the account-wide Activity feed (runs + Brain work, merged 2026-08-22), and the post-activation detail modal — real structure from Pulse.tsx / AssistantSummaryCard.post.tsx / AssistantDetailModal.post.tsx / LogsTab.tsx in the canon idiom.
The widths drawn here are samples of a fluid
continuum, not the only states that exist — content (spacing, type, gaps, card/column widths)
scales continuously between them, each clamp reading a named container. Structure (rail,
row↔stack, grid columns) steps only at sm 640 · md 768 ·
lg 1024; radius, hairlines, and pills never scale. Kit: design-canon.md U8.
Reading order in this document is desktop first,
then mobile, with a section's mobile frames side by side — a review-document convention only
(this repo's design-canon.md § Mockup review reading order). Mobile 375px is still
designed and scored FIRST in the /design ritual (kit canon U5/U8) — the two rules never conflate.
| Assistant | Status | Runs▼ | Cost | Health | Lifetime |
|---|---|---|---|---|---|
| On-Brand Support #7Q22x | Failed | 311 | $24.88 | 94% | 2,140 |
| Niseko winter bookings #4K2 | Active | 142 | $11.36 | 96% | 918 |
| Bali balance chasing #9T1 | Paused by you | 88 | $6.20 | 91% | 340 |
| Retreat Booking #2M5 | Active | 5 | $1.75 | 100% | 5 |
| Total 6 active | 546 | $44.19 | 95% | 3,403 |
See where it’s going →); no cost charts on Pulse.Pulse.tsx:2177 renders it here today) now lives on Usage beside the spend aggregates — money-safety belongs with the money page (Pulse/Usage/Billing split). Shipped placement is drift until the build lands; see usage.html frame 1..bd-table with a 5-chip status filter row, severity left rail, activation Nx chip. Active tab is card-grid only.dashboardStats (no server-side status filter or limit) — filterable + paginated (Peyton 2026-08-22), no “See all →”. Sort stays in-table. Card wall for manage/pause lives on Active / Past. Anatomy + filter/pagination contract: frame 6.?tab=activity&filter_assistant=<id> — a NEW param. ?assistant= on /pulse already means “open the detail modal” (LaunchKitDeepLinkGate) — never reuse it for this drill.?handover=Can I get a refund for next week’s workshop?
AI handed this to you because it wasn’t sure.
+1 555 123 4567
Guest: Can I get a refund for next week’s workshop?
AI: I’m connecting you with Peyton.
AI is still answering everything else. Reply on WhatsApp or Slack, then mark this handled.
/pulse?assistant=<id>&handover=<event_id>).| Assistant | Status | Runs | Cost | Health | Lifetime | ||||
|---|---|---|---|---|---|---|---|---|---|
|
No assistants yet
Browse assistants →
|
|||||||||
| Total 0 active | 0 | $0.00 | — | 0 | |||||
PulseGetStarted is retired. No budget nudge here — it moved to Usage./assistants).src/pages/Pulse.tsx (aligned 2026-08-11 · style unify)
Nx activation chip when activation_count > 1.| Assistant | Status | Runs▼ | Cost | Health | Lifetime |
|---|---|---|---|---|---|
| On-Brand Support #7Q22x | Failed | 311 | $24.88 | 94% | 2,140 |
| Niseko winter bookings #4K2 | Active | 142 | $11.36 | 96% | 918 |
| Bali balance chasing #9T1 | Paused by you | 88 | $6.20 | 91% | 340 |
| Deposit chase #8P3 | Paused — needs you | 24 | $3.10 | 88% | 110 |
| Retreat Booking #2M5 | Active | 5 | $1.75 | 100% | 5 |
| Total 6 active | 570 | $47.29 | 94% | 3,513 |
resolveAssistantStatus — never raw DB strings. The ROW keeps the full distinction — “Paused by you” (neutral dot) vs “Paused — needs you” (lantern dot); only the FILTER collapses them into one Paused chip.2x chip when reactivated more than once.dashboard-stats.ts queries assistants by user_id alone — no status filter, no limit). Row set = all instances, any status, all time. The status filter is 5 multi-select .assist-filter chips — Active · Paused · Completed · Stopped · Failed — icon-free like the Needs-attention toggle (T1203); zero selected = unfiltered, no “All” chip. Pagination = ‹ Prev · Page N of M · Next › (the 10g non-chronological variant), hidden at one page. Runs/Cost columns stay month-scoped, Lifetime all-time — the caption states this. Still NO month picker: per-run history stays Activity’s, spend trend Usage’s (Clean Split).?tab=activity&filter_assistant=<id> — never ?assistant=, that param already opens the modal). Manage/pause card wall stays on Active/Past.| Assistant | Status | Runs▼ | Cost | Health | Lifetime |
|---|---|---|---|---|---|
| On-Brand Support #7Q22x | Failed | 311 | $24.88 | 94% | 2,140 |
| Niseko winter bookings #4K2 | Active | 142 | $11.36 | 96% | 918 |
| Bali balance chasing #9T1 | Paused by you | 88 | $6.20 | 91% | 340 |
| Total 6 active | 546 | $44.19 | 95% | 3,403 |
use-mobile.tsx) — full header + rail render, rail collapsed to its 64px icon width.sm: override between grid-cols-2 and the desktop lg:grid-cols-4.sm; horizontal scroll if needed).?tab=activity&filter_assistant=) — same contract as desktop frame 1.| Assistant | Status | Runs▼ | Cost | Health |
|---|---|---|---|---|
| On-Brand Support #7Q2 | Failed | 311 | $24.88 | 94% |
| Niseko winter #4K2 | Active | 142 | $11.36 | 96% |
| Total 6 | 546 | $44.19 | 95% |
grid-cols-2 lg:grid-cols-4) — focal spans both columns; Attention + MTD Cost pair below (3-tile set, 2026-08-22).?tab=activity&filter_assistant=) — same contract as desktop frame 1; 44px touch row is the tap target.| Assistant | Status | Runs | Cost | Health |
|---|---|---|---|---|
|
No assistants yet
Browse assistants →
|
||||
| Total 0 active | 0 | $0.00 | — | |
AttentionPanel.tsx BookingRow). No new tab, no new surface. Four states: plain pending (reference) · claimed (slice 1) · claimed + Not received (slice 2) · roster status word.As a host, when a guest tells my booking assistant they already paid, I see it at the top of Needs attention so I can check my bank and confirm them.
Badge variant="lantern"); rail is the same lantern-dim rail. No new colour, no icon.As a host who checked and found no money, I can dismiss the claim so the row goes back to a normal pending booking — and if the guest says it again, it comes back.
As a host scanning my attendee list, I can tell who says they paid apart from who hasn’t said anything.
statusFor in useAssistantRecords.ts returns says they paid with tone warning when the booking carries an open claim. NEW (PRD debt)PulseGetStarted is retired. Guidance lives on Assistants + the welcome email — Pulse shows what the page will look like at zero.max-w column (mx-auto max-w-[720px]/[900px] in PulseActivityTab.tsx is the drift, empty AND populated). At zero the FULL list header stands: All │ Assistant │ Brain strip + the icon-free Needs-attention toggle + a quiet 0 events count + the .al-ledger hairline. A field header row (.al-row.al-head: Source · Event · When) teaches what will land — empty only; populated stay a ledger with no thead. The quiet line sits IN the first ledger row (.al-row.al-empty), left-aligned: “Nothing yet. Runs and Brain updates land here.” Pagination still hides at zero (10g: hidden at one page). AC-PULSE-25 ↗ convention carries over; the old “No runs yet” table row stays retired with the Runs tab..al-ledger hairline with Source · Event · When field header + ONE quiet left-aligned row (.al-row.al-empty). Pagination still hides at zero.lib/assistantStatus.ts).RecordsEntryRow): for a records assistant (the Direct Booking card here) the noun · count line ("Attendees · 12 booked · 3 left ›"; sold out = amber dot + "sold out · N waiting") is the card's LAST zone, after Runs — inside the tile, so the wall stays equal-height and nothing hangs under a card. Collapses to zero on a non-records card (the On-Brand Support card above is unchanged); never renders for guests. Tap → detail sheet on Pulse with the records sheet open (?assistant=…&records=open). Master frames: assistant-lifecycle.html 8d. Not built.#P88) across every period.AssistantSummaryCard.post.tsx
.al-ledger row grammar with the source mark dropped · 5 rows + See all ›). At desktop/tablet width, metrics + slot sit as a 2-column pair; activity runs full-width below (Peyton review 2026-08-22). Archetype: assistant-detail-tabs.md.Open kit › (amends the prior "generation-kit keeps LaunchKitReviewSheetBody as its full body" rule — that sheet is still where Open kit › goes, it just no longer replaces the whole tab). The range chips + ‹ Newer · Page N of M · Older › pagination that used to run below the ledger now live one door over, in the NEW nested Activity sheet. Canonical drawing: assistant-lifecycle.html 9b / 9b-x / 9b-r / 9b-k / 9f; this file seats it in the Pulse page.assistant-lifecycle.html 9b-k) — the whole-tab LaunchKitReviewSheetBody swap is amended.wa.me/{phone} share row alone — see 3-chat. Other types stay EMPTY. Exception verbs (Reconnect/Resume) still live on the banner (frame 3b). Replaces the three shipped one-job-three-ways patterns: the “What’s Next” card, BookingShareLinks on Pulse, and the standalone WhatsApp “Item 2” card.nestedBackdrop, broadcastCloseAll={false}, FilterChipGroup + PaginationBar), deep-linked as ?assistant=<id>&records=open (param name = CTO build decision). Non-records assistants render the ordinary chat/empty slot, no gap. Master frames: assistant-lifecycle.html 9b-r / 9e. Not built.assistant-lifecycle.html 9f), opened from See all › on the sec-marker. Rows stay the EXACT Activity-tab ledger grammar (.al-ledger/.al-row, frame 4d): flat rows · event in founder words · quiet fact ($cost · runtime) or .al-att+View issue · time right, source mark dropped. No search input (Peyton 2026-08-22 — “filter is enough for now”). No day-group headers, no per-row status dots; never status-word-led.https://wa.me/{phone} — no booking prefill. Guests scan or tap and land in a chat with the founder number.fellBack to its send-site caller and no caller persists it, and activity/run rows carry no language field. The per-row token could be derived from chat_sessions.metadata.thread_language (steps 1–4) if the feed joined the session; the “→ English” fallback line has no source at all. Both stay drawn as the target, both are outside the #5166 build and the F1–F5 spec — the Attention remind row above is the only Pulse device #5166 actually backs.whatsapp_template_language_demand (one per user × language; written by the send-time resolver only when the guest's language is NOT purchased — a purchased-but-pending language never creates demand). Render when dismissed_at IS NULL and the language is not in the account's purchased[] (the resolver stops bumping a row once bought but never deletes it — the client must apply the second filter). Language word = catalog.label; price = the same price_usd the Connects list reads. ✕ → POST whatsapp?action=template-languages/dismiss { language }; dismiss is permanent for that language — the 30-day re-surface in architecture §7 is an open question, NOT built, so the frame promises nothing beyond “dismissible”. The row carries no count by rule, though fallback_count / last_seen_at exist if a later ruling wants one. Build gap: no API returns these rows today — the spec's dashboard-stats.language_demand field (F5) was not shipped in #5166; the FE either reads the table under its own RLS (SELECT own is granted) or the field gets added. attention_tile_count does not include this row either — the “Needs attention (4)” count drawn here assumes it will.Google Sheets didn’t respond in time
This run tried to read your sheet and gave up after waiting. The sheet was slow, offline, or Google needs a reconnect. Everything we know is here — there is no technical log behind a second door.
.al-ledger grammar, source mark dropped, full-width; the ‹ Newer · Page N of M · Older › pagination moved to the nested Activity sheet, search removed 2026-08-22 — “filter is enough for now”). Both frames Peyton compared now share ONE structure./connects (or Connect tab). Mark paid / Extend → act on the row. Adjust limit → Usage.assistant-lifecycle.html 9f-m). Rows = the mobile Activity-tab two-line grammar (4d-m): event line, then quiet fact · time sub-line — source mark dropped (the sheet header names the assistant). No day headers, no dots, no search.assistant-lifecycle.html 9e-m); See all on activity → the new Activity sheet (9f-m).assistant-lifecycle.html 9f-m). Master frame: 9b-x.Answers booking questions on WhatsApp and writes confirmed stays to your sheet.
details.flow/benefits. Sample copy for a schematic grammar frame; do not treat as sourced.Pulse.tsx violates — the merge IS the fix, not a cosmetic rename..assist-filter.on), the same icon-free active grammar as the tabs; the lantern mark stays on exception ROWS only (T1203: marks are for exceptions, not inventory). Deliberately NOT a per-source success/failure tree: a failed Brain generation never writes a row, so a Brain “Failed” option would always be dead; Needs attention surfaces genuine assistant-side errors only. (3) Drill pickers appear only inside a scope's tab: an assistant-name picker under Assistant (frame 4d), a Brain action-type picker — Written · Rewritten · Saved to Doc · Confirmed · Read notes (5 options, Peyton 2026-08-22: every real Brain action individually filterable, none folded) — under Brain (frame 4e).NEW (PRD debt) until then — this artifact mints no ids. AC-PULSE-25's empty-state convention (real chrome + one quiet line) carries over unchanged (frame 2b).?tab=activity is this tab. Old ?tab=runs deep links land here — a deliberate re-key, never a 404 or a fall-through to Overview.DashboardRunFeed and PulseActivityFeed apart. This artifact is the build contract for the merge. The 2026-08-22 morning draft (grouped Brain generation / Launch Kit sections) was superseded the same day by this mixed-chronology default.assistant_status_events, the same rail the post modal already merges) render in the ONE grammar — mark = assistant name, verb in founder words: Paused by you · Paused — needs a reconnect · Resumed by you · Stopped. ALL + Assistant scopes only, never Brain (Brain has no lifecycle). No cost fact — lifecycle isn’t a run. Activation events are NOT in the set (the first run row + the Pulse card already carry it). System-pause rows JOIN the Needs-attention toggle — a real needs-you event with a row (lantern mark + View issue → sheet 4b, which owns Reconnect); founder-pause / Resumed / Stopped stay neutral and excluded. Unhandled chat handoffs also write a feed row (2026-08-24 amend) — subject Guest needs you — {why}, lantern + View issue → Issue sheet 1q. That is the event, not a conversation list.--amber (amber stays pending / PREVIEW only, playbook §3); red stays errors-only inside the sheet’s Error badge. No account-wide error banner — the row is the signal (Peyton 2026-08-11, carried over from Runs)..assist-filter.on fill alone. In ALL only the toggle sits under the strip — no drill picker until a scope tab is active. No cost column in ALL — Usage owns cost aggregates; per-run cost appears only as a quiet fact when scoped to Assistant (frame 4d)..al-ledger hairline) and Source · Event · When field header + the quiet line IN the first ledger row (.al-row.al-empty), left-aligned — never a centered hero that drops the list. Pagination still hides at zero. Drawn in frame 2b (AC-PULSE-25 ↗ convention). The page itself is left-aligned to the Pulse title in ALL states — production’s mx-auto max-w centering is drift, not this contract.DashboardRunFeed ships today — on the control row under the strip. It appears only in this tab; ALL stays clean.?tab=activity&filter_assistant=<id>, never ?assistant=); and Usage’s “View run-by-run detail in Activity →” — Usage went aggregates-only (metrics spec §0 v1.13), so this scope owns the run-by-run cost read..assist-filter.on) — never a second color.presentation="sheet"Google Sheets didn’t respond in time
This run tried to read your sheet and gave up after waiting. The sheet was slow, offline, or Google needs a reconnect. Everything we know is here — there is no technical log behind a second door.
ModalWrapper presentation="sheet", auto height for short bodies.lead) + why (why) → (b) activity info — the tried-count/timestamp line rides directly under the why, before any action → (c) what to do — the action row. Title is always Issue. Chat leftover is the same structure on 1q (lantern badge, chat verbs) — not a second sheet family..btn-cta with the SHORT verb the owning rule already uses — here Reconnect (Connects), never “Reconnect Google Sheets”. No Retry. No technical-logs link. A second button that restates the same fix is a FAIL.Google Sheets didn’t respond in time
This run tried to read your sheet and gave up after waiting. The sheet was slow, offline, or Google needs a reconnect. Everything we know is here — there is no technical log behind a second door.
ActivityFeed is unmounted in prod through the Nina
demo (Peyton, 2026-07-11) and its distinct-customer count (#2656) isn’t built.
F1 is a duplicate-and-tweak — the Active desktop Overview (frame 1) with the
Customers section added back; F2/F3 are the standalone Customers frames;
F4 is export (CSV / Google Sheets) for this assistant’s runs — Peyton A+C lock 2026-08-11.
Spec: prd-pl-whatsapp-activity-log.md → “Future — Considered, Not Yet Built”.Niseko winter bookings #4K2 · last 30 days · 48 runs
Niseko winter bookings #4K2 · last 30 days · 48 runs
| Assistant | Status | Runs▼ | Cost | Health | Lifetime |
|---|---|---|---|---|---|
| On-Brand Support #7Q22x | Failed | 311 | $24.88 | 94% | 2,140 |
| Niseko winter bookings #4K2 | Active | 142 | $11.36 | 96% | 918 |
| Bali balance chasing #9T1 | Paused by you | 88 | $6.20 | 91% | 340 |
| Retreat Booking #2M5 | Active | 5 | $1.75 | 100% | 5 |
| Total 6 active | 546 | $44.19 | 95% | 3,403 |
src/components/ActivityFeed.tsx shape, day-grouped; component unmounted, distinct-customer count (#2656) unbuilt, off in prod through the Nina demo.ActivityFeed.tsx’s real empty copy.