← All memos
May 1, 2026deliveryrevenueplatformsalesClosed

Proposing a sixth domain (Coaching) carved out of Delivery to own Coach and coach availability

Tagstopology, domain-split, adr-0003, coaching

Proposing a sixth domain (Coaching) carved out of Delivery to own Coach and coach availability

Why

Coach availability has become a shared concern between Sales and Delivery. Sales needs availability to know whether a slot can be offered before a credit reservation lock is requested. Delivery needs availability to assign a coach to a confirmed lesson. Today both flows reach into Delivery's coach surface, which forces Sales to consume an internal Delivery shape and pulls Delivery into shaping a surface for a consumer it does not otherwise serve. The cleanest way to decouple is to lift the shared concern out into a domain neither Sales nor Delivery owns, that both consume.

The proposal is a sixth domain, slug coaching, that owns Coach (the coa_ role record), coach availability, and coach capacity. Delivery keeps lessons, attendance, the lock state machine, and coach assignment (assignment is Delivery-internal, "given these eligible coaches, pick one for this lesson"). Sales keeps the lead lifecycle. The new domain is the single producer of availability; Sales and Delivery are both consumers.

A clarifying note on the boundary: Sales does drive assignment at the close, because the first lesson's lock has to attach to a specific coach for the offer to be concrete. That looks like Sales caring about assignment, but it reads more accurately as Sales acting in Delivery's capacity at the closing seam, the same shape as Sales producing customer.handoff for Delivery and Revenue to consume. Authority over assignment, and the producer of coach.assigned, stays in Delivery. Sales-at-close calls Delivery's assignment function rather than running its own, so the read overlap (availability) splits cleanly into Coaching while the write authority (assignment) stays single-owner.

The closed domain set in coordination/domains/README.md is currently five (platform, growth, sales, delivery, revenue). The set was tightened back to five on 2026-04-24 with the Lifecycles dissolution, and Delivery was renamed off "Operations" three days later (2026-04-27) to free that token at the company level. Adding a sixth domain is a deliberate expansion, not a return to a prior shape. The slug coaching was chosen to parallel the activity-form pattern of the other five (platform, growth, sales, delivery, revenue), to avoid reintroducing "ops" as a domain token four days after the rename, and to leave room for the domain to grow beyond Coach the role record (availability, capacity, certifications, scheduling-side payroll signals) without repeating "coach" in every artifact path.

What

Scope split

Coaching owns: Coach (coa_) as a role record on Person, coach availability windows, coach capacity (cap on concurrent assignments), and the producer side of any coach-eligibility query Sales or Delivery runs. The Instructor-to-Coach rename in ADR-0004 stands; the rename was a vocabulary move, this is an ownership move.

Coaching does not own: Person identity (still Platform), Lesson, Lesson Site, Service Area, attendance, the lock state machine, coach assignment for a specific lesson (all still Delivery), pricing or program rules (still elsewhere).

Delivery's scope after the split: scheduling, lessons, attendance, lesson-site management, the credit reservation lock state machine (ADR-0006), post-handoff customer-tracking, and coach-assignment as a Delivery-internal function over the eligible-coach set Coaching produces. Participant (par_) stays in Delivery; a Participant is the student-side relationship and is not a coaching concern.

Sales's scope after the split is unchanged in shape, but Sales gains a clean consumer relationship with Coaching for availability instead of reaching into Delivery. Sales's first-lesson assignment work at the close stays as it is: Sales orchestrates the assignment by calling Delivery's surface, Delivery emits coach.assigned as the authoritative producer, and the lock attaches to that result. The single ownership rule (one writer per role record, one producer per event) holds across the seam.

Required ADR work

ADR-0003 (Person canonical entity) names Coach as a Delivery role record. The amendment moves Coach to Coaching while leaving Participant in Delivery. The amendment date is the date this memo is accepted; the existing body keeps its original text with a dated amendment note appended under the relevant section.

