Gate 1 prototype · Digital Receptionist, refreshed · September 22, 2026

Bella's day, and only what needs Dan.

The clickable receptionist Matt was sent on September 13 (the hybrid home, Bella, the slip pile, Triage, seven Settings sections) has been put through the standards MJ set on the Meeting Studio on September 22: every word, icon and control has to earn its spot; one red button per page; no strip that repeats the page; the day as columns; the record with the action at the top and the two things you read together side by side; drawers with history behind every name and count; tokens only, on the shared chrome. Same Brightwater day, same calls, same real gaps. Open the prototype, or read what changed first. The September 13 version is still here, untouched, so nothing Matt was sent has moved under him.

Refreshed on September 22

MJ's calls from the Meeting Studio review, applied here piece by piece. What changed, and why, in plain words.

The questionThe call
Do we need the brief and the status line?No. The three-sentence brief said what the cards already show, and "All checks pass" was a green line on a day nothing was wrong. Both are gone. The one thing they carried that nothing else did, a piece that broke, is now a single line at the top, only while it is broken. Today it says texts are not going out.
Four buttons on every message.Call back, Text, Hand to and Close sat on every slip. Now a card has one red button only where there is a real choice (Call back, Approve, Take over) and one plain word beside it (Close, Skip). Hand to lives in the record as "Change who handles it", which folds the teammate picker open under the action bar. Text back is absent, not greyed: the worker has no text-send route for the dashboard.
Where did Waiting on your OK go?It was a tab and an inline section, two doors to one approval. It is now part of the count on Today, a Your OK pill on Sam's card with Approve or Skip, and the action bar on his record with "See the exact change" and Edit. The log of what she did on her own sits under the permissions it ran under, in Settings.
The message drawer.A call is a page now, not a drawer: the action bar at the top (Call Greg back, Approve, Take over, Done), what happened beside what is owed, the recording below, then the contact, the documents and the history. Nothing important below the fold. Drawers are for the records behind names and counts: the contact, the teammate, the promise, the question, the approval, the broken line, each with its timestamped history.
The promise ledger table and the questions section.Both repeated rows that were already on the page. A Promised chip on Today shows each promise as its own card with its clock; the question is a card on Amanda's call with the draft folded behind "Answer it", and a row in What she knows.
The day as a list.The day is five columns: still open from before, before 9, 9 to 11, 11 to 1, after 1. One small card per call, the current block outlined, worst first left to right. Needs you is the default chip; Everything today shows the handled ones too.
The Triage view.Cut. The record page with the library on the left already reads one caller at a time, and the folder tabs, the flying cards and the badge on every header were decoration. It stays in the September 13 version for the demo argument; whether it comes back is an open decision below.
Build notes, "Was:" cards, "Designed in, not in Wave 1".All gone from the product. The Live today switch in the review bar tags each piece live, needs the build, or gated, with the route it cites on hover. The where-the-tabs-went table lives here in the hub, not in Settings.
The test-call button on every page, rail icons, page subtitles, "Decline".Call me to test moved under Your number and Is she working?, where a test belongs. The rail is text. No subtitle. Decline is Skip.
Is anything actually broken in the seed?Yes. The carrier rejected the texting registration on Saturday night, so Priya's and Sam's confirmation texts failed this morning. The line at the top says so; Priya's card says Text did not send; both promises show as not kept; Fix it resubmits the registration from the drawer and the line goes away.
Is everything Bella does in the seed real?No, and the hub now says exactly which parts are not. Audited line by line against origin/main on September 22: the phone agent's only write tools are save a lead, flag spam, transfer, save a question and update the business profile. Booking a visit, sending a confirmation text and proposing a contact change are stories in this seed; the tables and routes for all three exist, but no phone tool feeds them. See the what-is-real table.
What about where it rolls up?Kept as its own page, trimmed to the Dashboard and To Do's mirrors with Bella's rows in them and no explanations. It is MJ's September 13 decision and Seth's file plan depends on it.

Ideas we tried and dropped

Open it

Same seeded day everywhere. Use it: call back, hand over, approve, publish, resubmit, play, open every name. The switch at the bottom of every page tags each piece with what the worker serves today. Reset puts the day back.

September 13 to September 22, side by side

Today

The brief, the status line, the slip pile with four buttons, the ledger and the questions section became one heads-up line, four chips and five columns.

September 13
The September 13 hybrid home
September 22
Today, September 22

