Effort Raise — End-to-End Replay Validation

The shipped email/SMS drafting change (reasoning effort medium → high, reply ceiling 8K → 16K) replayed against 137 real production conversations through the full multi-turn pipeline with live tool calling — baseline vs shipped, plus the noise-floor control that makes the numbers interpretable.

2026-08-28 · replay bench: appfolio-45 test property (prod corpus read-only; The Willows is the voice sandbox — several replayed conversations are Willows leasing threads by content) · author: Claude (Fede's session) · all runs on the subscription, zero real sends (kill switch verified)

Verdict: the merged config is validated end-to-end. Across 324 aligned real-conversation turns, the behavioral difference between medium and high sits below the replay harness's own noise floor — two runs of the identical config diverge as much as medium vs high do (tool-call-set match 43.2% config-identical vs 48.1% across configs). Where divergences were graded, high was equal or better (it checks availability before booking a tour and tells the prospect the truth; medium booked blind). The one real cost is latency: +6.6s median per drafting turn. No revert warranted.

1 · What ran

The replay harness drove every conversation through the real production entry point — inbound dispatch, routing, the full agent tool loop, persistence — against the bench property on the dev table, reading the prod corpus read-only. Each arm replayed the same manifest: 137 real conversations + 16 synthetic suite = 153 conversations, 411 inbound turns, spanning leasing, tours, maintenance, renewals, vendors, and operational traffic on email and SMS.

ArmConfigConversations okTurns measuredModel callsTool callsTurn latency med / p90
Baselinemedium · 8K (pre-merge main)133/15333588969524.6s / 37.7s
Shippedhigh · 16K (the merged PR)136/1533601,00592031.3s / 59.5s

"Not ok" conversations are dominated by held turns — the escalation gate correctly holding inbounds for a human where the real conversation was in an escalated state. That is the pipeline working, reproduced faithfully. Zero messages reached any real person in any run (outbound kill switch armed and verified: 0 of 193 captured sends hit the wire).

2 · The comparison, and the control that makes it honest

Raw divergence numbers from a multi-turn replay are meaningless without a noise floor: two runs of the same code diverge through sampling, tool-loop ordering, and live bench timing — and each arm's own earlier replies feed its later turns, so small early differences compound. So the comparison comes with a config-identical control:

ComparisonAligned turnsExact reply matchTool-call-set matchJudge: equivalent (of divergent)
medium vs high (the A/B)32418.5%48.1%43.9% (264 judged)
high vs high (identical config — noise floor)27116.6%43.2%— (judge off, deterministic metrics only)

Reading: the cross-config comparison diverges no more than the config-identical one — on tool-call sets it actually matches slightly better. The effort change's behavioral delta is below what this harness can distinguish from its own nondeterminism. That is the strongest available evidence of no regression: on 324 real turns, nothing systematic separates the arms.

3 · What the divergences actually are

Hand-graded sample of the sharpest tool-divergent pairs (full pair data retained locally):

4 · Latency — the real cost, quantified on real traffic

Metricmediumhighdelta
Turn latency, median24.6s31.3s+6.6s (+27%)
Turn latency, p9037.7s59.5s+21.8s
First drafting call, median (email)4.9s9.3s+4.4s

Email/SMS are asynchronous channels; the decision doc accepted seconds-scale thinking cost for judgment quality. Voice is structurally unaffected (different engine, no effort parameter). First-24h Langfuse watch stays on: latency, truncation stop-reasons (none expected at 16K — zero replies approached even 8K), cache cold-starts.

5 · Coverage ledger for the whole decision

6 · Methodology findings (worth keeping)

7 · Follow-ups queued

8 · Provenance

Runs (result dirs, local): baseline-medium 15:23Z (133 ok/335 turns), candidate-high 16:04Z (136 ok/360 turns), candidate-high-salted 17:02Z (contaminated-protocol arm, kept as methodology evidence), baseline-medium-2 18:12Z (invalidated: main had already moved to the merged config, and the run hit real 429s). Parity reports: fresh-vs-fresh with judge (264/264 divergent turns judged), config-identical judge-free. Corpus: manifest built 2026-08-28 from propflow-prod, read-only, synthetic replay identities only (no real PII leaves prod). Billing: subscription bearer on every model call (verified in each run's sandbox proof). Decision doc for the original raise: effort-sweep-email-sms-2026-08-27. PR: #6461, merged 2026-08-28 15:26Z.

PropFlow Docs