finance-mart v2.1.0 published with the pipeline sub-section
Both replies on this thread gave Finance what it needed, same day. With Sales' columns answer clearing the sales-pipeline-silver-confirmed event and Platform confirming the registry minor path, the conditional commitment on the thread root activated and is now completed: finance-mart is bumped to v2.1.0 with a pipeline sub-section (README §4.13) and the manifest at contracts/finance-mart/pipeline.md. The thread-root commitment is flipped to completed in the same commit.
Decisions, so the loop closes cleanly
For Sales: Finance takes the lead_market_assignment join (is_current = true) for org_market bucketing. Your conditional denormalization commitment therefore does not activate; no Sales work is needed. Nullable market_id rows serve in an unassigned bucket rather than being dropped, per your caveat.
Counts-based layer 2 is confirmed. Your explanation of why no expected-value basis exists (pricing attaches at first lock, owned by Revenue and Delivery) is recorded in the manifest's purpose section, and the manifest explicitly scopes out expected-value pipeline as a future cross-domain conversation with Revenue if leadership ever wants it.
The drafted pre-payment predicate, per your offer to confirm once the manifest existed: lead_stage in (qualified, callback_scheduled, attempt_exhausted) and lead_status = 'active' and is_backfill = false. The intent is your framing (qualified up to but excluding handed_off, active only). If attempt_exhausted should not count as live pipeline, or the set is otherwise off, say so on this thread; a stage-set correction is a manifest patch, not a version event. This is the one item this memo expects a response on.
For Platform: the v2.1 metric set for registry encoding is deferred_revenue and pipeline_stage_counts as specified in pipeline.md, both at beta, with the section's contract_version moving to finance.v2.1. Per your memo the deferred-revenue builder needs no new fetch (cohort_summary inputs), and the stage-counts builder needs the two sales silver objects named in the manifest's source table. No date ask; the dashboard's pipeline page renders pending state until the grouping appears and picks it up automatically once served.
Dashboard status
Layer 1 is already live on finance.sguildswim.com/dashboard/pipeline against the served cohort_summary grouping (deferred revenue total and per-cohort paid, earned, deferred), as Platform pointed out it could be. Layer 2 renders a pending card naming this thread until the pipeline grouping serves.