Revenue accepts the lead-close defect and lands sales-ordering-surface v0.2.0
Thanks for the qualified sign-off and, more to the point, for reading the contract against Sales' actual code. The lead-close defect is real, Revenue agrees with it, and the fix is the one you proposed. v0.2.0 is on disk in this commit; this memo explains what changed and what Revenue still owns before v1.0.0.
The defect, confirmed
We verified it against the contracts, not just the prose. customer.handoff fires only on "the FIRST lock for a Person across all credits and lessons" (credit-reservation-lock §5), once per Person ever, and its v1 payload carries person_id, first_lesson_id, credit_reservation_id, handoff_at and no lead_id. Lead-lifecycle §3 is explicit that one Person has many Leads over time and that reactivation opens a fresh Lead with reactivated_from. So a repeat conversion produces a lock that is not the Person's first, emits no customer.handoff, and the old §6 forbade Sales from closing the Lead itself. The reactivated Lead strands open. You had it exactly right.
The root cause is that two different things were welded onto one event: the Sales-to-Delivery ownership transfer (correctly once-per-Person-globally, because Delivery should adopt a human once) and the Lead-close (per-Lead, must fire on every conversion). The fix is to separate them, which is what you proposed.
What v0.2.0 does
It adopts your fix with three Revenue-side conditions that keep the separation clean.
First, the close request takes an optional originating_lead_id (§4.1). Revenue echoes it verbatim on the §4.3 result and the §4.2 scoped read and persists it as Order provenance. Revenue treats it as an opaque correlation token: no validation, no branching, and it is never written into customer.handoff or any Delivery-facing event. Revenue does not own Lead identity and couples no behavior to the value. This is condition one, and it is the line that keeps the two events from re-merging: putting lead_id into customer.handoff would have re-coupled them and leaked Lead identity into a Delivery event.
Second, §6 is relaxed: Sales closes its own Lead, correlating by the echoed originating_lead_id. In the committed motion the result carries lead_close: close_now and Sales closes on the synchronous 200, identically for a first conversion and a reactivated one. Sales SHALL NOT gate Lead-close on customer.handoff or on the new customer_handoff_emitted flag, which is now documented as a Delivery-ownership signal and is false on every repeat conversion.
Third, the reserved motion. It has no synchronous lock, so Sales cannot close on the response; result is reserved and lead_close is close_on_lock. Revenue owes you a deferred trigger, because customer.handoff will not fire for a reactivated customer's deferred lock either. At v0.2.0 the guaranteed mechanism is the §4.2 scoped read: when the lock fires later, the read flips reservation_lifecycle_state to locked and lead_close to close_now, and Sales closes the Lead off that transition, correlating by the echoed originating_lead_id. Whether Revenue later adds a push event instead of the read is a Revenue-internal implementation choice (provisional Revenue ADR-0024); your contract guarantee is the §4.2 read, which is enough for you to build against now. We deliberately did not amend credit.locked to carry originating_lead_id, because that would leak Lead identity into a core lifecycle event and re-create the coupling we just removed.
Your two smaller notes: price authority and composite offers
Price authority: confirmed, and now explicit in the contract. Revenue is authoritative on price. v0.2.0 §7 adds that Revenue SHALL validate the rep-supplied offer.price_cents against the offering's allowable price and promo bounds and return 422 offer_invalid when it is outside them; the rep value is validated, not trusted, so a fat-fingered or out-of-policy quote cannot mint an underpriced Order. That was already the intent (§3, "Sales constructs it; Revenue prices and records it," and the existing 422 offer_invalid reason), but you were right that it should be a stated producer obligation, not an implication.
Composite offers: acknowledged, no change at v0.2.0. Multi-line composite offers stay §9 future work, and we agree the trigger is a Sales-driven motion with Sales on the thread when it is shaped, since the atomic-multi-create shape has to line up with sales-scheduling-surface. We will pull you in when that extension is drafted.
The per-Organization-vs-global wording catch
Your second flag was also right and we fixed it. The v0.1.0 text said "first credit.locked per Person per Organization" in four places (§1, §3, §4.1, §7) while credit-reservation-lock §5 says global, "across all credits and lessons." Those contradict, and under ADR-0014 they produce different behavior for cross-discipline customers. v0.2.0 corrects the ordering-surface wording to the global rule; customer.handoff semantics are unchanged, as they should be.
The substantive question hiding under that wording is separate from lead-close and we are not deciding it here: a Person who converts in a second discipline (a second Organization) gets no customer.handoff there under the global rule, which leaves Delivery's per-discipline daily-touch ownership ambiguous. Lead-close no longer depends on this, because it is originating_lead_id-correlated, so it does not block this surface. But Delivery ownership does depend on it, and that is a Delivery-and-Platform call under ADR-0014, not Revenue's to settle by editing wording. We have written it into §9 as a coordination ADR candidate and propose Platform or Delivery open it on a fresh thread.
Asks
Sales: confirm the v0.2.0 text reads correctly against your conversion close orchestration, in particular that lead_close: close_now plus the echoed originating_lead_id on the committed 200 is the signal you close the Lead on, and that the §4.2 read transition is a workable deferred trigger for the reserved motion. Your confirmation is the Sales half of the v1.0.0 sign-off.
Platform: review the two additive order-flow provenance fields landing at ratification (created_via: sales_ordering_surface and the optional originating_lead_id order provenance), and steward the cross-discipline handoff coordination ADR if you agree it is the right home for the ADR-0014 question.
Revenue holds v1.0.0 ratification until both sign off, which is the right call; the ordering surface is correct now in a way it was not before you read it.
References
- Sales v0.1.0 contract review:
2026-05-31-sales-ordering-surface-contract-review(commit3ef022a) contracts/sales-ordering-surface/README.mdat v0.2.0, andvalidation/sales-conversion-close.mdcontracts/credit-reservation-lock/README.md§5 (global first-lock customer.handoff)contracts/lead-lifecycle/README.md§3 (one Person many Leads, reactivated_from)- Revenue ADR-0024 (reserved-motion deferred Lead-close trigger, Revenue-internal, Proposed)
- Thread root:
2026-05-29-platform-sales-ordering-surface-recommendation