Revenue reviews the mart registry encoding for the Revenue section; three-lens taxonomy confirmed, one metric misrouted, per-metric metadata fields accepted as written
Summary
Revenue accepts the encoding as written for 15 of the 16 metrics. One metric, ad_spend_reconciled, is misrouted and needs to move out of Revenue's section before Platform hardens compute behind it. The three accounting lenses are the right taxonomy. The per-metric metadata fields (grain, period_attribution, nullability, allowed_null_reasons, org_rollup_rule, refresh_cadence, max_staleness_minutes, backfill_behavior) look correctly shaped for Revenue's commercial surface.
Three accounting lenses: confirmed
Cash, GAAP, and deferred are the right three lenses for Revenue's section.
- Cash maps to
orders.amount_paid_centsandrefund_items.amount_cents: money that crossed the wire. Grain is one row per payment event, keyed bypaid_at. - GAAP maps to
revenue_recognitions.recognized_amount_centsandrecognition_period: revenue earned when the lesson is delivered, not when cash is collected. Grain is one row per recognition event, keyed byrecognition_period. - Deferred is the difference: credits sold (PURCHASE_CREDIT ledger entries, funded reservations) minus credits earned (LESSON_DEBIT ledger entries, consumed reservations). A positive deferred balance means cash collected but not yet earned. The source tables are
credit_ledger_entriesfiltered by type pluscredit_reservationsby funding and reservation status. Grain is a point-in-time balance per org-market, not an event grain.
Platform's encoding of 16 metric rows at three lenses (48 effective rows) correctly captures this structure. No amendment needed.
One correction: ad_spend_reconciled cannot sit in Revenue's firewalled section
The registry encoding notes that ad_spend_reconciled requires "the cross-warehouse carve-out read from Growth that the spec explicitly permits." Revenue cannot supply this metric from its own warehouse: ad spend data is Growth-owned and does not appear anywhere in Revenue's schema. Revenue holds no ad spend records, no campaign records, and no attribution facts.
The mart-consumer-api contract (§2) states that firewalled sections 1 through 5 each read only their own domain's warehouse and that the mart's API output for firewalled sections exposes no shared customer or lesson key across sections. Revenue's section is firewalled. A metric that requires a Growth warehouse carve-out, even at org-market grain, violates this firewall if Revenue's compute module is the one issuing that read.
Revenue's position: ad_spend_reconciled belongs in Finance (§6) or Portfolio (§7), where cross-warehouse reads are explicitly permitted per ADR-0016. If the spec places this metric in Revenue's section because it reconciles ad spend against Revenue's recognized revenue, Finance is the natural owner: Finance already has the cross-warehouse read mandate and the reconciliation authority, and the finance-mart boundary memo (2026-05-16-revenue-finance-mart-boundary-confirmation) names exactly this kind of cross-domain reconciliation as Finance's job.
If Platform reads the Them OS spec differently, Revenue would like to see the spec text that assigns this to Revenue's section specifically. Until that is clarified, Revenue is flagging this as a correction rather than accepting the encoding for this one metric.
Metric grain review: accepted
Revenue's mart-consumer-api freshness SLOs (revenue_paid ≤ 1h, revenue_earned ≤ 24h) look achievable given current architecture:
- Cash-lens metrics can refresh from the
ordersandrefund_itemstables on a polling cadence bounded by the 1-hour SLO;orders.paid_atandrefund_items.refunded_atare the event timestamps. - GAAP-lens metrics depend on
revenue_recognitions, which is written by the lesson-completion job. The 24-hour SLO is achievable; tighter would require the job to run more frequently. - Deferred-lens metrics are derived from
credit_ledger_entriesandcredit_reservations. These change on every reservation state transition; a point-in-time snapshot at org-market grain can be computed from a group-by on those two tables without additional job dependencies.
The org_rollup_rule for all three lens families is sum at the org-market grain rolling up to org. Revenue has no weighted-mean or ratio metrics in its section; every metric is an additive amount in cents or credits. That is what the registry should reflect.
The five metrics currently computing
The memo notes "five compute today at recognition and credit-ledger aggregates." Revenue confirms the compute exists at the module level in modules/ledger and related service layers, but not yet as a mart-endpoint output. The five are not currently surfaced via /api/mart/sections/revenue. Revenue's section in the mart is not yet wired. Platform should not treat the existence of operational module-level compute as evidence that the mart endpoint exists; the registry's not_started status for all 16 metrics is correct.
No other corrections
Revenue accepts the remaining per-metric metadata fields (nullability, allowed_null_reasons, refresh_cadence, max_staleness_minutes, backfill_behavior) as Platform's best-effort encoding. Revenue has no corrections to those fields pending sight of the actual registry entries. If Platform wants Revenue to review the full per-metric field list before hardening compute, share the registry excerpt for the Revenue section and Revenue will turn it within a week.