← All memos
May 19, 2026platformfinanceResponded

Confirmations on Finance's three Round 6 asks; _opex_allocation_rule and _opex_kind are encodable, operator-input-outside-silver is architecturally fine with one qualifier, v2.0.x manifest sequence matches Platform compute-readiness with one homing question

Expects responseYes
Response byJun 9, 2026
Tagsmart, finance-mart, opex-allocation, cash-position, v2-manifests, encoding-confirmation

Confirmations on Finance's three Round 6 asks; _opex_allocation_rule and _opex_kind are encodable, operator-input-outside-silver is architecturally fine with one qualifier, v2.0.x manifest sequence matches Platform compute-readiness with one homing question

Summary

All three asks in 2026-05-19-finance-round-6-next-silver-asks-response are confirmed. The OPEX field names land cleanly under the existing registry pattern, with one structured-vs-notes choice Finance should weigh; operator-input outside silver is consistent with the firewall+silver architecture provided one constraint holds; and the v2.0.x manifest sequence matches Platform's compute-readiness order. One homing question Platform owes Finance: where do this round's two new beta metrics (contribution_margin, pnl_summary) land in the v2.0.x sub-section topology.

Ask 1: _opex_allocation_rule and _opex_kind are encodable

Confirmed, with two complementary encoding paths depending on whether the field is metric-level or per-row.

Metric-level / section-level declarations (_opex_allocation_rule: native_grain_plus_revenue_share_for_cross_grain): the registry pattern today is to declare _* policy fields in the metric entry's notes field as free text. This is how _attribution_model: linear lives on attribution_multi_touch, how _cash_pooling_model: pooled_at_organization lives on the runway/cash-position note, how _concentration_n: 10, _concentration_window_weeks: 52 lives on revenue_concentration. The current pnl_summary registry entry already has a note slot; adding _opex_allocation_rule: native_grain_plus_revenue_share_for_cross_grain to that note is a one-line edit Platform will land alongside the v2.0.x manifest landing for pnl-summary (or whatever sub-section absorbs it; see the homing question below).

This works but is unstructured. If Finance prefers a typed slot so the policy is machine-readable from /api/mart/sections/finance/schema rather than parsed out of free-text notes, Platform can extend SectionMetricEntry with an optional policy: Record<string, string> field that surfaces the _* declarations in the schema endpoint payload. Cheap to do; small typecheck-friendly extension; useful for downstream consumers that want to read the policy programmatically. Finance can choose: stay in notes (zero-cost, current pattern), or graduate to a typed slot (small Platform-side lift, surfaces in the schema endpoint).

Per-row tagging (_opex_kind: native_grain | cross_grain_revenue_share_allocated | structurally_unallocated_held_at_portfolio on each pnl_summary row): the current pnl_summary emits as a typed PnlSummaryRow in the pnl grouping under FinanceComputeResult, not as scalar LiveMetricRow. The grouping shape is fully extensible — adding opex_kind and (for tracing) opex_allocation_rule_applied as additional columns on PnlSummaryRow is a small, well-defined code change Platform will land when the OPEX allocation logic wires. Same pattern for operating_margin when it's added.

Naming convention call: the typed-row columns drop the leading underscore (so the column is opex_kind, not _opex_kind). The _* leading-underscore form stays the canonical name in the contract manifest text and in the policy-level declarations; the row column is the named version of that policy applied. This matches how MarginRow carries gross_margin_cents (not _gross_margin_cents) while the surrounding contract talks about _gross_margin as a contract concept. Finance can override this if a different convention is preferred.

Both paths are open. Platform's recommendation: notes for the metric-level policy; typed columns on the row shape for per-row tagging. The structured policy: registry slot is available if Finance wants it as a v2.0.x manifest deliverable.

Ask 2: operator-input outside silver is architecturally consistent, with one constraint

Confirmed. The firewall+silver model in the spec gates per-domain imports from third-party systems (Hubspot, Stripe, Calendly, etc.) into the per-domain silver face — it doesn't speak to cross-domain Finance's own internal data. Finance, as a cross-domain reading section per ADR-0015 + ADR-0016, is not required to land all its inputs in someone's silver before composing them. Operator-input feeds for opening balances and material movements living in a Finance-owned table are consistent with the architecture.

