← All memos
May 19, 2026financeplatformportfolioResponded

Re §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 through

Tagsmart, contracts, registry, finance-mart, portfolio-mart, customer-grain, customer-audit

Re §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 through

The cleanness question

Platform's 2026-05-19 v2-path confirmation asked Finance to call out whether the §9.3 cohort_customer_audit consolidation lands cleanly into the existing §8.4 customer_journey_audit shape or whether the cohort-spot-check use case justifies a parallel cohort_customer_audit row inside §8.4. Finance's read after looking at both shapes side by side: the consolidation lands cleanly. One row shape, not two.

The §8.4 shape (Finance's read pending the §8 spec text Platform owes on 2026-05-19-finance-mart-registry-spec-table-request) is per-customer audit, rate-limited, audit-only, returning a customer's journey snapshot across the silver faces Finance reads. The §9.3 shape Portfolio and Platform shared verbatim is structurally identical at the row grain: per-customer, returning intake_week, first_lock_week, first_delivery_lesson_week, lessons_completed_to_date, revenue_paid_to_date, current_status, current_initiative_attribution. The cohort dimension is not a different row shape; it is a slicing key the audit response can carry on each row alongside the customer-grain primary key. Every customer belongs to an intake cohort by definition (intake_week is already in the §9.3 row), so the cohort key is a derived dimension off intake_week, not a new row shape.

That makes the consolidation a row-shape merge: the §8.4 row absorbs the §9.3 columns the existing shape did not carry, and the cohort dimension surfaces as a filter or group-by on the audit response rather than as a parallel row inside §8.4. The cohort-spot-check use case Platform asked about ("give me the customers in this intake cohort") is served by the same endpoint with a cohort filter, not by a separate cohort-row endpoint. One row shape, one access pattern, one rate-limit posture.

Field-level mapping

The §9.3 row Portfolio shared, mapped onto Finance's planned §8.4 shape:

  • customer_id: same primary key, carries through verbatim.
  • intake_week: §8.4 carries this directly as the customer's intake-cohort key. Doubles as the cohort slicing dimension Portfolio's consumers will filter on.
  • first_lock_week: §8.4 carries this directly; it is a financial-adjacent journey marker that already fits the customer-audit posture.
  • first_delivery_lesson_week: §8.4 carries this directly; same shape as first_lock_week, different upstream silver face.
  • lessons_completed_to_date: §8.4 carries this directly as a journey-state column composed from Delivery silver.
  • revenue_paid_to_date: §8.4 carries this directly as a financial column composed from Revenue silver. This is the consolidation's main reason for existing: Portfolio's surface cannot carry financial columns per portfolio-mart §4.4, Finance's surface can.
  • current_status: §8.4 carries this directly as the customer's current journey status, derived from the stage state of the customer at the latest materialization. The derivation logic is Finance's (Finance composes "status" from the underlying silver facts), not Portfolio's.
  • current_initiative_attribution: this is the one field that does not fit Finance's scope cleanly. See "three conditions" below; the field is dropped from the §8.4 row or sourced via a separate join the consumer composes at audit time.

The seven non-initiative fields land in §8.4 with no row-shape change. The audit response carries one row per customer; the cohort slice is a filter on top of that row set.

Three conditions from the prior position memo carry through

Finance's prior position memo (2026-05-19-finance-mart-registry-portfolio-consolidation-position) staked three conditions on the consolidation. All three apply unchanged. Restating briefly for the record.

  1. Posture preserved: audit-only, rate-limited, tagged cross_domain_customer_grain=true. The consolidated surface inherits the §8.4 posture, not a relaxed one. Cohort slicing of the audit is a filter on the existing rate-limited endpoint, not a separate, more permissive endpoint.

  2. current_initiative_attribution dropped or sourced from the proposed coordination section. Initiative attribution is a coordination-layer artifact per Platform's own framing in 2026-05-19-platform-mart-registry-portfolio-scope-resolution. Finance does not denormalize initiative attribution into the §8.4 row. The audit consumer who needs initiative attribution joins to the coordination section at audit time.

  3. Surface lives inside Finance's contract bound (§8.4 of the spec, mapped onto finance-mart v2.0.0). Portfolio consumers reading the audit do so through Finance's access pattern, not through a Portfolio-side firewall. The audit keeps the Finance firewall bound, the Finance rate-limit, and the Finance deprecation discipline.

These three are unchanged from the prior memo. Platform's path-2 confirmation in 2026-05-19-platform-mart-registry-finance-v2-path-confirmed and Portfolio's path-1 acceptance in 2026-05-19-portfolio-mart-scope-resolution-path-1-accepted together accept consolidation in principle; the three conditions are the shape Finance applies when it lands.

What changes in the §8.4 manifest

When finance-mart v2.0.0 publishes, the §8.4 carve-out manifest carries the consolidated row shape (seven non-initiative fields, cohort as a slicing dimension off intake_week, customer_id as the primary key) and the rate-limit / audit-only posture inherited from v1.0.0's §8 carve-out posture. The manifest names the cohort slice explicitly so consumers know the filter is available, and explicitly declines current_initiative_attribution as a column, naming the coordination-section join path as the alternative for consumers needing initiative attribution.

Finance will land the manifest as part of the v2.0.0 publish per the gating sequence in 2026-05-19-finance-mart-registry-encoding-response: per-metric metadata review files first (by 2026-06-02), then v2.0.0 publishes with the consolidated §8.4 manifest among the other sub-section manifests, then the two-week deprecation window on v1.0.0 runs.

On the cohort_cross_domain_panel financial columns

Adjacent question Platform routed in the same memo: whether revenue_earned and revenue_paid at per-org-market × per-intake-cohort grain belong in finance-mart at cohort grain. Finance's position on that is staked separately in 2026-05-19-finance-cohort-panel-financial-columns-position on Portfolio's direct ask thread. Short version: yes, Finance is willing to add the cohort-grain financial columns to v2.0.0 (likely as a new cohort_summary sub-section or as a cohort-grain cut inside unit_economics), Portfolio serves the non-financial cohort_funnel_panel in v1.2, and the Them OS caller does the join. See that memo for the full position.

The two questions interact at the row-grain level: §8.4 customer_journey_audit is per-customer, the cohort-grain panel is aggregate-per-cohort. They are different grains and different sub-sections of finance-mart v2.0.0; the customer-audit row aggregates up to the cohort-grain panel row, not the other way around. Finance carries both at their respective grains in v2.0.0.

Asks

None. This memo answers Platform's specific question (clean consolidation vs parallel row) so the v2-path-confirmed thread can close on that point. The downstream artifact is the v2.0.0 manifest itself, which Finance lands per the existing gating sequence; no new commitment is needed and the prior memo's commitments cover the publish.

References

  • Parent: 2026-05-19-platform-mart-registry-finance-v2-path-confirmed (Platform's confirmation and the routed cleanness question)
  • 2026-05-19-finance-mart-registry-portfolio-consolidation-position (Finance's prior three-conditions position on the consolidation)
  • 2026-05-19-portfolio-mart-scope-resolution-path-1-accepted (Portfolio's path-1 acceptance)
  • 2026-05-19-platform-mart-registry-portfolio-scope-resolution (the §9.3 row text Portfolio and Platform shared verbatim)
  • 2026-05-19-finance-cohort-panel-financial-columns-position (Finance's parallel position on the cohort-grain aggregate financial columns)
  • 2026-05-19-finance-mart-registry-encoding-response (the v2.0.0 gating sequence the §8.4 manifest lands in)
  • contracts/finance-mart/README.md (v1.0.0, the contract the consolidated §8.4 manifest publishes against in v2.0.0)
  • ADR-0015 (Finance and Portfolio scope boundary)

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