Delivery 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 questions
Summary
Coaching's 2026-05-22-coaching-post-lesson-nps-program-scoping asks Delivery to confirm whether it will own the customer-feedback capture surface and the lesson.attended-triggered send, and to agree with Coaching on the shape of the coach-grain aggregate that coach_quality_score reads. Delivery confirms ownership of the three pieces that genuinely sit inside Delivery: the lesson.attended trigger, the customer-feedback capture surface (it holds customer-grain rows and cannot leave the Delivery customer firewall), and the customer-identity-stripped coach-grain aggregate. Delivery does not own the program, the instrument, or the send path, and Delivery has no near-term roadmap room to build the surface as a Delivery initiative. Delivery's recorded position from 2026-05-22-delivery-mart-section-classification (the surface is product work, not on the near-term roadmap) has not changed; what changed is that Coaching now sponsors the program, so Delivery asks Coaching to drive it. This reply confirms ownership in principle, answers the seven design questions where Delivery has the operational facts, proposes the coach-grain aggregate shape, and names what has to be settled before Delivery can file a dated build commitment. Consistent with the parent's scoping-open discipline, this reply carries no dates and no commitments.
What Delivery owns, and what Delivery asks Coaching to drive
Three pieces of this program sit inside Delivery and are not delegable.
The lesson.attended trigger. lesson.attended is a Delivery event and only fires for a lesson that was actually delivered. Reacting to it to initiate a post-lesson prompt is Delivery orchestration. Delivery owns it.
The customer-feedback capture surface. The survey responses are customer-grain rows. Customer identity stays inside the Delivery customer firewall, exactly as customer_satisfaction_of_coach was specified, so that no customer-grain rows leave Delivery. A surface that holds customer-grain rows has to live where the firewall is enforced, which is Delivery. Delivery owns the capture surface of record: its schema, its contract, and the firewall boundary. This ownership is not optional and Delivery is not asking to hand it off.
The coach-grain, customer-identity-stripped aggregate. Only Delivery can strip customer identity correctly, because only Delivery holds the identity to strip. The projection from customer-grain capture rows to a coach-grain aggregate is a Delivery firewall responsibility. Delivery owns producing that aggregate; Coaching reads it.
What Delivery does not own, and asks Coaching to drive, is the program itself. The instrument choice, the cadence policy, the survey copy and any one-tap form content, and the coach_quality_score formula are Coaching's, not Delivery's. "Delivery owns the surface" is not the same as "Delivery builds the program on Delivery's schedule." Delivery's roadmap position is unchanged from 2026-05-22-delivery-mart-section-classification: a customer-feedback capture surface is product work and is not on Delivery's near-term roadmap. Coaching sponsoring the program does not add Delivery engineering capacity. So Delivery confirms ownership in principle and will file a dated build commitment once the program is scoped, but Delivery is not committing a date in this round. That is consistent with the parent memo's own statement that commitments follow once ownership is confirmed. Delivery asks Coaching, as sponsor, to carry the program-level and product-layer decisions and to treat Delivery's piece as a scoped, slotted dependency rather than an open-ended Delivery initiative.
The send path is Platform's, as the parent memo already says. Delivery agrees. Delivery also accepts the program scope as the parent draws it: a post-lesson, customer-as-respondent instrument, with coach_satisfaction_of_platform left out as a different instrument and audience for a later phase.
The seven design questions
The parent asks for Delivery and Platform input on seven questions. Delivery's input follows, in the parent's numbering.
Instrument. Delivery does not have a stake in NPS versus CSAT versus a thumbs prompt; that is a Coaching and product call. Delivery has one hard requirement: whatever is chosen must reduce deterministically to a rate, because
customer_satisfaction_of_coachiskind: rate. Delivery's design recommendation is that the capture surface store the raw response and a normalized rate side by side, so the instrument can be retuned later without a surface migration. Delivery asks Coaching to settle the instrument early, because the aggregate columns, covered in the next section, depend on it.Response capture. Delivery recommends the one-tap link to a short form over parsing an SMS reply. Free-text SMS parsing is fragile and turns attribution into guesswork; a one-tap link can carry the rated lesson id as a signed parameter, which makes attribution exact and removes the parsing step entirely. The web form is a small surface and, if question 5 resolves to a Platform survey service, it lives there. Delivery's only constraint is that the response landing in the capture surface carries the lesson id, the coach id, and a verifiable response-to-lesson binding.
Cadence and fatigue. Delivery has the operational facts here. Swim lessons are heavily weekly-recurring; a per-lesson prompt means a survey every week to the same guardian, which is a real fatigue risk and will depress response rates over time. Delivery recommends a sampled cadence with a per-guardian cooldown rather than every-lesson. Delivery can supply lesson-frequency distributions to help Coaching pick a sampling rate and a cooldown window. The cadence policy is Coaching's to set; Delivery will implement a cooldown guard in the trigger so the policy is enforced at send time and not left to the comms layer.
Guardian routing and consent. The endpoint-capability question, whether Platform's Guardian-aware comms endpoint can carry a survey-class message, is Platform's to answer on this thread, not Delivery's. Delivery confirms the routing pattern already exists: Delivery routes lesson-day reminders and schedule changes through Platform's Guardian-aware endpoint today, per Delivery's comms-routing rule, and swim lessons skew to minor participants so most prompts will address a Guardian. Delivery's position on consent and suppression: a survey is lower-priority than operational lesson comms, so a survey-class send must be its own suppressible message class, and if a Guardian is in any suppression state the survey send should be dropped silently rather than queued. Delivery asks Platform to confirm the endpoint can express a distinct, independently suppressible survey class.
Surface home. Delivery leans toward a Delivery-local capture table. The firewall constraint is absolute: customer-grain survey rows cannot leave the Delivery trust boundary. A Delivery-local table satisfies that by construction. A shared Platform survey service is only viable if Platform can guarantee customer-grain rows are partitioned so they never leave Delivery's trust boundary, and as the parent notes, a shared service likely to serve more than this one program is probably an ADR rather than a memo. Delivery's recommendation is to default to Delivery-local for the capture surface unless Platform wants to make the shared-service case, in which case Delivery will engage on the ADR and the firewall-partitioning requirement becomes a hard ADR constraint. The size of Delivery's build depends materially on this answer, which is why Delivery cannot give a build size yet.
Coach attribution. Delivery confirms the rated lesson always has a resolved coach at the time the prompt fires.
lesson.attendedonly fires for a delivered lesson, and a delivered lesson necessarily had a coach present;coach.assignedresolves before delivery. One caveat Delivery wants on the record: when a lesson's coach was reassigned or substituted, the rating must attach to the coach who actually delivered the lesson, which is the assignment effective atlesson.attended, not an earlier assignment. Delivery will expose the delivering-coach identity on the binding that reaches the capture surface so attribution is unambiguous.Minimum-N. Delivery agrees the coach-grain rollup needs a
null:insufficient_datathreshold so a coach with one or two ratings is not scored. Delivery will place the guard inside the aggregate it produces, so no under-threshold coach-grain row is ever exposed to Coaching. For consistency with the existing Delivery-section guards (the< 5guards described in2026-05-22-delivery-mart-section-classification), Delivery recommends the same< 5threshold, but the exact N is Coaching's call sincecoach_quality_scoreis a Coaching metric. Coaching should file the N it wants.
The coach-grain aggregate shape
This responds to the joint ask. Delivery proposes the customer-identity-stripped aggregate as one row per (tenant_id, coach_id, period), carrying coach_id, period, response_count (the N for the minimum-N guard), and mean_rate (the normalized rate from question 1). No customer_id, no participant_id, and no lesson_id appears in the aggregate; the firewall is enforced by the projection, not by a downstream filter. coach_quality_score declares its formula over mean_rate and respects response_count against the minimum-N threshold.
Two things have to be settled before the aggregate columns are final, and both are Coaching's call. First, the instrument (question 1): if Coaching picks NPS, Coaching may want a promoter, passive, and detractor breakdown in the aggregate, which adds three count columns; CSAT or a thumbs prompt would not. Delivery is happy to carry the breakdown if coach_quality_score needs it, but Delivery will not add columns the metric does not read. Second, the period grain: Delivery needs to know whether coach_quality_score reads a fixed calendar period or a rolling window, because that determines whether period is a period key or a window-anchored key. Delivery asks Coaching to answer both so the aggregate shape can be frozen and Delivery and Coaching can record the agreement on this thread.
Asks
To Coaching. Confirm the instrument so the capture-surface schema and the aggregate columns can be frozen. Confirm whether coach_quality_score reads mean_rate only or also needs a promoter, passive, and detractor breakdown, and whether it reads a fixed period or a rolling window. File the minimum-N value you want. Own the program-level and product-layer decisions (instrument, cadence policy, survey copy, the coach_quality_score formula) and treat Delivery's surface-and-trigger work as a scoped dependency to be slotted, not an open-ended Delivery initiative.
To Platform. Answer question 4 (whether the Guardian-aware comms endpoint can carry a distinct, independently suppressible survey-class send) and question 5 (a Delivery-local capture table versus a shared Platform survey service, and whether a shared service is an ADR). Delivery's recommendation on question 5 is Delivery-local; if Platform wants the shared-service path, Delivery will engage on the ADR with the firewall-partitioning constraint as a hard requirement.
From Delivery. Delivery confirms ownership of the lesson.attended trigger, the customer-feedback capture surface, and the coach-grain customer-identity-stripped aggregate. Delivery commits no date in this scoping round, consistent with the parent memo. Delivery will file a dated build commitment once the instrument (question 1) and the surface home (question 5) are settled, since those two answers set the size of the build.
Next
Once Coaching confirms the instrument and the coach_quality_score read shape, and Platform answers the send-path and surface-home questions, Delivery and Coaching record the frozen aggregate shape on this thread and Delivery files its build commitment. If question 5 resolves to a shared Platform survey service, that step is an ADR and Delivery will participate. The eventual capture-surface spec, whether a Delivery contract or an ADR, will carry the analytics-questions section required for analytics-facing artifacts; this reply does not, because it is a coordination response and proposes no model itself.
References
- Parent memo:
2026-05-22-coaching-post-lesson-nps-program-scoping - Thread root:
2026-05-19-platform-mart-100-percent-deployment-per-domain-asks - Delivery's recorded position on the customer-feedback surface:
2026-05-22-delivery-mart-section-classification, Group 3 - Them OS disposition splitting
coach_nps:2026-05-19-platform-mart-them-os-dispositions-landed - Delivery comms-routing rule and the
lesson.attendedproducer:coordination/domains/delivery.md - Registry entries for
customer_satisfaction_of_coachandcoach_quality_score:platform/lib/mart/registry.ts