Why Clara wouldn't stop replying

What caused the thread that embarrassed us, how common it is, what we fixed overnight, and the handful of things that need your call this morning.

2026-08-29 · overnight program · every number below comes from real production data or is labelled an estimate

The strategy in one paragraph

The embarrassing thread wasn't one bug — it was a missing concept. Clara has no idea of "this conversation doesn't need a reply": prospects literally cannot receive silence, nothing compares what she's about to send with what she already sent, and her follow-up timers never look at what's happening in the conversation. Overnight we proved all of that with real production data, fixed every confirmed defect that fed the incident, built the measurement rig that grades "would a coworker have sent this at all", and built person-level mute as one first-class switch. What remains for you this morning are the design picks, not the bleeding.

1 · What causes it (verified, not guessed)

2 · How widespread (real rows, honest denominators)

3 · The yellow dot — straight answer

It means a safety check changed what Clara said before sending. A rewrite lights the same dot as a block. On the two dotted messages (4:34 and 4:43 PM Mountain), the promise-backing check swapped his sentences down to "I don't have that answer on file right now" — the exact robot-speak he called out. So your reading was half right: the check did catch something and a message did go out, but what went out was the corrected version, not the caught draft. That check's two real holes — blindness to a dash, and never reading the open-question table — are both fixed and merged.

4 · Shipped overnight — nine changes, all merged

  1. Answered questions stay answered — a new message can no longer wipe a settled answer (the 2:31 AM overwrite was the failing case).
  2. Follow-up timers park on human-owned threads instead of blindly spending their turn — your "aware of what's happening" ruling, implemented.
  3. Promises split by a dash are now detected. Replayed over 30 days and 850 real turns: exactly two additional catches, both this incident's own missed promises.
  4. "Backed" now reads the actual open question, not the racy thread status.
  5. A takeover hands the thread back when the answer settles, not at send — the 79-millisecond flip that re-armed the loop mid-conversation is gone.
  6. The escalation relay follows the person's address — an email-side question can no longer silently fail to text an SMS prospect. Found live while closing his question.
  7. A refused manual send now explains itself — "this person is muted or opted out, here's how to proceed" — instead of failing silently.
  8. The measurement lane. It replays real threads through the real loop with outbound suppressed and grades every reply against "would a coworker have sent this?" Red run committed: 100% of graded replies on the incident thread fail the coworker standard — twice. This is the ruler every fix gets measured against.
  9. Mute v1 merged — all checks green, both reviewers. See the next section for what that does and does not mean.

5 · Mute — merged, and dormant until you say otherwise

Your invariant, shipped: a muted person hears nothing and triggers nothing, until unmuted — except what a human deliberately sends, and emergency or safety notices. It is one new "muted" level on the existing opt-out table — one column, every lane at once, including the five paths that bypass the usual gate and the routine operational replies nothing else stops.

Proven on the test property: 6 out of 6, twice. Silence in both directions, zero team notices, takeover-as-Clara still works with the mute staying on, and an opt-out can never be overridden. On voice, the webhook half is proven and the live call leg ships through the agent-config pipeline behind two scored simulation scenarios — the direct-edit path is correctly blocked by our own CI guard. The pane switch, the list badge and the productized "reply as Clara" composer are day-2; the API underneath already exists.

6 · The prospect — final state

7 · Your morning picks

Two are live decisions blocking work that is otherwise finished:

  1. Activate mute v1 — the code is merged and dormant; the Willows demo is ready, with proofs at 6 out of 6 and then 8 out of 8.
  2. Un-gate the "don't reply to a bare thank-you" skip — built, conservative, held in draft for exactly this decision.

The rest, all on the decision page as multiple choice with a recommendation:

Honesty ledger — what went wrong on our side

Caught by us, disclosed

Caught by the review lane — two that would have shipped broken

Full evidence trail, including every query and file reference, is in the session reports; the decision page carries the sourcing for every number above.

PropFlow Docs