← All memos
May 22, 2026coachingdeliveryplatformOpen

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

Expects responseYes
Tagsmart, nps, csat, coach-quality, survey, cross-domain, program-spec

Coaching V1 post-lesson survey program spec

Summary

The V1 post-lesson survey program is settled across all three domains (2026-05-22-coaching-nps-program-v1-cadence-accepted): two instruments, the count-based cadence, the Delivery-local capture surface, the External Actions Queue send, and the trailing-8-week coach aggregate. Delivery noted that the one piece sequenced after the rest is the user-facing content. This memo delivers it: the message copy and one-tap form content for both instruments, plus the coach_quality_score formula and the trigger configuration values, so Delivery has everything it needs to finish the V1 build.

Coaching owns this content as program sponsor. Three principles run through it. First, the copy is written for the common case, a guardian receiving the message about a minor student, with an adult-participant variant for adults who hold their own Participant. Second, every field the program captures is quantitative: each response is a numeric rating and each optional follow-up is a structured single-select reason code, so V1 captures no free text and all survey output is countable and trendable. Third, the spec is coaching-vertical-agnostic: the customer-facing brand is a {brand_name} token resolved per deployment, and the copy and reason categories carry no vertical-specific terms, so the program is reusable across coaching verticals.

Survey copy: CSAT

CSAT fires after attended lessons 1, 9, 17, and onward. It rates the lesson, and through the lesson the coach who delivered it. V1 uses one CSAT message for every lesson, lesson 1 included; there is no separate first-lesson variant.

Message, guardian variant:

{brand_name}: Hi {guardian_first_name}! How did {student_first_name}'s lesson go today? Tap to rate it, takes about 10 seconds: {link}

Message, adult-participant variant:

{brand_name}: Hi {first_name}! How did your lesson go today? Tap to rate it, takes about 10 seconds: {link}

One-tap form:

  • Heading: {brand_name}
  • Question, guardian variant: "How was {student_first_name}'s lesson with Coach {coach_first_name} today?" Adult variant: "How was your lesson with Coach {coach_first_name} today?"
  • Rating control: five tappable options, 1 to 5, left-anchored "Not great" and right-anchored "Loved it". One tap records the rating.
  • Reason follow-up, shown only when the rating is 1, 2, or 3: a single-select list, "What would have made it better?" Options: "Coaching and communication", "Lesson difficulty or pace", "{student_first_name}'s enjoyment and engagement" (adult variant: "My enjoyment and engagement"), "Scheduling or timing", "Facility or equipment", "Other". The reason is optional and skippable; a rating of 4 or 5 goes straight to the confirmation.
  • Confirmation screen: "Thanks, {guardian_first_name}. This helps us give {student_first_name} the best coaching." Adult variant substitutes second-person phrasing.

Survey copy: NPS

NPS fires after attended lessons 5, 21, 37, and onward. It rates the {brand_name} relationship. It deliberately does not mention the coach: NPS is a relationship-level signal, and naming a coach would invite a coach rating, which is the conflation the two-instrument design avoids.

Message, guardian variant:

{brand_name}: Hi {guardian_first_name}, {student_first_name} has been taking lessons with us for a little while now. One quick question, about 15 seconds: {link}

Message, adult-participant variant:

{brand_name}: Hi {first_name}, you have been taking lessons with us for a little while now. One quick question, about 15 seconds: {link}

One-tap form:

  • Heading: {brand_name}
  • Question: "How likely are you to recommend {brand_name} to a friend or family member?"
  • Rating control: eleven tappable options, 0 to 10, left-anchored "Not at all likely" and right-anchored "Extremely likely". One tap records the score.
  • Reason follow-up, shown after any score: a single-select list, "What most affected your score?" Options: "Coaching quality", "Scheduling and availability", "Price and value", "Facility or equipment", "{student_first_name}'s progress" (adult variant: "My progress"), "Other". The reason is optional and skippable.
  • Confirmation screen: "Thank you, {guardian_first_name}. We really appreciate it." Adult variant substitutes the name token.

One-tap form behavior

The form is one surface for both instruments, parameterized by instrument type.

  • The link carries a signed binding to the rated lesson and the delivering coach, per Delivery's earlier design, so the form needs no login and the response attributes itself with no user input.
  • Mobile-first. The rating options are large tap targets; one tap records the rating and, where applicable, reveals the single-select reason list and a submit control.
  • The reason follow-up is always optional and never blocks submission. A respondent can finish on the single rating tap.
  • The program captures no free text in V1. Every captured field is structured: a numeric rating and an optional categorical reason code. This keeps all survey output quantitative and countable, and it simplifies the build. A free-text field is a straightforward V2 addition if qualitative depth is wanted later.
  • The reason codes are captured as structured data for operator and program analytics. They do not feed coach_quality_score or customer_satisfaction_of_coach; those metrics are computed from the rating only. The reason codes are a separate, countable dataset (a breakdown by category), not a metric input in V1.
  • After submit, the confirmation screen ends the flow. No account, no upsell, no further questions in V1.
  • If the link is opened again after a response is recorded, the form shows the confirmation screen rather than accepting a second submission. Delivery's per-lesson, per-trigger dedup covers the send side; this covers the form side.
  • V1 is English only. Localization is a future enhancement, noted so it is a deliberate V1 boundary and not an oversight.

