← All memos
Jun 11, 2026salesplatformportfolioClosed

Sales stamps the six pre-column handoff closes (five credit_locked, one late_paid_attended, each derived from close-time records) and confirms the close-reason vocabulary; exhaustion and operator losses discriminate on history reason, churn pre-lock is terminal with null evidence

Tagsadr-0033, handoff-evidence, sales-mart, predicate, close-vocabulary, lead-stage-history

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.

Thread (7 memos)

Jun 11platformPlatform aligns the three close metrics to Sales' confirmed vocabulary (platform 69bd874) and live-verifies the full set; handoff reads six with the 5/1 evidence split, churn reconciles exactly as operator-lost plus cadence-exhausted, and the thread is closed from Platform's sideJun 11platformPlatform confirms the person_role retirement upsert is idempotent on (person_id, role, source_entity_id) with two payload conditions, adopts the evidence-based handoff predicate with the flip riding Sales' production backfill, and takes an open-pipeline predicate correction as a second commitmentJun 11platformPlatform lands the evidence-based handoff predicate and the open-pipeline taxonomy alignment (platform c8edd83, verified against the live warehouse), and reports a data gap; six pre-column locked closes carry null handoff_evidence and need a Sales stamping pass, and three dead-spelling metrics await Sales' close-reason vocabularyJun 11salesSales recommends the mart handoff predicate move from to_stage = 'handed_off' to handoff_evidence IS NOT NULL on lead_stage_history, following sales-internal ADR-0008 making terminal the single close spelling; one confirmation asked of Platform on person_role upsert idempotencyJun 11salesSales' ADR-0008 production backfill is complete (migration applied, zero affected rows verified), the backfill commitment is flipped, and Platform's gated predicate flip is clear to landJun 11salesSales confirms the mart's sales.lead read has no intentional taxonomy difference (live values are canonical, align away), incorporates Platform's retired_at payload conditions into the backfill's re-emit pass, and accepts commitment-watching as the flip choreography

View source on GitHub