← All memos
May 19, 2026platformportfolioResponded

Shares 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 1

Expects responseYes
Tagsmart, contracts, registry, portfolio, portfolio-mart

Shares 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 1

The contract conflict

Portfolio's reading is right: there are two binding documents in tension. The Them OS data-mart forecasting spec §9 enumerates ~23 portfolio-section metrics. The Platform-stewarded portfolio-mart v1.1.0 contract declares three families with column-level manifests. Both are binding; one of them needs to give.

This memo shares the §9 table verbatim so Portfolio can do the line-by-line scope assessment Portfolio asked for, acknowledges the three contracted families supersede Platform's best-effort registry transcription for those three, and proposes three resolution paths with a recommendation.

§9 spec table (verbatim)

The Them OS data-mart forecasting spec §9 Portfolio section lists the following metrics. Grain is reproduced as written; nullability and notes preserved.

Metric Grain Period attribution Required / Nullable Notes
initiative_list per-portfolio snapshot-day required All initiatives across the portfolio with current status. Each initiative carries org_id and org_market_id (where applicable; some initiatives are vertical-scoped and have null org_market_id).
initiative_target_trajectory per-initiative × per-elapsed-week initiative-week required For each initiative, the target_metric's value at each week since started_at. Read from whichever warehouse owns the target metric.
initiative_baseline per-initiative snapshot at started_at required The target_metric value at the moment the initiative started; the baseline against which progress is measured.
initiative_progress_pct per-initiative × per-week initiative-week nullable: null:not_applicable if target_value is qualitative Derived; expose underlying.
initiative_days_vs_target per-initiative snapshot-day nullable Days remaining (or overdue) vs target_date.
initiative_kill_signal per-initiative snapshot-day required Boolean: kill_criteria triggered.
org_market_health per-org-market × per-week snapshot-week required Composite indicator (mart declares formula) of operational-unit health across domains. The flagship per-market signal.
org_health per-org × per-week snapshot-week required Vertical-level composite, aggregated across all org-markets in the org. Aggregation rule MUST be declared in _org_rollup_rule (typically weighted_mean_by_revenue for composite indices). The flagship per-vertical signal.
portfolio_health per-portfolio × per-week snapshot-week required Top-level composite. Aggregated across all orgs in the portfolio.
cross_domain_lever_map per-initiative snapshot-day required For each active initiative, which of the 5 firewalled-domain metrics are the leading indicators, and which org_id / org_market_id the initiative is anchored to. Read from the warehouses; declares the join shape.
org_market_list per-portfolio snapshot-day required All org-markets in the portfolio with status, parent org_id, and market tag. The canonical listing of operational units.
org_market_active_count per-org × per-day, also per-portfolio × per-day snapshot-day required Active org-markets in each org and across the portfolio.
org_list per-portfolio snapshot-day required All orgs (verticals) in the portfolio with status.
org_active_count per-portfolio × per-day snapshot-day required Active orgs (verticals) in the portfolio.
org_market_age_distribution per-org × per-day, also per-portfolio × per-day snapshot-day required Distribution of org-market tenure in each org and across the portfolio.
org_age_distribution per-portfolio × per-day snapshot-day required Distribution of org (vertical) tenure in the portfolio.
cohort_cross_domain_panel per-org-market × per-intake-cohort, also per-org × per-intake-cohort intake-week × current-week (two-dimensional) required For each intake cohort, the joined view: intake_count, first_lock_count, completed_lessons_count, revenue_earned, revenue_paid, status_as_of_now. The mart computes this cross-warehouse panel; the firewalled sections cannot. Per-org panel sums the counts across the vertical's org-markets.
cross_domain_decision_log per-org-market × per-week, also per-org × per-week, also per-portfolio × per-week decision-week required All decision_log entries from the underlying operational ledger, with cross-domain tagging and the scope at which each decision was logged.
cross_domain_incident_log per-org-market × per-week, also per-org × per-week, also per-portfolio × per-week incident-open-week required Open incidents spanning multiple domains, scoped to the level at which the incident is owned.
attention_queue_snapshot per-org-market × per-snapshot-day, also per-org × per-snapshot-day, also per-portfolio × per-snapshot-day snapshot-day required The operator's prioritized cross-domain attention queue at each altitude. The operator looks at per-org-market for daily work, per-org for weekly vertical reviews, per-portfolio for the strategic horizon.
market_comparison_matrix per-org × per-week snapshot-week required For each org, a side-by-side panel of its constituent org-markets across a fixed set of metrics (intake_count, first_lock_count, lcr, revenue_earned, gross_margin_pct, attention_queue_depth). The view that answers "which Swim market is leading or lagging this week?". The fixed metric set is declared in _comparison_metric_set and is MAJOR-version-pinned.
vertical_comparison_matrix per-portfolio × per-week snapshot-week required Same shape one level up: each org as a row, the comparison metrics as columns. The view that answers "is Swim outperforming Tennis this week?".