A call

The 760 pixel drawer with nine stacked sections became a page: the verb at the top, what happened beside what is owed.

September 13
The September 13 message drawer
September 22
The call record, September 22

Sam's approval

A tab plus an inline card became the action bar on his call, with the change word for word one click away.

September 13
The September 13 Waiting on your OK tab
September 22
Sam Delgado's approval bar, September 22

Triage

The folders on the desk became the library beside the record. Nothing to learn, nothing to decorate.

September 13
The September 13 Triage view
September 22
The record with Change who handles it open, September 22

What ships today, reviewed

Read on the v3 app and the receptionist worker on September 13, and re-read from both repositories' origin/main on September 22 (worker e1a038b6f, September 20; v3 40589ea, September 21). The nine-tab strip is unchanged on main; Call history gained status, urgency, date and spam filters. Screenshots are the real pages.

Home is Call historyAn empty table. Nothing says whether she is on. Test call is the red button even when no number is assigned.
Agent activityFive zero tiles, Meeting Studio tasks listed as receptionist actions, a panel titled "Approval gates represented".
Phone and SMS"Missing, Missing" on the left; "Ready, Ready, Active" on the right, including "After hours: ai_only", a raw enum.
Customer skillsskill_key, parent key, sort order, a load command and a prompt editor. A developer surface shown to an owner.
Config"ElevenLabs agent", "AI answers after seconds", ten voices, six capability switches, a read-only mirror of routing.
DiagnosticsThe clearest page in the feature: "Not answering", each check with its fix button. It is tab nine of nine.
There is no "someone still owes this caller something".A call is a table row and then it is gone. No open state, no owner, no done, no record of what she promised. The only follow-up control books tomorrow 9:00 AM when the caller gave no time.
Biggest gap
Nine tabs, no hierarchy.Daily work sits beside plumbing (webhooks, carrier registration, skill keys, agent ids). The sidebar repeats all nine.
Structure
Nothing tells you whether she is on, or what broke.The answer exists (GET /phone/diagnostics) but only the ninth tab shows it.
Trust
Agent activity is not the receptionist's activity.GET /dashboard/activity has no source filter, so Meeting Studio rows appear on the receptionist page. Approve and Reject sit inline with no view of the exact change.
Wrong data
Knowledge silently fails.Only published articles with a body reach a call; the editor does not say so. The agent already saves the questions it could not answer; nothing shows them.
Half built
Solid underneath, keep all of it.Calls list and detail, the authed recording proxy, transfer and end call, test call, pending actions with approve, reject and edit, the autonomy policy, diagnostics, knowledge CRUD and reorder, skills CRUD and templates, routing partial saves, the hours builder, the number lifecycle, webhook verify and repair. The redo changes what you see, not what runs.
Keep

What best-in-class receptionists do

Two families sell this to contractors: standalone AI receptionists (Smith.ai, Ruby, Goodcall, Rosie, Dialzara) and the field-service platforms that bolted one on (Housecall Pro CSR AI, ServiceTitan AI Voice Agent, Jobber AI Receptionist). Their post-call experience is remarkably uniform.

ToolsWhat they do wellWhere they stop
Smith.ai, Ruby
the receptionist services
An instant summary to your pocket (email, text, Slack, Teams) the moment the call ends; a call record with disposition, actions taken, recording and the follow-up message.The record is read-only. Nothing tracks whether a human then did anything.
Goodcall, Rosie, Dialzara
the AI answering apps
Answer 24/7, qualify the job, route emergencies to the right tech, log to the CRM.No owner, no due time, no promise. "Handled" means the AI finished talking.
Housecall Pro, ServiceTitan, Jobber
the platforms
Hours, tone, scripts, pricing guidance and booking rules; an alert when the team needs to step in.Setup is still a settings tree; analytics are for Friday, useless at 1 PM between jobs.

The gap nobody fills: every product shows what was said. None shows what the AI committed you to ("someone will call within the hour", "$300 back on a tankless", "Tyler will be there by 8") as its own line with a clock and a kept or overdue state. None closes the loop from "she could not answer that" to "here is the approved answer, used on the next call". None makes a human the only thing that can mark a call done. Those three are still the upgrades here.

The council, and what it settled

Three front-office lenses briefed on the real feature on September 13: an executive assistant, a front-desk secretary, a chief of staff from a press office. They converged without seeing each other's answers, and their rules survive the refresh.

