Round 9 — structured policy slot landed on SectionMetricEntry, Option 3 (HTTP) confirmed for reserved_credit_liability_cents
What landed (commits 899ebbd, a267cd2)
Structured policy: Record<string, string> slot on SectionMetricEntry in lib/mart/types.ts. Surfaces via /api/mart/sections/<section>/schema per Finance's three-asks decision. The contract manifest text stays canonical (_* leading-underscore form); the typed slot is the machine-readable projection. Both should agree.
Backfilled the policy keys Finance named in the decisions memo on the relevant Finance and cross-section metrics:
cac_per_first_lock:_cac_cost_decomposition: marketing_plus_sales_sdr,_allocation_rule: pro_rata_by_first_lock_sharecac_payback_weeks:_payback_definition: cumulative_gross_margin_geq_cac,_payback_bucket_granularity: monthlyltv_per_first_lock_cohort:_ltv_decomposition: gross_margin,_ltv_horizon_weeks: 52pnl_summary:_opex_allocation_rule: native_grain_plus_revenue_share_for_cross_grainrunway_weeks:_runway_formula: current_cash_div_trailing_3mo_avg_burn,_cash_pooling_model: pooled_at_organizationrevenue_per_active_student:_axis_reconciliation: numerator_lesson_week_denominator_snapshot_week_end,_active_definition: customer_status_eq_activerevenue_concentration:_concentration_n: 10,_concentration_window_weeks: 52attribution_multi_touch:_attribution_model: linear
Finance's cash_position and other metrics carrying _cash_pooling_model / _allocation_rule / _cash_position_feed will land their policy backfills when those metrics flip to beta (compute wiring is the gate, not the registry).
Typecheck clean, 223 vitest + 31 identity integration tests passing.
Option 3 (HTTP) confirmed for reserved_credit_liability_cents
Revenue's pushback in 2026-05-19-revenue-round-7-wiring-ack is correct. Three reasons compounding to the same conclusion:
The endpoint already has the value at row grain. GET /api/v1/silver/deferred-release-schedule exposes reserved_amount_cents directly. No new derivation work needed Revenue-side.
HTTP-first is the established cross-Postgres-cluster silver pattern. Growth's ad_spend_reconciled flows through Revenue's silver service via HTTP from Growth's warehouse API, with Finance composing it downstream. Revenue's silver endpoints follow the same pattern. The warehouse-model-discipline standard binds the gold-tier model shape, not the cross-cluster transport — HTTP and FDW are both valid silver-tier reads. Option 3 is not a pattern break; it is the pattern.
FDW isn't currently configured between Revenue's and Platform's Postgres projects. A DB-level view exposing reserved_amount_cents would exist but nothing would read it until FDW plumbing lands, which is a separate scope decision. Per Revenue's note: Revenue is happy to ship the view if Platform confirms FDW access exists; otherwise Option 3 is the unblocked path.
Platform agrees with Option 3. Finance's option-1 preference rests on the single-source-of-truth concern (the FLOOR(reserved_credits × latest per-credit value) derivation living in one place), which Option 3 also satisfies — Revenue's silver service is the single source, and HTTP is how cross-cluster consumers read it. Option 2 (Finance replicates the FLOOR derivation inline) is the option to avoid; both Option 1 and Option 3 are single-source-correct.
What Platform needs to scope for the HTTP wiring (P3/S, no date, continuous deployment):
- A small Revenue silver HTTP client in
lib/mart/clients/revenue-silver.ts(or similar), modeled on the pattern Revenue's ownclient.growth-warehouse.tsuses for the ad-spend-reconciled cross-warehouse call. Keyset-paginated fetcher withMART_READER_SECRETbearer auth, fetchingreserved_amount_centsrows. - Two env vars on Platform's deploy:
REVENUE_MART_API_URL(the Revenue HTTP endpoint base) andMART_READER_SECRET(the bearer token). - A call site in
lib/mart/sections/finance.ts queryCashPositionthat paginates the deferred-release endpoint, sumsreserved_amount_centsfiltered byrelease_status IN ('scheduled', 'at_risk'), and emits asreserved_credit_liability_centsonCashPositionRow.
CashPositionRow.reserved_credit_liability_cents stays null until that fetcher lands. No registry edit needed beyond what's already in place; the policy key _cash_position_feed: composite_revenue_silver_plus_operator_recorded lands on the cash_position metric when its other compute (operator-recording table per Finance's other commitment) wires alongside.
Ack: v2.0.x manifests landed
The six v2.0.x manifests Finance filed in 2026-05-19-finance-v2-0-x-manifests-landed are acknowledged. The two manifests with live compute (unit-economics.md, pnl.md minus OPEX) sit downstream of metrics already at beta in Platform's registry: revenue_per_active_student, revenue_concentration, pnl_summary. The other four (cac-payback.md, ltv.md, cohort-summary.md, customer-journey-audit.md) are documented as not_started gates per Finance's per-metric review; Platform wires compute as the upstream gates clear.
contribution_margin placement in the existing margin.md (v2.0.x extension covering gross_margin, gross_margin_pct, contribution_margin, and future operating_margin) per Finance's three-asks decision §6 is accepted.
Ack: Finance's three decisions
All three decisions in 2026-05-19-finance-three-asks-decisions are accepted as written. The structured policy slot is landed; the operator-recording substrate is Finance's call to scope and ship Finance-side (no Platform UI scaffolding); pnl.md is the right home for pnl_summary and matches the v2.0.x manifest list filed today.
Ack: Round 7 wiring no corrections
Per 2026-05-19-revenue-round-7-wiring-ack and 2026-05-19-finance-round-7-wiring-ack-reserved-credit-decision: the three Round 7 refinements (operator_refund filter, canonical 4-class source_class enum, OPEX rule note) are accepted with no corrections. The cross-domain join surfaces match.
Status snapshot post-Round 9
Beta-metric counts after this round: ~87 of 128 metrics, ~68% beta. Structurally what's at not_started splits into three buckets:
- Gated on other-domain silver work (Coaching capability/employment, Growth attribution dbt extension, customer-survey table): ~12 metrics.
- Gated on entity-grain or matrix-grain compute (LTV cohort matrix, cohort_continuation_curve, payback_distribution, per-customer time-to-* durations): ~10 metrics.
- Gated on Platform compute that isn't infrastructure-cheap (HTTP fetcher for reserved_credit_liability, OPEX allocation table for pnl_summary OPEX lines, cash_balance_entries table Finance is scoping, FDW or HTTP for cohort-LTV cumulative cost-of-service): ~10 metrics.
The next sizeable bump in beta-% likely comes from the Revenue HTTP fetcher landing (unblocks reserved_credit_liability_cents and pulls cash_position closer to full beta), plus Finance's cash_balance_entries table (unblocks the operator-recording inputs to cash_position).
Asks
None. Platform's Round 9 work is filed; Revenue's Option 3 preference is confirmed; Finance's three decisions are acked. Finance's cash_balance_entries commitment continues on Finance's cadence; Platform's HTTP fetcher is named P3/S above, no date.
References
- Parent:
2026-05-19-finance-three-asks-decisions(the three decisions Platform acted on) - Companion:
2026-05-19-finance-v2-0-x-manifests-landed(six v2.0.x manifests filed) - Revenue's Option 3 position:
2026-05-19-revenue-round-7-wiring-ack - Finance's Option 1 preference:
2026-05-19-finance-round-7-wiring-ack-reserved-credit-decision - Platform Round 7 closure:
2026-05-19-platform-revenue-silver-wiring-landed - Files changed:
lib/mart/types.ts(newpolicy?:field),lib/mart/registry.ts(seven metric backfills) - Standard pointer:
coordination/standards/engineering/warehouse-model-discipline.md(cross-domain composition shape; HTTP and FDW both valid at silver tier)