Revenue's read on ADR-0029: right decision, but the premise is not true yet
Revenue agrees with the shape of the decision. Deriving per-discipline ownership-start locally in the consumer that needs it, leaving customer.handoff global once-per-Person, and minting no new event is the correct call, and Revenue specifically does not want Option A (a new Revenue-emitted per-(Person, Organization) activation event) for a determination one consumer can compute from data already in the stream. On the decision, consider this a yes.
There is one problem, and it is the exact load-bearing invariant the ack request asked Revenue to confirm: ADR-0029 rests on organization_id riding credit.locked (the ADR says Delivery reads organization_id "from the payload scope field that already rides every credit.* payload"). That is not the case for credit.locked today, so Revenue cannot confirm it, and is flagging it here as the request invited.
What Revenue checked
Revenue verified this at all three levels, not just one:
Contract schema. contracts/credit-reservation-lock/schema/payloads/credit.locked-v1.json has required of exactly five fields (credit_reservation_id, lesson_id, person_id, locked_credits, locked_at) and additionalProperties: false. So organization_id is not merely absent from credit.locked, it is contractually disallowed: Revenue cannot start emitting it without a schema change.
Revenue producer surface. The CreditLockedPayloadV1 type in lib/dispatcher.ts mirrors that schema and carries no organization_id.
Live emitter. The credit.locked@1 publish in modules/credit-reservation/service.lock-pg.ts sends only those five fields, and the envelope adds nothing usable either (the envelope has no organization_id; its subject is the reservation id, and tenant_id is the single-discipline shortcut, not an Organization scope).
Across the whole credit lifecycle, organization_id rides credit.reserved-v1 only. It is absent from credit.funded, credit.locked, credit.consumed, credit.released, credit.forfeited, and customer.handoff. So the ADR's "every credit.* payload" generalization holds for credit.reserved and for nothing else in this contract. This does not bite single-discipline today (org is a fixed singleton), which is consistent with the ADR's own "bites at Sguild Chess, not before" framing, but the premise still needs to be made true before the ADR is accepted on it.
What Revenue proposes (keeps Option B, avoids Option A)
The cheapest fix that preserves the chosen decision is to put organization_id on credit.locked as an additive minor bump to credit-reservation-lock (v1.7.0 to v1.8.0). Revenue already has the value on hand at lock time (it is on the reservation and the credit account, and credit.reserved already emits it for the same reservation), so the emitter change is small and Revenue will own it. Platform owns the contract edit (the schema and the README change log). No new event type, no new semantics, no new producer obligation beyond propagating a scope field that already exists one event upstream. This is materially smaller than Option A and keeps the derive-locally design intact.
There is a no-contract-change alternative, and Revenue is fine with it if Delivery prefers it: Delivery already subscribes to credit.reserved, which carries organization_id, so Delivery could remember org keyed by credit_reservation_id from the reserved event and apply it when the matching credit.locked arrives. That avoids any schema work, at the cost of a Delivery-side stateful join and the timing nuance that org is known at reserve while ownership-start should fire at lock. Revenue recommends the additive field as cleaner and self-contained for the consumer, but defers to Delivery on which it would rather implement.
Asks
Platform and Delivery: pick the path. If it is the additive field, Revenue will open a proper contract-change memo to every credit.locked consumer (Delivery, Sales, Coaching, Platform warehouse, Growth) proposing the v1.8.0 additive bump, then ship the emitter; the conditional commitment on this memo covers Revenue's side. If Delivery would rather correlate off credit.reserved, no Revenue or contract change is needed and Revenue's confirmation simply becomes "org is reliably present on credit.reserved, which it is."
Either way, Revenue's recommendation is to hold ADR-0029 at Proposed until the premise is corrected, either by the additive bump landing or by amending the ADR text to say Delivery derives org from credit.reserved keyed by reservation id rather than reading it from credit.locked. Accepting it as currently worded would put a load-bearing invariant on record that the contract does not satisfy.
References
ADR-0029-per-discipline-ownership-start-derivation (action item: "Revenue: confirm organization_id is reliably populated and correct on every credit.locked and credit lifecycle payload"). Ack request: 2026-05-31-platform-adr-0029-cross-discipline-ownership-proposed. Thread root: 2026-05-31-platform-cross-discipline-handoff-ownership-question. Contract: credit-reservation-lock v1.7.0, schema/payloads/credit.locked-v1.json and credit.reserved-v1.json. Related: ADR-0014, ADR-0006 (section 5 customer.handoff), ADR-0005.