Delivery confirms acceptance of customer_rebooking on hold-cancel for Sales' pre-handoff trial rebooking v1
What Sales asked
Sales' 2026-05-26-sales-pre-handoff-trial-rebooking-v1 and the accompanying validation note at contracts/sales-scheduling-surface/validation/sales-pre-handoff-trial-rebooking.md ask Delivery to confirm two things. First, that accepting customer_rebooking on hold-cancel is sufficient for the v1 cancel-release-recreate sequence. Second, that the existing producer-side rejection rules (stale lock_version, terminal states, cross-organization access, confirmed-state cancellation without the §4.4.1 refund context) remain in force as the production guarantees Sales can rely on.
Delivery's position
Confirmed on both. No Delivery code change is required for v1.
The customer_rebooking hold-cancel reason is already shipped. modules/lesson-hold/schema.ts (line 96) lists it in HoldCancelReasonCode, modules/lesson-hold/dto.ts (line 45) mirrors it on the DTO side, and a unit test at modules/lesson-hold/schema.test.ts:104 ("accepts customer_rebooking for pre-handoff Sales rebooking") asserts schema-level acceptance. The route at modules/lesson-hold/routes/hold-cancel.routes.ts (annotated sales-scheduling-surface §4.4) wires Sales' inbound reason_code straight into the repository's transactional cancel path, which publishes delivery.lesson-hold.cancelled inside the same transaction as the row write per ADR-0009.
The producer-side rejection rules are also as Sales' validation note expects. modules/lesson-hold/repo.ts returns 409 lock_version_stale when the inbound lock_version does not match the current row, 409 lock_already_terminal when the lock is already in a terminal state (consumed or released), and the existing organization-scoping and confirmed-state checks apply unchanged. The confirmed-state path requires the §4.4.1 refund-context shape (refund.reason_code plus amount fields on the cancel-with-refund variant) to proceed; absent that context, a confirmed lock cannot be cancelled.
What Delivery does NOT do
Per the validation note's producer-expectations section, Delivery does not inspect Sales' Lead lifecycle, the lead role record, Sales' durable booked-lesson projection, or customer.handoff processing logs. Those checks are Sales' consumer obligations and Sales' validation note names them as such (steps 1 through 4 of the required Sales checks). Delivery owns lesson-hold validation; Sales owns Sales-side workflow validation, including the pre-handoff gate and the inspect-then-cancel discipline that supplies the fresh lock_version token.
Sequence Delivery confirms is operable today
For an allowed pre-handoff trial rebooking, Delivery's surface today supports the validation note §3 sequence steps 2 and 6 as-described. Step 2 (cancel the old Delivery hold with reason_code=customer_rebooking and the fresh lock_version) routes through the existing hold-cancel endpoint. Step 6 (create the replacement Delivery hold) routes through the existing composite-hold-create endpoint. Sales' inspect-then-cancel pattern (fresh §4.2 hold-inspect, then cancel with that response's lock_version) is the documented happy path; nothing about it is novel for Delivery.
No commitment created
This memo creates no Delivery commitment. The v1 work is on Sales' side, and Sales' proposal memo names its own implementation commitments. Delivery's surface stands as-shipped and Sales can proceed.
References
- Sales' proposal:
2026-05-26-sales-pre-handoff-trial-rebooking-v1 - Sales' validation note:
contracts/sales-scheduling-surface/validation/sales-pre-handoff-trial-rebooking.md - Delivery's hold-cancel schema:
modules/lesson-hold/schema.ts(Delivery repo) - Delivery's hold-cancel route:
modules/lesson-hold/routes/hold-cancel.routes.ts(Delivery repo) - Delivery's hold-cancel repository (rejection rules):
modules/lesson-hold/repo.ts(Delivery repo) - Sales-scheduling-surface contract (v1.9.0):
coordination/contracts/sales-scheduling-surface/README.md - ADR-0009 (producer-transactional dispatcher):
coordination/adrs/ADR-0009-producer-transactional-dispatcher.md