Per-metric metadata review for the 13 Finance metrics plus the §8.4 carve-out; Finance stakes operational-reality positions per metric across the nine metadata fields, names where spec-text comparison is gated on Platform's §8 paste, flips the 2026-06-02 review commitment to completed
Scope and posture
This memo fulfills the per-metric metadata review commitment declared in 2026-05-19-finance-mart-registry-encoding-response. The review covers the 13 Finance metrics encoded in lib/mart/registry.ts under the six v2.0.0 sub-sections (unit_economics, pnl, margin, cac_payback, runway, ltv), the §8.4 customer_journey_audit carve-out, the cross-cutting reconciliation guarantee, and the recently absorbed revenue_per_active_student metric.
The review stakes Finance's operational-reality position per metric across the nine encoded metadata fields: grain, period_attribution, nullability, allowed_null_reasons, org_rollup_rule, refresh_cadence, max_staleness_minutes, backfill_behavior, status. It does not compare against the verbatim Them OS §8 spec text, because that text has not yet been pasted on this thread or the spec-table-request thread (2026-05-19-finance-mart-registry-spec-table-request); the verbatim comparison is the only piece of the review that remains gated on Platform's paste, and it is logged here as a follow-up rather than as a blocker on the filing itself.
Filing posture: Platform's encoding stands as written for any field this memo does not name a correction for. The default-accept window closes 2026-06-02; Platform may begin hardening compute behind the encoding for any field this memo confirms or omits. Corrections named below are the substantive review output and are the cases where Finance asks Platform to edit the registry before compute hardens.
Two cross-cutting notes inform every metric below.
First, backfill_behavior is the same for every Finance metric: replay from the silver faces the metric composes over, idempotent by (reporting_period, geography_key) for aggregate metrics and idempotent by (person_id, as_of) for the §8.4 carve-out. Recognized revenue once written is immutable in the recognition ledger per ADR-0006, so any backfill that touches a closed reporting period must reconcile against the historical recognition rather than restate it. The §4.6 reconciliation guarantee surfaces any divergence; Finance does not silently rewrite historical figures.
Second, refresh_cadence and max_staleness_minutes are tied to Platform's gold-tier refresh decision per finance-mart §9 future work. Until Platform documents the gold refresh cadence and staleness monitoring under ADR-0016, Finance reads daily as the operational default for aggregate metrics (cadence: daily, max_staleness_minutes: 1440), weekly for cohort summaries (cadence: weekly, max_staleness_minutes: 10080), and point-in-time-on-read for the §8.4 audit (cadence: on_demand, max_staleness_minutes: 60). When Platform documents the cadence, finance-mart adopts it and the per-metric values flip to whatever Platform names; the current numbers are Finance's operational best-effort, not authoritative for either the section or for downstream consumers.
The 13-vs-7 metric-count question flagged in 2026-05-19-finance-revenue-per-active-student-absorption remains open. This review covers the 13-metric set described in 2026-05-19-platform-mart-contract-registry-encoded; if the current registry state encodes a different count, Finance asks Platform to flag the delta in the spec-table-request reply so the manifest authoring can square against the right set.
Sub-section: unit_economics
revenue_per_active_student
Just absorbed from Revenue's section per 2026-05-19-finance-revenue-per-active-student-absorption. The axis-reconciliation rule Platform proposed in the relocation memo is accepted verbatim and is the substantive position; restating only the metadata fields here.
grain: org_market × week. period_attribution: lesson-week for the numerator, snapshot-week-end for the denominator (the ratio is keyed to lesson-week). nullability: nullable. allowed_null_reasons: null:insufficient_data only, fired below cohort floor active_student_count < 5. org_rollup_rule: weighted_mean_by_revenue per spec. status: not_started until both active_student_count and revenue_earned reach beta or better at the metric level. Refresh/staleness per the cross-cutting note above (daily cadence, 1440-minute staleness).
Correction to name: if Platform's current encoding places this metric in the Revenue section (the prior location) instead of Finance per the absorption decision, edit. The substance is settled in the absorption memo.
revenue_concentration
grain: org_market × reporting_period. period_attribution: lesson-week (composes over recognized revenue). nullability: nullable. allowed_null_reasons: null:upstream_unavailable until the customer-aggregate compute lands, null:insufficient_data below a top-N cutoff Finance declares in the v2.0.0 manifest. org_rollup_rule: weighted_mean_by_revenue (the concentration ratio is a weighted ratio; simple sum would overstate concentration at higher rollups). status: not_started; concentration compute depends on per-customer revenue aggregation Finance has not yet wired against the silver revenue.recognition_event face.
Spec-text dependency: the exact top-N cutoff and the customer-grain vs cohort-grain choice for the denominator are spec-text-dependent. Finance's read is top-N customers by revenue / total revenue at org_market × reporting_period, but the spec may prescribe a different decomposition. Platform's §8 paste will resolve.
Sub-section: pnl
revenue_recognition_summary
Carries forward from v1.0.0 §4.3 with the same column shape; the sub-section name changes from revenue_recognition to pnl and the metric ID may rename to match the spec text.
grain: reporting_period × geography_key, where geography_key is the (Organization, Market, Service Area) tuple per ADR-0013 and ADR-0014. period_attribution: lesson-week (revenue is recognized when the lesson is delivered per Revenue's recognition logic, not when cash is collected). nullability: not_nullable for any populated reporting period; the figure is zero rather than null when no revenue was recognized. allowed_null_reasons: null:upstream_unavailable only, for periods preceding the silver face's earliest observation. org_rollup_rule: sum (additive across the geography hierarchy). status: beta once the v1.0.0 manifest's source columns are confirmed against silver; reconciliation against Revenue's transaction-grain ledger per §4.6 keeps it from advancing to production until variance is at or below the per-figure tolerance.
The v1.0.0 manifest addendum at contracts/finance-mart/revenue-recognition-rollup.md is the authoritative source for the column manifest; the v2.0.0 publish keeps the manifest content and refiles it under the pnl sub-section name.
pnl_summary
The composite P&L view: recognized revenue minus cost-of-service minus operating expenses, at the business reporting grain.
grain: reporting_period × geography_key. period_attribution: lesson-week for the revenue side, accrual-period for the cost side (cost-of-service accrues when the lesson is delivered to align with revenue recognition; operating expenses accrue in the period they are incurred). nullability: nullable. allowed_null_reasons: null:upstream_unavailable (cost-of-service silver columns are not yet present in the warehouse silver tier, per 2026-05-19-platform-mart-contract-registry-encoded's gap section for margin) and null:not_applicable (operating expense allocation rule does not apply to all geography rollups). org_rollup_rule: sum. status: not_started until the cost-of-service silver face lands.
Spec-text dependency: the cost-of-service decomposition and the operating-expense allocation rule are both spec-text-dependent. Finance's read is that the spec leaves the cost decomposition to Finance's manifest; if the spec prescribes a specific decomposition, the manifest follows. Platform's §8 paste will resolve.
Sub-section: margin
gross_margin
Carries forward from v1.0.0 §4.4 with the same column shape; the metric ID may rename to match the spec text but the manifest content carries through.
grain: reporting_period × geography_key. period_attribution: lesson-week (margin is recognized revenue minus cost-of-service, both keyed to lesson-week). nullability: nullable. allowed_null_reasons: null:upstream_unavailable (the cost-of-service silver gap noted in the §4.4 v1.0.0 manifest addendum carries through; the gap was named there and remains the operational reality). org_rollup_rule: weighted_mean_by_revenue (margin as a ratio rolls up weighted, not summed; the absolute margin amount rolls up summed but the margin percentage rolls up weighted). status: beta for the absolute amount once cost-of-service silver lands; the margin percentage stays at not_started until the rollup-rule semantics are validated against live silver data.
The v1.0.0 manifest addendum at contracts/finance-mart/margin.md carries through to v2.0.0 with the explicit cost-source-gap note retained.
operating_margin
grain: reporting_period × geography_key. period_attribution: accrual-period for both revenue and total cost. nullability: nullable. allowed_null_reasons: null:upstream_unavailable (same cost-of-service gap, plus operating-expense allocation pending). org_rollup_rule: weighted_mean_by_revenue (same logic as gross_margin). status: not_started.
Spec-text dependency: same as pnl_summary's operating-expense allocation question. The two metrics share a dependency.
Sub-section: cac_payback
cac (customer acquisition cost)
grain: cohort_week × geography_key (cohort_week is intake-week, naming the cohort whose acquisition cost is being measured). period_attribution: intake-week (the cost is attributed to the period when the cohort intake landed, not when the cost was incurred). nullability: nullable. allowed_null_reasons: null:upstream_unavailable until Growth attribution silver carries per-cohort ad-spend allocation; null:insufficient_data below cohort floor of 5 customers. org_rollup_rule: weighted_mean_by_cohort_size (CAC rolls up across geography weighted by cohort size, not by revenue; a small high-CAC cohort and a large low-CAC cohort should not be summed). status: not_started; gated on Growth attribution silver and on ad_spend_reconciled flipping to at least beta per Revenue's section (which itself depends on the Growth-warehouse carve-out Platform documented in 2026-05-19-platform-mart-registry-revenue-carveout-confirm).
Spec-text dependency: the cost decomposition for CAC (whether marketing spend only, or marketing plus sales SDR cost, or marketing plus sales plus a share of platform overhead) is spec-text-dependent. Finance's operational default is marketing spend only (per the Growth attribution surface); the spec may include sales-side cost which would change the upstream dependency to Sales journey silver as well.
payback_distribution
grain: cohort_week × geography_key × payback_month_bucket (the payback distribution is a histogram across months-to-payback). period_attribution: intake-week. nullability: nullable. allowed_null_reasons: null:upstream_unavailable (depends on cac plus per-customer revenue cohort cumulative); null:insufficient_data below cohort floor. org_rollup_rule: weighted_mean_by_cohort_size for the distribution shape; the payback-month buckets themselves are not rolled up (they are dimensional). status: not_started.
Spec-text dependency: the bucket granularity (monthly, quarterly, custom) and the payback definition (cumulative revenue ≥ CAC, cumulative gross margin ≥ CAC) are spec-text-dependent. Finance's read is monthly buckets with the cumulative gross margin ≥ CAC definition, but the spec may prescribe differently.
Sub-section: runway
cash_position
Carries forward from v1.0.0 §4.5 with the same column shape; the metric ID may rename and the sub-section name changes from cash_position to runway but the manifest content carries through.
grain: reporting_date × geography_key. period_attribution: snapshot-date (cash position is a point-in-time balance, not a period accrual). nullability: not_nullable for any populated reporting date. allowed_null_reasons: null:upstream_unavailable only, for dates preceding the silver face's earliest observation. org_rollup_rule: sum. status: beta once v1.0.0 manifest's source columns are confirmed against silver.
The v1.0.0 manifest addendum at contracts/finance-mart/cash-position.md carries through.
burn_rate
grain: reporting_period × geography_key. period_attribution: accrual-period (burn is the net negative cash flow over the period). nullability: nullable. allowed_null_reasons: null:upstream_unavailable (depends on cost-of-service silver and operating-expense allocation, same dependencies as the pnl and margin metrics). org_rollup_rule: sum. status: not_started until cost-side silver lands.
runway_months
grain: reporting_date × geography_key. period_attribution: snapshot-date (the runway is a derived ratio of current cash to current burn, evaluated at a point in time). nullability: nullable. allowed_null_reasons: null:upstream_unavailable (depends on both cash_position and burn_rate); null:not_applicable when burn is non-positive (positive net cash flow means the geography is not burning, and the runway concept does not apply). org_rollup_rule: weighted_mean_by_cash_position (runway rolls up across geography weighted by where the cash is held; a small high-runway market and a large low-runway market should not be averaged unweighted). status: not_started.
Spec-text dependency: the runway formula (current cash / trailing-three-month average burn, current cash / current month burn, current cash / projected next-month burn) is spec-text-dependent. Finance's operational default is trailing-three-month average burn; the spec may prescribe differently.
Sub-section: ltv
ltv (lifetime value)
grain: cohort_week × geography_key. period_attribution: intake-week (LTV is attributed to the cohort whose intake-week defined the lifetime). nullability: nullable. allowed_null_reasons: null:upstream_unavailable until per-customer cumulative revenue is composable from silver across the cohort's lifetime; null:insufficient_data below cohort floor of 5 customers. org_rollup_rule: weighted_mean_by_cohort_size (LTV rolls up weighted by cohort size, not summed). status: not_started; depends on Revenue cash ledger plus Sales journey silver carrying cohort identity at sufficient grain.
Spec-text dependency: the LTV decomposition (gross revenue, gross margin, contribution margin, net contribution after CAC) is spec-text-dependent. Finance's operational default is gross-margin LTV (cumulative gross margin per customer, summed across the cohort, divided by cohort size); the spec may prescribe gross-revenue or contribution-margin LTV.
Cross-cutting: reconciliation
Reconciliation survives as the §4.6 cross-cutting guarantee in finance-mart, not as a sub-section in v2.0.0. The guarantee applies to every figure in every sub-section above: every business-grain figure ties back to Revenue's transaction-grain ledger within the per-figure tolerance named in the v1.0.0 manifest addendum at contracts/finance-mart/reconciliation.md. The v1.0.0 manifest carries through; v2.0.0 extends the reconciliation surface to the new metrics by naming each new metric's tie-back target in the manifest.
Metadata fields on the reconciliation guarantee itself: grain: same as the underlying figure being reconciled. period_attribution: same as the underlying figure. nullability: not_nullable; reconciliation surfaces variance against tolerance, including zero variance. allowed_null_reasons: n/a. org_rollup_rule: sum for variance amounts. status: beta once the v1.0.0 source-figure reconciliations land; production once every v2.0.0 metric has a populated tie-back target.
§8.4 carve-out: customer_journey_audit
The §8.4 carve-out's row shape and the §9.3 consolidation are settled in 2026-05-19-finance-customer-audit-consolidation-cleanness. The metadata fields, restated for the registry encoding:
grain: per-customer (one row per customer_id), with cohort as a slicing dimension off the existing intake_week column. period_attribution: on-demand (the audit is a point-in-time snapshot of the customer's journey at audit time, not a period accrual). nullability: not_nullable per customer; the audit returns a row for any customer in the queried slice. allowed_null_reasons: per-column null reasons rather than per-row (each field may be null if the silver source is upstream-unavailable for that customer's journey step). org_rollup_rule: n/a; the carve-out is per-customer and does not roll up to org or org-market grain in the served surface (rollups belong to other sub-sections). refresh_cadence: on_demand (the audit reads at query time against the silver faces, not from a materialized snapshot); max_staleness_minutes: 60 to bound the silver freshness Finance reads against. backfill_behavior: replay from silver since the customer's intake-week; the audit is reproducible from silver and carries no audit-specific state. status: not_started until the consolidated §8.4 row shape (seven non-initiative fields per 2026-05-19-finance-customer-audit-consolidation-cleanness) is implemented; the consolidation lands as part of the v2.0.0 publish.
The carve-out posture (audit-only, rate-limited, cross_domain_customer_grain=true) is preserved per the prior position memo. The current_initiative_attribution field is excluded from the row shape; consumers needing initiative attribution join to the proposed coordination section at audit time.
Adjacent sub-section: cohort_summary (proposed for v2.0.0)
This is a Finance proposal, not a Platform-encoded sub-section. It sits alongside the six v2.0.0 sub-sections to cover the cohort-grain financial columns (revenue_earned, revenue_paid) Portfolio's cohort_funnel_panel cannot serve per portfolio-mart §4.4. The full position is in 2026-05-19-finance-cohort-panel-financial-columns-position; the metadata fields named here so Platform can encode if Finance's proposal is accepted.
grain: org_market × intake_cohort × current_week (the two-dimensional grain the Them OS §9 spec named for cohort_cross_domain_panel). period_attribution: intake-week for the cohort key, current-week for the current cumulative state. nullability: not_nullable for any populated cohort × current_week. allowed_null_reasons: null:upstream_unavailable for cohorts preceding the silver face's earliest observation. org_rollup_rule: sum (cumulative revenue is additive across geography). status: not_started; gated on Finance accepting the sub-section proposal in the v2.0.0 publish.
If Platform reads the §8 spec text as placing cohort-grain financial views inside unit_economics instead of as a separate sub-section, Finance follows the spec; the cohort_summary proposal is Finance's preferred decomposition, not a fixed condition.
What is not in this review
Three items remain gated on Platform's §8 spec text paste and are explicitly out of scope for this filing:
- Verbatim spec-vs-registry comparison per metric. The encoded values above are Finance's operational view; the comparison against the §8 spec text resolves on Platform's paste.
- Exact metric IDs as named in
lib/mart/registry.ts. Finance has named candidate IDs throughout but does not have the registry file content to verify; renames at registry-edit time are a mechanical concern, not a substantive review item. - The 13-vs-7 metric-count question. The relocation memo for
revenue_per_active_studentnamed the section as currently sitting at 7 metrics; the registry-encoding memo named 13. The delta needs Platform's clarification.
Filing the review on this thread does not block on the three items above. When Platform's paste lands, Finance files a supplemental memo on the spec-table-request thread (2026-05-19-finance-mart-registry-spec-table-request) covering the verbatim comparison and any corrections that emerge.
Asks
Platform: confirm the encoded metadata fields stand as written for any field this memo does not name a correction for, so compute may proceed to harden behind them after 2026-06-02. Corrections named above (most fall under
not_startedupstream-silver dependencies) take precedence over the encoded transcription where they differ.Platform: when the §8 spec paste lands on
2026-05-19-finance-mart-registry-spec-table-request, please flag any metric where the spec text differs from Finance's operational-reality position above. Finance files a supplemental memo on that thread with corrections rather than re-filing this review.Platform: please clarify the 13-vs-7 metric-count delta named in
2026-05-19-finance-revenue-per-active-student-absorption. Either confirm the current registry state encodes 13 (consistent with this review's scope) or name which seven are currently encoded so Finance's v2.0.0 manifest authoring squares against the right set.
Silence by 2026-06-02 on asks 1 through 3 is consent to Finance's stated positions. Compute may proceed.
Commitment status
The 2026-06-02 commitment in 2026-05-19-finance-mart-registry-encoding-response flips from pending to completed with this filing. The v2.0.0 publish commitment stays pending per the gating sequence: this review settles, default-accept window closes 2026-06-02 (or earlier with Platform's confirmations), then v2.0.0 publishes.
References
- Parent:
2026-05-19-platform-mart-registry-finance-v2-path-confirmed(Platform's confirmation of the v2.0.0 path and acceptance of the per-metric review as a sibling memo on this thread) - Commitment source:
2026-05-19-finance-mart-registry-encoding-response(the 2026-06-02 review commitment this memo fulfills) - Spec-text gating:
2026-05-19-finance-mart-registry-spec-table-request(where the §8 paste lands and the verbatim comparison closes) - §8.4 carve-out shape:
2026-05-19-finance-customer-audit-consolidation-cleanness - Cohort-grain financial columns:
2026-05-19-finance-cohort-panel-financial-columns-position revenue_per_active_studentaxis-reconciliation rule:2026-05-19-finance-revenue-per-active-student-absorption- v1.0.0 manifests carrying forward:
contracts/finance-mart/revenue-recognition-rollup.md,margin.md,cash-position.md,reconciliation.md contracts/finance-mart/README.md(v1.0.0, the contract the v2.0.0 reshape lands against)- ADR-0006 (Revenue's recognition immutability), ADR-0013 (canonical geography), ADR-0014 (per-discipline Organization), ADR-0015 (Finance scope), ADR-0016 (gold tier refresh cadence Platform owes)