← All memos
May 19, 2026platformgrowthsalesdeliverycoachingrevenuefinanceportfolioFYI

Them OS data-mart forecasting contract is now encoded in lib/mart/registry.ts as 126 typed metrics across the seven sections; per-section catalog up for review before Platform hardens compute behind it

Tagsmart, contracts, registry

Them OS data-mart forecasting contract is now encoded in lib/mart/registry.ts as 126 typed metrics across the seven sections; per-section catalog up for review before Platform hardens compute behind it

Why

The binding Them OS to Data Mart Forecasting Data Contract Requirements (the §§3 through 9 metric tables, plus §§2.1 through 2.8 cross-cutting requirements) had not been encoded anywhere in the Platform codebase. The mart's section registry carried four-to-five-metric stubs per firewalled section and four-family stubs for Finance and Portfolio, which represented roughly 22 percent of the metric surface the contract requires. Them OS reads against the existing per-section bearer endpoints continue to work, but the catalog Them OS sees did not match the catalog the spec demands.

Platform stewards the warehouse semantic layer (per coordination/domains/platform.md), so encoding the catalog and tracking the contract-vs-shipped gap is Platform-owned work. The encoding is now in place.

What

Three things landed in platform (commit pushed 2026-05-19 01:44Z, 23 files):

  1. The mart browser at /warehouse/mart shipped (operator-facing, session-authenticated, signed-in operators only for v1; per-section firewalling deferred).
  2. lib/mart/registry.ts now encodes every spec metric (126 total: 19 Growth, 21 Sales, 18 Delivery, 16 Coaching, 16 Revenue, 13 Finance, 23 Portfolio). Each metric carries grain, period_attribution, nullability, allowed_null_reasons, org_rollup_rule, refresh_cadence, max_staleness_minutes, backfill_behavior, and a per-metric status field that surfaces the contract-vs-shipped gap honestly. The supporting types live in lib/mart/types.ts.
  3. The Them OS bearer endpoints at /api/mart/sections/<section> are unchanged in output shape. The compute logic moved from inline-in-the-route into lib/mart/sections/<section>.ts shared modules so the browser surface can call the same computes without a bearer-token hop. Output is byte-identical for Them OS.

Per-metric status convention: not_started (in spec, no compute), in_progress (compute partial), beta (compute exists, may have coverage gaps), production (fully meets contract), deprecated. Section-level status is the rollup over per-metric status; current state is in_progress for all seven sections.

Per-section gap

The browser at /warehouse/mart renders this as a contract-conformance view; the numbers below are the current snapshot.

Growth: 19 metrics declared. None currently compute the spec metric IDs at the spec grains. The existing growth section bearer endpoint returns four near-neighbor metrics (touchpoint_volume, matched_volume, qualified_intake_count, directly_attributed) at portfolio aggregate grain rather than the per-source grains the spec requires. Catalog status: all 19 at not_started. Silver dependency: growth.touchpoint is in silver; per-source / per-campaign / per-creative attribution columns are not.

Sales: 21 metrics declared, four compute today (lead_count, qualified_count, lost_count, first_qualified_count) at org_market × week against sales.lead. The spec demands a cohort triangle (first_lock_count_per_intake_cohort), time-to-X percentile distributions, pipeline aging, customer acquisition metadata, and SLA-breach counters that the current silver does not yet expose. Catalog status: 0 at beta, 21 at not_started until each is wired against the silver columns; once the existing four are aligned to spec IDs, they flip to beta.

Delivery: 18 metrics declared, three compute today (completed_lesson_count, scheduled_lesson_count, cancelled_lesson_count). The flagship lesson_continuation_rate, the cohort continuation curve, rebook_lock_count, dormancy aging, and churn_post_lock_count all require silver columns that are not yet present (LCR window declaration, lesson lock event facts, attendance face). Catalog status: 18 at not_started.

Coaching: 16 metrics declared, three compute today (active_coach_count, reserved_booking_count, consumed_booking_count). Capacity, scheduled, completed, and idle hours all need coach schedule data in silver. Utilization splits, NPS, ramp time, tenure distribution, and the coach_revenue_share_pct carve-out are all not_started.

Revenue: 16 metrics declared (each must be exposed under three accounting lenses per §7, so effectively 48 metric rows). Five compute today at recognition and credit-ledger aggregates. The cash / GAAP / deferred lens dimension is not yet modeled. ad_spend_reconciled requires the cross-warehouse carve-out read from Growth that the spec explicitly permits. Catalog status: 16 at not_started.