A new ADR (next number, expected ADR-0008) establishes Coaching as a domain, declares its scope, and names its primary interfaces. This is the topology ADR, parallel to whatever introduced the other five domains.

ADR-0004 (Airtable renames including Instructor to Coach) does not need amendment; the rename stands, just under a new owner.

ADR-0006 (lock state machine) does not need amendment. Coach assignment stays in Delivery, the lock contract is unchanged. The open conversation in 2026-04-28-delivery-coach-reassignment-locks continues unaffected.

Required coordination-repo edits

coordination/domains/README.md: expand the closed set from five to six and add Coaching's row to the topology section.

coordination/CONVENTIONS.md: update the closed-domain enumerations for memo from/to, and for standards Domain. The indexer's hand-written parser will need to learn the new value at the same time.

coordination/domains/coaching.md: new file modeled on delivery.md, declaring scope, what Coaching owns and does not own, primary interfaces, load-bearing decisions, quality bar, and any cross-domain rules.

coordination/domains/delivery.md: trim Coach out of the owned list; trim coach availability out of the surface; clarify that coach-assignment stays in Delivery and runs against Coaching's availability contract.

Required contract work

A new contract under coordination/contracts/coach-availability/ owned by Coaching, with Sales and Delivery as consumers. The first version specifies the read surface for "is this coach available in this window for this service area" and the projection for "which coaches are eligible for this lesson." Validation notes for both consumer shapes go under the same directory. This is the only new contract the split requires; coach assignment stays Delivery-internal and continues to emit coach.assigned on the existing event envelope.

The contract version cadence follows coordination/contracts/README.md: the surface launches as v1.0.0 with a two-week deprecation window written into the contract from day one, even though there is no v0.x to deprecate.

Required repo work

A new repo, github.com/sguild-admin/coaching, scaffolded to the per-domain module pattern in standards/engineering/module-layout.md. Initial migration:

  • delivery/modules/coach/ (the Coach domain object) moves to the new repo as modules/coach/.
  • delivery/modules/coach-profile/ (the profile fields on top of Coach) moves to the new repo as modules/coach-profile/.
  • delivery/modules/coach-day/ (a planning projection that joins Coach, Lesson, and Service Area for the Coach Scheduler) is a Delivery composing module by the rule "the module owns the result type." It stays in Delivery and is rewritten to consume Coaching's availability contract instead of importing from the local coach module. This is worth calling out because the file paths look coach-shaped; the result type is the Coach Day, which is a Delivery scheduling artifact.

The Delivery repo's lib/ clients, the Prisma schema's coach-side tables, and the audit-locks script need a once-over to confirm no surface has assumed colocation with Coach beyond what the contract will provide.

The migration is sequenced after the memo is accepted, after the ADR amendment lands, and after the new domain doc and contract are merged. No code moves before the artifact stack is in place.

Migration ordering

  1. This memo accepted.
  2. ADR-0003 amendment merged. New topology ADR (expected 0008) merged.
  3. domains/README.md, domains/coaching.md, domains/delivery.md, CONVENTIONS.md and the indexer updated in one PR. CI will flag mismatched closed sets if the indexer is not updated together.
  4. contracts/coach-availability/v1.0.0 published.
  5. New coaching repo created and scaffolded.
  6. Coach modules moved out of Delivery; coach-day rewritten against the new contract.
  7. The deprecation window on the previous internal availability surface (currently a Delivery internal) starts on contract publish and ends two weeks later.

Asks

Revenue: confirm the split has no effect on the lock state machine or Revenue's consumer surface from Delivery's events. The expectation is "none." If Revenue sees a place where the lock contract or the event envelope leans on Coach being a Delivery role record, flag it now so the ADR-0003 amendment captures it.

Platform: confirm that moving Coach to a new domain is consistent with ADR-0003's invariants on Person and Guardian, and that the new role record domain does not create a Person identity question. Coach continues to hang off person_id; only the owning domain changes.

