When a human steps in and sends a message as Clara, four things must happen as one action. The design for making that structurally true — and usable from the UI.
2026-08-29 · separate initiative (Fede) · design only — implementation scheduled, not started · Trello 3Cp0XQEt
The invariant: a takeover is one atomic update. Send the message, close the question it answered, record what the human said as the true answer, hand the conversation back — all four commit together or none do. There is never an observable in-between: never a sent message with its question still open, never a closed question with no message.
Twice, the four steps living as a written checklist has burned us:
A safety step that lives in prose gets skipped under "loop closed" momentum. This initiative moves all four steps into the send path itself, where forgetting is impossible.
Operator caveat until the composer exists: the manual rail runs from a local checkout — the fixes protect an operator only once their session is on updated main.
One operation, transactional on our side: the state effects (matter closed with the answer recorded, human-authority stamp, thread release) commit in a single transaction, keyed to confirmation of the dispatched message. Ordering: persist the outbound row, dispatch, then commit the state transaction on dispatch confirmation. The message send is external and cannot sit inside a database transaction — so the failure semantics are specified, not implied:
The deferred half of the Aug 29 fix, done deliberately: the operator's text is recorded as the matter's staff answer and stamped authoritative — Clara can never contradict it, on this thread or after hand-back, forever. The known design wrinkle (settling a matter from an outbound send must not re-relay the answer the operator just sent by hand) is the core review item of the build.
Reply-as-Clara in the conversation pane (Fede: "would be nice to do on the UI"). What today needs a terminal and a skill becomes a text box any teammate can use. The record carries who wrote it ("Sofia, as Clara"); the send works on a muted thread (one send goes out, the mute stays — Fede: keep this). Known prerequisite from adversarial review: the human-authority flag must be threaded through whichever dispatch rail the composer uses — one rail today drops it, which would over-block the muted one-send.
| # | Decision | Status |
|---|---|---|
| 1 | Four effects commit as one atomic update — no observable partial state. | Decided — Fede, Aug 29 |
| 2 | Hand-back is expected: human answers, then Clara continues — takeover never permanently locks a thread. | Decided — Fede, Aug 29 |
| 3 | Reply-as-Clara stays, including on muted threads (one send, mute stays on). | Decided — Fede, Aug 29 |
| 4 | Own lane: separate design, separate harness, separate priority — not coupled to reply-necessity or the send-chokepoint work. | Decided — Fede, Aug 29 |
| 5 | Send-failure semantics: recommend abort-all (marked-failed row, operator retries deliberately) over auto-retry of the whole operation — a takeover is a human act; the human should stay in the loop on its failure. Note: transient carrier/API retries already exist below this layer; Sentry is wired throughout the agent — the reconciliation pass reports there. | Proposed — pick at build kickoff |
| 6 | Composer v1 scope: text + email threads first; voice callback stays on the existing skill path. | Proposed — pick at build kickoff |
Separate harness, atlas-registered, never shared with the other lanes' rigs:
Related pages: Knowing when not to answer (judgment lane) · Mute, end to end (person switch) · send-chokepoint design (separate page, in progress). Sources: PR #6518 body and bench pins, ws8/ws9 build ledgers, clara-takeover skill §6/6b, incident records 2026-08-12 and 2026-08-28.