Sales stamps the evidence gap and confirms the close vocabulary
Both asks from Platform's flip-landed memo are answered here; the stamping is already done in production.
The six rows are stamped, with derived markers
Sales ran a stamping pass against production (sales repo scripts/stamp-handoff-evidence-prod.ts, selector: to_stage terminal, reason inbound_event, null evidence; idempotent). Rather than blanket-stamping credit_locked, each row's marker was derived from close-time records: a sales.credit_locked.handoff_applied audit breadcrumb proves the credit.locked correlation path performed the close, a sales.handoff.late_paid_attended audit event proves the late repair path did, and a customerHandoffProcessedLog row is the fallback witness for the customer.handoff subscriber. Result: six rows stamped, five credit_locked (breadcrumb-proven) and one late_paid_attended (lead_019e32be-97f7, closed 2026-06-04). The blanket stamp would have mislabeled that sixth row, which is exactly the evidence-clarity distinction ADR-0033 wanted preserved. Zero null-evidence handoff closes remain; the mart's handoff count should now read six with an evidence split of five and one.
The close-reason vocabulary, confirmed from the close paths themselves
The discriminator for close kind on lead_stage_history is the reason column plus the evidence marker, not substage spellings. Confirmed against the actual close code paths:
cadence_exhausted_count: to_stage = 'terminal' AND reason = 'cadence_runtime'. The exhaustion close is the only cadence_runtime path to terminal. One warning: do not use to_substage for this metric. The exhaustion path applies its exhausted substage overlay after the transition writes history, so the history row's to_substage carries the pre-close substage; only reason is reliable there.
operator_lost_count: to_stage = 'terminal' AND reason = 'operator_action'. The only operator actions that reach terminal are the lost family (mark_lost, mark_wrong_number, mark_duplicate_suspected), so the reason alone is exact. The dispositions Platform observed (terminal_lost default, not_interested, wrong_number, out_of_service_area, duplicate_suspected) are the loss-detail breakdown within this set, fine as a dimension, wrong as the discriminator.
churn_pre_lock_count: to_stage = 'terminal' AND handoff_evidence IS NULL. With the six rows stamped this is exactly the operator-lost plus cadence-exhausted population, and it stays correct under any future close path because every handoff close carries a marker by construction (ADR-0008) while non-handoff closes never do.
Lead-grain alternates exist if Platform ever needs them (sales.lead substage lost for operator losses, substage exhausted or disposition terminal_exhausted for exhaustion, disposition terminal_locked for handoffs), but Sales recommends the history-grain reason-plus-evidence forms above as primary: history is the transition-grain source the mart already reads, and the lead row only carries the latest overlay. If Platform wants disposition served on a history silver later, that is an additive ask Sales will take on its merits.
This memo is the vocabulary confirmation Platform named as the trigger for its alignment commitment.