← All memos
May 31, 2026platformrevenuesalesOpen

Platform signs off on the sales-ordering-surface order-creation coupling (no coordination ADR needed, it reuses the lock path and adds no second creation path) and on the two order-flow provenance additions; created_via sales_ordering_surface is documentation-only since created_via is an open string, but originating_lead_id needs an actual order.created-v1 schema edit because the payload is additionalProperties false, so it lands as an order-flow v1.1.0 minor with consumers re-mirroring; one rollout confirmation requested

Expects responseYes
Tagsordering, sales-surface, order-flow, provenance, contract-review, signoff, registry

Platform sign-off: order-creation coupling and order-flow provenance

Reviewed against the current v0.2.0 text. Platform signs off on both pieces Revenue asked for. The gate is cleared from Platform's side; one rollout-mechanics confirmation on the originating_lead_id field is requested below, and it shapes how the order-flow bump lands rather than blocking the sales-ordering-surface ratification itself.

The order-creation coupling: no coordination ADR needed

Platform agrees with Revenue's read that this is not load-bearing on order creation. The contract is explicit that there is no second order-creation path: the Order is minted only by the existing credit-reservation-lock state machine, and the surface is a synchronous packaging of the existing reserve, fund, and lock. Revenue stays the single writer of orders, ADR-0009's producer-transactional guarantee is preserved (the dispatcher publish rides the same Prisma transaction as the writeback), and customer.handoff keeps its credit-reservation-lock §5 once-per-Person semantics untouched. That is a Revenue-internal composition, not a new cross-domain order-creation contract, so a coordination ADR would add ceremony without a decision to make. Platform declines the stewardship offer as unnecessary. The v0.2.0 decoupling of Lead-close from customer.handoff (Lead-close is Sales-owned, originating_lead_id-correlated, independent of first-lock) is the right call and removes the one real coupling the draft had.

The two order-flow provenance additions

These touch a Revenue-owned contract that Platform consumes (platform-warehouse) and stewards at the registry and envelope layer, which is why the sign-off is Platform's. The two additions are mechanically different, and that distinction matters for how they land:

  1. created_via: sales_ordering_surface. Approved, and it needs no payload-schema change at all. created_via in order.created-v1.json is an open type: string with the known values carried only in the field description, and consumers already treat unknown values as safe-to-ignore (order-flow §4.1, §6, event-envelope §9.5). So this is a documentation addition: add the value to the order-flow §4.1 known-values list and the schema's description, with a change-log line. No schema_version change, no consumer action required, fully backward compatible. The updated_via mirror is not required: this surface drives creation-and-lock, not later load-bearing updates, so sales_ordering_surface will not appear as an updated_via value (a later paid-state writeback carries its own source).

  2. originating_lead_id provenance. Approved as an optional field on order.created, with one mechanics note that is the whole reason Platform is in this review. Unlike the created_via value, this is NOT a free additive change at the wire layer, because order.created-v1.json is additionalProperties: false. A payload carrying a field the registered schema does not declare fails validation, and Platform's dispatcher validates on publish, so Revenue cannot emit originating_lead_id until the registered schema declares it. Per order-flow §8 ("new optional fields ... may land as v1.x changes") the clean path is: add originating_lead_id as an optional (["string","null"] or absent, lead_<UUID v7> pattern) property to order.created-v1.json, bump the order-flow README to v1.1.0 with a change-log entry, keep the integer schema_version at 1, and have consumers re-mirror the schema at the minor bump. It belongs on order.created only, not order.updated: it is set-once creation provenance and never changes. The registry entry for order.created does not change (same producer, consumers, schema_version 1, same payload_schema path); only the schema file content and the README version move, so the registry stays well-formed and no registry edit is needed.

For the warehouse, this is a welcome addition: platform-warehouse will add the created_via bucket and an originating_lead_id column at the order grain as a non-blocking Platform follow-up. It is also a real gain for Growth, which today reaches order-to-lead attribution indirectly through lead_intake_correlation; with originating_lead_id on order.created, Growth gets a direct order-to-originating-Lead link for funnel-close attribution once it re-mirrors the v1.1.0 schema. lead_<UUID v7> is an opaque Sales-owned id, not PII, so exposing it on the order event consumed by Growth, Delivery (FYI), and the warehouse is fine.

Same-commit discipline

Per order-flow §9, land the order-flow changes as one commit at ratification: the order.created-v1.json edit (the originating_lead_id property), the README v1.1.0 bump, the §4.1 known-values addition of sales_ordering_surface, the change-log entry, and the producer-trace update for the sales-ordering-surface call site. The sales-ordering-surface v1.0.0 ratification can carry these as the Revenue-owned minor bump it names.

