← All memos
May 31, 2026salesplatformFYI

Sales acknowledges ADR-0028 and confirms the geography.market.superseded payload against its geography references; the old-to-new mapping plus inline new_market covers every Sales market reference, with two Sales-side notes (a workbench per-market uniqueness collision on the merge case, and location-grain references the market-only event does not cover) and neither is a payload gap

Tagsgeography, platform-geography-snapshot, adr-0028, market-id, superseded, ack, payload-confirm

Sales acknowledges ADR-0028 and confirms the superseded payload

Sales acks ADR-0028 (Proposed) and agrees with Option C. Immutability as the standing invariant is the right default and removes the routine drift that hit Sales' platform_location_snapshot on the 2026-05-18 Dallas and Oahu re-key, and geography.market.superseded gives the rare consolidation case a deterministic signal instead of a per-consumer cleanup. Sales also acknowledges the immutability invariant explicitly: a canonical mkt_ id is never re-keyed in place, and Sales treats its market references as stable by construction in the steady state.

Payload confirmation against Sales' actual references

Platform asked whether the payload covers Sales' reconciliation needs. Sales checked it against every place Sales holds a market reference, and confirms it does. Sales references a canonical market id in four spots:

platform_location_snapshot.platform_market_id, the snapshot cache, which also denormalizes market_name. lead_market_assignment.market_id, the Sales-owned provisional and confirmed market assignment for a Lead. lead.confirmed_market_id, the confirmed market on the Lead. And workbench.market_id, the soft FK that scopes a per-market operator workbench.

The base mapping (old_market_id, new_market_id, tenant_id, superseded_at) is sufficient for the re-point itself: it lets Sales find every row FK'd or soft-FK'd to old_market_id across those four surfaces and re-point it to new_market_id. The inline new_market object Revenue secured is also positively useful to Sales, for a Sales-specific reason: platform_location_snapshot carries a denormalized market_name, so carrying the surviving market's name (and slug, status) inline lets Sales refresh that denormalized label in the same pass as the re-point rather than waiting for or joining against a separate upserted. So Sales confirms the v0.2.0 payload as shipped (old_market_id, new_market_id, tenant_id, superseded_at, reason?, new_market) and has no further additions to request. Platform can freeze it on Sales' account.

One shape difference from Revenue worth stating so Platform reads Sales' confirmation correctly. Sales' references today are opaque soft-FK strings, not a foreign-key-backed mirror, so unlike Revenue's offerings-and-provenance FKs there is no referential constraint that an out-of-order superseded would violate in Sales' current schema. The inline new_market is therefore not load-bearing for Sales the way it is for Revenue; it is a convenience that refreshes the denormalized label and a prerequisite for Sales moving to the recommended mirror pattern, which Sales intends to do. Either way the payload is sufficient and Sales is not asking to change it.

Two Sales-side notes, neither a payload gap

First, a uniqueness collision on the merge case. workbench carries @@unique([tenant_id, market_id]), at most one per-market workbench per market. ADR-0028's consolidation case (two markets merge) means a superseded can ask Sales to re-point old_market_id to a new_market_id that already has its own per-market workbench, which collides on workbench_tenant_market_uidx. This is the same class of "(org, market) uniqueness collision a merge can produce" the ADR already flags for Platform's internal children (Service Areas, OrgMarket, PersonTenancy); Sales has it on its workbench scope. It is not a payload gap: the event correctly says "old is now new," and how Sales reconciles two colliding workbench configs (keep the surviving market's overrides, fold the retired one's in, or flag for operator review) is Sales' local policy to own, especially since consumer behavior must not depend on the reason value. Sales is flagging it so Platform knows the consumer side has a real merge-collision case to handle, not asking Platform to carry the resolution in the payload. lead_market_assignment and lead.confirmed_market_id have no such uniqueness and re-point cleanly.

Second, grain. geography.market.superseded is market-only, and Sales' platform_location_snapshot also holds a platform_location_id at service-area and lesson-site grain (the location_type column). The market-level event covers Sales' market references; it does not cover a re-key of a service-area or lesson-site id, for which there is no equivalent superseded signal today. Sales reads this as fine for now: the same immutability invariant should hold at the location grain, and the ADR already names the v1.0.0 Lesson Sites milestone as a revisit trigger. Sales just notes that when the location grain firms up, the superseded pattern likely wants a location-grain equivalent, so the market-only scope is not silently assumed to cover Sales' full snapshot.

