Sales answers the silver pipeline columns question
This reply is the decision that clears the sales-pipeline-silver-confirmed event declared on Finance's 2026-06-09 memo. The short version: counts by stage with intake-week are served today, org_market_id is one established join away (or an additive column on request), and an expected-value basis does not exist anywhere in Sales because pricing never attaches to a lead before the first lock.
What the sales silver face exposes today
Sales' silver face under warehouse-silver v1.1.0 is two lead-grain views in the sales schema, lead_sdr_summary and lead_last_touched_at_signal. The pipeline-relevant columns live on lead_sdr_summary:
lead_stage carries the canonical stage strings (new, pending_match, qualified, callback_scheduled, attempt_exhausted, handed_off, scheduling, onboarded, lost) and lead_status carries the orthogonal health axis (active, stalled, lost). Counts by stage are a straight aggregation over these. For Finance's "qualified, not yet paid" layer, the natural pre-payment filter is stages from qualified up to but excluding handed_off, with lead_status = 'active' excluding stalled and lost records; Sales is happy to confirm the exact predicate once Finance drafts the manifest.
intake_cohort_week is served directly (it is date_trunc('week', intake_created_at) computed in the view, alongside the raw intake_created_at), so the intake-week grain Finance asked for needs no consumer-side derivation.
is_backfill and tenant_id are also on the view; Finance should filter is_backfill for forward-looking pipeline figures.
org_market_id
By design it is not denormalized onto lead_sdr_summary. Market signal lives on sales.lead_market_assignment (market_id, with is_current marking the live assignment), and the view's own header comment names the join as the supported pattern for Finance bucketing by org_market. So the column is reachable today with one lead-grain join inside the silver tier, no new Sales work.
If Finance would rather read a single conformed view, Sales will denormalize the current assignment's org_market_id onto lead_sdr_summary as an additive warehouse-silver minor; that is the conditional commitment above, an XS change, and it clears on Finance saying so in the manifest draft. One caveat either way: market_id is nullable while an assignment is unresolved, so market-bucketed counts will carry an unassigned bucket.
Expected-value basis
There is none, and not because silver has not caught up: no pricing attaches to a lead anywhere in Sales' operational store before the first lock. Pricing is owned by Revenue (credit reservations) and Delivery (lessons); Sales' CompositeOffer carries correlation ids only. So layer 2 should ship counts-based. If leadership later wants an expected-value pipeline figure, that is a cross-domain conversation about where pre-lock pricing would attach, most likely with Revenue, not a Sales silver column Sales can conjure today.
References
Silver views: prisma/migrations/20260519120000_lead_sdr_summary_view and 20260519121000_lead_last_touched_at_signal_view in the sales repo. Contract: warehouse-silver v1.1.0 (additive columns are minor-safe; consumers ignore unknown columns). Stage semantics: lead-lifecycle contract and ADR-0002.