The owner

Dan runs the day from the truck. Wants to know who is waiting on him and how late, approve the one thing Bella asked about, and never learn a workbench.

The office manager

Rosa takes the vendor calls, keeps the answers current, chases the two things nobody did. Wants every open message to have a name on it and a time.

1. Never make the boss do the assistant's job.First screen: who needs me and how late, what she said in my name, what she could not answer. The count and the cards; nothing to read first.
2. Handled means a human obligation is closed.Bella may set Booked, Handled and Blocked. Done is a person saying "I reached them", stamped with who and when. Left a message keeps it open.
3. Anyone speaking for the principal is on the record.Every sentence she said carries its source or the word Improvised. Every promise carries a clock. Hear it plays the second.
"A promise ledger with a running clock is the single most reassuring number a small-business owner could be handed about an AI answering their phone."The executive assistant lens, September 13

The slice that makes RippleCore's version better

Standalone receptionists produce a slip in a vacuum. RippleCore's sits next to the CRM, the projects, the calendar and the team, so the slip can say "Greg Thornton, open project, Mike is on it Friday at 8" instead of "unknown caller, tile question".

Who Greg Thornton · known customer · open project: Thornton bath remodel What happened Is Mike still coming Friday to finish the tile? Nobody has told him. What Bella did Matched the project. Could not see the crew schedule. Promised a call back within the hour. What is owed "Someone from the office will call you back within the hour", due 10:14 AM, 3 hours late. Nobody has it. From the project Mike is scheduled Fri Sep 25, 8:00 AM to noon, tile. So the call back is one sentence.
The promise ledger

Every commitment she spoke is its own line with a due time, a kept or overdue state and Hear it. Only a person marks one kept. On Today it is the Promised chip; on the call it is the first card under What is owed.

Gated: needs the extraction step and a commitments table
Questions she could not answer

"Do you service Lowell?" is a card on Amanda's call with the draft folded behind Answer it. Publish it and the next call reads "answered from your approved answer".

Mostly built: the agent saves the question today; the draft and the stamp are Wave 2
A human closes

Call back dials, then asks how it went inline. Reached them closes it with a name and a time. Left a message puts it back on the list at 3:15 PM. Bella never sets Done.

Gated: one small table, three routes

Where the nine tabs went

Today's tabNowWhat changed
Call history & logsToday and All callsRows became cards with a state, a name and a clock; every one opens a record. All calls keeps search and the kind filter; main's status, urgency and date filters map onto it.
Agent activityA pill on the card, the action bar on the call, and What she did on her own under SettingsThe exact change shows word for word with Approve, Edit and Skip. The feed is filtered to the receptionist and reads as a log with who decided and when.
RoutingWho answers whenSame two windows, same hours builder. The on-call person is picked from the team, not typed.
Knowledge baseWhat she knowsSame articles. Drafts say "not used on calls". The open question sits on top with Answer it.
Customer skillsHow she handles callsPlain names first, the key as a small label. The editor is one click away.
Phone & SMSYour numberSame lifecycle. Carrier registration reads "Text messaging"; webhooks read "Phone company connection". The failing one is highlighted with its fix.
AutonomyWhat she can do without askingSame switches and the text limit. Each reads Automatic or Asks first, with the log under it.
ConfigGreeting and voiceHer name is a field. The agent id stays out of the owner's way.
DiagnosticsIs she working?, and the one line at the top of Today while something failsSame checks and fix buttons; the failing one is first.

What the prototype shares everywhere

Good, better, best: what is real today

Every piece in the prototype, traced line by line on September 22 to the route, table or tool behind it on origin/main. "Live today" means the worker serves it and the v3 page already calls it somewhere. The same tags show on the pages when Live today is switched on.

The one fact that reframes the table. The phone agent can call exactly twelve tools (services/mcp/voice-catalog.ts): load a skill, look up the caller's history, list and answer the owner's pending questions, save a lead (name, email, callback number, address, city, state, company, service, description, urgency, preferred callback, value, how heard), get business info, search the website, flag spam (hard and review), transfer the call, save a question, update the business profile. She has no tool to book a visit, send a text, tag or change a contact, or add a note. The capability switches on Greeting and voice only add a "Do NOT ..." line to her prompt when they are off. So the approval pipeline, the texting stack and the appointments table are all real, and none of them can be fed by a phone call today.

