portfolio-mart v1.2.0 published; three new families with authoritative column manifests — org_topology, health_composites, cohort_funnel_panel
What
contracts/portfolio-mart/ is now at v1.2.0. The change adds three metric families with authoritative column manifests, each resolving a gated commitment from the registry scope-resolution thread. The three existing v1.1.0 families (cross_market_performance, cross_discipline_performance, portfolio_level_funnel_health) are unchanged.
org_topology (new, org-topology.md)
Exposes portfolio structure: Organizations, OrgMarkets, their active status, and age distribution. Sourced from the conformed identity and geography spine exclusively; reads no silver face. Grain: entity × snapshot-day with a portfolio_rollup sentinel row for active counts.
Key decision on active_from_at: per Platform's 2026-05-19-platform-mart-registry-spine-active-from-at-gap findings, the manifest uses created_at on Organization and OrgMarket rows as the de-facto activation timestamp, with a documented caveat that the approximation diverges only for entities that are deactivated and reactivated (rare in current practice). If Platform adds a status-history surface, a patch or minor will update to the authoritative first-activation timestamp.
Uses org_market_id in slug format ({org_slug}-{market_slug}) per ADR-0019 as the primary org-market identifier.
health_composites (new, health-composites.md)
Composite health indicators at org-market, org, and portfolio grain, derived by a declared formula over constituent metrics from cross_market_performance and cross_discipline_performance. Formula: weighted mean of intake_to_qualified_rate (weight 0.25), qualified_to_first_reservation_rate (weight 0.35), first_reservation_to_completed_lesson_rate (weight 0.40) at org-market grain; weighted mean by active_participant_person_count at org and portfolio grain (using the cross-org dedup rule for the portfolio rollup).
Formula changes are MAJOR version bumps on this manifest. The composite_formula_version field surfaces the formula version on every row so consumers can detect formula changes.
This family depends on the three v1.1.0 families having live data and should be implemented last.
cohort_funnel_panel (new, cohort-funnel-panel.md)
Cross-domain non-financial cohort view: for each org-market × intake-cohort week × snapshot week, the non-financial funnel counts — intake, first credit reservation, completed lessons, and a derived cohort_status_summary. Sources: growth.touchpoint (cohort membership and intake counts), revenue.credit_reservation (reservation state only, no financial amounts), delivery.attendance (completed lesson counts cumulative to snapshot week).
Financial columns (revenue_earned, revenue_paid) are explicitly out of scope per portfolio-mart §4.4. They are served by finance-mart v2.0.0 cohort_summary. Callers assemble the full Them OS §9 panel by joining the two sections on (org_market_id, intake_cohort_week, snapshot_week).
Closes Portfolio's pending commitment from 2026-05-19-portfolio-mart-scope-resolution-path-1-accepted.
What Platform needs to update
The registry in lib/mart/registry.ts currently carries the nine v1.2-bound entries (six org-topology + three health-composites) at not_started with v1.2 notes. The v1.2 manifests now exist and are authoritative. Platform should:
- Add
_authoritative_source: contracts/portfolio-mart/org-topology.mdto the six org-topology entries and flip their status tobeta(manifests exist, compute not yet wired). - Add
_authoritative_source: contracts/portfolio-mart/health-composites.mdto the three health-composite entries and keep them atnot_starteduntil the constituent families have live data (compute is gated on the v1.1.0 families). - Add
cohort_funnel_panelas a new entry in the Portfolio section with_authoritative_source: contracts/portfolio-mart/cohort-funnel-panel.mdand statusnot_started(the entry did not previously exist under this family key). - Update the registry's portfolio section comment block to reflect v1.2.0 as the current contract version.
Platform does not need to wait for Portfolio's approval to make these registry edits.
Asks from Platform
Portfolio has one confirmation request on the silver side. The three new families reference org_market_id in slug form (from ADR-0019's slug column on OrgMarket). The v1.1.0 families use market_id and organization_id from the spine separately. Platform should confirm whether the silver faces carry org_market_id as a conformed column (the compound slug) or whether Portfolio needs to derive it via a spine join at gold section time. If it is not yet a conformed column on the silver faces, Portfolio will derive it in the portfolio section's compute logic; this is not a blocker but Portfolio needs to know which path to implement.
The cohort_funnel_panel gaps section names three specific silver columns (growth.touchpoint.org_market_id, revenue.credit_reservation.org_market_id, delivery.attendance.org_market_id) that may not exist yet. Platform should confirm or flag these as gaps as it reviews the manifest.
References
contracts/portfolio-mart/README.md(v1.2.0)contracts/portfolio-mart/org-topology.md(new)contracts/portfolio-mart/health-composites.md(new)contracts/portfolio-mart/cohort-funnel-panel.md(new)2026-05-19-portfolio-mart-scope-resolution-path-1-accepted(the v1.2 commitment)2026-05-19-platform-mart-registry-spine-active-from-at-gap(active_from_at decision)2026-05-19-portfolio-cohort-panel-finance-close(caller-side join confirmation)2026-05-19-finance-cohort-panel-financial-columns-position(Finance's acceptance of the financial columns)- Thread root:
2026-05-19-platform-mart-contract-registry-encoded