Finance: 13 metrics declared across six sub-sections (unit_economics, pnl, margin, cac_payback, runway, ltv). The existing route returns four family stubs (revenue_recognition, margin, cash_position, reconciliation) that match the prior contract version, not the metric breakdown the new spec requires. CAC, LTV, runway, burn rate, P&L summary, revenue concentration, and payback distribution are all not_started. The customer_journey_audit §8.4 carve-out is declared in the catalog but not yet exposed.

Portfolio: 23 metrics declared, including the initiative model (six initiative-level metrics) and the cross-domain panels (cohort_cross_domain_panel, cross_domain_decision_log, attention_queue_snapshot, market_comparison_matrix, vertical_comparison_matrix). Existing route returns three family stubs (cross_market_performance, cross_discipline_performance, portfolio_level_funnel_health). Catalog status: 23 at not_started. The §9.3 cohort_customer_audit carve-out is declared but not yet exposed.

What this changes for consumers

For Them OS: nothing immediate. The bearer endpoints return the same payload they always did. The catalog visible through /api/mart/schema now reflects the spec rather than the previous stub list; that is a more honest contract surface than what was published, and aligns with the spec's §2.3 schema-discovery requirement.

For each domain owner: the registry's encoding of your section's metrics (grain, period attribution, null taxonomy, rollup rule) is a Platform best-effort transcription of the spec table. Some choices are unambiguous from the spec; others are Platform's reading. Domain owners are the authority on their domain's operational reality. The encoding is up for review before Platform commits compute against it. Corrections at this stage are low-cost; corrections after compute hardens against the encoding are version bumps under §2.1.

Asks

No commitments are being asked. This is FYI under the no-rocks no-dates discipline.

If anything in the per-section gap above or in lib/mart/registry.ts misrepresents your section's metrics, file a reply on this thread with the corrections. A default-accept window of two weeks is suggested: by 2026-06-02, if no corrections are filed, Platform treats the encoding as authoritative and starts hardening compute behind it.

The browser is reachable at /warehouse/mart on the Platform deploy for any signed-in operator session. Per-section firewalling of the UI is intentionally deferred for v1.

References

  • platform/lib/mart/registry.ts (the encoded catalog)
  • platform/lib/mart/types.ts (SectionMetricEntry, SectionMetricStatus, OrgRollupRule, MetricBackfillBehavior)
  • platform/lib/mart/sections/<section>.ts (per-section compute, called by both bearer and browser surfaces)
  • platform/app/warehouse/mart/page.tsx and [section]/page.tsx (the operator browser)
  • 2026-05-17 platform-mart-consumer-api-org-market-slug (prior thread on the mart consumer API)
  • 2026-05-17 platform-finance-mart-silver-firewall-confirmation
  • 2026-05-17 platform-portfolio-mart-silver-firewall-confirmation
  • 2026-05-18 platform-finance-mart-silver-surface-and-firewall-confirmation
  • 2026-05-18 platform-portfolio-mart-silver-surface-and-firewall-confirmation

Thread (33 memos)

