Filed unassigned by the domain:metadata execution seat (#6367), PM session session_01NTKPDRoynY8i3HmdSFUxFj. Measured while diagnosing why PR #9173 (#9111) would not land. Duplicate-searched by file path and by keyword.
What was measured
PR #9173 changes 16 files. Twelve of them are shared:
packages/spec/src/api/error-code-ledger.zod.ts ← one line added
content/docs/references/api/analytics.mdx ← regenerated
content/docs/references/api/auth.mdx …
content/docs/references/api/automation-api.mdx
content/docs/references/api/batch.mdx
content/docs/references/api/contract.mdx
content/docs/references/api/error-code-ledger.mdx
content/docs/references/api/export.mdx
content/docs/references/api/metadata.mdx
content/docs/references/api/package-api.mdx
content/docs/references/api/protocol.mdx
content/docs/references/api/storage.mdx
Adding one error code regenerates eleven pages, because each carries a roll-up count (+269 more → +270 more).
Three of main's last six commits touched that same set:
| commit | PR | what |
|---|
30b1c636a | #9177 | registers 9 REST wire codes |
09a9a8ae0 | #9170 | registers the dispatcher conformance codes |
c80e7ae6a | #8994 | reference tables stop marking .default() members required |
main moved four times in the window this was observed (30b1c636a → 157570dfa → 445ae4deb → fbb247cbd).
⇒ Any two PRs that register an error code are mutually exclusive by construction. Whichever lands second must merge, take main's side, re-run the os-regen sequence, and re-verify — and is then exposed again until it lands.
Measured consequence on PR #9173
It has been through this once already. The conflict was in the hand-written file: #9170 added QUERY_OBJECT_MISMATCH at the same ledger position as #9173's REGISTRY_TYPE_NOT_CANONICAL. Both intents were kept, alphabetically, via scripts/pm/os-regen-merge.sh.
⚠️The eleven generated pages produced NO conflict at all — which is the #8986 hazard signature, not a relief: the regen driver exits 0 while dropping a side, with zero conflict markers. It was only caught because the dev re-ran a neighbour control (does any page enumerate a sibling code while missing the new one?) rather than trusting the roll-up total. A count cannot detect a code dropped from some pages; a neighbour comparison can.
Why this is a card and not a fact of life
⭐ This repo has already diagnosed this exact pathology once, one layer down.CLAUDE.md names content/docs/releases/"the single hottest merge-conflict magnet in the repo" — because every PR appended its own row — and the ruling was: don't accrete; the release process compiles it centrally from per-PR changesets, which never conflict.
The generated reference pages are the same shape with the same cause: N PRs writing into one shared artifact. The difference is that here the shared artifact is generated, so the conflict is silent (the driver exits 0) rather than loud.
The per-PR input that never conflicts already exists — the ledger entry itself. What does not exist is a compile step that keeps the generated pages out of the PR.
What a disposition has to decide
- Take the generated pages out of PRs entirely — generate at release/build time, the changeset model applied to
references/. Highest cost, retires the class. - Make the roll-up counts not per-page — the
+N more total is what makes eleven pages change for one code. If the count were computed at render time, adding a code would touch one page. - Serialize deliberately — a lane rule that at most one error-code PR is in flight, the way hot-file region rules already work. Cheapest, and it does not scale with merge volume.
- Do nothing, and mandate the neighbour control — accept the churn but make the silent-drop detection mandatory rather than something a good dev happened to invent.
⛔ No recommendation between them. (2) looks disproportionately cheap for what it removes and is worth measuring first, but I did not measure whether the counts can be computed at render time, and a guess about a generator's structure is not an input.
Not claimed
Backlinks: #9111 / PR #9173 · #9170 · #9177 · #8986 (where the silent-drop hazard was first paid for) · CLAUDE.md's content/docs/releases/ ruling (the same pathology, already ruled one layer down).
Filed unassigned by the
domain:metadataexecution seat (#6367), PM sessionsession_01NTKPDRoynY8i3HmdSFUxFj. Measured while diagnosing why PR #9173 (#9111) would not land. Duplicate-searched by file path and by keyword.What was measured
PR #9173 changes 16 files. Twelve of them are shared:
Adding one error code regenerates eleven pages, because each carries a roll-up count (
+269 more→+270 more).Three of
main's last six commits touched that same set:30b1c636a09a9a8ae0c80e7ae6a.default()members requiredmainmoved four times in the window this was observed (30b1c636a→157570dfa→445ae4deb→fbb247cbd).⇒ Any two PRs that register an error code are mutually exclusive by construction. Whichever lands second must merge, take main's side, re-run the os-regen sequence, and re-verify — and is then exposed again until it lands.
Measured consequence on PR #9173
It has been through this once already. The conflict was in the hand-written file: #9170 added
QUERY_OBJECT_MISMATCHat the same ledger position as #9173'sREGISTRY_TYPE_NOT_CANONICAL. Both intents were kept, alphabetically, viascripts/pm/os-regen-merge.sh.Why this is a card and not a fact of life
⭐ This repo has already diagnosed this exact pathology once, one layer down.
CLAUDE.mdnamescontent/docs/releases/"the single hottest merge-conflict magnet in the repo" — because every PR appended its own row — and the ruling was: don't accrete; the release process compiles it centrally from per-PR changesets, which never conflict.The generated reference pages are the same shape with the same cause: N PRs writing into one shared artifact. The difference is that here the shared artifact is generated, so the conflict is silent (the driver exits 0) rather than loud.
The per-PR input that never conflicts already exists — the ledger entry itself. What does not exist is a compile step that keeps the generated pages out of the PR.
What a disposition has to decide
references/. Highest cost, retires the class.+N moretotal is what makes eleven pages change for one code. If the count were computed at render time, adding a code would touch one page.⛔ No recommendation between them. (2) looks disproportionately cheap for what it removes and is worth measuring first, but I did not measure whether the counts can be computed at render time, and a guess about a generator's structure is not an input.
Not claimed
hydrateOverlayIntoRegistrymints registry entries under the RAWtypewith no fold and no assertion — the last unfolded seam of theobjectstolerance family #91115309751134— the PR was measured CLEAN againstfbb247cbdand still was not admitted. This card explains why it keeps re-conflicting, not why the queue refuses it.Backlinks: #9111 / PR #9173 · #9170 · #9177 · #8986 (where the silent-drop hazard was first paid for) ·
CLAUDE.md'scontent/docs/releases/ruling (the same pathology, already ruled one layer down).