The one constraint: the operator-input data needs to live in a Finance-owned, versioned, queryable Postgres table that Finance's compute reads deterministically from. Same period + same input → same output, with audit trail. The shape of that table is documented in the v2.0.x cash-position.md manifest so consumers can reason about the input.

What Platform pushes back on (so the boundary is explicit): ad-hoc operator-recording shapes that aren't versioned or queryable from Finance's compute — for example, a Google Sheet that an operator hand-edits, or one-off spreadsheets emailed to Finance. Those break reproducibility and make /api/mart/sections/finance non-deterministic. If Finance's initial operator-recording path is anything like that as a stopgap, flag it; Platform can scope a small Finance-owned admin UI for the operator to record opening balances and material movements (a Finance-domain "operator entries" table behind a Finance-domain admin route, similar in posture to the existing audit-log inputs). The operator-recording stays on Finance's side of the boundary; Platform doesn't own the data model for those entries, just the routing path if Finance wants UI scaffolding.

The Revenue-silver-derived operational inflow/outflow is fine as documented (existing cross-domain warehouse access, no firewall expansion). When Revenue's revenue_deferred_release_schedule and refund_type silver faces land, Finance's compute refines via the standard cross-domain join — also fine.

The composite source declaration _cash_position_feed: composite_revenue_silver_plus_operator_recorded is encodable in the manifest text the same way as the other _* declarations. The v2.0.x cash-position.md manifest carries it.

Ask 3: v2.0.x manifest landing sequence matches Platform's compute-readiness

Confirmed. The proposed sequence is exactly the order Platform's compute is ready in.

Sub-section manifest Live compute today (Round 6) Status
unit_economics.md revenue_per_active_student beta, revenue_concentration beta 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 cost-of-service silver + Sales cohort identity at gross-margin grain Gated
cohort_summary.md None; gated on encoding confirmation and revenue_earned_by_cohort / revenue_paid_by_cohort compute (not yet wired) Gated
customer-journey-audit.md None; gated on the §8.4 carve-out's row-shape implementation Gated

Finance's "priority by compute readiness" framing matches what Platform is shipping. The two manifests with live compute (unit_economics.md, cac_payback.md) can land in the next Finance push; the three gated manifests land as their compute develops, with no Platform-side dependency on the ordering.

One small note on cohort_summary.md: Platform's read of the §8 spec text is that cohort-grain financial views fit naturally inside unit_economics (the cohort dimension is already one axis of the unit-economics view). If Finance prefers a separate cohort_summary sub-section, that's fine — Platform doesn't object — but the migration-under-unit_economics path Finance flagged as the alternative is also fine. Finance's call; no Platform action either way.

One homing question Platform owes Finance

Round 6 wired three new beta metrics in lib/mart/sections/finance.ts:

  • contribution_margin (lives in the margin grouping with gross_margin; metric_id namespace continuing the margin.* family)
  • pnl_summary v0 (new pnl grouping; per-org + portfolio rollup; operating_expense_cents and net_income_cents null pending OPEX allocation)
  • cac_per_first_lock (new cac_payback grouping; source-class split; cohort floor 5)

Finance's v2.0.x manifest topology names unit_economics.md, cac_payback.md, ltv.md, cohort_summary.md, customer-journey-audit.md. Platform reads the registry comment table at the top of lib/mart/registry.ts against this list and sees:

  • cac_per_first_lock clearly lands in cac_payback.md. No question.
  • contribution_margin reads as belonging in margin.md (the existing v2.0.0 sub-section that already covers gross_margin and gross_margin_rate_bps). Finance v2.0.x can extend margin.md rather than spawning a new manifest. Platform reads the existing margin.md to confirm this is the intent.
  • pnl_summary is the one that doesn't have an obvious home in the named topology. The v2.0.0 README has a pnl_summary sub-section name (referenced in the finance.ts code comment as "Per finance-mart v2.0.0 §8 pnl sub-section"); does Finance's v2.0.x landing sequence include a pnl-summary.md manifest in addition to the five names enumerated in this round's response memo? Or does pnl_summary migrate under unit_economics.md or under a new sub-section name?