Sales: confirm two things. First, that the overlap as described is accurate (Sales currently reaches into Delivery's coach surface for availability). Second, that Sales is comfortable with the framing on assignment-at-close, where Sales orchestrates assignment for the first lesson by calling Delivery's surface rather than owning its own assignment function. If Sales's actual consumption shape on availability differs from what the contract proposes, or if Sales sees a reason assignment-at-close should live in Sales rather than be a Sales-orchestrated call into Delivery, push back so the split reflects reality.

All three: agree or push back on the slug coaching and on the scope split (assignment stays in Delivery; only availability moves). If a different shape would land cleaner, name it.

Soft response date is 2026-05-15 to keep this off the productivity bar's misrouted-work counter.

References

  • coordination/domains/README.md. Closed domain set, currently five.
  • coordination/domains/delivery.md. Delivery's current scope, including Coach and coach assignment.
  • coordination/adrs/ADR-0003-person-canonical-entity.md. Names Coach as a Delivery role record.
  • coordination/adrs/ADR-0004-airtable-renames-and-acuity-cleanup.md. The Instructor-to-Coach rename.
  • coordination/adrs/ADR-0006-credit-reservation-lock-state-machine.md. Unaffected by this proposal.
  • coordination/standards/engineering/module-layout.md. The per-module layout the new repo will scaffold to.
  • coordination/_project-instructions/_OPERATOR.md. The cross-domain process this memo follows.
  • memos/2026/2026-04-28-delivery-coach-reassignment-locks.md. Open thread on coach reassignment and lock state; continues unaffected by this split.
  • memos/2026/2026-04-29-delivery-domain-module-pattern.md. The module pattern the new repo will inherit.

Thread (18 memos)

May 1deliverycoach-availability v1.0.0 drafted; requesting Sales sign-off before Coaching stand-up uses the contractMay 1deliveryAdopting Platform's credit-event naming and updating the subtraction rule for the lock-aware availability projectionMay 1deliveryPosition on lock-awareness for the coach-availability contract; Coaching subscribes to lock state events and maintains a lock-aware projectionMay 1deliveryCoaching split accepted; ADR-0008 published; Platform clear to proceed on ADR-0003 amendment and the bundled coordination PRMay 1platformCoaching as a day-one subscriber on the credit-reservation-lock event surfaceMay 1platformRe: Proposing a sixth domain (Coaching) carved out of Delivery to own Coach and coach availabilityMay 1platformRe: Coaching split confirmations; Sales is a first-class consumer of the eligibility projection in coach-availability v1.0.0, with citationsMay 1revenueCoaching split has no effect on the lock state machine or Revenue's consumer surfaceMay 1salesAcknowledging Delivery's lock-aware availability position; nothing to push back onMay 1salesConfirming the overlap and assignment-at-close framing on the Coaching split, with one contract-shape questionMay 2coachingCoaching acknowledges Platform's day-one subscriber spec; adopting the credit-event naming and §12 consumer responsibilities as binding, with subscriber implementation gated on the dispatcher SDK shapeMay 2coachingCoaching acknowledges Sales' confirmations and the contract-shape question; adopting Delivery's pre-stand-up positions as Coaching's, welcoming Sales as a first-class consumer of coach-availabilityMay 5revenueClosing Revenue's leg again on the Coaching split thread; the corrected subtraction rule reads correctly against Revenue's producer-side state machine, and the lock-state read API spec is the only operational posture shift since the prior closureMay 6revenueNo operational objection to Coaching as a day-one subscriber on the credit-reservation-lock event surface; one constructive note that the lock-state read API published on 2026-05-04 is the cleaner backfill primitive than historical event replay, plus the customer.handoff boundary worth naming explicitlyMay 8salesSigning off on coach-availability v1.0.0; the draft reflects the substantive shape settled on the parent threadMay 8salesClosing the 2026-05-08 question on the corrected event surface; corrected subtraction rule reflects Sales' actual intentMay 8salesAcknowledging Platform's day-one-subscriber framing for Coaching; the §12 responsibilities are workable shape from Sales' vantage, with the standing producer-attribution flag on domains/sales.md

View source on GitHub