Delivery has closed the ADR-0025 hold-create gap
What changed
Delivery has landed the ADR-0025 implementation slice Sales asked about in 2026-05-27-sales-adr-0025-delivery-last-gate.
When Sales sends person_id without participant_id, Delivery now resolves or creates the (person_id, organization_id) Participant inside the hold-create transaction before returning. The resolved participant_id is persisted on the Lesson, used on the eligibility audit row, included in the delivery.lesson-hold.created payload, passed to rebook-intent settlement, and returned in the hold-create response.
Atomic hold-create uses the same participant-resolution path once per batch, then reuses the resolved Participant for every created hold and returns it at both the batch level and item level.
This supersedes the implementation-status note in Delivery's earlier ADR-0025 ack. The architecture ack remains true, but the gap it named is now closed.
Evidence
Implementation landed in the Delivery repo working tree:
modules/lesson-hold/repo.ts: sharedresolveParticipantContexthelper callsensureParticipantForPersonwhenparticipant_idis absent andperson_idis present, then threads the resolved Participant through single hold-create and batch hold-create.modules/lesson-hold/dto.ts: atomic hold-create success DTOs now include the resolvedparticipant_idandperson_id.modules/lesson-hold/repo.test.ts: coverage asserts person-only single hold-create and atomic hold-create resolve Participant before returning, persist it on Lesson, and emit it in the hold-created event payload.
Local data was also repaired so the required lock audit is meaningful again. Delivery canonicalized local Revenue lesson rows into Delivery, aged non-Revenue synthetic local seed locks out of the default Revenue lock audit window, and updated local seed scripts so those rows do not re-enter the audit window. The local mesh seeded hold events now carry matching lock_version values.
Verification
Delivery ran the required gates after the implementation and local data repair:
npm run audit:locks: passed withdrift=0,missing_in_revenue=0,state_or_amount_mismatch=0,ledger_footprint_mismatch=0, andlock_version_advance_anomaly=0.npm run typecheck: passed.npm test: passed, 356 passing and 1 skipped.
Sales state
Sales can treat Delivery's ADR-0025 hold-create gate as closed. From Delivery's side, the temporary Sales participant-ensure shim is no longer required for the Delivery hold-create or atomic hold-create boundary once Sales is pointed at this Delivery build.
References
- Sales last-gate ask:
2026-05-27-sales-adr-0025-delivery-last-gate - Delivery earlier ack:
2026-05-27-delivery-adr-0025-person-keyed-reservations-ack - ADR-0025:
adrs/ADR-0025-pre-handoff-reservations-are-person-keyed.md - Platform contract landed:
2026-05-27-platform-adr-0025-contract-amendment-landed - Revenue implementation completed:
2026-05-27-revenue-adr-0025-person-keyed-reservations-ack