PieceVerdictWhat is behind it
The calls, the cards, the library, the time columnsLive todayGET /calls (routes/calls/api.ts:35): caller name (Twilio CNAM, or the CRM name when the phone matches a person), number, city, duration, status, handled_by, ai_summary, transcript, urgency, service type and description, preferred callback, estimated value, qualified lead, recording. Handled, Blocked and Voicemail come straight from handled_by and is_spam.
"What they wanted" in one linePartialai_summary is "service: description" when Bella runs save_lead (a qualified lead), otherwise the first caller sentence cut at 120 characters (CallBridge.ts:162). Urgency is keyword detection plus the lead tool. Categories like Reschedule, Existing job and Vendor are not stored; contact_type on calls is never written.
The recording and the transcriptLive todayGET /calls/:id (api.ts:179) and the authed proxy GET /calls/:id/recording (api.ts:108). The transcript is AI: and Caller: lines with no times. A voicemail has a recording and no transcript.
On the line now, Take overLive todayGET /calls/active (api.ts:90) and POST /calls/:id/transfer (api.ts:197), which rings the owner's phone.
The question she could not answer, Answer itLive todaysave_question writes the unanswered row with the call id and the caller's context (voice-handlers.ts:396); GET /knowledge-base lists it, /unanswered/count (:47) counts it; publishing is PUT /knowledge-base/:id (:129). The drafted answer and the published-by stamp are not stored.
Is she working?, Run again, the fix linksLive todayGET /phone/diagnostics (phone.ts:1076): nine checks with a fix href each, plus recent errors.
The heads-up line about texting, ResubmitPartialThe texting registration is not one of the nine checks; its state is GET /phone/10dlc/status (:1378) and Resubmit is POST /phone/10dlc/campaign (:1502). One extra read on the page. The "two confirmation texts did not send" part is a story: Bella cannot send texts (next row).
Priya's confirmation text, Sam's confirmation text, Text backNot realBella has no send-text tool; the send_sms switch only removes "Do NOT offer SMS follow-ups" from her prompt (elevenlabs.ts:33). The Rippler chat agent can text (services/twilio.ts records the delivery status), but no dashboard route reads sms_messages and POST /sms/send does not exist. To make this real: a voice send-text tool behind the send_sms gate, plus a per-call read of sms_messages.
Priya's booking, "Booked Thu 2 PM with Mike"Not realBella has no booking tool; the book_appointments switch only removes "Do NOT book appointments" from her prompt (elevenlabs.ts:34). A visit tied to a call is a human creating it from the call page (POST /dashboard/appointments with sourceCallId, appointments.ts:117), which v3 already does. To make this real: a voice booking tool with a free-slot read.
Sam's approval: the exact change, Approve, Edit, SkipNot real from a callThe routes are real (GET /dashboard/pending-actions :63, approve :137, reject :609, PATCH :360) and the Rippler chat agent and Meeting Studio feed them, but the phone agent has no tool that proposes a change, and the chat agent's update_contact takes only name and contact_type (ripple-handlers.ts:428). Nothing links a queued action to a call. To make this real: a voice tool that queues update_contact with phone fields and the call id.
What she can do without asking, What she did on her ownPartialGET and PUT /autonomy-policy (:41, :63) save the eight gates, but they gate the Rippler chat agent's tools, not the phone agent, which has no write tool to gate. GET /dashboard/activity (:39) is unfiltered and never receives a row from a phone call.
What she may do on a call (the six switches)PartialThey save through aiCapabilities. Ask new callers what they need and Answer from What she knows have tools behind them; Book on the calendar, Send text follow-ups, Keep contact records current and Add notes to projects have none, so switching them on changes what she offers, not what she can do.
Your number, Who answers when, Greeting and voice, What she knows, How she handles callsLive todayThe phone lifecycle (phone.ts:246 to :1645), PUT /phone/settings (:1317: forward-to, after-hours forward-to, rings, both modes, hours), PUT /contractors/profile (contractors.ts:82), /voices, /agents, /knowledge-base, /customer-skills. On call this week is a phone-number field, so the picker maps a teammate onto it.
Email herLive todayPOST /dashboard/contacts/:id/send-email (dashboard/contacts.ts:624) sends from the connected mailbox to a CRM person.
The teammate pickerLive todayGET /api/team?fields=picker (routes/pm/team.ts:807).
Known customer, In the CRM, the contact cardPartialcalls.contact_id and contact_type exist but nothing writes them; incoming.ts (:117) only copies the CRM name onto the call. The page can match a caller with GET /api/pm/people?q=<number> (pm/people.ts:156, phone LIKE) and then read GET /dashboard/contacts/:id; the stored link is a backend item.
What Bella did (the bullets)GatedNot stored as a list. The pieces exist as columns and as the audit rows the call writes, but no tenant route reads the audit log.
Needs you, who has it, the due time, How did it go, Done, Reopen, Change who handles itGatedCalls carry no follow-up state. The call_followups table and three routes (handoff 5.2), plus the hand-off route and notifyUser.
The promise cards, the Promised chip, Said to the caller with sources, Correct itGatedThe post-call extraction step and the call_commitments table (handoff 5.3). Nothing reads commitments out of a transcript.
Hear itGatedNo word timings are stored with the transcript.
Listen inGatedNo live audio stream to the browser. Transfer and end call exist.
Documents on file, the viewerPartialOne read over quotes, invoices, contracts, the vault, drawings and vendor bills (handoff 5.2b). The stored files already stream through routes that exist; the estimates and invoices lists take no contact filter and neither has a PDF.
Block list: 12 numbers, Manage, UnblockGatedblocked_numbers is real and written by flag_spam and the incoming check, but there is no route to list or remove a blocked number.
Where it rolls upPartial/dashboard/my-work, /dashboard/attention-items and /dashboard/home-stats count booked visits; none has a source for open calls. The followup row would be the to-do.
Her namePartialNo receptionist name on the contractor profile; the greeting text carries it.