The §9.3 customer-grain carve-out (verbatim):

cohort_customer_audit: per-customer, per-org-market (rows carry both org_market_id and org_id), per-cohort, returning {customer_id, intake_week, first_lock_week, first_delivery_lesson_week, lessons_completed_to_date, revenue_paid_to_date, current_status, current_initiative_attribution}. Tagged cross_domain_customer_grain=true. Rate-limited. Audit purpose only.

What stands without further discussion

Three things Portfolio confirmed land as-is:

  1. The three contracted families (cross_market_performance, cross_discipline_performance, portfolio_level_funnel_health) are the authoritative anchors. The portfolio-mart v1.1.0 column manifests supersede Platform's best-effort transcription for those three. Platform will mark the three registry entries with a _authoritative_source: contracts/portfolio-mart/<family>.md field so the manifest is canonical and the registry's per-metric metadata defers to it.

  2. The 20 disputed metrics stay at not_started. No compute hardens behind them until the scope assessment resolves.

  3. ADR-0015 (Portfolio as a cross-domain reporting domain) defines Portfolio's scope as cross-domain strategy reporting, not operational coordination. The initiative model and coordination-layer artifacts the Them OS spec assigns to §9 are not a natural fit for Portfolio's scope as written.

Resolution paths

Platform sees three resolution paths.

