Silent Drop of Mid-Conversation Emails

Incident record & locked decisions · Camellia Apartments · August 2, 2026 · Owner: Fede

What happened

A hot leasing lead — Jace Weaver, from Apartments.com, wanting to tour before an Aug 10 move-in — was mid-booking with Clara by email. His girlfriend, Sadie-Kate Ball, was going to tour on his behalf. Clara asked for her name; he confirmed the 2:30 PM slot; Clara asked for the name again instead of booking; and at 2:23 PM he answered:

"Her name is Sadie-Kate Ball her phone number is (601)-738-1473."

That email never reached Clara. It was silently parked. No reply went out, nothing appeared in the conversation, no alert fired, and the tour stayed un-booked. The prospect has been ghosted since — mid-booking, at the moment of highest intent.

Root cause — four layers, each "working as designed"

  1. The email classifier has no bucket for "answers the question Clara just asked." It reads each email in isolation — no conversation memory. A bare name + phone number fits no category, so it honestly answered needs review.
  2. The mid-conversation protection stops one layer too early. After the May "Dario" incident, senders with an active conversation bypass the junk filter — but the category classifier and the response-policy gate run without that context. The "this sender is mid-conversation" flag was in scope at the exact line that parked the email, unused.
  3. The "review queue" has no surface. The policy layer parks unbucketable mail "for a person to work" — but the admin banner only shows rent-roll sync items. Parked prospect emails appear nowhere a human looks.
  4. The known-prospect drop alert explicitly excludes this case, on the assumption the review queue is actively worked. It isn't.

Contributing behavior bug: Clara refusing to book the confirmed 2:30 slot until she had the visitor's name violated her own rules (a confirmed time books immediately; the visitor's name is an ask-alongside, never a gate — ADR-0101 makes it an advisory hint that "never gates"). Her off-spec gatekeeping is what forced the unbucketable reply in the first place.

Blast radius — this was not a one-off

A 30-day sweep of skipped emails from senders with an active conversation found three real victims, all at Camellia:

WhenWhoWhat was droppedStakes
Jul 30 Hayley Bannochie Approved applicant asking how she signs her lease, confirming Aug 20 move-in, requesting the parking waitlist Approved applicant, pre-signature, ghosted 3 days
Jul 31 Paula Delgado (APT 607) Renewal negotiation for her 9/1 renewal — asking to match the advertised $1,000 studio rate (current $1,150) Live renewal, time-boxed, never entered the renewal lane
Aug 2 Jace Weaver The visitor name Clara demanded before booking the 2:30 PM tour Hot lead ghosted mid-booking

Decisions (locked by Fede, Aug 2)

1. The active-thread invariant shipping

"Common sense is to keep engaging back and forth, no matter what hacks might be in there. Rules in a prompt should not be able to trigger bugs like this where we drop a high value tour mid conversation."

When the sender has an active conversation at the property, every classifier verdict and policy rule is advisory — the message always routes to Clara, who has the full thread. Backstop: if a known-prospect email ever still parks, the drop alert now fires (the exclusion is removed).

2. Prompt rules can't gate bookings shipping

RULE 13 patched: a confirmed tour time books immediately, with the visitor-name ask carried in the same reply — never withheld pending the name. New eval rows reproduce the exact incident turn so it can't regress.

3. Harness proof before replay done — and it earned its keep

The incident was implemented as two scenarios in the email stress harness against The Willows in production. The booking scenario passed 10/10. The bare-name-reply scenario — the exact incident turn — failed: the queue-side processor ran its own defensive second decision and could still park a mid-conversation reply when the message arrived without the webhook's override flag (any publisher that skips the webhook layer). That second-layer copy of the drop was fixed the same night — the processor now computes "does this sender have an active conversation?" itself before it is allowed to park anything — and deployed before any real email was replayed.

Replay results (Aug 3 morning): Jace — tour booked (Mon Aug 3, 2:30 PM, calendar event, PM notified, Sadie-Kate Ball recorded as expected visitor, confirmation threaded to his inbox); Hayley — answered, lease-signing/move-in/parking escalated to the property inbox; Paula — holding reply sent, $1,000-vs-$1,150 counter escalated to the property team, no autonomous concession. Zero contact of any kind with the visitor's phone number (verified at the database level).

4. On-behalf visitor communications — full parity, both people design → build

Superseded ruling (Fede, Aug 2 night): the earlier opt-in-loop design is out. The visitor gets the exact same tour confirmation, reminders, and follow-ups a regular prospect gets — sent to both the requester and the visitor, with quiet hours respected (first text lands in the morning, recipient-local). Fede accepts the intermediary-consent posture: the requester volunteered her number mid-booking for the purpose of coordinating her visit. Mitigations stay: consent-context logging, immediate STOP handling, quiet-hours enforcement, informational 10DLC.

Bigger design questions (one conversation or two, who the visitor is in the system, how sends fan out) are laid out as multiple-choice options in the design doc — pending Fede's picks; build follows.

5. Deep audit of every silent-death path complete

A full adversarial audit of the inbound email pipeline is enumerating every point an email can terminally stop, judging each against the invariant, and producing the test-gap and visibility-gap list. Findings will extend this doc.

Done Aug 2: 82 paths mapped, 24 adversarially verified; 13 hardening workstreams identified — full report.

Workstreams in flight

WorkstreamWhat it does
Active-thread invariant fixClassifier/policy verdicts advisory for active conversations, carried end-to-end (webhook → queue → processor); drop-alert backstop armed
RULE 13 booking-gate patchPrompt clause + on-behalf gauntlet eval rows (subscription runner)
Stress-harness scenariosJace-pattern regression scenarios on The Willows; the gate for replaying the real emails
Co-signer guest-card fixSeparate finding, same session: AppFolio co-signer guest cards minted duplicate standalone prospects (the Warren rows); sync now skips them, duplicates then deleted
Pipeline death-path auditAdversarial map of every silent-drop path + prioritized fixes and missing tests

Prepared by Clara/Claude session, Aug 2, 2026. Sources: prod conversation c2b2a4ab…, email ingestion log, Microsoft Graph message bodies, repo code as of main@Aug 2, 30-day ingestion sweep. All quotes verbatim from stored records.

PropFlow Docs