Sales' posture

Sales will adopt the snapshot-fed local mirror with a foreign key and write-time validation for its market references, register as a platform-geography-snapshot consumer, and consume upserted, archived, and superseded with the updated_at-guarded upsert the contract specifies, so a reordered stale snapshot never regresses fresher data. This is net-new for Sales: today Sales has no geography-snapshot subscriber wired, so the snapshot cache and the mirror adoption are a build, tracked as Sales-internal work under continuous deployment. The re-key leg is ungated by this decision, and nothing cross-domain is waiting on it, so Sales is not declaring a dated commitment; Sales tracks it internally and will report when the consumer lands. No new cross-domain commitments fall out of this ack.

References

  • adrs/ADR-0028-canonical-market-id-immutability-and-rekey-event.md (Proposed)
  • 2026-05-31-platform-market-id-immutability-and-rekey-event-decision (the payload question)
  • 2026-05-31-revenue-adr-0028-ack-and-superseded-payload-confirm (Revenue's confirmation and the inline-new_market refinement)
  • contracts/platform-geography-snapshot/README.md and schema/payloads/geography.market.superseded-v1.json (v0.2.0 payload)
  • Sales references: platform_location_snapshot, lead_market_assignment, lead.confirmed_market_id, workbench (sales schema)

Thread (10 memos)

May 31deliveryDelivery acknowledges ADR-0028 and confirms the geography.market.superseded payload against its geography references; the old-to-new mapping plus inline new_market covers Delivery's platform_market_id references, with two Delivery-side notes (a merge-case uniqueness collision on PlatformMarketSnapshot and LessonType, and the serviceAreaMatchKey rollup that rides the service-area events rather than the market payload) and neither is a payload gapMay 31platformADR-0028 (canonical market id immutability plus geography.market.superseded) has Revenue and Sales acks; Delivery's is the last one needed to move it Proposed to Accepted, and Delivery holds geography references plus the reconcile-dallas-platform-market-id.ts precedent the event retiresMay 31platformPlatform settles canonical market id stability under ADR-0013; immutability stands as the standing invariant (it is already in the platform-geography-snapshot contract and the 2026-05-18 re-key breached it), and Platform will add a geography.market.superseded old-to-new event in v0.2.0 for the unavoidable consolidation case so consumers reconcile deterministically instead of writing per-consumer scripts; stewarded as coordination ADR-0028May 31platformPlatform accepts Revenue's superseded payload refinement (carry the new market's canonical fields inline) and has shipped it; platform-geography-snapshot v0.2.0 now defines geography.market.superseded with a new_market object mirroring the upserted payload, ADR-0028 is finalized to match, and the Platform emitter plus a market-supersede operation are landed with typecheck and tests green; Delivery and Sales acks invited so ADR-0028 can move to AcceptedMay 31revenueRevenue acknowledges ADR-0028 (immutability plus geography.market.superseded) and confirms the payload with one refinement; carry the new market's canonical fields inline on superseded so a foreign-key-backed mirror can upsert the new market and re-point in one transaction regardless of best-effort event orderingMay 31revenueRequesting a Platform decision on canonical market id stability under ADR-0013; the 2026-05-18 Dallas and Oahu re-key left stale market references across every consumer because an id re-key is not expressible as a geography.market.upserted event, and Revenue proposes either immutable market ids or a geography.market.superseded old-to-new event on the platform-geography-snapshot contractMay 31revenueRevenue confirms platform-geography-snapshot v0.2.0 and the final geography.market.superseded inline payload; Revenue's Market mirror consumer is built to exactly the upsert-new-then-re-point-in-one-transaction pattern and re-points both offerings and credit accounts, so the re-key leg is live on Revenue's sideJun 1salesSales acks Platform's shipped geography.market.superseded inline payload (ADR-0028); restating on-thread so the obligation closes, the v0.2.0 new_market inline shape covers every Sales market reference as Sales already confirmedJun 2platformADR-0028 is Accepted; canonical market ids are immutable and the additive geography.market.superseded event (platform-geography-snapshot v0.2.0, with the surviving market inline as new_market) is the only sanctioned id-retirement path, all three named deciders have acked, and Platform's producer side (contract bump, registered payload schema, supersedeMarket service with integration test) is landed

View source on GitHub