The conversation-led view of Contacts. One place to triage the thread list, read the full activity feed, reply across every channel, and see who you are talking to — without opening a second tab.
The Inbox exists to kill the context-switching between list, timeline and compose. It is the first real View; the others follow it. The feed inside it is the same feed as the customer profile, repackaged rather than forked, so a message looks and behaves identically wherever you read it.
Two failures it is deliberately built to prevent: missing an incoming message, and a human and DAISI replying to the same customer at the same time.
Nothing is pre-selected when the Inbox opens — the detail side holds an empty select-a-customer state until a row is chosen, so the first thing a rep reads is their own triage decision, not an arbitrary thread.
08-06
The unread badge counts incoming call, SMS and email only — logs and other non-incoming types never count, because the badge answers "who is waiting on me", not "what happened".
08-06
The unread dot is visually distinct from the customer-status colors — two signals that mean different things must never be read as one.
08-06
The row timestamp is the last call, text or email in either direction — not the last activity of any kind, so a system update never makes a cold thread look warm.
08-06
The row shows a generalized actor — Customer, Dealer, DAISI or Automation rather than a proper name, because at list density the class of sender is what triages the row.
08-06
The mobile row opens a quick view inside the Sales tab — only View Customer leaves for the full profile, keeping the triage loop intact on a phone.
08-06
Customer Details opens by default on desktop when width allows, and is a closed drawer on mobile — context is free where there is room and on demand where there is not.
08-06
Task creation is not in this composer — tasks live in the Agenda flow; the composer sends messages.
08-06
Switching DAISI from Agent to Assistant or Off cancels the autoresponder and any active run — the anti-double-talk rule, and the reason the control exists at all.
08-06
When an Assistant pause expires the autoresponder wakes again — a pause is a pause, not a silent mode change.
08-06
Every outbound path respects the customer's opt-out flags — DAISI Agent mode does not bypass them.
08-06
Vehicle of interest is the primary deal, defined as the most recently updated deal — one rule, so the panel and the row never disagree.
Is the 2023 BMW 530i still available for a test drive this weekend?
37 sec ago
Robert Cook
Customer
Sounds good — I'll see you Saturday at 11. Thanks for holding it for me.
2:14 PM
Berald Jones1
Customer
Missed call — no voicemail left
Yesterday
Marcus Webb
Automation
Service reminder: your lease ends in 45 days. Let's talk about your options.
Mon
Priya Anand
Sales
Congrats again on the Defender! I've emailed your finance paperwork over.
Jun 12
R2 leading icon = last ACTIVITY/CHANNEL type (text=comment · call=phone · email=envelope), WHITE by default; a MISSED call is the only colored case (red phone-slash, e.g. Berald Jones). Actor word (Customer/Sales/Automation/DAISI) + direction arrow (incoming ↙ / outgoing ↗) follow. Independent axes: selected (row 2, gray-07 .is-selected) · unread (leading blue-01 dot + blue .sb-marker count) · fully-read. .sb-statusdd footer left (with caret) + time bottom-anchored right.Each row carries the customer name, the customer status pill, channel/actor-type iconography, a generalized actor — Customer, Dealer, DAISI or Automation, never a proper name — a snippet of the last relevant message, and a timestamp of the last call, text or email in either direction, anchored consistently in the row.
A blue dot marks an unread thread. The numeric badge counts unread incoming activities only — call, SMS and email — and excludes logs and every other non-incoming type. The unread dot is deliberately distinct from the customer-status color cues so the two are never confused.
The screens
The same feature at two densities. Desktop is a tri-pane — views, the conversation list, and the activity feed with the composer, plus Customer Details alongside when width allows. Mobile is progressive disclosure — the list first, then a quick view of the conversation, with details arriving as a drawer. Both are live, interactive screens; open them rather than reading a squashed copy here.
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.
Name (t-title) + compact phone/kebab icon-buttons (.sb-msel) · deal summary (regular vehicle text + "+2", no icon) · divider · async AI action-summary (regular, orange-01 circle-exclamation + directive + blue Details). Header band gray-07; bottom hairline divides header from feed.
2 · Skeleton — next-step loading (async)
Lincoln Buyers
2022 Jeep Wrangler Rubicon+2
Details
The directive is AI-generated and loads after the conversation opens → the phrase is a .sb-skeleton shimmer line until ready. Details stays live.
3 · Variant — "Send pricing"
Tamika Jefferson
2023 BMW 530i+1
Send pricingDetails
Same strip, different async directive. Directive stays 2–3 words; the row truncates before crowding Details.
The strip carries the customer name plus the deals line, and a short next-step directive of two or three words (for example “Finalize appointment”). That directive loads asynchronously and shows a skeleton while it resolves.
The composer
How a reply gets written, and what happens when a channel is unavailable.
live (.is-live) — text-free: the full-width waveform IS the body · running timer · mute + speaker tools, red End only. The second tool is idiom-conditional: mobile shows the speaker toggle, desktop replaces it with the audio-device picker (comp-phone-call-states.html). Navigate away mid-call and the live body detaches into the floating Call Pill, docking back into the composer on return — the full pill contract (states, mobile, audio devices, busy) is specced on comp-phone-call-states.html.
Three modes — Agent, Assistant and Off — mapping to the backend values full, internal and disabled. Assistant can be paused for a set duration and the badge shows a live countdown. An in-progress run shows an indicator whose tooltip explains DAISI is working in the background; clicking it cancels the run. Switching from Agent to Assistant or Off cancels the autoresponder and any active agent run — the anti-double-talk rule, and the reason this control exists. When an Assistant pause expires the autoresponder wakes again. The whole surface respects the DAISI and background-agent feature flags.
Here is a summary of the customer that is roughly 2 to 3 sentences. It explains the status of the customer, what is needed, blockers and what the next move is for them.
Summary: Carla reached out and offered Lincoln several buying options and talked about financing.
DAISI AgentEmail
Great to hear. By the way did you see we did a price drop on this x5?
View the 2023 BMW X5
Automations
None
Engineering scope
What the Inbox needs from the backend, and what it already has.
[NEW]An aggregate count of unread incoming call, text and email per customer, to drive the badge. Today only the unreadAt read-state exists, which answers whether a thread was opened, not how many people are waiting.
[NEW]The Inbox list predicate itself — whether the list is unread-only, all open conversations, or SLA-based is the open question below. It may be a new endpoint or a filter on the customers list.
[NEW]The short next-step directive in the activity header — a new AI- or rules-backed field, loaded async behind a skeleton.
[NEW]Suggested Next Action — returns a channel, the reasoning and a CTA; executing it posts to the activity feed and refreshes the suggestion.
[NEW]Background-agent run control — list the active run, cancel it, and a timer-expiry trigger that wakes the autoresponder when an Assistant pause ends.
[CANONICAL]DAISI modes map to the existing backend values full / internal / disabled.
[CANONICAL]The activity feed reuses the existing customer-profile feed data and templates — prefer migrating templates over inventing new state.
[CANONICAL]Opt-out enforcement uses the existing communicationData flags on every channel.
Open questions. What is the exact Inbox inclusion predicate? Do the other Views ship disabled, or wired with real counts? Is the next-step directive AI-generated or rules-derived? Does an Assistant pause persist per user and device, or on the customer record? Are scheduled sends deprecated, hidden, or folded into a send-later flow? And at what breakpoint does the composer collapse?
Composed under the Atomic documentation LAW — narrative + rulings ledger + anatomy map + @dsEmbed transclusions (the build inlines them with provenance links) + eng scope notes. Every embedded fact is owned by the spec page it comes from.