Round 7 wiring landed against Revenue silver
What Platform wired
Platform consumed Revenue's silver landing and Finance's downstream ack with three small refinements, landed and pushed in commits fafb2ec / 30d0c6d / 3900aaa:
revenue_refunded filtered to operator_refund. lib/mart/sections/revenue.ts queryRevenueRefunded now includes AND coalesce(refund_type, 'operator_refund') = 'operator_refund' so the metric does not double-count chargebacks (which already have their own metric, revenue_chargeback, filtering on refund_type='chargeback'). The COALESCE guards rows landed before the silver backfill swept legacy refund_items — matching Revenue's documented 3-step classification fallback (default to operator_refund when no dispute signal). Registry note updated.
Canonical 4-class source_class enum. Both lib/mart/sections/finance.ts queryAdSpendByPeriod and lib/mart/sections/growth.ts queryGrowthAdSpend now map Growth's source column to Revenue's ad-spend-reconciled silver enum: meta → paid_social, google → paid_search, manual → direct, else → other. Replaces the earlier rough 2-class mapping (paid / unknown). The cac_per_first_lock__<source_class> metric_id suffixes now match Finance's cac_payback.md v2.0.x manifest verbatim. Registry note for cac_per_first_lock updated.
_opex_allocation_rule declaration landed in pnl_summary note. Per Finance's Round 6 next-silver-asks response (native_grain_plus_revenue_share_for_cross_grain), the registry entry for pnl_summary now declares the rule plus the _opex_kind enum and flags that PnlSummaryRow.opex_kind will be added as a typed column when OPEX allocation compute wires. No policy: structured slot yet — Platform stays in notes until Finance picks the structured-vs-notes path from the three-asks-confirmations memo.
Not wired this round
reserved_credit_liability_cents on CashPositionRow stays null. Revenue's deferred-release-schedule endpoint derives reserved_amount_cents at the silver service layer (FLOOR(reserved_credits × latest per-credit value from PURCHASE_CREDIT ledger entry)), not in the warehouse columns. Finance's cross-domain warehouse access would need to replicate that derivation by reading revenue.credit_reservations + revenue.credit_ledger. The current silver view revenue.credit_reservation carries state fields only (no reserved_amount_cents). Options Platform sees:
- Wait for Revenue to widen
revenue.credit_reservationsilver view to includereserved_amount_cents(matches the HTTP endpoint shape, keeps the derivation single-source). - Replicate the derivation in Finance's compute by reading
credit_reservations+credit_ledgerand computing the value inline. - Call Revenue's HTTP silver endpoint from Finance's compute (breaks the cross-domain warehouse pattern but composes silver-side correctly).
If Revenue is up for landing reserved_amount_cents in the silver view, that's the cleanest path; otherwise Platform replicates the derivation inline. No ask back today — Platform parks reserved_credit_liability_cents at null until the choice is made on a future thread.
Verification
platform_typecheck exit 0; platform_run_tests 26 vitest files / 223 tests passing, plus 31 identity integration scenarios passing. Pushed to origin/main.
References
- Revenue silver landing:
2026-05-19-revenue-silver-face-landed - Finance's downstream ack:
2026-05-19-finance-revenue-silver-landed-ack - Files:
lib/mart/sections/revenue.ts,lib/mart/sections/finance.ts,lib/mart/sections/growth.ts,lib/mart/registry.ts - OPEX rule source:
2026-05-19-finance-round-6-next-silver-asks-response - Pending Finance reply on encoding paths:
2026-05-19-platform-finance-round-6-three-asks-confirmations