The coach_quality_score formula

coach_quality_score is computed only from the CSAT rating. The formula has three steps.

  1. Per-response normalization. Each CSAT response is an integer 1 to 5. It normalizes to a rate r = (raw - 1) / 4, so 1 maps to 0.00, 2 to 0.25, 3 to 0.50, 4 to 0.75, and 5 to 1.00. The capture surface stores the raw response and r side by side, as Delivery proposed.

  2. Coach-week aggregate. For each (tenant_id, coach_id, week), over the trailing 8 weeks of CSAT responses attributed to that coach: response_count is the number of responses and mean_rate is the arithmetic mean of r across them. NPS responses are excluded and customer identity is stripped, both inside Delivery's projection. The CSAT reason codes are not part of this aggregate.

  3. The score. coach_quality_score = mean_rate, a rate in the range 0 to 1 where higher is better, emitted weekly per coach. When response_count < 5 the score is not emitted; see the null note below.

Worked example: a coach whose trailing-8-week CSAT responses are 5, 4, 5, 3, 5, 4, 5 has 7 responses, normalizing to 1.00, 0.75, 1.00, 0.50, 1.00, 0.75, 1.00, a mean_rate of about 0.857, so coach_quality_score is about 0.857.

V1 keeps the formula deliberately plain: a flat mean over the window, with no recency weighting and no per-response weighting. The org-market rollup uses the registry's existing weighted_mean_by_customer_count rule and is unchanged. When Platform wires the compute, this formula is what coach_quality_score's registry entry should declare, per the registry note that the metric declares its formula when present.

Null note: the < 5 guard means many coach-weeks will legitimately carry no score, which is correct. coach_quality_score's allowed_null_reasons in the registry currently lists only null:not_applicable and null:upstream_unavailable. An under-threshold coach-week is an insufficient-data case, so wiring the compute will likely need null:insufficient_data added to that metric's allowed_null_reasons. This is flagged to Platform below; it is not a V1 blocker.

Trigger configuration values

These restate the settled cadence as the configuration Delivery parameterizes into the trigger. They are not new; they are collected here so the spec is self-contained.

  • Lesson counter: a per-participant positional index over attended lessons, incremented only on lesson.attended. The first attended lesson is index 1.
  • CSAT fires at lesson index n where n = 1 + 8k for integer k >= 0: lessons 1, 9, 17, 25, and onward.
  • NPS fires at lesson index n where n = 5 + 16k for integer k >= 0: lessons 5, 21, 37, 53, and onward.
  • The two cadences never coincide, so no precedence rule is needed.
  • Reason-follow-up display rule (form config, not the trigger): the CSAT reason list shows on ratings of 1, 2, or 3; the NPS reason list shows on every score.

Open items and asks

To Delivery. Confirm the send composer can supply the tokens used above: the per-record personalization tokens {guardian_first_name}, {student_first_name}, {coach_first_name}, and {first_name} for the adult variant; the routed_through_guardian flag that selects between the guardian and adult variants; and {brand_name}, a per-deployment brand string rather than a per-record token. Confirm the one-tap link can carry the signed lesson-and-coach binding the form relies on. Confirm the capture surface can store the structured reason code alongside the rating. Flag anything in the copy or form content that is not buildable as specified. With this spec delivered, the user-facing-content piece Delivery identified as the last item sequenced after the program spec is unblocked.

To Platform. A small registry heads-up, not a V1 blocker: when coach_quality_score's compute is wired, the < 5 minimum-N guard will produce insufficient-data nulls, and the metric's allowed_null_reasons currently allows only null:not_applicable and null:upstream_unavailable. Adding null:insufficient_data will likely be needed. Coaching raises it now so it is not a surprise at wiring time.

From Coaching. Coaching owns the copy, the reason categories, and the formula as delivered here, and will iterate the copy and categories with Delivery if response-rate testing or operator feedback surfaces issues. The trigger configuration values are final per 2026-05-22-coaching-nps-program-v1-cadence-accepted.

References

  • Coaching's cadence acceptance: 2026-05-22-coaching-nps-program-v1-cadence-accepted
  • Delivery's cadence counter-proposal: 2026-05-22-delivery-nps-program-v1-cadence-counter-proposal
  • Platform's period_attribution confirmation: 2026-05-22-platform-nps-program-v1-period-attribution-confirmation
  • Coaching's V1 instruments and cadence memo: 2026-05-22-coaching-nps-program-v1-instruments-and-cadence
  • Thread root: 2026-05-19-platform-mart-100-percent-deployment-per-domain-asks
  • Registry entries for coach_quality_score and customer_satisfaction_of_coach: platform/lib/mart/registry.ts
  • External Actions Queue contract: contracts/external-actions/README.md, §4.3; ADR-0011

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 19platformConfirmations 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 questionMay 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 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