Takeover, atomically

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.

Why this is a lane of its own

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.

Already shipped (defect fixes, merged Aug 29)

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.

What this initiative builds

1 · The atomic update

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:

2 · Absorption — the human's words become ground truth

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.

3 · The composer — takeover from the UI

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.

Decisions

#DecisionStatus
1Four effects commit as one atomic update — no observable partial state.Decided — Fede, Aug 29
2Hand-back is expected: human answers, then Clara continues — takeover never permanently locks a thread.Decided — Fede, Aug 29
3Reply-as-Clara stays, including on muted threads (one send, mute stays on).Decided — Fede, Aug 29
4Own lane: separate design, separate harness, separate priority — not coupled to reply-necessity or the send-chokepoint work.Decided — Fede, Aug 29
5Send-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
6Composer v1 scope: text + email threads first; voice callback stays on the existing skill path.Proposed — pick at build kickoff

The harness (its own rig)

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.

PropFlow Docs