Skip to content

docs(adr): the tenant master is UMS, and ADR-0106's MMS was never built - #655

Merged
beyondnetPeru merged 4 commits into
mainfrom
docs/adr-0129-ums-tenant-master
Aug 23, 2026
Merged

docs(adr): the tenant master is UMS, and ADR-0106's MMS was never built#655
beyondnetPeru merged 4 commits into
mainfrom
docs/adr-0129-ums-tenant-master

Conversation

@beyondnetPeru

Copy link
Copy Markdown
Contributor

ADR-0106 has been Accepted since 2026-07-08 naming MMS "the sole owner of the Master Tenant identity and lifecycle", with MMS publishing a projection to UMS and the Tracker. MMS was never built — not in BeyondNetCode, not in the suite.

On 2026-08-22 both satellites recorded the opposite, with code behind it:

  • ADR-UMS-107 (repo ums) makes UMS the tenant master and supersedes UMS-083. Version comes from a database sequence, publication happens before SaveEntitiesAsync behind the bus outbox.
  • T-059 (repo evolith_tracker) removes the Tracker's MMS consumer, its contract, its read-model migrations, its health probe and its MasterDataDb requirement, replacing them with TenantSnapshotConsumer and an upsert guarded by ums_projection_version.

Core owns none of that code, but it publishes the corpus that describes the suite — so this repository was where a reader still found an accepted architecture for a system nobody will build.

What this does

ADR-0129 supersedes ADR-0106 instead of amending it. The MMS reasoning stays legible; that is what a corpus is for. 0129 declares implementation-status: none, because Core neither emits nor consumes the snapshot and ADR-0101 keeps it that way.

The sweep covers what described current behaviour, and stops there:

Corrected Left alone
glossary (MMS was a product with the tenant) ADRs 0107, 0108, 0109, 0110 — MMS in their historical context
both ADR indexes the gap catalogs — historical records
the poison-message runbook
two Prometheus rules
the governed-composition target design
the Tracker technical interfaces
two source comments

Two things found while sweeping

The runbook sent an operator to shovel two queues that do not exist. ums.tenant-projection_error and tracker.tenant-projection_error were MMS-era. The real endpoint is tracker.tenant-snapshot, verified in T-059's ConsumerDefinition; UMS publishes and consumes nothing of it. Two Prometheus rules asserted the same dead names — TenantProjectionQueueMissing would have fired critical forever once anyone deployed it.

masterdata_projection_applied_total and its discarded twin have no emitter. Not in the Tracker after T-059, and not before it. The verify step now reads queue depth and the ums_projection_version column, which do exist.

The Tracker interfaces doc also carried PUT /tenants/projections/:globalTenantKey authorized for "MMS integration credentials". Intake is a bus consumer now, so the PUT is gone.

Not here on purpose

The suite deployment strategy (46 of 335 lines) derives its whole §5 messaging topology over the two projection queues, with exchange bindings and the DLX retirement resting on it. That is a redrawing, not a rename, and it gets its own PR.

Verified locally: guards 44, 04, 66 and 59 pass.

🤖 Generated with Claude Code

beyondnetPeru and others added 2 commits August 22, 2026 19:46
ADR-0106 has been Accepted since 2026-07-08 naming MMS "the sole owner of
the Master Tenant identity and lifecycle", with MMS publishing a projection
to UMS and the Tracker. MMS was never built. On 2026-08-22 both satellites
recorded the opposite: ADR-UMS-107 makes UMS the master and supersedes
UMS-083, and T-059 removes the Tracker's MMS consumer, its contract, its
read-model migrations and its MasterDataDb requirement.

Core owns none of that code but publishes the corpus that describes it, so
this repository was still the place where a reader found an accepted
architecture for a system nobody will build.

ADR-0129 records where the boundary sits, supersedes 0106 rather than
amending it — the MMS reasoning stays legible, which is the point of a
corpus — and declares implementation-status none, because Core neither
emits nor consumes the snapshot and ADR-0101 keeps it that way.

The sweep covers what described CURRENT behaviour:

  - the glossary, which defined MMS as a product and gave it the tenant
  - both ADR indexes
  - the poison-message runbook, which sent an operator to shovel two queues
    that do not exist; the Tracker's consumer endpoint is
    tracker.tenant-snapshot, verified in T-059's ConsumerDefinition
  - two Prometheus rules built on the same two dead queue names
  - two source comments listing MMS as a .NET suite product

The runbook also named masterdata_projection_applied_total and its
discarded twin. Neither has an emitter — not in the Tracker after T-059 and
not before it — so the verify step now reads queue depth and the
ums_projection_version column, which do exist.

ADRs 0107, 0108, 0109 and 0110 name MMS in their historical context and are
deliberately left unamended, for the same reason 0106 keeps its text.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…nt master

Both describe CURRENT intended behaviour rather than a point-in-time
decision, so unlike ADRs 0106-0110 they are corrected in place:

  - the governed-composition target design carried MMS as a node in three
    diagrams, as a row in the tenant-responsibility table, and as the first
    step of the tenant sequence
  - the Tracker technical interfaces carried the same, plus a REST intake
    (`PUT /tenants/projections/...`) authorized for "MMS integration
    credentials". T-059 replaced that with a bus consumer, so the PUT is
    gone and the section says how intake actually arrives:
    Evolith.Contracts.Tenancy.TenantSnapshotIntegrationEvent on
    tracker.tenant-snapshot, upserted by version

The suite deployment strategy is deliberately NOT in this commit. Its §5
derives a messaging topology over two projection queues, with exchange
bindings and the DLX retirement resting on it; that is a redrawing, not a
rename, and it gets its own change.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@beyondnetPeru
beyondnetPeru requested a review from a team as a code owner August 23, 2026 00:47
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@github-actions

github-actions Bot commented Aug 23, 2026

Copy link
Copy Markdown

📊 Bilingual Coverage Impact

PR Changes

  • Paired EN/ES files modified: 8
  • New EN files needing ES translation: 0

Repository Coverage

Metric Value
Total EN files 527
Total ES files 497
Paired files 0
Coverage 0%

Good: All EN changes have ES counterparts.


Generated by GitHub Actions

beyondnetPeru and others added 2 commits August 22, 2026 19:57
Adding one ADR adds one generated conformance ruleset, and four artifacts
descend from that corpus. CI found them in the order the chain declares:

  - native-evaluability-snapshot.json (415 rules, documentation-only 140→141)
  - iso-5055-mapping.{json,csv}
  - maturity-reconciliation.json
  - the three pinned counts in rule-corpus-triage.spec.ts

The spec's numbers are pinned deliberately, so each one carries a note
saying what moved it. Superseding costs +1 rather than trading one for
another: ADR-0106 keeps its placeholder, because a superseded decision keeps
its record.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sixth artifact downstream of one new decision record: ADRs 143 -> 144 in
both language copies. Found by CI rather than by the local chain replay,
because 07-generate-inventories.mjs is not one of the nine links guard 46
walks — worth knowing the next time an ADR lands.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@beyondnetPeru
beyondnetPeru merged commit 8d1e7fe into main Aug 23, 2026
52 checks passed
@beyondnetPeru
beyondnetPeru deleted the docs/adr-0129-ums-tenant-master branch August 23, 2026 01:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant