1 · Message lifecycle — sent · received · collapsed↔expanded · scheduled · failed · canceled
Sent · outbound (pill right) — collapsed ("Show")
Karla Sellers@ 9:05 AM
Text SentSMSShow
Sent · same item — expanded ("Hide")
Karla Sellers@ 9:05 AM
Text SentSMSHide
Absolutely — I have Saturday at 11 open. Want me to hold it?
Received · inbound (pill left)
Lincoln Buyers@ 9:02 AM
Text ReceivedSMSHide
Is it still available for a test drive this weekend?
Scheduled · dashed + countdown chip ("Show")
Karla Sellers@ 9:00 AM
Email Scheduledon Jun 18 at 9:00 AM24h 20mShow
Failed · red dashed ("Show")
Karla Sellers@ 9:06 AM
Text FailedUndeliveredShow
Canceled · gray muted ("Show")
Karla Sellers@ 9:07 AM
Email CanceledScheduled send canceledShow
2 · Channels — color = channel (DAISI = actor, not a color)
Text · blue
Karla Sellers@ 9:05 AM
Text SentSMS
Want me to hold Saturday at 11 for a test drive?
Chat Received · inbound (pill left) · pink
Lincoln Buyers@ 9:41 AM
Chat ReceivedWebsite
Chat ReceivedFacebookShow
Is the Rubicon still on the lot?
Chat Sent · outbound (pill right) · pink
Karla Sellers@ 9:44 AM
Chat SentFacebook
It is — want me to hold it for you today?
Chat Sent · Instagram sub-channel
DAISI Auto Responder@ 9:46 AM
Chat SentInstagram
Thanks for reaching out! A specialist will be with you shortly.
CHAT-B · grouped transcript — per-actor grouping, AI/human authorship, and the handoff marker at the seam
Lincoln Buyers@ 9:41 AM
Chat ReceivedFacebookShow
Is the Rubicon still on the lot?
Chat ReceivedFacebookShow
The white one with the black wheels
Chat ReceivedFacebookShow
Can I come by today?
DAISI Auto Responder@ 9:41 AM
Chat SentFacebookShow
It is! It's still available.
Chat SentFacebookShow
A specialist can hold it — one moment.
Karla Sellers@ 9:43 AM
Chat SentFacebookShow
Hi Lincoln! Yes, come by at 11 and I'll have it up front.
DAISI Auto Responder@ 5:02 PM
Chat SentFacebookShow
Reminder: your appointment is tomorrow at 11:00 AM.
CHAT-E · anonymous → identified — the transcript that began before the customer existed
Website Visitor@ 8:41 AM
Chat ReceivedWebsiteShow
Do you still have the white Land Cruiser?
Chat ReceivedWebsiteShow
And what would payments look like?
DAISI Auto Responder@ 8:41 AM
Chat SentWebsiteShow
We do! I can pull exact numbers — what's the best number to text them to?
Website Visitor@ 8:49 AM
Chat ReceivedWebsiteShow
555-0192
Identified as Marcus Delgado — phone collected
DAISI Auto Responder@ 8:49 AM
Chat SentWebsiteShow
Thanks, Marcus! Sending those payment options now.
Email · purple
Karla Sellers@ 9:10 AM
Email SentHide
Your financing options
Attached are three pre-qualified payment plans.
Note · orange — internal (no direction)
Karla Sellers@ 9:12 AM
Internal NoteHide
Cross-shopping the Bronco — pull a trade quote before Saturday.
Log · indigo — manual event
Karla Sellers@ 9:14 AM
Call Logged05:00 PM
Left voicemail about the new Land Cruiser allocation.
DAISI as actor · Text (blue) — actor = "DAISI Auto Responder"
DAISI Auto Responder@ 9:16 AM
Text SentAuto
Just confirming your appointment tomorrow at 4:00 PM — reply C to confirm.
DAISI as actor · Email (purple)
DAISI Auto Responder@ 9:18 AM
Email SentAuto
Following up on the Land Cruiser
Saw you were looking — happy to answer any questions.
3 · Calls — audio player (play · scrubber · time · View Transcript)
Call Made · green · outbound ↗
Karla Sellers@ 9:20 AM
Call Made2:14Hide
Call Received by Karla Sellers · green · inbound ↙ (answering dealer named)
Lincoln Buyers@ 9:22 AM
Call Received by Karla Sellers2:38Hide
Call Missed · red · inbound ↙ (voicemail player)
Lincoln Buyers@ 9:24 AM
Call MissedVoicemailHide
Call In Progress · green (.sb-bubble--live · header-only)
Karla Sellers@ 9:26 AM
Call In Progress01:24
Call Failed · red dashed (no connection)
Karla Sellers@ 9:28 AM
Call FailedNo answer
4 · Record rows — neutral .sb-ind (status = bare colored text · edit = .sb-diff)
Deal Created · Fresh (orange text)
Karla Sellers@ 9:00 AM
Deal CreatedDefender (#1234) Fresh
Deal Updated · collapsed ("Show") · status Finance (blue text)
Karla Sellers@ 9:20 AM
Deal UpdatedDefender (#1234) FinanceShow
Deal Updated · EXPANDED ("Hide") · GitHub-style field diff (.sb-diff)
Karla Sellers@ 9:20 AM
Deal UpdatedDefender (#1234) FinanceHide
Any Misc. Meta Data Can Go Here.
- Selling Price: $68,500
+ Selling Price: $66,900
- Status: Working
+ Status: Finance
Deal Moved · status (indigo text)
Karla Sellers@ 9:24 AM
Deal MovedDefender (#1234) Working
Deal Deleted · red text (delete/expire reserves red)
Karla Sellers@ 9:30 AM
Deal DeletedDefender (#1234) Deleted
Task Updated · Call (green text)
Karla Sellers@ 9:32 AM
Task UpdatedCall Jordan · Due Fri CallShow
Appointment · Scheduled (indigo text)
Karla Sellers@ 9:34 AM
Appointment SetSat Jun 21 · 11:00 AM Scheduled
Trade-in · added
Karla Sellers@ 9:36 AM
Trade-in Added2019 Ford Bronco (est. $24,500)
Customer · created (New, orange text)
Karla Sellers@ 8:58 AM
Customer CreatedLincoln Buyers New
Website Session · neutral bubble + step list (collapsed)
Jenifer Burton@ 07/20/2026 9:26 am
Website Session0:01:31Show
The Inbox feed and the customer-profile feed are the same feed and the same templates — repackaged, never forked. Channel color language: text blue · email purple · call green · failure red · neutral gray. Long rows expand with an explicit Show / Hide control, not a bare chevron. Incoming and outgoing keep their alignment, and the accent bar follows the channel or state. Pending and cancelled rows use the dashed treatment.
5 · Calls — the transfer line (Telephony v2) (CANONICAL — mirrors QA 1395973)
No recording → the line is the subject
Lincoln Buyers@ 09/29/2026 9:12 am
Call Received by Devon Park
Transferred by Karla Sellers to Devon Park · answered
With a recording → the line is the first body line
Lincoln Buyers@ 09/29/2026 9:24 am
Call Received by Karla SellersHide
Transferred by Devon Park to Rita Alvarez · Rita Alvarez didn't pick up · back to Devon Park · then Devon Park asked Karla Sellers first · completed
0:002:38
View Transcript
Answered, no recording — an Ask first with no answer
Lincoln Buyers@ 09/29/2026 9:31 am
Call Received by Devon Park
Devon Park asked Rita Alvarez first · no answer
Mobile (390, 24px inset)
Lincoln Buyers@ 09/29/2026 9:24 am
Call Received by Karla SellersHide
Transferred by Devon Park to Rita Alvarez · Rita Alvarez didn't pick up · back to Devon Park · then Devon Park asked Karla Sellers first · completed
0:002:38
View Transcript
The line is built from the call's transfers, oldest first. A call with no transfers renders as before v2. No recording, summary or transcript: the line IS the subject. It is 13/500 italic in the card's accent colour (green, red or gray-04), always visible, with no Hide. With a body: the line is the first body line, 13/500 gray-02, not italic, 8 above the player. It collapses with Hide. Hidden while the call is in progress and during the 3-minute "DAISI is analyzing the call..." window. With no body and no transfers, the subject reads "No Data" in the same italic accent. Wording for one hop: "{By} asked {Target} first", then · completed, · canceled, · no answer, or · voicemail for {Target} — "{By} sent the caller to voicemail for {Target}" — "Transferred by {By} to {Target}", then · answered, · canceled, · {Target} didn't pick up, · {Target} didn't pick up · back to {By}, or · {Target} didn't pick up · voicemail for {Target}. Hops join with " · then ". The separator is U+00B7 with spaces. The apostrophe is ASCII. {By}: the colleague's full name, "Deleted User" if unknown, "a colleague" if missing. {Target}: a colleague's full name · an outside number as dialed (not masked), or "an outside number" · "voicemail" · "a group" · "a colleague". The opposite side insets 64px on desktop and 24px on mobile. These rows reuse the DS call row. Only the transfer line and the title are mirrored from QA; the bubble radius, header, player and play icon are the DS's.
6 · Calls — Voicemail for (CANONICAL — mirrors QA 1395973)
Voicemail for Rita Alvarez
Lincoln Buyers@ 09/29/2026 9:40 am
Voicemail for Rita AlvarezHide
Devon Park sent the caller to voicemail for Rita Alvarez
0:180:18
Voicemail for you
Lincoln Buyers@ 09/29/2026 9:52 am
Voicemail for youHide
Transferred by Devon Park to Karla Sellers · Karla Sellers didn't pick up · voicemail for Karla Sellers
0:180:18
The title replaces "Call Missed" only when all of these hold: the call is incoming · it was missed · a voicemail was left · the transfer named whose voicemail it is. It reads "Voicemail for you" for the signed-in user and "Voicemail for {Full Name}" otherwise ("Deleted User" if unknown). The row keeps the missed-with-voicemail visual: red, with the voicemail icon. The same title is used in the app's Notifications list, which the DS does not draw. Sales Inbox rows do not show it.
Chat in the feed is pink. The bubble and indicator variants in this atom family are colour-keyed, not channel-keyed — there is no .sb-bubble--text — so Chat follows the convention exactly with .sb-bubble--pink + .sb-ind--pink; a channel-keyed name would start a second naming system inside one family. Title grammar matches its siblings: Chat Sent / Chat Received, mark fa-comments. The sub-channel word lives in the existing .sub slot — the same slot SMS uses for “SMS” and AI-sent messages use for “Auto” — so Website / Facebook / Instagram needs no new markup. Inbound sits left with the indicator leading, outbound sits right with it trailing, and Show/Hide is unchanged. Consecutive turns from the same actor within a short window collapse to one stamp plus stacked bubbles (Chat runs dozens of short turns per conversation). The grouping window is per-actor. Implemented as a WRAPPER (.sb-turngroup) plus a condensed head modifier (.sb-stamp--grouped, height only). A grouped turn IS a feed item — .sb-activity.sb-turngroup, never a parallel atom — so it inherits every existing and future .sb-activity override (feed width and the rest) for free, with no page-local rule and no allowlist. The modifier class carries only what genuinely differs: the tighter stacked-bubble spacing — the six base .sb-stamp rules are byte-unchanged, so the customer-profile feed that shares the atom is untouched. Authorship extends the existing precedent, it does not replace it: the bubble stays the channel colour (pink) and the stamp row carries the DAISI glyph + actor name — AI messages are never tinted yellow. This is load-bearing, not cosmetic: 83% of the AI's messages are currently miscounted as human activity, and the GM's daily question is "what's the last thing a human did versus AI?". Hard constraint: a change of actor ALWAYS forces a new stamp — grouping never merges an AI turn with a human turn, which is what keeps authorship legible when turns collapse. .sb-feedmark is the feed's non-message row — composed the same way, .sb-activity.sb-feedmark, so it spans the feed column wherever the feed is widened — a quiet boundary, not a bubble: no channel colour, hairline rules + gray type only, so it never competes with the messages around it. It carries a short line plus an optional small icon. Its one use is the identification boundary in a chat that began before the customer existed: "Identified as Marcus Delgado — phone collected" marks the turn where an anonymous website visitor became a customer record, connecting the anonymous half of the transcript to the named half. A chat can begin before the customer exists — a nameless website visitor chats, the AI holds the thread, and only when a phone number is collected does the customer record get created and the whole transcript (anonymous part included) land on their timeline. Pre-identification turns render in the existing stamp with a neutral glyph (fa-globe) and the honest label "Website Visitor" — deliberately the same web-visitor vocabulary as the Website Session bubble (fa-globe, unnamed visitor), so an anonymous chat reads as its sibling in the same feed, not a foreign object. Consecutive anonymous turns group normally (one actor). Never back-filled: earlier turns keep the "Website Visitor" label permanently even after identity is known — the transcript records what was known at the time, and renaming them to the customer would misrepresent it (and imply the rep knew who they were talking to when they did not). The .sb-feedmark identification line ("Identified as Marcus Delgado — phone collected") is the third reserved use of the marker and is what connects the two halves. Do not "improve" this by back-filling names. Every item is a live locked atom — .sb-activity / .sb-bubble (+ --blue/--purple/--green/--orange/--indigo/--red/--gray4/--dashed/--live) / .sb-ind / .sb-stamp / .sb-diff / .sb-player + .sb-transcript — no new atoms, tokens byte-identical. Message lifecycle: .hide reads "Show" collapsed (header only) / "Hide" expanded (header + .content); Scheduled = --dashed + .sb-sched countdown, Failed = --red --dashed, Canceled = --gray4. Channels: bubble color = channel; DAISI is an actor ("DAISI Auto Responder" via .sb-ic-daisi in the .sb-stamp) sending a normal blue/purple bubble — not a yellow bubble. Calls use the .sb-player audio player + "View Transcript"; Call Received names the answering dealer in the title; --live is header-only In Progress; Failed = --red --dashed. Record rows use a neutral .sb-ind + plain .sb-bubble, status as bare colored .state text, and the edit state expands the .sb-diff field changes (red − / green +). The AI-summary / aiPending state was removed (it no longer renders in the feed).