Re finance-mart contract v1.0.0; Platform confirms silver surface live and firewall bound wired; asks Finance to file per-figure column manifests for all four groupings
Confirmations
Silver surface
All five silver faces are live as of warehouse-silver v1.1.0:
growth.touchpoint— growth intake and enrollment grain;person_idresolved, spine-joinedsales.lead— sales lead grain;person_idresolved, spine-joineddelivery.lesson+delivery.attendance— lesson and attendance grain;person_idresolved, spine-joinedcoaching.coach+coaching.lesson_booking— coach and lesson booking grain;person_idresolved, spine-joinedrevenue.recognition+revenue.credit_ledger+revenue.order+revenue.credit_reservation— revenue event-log and transaction grain;person_idresolved, spine-joined
The identity and geography spine is live: Person dimension, Org → Market → Service Area → Lesson Site hierarchy, sourced from Platform's identity database. Every silver face joins to it for person_id and every gold section uses it for Market, Service Area, and Organization attributes.
Platform can confirm that the revenue, credit, and order tables in the revenue silver face carry the transaction-grain fields Finance needs for the revenue recognition and cash position groupings. Whether the silver faces carry the specific cost and margin columns finance-mart §4.4 composes from depends on what Finance's manifest targets — Platform's current silver faces are conformed from what each domain's Postgres schema carries. If cost-of-service figures live in a domain's source tables, they pass through silver; if they don't exist in source yet, silver won't manufacture them.
Platform cannot confirm column-level coverage for the four groupings until Finance files the per-figure column manifests. That is the blocker this reply surfaces.
Firewall bound
The consumer-firewall mechanism is live. lib/mart/auth.ts requireMartAuth enforces MART_API_KEY_FINANCE bearer auth on the finance section route using constant-time comparison. MART_API_KEY_FINANCE has been generated and is in Platform's local env; it goes to Vercel production alongside the other section keys. The finance consumer tag is scoped to the finance section route and no other.
Platform uses finance-mart v1.0.0 as the bound for the finance consumer tag. No mismatch between the contract-shaped bound and the firewall mechanism as built.
Finance section current state
The finance gold section is live at GET /api/mart/sections/finance and auth is enforced. All four groupings currently return null:upstream_unavailable — this is intentional. The derived finance store (the cross-domain aggregate models that compose over the silver faces) is not built. It is not built because Platform is waiting on Finance's per-figure column manifests before implementing the grouping models. The section will return populated data once those manifests land and Platform implements the store against the confirmed silver surface.
What Platform needs from Finance
Finance's next deliverable is per-figure column manifests for all four groupings, filed against the live silver face columns above. Specifically:
- Revenue recognition rollup (
finance-mart§4.3): which silver face columns compose into each recognized-revenue figure, the period grain and geography keys, and the roll-up dimension. - Margin (
finance-mart§4.4): which silver face columns compose into the revenue and cost figures that net to margin; this is the one where Platform is most uncertain whether cost columns exist in current silver source schemas. - Cash position (
finance-mart§4.5): which revenue silver face columns and/or credit ledger fields compose into cash held as of a reporting date. - Reconciliation (
finance-mart§4.6): the specific Revenue ledger concepts each reported figure ties to and the stated tolerance within which reconciliation holds.
Once Finance files the manifests, Platform will implement the derived store models and flip the groupings off null:upstream_unavailable. No date attached; this is the natural next step in the initiative sequence.
If Finance discovers any column it needs is absent from the live silver surface described above, file it as a gap in the manifest reply and Platform will assess whether it belongs in silver (source carries it, just not conformed yet) or whether it is net-new work (source does not carry it at all).
References
- Finance ask:
2026-05-14-finance-mart-contract - Silver faces:
contracts/warehouse-silver/README.md(v1.0.0); warehouse-silver v1.1.0 is the live tag - Finance section route:
platform/modules/mart/routes/finance.routes.ts - Firewall implementation:
platform/lib/mart/auth.ts - Initiative scope:
2026-05-14-platform-data-access-model-initiative-scope - ADR-0016:
coordination/adrs/ADR-0016-medallion-warehouse-data-access-model.md - ADR-0015: `coordination/adrs/ADR-0015-finance-and-portfolio-as-reporting-domains