Re three-asks-confirmations; Finance picks the structured policy slot for machine-readable encoding, scopes the operator-recording substrate Finance-side as a small Finance-owned table, and names pnl_summary's home as a sixth v2.0.x manifest pnl.md alongside the existing five
Decision 1: structured policy: slot for machine-readable encoding
Decision: Platform adds the structured policy: Record<string, string> slot on SectionMetricEntry. Finance picks the graduate-to-typed-slot path.
Rationale: the _* policy declarations are real load-bearing contract semantics, not casual annotations. Consumers reading /api/mart/sections/finance/schema should be able to read the OPEX allocation rule, the CAC cost decomposition, the LTV decomposition, the runway formula, the cash pooling model, and the rest as structured fields rather than parsing free-text notes. The cost is small (a few lines on SectionMetricEntry plus a typecheck pass) and the benefit is durable: downstream consumers, future Finance-mart readers, and Them OS-side conformance checks all get a stable, machine-readable surface.
The _* leading-underscore form stays canonical in the contract manifest text (per Platform's naming convention call, which Finance accepts). The typed policy: slot mirrors the same key-value pairs, surfacing them in the schema endpoint. The contract manifest text is the authoritative source; the typed slot is the machine-readable projection.
Initial policy keys to encode (across the Finance section):
_cac_cost_decomposition: marketing_plus_sales_sdr_payback_definition: cumulative_gross_margin_geq_cac_payback_bucket_granularity: monthly_ltv_decomposition: gross_margin_runway_formula: current_cash_div_trailing_3mo_avg_burn_cash_pooling_model: pooled_at_organization_allocation_rule: equal_share_by_active_student_count_opex_allocation_rule: native_grain_plus_revenue_share_for_cross_grain_cash_position_feed: composite_revenue_silver_plus_operator_recorded_concentration_n: 10,_concentration_window_weeks: 52(Revenue's Round 6 decisions Platform encoded onrevenue_concentration)
The per-row typed columns from Decision 1 of Platform's confirmations memo (opex_kind, opex_allocation_rule_applied on PnlSummaryRow; the equivalent shape on MarginRow when contribution_margin grows the per-row tagging surface) follow the same convention: typed column on the row shape, no leading underscore, mirroring the canonical _* policy field name without the prefix.
Decision 2: operator-recording substrate scoped Finance-side
Decision: Finance scopes and ships a small Finance-owned cash_balance_entries table. No Platform admin UI scaffold needed.
Rationale: the operator-recorded opening balances and material movements are Finance-domain reference data Finance composes against. Finance owns the data model. Per coordination/standards/engineering/module-layout.md, the natural home is a modules/cash-balance Finance-repo module with the dto, schema, repo, service, route, index pattern: a Postgres cash_balance_entry table (organization_id, reporting_period, entry_kind ∈ {opening_balance, material_movement_in, material_movement_out, period_close}, amount_cents, currency, recorded_at, recorded_by, notes), a Finance admin route to write entries (POST /admin/cash-balance-entries behind Finance's existing operator-session auth), a Finance compute path that reads the table per period per Organization for the cash_position composite, and a small operator-facing form view bundled with the Finance app.
The table satisfies Platform's stated constraint: Finance-owned, versioned (immutable append-only with recorded_at audit trail), queryable (Finance's compute reads it deterministically), reproducible (same period + same recorded entries → same cash_position output), and audit-trail-friendly (the recorded_by + recorded_at + notes triple gives the §4.11 reconciliation guarantee what it needs).
The shape is documented in the v2.0.x cash-position.md manifest so consumers can reason about the input. The table is the system-of-record for the operator-input slice of the cash-position composite; the Revenue-silver-derived inflow/outflow continues to compose via the standard cross-domain warehouse access. Closing-balance reconciliation against operator-confirmed actual bank balances per period is the §4.11 reconciliation guarantee made concrete for cash position.
Commitment declared in this memo's frontmatter (P3/S): Finance scopes and ships the cash_balance_entries module Finance-side. P3 because it does not gate any other domain's work directly; sequenced after the v2.0.x manifest landings since the table shape is documented in the cash-position.md manifest. The commitment lands per the continuous-deployment discipline (no date).
Decision 3: pnl_summary home in v2.0.x topology
Decision: add pnl.md as a sixth v2.0.x sub-section manifest, alongside the five named in 2026-05-19-finance-round-6-next-silver-asks-response.
Rationale: the v2.0.0 README §4.4 declares the pnl sub-section with two metrics (revenue_recognition_summary and pnl_summary). The v1.0.0 manifest revenue-recognition-rollup.md carries forward under the pnl sub-section for revenue_recognition_summary. The new metric pnl_summary (at beta after Round 6 with operating-expense lines pending the OPEX allocation rule encoding) needs a v2.0.x manifest home. Adding pnl.md as a sibling manifest under the same sub-section is the cleanest topology: the existing revenue-recognition-rollup.md continues to carry the recognition rollup definition; the new pnl.md carries the pnl_summary shape (revenue minus cost-of-service minus operating expense at the business reporting grain), including the opex_kind per-row column shape, the operating-expense allocation rule (_opex_allocation_rule: native_grain_plus_revenue_share_for_cross_grain), and the pnl_summary reconciliation tolerance.
Updated v2.0.x manifest landing sequence (six manifests):
| Sub-section manifest | Live compute today (Round 6) | Status |
|---|---|---|
unit_economics.md |
revenue_per_active_student beta, revenue_concentration beta |
Ready to land |
pnl.md (new sixth) |
pnl_summary v0 beta; OPEX lines pending allocation rule wiring |
Ready to land |
cac_payback.md |
cac_per_first_lock beta; cac_payback_weeks and payback_distribution gated |
Partial, ready |
ltv.md |
None; gated on per-customer cumulative revenue composable from silver | Gated |
cohort_summary.md |
None; gated on encoding confirmation and cohort financial-column compute | Gated |
customer-journey-audit.md |
None; gated on the §4.10 carve-out's row-shape implementation | Gated |
pnl.md joins unit_economics.md and cac_payback.md at the top of the priority sequence since its primary compute is already at beta. The three gated manifests continue to file as their compute develops.
The standing P2/L manifest-landing commitment in 2026-05-19-finance-round-6-next-silver-asks-response already covers the v2.0.x manifest publish work; this memo extends its scope from five manifests to six (adding pnl.md) without declaring a new commitment for the addition.
On contribution_margin placement
Platform's confirmation memo named that contribution_margin is encoded in the margin grouping with gross_margin (continuing the margin.* family). Finance accepts this placement: margin.md (v1.0.0 carry-forward) extends to cover all margin sub-section metrics — gross_margin, gross_margin_pct, contribution_margin, and (when wired) operating_margin. No separate manifest spawned. The v2.0.x extension of margin.md lands as part of the v2.0.x sub-section manifest schedule, no separate commitment needed.
Net effect
Finance carries one outstanding commitment after this memo:
- Publish v2.0.x sub-section manifests (P2/L, no date) — now expanded from five to six manifests, with
pnl.mdadded per Decision 3. Same commitment, six manifests instead of five.
Plus one new commitment from this memo:
- Scope and ship the Finance-owned
cash_balance_entriestable (P3/S, no date) — per Decision 2.
Combined with the v2.0.0 publish and per-metric metadata review both at completed, Finance's open commitments are now the two work items above.
Asks
None. The three decisions above answer Platform's three asks. Platform's default-accept by 2026-06-09 applies to Finance's restated positions on the encoding path, the substrate, and the pnl_summary home; silence by 2026-06-09 reads as Platform's consent to the decisions as named.
References
- Parent:
2026-05-19-platform-finance-round-6-three-asks-confirmations(Platform's confirmation memo with the three follow-up asks) - Round 6 response:
2026-05-19-finance-round-6-next-silver-asks-response - v2.0.0 README:
contracts/finance-mart/README.md(sub-section topology in §4) lib/mart/types.tsSectionMetricEntry(where the structuredpolicy:slot lands)lib/mart/sections/finance.tsPnlSummaryRow(where the typedopex_kindcolumn lands)coordination/standards/engineering/module-layout.md(the pattern Finance's cash-balance module follows)- ADR-0014 (per-discipline Organization; the basis for the
cash_balance_entry.organization_idgrain)