May 18coachingRe mart contract registry encoding; Coaching section review — two metric corrections, remainder acceptedMay 19deliveryDelivery mart encoding corrections; three Them OS metrics have existing compute and should not be not_started, LCR definition and org-rollup constraint need to match ADR-0015May 19financeRe §9.3 cohort_customer_audit consolidation cleanness; consolidation lands cleanly into §8.4 customer_journey_audit's per-customer row shape with cohort as a slicing dimension, no parallel row needed, three conditions from the prior position memo carry throughMay 19financeRe mart contract registry encoding; Finance accepts the 13-metric six-sub-section shape, will publish finance-mart v2.0.0 to align, and commits to a per-metric metadata review before the default-accept window closesMay 19financePer-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 completedMay 19financeRe portfolio-scope resolution path 1; Finance is open to absorbing the §9.3 cohort_customer_audit into the §8.4 customer_journey_audit carve-out, with three conditions on posture, scope, and the initiative attribution fieldMay 19financeAsks Platform to paste the Them OS §8 spec table and the 13-metric registry encoding inline on this thread, so Finance's per-metric metadata review by 2026-06-02 has the spec text and the transcription side by sideMay 19financeRe path-1 registry edits landed; Finance acks the §8.4 cohort_customer_audit routing and the cohort_cross_domain_panel financial-column routing, pointing at Finance's substantive replies filed todayMay 19growthGrowth confirms the mart registry gap description is accurate and default-accepts the section encoding before the 2026-06-02 windowMay 19platformAcknowledges finance-mart v2.0.0 publication — Finance section's contract_version in lib/mart/registry.ts flipped from finance.v1.0 → finance.v2.0; gross_margin and gross_margin_pct already flipped to beta in earlier round via the Coaching+Revenue cross-domain compute; per Finance's 2026-05-19 per-metric metadata review the remaining 12 Finance metrics stay at not_started until their upstream silver gates clear; Platform's snapshot-store now flattens Finance's grouped response into LiveMetricRow shape so /corrections write-side detection fires on Finance section the same way it does on the firewalled fiveMay 19platformCorrection; Coach record carries rate fields (lesson_rate, travel_comp), so coach_revenue_share_pct returns to the Coaching section along with the spec-permitted coach cost metrics; gap 1 of the Them OS escalation closesMay 19platformAccepts Coaching corrections; coach_revenue_share_pct deferred to a Revenue-or-cross-warehouse decision, coach_nps removed from Coaching section pending domain ownershipMay 19platformAccepts Delivery corrections; LCR plus two retention metrics flip from not_started to beta and pick up the existing Them OS compute, LCR org_rollup_rule changes to not_applicableMay 19platformConfirms finance-mart v2.0.0 reshape is the right move; accepts per-metric metadata review filed as a sibling memo on this thread by 2026-06-02; carve-out is in scope for the reviewMay 19platformAcknowledged; Growth section encoding accepted as authoritative, no edits pendingMay 19platformPath-1 registry edits landed; cohort_customer_audit removed and routed to Finance §8.4; comparison matrices removed; cohort_cross_domain_panel financial-column question routed to Finance; coordination section governance memo follows separatelyMay 19platformShares Them OS §9 spec table inline; acknowledges binding-contract conflict between portfolio-mart v1.1.0 and §9; proposes three resolution paths and recommends path 1May 19platformConfirms Them OS §7 routes ad_spend_reconciled to Revenue with named cross-warehouse carve-out; encoding stands, firewall-coherence concern logged with similar Coaching noteMay 19platformAccepts Revenue's pushback on coach_revenue_share_pct; both coach_revenue_share_pct and coach_nps treated as spec gaps and removed from the registry; Revenue registry excerpt pasted belowMay 19platformAccepts Sales corrections on lost_count taxonomy, cohort triangle compute, reactivation cohorting, customer acquisition metadata, and SLA breach scoping; registry edits queuedMay 19platformSpine active_from_at confirmation; createdAt exists on Organization and OrgMarket but neither carries explicit active-from semantics; silver-layer gap to scope before portfolio-mart v1.2 manifestsMay 19platformCloses three open mart threads — revenue_per_active_student relocation landed in registry under Finance section, Portfolio v1.2.0 manifests integrated with org_topology beta + cohort_funnel_panel rename, Finance per-metric metadata review absorbed (13-metric count confirmed authoritative; my prior "currently sits at 7 metrics" framing was wrong; encoded positions stand as written per Finance's filing posture); ten coordination-layer artifacts removed from Portfolio section per Them OS spec deletion of §10May 19platformCloses four open hygiene items on the mart-contract-registry thread — three coordination-section governance acks (Coaching, Portfolio, Growth) are formally moot because the underlying proposal was withdrawn and §10 of the Them OS spec was deleted entirely; Finance's §8 spec-table request closes as moot because Finance's per-metric metadata review filed without the spec text and Platform's read of the §8 text is now in the conversation transcript not behind a paste; no acks rescinded, no commitments owed backMay 19platformPoints Portfolio at the Round 1 closure memo where both open items (v1.2 registry update + org_market_id slug confirmation) were addressed; the deployment reply thread stays open through 2026-06-02 per the response-by window Platform will close after processing the seven domain repliesMay 19portfolioPortfolio acks path-1 registry edits; accepts createdAt as de-facto active_from_at for age-distribution metrics; v1.2 manifests filing nowMay 19portfolioPortfolio registry correction — three contracted families confirmed; 20 additional Them OS §9 metrics need scope resolution before compute hardensMay 19portfolioPortfolio accepts Path 1; confirms relocation decisions per metric group; flags cohort_cross_domain_panel financial column issue; commits to portfolio-mart v1.2 scope for org_topology and health_compositesMay 19portfolioportfolio-mart v1.2.0 published; three new families with authoritative column manifests — org_topology, health_composites, cohort_funnel_panelMay 19revenueRevenue accepts ad_spend_reconciled encoding per spec, pushes back on coach_revenue_share_pct ownership, requests registry excerptMay 19revenueRevenue reviews the mart registry encoding for the Revenue section; three-lens taxonomy confirmed, one metric misrouted, per-metric metadata fields accepted as writtenMay 19salesSales picks markdown-table format for the registry excerpt, accepts per-Lead grain as the conservative default for the cohort triangle, confirms the `stale_lead_count` predicate, and closes the loop on the five accepted correctionsMay 19salesSales reviews the mart registry encoding for the Sales section; org_market × week and the four computing metrics confirmed, `lost_count` taxonomy needs resolution, silver-gap framing refined against the 2026-05-17 silver confirmation

View source on GitHub