Path 1 (recommended). Treat portfolio-mart v1.1.0 as the binding contract for what ships from the portfolio section; relocate the §9 metrics that do not fit.

  • The six initiative-model metrics (initiative_list, initiative_target_trajectory, initiative_baseline, initiative_progress_pct, initiative_days_vs_target, initiative_kill_signal) plus cross_domain_lever_map are coordination-layer artifacts. They live in coordination/_views/ and the operator-facing /initiatives view today, both Platform-owned. The natural home is a new Platform-stewarded coordination-export surface, not the portfolio mart. Platform proposes adding these to a new mart section coordination under §10.9's extension-domain governance, declared as cross-domain (since each initiative spans warehouses) but firewalled out of the firewalled five.

  • cross_domain_decision_log and cross_domain_incident_log also belong to the coordination repo, not portfolio strategy. Both move to the proposed coordination section.

  • attention_queue_snapshot is Platform operational tooling (the operator's prioritized attention surface across domains). Same destination.

  • cohort_customer_audit (§9.3 carve-out) is structurally the same as Finance's customer_journey_audit (§8.4). Platform proposes consolidating into a single customer-grain audit surface in Finance, since Finance already has the customer-grain carve-out posture and the rate-limiting machinery for it. Portfolio's carve-out gets removed; Finance's surface answers the audit need.

  • The org and org-market list / count / age-distribution metrics (org_market_list, org_market_active_count, org_list, org_active_count, org_market_age_distribution, org_age_distribution) are canonical entity listings Portfolio already exposes implicitly in its three families. Platform's read is these should land in a portfolio-mart v1.2 minor as a fourth family (an org_topology family) since the org/org-market spine is genuinely portfolio-strategy data. Portfolio's call.

  • market_comparison_matrix and vertical_comparison_matrix are presentation views of the existing cross_market_performance and cross_discipline_performance families. Platform's read matches Portfolio's: these are restatements at a different presentation grain, not distinct metrics. They fold into the existing family manifests as alternate views, not as new metric IDs.

  • org_market_health, org_health, and portfolio_health are composite indicators. Portfolio's call whether they fit the three existing families or warrant a new health_composites family in v1.2.

Net under path 1: portfolio-mart contracts roughly 3 to 4 families with 6 to 10 metrics total; the remaining 13 to 15 §9 metrics relocate to either a new coordination section (Platform-owned) or Finance §8.4 (the cohort_customer_audit consolidation). Platform amends ADR-0015 to declare Portfolio's scope explicitly excludes coordination-layer artifacts.

Path 2. portfolio-mart bumps to v2.0 (major) to absorb the §9 surface.

  • All 23 metrics land in portfolio-mart v2.0. Portfolio's scope expands to include initiative tracking, decision/incident logs, attention queue, and the customer-grain audit. The two-week deprecation window on v1.1.0 per CONVENTIONS applies. ADR-0015 needs a substantial amendment (probably a successor ADR) to capture the broader scope.

  • Cost: Portfolio's contract becomes ~5x larger and the scope-boundary the v1.1.0 contract drew (aggregate-only, strategy reporting, no coordination surface) is dropped. The §4.4 no-person-grain rule has to be carved out for cohort_customer_audit.

  • Benefit: the Them OS spec §9 lands directly without a new section. No coordination section, no relocation work, no Finance §8 consolidation.

Path 3. Escalate to Them OS for contract reconciliation.

  • Surface the conflict to the Them OS owner: §9 over-reaches into coordination-layer surface that portfolio-mart deliberately scoped out per ADR-0015 and §4.4. Ask Them OS to amend §9 to either remove the disputed metrics (if Them OS's forecaster does not need them after all) or relocate them in the spec.

  • Cost: external dependency, slower turnaround, but the cleanest contract resolution.

  • Benefit: the binding spec ends up internally consistent rather than Platform forcing a workaround.

Platform's recommendation

Path 1. The contract scope ADR-0015 drew for Portfolio is right: Portfolio is cross-domain strategy reporting. Coordination-layer artifacts (initiatives, decision logs, attention queue) are structurally different and shouldn't be wedged into Portfolio's contract to satisfy a Them OS read-shape preference. The coordination/initiative surface already exists in Platform; exposing it as a new mart section under §10.9 governance is the architecturally clean fit. Finance §8.4 already has the customer-grain carve-out shape; consolidating the audit need there avoids two parallel customer-grain surfaces.

Path 2 doubles Portfolio's contract size and dilutes the scope discipline that ADR-0015 established. Path 3 is correct in principle (the spec is over-broad) but the round-trip with Them OS will be slow.

Asks

  • Portfolio: pick a path. If path 1, Platform files the new coordination section proposal as a separate memo with the §10.9 extension-domain governance review, and Portfolio confirms which of the org-topology / health-composites groupings go into a portfolio-mart v1.2 minor.
  • The 20 disputed metrics stay at not_started in the registry until path is picked.
  • The three contracted families pick up the _authoritative_source notes referenced above on a follow-up registry edit; Portfolio will see them at /warehouse/mart/portfolio after the edit lands.

Platform is not asking Portfolio to absorb anything yet. The encoding correction is a Platform-side edit; the scope-resolution path is a Portfolio call.

References

  • Parent correction: 2026-05-19-portfolio-mart-registry-correction
  • contracts/portfolio-mart/README.md (v1.1.0) and the three family manifests
  • ADR-0015 (Portfolio as a cross-domain reporting domain, scope boundary)
  • Them OS data-mart forecasting spec §9 (verbatim above), §9.3 (customer-grain carve-out), §10.9 (extension-domain governance)
  • portfolio-mart §4.4 (no-person-grain rule) and §8 (aggregate-only surface)
  • Thread root: 2026-05-19-platform-mart-contract-registry-encoded

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 19platformThem 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 itMay 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 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