Measured on 2026-08-11 against origin/main d928e2c3.
16 of 29 open PRs are CONFLICTING (55%). 13 of those 16 conflict in bookkeeping files only — not one line of product code.
Conflicted paths across the 16, computed with git merge-tree --write-tree origin/main <head>:
Supporting churn over the last 300 commits: 95 of 252 non-merge commits (38%) touched only bookkeeping; 22 commits are re-merges of main into a landing head (row/MODEL-MUSE-GLIMMER alone re-merged 7 times).
Why this is structural, not bad luck
Three shared surfaces are shaped so that concurrent PRs must collide.
1. .agents/NOW.md is a fixed-size shared buffer, currently at exactly 6000/6000 chars (check-now-current.py:31 MAX_CHARS = 6000). Zero headroom, tuned to the byte. Adding a row therefore requires evicting another row, so every PR performs a read-modify-write of one global. Two concurrent writers conflict by construction — and the conflict is the lucky outcome. A clean auto-merge would apply both evictions and both additions: rows silently lost, budget silently blown.
2. STATUS_RATCHET = {"chars": 243245} (check-public-doc-tables.py:557) is a hardcoded byte count of a different file that may only decrease. A PR owing docs/STATUS.md one lifecycle line must delete unrelated prose from another row to pay for it, then edit the checker. That couples every PR to lines it does not own and makes the checker source itself a merge hotspot (4 PRs). The design already knows: a comment at check-public-doc-tables.py:331 reads "a ratchet pinned to the byte turns every concurrently merged row's one-line status edit into a spurious failure" — answered with slack rather than by removing the coupling.
3. .agents/coordination.md's active-claims table is insert-at-one-anchor. The six ROCm GDN PRs (#334 #336 #341 #343 #345 #348) are a single-author sequential stack that conflicts on nothing but this file — each appends a ~1500-char claim row at the same line. That row restates the PR description into a tracked file.
It contradicts the protocol it serves
AGENTS.md states "History is git", "There is no state log", and "A registry of exceptions is a state log, and this protocol has none." The active-claims table in coordination.md and the live-claims table in NOW.md are state logs — hand-maintained duplicates of gh pr list, row/<ID> branch names, and issue state. The argument AGENTS.md uses to refuse a waiver registry applies verbatim to a claims registry.
Precedent, twice: the policy.csv registry was retired (0f3e44ee), and the per-class line budgets were retired 2026-08-10 because "the gate fired on ordinary work." Same failure mode; this is the third instance.
What is NOT at fault
The low-churn parts share one property — one writer per file:
.agents/specs/<slug>.md: one file per row, zero conflicts in the whole sample. This is the shape everything else should copy.
.agents/roadmap_v1.md / *-matrix.md: stable row IDs and the 362-arch inventory are not derivable from anything else. Their 4 conflicts are the same insert-point defect, fixable by ordering, not by deletion.
.agents/benchmark-record.md: append-only and union-mergeable already.
- The public docs are user-facing surfaces. The ratchets on them are the defect, not the docs.
Proposed scope
- Remove
STATUS_RATCHET and the doc-gating global counters; keep the per-cell and per-paragraph caps, which are local and so couple nothing.
- Remove the active-claims table from
.agents/coordination.md; derive claims from open PRs and row/<ID> branch names. Keep the row contract and hierarchy prose.
- Drop
.agents/NOW.md's hard budget, or generate its live-claims table from the per-row files.
- Adopt the invariant: no surface that every PR must write. If N concurrent PRs all edit file F, F is a lock — split it one-file-per-row and glob it, or derive it.
Expected effect: roughly 13 currently-blocked PRs become mergeable without touching product code.
Spec to follow at .agents/specs/retire-shared-record-surfaces.md per the spec-before-code rule.
Measured on 2026-08-11 against
origin/maind928e2c3.16 of 29 open PRs are
CONFLICTING(55%). 13 of those 16 conflict in bookkeeping files only — not one line of product code.Conflicted paths across the 16, computed with
git merge-tree --write-tree origin/main <head>:.agents/coordination.md.agents/NOW.md.agents/roadmap_v1.mdscripts/check-public-doc-tables.pydocs/STATUS.mddocs/BENCHMARKS.md,docs/FEATURES.md,.agents/benchmark-record.mdsrc/ortests/pathgemma4_moe.cpp, #266test_async_llm.cpp, #171 a stale mega-branch)Supporting churn over the last 300 commits: 95 of 252 non-merge commits (38%) touched only bookkeeping; 22 commits are re-merges of
maininto a landing head (row/MODEL-MUSE-GLIMMERalone re-merged 7 times).Why this is structural, not bad luck
Three shared surfaces are shaped so that concurrent PRs must collide.
1.
.agents/NOW.mdis a fixed-size shared buffer, currently at exactly 6000/6000 chars (check-now-current.py:31 MAX_CHARS = 6000). Zero headroom, tuned to the byte. Adding a row therefore requires evicting another row, so every PR performs a read-modify-write of one global. Two concurrent writers conflict by construction — and the conflict is the lucky outcome. A clean auto-merge would apply both evictions and both additions: rows silently lost, budget silently blown.2.
STATUS_RATCHET = {"chars": 243245}(check-public-doc-tables.py:557) is a hardcoded byte count of a different file that may only decrease. A PR owingdocs/STATUS.mdone lifecycle line must delete unrelated prose from another row to pay for it, then edit the checker. That couples every PR to lines it does not own and makes the checker source itself a merge hotspot (4 PRs). The design already knows: a comment atcheck-public-doc-tables.py:331reads "a ratchet pinned to the byte turns every concurrently merged row's one-line status edit into a spurious failure" — answered with slack rather than by removing the coupling.3.
.agents/coordination.md's active-claims table is insert-at-one-anchor. The six ROCm GDN PRs (#334 #336 #341 #343 #345 #348) are a single-author sequential stack that conflicts on nothing but this file — each appends a ~1500-char claim row at the same line. That row restates the PR description into a tracked file.It contradicts the protocol it serves
AGENTS.mdstates "History is git", "There is no state log", and "A registry of exceptions is a state log, and this protocol has none." The active-claims table incoordination.mdand the live-claims table inNOW.mdare state logs — hand-maintained duplicates ofgh pr list,row/<ID>branch names, and issue state. The argumentAGENTS.mduses to refuse a waiver registry applies verbatim to a claims registry.Precedent, twice: the
policy.csvregistry was retired (0f3e44ee), and the per-class line budgets were retired 2026-08-10 because "the gate fired on ordinary work." Same failure mode; this is the third instance.What is NOT at fault
The low-churn parts share one property — one writer per file:
.agents/specs/<slug>.md: one file per row, zero conflicts in the whole sample. This is the shape everything else should copy..agents/roadmap_v1.md/*-matrix.md: stable row IDs and the 362-arch inventory are not derivable from anything else. Their 4 conflicts are the same insert-point defect, fixable by ordering, not by deletion..agents/benchmark-record.md: append-only and union-mergeable already.Proposed scope
STATUS_RATCHETand the doc-gating global counters; keep the per-cell and per-paragraph caps, which are local and so couple nothing..agents/coordination.md; derive claims from open PRs androw/<ID>branch names. Keep the row contract and hierarchy prose..agents/NOW.md's hard budget, or generate its live-claims table from the per-row files.Expected effect: roughly 13 currently-blocked PRs become mergeable without touching product code.
Spec to follow at
.agents/specs/retire-shared-record-surfaces.mdper the spec-before-code rule.