Turnovers · overnight session · Jul 29 → 30, 2026

Turnover money decisions went deterministic — shipped, deleted the old path, proved it live, and fixed the one thing the proof caught

Everything below is merged and verified on production unless marked otherwise. ~35 PRs landed this session. As of Jul 30, ~6:30 PM MT.

1 · The rethink is live end-to-end

The single-pass sampled projection is gone. Production now runs the ladder — one LLM call reads the walk, pure TypeScript makes every money call, an opus judge + unanimity panel handle only genuine ambiguity (ADR-0121, accepted; #5002 implementation, #5060 legacy deletion, English-language walks only by declared scope).

Old single-passLadder
charge_correctness (52-walk replay)7898
Money decisions made by code0%94.5% (171/181)
Cardenas dispatch mis-billed as tenant charge2 of 3 draws0 of 3
Latency per walk~9.5s~30s

Live production proof (The Willows, real walk through the real endpoint): a vendor-dispatch ask minted a work task with no charge line; "charge the tenant $150 for cleaning" survived verbatim as a tenant charge; an ambiguous stain produced a "Who pays?" question instead of a silent zero. The judge never fired — code decided all three. Full numbers: before/after report.

2 · The live proof caught a P0 — fixed the same night

6 of 13 identical prod runs returned a silently empty projection — the whole walk vanished behind a healthy-looking record, and placeholder junk reached PM-visible summaries. The replay corpus couldn't see this (it replays stored extractions). Fix shipped (#5075 + #5089): forced tool call + one retry, a junk-summary guard (zero false positives against all 22 real stored summaries), and a loud failure instead of persisting an empty draft. Re-verified: 0 silent-empties and 0 placeholders in 10 prod runs. The fix also closed a pre-existing wedge where any projection failure would have parked a voice-driven walk forever.

3 · Security: a cross-org read hole was a class, not a bug

Your "Willows under Camellia" screenshot unraveled into: any authed user in any org could read Camellia's live invoice totals (/api/costs), confirm cross-org purchase-order bindings, and read metric history. All three fixed and prod-verified (#5038, #5041, #5059), then a sweep of all 97 property-id-reading routes fixed 10 more unscoped verbs across 8 routes — including a cross-org cascade delete — with bidirectional guard tests and a CI tripwire so new routes need a recorded verdict.

Held deliberately (decision 2 below): the app has no org-scope envelope at all — org_admin is unbounded on property/unit/work-order detail routes, and POST /api/turnovers has no auth check behind the session gate. Fixing it touches shared helpers across dozens of surfaces.

4 · The spend spike: found, stopped, fenced

Not the overnight agents (all 196 transcripts rode subscription auth). CI eval workflows billed the metered production key on every PR (~$28–32 across 24 PRs), and promptfoo's graders billed it implicitly even when completions didn't. Now (#5055, #5070): every eval lane runs on the subscription bearer, the production key is absent from CI entirely, and two drift rules enforce it — the allowlist for metered use is empty, and the one declared exception (nightly trace-replay) must announce itself in-scope. Verified by credential log lines in every lane.

5 · Smaller verdicts

6 · Decision items (Fede, Jul 30: skipped for now — nothing pending; tick a box to revive one)

Remove ANTHROPIC_API_KEY from Vercel preview/dev — last metered surface outside prod; takes preview Clara offline (card).
Greenlight the org-scope-envelope ADR — closes the org_admin cross-org reads + the unauthenticated turnover POST as one designed change.
Arm PO sync on one property — one PATCH away, but fix the truncated-fetch → "mark removed" hazard and tear down the 9 demo-seeded Willows POs first (both on the Trello card).
Second-walk charge re-staging — delta-scoped findings still don't re-stage charges (#4933 gap).
Auto-merge race convention — five incidents of green auto-merge firing while review-fix commits were mid-push; pick a rule.

7 · Shipped after this report went up (Fede: "ship it" / "wrap up all wip")

PropFlow Docs