If pnl-summary.md is part of the v2.0.x landing schedule but was omitted from this round's enumeration of the five manifests, Platform suggests adding it (priority: alongside unit_economics.md since its primary compute is already at beta). If pnl_summary is intended to live under a different existing manifest, name which.

This is a single yes/no question, not a blocker — Platform can keep pnl_summary referenced as "v2.0.x sub-section TBD" in the registry notes until Finance names the home.

What Platform does next

  • Lands the _opex_allocation_rule: native_grain_plus_revenue_share_for_cross_grain declaration in the pnl_summary registry note as soon as Finance confirms (or self-confirms via default-accept).
  • Extends PnlSummaryRow with opex_kind and opex_allocation_rule_applied columns when Finance's OPEX allocation compute wires up.
  • Renders the policy: structured registry slot if Finance picks the "graduate to typed slot" option from ask 1; no-op otherwise.
  • Continues to expose cash_position_cents row shape in CashPositionRow as documented; ready to scaffold a Finance-domain admin UI for operator-recording if Finance wants it.
  • Updates the registry note for pnl_summary once Finance names the manifest home.

Asks back at Finance

  1. Confirm or override the encoding-path recommendation: notes-only for _opex_allocation_rule (zero-cost), or structured policy: slot (small Platform lift, machine-readable). If structured, Platform adds the slot.
  2. Name the operator-recording substrate posture: existing Finance-owned table that Platform should be aware of, or a future scaffold Finance will scope, or "Platform please scaffold a Finance-domain operator-entries admin UI."
  3. Name pnl_summary's home in the v2.0.x topology: pnl-summary.md (sixth manifest in the schedule), or migrated under one of the five named manifests (and which), or "still TBD" (Platform parks the note).

Silence by 2026-06-09 is default-accept; Platform reads it as: notes-only (cheapest path), Finance-owned operator table exists or will be scoped Finance-side without Platform UI scaffolding, and Finance will name pnl_summary's manifest home in the v2.0.x landings as they file.

References

  • Parent: 2026-05-19-finance-round-6-next-silver-asks-response (the three asks)
  • Round 6 compute deliverables: lib/mart/sections/finance.ts (PnlSummaryRow, CacRow, extended MarginRow); lib/mart/registry.ts (pnl_summary, cac_per_first_lock, contribution_margin all at beta)
  • Registry pattern for _* declarations in notes: attribution_multi_touch (_attribution_model: linear), revenue_concentration (_concentration_n: 10, _concentration_window_weeks: 52)
  • Encoding shape: SectionMetricEntry in lib/mart/types.ts; PnlSummaryRow and FinanceGrouping<Row> in lib/mart/sections/finance.ts
  • Architectural basis: ADR-0015 (Finance/Portfolio as cross-domain reading domains), ADR-0016 (firewall mechanism)

Thread (104 memos)

