fix(record): retire the shared record surfaces that make concurrent PRs conflict (#364) - #368
Merged
Merged
Conversation
…conflicts (#364) 16 of 29 open PRs are CONFLICTING, and 13 of those 16 conflict in bookkeeping files ONLY, with no product code involved. Measured at origin/main d928e2c by running `git merge-tree --write-tree` against every open PR head: coordination.md in 8, NOW.md in 5, roadmap_v1.md in 4, check-public-doc-tables.py in 4, STATUS.md in 4 -- and any src/ or tests/ path in just 3, one of which is a stale mega-branch. Three surfaces are shaped so concurrent PRs must collide, rather than merely risk it. NOW.md is a fixed-size shared buffer sitting at EXACTLY 6000/6000 chars, so adding a row requires evicting another and every PR becomes a read-modify-write of one global -- where the conflict is the lucky outcome, since a clean three-way merge would apply both evictions and both additions and silently drop live rows. STATUS_RATCHET is a hardcoded byte count of a different file that may only fall, so a PR owing STATUS.md one lifecycle line must delete unrelated prose to pay for it; the checker's own comment already records the failure and answered it with slack rather than by removing the coupling. And coordination.md's claims table is insert-at-one-anchor, which is why six ROCm GDN PRs from one author's sequential stack conflict on nothing else. It also contradicts the protocol it serves. AGENTS.md holds that history is git and that there is no state log, yet both claims tables are state logs duplicating `gh pr list`, row/<ID> branch names and issue state. The argument that refuses a waiver registry applies unchanged to a claims registry, and this is the third instance of one failure mode: policy.csv was retired in 0f3e44e and the per-class line budgets on 2026-08-10, both because the gate fired on ordinary work. The exonerated surfaces share one property, one writer per file. Specs are one file per row and took ZERO conflicts across the whole sample, so W1-W5 rewrite the three offenders into that shape or derive them, keep every local per-cell and per-paragraph cap, and record the invariant: no surface that every PR must write. This commit is the spec and the record only. No checker semantic, no doc content and no product source changes; the four counter re-pins below are the existing bump convention for a real new row, each carrying its reason. Filing this one row tripped four separate hardcoded global counters (ENGINE_ROWS, two engine-matrix summary roll-ups, and RUNNABLE_BASELINE), which is the same defect the row exists to remove and is recorded here as evidence rather than worked around. Issue: #364 FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5 [Claude Code]
…ed write (#364) W1, W3, W4 and W5 of the spec. The claims table (W2) follows separately. W1 removes the `chars` key of STATUS_RATCHET. It was a byte count of docs/STATUS.md stored in scripts/check-public-doc-tables.py and allowed to move only downward, so a PR owing the page one lifecycle line had to delete unrelated prose from another row to pay for it AND re-pin the constant -- two shared files per PR, both of which every other PR was also editing. RED-BEFORE measured: the live page was EXACTLY 243245 of 243245 permitted chars, and one ordinary capability line put it 27 over. The cut is narrower than the spec's W1 text, deliberately. The four keys are not alike: `chars` is a LENGTH and moves on every edit, while `h2_sections`, `long_paragraphs` and `oversized_cells` count QUALITY DEFECTS, so an ordinary line moves none of them and two concurrent PRs do not collide on them. Those three are kept and carry the whole anti-decay obligation -- BENCHMARKS.md's 11,127-line decay would have tripped two of them on its own. Deleting them would have dropped a real obligation for no conflict benefit, which is the case the spec's stop condition names. W3 removes MAX_CHARS from check-now-current.py. The tracked digest measured EXACTLY 6000 of 6000: tuned to the byte, no headroom, so a row could only be added by evicting one. MAX_LINES and MAX_ENTRY_CHARS stay and carry the obligation -- a row costs one line rather than a variable number of bytes, and each entry is still capped locally. W4 sorts the roadmap issue table by stable row ID. The 43 rows are reordered and otherwise byte-identical, verified as a set before and after. Appending at one anchor is why concurrent additions collided; sorting puts them in different hunks. W5 records the invariant in AGENTS.md: no surface that every PR must write, and the three shapes that are admissible instead. The new tests/scripts/test_record_merge_shape.py asks git the question directly rather than inspecting a checker, and it CORRECTED a claim I had made in the spec. Removing a budget does NOT on its own make two row additions merge -- two appends collide at the same anchor either way. What the budget added on top was a forced deletion of unrelated content, and that is the part with teeth: it made every PR edit lines it did not own, and it made a SUCCESSFUL merge unsafe, since git resolving two such branches applies both evictions and both victims vanish with no gate noticing. W3 removes the eviction, W4 removes the collision, and neither alone is sufficient. The spec is corrected in the same commit. Gates: preflight rc=0; check_public_doc_tables 52 OK, check_now_current 11 OK, record_merge_shape 8 OK; check-public-doc-tables, check-now-current and check-agent-record all green on the live tree. No product source is touched. Issue: #364 FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5 [Claude Code]
Three conflicts, and all three are the defect this row removes. scripts/check-public-doc-tables.py and its test conflicted because main re-pinned the STATUS `chars` ratchet 243245 -> 243188 while this branch was deleting the key. Resolved in favour of the deletion: that IS the change, and the collision is one more instance of the coupling being removed -- an unrelated landing had to touch this constant, which is the whole reason it was a merge hotspot in 4 of the 16 conflicting open PRs. .agents/roadmap_v1.md conflicted because main appended three issue rows (#269, #305, #206) at the same anchor this branch had just sorted. Resolved by unioning both sides and re-sorting by the same stable key W4 uses, so the result carries all 46 rows with no row lost from either side. Verified by count and by check-agent-record. Suites re-run after resolution: check_public_doc_tables OK, check_now_current 11, record_merge_shape 8, check_pr_size 34; check-public-doc-tables, check-now-current and check-agent-record green on the merged tree. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5 [Claude Code]
…liding (#364) W2, and the largest single conflict source in the repository: the claims TABLE in coordination.md is insert-at-one-anchor, so every concurrent claim appends a row at the same line. It conflicted in 8 of the 16 conflicting open PRs measured at origin/main d928e2c, six of them (#334 #336 #341 #343 #345 #348) one author's sequential ROCm GDN stack whose ONLY conflict was this file. Their work did not overlap at all. New claims now go in .agents/claims/CLAIM-<ID>.md, one file per claim. parse_active_claims reads that directory AND the legacy table, so both are valid to the gate and the bidirectional cross-check is unchanged. A file with one writer cannot collide -- the shape .agents/specs/ already has, which is why specs took ZERO conflicts across the measured sample. The design differs from the spec's W2, which said to derive claims from open PRs and branch names. Reading the consumers showed that to be wrong twice over, and the spec is corrected rather than the change quietly reinterpreted. Deriving would put a NETWORK CALL inside an offline gate -- check-agent-record.py runs in preflight with no network -- and the table is not redundant with the PR list: check_row_contracts uses it for a bidirectional cross-check, where every SPIKE/ACTIVE matrix row must be claimed by a live claim and every claim must name rows in those states. A PR list cannot supply that, so deriving would have dropped a real guarantee. That is the case the spec's own stop condition names. Deliberately ADDITIVE: not one existing row is migrated. The 115 rows are spread across several interleaved tables, struck-through released entries and prose blocks, some below a later heading -- bulk-rewriting that is how a record gets lost, in a diff no reviewer could check. Rows leave as their claims close and the table empties on its own, while the conflict source is closed for every future claim from the day this lands. RED-BEFORE proven by mutation: with claim_sources reverted to coordination.md alone, tests/scripts/test_record_merge_shape.py goes 2 failures; restored byte-for-byte (md5 b9f325f1238a954001132a19309e7caa before and after) and green again at 11/11. Gates: preflight green apart from the commit-trailer repair in the same push; check-agent-record, claim-view --check-local, check-pr-size 34 all green. Issue: #364 FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5 [Claude Code]
The same three conflicts as the previous merge, for the same three reasons, in the same session. That is the measurement reproducing itself rather than a new problem: check-public-doc-tables.py and its test because main re-pinned the STATUS `chars` ratchet again while this branch deletes the key, and roadmap_v1.md because main appended issue rows at the anchor this branch sorts. Resolved identically: the deletion stands, and the roadmap is the union of both sides re-sorted by the same stable key, carrying all 48 rows with none lost from either side. Worth recording from the range this merge brings in: d72ac5a is "docs(now): keep the ROCm live-claim row inside the NOW.md budget" -- a commit whose entire content is paying the 6000-char eviction tax that W3 removes. It landed while this branch was removing the constant that demanded it. Suites after resolution: check_public_doc_tables, check_now_current, record_merge_shape, check_pr_size and agent_record all green; check-agent-record, check-public-doc-tables and check-now-current green on the merged tree. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5 [Claude Code]
…364) check-pr-size.py was RIGHT and this is its finding, not a workaround. Three governance checkers changed in this row -- check-agent-record.py (per-claim file source), check-pr-size.py (the .agents/claims path class) and check-gate-commands.py (the RUNNABLE_BASELINE re-pin) -- and the evidence for all three lived in the NEW tests/scripts/test_record_merge_shape.py rather than in each checker's paired suite. The gate requires the paired suite, correctly: that is where a later reader of that checker looks, and a new file is easy to miss or delete wholesale. Added, each with a mutation that proves the assertion is load-bearing: test_agent_record.py -- a claim in its own file registers exactly as a table row does; patching claim_sources back to coordination.md alone HIDES it (the mutation); a claim declared twice across the two sources is still rejected, so reading a second source did not weaken the duplicate check. test_check_pr_size.py -- .agents/claims/CLAIM-*.md classifies as the same class as the per-row spec it mirrors; substituting a never-matching pattern for CLAIM makes classify_path raise (the mutation), proving the clause is not shadowed by a broader rule; and a non-markdown path in the directory still fails closed, so the pattern is not a blanket directory exemption -- which AGENTS.md forbids. test_check_gate_commands.py -- the row is credited runnable and its spec really names failable commands; removing the entry from RUNNABLE_BASELINE must break the exact pin (the mutation), so the baseline is not decorative. Also moved `if __name__ == "__main__"` to the END of test_agent_record.py and test_check_pr_size.py. It sat mid-file, so classes appended after it were defined AFTER unittest.main() had already collected and run -- the suites reported OK while never executing the new tests (34 and 25 before, 38 and 29 after). A green suite that silently skips what was just added is the same class of defect as the rest of this row. Suites: test_agent_record 29, test_check_pr_size 38, test_check_gate_commands 27, test_record_merge_shape 11, all OK. Issue: #364 FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5 [Claude Code]
dariofinardi
pushed a commit
to dariofinardi/vllm.cpp
that referenced
this pull request
Aug 11, 2026
FOLLOWING_AGENTS_PROTOCOL main advanced 32 commits during this benchmark run and retired two of the exact mechanisms this change had to fight: mudler#376 removed `.agents/NOW.md`'s live-claims table, so no row-advancing change writes that file any more, and mudler#368 deleted `STATUS_RATCHET` from `scripts/check-public-doc-tables.py`. Both of this row's edits to those surfaces are therefore obsolete, not merged: the target-branch version was taken wholesale for each conflicted file rather than three-way merged, per the keyed-record rule. What survives is the measurement itself and the surfaces that still carry it: `.agents/benchmark-record.md`, `.agents/specs/muse-glimmer.md` §14, `.agents/model-matrix.md`, `docs/BENCHMARKS.md`, `docs/FEATURES.md` and `docs/STATUS.md`. Verified byte-for-byte that no unrelated key moved. Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5 [Claude Code]
localai-bot
pushed a commit
that referenced
this pull request
Aug 11, 2026
…retired under us `origin/main` advanced a SECOND time during this landing, 31 commits, while the reconciliation merge below was being gated. A plain `git push` was refused as non-fast-forward, which is git protecting those merges, so this fetches, re-merges, reconciles every record against the shape main now has, and re-gates. No force, no rebase of a published branch. THE TWO CONSTRAINTS THIS LANDING WAS BUILT AROUND NO LONGER EXIST. #364/#368 (`ENG-RECORD-CONFLICT-SURFACES`) retired them as a defect, and AGENTS.md gained the rule behind it: *no surface that every PR must write*. Concretely: - `STATUS_RATCHET["chars"]` is DELETED from `scripts/check-public-doc-tables.py`. It was a byte count of one file stored in another and allowed only to fall, so every PR owing STATUS.md a line had to evict unrelated prose AND edit the checker. The three QUALITY keys (`h2_sections`, `long_paragraphs`, `oversized_cells`) are kept. - `MAX_CHARS` is DELETED from `scripts/check-now-current.py`. NOW.md was a fixed-size shared buffer at exactly 6000/6000, so adding a row meant evicting someone else's. `MAX_LINES` and `MAX_ENTRY_CHARS` are kept, and they cap the ENTRY rather than the file. So the ratchet arithmetic this landing carried out three times -- 243188 -> 243128 -> 243119 -> 243117, each byte-tight and re-measured -- is now moot, and the honest resolution is to DROP it rather than defend it. Main's version of both checker files and of `tests/scripts/test_check_public_doc_tables.py` is taken BYTE-FOR-BYTE, which also drops PR #267's `test_one_char_of_growth_on_the_LIVE_page_is_rejected`: that guard asserts on the `chars` key, and the key is gone. Its subject was retired, not its argument. `grep 'STATUS_RATCHET\["chars"\]'` over `scripts/` and `tests/scripts/` returns nothing. Equally, the NOW.md compactions this landing made to buy room -- the `SERVE-METRICS` restatement, the MiniMax-H3 and Release cells, the TP row's `(unblocks #127/#154/#155)` clause -- are reverted to main's fuller text: they were payments for a budget that no longer exists, and carrying them would be unrelated churn in a keyed record. Also fixed on main and no longer owed by anyone: the four conflict markers committed to `.agents/specs/sm120-qwen35-conv-channel-tile-2026-08-08.md`, which this landing found on main and did not touch (`76dfe8dc`). KEYED RECORDS, reconciled against the shape main now has. scripts/check-public-doc-tables.py, tests/scripts/test_check_public_doc_tables.py main's version taken BYTE-FOR-BYTE (`git diff` vs `f64f2b71` is empty for both). The landing's ratchet work is dropped entirely, per above. .agents/roadmap_v1.md CONFLICT. Main SORTED the whole issue table by Row then issue number, which moved every line. Main's sorted table taken wholesale and the landing's SIX rows re-inserted in sorted position -- #299, #314, #337, #338 under `ROAD-V1-C1`, #278 under `LORA-RUNTIME`, #264 beside #238 under `SAMPLE-LOGPROB-TOKEN-IDS`. Verified: all 48 of main's rows present, exactly 6 added, and the only other line that differs from main is the `ROAD-V1-C7` portfolio row, which PR #267 deliberately updates. .agents/engine-matrix.md CONFLICT. Main's `Serving, API, CLI, library` row gained a row and a `READY` (27 -> 28). Main's row kept wholesale, the landing's `LoRA and adapters` row (`ANCHOR-BACKFILL` -> `ACTIVE`) reapplied, and the **Total** RECOMPUTED from the ten actual area rows rather than carried from either side: 148|35|16|4|9|27|8|9|39. `check-agent-record.py` confirms ENGINE=148. .agents/coordination.md auto-merged and verified byte-identical to main's edit set. #368 introduced `.agents/claims/` (one file per claim) but deliberately does NOT migrate existing rows -- the checker still reads the legacy table -- so PR #282's `CLAIM-LORA-RUNTIME-W2` row stays where it is and is removed when the claim closes. scripts/check-gate-commands.py CONFLICT: both sides added a comment block at the same anchor. Unioned; `RUNNABLE_BASELINE` now carries `ENG-RECORD-CONFLICT-SURFACES` (main's), `ENG-RELEASE-CONTAINERS` (main's) and `LORA-RUNTIME` (#282's). 117 gated rows, 32 runnable. docs/FEATURES.md CONFLICT. Main's newer prose wins (37 registered architectures, up from 35) and PR #324's merged-GEMM sentence is reapplied into it. First attempt as a separate paragraph tripped the 21-vs-20 prose-paragraph cap and appending it inline tripped the 700-char paragraph cap at 782, so it is paid for INSIDE the paragraph exactly as #324 originally did -- the lead-in collapsed, total 697 of 700. No cap was raised. .agents/NOW.md CONFLICT. Main's three fuller rows taken wholesale (`BACKEND-ROCM` now records the gfx1100 GDN slice and #269 M0-M4). 94 of 100 lines, every entry inside MAX_ENTRY_CHARS. docs/STATUS.md, docs/BENCHMARKS.md untouched by main this time; 243,117 and 44,839. BENCHMARKS is still 161 chars inside its hard 45,000 cap thanks to the row PR #282's merge moved into `.agents/benchmark-record.md`. GATE for the WHOLE landing, re-run by the operator on THIS tree, CPU Release, foreground, no timeout on any test binary. cmake --build build-cpu -j 18 692 targets, 0 errors, 0 warnings Focused, all seven declared gates of the three PRs: test_dense_gate_up_seam_forward 4/4 cases | 1940 assertions | 0 skipped test_linear_method 6/6 | 76 | 0 skipped test_lora_layers 16/16 | 4498 | 0 skipped test_punica_cpu 8/8 | 149 | 0 skipped test_sampler 21/21 | 114 | 0 skipped test_input_batch 29/29 | 205 | 0 skipped test_llm_engine 24/24 | 494 | 0 skipped Checkers, `scripts/__pycache__` cleared before each: check-agent-record.py OK ENGINE=148 MODEL=362 QUANT=82 KERNEL=51 BACKEND=80 check-public-doc-tables.py OK BENCHMARKS 44,839 / 45,000 FEATURES 27,371, longest prose 697 / 700 check-now-current.py OK 94 / 100 lines check-fusion-consistency.py OK glue 14 / 12 routed / 2 allowlisted; merged-gemm 10 / 6 / 6, 0 drift check-gate-commands.py OK 117 gated rows, 32 runnable check-commit-trailers.py OK over the whole landing range Checker unit suites, all seven: test_check_public_doc_tables 52/52, test_check_gate_commands 28/28, test_check_fusion_consistency 20/20, test_agent_record 29/29, test_check_now_current 11/11, test_record_merge_shape 11/11, test_check_pr_size 38/38. Full `ctest --test-dir build-cpu -j 6 --output-on-failure`, 383 tests, 2771.26 s. BOTH numbers reported: 99% tests passed, 2 failed out of 383 -- `test_async_llm` (0.33 s) and `test_openai_conformance` (163.91 s). Both are on the known starvation-prone list, and both pass SERIALLY on an idle box (load 2.52): test_async_llm 15/15 cases | 443 assertions | wall 0.05 s test_openai_conformance 23/23 | 252 | wall 0.45 s `test_openai_api_server`, which needed a serial re-run last time, PASSED under -j 6 here in 128.64 s -- the same binary, the same tree, a quieter box, which is the clearest available evidence that these are scheduling artifacts rather than defects. Neither failing binary loads a file this landing touches. The #274 ASan/UBSan five did not appear: this gate is Release with no sanitizer, and `test_llm_engine`, `test_capi` and `test_llama_embedding_fold` -- three of that five -- all PASS here (2006.17 s, 1618.64 s, 14.20 s). Note on `test_llm_engine`'s assertion count, corrected earlier in this landing: it is run-to-run NONDETERMINISTIC in this binary (493, 493, 492 measured across three consecutive runs of one unmodified build; 494 here). Every run is 24/24 cases, 0 failed, 0 skipped. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: ClaudeCode:claude-opus-5 [ClaudeCode]
joral
pushed a commit
to joral/vllm.cpp
that referenced
this pull request
Aug 11, 2026
Main moved 158 commits since the last merge. Merged, not rebased: main is never force-pushed, so the branch absorbs main rather than rewriting over it. Three files conflicted and two keyed records auto-merged; none of the five was left to git's three-way result (AGENTS.md "Records"). Each was reset to `origin/main` wholesale and the branch's scoped edit reapplied against an anchor asserted to match exactly once: - `.agents/roadmap_v1.md` (CONFLICT) — main re-sorted the intake table by row ID; the two `KV-EVENTS` issue rows (mudler#352, mudler#353) are reinserted in the sorted position ahead of `KV-EXTERNAL-CACHE`, not where the old unsorted table had them. - `docs/USAGE.md` (CONFLICT) — both sides appended after the logprobs prose. Kept BOTH: main's `logprob_token_ids` paragraph, then this branch's "KV-cache events, and `kv_cache_report_mode`" section. - `scripts/check-gate-commands.py` (CONFLICT) — both sides grew `RUNNABLE_BASELINE` at the same anchor. Took main's set entire (which is four entries wider and drops the three DONE rows mudler#374 closed) and reinserted only the `KV-EVENTS` entry with its re-pin rationale. - `.agents/engine-matrix.md` (auto-merged, REDONE) — main's `KV-EVENTS` row is byte-identical to the merge base's, so the row replacement reapplies cleanly. Lifecycle state is `ACTIVE` on both sides, so no matrix count moves and none of the branch's totals are carried. - `.agents/coordination.md` (auto-merged, REDONE) — reverted to `origin/main` byte-for-byte. `CLAIM-KV-EVENTS-W3` moves to `.agents/claims/CLAIM-KV-EVENTS-W3.md`, the per-claim surface mudler#364 added while this branch was parked; its README says new claims go there, and it is what made this row conflict in the first place. `check-agent-record.py` reads both. `scripts/check-public-doc-tables.py` is taken from main unchanged: the `STATUS_RATCHET["chars"]` pin was retired by mudler#364/mudler#368 and is not reintroduced. `docs/BENCHMARKS.md` is untouched — this row has no measurement, so nothing is charged against its 45,000-char cap. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: ClaudeCode:claude-opus-5 [ClaudeCode]
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Issue #364. Row
ENG-RECORD-CONFLICT-SURFACES. Spec.agents/specs/retire-shared-record-surfaces.md.Supersedes #367 (same work; that branch's commits carried a malformed
Assisted-bytrailer and the history was rewritten rather than force-pushed).Spec + W1–W5, complete. No product source is touched.
Measured
git merge-tree --write-tree origin/main <head>over every open PR atorigin/maind928e2c3: 16 of 29 conflict (55%), and 13 of the 16 conflict in bookkeeping only —coordination.md8,NOW.md5,roadmap_v1.md4,check-public-doc-tables.py4,STATUS.md4, against 3 in anysrc/ortests/path.What changed
charskey ofSTATUS_RATCHET, a byte count ofdocs/STATUS.mdpinned in the checker and allowed to fall only. Narrowed from the spec: the other three keys count quality defects, not length, so they don't move on an ordinary edit — kept, and they carry the anti-decay obligation. RED-BEFORE: the page was exactly 243245/243245; one capability line put it 27 over.MAX_CHARSfromcheck-now-current.py. The digest measured exactly 6000/6000, so a row could only be added by evicting one.MAX_LINES/MAX_ENTRY_CHARScarry the obligation..agents/claims/CLAIM-*.md, one file per claim, read alongside the legacy table. Redesigned from the spec: deriving fromgh pr listwould put a network call in an offline gate and would drop the bidirectional cross-checkcheck_row_contractsperforms. Additive on purpose — no row migrated; the table empties as claims close.AGENTS.md§Records: no surface that every PR must write, and the three admissible shapes.A correction the tests forced
tests/scripts/test_record_merge_shape.pyasks git directly, and it disproved a claim I had made in the spec: removing a budget does not on its own make two row additions merge — two appends collide at the same anchor either way. What the budget added was a forced deletion of unrelated content, and that is the part with teeth: it made every PR edit lines it did not own, and it made a successful merge unsafe (git applies both evictions, both victims vanish, no gate notices). W3 removes the eviction, W4 the collision; neither alone suffices. The spec is corrected in the same change.Evidence
test_check_public_doc_tables52,test_check_now_current11,test_record_merge_shape11,test_check_pr_size34.claim_sourcestocoordination.mdalone → 2 failures; tree restored byte-for-byte (md5b9f325f1238a954001132a19309e7caa) → green.origin/mainmid-flight produced three conflicts, all three the defect itself (main re-pinnedchars243245→243188 against the deletion; unsorted roadmap appends). Resolved keeping all 46 issue rows.ENGINE_ROWS, two matrix roll-ups,RUNNABLE_BASELINE), each re-pinned with its reason and recorded as evidence.🤖 Generated with Claude Code