Uh oh!
There was an error while loading. Please reload this page.
docs(standards): the branch model points at the inventory instead of restating it (backend#2422) - #321
Conversation
…restating it (backend#2422) The bullet named its own exceptions -- "`docs` and `rfcs` are main-only" -- one sentence after naming `repo-inventory.yml` as the authority and saying "this line follows it, not the reverse." It then drifted from that authority on BOTH examples: * `docs` has been on the release train since 2026-08-04 (release_train: true, develop: required, staging present) while this line called it main-only. * `rfcs` had a `develop` taking merges, measured 2026-08-22 in backend#2242 / .github#306, while this line called it main-only. That is the restated-rule defect the file's own meta-rule warns about, and it is not theoretical: I read this line on 2026-08-19, concluded `rfcs` should be main-only, created a `develop` there to satisfy the first bullet, and forked the repo -- 9 commits on develop against 5 on main over four days, both sides editing README.md, reconciled by hand in rfcs#50. So the enumeration is removed rather than corrected. A list of repo names in prose will drift again; a pointer to the file that is measured will not. Also records the trap the inventory found and no check catches: a `develop` created on a non-train repo and left unprotected is invisible to the guards (`develop_unprotected_non_train` -- "a `develop` created and left UNPROTECTED is not flagged ... no check was going to surface it"). Creating one to satisfy the train bullet forks the repo silently. Stating it here because the guard cannot, which is exactly what this file is for. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
saadqbal
left a comment
There was a problem hiding this comment.
Approving. Three lines, and it fixes the right thing in the right direction.
Both drift examples are real — I checked the one I hadn't seen myself.repo-inventory.yml gives docsrelease_train: true, develop: required, a staging: block, and a comment reading "Enrolled 2026-08-04 (backend#1420, D1 5-of-5)". So this file called docsmain-only for twenty days after it joined the train. The rfcs half I measured myself on .github#306 — it has a develop that takes merges — so the bullet was wrong about both repos it named. That's about as clean a case as you get for "restating the authority is the defect".
Pointing at the inventory instead of enumerating exceptions is the correct fix, and scoping the first bullet to "a repo on the release train" is what makes the second one land — the old text asserted a universal model and then tried to carve out of it, which is how the carve-outs went stale independently.
The third bullet is the valuable one, and I'd have wanted it even without the drift. develop_unprotected_non_train is a state no check surfaces — the inventory says so in as many words — so "if a repo appears to lack a develop, that is a fact to verify in the inventory, not a gap to fill" is exactly the instruction that stops someone helpfully creating one. Spelling out the consequence (PRs split across two heads, nothing promotes between them, divergence until a hand reconcile) is what makes it a warning rather than a rule to be argued with.
The one thing this can't do is enforce itself: a doc that says "read the inventory" still depends on people reading it. Worth knowing that .github#314's conformance audit already checks caller presence per repo, so if the branch model itself ever becomes machine-checkable, that's where it belongs — not a change for this PR.
Uh oh!
There was an error while loading. Please reload this page.
Summary
The branch-model bullet named its own exceptions — "
docsandrfcsaremain-only" — one sentence after namingrepo-inventory.ymlas the authority and asserting "this line follows it, not the reverse."It then drifted from that authority on both examples:
docsmain-only, not on the trainrelease_train: truesince 2026-08-04 —develop: required, staging presentrfcsmain-only, not on the traindeveloptaking merges, measured 2026-08-22 (backend#2242 / #306)So the enumeration is removed rather than corrected. A list of repo names in prose will drift again; a pointer to the file that is actually measured will not. That is this file's own meta-rule — "prose is only for what tooling can't judge" — applied to itself.
Why this isn't theoretical
I read this line on 2026-08-19, concluded
rfcsshould bemain-only, created adevelopthere to satisfy the first bullet, and forked the repo: 9 commits ondevelopagainst 5 onmainover four days, both sides editingREADME.md, reconciled by hand in rfcs#50.The line that was supposed to prevent that caused it — which is the specific failure mode the org's own guidance calls out: a doc an agent reads first manufactures the bug.
Also recorded: the trap no check catches
The inventory found it and said so plainly, so it belongs here rather than nowhere:
A
developcreated on a non-train repo and left unprotected is invisible to the guards. Creating one to satisfy the train bullet forks the repo silently — PRs split between the new branch and the repo's existing convention, nothing promotes between them, and the heads diverge until someone reconciles by hand. Prose is the only place that can carry this, because the guard demonstrably cannot.Blast radius — this fans out
scripts/standards-sync.py/.github/workflows/standards-sync.ymlsync this file into every repo'sCLAUDE.mdbetween the org-standards markers. So this correction propagates fleet-wide on the next sync, which is the point: the stale copy inrfcs/CLAUDE.mdstill says "(Sole exception: thedocsrepo may targetmain.)" — a third variant, older than both the file it came from and the reality it describes.Type
Docs / org standards.
Test plan
No code. Verified by reading the authority rather than the prose:
repo-inventory.yml:858-880—docs→release_train: true,develop: required, staging divergence documentedrepo-inventory.yml:1184-1202—rfcs→release_train: false,developexists, re-anchored todevelop_unprotected_non_trainon 2026-08-22, with the "no check was going to surface it" note quoted abovedevelophere is fix(2242): say why rfcs is exempt, accurately, and stop one anchor describing two repos #306, "say why rfcs is exempt, accurately, and stop one anchor describing two repos" — this PR is the prose half of that same correction, which fix(2242): say why rfcs is exempt, accurately, and stop one anchor describing two repos #306 made in the inventory but not in the standards text.Checklist
developrepo-inventory.yml, not against the prose being replaced🤖 Generated with Claude Code
Note
Cursor Bugbot is generating a summary for commit d98ff79. Configure here.