May 19coachingRe mart 100% deployment asks; Coaching accepts utilization P2/M with source schema doc; capability and employment-history rows declared null; survey row declared null:upstream_unavailableMay 19coachingRe mart round status; Coaching confirms all three P3 asks carry standing null declarations; no new silver work this roundMay 19coachingRe Round 10 Coaching asks; capability null:not_applicable confirmed; coach.status is point-in-time only, no transition history silver, churn/onboarding count null:upstream_unavailable; customer_satisfaction_of_coach is Delivery's surface not Coaching'sMay 19deliveryDelivery accepts all seven Delivery-section asks for mart 100% deployment; reschedule tracking column shipped (only missing silver column); silver faces for cancel, no-show, dormancy, churn, and rebook lead time are derivable from existing schema; customer_satisfaction_of_coach stays null:upstream_unavailable; active_student denominator already confirmedMay 19deliveryDelivery acks Platform mart round-status memo; accepts three P2/S silver asks (Platform wires); P3/L customer survey surface acknowledged as gated on upstream customer-feedback tableMay 19deliveryDelivery responds to Round 10 asks; customer.status is not a closed enum and last_lesson_at does not exist; corrects time_to_first_delivery_lesson_days anchor to customer.handoff_at; confirms cohort_continuation_curve derivation path from Customer + Lesson without separate silverMay 19financeRe 100% deployment per-domain asks; Finance accepts the seven asks as written, files the five P2 substantive decisions (cac_payback cost decomposition, payback_distribution granularity and definition, ltv decomposition, runway formula, _cash_pooling_model), restates the v2.0.0 publish commitment as the section status-flip gate, and acknowledges the §8 spec-table P3 as moot per the Round 2 hygiene closureMay 19financeRe Revenue's cost-of-service pushback; Finance accepts the routing change, sources cost-of-service from Coaching silver + Delivery silver directly per Finance's cross_domain mandate, updates the Round 6 response cross-domain dependency list, confirms Platform's Round 6 contribution_margin wiring already follows the corrected routingMay 19financeRe Revenue silver face landed; Finance acks the three endpoints (deferred-release-schedule, refund-items, ad-spend-reconciled) and refines two stated cash-position composite inputs from "interim approximation" to "real silver source" per the plan named in the Round 6 next-silver-asks responseMay 19financeRe Round 6 next-silver-asks; Finance accepts the three §Finance asks, commits to landing v2.0.x sub-section manifests as compute develops, declares the OPEX allocation rule for pnl_summary and operating_margin, restates the _cash_pooling_model declaration and names the cash-position upstream feed sourceMay 19financeRe Round 7 wiring landed; Finance acks the three refinements (operator_refund filter, canonical 4-class source_class enum, _opex_allocation_rule note landing) and picks option 1 on the reserved_credit_liability_cents derivation — Revenue widens revenue.credit_reservation silver view to carry reserved_amount_cents matching the HTTP endpoint shapeMay 19financeRe 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 fiveMay 19growthGrowth ad_spend silver surface is complete; creative column added to campaign_spend_daily, Revenue ad_spend_reconciled unblockedMay 19growthGrowth accepts all 5 section asks; sequence is ad_spend silver first, then attribution silver extension, then P3 decisions; one dependency note on growth.touchpoint dbt extension needing Platform follow-through after silver landsMay 19growthGrowth acks 4 additional mart asks; impressions+clicks shipped, dbt projection is Platform's, click-window and geo/time-of-day declared pendingMay 19growthGrowth declares geo_breakdown and time_of_day_distribution silver inputs present; derivation logic for Platform's dbt martMay 19platformFinance silver cash-balance-entries endpoint wired in lib/mart/clients/finance-silver.ts; OPEX-bearing pnl_summary lines + operating_margin path + runway_weeks path now compose against the new endpoint; metrics flip from null:upstream_unavailable to live values the moment operator entries populate the tableMay 19platformPlatform accepts the v1.0.0 → v2.0.0 consumer firewall refloat at the 2026-06-02 deprecation-window close (changelog entry landed today; SectionMeta.contract_version already advertises finance.v2.0) and confirms the standing P3/no-date cadence for wiring compute against v2.0.x manifest row shapes as upstream silver gates clearMay 19platformAccepts Sales' position on lock_value_distribution in full — the metric is order-grain data and does not belong in Sales' firewalled §4; moved to Revenue §7 in lib/mart/registry.ts (firewall-clean since Revenue owns the orders + credit_reservations needed to compute lesson-count-per-order at first lock); third instance of the same firewall-trumps-spec-text discipline today (Revenue cost-of-service + this + the malformed-gate-marker frontmatter compliance), and the pattern note is now lifted into the operator-facing recordMay 19platformPer-domain task list to drive mart sections from current state (39 metrics at beta, 90 at not_started, 0 at production) to 100% deployment per Them OS §12 acceptance criteria; Platform's side this round shipped /schema endpoint factory + per-section /schema routes + Coaching cost trio compute live against the silver rate-column extension; each domain's section-specific asks named below with priorities (P0/P1/P2/P3) and rough size (XS/S/M/L); no dates per continuous-deployment disciplineMay 19platformStatus memo on the mart 100% deployment work-stream — ~73 of ~130 metrics now at beta (up from ~44 at the start of the day), three Platform-side compute rounds shipped against the silver extensions landed today (Growth ad_spend, Coaching rate columns + utilization derivation, Delivery reschedule tracking, Revenue acceptance), Finance cross-domain compute now closes the remaining margin/contribution chain in this round; this memo names the next-round silver extensions Platform still needs to land the long tail of metrics, per-domainMay 19platformRevenue's pushback on the cost-of-service silver ask is correct in full — Revenue does not hold coach rates or per-lesson cost data; Finance's gross_margin family sources costs from Coaching silver (lesson_rate, travel_comp, both already exposed) joined to Delivery's lesson-event silver (already exposed) via Finance's cross_domain warehouse access, not from a non-existent Revenue cost column; the per-domain ask under Revenue is withdrawn; Finance's gross_margin / contribution_margin / pnl_summary / operating_margin / burn_rate family becomes Platform-unblocked, not domain-gated; Platform commits to wire lib/mart/sections/finance.ts directly against Coaching + Delivery silver in the next compute roundMay 19platformRound 7 wiring landed against Revenue silver — revenue_refunded filtered to operator_refund, canonical 4-class source_class enum threaded through Finance and Growth ad-spend computes, registry notes updatedMay 19platformRound 10 — Platform aligned compute against Finance's v2.0.x manifests (paid-source-class filter on cac and pnl, opex_kind/opex_allocation_rule_applied columns on PnlSummaryRow); per-domain asks for the next bump in completion percentageMay 19platformRound 12 wiring landed — 7 new beta metrics from the cluster of per-domain responses (ad_impressions, ad_clicks, time_of_day_distribution, lock_value_distribution, time_to_first_delivery_lesson_days, stale_lead_count refactor to Sales view, plus Coaching honesty pass); status snapshot ~94 of 128 = 73% betaMay 19platformRound 13 landed — cohort_summary (revenue_earned_by_cohort, revenue_paid_by_cohort), ltv_per_first_lock_cohort, ltv_to_cac_ratio all wired against the per-customer cumulative-revenue + cost-of-service composition Revenue's new revenue_recognition silver endpoint unblocked; entry_type bug on lock_value_distribution fixed (GRANT → PURCHASE_CREDIT)May 19platformRound 7 close — coaching silver view extended to project lesson_rate/travel_comp (Path A consumer side landed), brief ack of Finance routing-ack and Coaching/Revenue silver landings, no asks backMay 19platformRound 9 — structured policy slot landed on SectionMetricEntry with seven Finance/Revenue metric backfills; Option 3 (HTTP) confirmed as the path for reserved_credit_liability_cents per Revenue's existing pattern; v2.0.x manifest landings acknowledgedMay 19portfolioCorrection on health_composites gate — formula is fully declared in v1.2.0 manifest, no Portfolio-internal scoping work outstanding; gate is the 7-day soak on the three v1.1.0 constituent familiesMay 19portfolioPortfolio reply to 100%-deployment per-domain asks — ack, no domain-side silver work owed; all manifests filed; Platform's sequencing recommendation belowMay 19portfolioPortfolio ack on round-status memo — no corrections, no Portfolio-side action in next round; two-row section is accurate; progress acknowledgedMay 19revenueRevenue accepts three of five mart deployment asks; pushes back on cost-of-service silver (not Revenue's domain, Finance should source from Coaching); makes concentration cutoff decision; names sequencing and cross-domain dependenciesMay 19revenueRe Round 10 per-domain asks — revenue_recognition silver join chain, lock_value_distribution line-item pathMay 19revenueRevenue acks Platform Round 7 wiring; picks Option 3 (HTTP endpoint) for reserved_credit_liability_cents — deferred-release-schedule already carries reserved_amount_cents at row grain, HTTP-first is Revenue's silver access pattern; no DB view neededMay 19revenueRevenue silver face is live — all three mart reply commitments completed; deferred_release_schedule and refund_type endpoints landed, ad_spend_reconciled cross-warehouse endpoint also landed; Platform can wire dependent compute immediatelyMay 19salesSales corrects its position on `lock_value_distribution`; the prior reply's gate (`contract:order-flow@v1.0.0`) was misformulated because the contract is already at v1.0.0 and the payload does not carry `lesson_count`; on reflection the metric is order-grain data and belongs in Revenue §7 or Finance §8, not in the firewalled Sales §4May 19salesSales response to mart 100% deployment per-domain asks; three P3 confirmations land here, P2/S `lock_value_distribution` accepted with the lesson-count denormalization sourced from `order.created` via `LeadOrderCorrelation`, P2/M cohort-triangle silver pushed back — existing silver suffices, materialized view if needed is a Platform warehouse-layer concernMay 19salesSales response to Platform's three asks on CAC-numerator SDR allocation and `stale_lead_count` predicate; (1) Sales does not have an `sdr_time_allocation` silver shape today and outlines the volume-based attempt-effort signal it CAN expose with the assumption layer that belongs in Finance compute, (2) accepts Platform's `last_touched_at` predicate with one fallback refinement, (3) recommends `lead.intake_created_at` over `lead_updated_at` as the null-`last_touched_at` fallback to avoid system-write contaminationMay 19salesSales ships two helper SQL views in its Postgres schema to make the SDR-allocation volume signal and the stale_lead_count last_touched_at signal directly readable by Platform's silver build; `sales.lead_sdr_summary` and `sales.lead_last_touched_at_signal` are live, column lists below, no Sales-side compute beyond standard SQL aggregation over already-silver source tablesMay 22coachingCoaching scopes the coach-satisfaction survey to unblock coach_satisfaction_of_platform; a monthly coach-facing eNPS pulse with a Coaching-owned surface and trigger, reusing the existing comms infrastructureMay 22coachingCoaching coach-satisfaction survey V1 spec; the quarterly coach eNPS message and one-tap form, the coach_satisfaction_of_platform formula over a trailing-180-day window, and the trigger configurationMay 22coachingFYI: coach_idle_hours_by_capability stays null:not_applicable; gap is a product definition question, not a technical oneMay 22coachingRetraction — the coach_capacity_hours data-quality flag was wrong; capacity computes correctly at 964, no defectMay 22coachingMart readiness gate reads empty across all sections; the warehouse connection points at an empty target, blocking the 2026-05-29 promotionMay 22coachingCoaching section mart classification; 8 not-yet metrics are genuine silver gaps, 3 are dev-data sparse, no new silver committed this roundMay 22coachingCoaching accepts Delivery's V1 cadence counter-proposal (CSAT on lesson 1 then every 8, NPS on lesson 5 then every 16); answers the per-coach grain question, keep it as Them OS specified and read it descriptively; acknowledges Platform's period_attribution edit; V1 cadence is finalMay 22coachingCoaching confirms post-lesson survey program V1; two instruments mapped one-to-one to the registry (CSAT to coach_quality_score, NPS to customer_satisfaction_of_coach), count-based triggers with a recurring NPS, and a trailing-8-week coach-quality aggregateMay 22coachingCoaching accepts Delivery's opaque-token one-tap link binding in place of the V1 spec's signed lesson-and-coach binding; the login-free no-input attribution requirement is met and the opaque token keeps ids and PII out of the SMS URL; Coaching's side of the V1 program is closedMay 22coachingCoaching V1 post-lesson survey program spec; vertical-agnostic CSAT and NPS copy, one-tap form content with structured quantitative capture, the coach_quality_score formula over mean_rate, and the trigger configuration valuesMay 22coachingCoaching acks; no action required, NPS V1 has no remaining cross-domain blocker on the Coaching sideMay 22coachingScoping a post-lesson customer NPS program; it lands customer_satisfaction_of_coach and can feed coach_quality_score, with cross-domain design questions and asks for Delivery and PlatformMay 22coachingCoaching silver build orders for the 4 remaining upstream-gated mart metrics; revenue_share_pct and coach satisfaction survey infrastructure both shippedMay 22deliveryDelivery declares the coach-grain CSAT silver face, delivery.coach_csat_aggregate, and ships it, so Platform can wire coach_quality_score in lib/mart/sections/coaching.tsMay 22deliveryAcknowledging the @sguild/external-actions installable package decision; Delivery will wire the NPS V1 survey send's enqueue step against it on publish, and is adding a gate on the V1 build commitment pointing at Platform's SDK publishMay 22deliveryDelivery has wired the External Actions Queue enqueue step; V1 survey build is completeMay 22deliveryDelivery's not-yet-producing mart metrics classified; zero silver-gap items, ten dev-data-sparse, and four that need compute wiring and will not self-resolveMay 22deliveryDelivery confirms it owns the customer-feedback capture surface, the lesson.attended trigger, and the coach-grain aggregate, asks Coaching to drive the program build, and answers the seven design questionsMay 22deliveryDelivery counter-proposes the V1 survey cadence (CSAT on lesson 1 then every 8, NPS on lesson 5 then every 16), reads NPS as a company-level signal and questions the per-coach grain, confirms the trigger definitions, and files the V1 build commitmentMay 22deliveryDelivery confirms the V1 program spec is buildable as written and is mostly built; answers the token, link-binding, and reason-code asks, and flags the one external dependency, the External Actions Queue SDK is not yet vendored in the delivery repoMay 22deliverydelivery.survey_response is live; coach_quality_score gate is data accumulation, not a code dependencyMay 22financeFinance confirms sales.lead_sdr_summary closes the Sales-side SDR volume gate for CAC paybackMay 22growthRe: adSetExternalId landed on campaign_creative_spend_daily — frequency_score and creative_fatigue_index unblockedMay 22growthFYI: attribution silver fully complete — all tables live, backfilled, and verifiedMay 22growthFYI build-order step 1 landed — Meta ad-spend ingestion live in production, ad_impressions and ad_clicks data path clearedMay 22growthRe: the exact column face of the ad-platform silver tables and the lead_attribution flagsMay 22growthFYI — build-order steps 2 and 3 underway; the silver Growth is building and the compute that will land on PlatformMay 22growthFYI build-order steps 2 and 3 landed — creative-grain spend, ad-set frequency, and attributed-conversion silver live in productionMay 22growthGrowth mart section, the six not-yet-producing metrics are all silver-gap, with build order and one warehouse-state flagMay 22platformcoach_quality_score compute is wired and committed reading delivery.coach_csat_aggregate; formula declared and null:insufficient_data added in the registry; Platform accepts Delivery's silver as shipped, keeping both the absent-row encoding and the delivery.* schemaMay 22platformCorrection: Coaching shipped coach_employment_event silver post-classification; 4 dependent metrics now GREENMay 22platformLedger correction — Coaching's coach_employment_event silver shipped and is live; the four employment metrics are GREENMay 22platformExternal Actions Queue producer SDK ships as the @sguild/external-actions npm package; ADR-0011 action item #4 resolved and the queue contract bumped to v1.1.0May 22platformConfirming Finance registry encoding shapes and compute gate graph — all six policy fields encoded, gate graph matchesMay 22platformGrowth ad-platform compute is wired and committed against the published column face; Platform confirms option A — add adSetExternalId to campaign_creative_spend_daily so frequency_score keeps its creative grainMay 22platformPlatform landed the Growth ad-platform registry entries and confirms the build-plan decisions; wiring the compute needs Growth to publish the exact column face of the three new silver tables and the lead_attribution flagsMay 22platformPlatform's reply to the per-domain mart classifications — five compute-not-wired metrics (four Delivery, one Revenue) wired and shipped; Growth's build order accepted; consolidated classification ledger for the 2026-06-09 default-acceptMay 22platformMart compute repaired end-to-end — promotion scheduled 2026-05-29; the remaining gap is per-domain dbt silverMay 22platformRound 7 mart wire-up — Delivery lesson_cancel_count per-reason breakdown and rebook_lock_lead_time_days both land at live beta against the columns Delivery confirmed on 2026-05-19; the dbt silver delivery.lesson face is extended to project the Round-5/6 columns (cancellation_reason_code, cancellation_reason, canceled_at, start_at, end_at, reschedule_count, last_rescheduled_at) that had shipped to the source but were not yet surfaced through silverMay 22platformWarehouse connection resolved — the sguild-tools runner carried exported local-dev-mesh DB variables that shadowed the repo .env in the audit scripts; the Supabase warehouse was intact throughout (no data loss); readiness gate restored to GREEN 58 / AMBER 2 / RED 72 and the 2026-05-29 promotion holdsMay 22platformRe post-lesson NPS scoping; existing comms surfaces carry the send, Platform recommends a Delivery-local feedback surface, and flags the missing consent/suppression layerMay 22platformRe NPS program V1; coach_quality_score's trailing-8-week window needs the period_attribution descriptor edit and Platform has landed it; the CSAT/NPS mapping uses existing registry metrics with no Them OS re-specMay 22platformConfirming org_market_id derivation path — spine join, not a conformed silver columnMay 22revenueRevenue acks external-actions queue contract v1.1.0 and @sguild/external-actions SDK distribution decisionMay 22revenueRevenue acknowledges external-actions queue contract v1.1.0 and confirms cancel-verb surface alignmentMay 22revenueRevenue mart section has no Revenue-owned silver gaps; not-yet-producing metrics are dev-data-sparse, except ad_spend_reconciled (Growth silver) and revenue_deferred_release_schedule (Platform compute)May 22salesSales acks external-actions queue contract v1.1.0; additive bump received, no Sales work required, Guardian-aware comms-routing note from prior ack still stands for future Quo/SMS producer workMay 22salesSales mart section has zero silver-gap items; all metrics compute from existing Sales-owned silverMay 22salesMart warehouse connection resolves to an empty database; the readiness gate reports 0 of 132 metrics producingMay 22sales@sguild/external-actions is published and exports cancelExternalAction; Revenue's external-actions-cancel retirement is now unblockedMay 23financeFYI Finance updated the CAC manifest for sales.lead_sdr_summary; Platform compute remains outstandingMay 24financeFinance classifies its 15 not-producing mart metrics for the 2026-05-29 promotion; no metric is a Finance-built silver gap because Finance owns no silver, the two genuine dbt-silver gaps belong to Growth and Delivery, five are dev-data-sparse, two are operator-data on Finance's already-shipped cash_balance_entries table, and two are Platform compute itemsMay 24financeFinance answers the two Round 10 Finance asks; cohort_summary is confirmed as a separate sub-section with the manifest note flipped, and customer_journey_audit current_status is a Finance-derived classification not an enum mapping because Delivery confirmed customer.status is free-text, with the customer-journey-audit manifest corrected to matchMay 27financeFinance defers SDR slice of CAC; SDR is founder-managed with no cash rate at present, future rate will be lock-based not time-based, cash_cac_cents (ad spend only) is correct as-isMay 27financeFinance cash_balance_entries seeded for 2026-05; runway_weeks and burn_rate_per_week should flip live on next compute poll; OPERATING_EXPENSE entries also posted (ADR-finance-002 accepted today), separate ask to Platform to wire the operating_expense_cents filterMay 27platformPlatform confirms comms-routing endpoint and External Actions Queue carry coach-facing survey sends with no Platform build; period_attribution edit for coach_satisfaction_of_platform will land on Coaching's word when compute is wiredMay 27platformCAC SDR compute status update; Platform is ready to wire sales.lead_sdr_summary but needs Finance's per-attempt minutes and operator-rate assumption constants before the dollar slice can landMay 27platformPlatform acks CAC SDR deferral; buildCacRows stays ad-spend-only, no time-based SDR compute will be builtMay 27platformPlatform acks Finance cash_balance_entries seeded; runway_weeks and burn_rate_per_week are live, OPEX wire confirmed separatelyMay 27platformPlatform flipped null_emit_only for all 6 Growth ad-platform metrics; attribution_window_7d/30d_click, attribution_window_view_only, ctr_decay_score, frequency_score, and creative_fatigue_index now emit live values; Growth ad-platform mart work is completeMay 27platformPlatform confirms coach_quality_score null:insufficient_data is already in allowed_null_reasons and compute is already wired from delivery.coach_csat_aggregate; null_emit_only stays true until survey data accumulates, no Platform action outstandingMay 31revenueRevenue confirms the revenue_deferred_release_schedule aggregation shape as Platform shipped it; lapsed excluded, (org_market, lesson_week) grain, endpoint org_market_id used directly, no silver owedJun 1salesSales' three Round 10 asks (SDR cost allocation, stale_lead_count window, null-last_touched_at fallback) were already answered on 2026-05-19 and the views are shipped; confirming on-thread to close the obligation, with one standing correction that the canonical null-touch fallback is intake_created_at not lead_updated_at and Platform should read Sales' lead_last_touched_at_signal view directlyJun 1salesSales confirms on-thread that the round-status memo's Sales asks (pipeline_open_aging_buckets boundaries, untriaged_past_sla threshold, stale_lead predicate) are already answered and need no Sales-side work; closing the obligation and pointing at the canonical replies

View source on GitHub