What this means for Wave 1

Recommendation: build this shape on today's worker, plus one small table.

Three tabs replacing nine, with the old routes redirecting. Today as the five columns with the chips, computed from GET /calls, the pending actions and the diagnostics; the heads-up line from the failing check. The call as a page: the action bar, what happened beside what is owed, the recording, the contact, the documents, the history. Sam's approval on his card and his call, with the change word for word. The Settings door with the seven plain sections and every control kept. The one new table, call_followups, so Needs you, who has it, the due time, How did it go and Done are real, not derived. Then a copy pass so nothing on screen needs a second read.

Honest cost, after the audit. Frontend: about five to seven days in v3 with desktop QA. Backend for Wave 1: two to three days for the followups table and its three routes, the projection columns, the activity source filter, the my-work source, the contact match at call time and a block-list route. Then the piece the September 13 plan did not have: the phone agent needs three voice tools before any of the approve, book or text stories are real, a send-text tool behind the send_sms gate, a booking tool with a free-slot read, and a propose-a-change tool that queues update_contact with the call id (and update_contact learns phone fields). About a week of backend on top, and Wave 2 (the extraction step, the promise cards, the drafted answers) after that.

What ships dark. The promise cards and the Promised chip, Said to the caller with sources, Hear it, Change who handles it until the table lands, Correct it, Listen in. Each is absent or a plain sentence, never a "coming soon" pill.

To decide with Matt. (1) Which of the three voice tools come first: texting, booking, or proposing a contact change; today Bella can only save a lead, flag spam, transfer, save a question and update the business profile. (2) Waiting on your OK folded into Today and the call, no tab. (3) Triage stays cut, or comes back as the demo view only. (4) The day as five columns, or a worst-first list. (5) A call as a page with the library, or the old drawer. (6) A receptionist name column on the profile, default Bella.

Sample data, illustrative only, seeded with real gaps (a rejected texting registration, two failed confirmation texts, a promise three hours late and one a day late, a voicemail past its morning, a question nobody answered, an approval waiting, a hang-up, a vendor with the office manager). Run locally with node mockups/receptionist-refresh/_serve.mjs then open http://127.0.0.1:4650/. Add ?clean=1 to any page to hide the review bar. Built on the live v3 shell, the decided Rippler top bar (September 22), Ubuntu type and the June 2026 DataRipple tokens, copied from the Meeting Studio batch. Routes were read from the receptionist worker at origin/main e1a038b6f (September 20) and the v3 receptionist pages at origin/main 40589ea (September 21), both fetched read-only on September 22; the September 13 handoff's file:line references stand where the files did not move.

Research sources: Smith.ai call dashboard · Smith.ai daily call summary · Smith.ai vs Ruby · Housecall Pro CSR AI · Best AI voice agents for plumbers 2026 · Best AI assistants for contractors 2026 · AI receptionists for home services 2026.