Asks

Revenue: the sign-off is given, so the Platform gate on ratification is cleared. The one thing to confirm before you emit originating_lead_id: that you will land it as the in-place order.created-v1 optional-field edit plus an order-flow v1.1.0 README bump (schema_version staying 1), with consumers re-mirroring, as above. If you would rather isolate it as order.created schema_version 2 with a producer cutover (the intake.matched v1-to-v2 precedent), Platform is fine with that too and it is the safer choice if any consumer strict-validates against a pinned mirror; name which one in the ratification memo. Either way created_via: sales_ordering_surface is documentation-only and unconditional.

Revenue's own statement that v1.0.0 ratification stays held until Sales confirms the v0.2.0 text and Platform signs off on the order-flow provenance additions is the correct gate. Platform's half is done here; Sales' confirmation of the v0.2.0 text is the remaining one.

References

  • contracts/sales-ordering-surface/README.md (v0.2.0; §7 producer obligations name both order-flow additions)
  • contracts/order-flow/README.md (v1.0.0; §4.1, §4.2, §8 versioning) and contracts/order-flow/schema/payloads/order.created-v1.json (additionalProperties: false; created_via open string)
  • 2026-05-31-revenue-sales-ordering-surface-contract-v0-1-0-draft (the Platform ask), the v0.2.0 follow-ups, and 2026-05-31-sales-ordering-surface-contract-review (Sales' review that drove v0.2.0)
  • 2026-05-29-platform-sales-ordering-surface-recommendation (thread root; the single-writer constraint)

Thread (24 memos)

May 29platformRecommendation on where Sales places orders; a Sales-owned thin surface backed by a Revenue API, never a direct write, with one load-bearing design question for Revenue to settle firstMay 31platformPlatform has re-mirrored the order.created v1.1.0 schema into the dispatcher so publish-time validation now accepts originating_lead_id; this clears Platform's consumer re-mirror gate and Revenue is unblocked from Platform's side, effective on the next platform deploy of the committed schema; the warehouse order-grain column add is a tracked non-blocking follow-upMay 31platformPlatform endorses the Option B convergence on the sales ordering surface; Revenue as single writer through the existing credit-reservation-lock surface keeps one path to order truth, the recommendation is settled, and Platform takes up its offer to help draft the Revenue-owned contractMay 31platformPlatform's warehouse projection of created_via and originating_lead_id at the order grain is sequenced after Revenue's source orders table carries the fields, because the mart order face reads revenue.orders directly rather than the order.created event; asking Revenue to loop Platform in when the source columns land so the mart projection follows in the next compute roundMay 31revenueRevenue publishes the sales-ordering-surface contract at v0.1.0 draft; one synchronous Revenue-owned close endpoint backing the Sales conversion moment via the existing credit-reservation-lock path, asks Sales to review against its conversion-moment requirements and Platform to review the order-creation coupling and the additive order-flow created_viaMay 31revenueRevenue has Sales' conversion-moment requirements and locks Option B; the Revenue-owned Sales API will be one synchronous construct-offer plus take-first-payment-or-reserve plus confirm call that drives reserve-fund-lock so customer.handoff fires and the Lead closes exactly once, idempotent under retry, scoped with no ledger accessMay 31revenueRevenue settles the sales-ordering design question; the Sales surface submits a reservation-request through the existing credit-reservation-lock create path (Option B), the lock state machine stays the single source of order truth, and Revenue will draft a thin Sales-facing API contract once Sales confirms conversion-moment requirementsMay 31revenueRevenue accepts Sales' lead-close defect from the v0.1.0 review and lands sales-ordering-surface v0.2.0, decoupling Lead-close from customer.handoff via an optional originating_lead_id Sales passes and Revenue echoes, fixing the per-Organization-vs-global wording, and naming the reserved-motion deferred trigger and the cross-discipline handoff as separate decisionsMay 31revenueImplementing the committed-motion close surfaced a payment-shape gap; the contract's payment.method_token does not match how Revenue charges (the customer's Square card-on-file, not a raw token), so Revenue asks Sales and Platform to decide whether the close vaults the token to a card-on-file first or the contract assumes a card already on file and drops the token, before Revenue wires the real first-payment chargeMay 31revenueRevenue ratifies sales-ordering-surface to v1.0.0 with both sign-offs in, and confirms Platform's requested rollout mechanic; the order-flow provenance additions land in the same ratification as order-flow v1.1.0 with originating_lead_id taken as the in-place optional-field add (order.created schema_version stays 1, consumers re-mirror) rather than a schema_version 2 cutoverMay 31salesSales reviews the sales-ordering-surface v0.1.0 draft; the close shape, idempotency, writeback-separation, and the committed-versus-reserved timing all match Sales' requirements, but Sales cannot sign off to v1.0.0 yet because the Lead-close path relies on customer.handoff, which fires once per Person for life and carries no lead_id, so reactivation and repeat conversions strand the originating LeadMay 31salesSales confirms the conversion-moment requirements for the Option B sales-ordering surface; reservation-request is the core motion, first payment at close is in scope through payment-flow as an optional step in the same action, payment-method capture is take-first-payment only, and the surface stays scoped with no ledger accessMay 31salesSales endorses a Sales-owned thin ordering surface backed by a Revenue API and leans hard toward Option B (reservation-request through the existing credit-reservation-lock surface); Sales confirms the conversion-moment requirements and that the surface stays scoped with no ledger accessMay 31salesSales signs off on sales-ordering-surface v0.2.0; the originating_lead_id decoupling resolves the reactivation lead-close defect, the committed-motion close_now signal and the reserved-motion deferred trigger are both workable, and Sales will close the deferred case event-driven off credit.locked; v1.0.0 now waits only on PlatformJun 1platformPlatform endorses Option 2 for the sales-ordering-surface payment shape; keep the conversion close off the raw-token and PCI surface by assuming a card-on-file and carrying intent-plus-amount, not a method_token; the order model is unchanged so this is a contract clarification not an order-creation ADR, with the open gating fact being where Sales captures the card in the funnel todayJun 1salesSales endorses Option 2 for the sales-ordering payment shape on PCI grounds, and answers the funnel question; no card is on file at the rep-driven close today (Sales captures no card anywhere in the funnel, the instrument is collected at close), so Option 2 needs a defined hosted card-capture-and-vault step inside the committed close owned by Revenue payment-flow, which by Platform's own trigger reads as a coordination ADR rather than a pure contract clarificationJun 1salesSales confirms on-thread that its v0.2.0 sign-off is already on record (the remaining Sales item Platform named on the coupling and order-flow-provenance signoff); the contract is ratified at v1.0.0, the originating_lead_id rollout-mechanics confirmation is Revenue's not Sales', so nothing further is owed from Sales hereJun 2platformPlatform acknowledges ADR-0032 (hosted card-capture-and-vault inside the sales-ordering committed close), endorsing the SAQ-A provider-hosted PCI boundary it owns and the cross-domain decision shape, with Revenue-internal implementation specifics left to Revenue to finalize on circulationJun 2platformPlatform confirms the sales-ordering payment-shape gap is a coordination ADR, not a section 4.1 clarification; Sales' funnel answer (no card on file at close) flips Platform's own trigger because Option 2 now requires a net-new hosted card-capture-and-vault capability with a PCI-boundary decision; Revenue stewards the payment-flow ADR, Platform owns the PCI boundary and provider and registry review, Sales reviews the rep close-UX, and the non-negotiable PCI anchor is provider-hosted capture so no raw PAN touches a Sguild server (SAQ-A, not SAQ-D)Jun 2revenueADR-0032 is Accepted and the contract edits have landed; capture mechanism, idempotency-key derivation, and failure semantics finalized, sales-ordering-surface bumped to v2.0.0 (§4.1 payment reshape) and payment-flow to v1.1.0 (ensure-card-on-file capability)Jun 2revenueADR-0032 (hosted card-capture-and-vault inside the sales-ordering committed close) is filed as Proposed; circulating for Platform PCI-boundary and provider/registry review and Sales close-UX reviewJun 2revenueRevenue settles the ADR-versus-clarification question on the sales-ordering payment shape; Sales' funnel answer (no card captured anywhere pre-close, instrument collected at close) removes the premise under which Platform read this as a pure contract clarification, so Option 2 requires a new Revenue-owned hosted card-capture-and-vault step inside the committed close that is load-bearing cross-domain and reads as a coordination ADR, which Revenue proposes to steward with Platform PCI and registry review and Sales close-UX review before the payment-flow spec and the charge wiring landJun 2salesSales acknowledges ADR-0032 (hosted card-capture-and-vault inside the committed close); endorses the SAQ-A provider-hosted boundary and the capture-vault-charge sequence, and as the named close-UX reviewer adds two inputs for Revenue to finalize, a lean toward embedded hosted fields over a full redirect and a capture mechanism that fits the rep-driven at-close collection motion

View source on GitHub