P0 live-state audit: 54 rows claimed ACTIVE, none had a branch, 10 had no evidence at all - #59
Closed
localai-bot wants to merge 34 commits into
Closed
P0 live-state audit: 54 rows claimed ACTIVE, none had a branch, 10 had no evidence at all#59localai-bot wants to merge 34 commits into
localai-bot wants to merge 34 commits into
Conversation
…s, evidence stays in files Accepted design, not yet enforced. Moves the volatile control plane (row State/Owner, coordination claims, NOW) onto GitHub issues, and keeps doctrine and evidence in the repo. Rationale: every recorded record-corruption event is the same bug — one fact stored in two writable places, reconciled by a three-way merge (the 2026-08-04 binding-number variant, the interleaved state tail, union-duplicated keyed rows, the unclaimed concurrent pushes). Issue assignment is a server-side atomic write, so the claim race disappears. Scope: ~160 live rows (SPIKE/READY/ACTIVE/GATING/PARTIAL/BLOCKED) become issues; the 155 INVENTORIED/DONE/OUT-OF-SCOPE rows, the 52 ANCHOR-BACKFILL evidence-debt rows, and the ~48k lines of append-only evidence (state, benchmark-record, parity-ledger, specs, public keyed tables) stay in git. A number that exists only in an issue comment is not binding. PARTIAL rows are included (user-directed): on a public roadmap a capability with explicit missing modes is exactly the content outsiders need. P0 is the live-state audit and lands first, standalone (user-directed): 49 rows claim ACTIVE simultaneously, which cannot be true. A truthful matrix is worth having even if every later phase stalls, and auditing first means the backfill mints issues from a corrected record rather than publishing the rot. Preserves the T0 spike gate (state:ready+ implies a committed spec card) and the DONE anchor contract via a CI-only check-issue-record.py, with a skip-when-offline / required-in-CI degradation rule so local work is never blocked and nothing merges unreconciled. Membership is enforced in both directions so the tracker is exhaustive, not merely consistent. Records that closing keywords must live in the squash COMMIT message, not the PR body: this project lands squashes via commit-tree + direct push, so PR-body keywords would never fire and issues would silently never close. FOLLOWING_AGENTS_PROTOCOL Assisted-by: Claude Code:claude-opus-5 [ClaudeCode]
… Git reality Implementation plan for phase P0 of .agents/specs/issue-native-tracking.md. Builds scripts/audit-live-rows.py, which imports the row parser from check-agent-record.py rather than reimplementing it (P1's sync-rows.py reuses the same helpers), cross-references each live row against row/<ID> branches and main commits, and classifies ACTIVE rows IN-FLIGHT / LANDED / ABANDONED. The classifier is a pure function over gathered evidence, so it unit-tests without Git and cannot be flaky. The tool proposes and reports; it never rewrites a matrix. Corrections are applied per-matrix in reviewable commits, because a state transition carries contract obligations only a reader of the row can satisfy: an abandoned ACTIVE row goes to READY if it has a real spec, otherwise INVENTORIED. The gate is wired LAST, after the record is repaired, so it never has to be relaxed to pass. Git evidence only, no gh: an open PR always has a row/<ID> branch with unmerged commits, so P0 stays offline-capable and free of the issue machinery P1 introduces. FOLLOWING_AGENTS_PROTOCOL Assisted-by: Claude Code:claude-opus-5 [ClaudeCode]
Reuses the row parser in check-agent-record.py rather than reimplementing it, so the audit and the gate can never disagree about what a row is. FOLLOWING_AGENTS_PROTOCOL Assisted-by: Claude Code:claude-opus-5 [ClaudeCode]
… were invisible The 160 baseline was an ad-hoc regex estimate, not a measurement. Measured with parse_claim_rows itself on the same base 027af9b: 177 live rows across the 5 files in MATRIX_PATHS (ACTIVE 51, PARTIAL 60, SPIKE 43, GATING 10, BLOCKED 7, READY 6). More consequential: check-agent-record.py's MATRIX_PATHS covers only 5 of the 7 matrices. feature-matrix.md and sglang-matrix.md hold a further 11 live rows (3 ACTIVE, 8 PARTIAL) that would have become unaudited public issues in P2. The audit now defines AUDIT_MATRIX_PATHS over all 7, with a test asserting it. It deliberately does NOT widen MATRIX_PATHS itself: that governs a repo-wide CI gate, and these two files have never been held to its row contract. Total: 188 live rows, 54 claiming ACTIVE. FOLLOWING_AGENTS_PROTOCOL Assisted-by: Claude Code:claude-opus-5 [ClaudeCode]
…ere invisible Measured with parse_claim_rows itself (zero parse errors across all 7 matrices) rather than the ad-hoc regex that produced the earlier 393/367/160 figures. 714 ID'd rows: INVENTORIED 449, PARTIAL 68, ANCHOR-BACKFILL 57, ACTIVE 54, SPIKE 43, DONE 20, GATING 10, BLOCKED 7, READY 6. Live total 188, so the backfill mints ~188 issues, not ~160. Also records the coverage caveat that P0 must carry: MATRIX_PATHS covers 5 of the 7 matrices, and feature-matrix.md + sglang-matrix.md hold 11 live rows it never sees. Auditing and backfilling all seven is now explicit. 54 rows claim ACTIVE simultaneously. FOLLOWING_AGENTS_PROTOCOL Assisted-by: Claude Code:claude-opus-5 [ClaudeCode]
feature-matrix.md and sglang-matrix.md sit outside check-agent-record.py's MATRIX_PATHS, hiding 11 live rows (3 ACTIVE, 8 PARTIAL) from the audit. Cover them via AUDIT_MATRIX_PATHS instead of widening MATRIX_PATHS itself: that list governs a repo-wide CI gate whose row contract these two files have never been held to. The parser stays imported, never reimplemented. Live census over all seven: 188 rows -- ACTIVE 54, PARTIAL 68, SPIKE 43, GATING 10, BLOCKED 7, READY 6. FOLLOWING_AGENTS_PROTOCOL Assisted-by: Claude Code:claude-opus-5 [ClaudeCode]
Task 1's review found the plan's own code was wrong in three places where the failure mode is silent, plus a test that did not test its commit. 1. main_commits used --fixed-strings, an UNANCHORED substring match. 55 live ID pairs are prefixes of longer ones (MODEL-MM of seven MODEL-MM-* rows, LOAD-SAFETENSORS of LOAD-SAFETENSORS-DIRECT-DENSE). The classifier calls any commit LANDED, so an abandoned row would report as finished -- the exact false negative the tool exists to prevent. Now anchored via a pure id_grep_pattern() with a collision test. 2. live_rows discarded the parse-error sink. parse_claim_rows DROPS a row it cannot parse, so a malformed row would vanish from a census whose point is completeness -- worst on the two matrices no CI gate parses. Sink surfaced; audit() aborts on any error. 3. git() maps every failure to "", indistinguishable from "no evidence". An unfetched origin/main would make every row look abandoned and propose downgrading all 54 ACTIVE rows. require_origin_main() now fails loudly. 4. The seventh-matrix test asserted a filename was in a list, which passes even if feature-matrix.md yields zero rows. Now asserts it yields live rows. Also carries the duplicate-ID discovery the widened coverage surfaced: BACKEND-CUDA-SM121 and BACKEND-CPU are PARTIAL in BOTH backend-matrix.md and feature-matrix.md, so 188 live rows hold only 186 unique IDs, and check-agent-record.py has never seen it because it only walks MATRIX_PATHS. Task 4 reports duplicates; Task 5 must settle ownership before any backfill. FOLLOWING_AGENTS_PROTOCOL Assisted-by: Claude Code:claude-opus-5 [ClaudeCode]
…nt CLI Four review findings, all in the direction the audit exists to prevent -- a dead row reporting as alive. Anchor main_commits on ID boundaries (id_grep_pattern, -E). 55 pairs of live row IDs are prefixes of longer ones, and the classifier calls any commit LANDED, so an abandoned MODEL-FACTORY was credited with MODEL-FACTORY-registry commits. Measured on origin/main: MODEL-FACTORY 4 hits -> 1, MODEL-MM 7 -> 5, LOAD-SAFETENSORS 4 -> 3; every excluded commit verified to mention only a longer ID, so no real evidence is lost. Give live_rows an errors sink. parse_claim_rows DROPS an unparseable row, so swallowing that list let a malformed row vanish from a census whose whole point is completeness -- worst on feature-matrix.md and sglang-matrix.md, which no CI gate parses. Add require_origin_main. git() maps every failure to "", which downstream reads as "no evidence": one unfetched ref would have proposed downgrading all 54 ACTIVE rows. Absence of work and absence of information must not look alike. Guard __main__. The file is executable and advertises --check, but the CLI lands in step 4; until then --check exited 0, the worst answer from a gate. Docstring says 54 ACTIVE, the measured figure. Census unchanged at 188. FOLLOWING_AGENTS_PROTOCOL Assisted-by: Claude Code:claude-opus-5 [ClaudeCode]
They were inserted into Task 3's test block by mistake, so regenerating Task 1's brief dropped them — the implementer noticed the orphaned `import re` and wrote them anyway rather than shipping the round's central correctness fix untested. Reconciled to what actually shipped, so a later brief cannot silently delete the anchoring coverage. Also records CommandLineGuardTests as transitional: Task 4 lands the real CLI and must delete it rather than leaving both. Counts: Task 1 now 9. FOLLOWING_AGENTS_PROTOCOL Assisted-by: Claude Code:claude-opus-5 [ClaudeCode]
IN-FLIGHT deliberately outranks LANDED: a row can have landed groundwork and still have open follow-up, and calling that finished would steal a live claim. FOLLOWING_AGENTS_PROTOCOL Assisted-by: Claude Code:claude-opus-5 [ClaudeCode]
Task 2's review found the plan specified `unmerged_by_branch.get(b)`, which
returns None for a branch that was never gathered -> falsy -> the row reports
LANDED. That is a live claim reported as finished, the exact false negative the
tool exists to prevent, and it contradicts the principle require_origin_main()
already encodes: absence of work and absence of information must never look the
same. `branches` is the authority for which keys must exist, so a missing key is
a caller bug and a KeyError at the audit's boundary is the loud alternative.
Also repairs two test gaps the review found:
- assertIn("merged", reason.lower()) is near-vacuous because "unmerged"
contains "merged", so it passed for BOTH verdicts; now "fully merged".
- no test used more than one branch, so sorted() and the live-branch filter's
effect on the reason text were unpinned -- deleting sorted() survived the
whole suite. Adds a mixed two-branch case and a KeyError case.
Counts: Task 2 now 17.
FOLLOWING_AGENTS_PROTOCOL
Assisted-by: Claude Code:claude-opus-5 [ClaudeCode]
…aths A missing key is a CALLER bug, not evidence: .get() returned None -> falsy -> the branch dropped out of live_branches and the row reported LANDED, a live claim reported as finished. Indexing raises at the audit's own boundary instead, so absence of information can never pass for absence of work. Tests: KeyError on an ungathered branch; the reason names the live branch and not the merged one; the reason is order-independent on BOTH paths (the mixed case has one live branch, so sorted() is a no-op there and deleting it survives); and "fully merged", since "unmerged" contains "merged". FOLLOWING_AGENTS_PROTOCOL Assisted-by: Claude Code:claude-opus-5 [ClaudeCode]
…e filter My own fix for the multi-branch gap did not close it: the mixed case has exactly one LIVE branch, so sorted() is a no-op on that call and deleting it still survived the suite — the very mutation the finding named. Two branches on the same side of the filter are what pin determinism, on both reason paths. A report that reshuffles its own evidence between runs cannot be diffed by the human who has to act on it. Counts: Task 2 now 18. FOLLOWING_AGENTS_PROTOCOL Assisted-by: Claude Code:claude-opus-5 [ClaudeCode]
Report-only by construction: CHECK_FAILS_ON is ACTIVE alone, so the keyword
heuristic can never fail a build.
Two test strengthenings past the brief, each because the briefed assertion
provably did not pin what it named. `assertNotIn("PARTIAL", CHECK_FAILS_ON)`
passes for frozenset() -- a gate that fails on nothing -- and for the bare
string "ACTIVE", so the membership is now pinned exactly. And the substring
trap's "node" half passes when "no" is dropped from GAP_MARKERS altogether,
so each half now pins its marker as live.
FOLLOWING_AGENTS_PROTOCOL
Assisted-by: Claude Code:claude-opus-5 [ClaudeCode]
…e substring trap
Task 3 found two more of the "passes with its subject deleted" class in my text:
- assertNotIn("PARTIAL", CHECK_FAILS_ON) passes for frozenset() — a check mode
that fails on NOTHING — and for the bare string "ACTIVE", since "PARTIAL" is
not a substring of it. Report-only means excluded from a set that still gates
something, so pin membership exactly and pin that the gated state is live.
- The substring trap's "node" half also passed when "no" was dropped from
GAP_MARKERS entirely, so assertFalse held for the wrong reason. Each half now
pins its marker as live.
Counts: Task 3 now 24.
FOLLOWING_AGENTS_PROTOCOL
Assisted-by: Claude Code:claude-opus-5 [ClaudeCode]
Task 3's review measured the heuristic's failure direction: 11 of the 48
PARTIAL rows it reads as EXPLICIT qualify only via bare `no` or `gap`, on prose
asserting goodness rather than absence — "no longer double-resides", "max gap
0.0 nats", "CLOSED the CPU RSS gap". Those are vague rows passing unreviewed,
and 68 PARTIAL rows become public issues. Narrowing the input does not help
(stripping code spans changes zero verdicts, measured).
So the report names WHICH marker fired, letting a reviewer discount a bad hit
at a glance rather than trusting the verdict. Cheaper and more honest than
tuning the keyword list until it looks right.
Also escapes markers before interpolation: the list invites human tuning, and
an unescaped "(" would raise re.error at IMPORT time and take the module down,
while "wip?" would silently compile to something matching "wi ".
Counts: Task 3 now 26.
FOLLOWING_AGENTS_PROTOCOL
Assisted-by: Claude Code:claude-opus-5 [ClaudeCode]
…ling
Review finding 1: the heuristic fails in the UNSAFE direction. 11 of the 48
PARTIAL rows it reads as explicit qualify only via bare `no` or `gap`, on prose
asserting goodness rather than absence ("no longer double-resides", "max gap
0.0 nats"). Tuning the keyword list would only move the boundary, so instead
matched_marker() names the marker that fired and Task 4's report can show it:
over-flagging costs a reviewer a glance, under-flagging ships a vague public
issue.
Review finding 2: markers were interpolated unescaped. GAP_MARKERS invites
human tuning, and a marker containing "(" would raise re.error at IMPORT time
and take the whole module down, while "not.yet" would compile silently into a
wildcard matching "notXyet". They are now escaped, with the escaped space still
widened to \s+ so multi-word markers behave as before.
gap_pattern() takes its markers as an argument rather than closing over
GAP_MARKERS: no shipped marker needs escaping today, so an inline expression
could drop re.escape with no test able to notice. Mutation testing confirms
dropping re.escape is now caught.
FOLLOWING_AGENTS_PROTOCOL
Assisted-by: Claude Code:claude-opus-5 [ClaudeCode]
…stable
My inline GAP_RE expression could not be tested: no shipped marker needs
escaping, so a test would have to rebuild the pattern and would only test its
own copy. gap_pattern(markers) lets a test hand the real shipped code "not.yet"
and "fp4(". Regex is byte-identical.
FOLLOWING_AGENTS_PROTOCOL
Assisted-by: Claude Code:claude-opus-5 [ClaudeCode]
547516e used an index slice (t.index(start) .. t.index(")\n```")) to swap the GAP_RE expression. The end anchor was not unique, so the slice ran far past its intended region and silently removed Task 4 entirely along with CHECK_FAILS_ON, names_missing_modes and matched_marker, and glued a code fence. Nothing failed: the plan still parsed as Markdown and preflight stayed green, so the loss only surfaced when task-brief could not find Task 4. Rebuilt from 90792fe and reapplied the three intended changes with COUNTED replacements (assert count == 1 per anchor), then asserted 7 task headings, balanced fences, and every public symbol present. The lesson is the one already in the record: assert anchor UNIQUENESS, never existence, and never slice a document by a non-unique end marker. Also lands the VAGUE_FLAG repair 547516e was carrying: every PARTIAL row now has a flag, so "needs review" must key on the vague string, not on a non-empty flag, or all 68 PARTIAL rows count as vague instead of the 20 that are. FOLLOWING_AGENTS_PROTOCOL Assisted-by: Claude Code:claude-opus-5 [ClaudeCode]
check mode is deliberately NOT wired into preflight or CI yet -- it fails today, and that failure is the audit finding the record has to absorb first. FOLLOWING_AGENTS_PROTOCOL Assisted-by: Claude Code:claude-opus-5 [ClaudeCode]
…roved inert test_only_the_vague_flag_counts_as_needing_review compares two literals and calls nothing, so mutating main()'s counter to `if i["flag"]` — the exact 68-vs-20 bug it was written to prevent — leaves it green. Task 4 adds a main()-level counting test that kills that mutation, plus five covering audit()'s two abort guards, duplicate_live_ids, the duplicate summary line, and --json, none of which any briefed test exercised. Counts: Task 4 now 38, Task 7 now 41. FOLLOWING_AGENTS_PROTOCOL Assisted-by: Claude Code:claude-opus-5 [ClaudeCode]
…(P0 step 5) Findings land before corrections so the reasoning is reviewable independently of the churn. Includes the hand-verified sample that validates the classifier. 188 live rows; ACTIVE 54 -> 0 IN-FLIGHT, 44 LANDED, 10 ABANDONED. Zero rows have a row/<ID> branch, so every LANDED verdict rests on the weakest rule in the classifier -- a commit message mentioning the ID -- and 8 of the 44 are credited to a commit whose diff is records and docs ONLY. LANDED is recorded as "has evidence worth reading", never "finished"; no row is proposed for DONE. All 10 abandoned rows resolve a real spec link, so all 10 are legal at READY and none needs INVENTORIED -- but READY is the legality FLOOR, not a recommendation: each carries in-row anchors asserting passing gates, so the final state is deferred to a human for all ten. Every one also sits inside an active claim, and 11 claims reference nothing but abandoned rows, so the correcting change must retire them in the same commit or check_row_contracts goes red. Duplicate live IDs settled here: backend-matrix.md OWNS BACKEND-CPU and BACKEND-CUDA-SM121; the feature-matrix entries become non-claimable pointers, so the backfill mints one issue per item rather than two. FOLLOWING_AGENTS_PROTOCOL Assisted-by: Claude Code:claude-opus-5 [ClaudeCode]
Task 5 found that every abandoned row also sits in an active claim in coordination.md, and check_row_contracts cross-checks a row's Owner against that claim table. Moving a row off ACTIVE without retiring its claim in the SAME commit turns check-agent-record.py red between the two edits. Claims are RETIRED (moved to the completed block with their outcome), never emptied. Also records the LANDED caveat the audit surfaced: all 44 rest on a commit merely MENTIONING the row ID, and 8 on records-only commits that changed no code. LANDED means "has evidence worth reading", never "finished". FOLLOWING_AGENTS_PROTOCOL Assisted-by: Claude Code:claude-opus-5 [ClaudeCode]
…re Task 6 Task 5's review found the retirement instruction was ambiguous in a way that would have left the gate red: parse_active_claims keys on a line starting with "| `CLAIM-", so a claim moved to a table row in another section is still parsed as ACTIVE. The repo's own archival convention uses prose bullets. Also adds a re-fetch step: the artifact pins origin/main at cf32c61 and the remote has advanced, so Task 6 must re-run the audit rather than apply a possibly stale proposal list. FOLLOWING_AGENTS_PROTOCOL Assisted-by: Claude Code:claude-opus-5 [ClaudeCode]
User-directed 2026-08-06. The 44 LANDED rows, the ~30 vague PARTIAL rows and the 2 duplicate IDs stay as they are, documented in the audit artifact rather than changed. Smallest truthful correction: the ACTIVE claim is the only thing the tool can settle on its own evidence. FOLLOWING_AGENTS_PROTOCOL Assisted-by: Claude Code:claude-opus-5 [ClaudeCode]
…E (P0 step 6) Evidence: .agents/specs/live-state-audit-2026-08-06.md ➂. ENG-MM-INPUT-PIPELINE, ENG-MM-VIDEO-FORWARD and ENG-MM-AUDIO-ENCODER each claimed ACTIVE with no row/<ID> branch anywhere and no commit on origin/main naming the stable ID, so the claim is unverifiable from Git. They move to READY — the legality floor, all three resolve a real spec that names their token — NOT a judgement that the work is unstarted; each row's own anchors assert a passing gate, which is exactly why the audit refused to recommend anything stronger. Only the State and Owner cells move; Our code / Tests-evidence / Upstream / Spike-spec are durable anchors and are untouched. The area rollup moves with the rows (Engine and scheduling ACTIVE 9->6, READY 0->3). check_row_contracts cross-checks a row's Owner against coordination.md, so the four claims that reference ONLY these rows are RETIRED as prose bullets in the SAME commit (emptying them is illegal too — an active claim with no row IDs fails the same gate): CLAIM-MULTIMODAL-M1, CLAIM-MULTIMODAL-M3C, CLAIM-MULTIMODAL-TOWER-FIDELITY, CLAIM-AUDIO-ENCODER, each with its recorded outcome. check-agent-record EXIT=0; agent-preflight.sh EXIT=0; audit-live-rows abandoned 10 -> 7. FOLLOWING_AGENTS_PROTOCOL Assisted-by: Claude Code:claude-opus-5 [ClaudeCode]
… (P0 step 6) Evidence: .agents/specs/live-state-audit-2026-08-06.md ➂. MODEL-TEXT-glm4-glm4-for-causal-lm, MODEL-MM-gemma4-mm-gemma4-for-conditional- generation and MODEL-MM-voxtral-voxtral-for-conditional-generation each claimed ACTIVE with no row/<ID> branch anywhere and no commit on origin/main naming the stable ID. They move to READY — the legality floor, all three resolve a real spec that names their token — NOT a judgement that the work is unstarted; every one asserts a passing gate in its own anchors (GLM-4 SACRED 16/16, Gemma-4 text STRICT 32/32, Voxtral audio e2e 14/14), which is why the audit refused to recommend anything stronger. Only the State and Owner cells move; Upstream / dependencies / Spike-spec / evidence are durable anchors and are untouched. Two derived views move with them because check-model-checklist gates both: the rollup (ACTIVE 10->7, READY 3 added) and the three checklist marks. The marks go ✅ -> 🚧 because ✅ is legal only for DONE/ACTIVE/GATING/PARTIAL — it is the mark the contract permits at READY, not a new claim that these rows regressed. check_row_contracts cross-checks Owner against coordination.md, so the claim surface moves in the SAME commit: five claims that reference ONLY the Gemma-4 mm row are RETIRED as prose bullets (CLAIM-GEMMA4-G1/-G2/-G2-IMPL/-G3/-MM-E2E, each with its recorded outcome — that one row was claimed EIGHT times over), and five that also hold live rows are AMENDED in place (CLAIM-GEMMA4-G1B, CLAIM-GEMMA4-MULTIMODAL, CLAIM-MULTIMODAL-TRACK, CLAIM-GLM-DSA-LATEST-DEEPSEEK, CLAIM-AUDIO-E2E) — retiring those would strand rows that are still live. check-agent-record EXIT=0; agent-preflight.sh EXIT=0; audit-live-rows abandoned 7 -> 4. FOLLOWING_AGENTS_PROTOCOL Assisted-by: Claude Code:claude-opus-5 [ClaudeCode]
…E (P0 step 6) Evidence: .agents/specs/live-state-audit-2026-08-06.md ➂. KERNEL-GDN-AOT-BF16 and KERNEL-GDN-SCRATCH each claimed ACTIVE with no row/<ID> branch anywhere and no commit on origin/main naming the stable ID. They move to READY — the legality floor, both resolve specs/kernel-family-inventory.md, which names their tokens — NOT a judgement that the work is unstarted; the AOT/safety/native gates and the stream-owned scratch pool's poison/reuse/growth assertions are on the rows. Only the State and Owner cells move; Our code / Tests-evidence / Upstream / Spike-spec are durable anchors and are untouched. CLAIM-PR3 and CLAIM-TRITON-AOT-PER-ARCH reference ONLY these two rows, so they are RETIRED as prose bullets in the SAME commit with their recorded outcomes (CLAIM-PR3 was explicitly incomplete when it went quiet; CLAIM-TRITON-AOT-PER-ARCH closed DERIVED+BUILD-VERIFIED, no non-sm_121 board ever RAN a GDN model). tests/scripts/test_agent_record.py had its ACTIVE-owner fixture PINNED to KERNEL-GDN-AOT-BF16 by stable ID, so this transition made the mutation stop exercising the ACTIVE branch. The fixture now picks a live ACTIVE kernel row from the record instead. The assertion is unchanged and check-agent-record.py is untouched — the record is repaired, the checker is not weakened. check-agent-record EXIT=0; agent-preflight.sh EXIT=0; audit-live-rows abandoned 4 -> 2. FOLLOWING_AGENTS_PROTOCOL Assisted-by: Claude Code:claude-opus-5 [ClaudeCode]
…P0 step 6) Evidence: .agents/specs/live-state-audit-2026-08-06.md ➂. QUANT-GGUF-IQ3_XXS claimed ACTIVE with no row/<ID> branch anywhere and no commit on origin/main naming the stable ID. It moves to READY — the legality floor, it resolves specs/gguf-iquant-dsv4.md, which names its token — NOT a judgement that the work is unstarted; the reader trait, the llama.cpp-ported codebook dequant, the keep-quant vec_dot and the GB10-gated CUDA kMatmulBTQuant path are all on the row. Only the State and Owner cells move; the R/M/C/E/P columns, the evidence cell and the spec links are durable anchors and are untouched. CLAIM-DEEPSEEK-V4-W8 is AMENDED, not retired: it also holds KERNEL-QUANT-CIQ- IQUANT, QUANT-GGUF-IQ2_XXS and QUANT-GGUF-Q2_K, which are still live, so retiring it would strand them. The IQ3_XXS ID is dropped from its Row IDs in this same commit, because check_row_contracts fails a claim referencing a non-SPIKE/ACTIVE row. check-agent-record EXIT=0; agent-preflight.sh EXIT=0; audit-live-rows abandoned 2 -> 1. FOLLOWING_AGENTS_PROTOCOL Assisted-by: Claude Code:claude-opus-5 [ClaudeCode]
… (P0 step 6) Evidence: .agents/specs/live-state-audit-2026-08-06.md ➂. BACKEND-DISTRIBUTED-TP claimed ACTIVE with no row/<ID> branch anywhere and no commit on origin/main naming the stable ID. It moves to READY — the legality floor, it resolves specs/scale-out-distributed.md, which names its token — NOT a judgement that the work is unstarted; the W2 TensorParallel/TpShard/TpAllReduceSum wiring and its RED-verified CPU multi-rank 60/60 gate are on the row, with the real TP-2 GPU forward already named as the HW-gated residual. Only the State and Owner cells move; Our code / Tests-evidence / Upstream / Spike-spec are durable anchors and are untouched. This one row was claimed THREE times over. All three claims also hold live rows, so all three are AMENDED in place rather than retired — the TP ID is dropped from CLAIM-PARALLELISM-MODES-SPIKE, CLAIM-SCALE-OUT-SPIKE and CLAIM-SCALE-OUT-W2 in this same commit, because check_row_contracts fails a claim referencing a non-SPIKE/ACTIVE row. check-agent-record EXIT=0; agent-preflight.sh EXIT=0; audit-live-rows --check EXIT=0, abandoned 1 -> 0. All ten abandoned ACTIVE claims from the audit are now corrected. FOLLOWING_AGENTS_PROTOCOL Assisted-by: Claude Code:claude-opus-5 [ClaudeCode]
…now true 54 rows claimed ACTIVE simultaneously; the audit reconciled them against branches and commits and found 10 with zero commits and zero branches on any ref. Those 10 are now corrected (five matrix commits), and portfolio, state log, NOW and STATUS move together here. roadmap_v1.md: four portfolio statements that asserted a corrected row's state are repaired in place — BACKEND-DISTRIBUTED-TP `ACTIVE` -> `READY` (twice, incl. the scale-out leg table), and the ENG-MM-AUDIO-ENCODER / MODEL-TEXT-glm4 narrative states. The ROAD-V1-* track states are unchanged: those tracks still hold live rows, and this audit moved no capability. state.md: one entry recording the re-fetch verification (origin/main had advanced cf32c61 -> 828f642; the same 10 IDs held, so the artifact's list was applied and not a stale one), the legality reasoning, the 11 retirements + 9 amendments, and the consequence a reader must not misread — ABANDONED is a statement about GIT, not about the work. The entry is anchored 2026-08-06T23:45 and sits in its CHRONOLOGICAL position: the enforced tail already carries entries dated 08-07 to 08-09, so appending at EOF would have broken check-state-order. NOW.md carries the newest position instead, which is what a cold session reads. NOW.md: the audit result, and the warning that ready-for-helper's queue went 4 -> 10 with SIX entries being these audit-vacated rows whose anchors assert LANDED, gated work — a helper picking one as greenfield would redo it. docs/STATUS.md sat EXACTLY on its size ratchet, so the note is a COLLAPSE, not an addition: the two records-only maintenance paragraphs are merged into one shorter line, and STATUS_RATCHET["chars"] is lowered 287_832 -> 287_830 in the same change — the ratchet tightening the checker's own comment prescribes, never loosening. state-order EXIT=0; check-now-current EXIT=0; agent-preflight.sh EXIT=0; audit-live-rows --check EXIT=0 with 0 abandoned ACTIVE rows. check-doc-checkpoint remains RED for the branch-level debt already recorded on every prior commit of this branch (resolved by squashing at merge). FOLLOWING_AGENTS_PROTOCOL Assisted-by: Claude Code:claude-opus-5 [ClaudeCode]
…aces must exist Task 6's review disproved my earlier assumption. Feeding the union of every path this branch changes through checkpoint_errors() still fails: docs/BENCHMARKS.md and docs/FEATURES.md are never touched anywhere on the branch, and a squash cannot conjure a file the branch never edits. It fixes the per-commit spread and nothing else. The repair is to write the owed surfaces. Both accept an explicit "nothing moved" entry — that is what the obligation is for, covering pending/failed/void checkpoints rather than only visible closure. And a correctness point, not just a gate point: moving a row to READY is a statement about EVIDENCE OF IN-FLIGHT WORK, never about capability. check-model-checklist forces the internal mark from OK to WIP at READY, which makes the record claim less support than reality. The public FEATURES marks must NOT be demoted to match — that would assert a regression that did not happen. FOLLOWING_AGENTS_PROTOCOL Assisted-by: Claude Code:claude-opus-5 [ClaudeCode]
Wired only AFTER the record was repaired, so the gate never had to be relaxed to pass. `scripts/audit-live-rows.py --check` now runs in `agent-preflight.sh` (as a gate, alongside ready-for-helper/upstream-inventory) and in the CI agent-record job, and `test_audit_live_rows` joins the preflight SUITES array, which is a fixed list and does not auto-discover. A red gate means the record drifted, never that the gate is too strict. The three new tests pin the wiring itself: preflight names both the suite and the gate INVOCATION, CI runs `--check` and the mutation suite, and the SHIPPED record carries zero abandoned ACTIVE rows. The third passed before any wiring existed (Task 6 repaired the record); the first two failed for exactly the missing-string reason and now pass. Suite 41/41. The preflight assertion is the whole `run` line, not the bare script name. Review caught that the first form was satisfied by the explanatory COMMENT below and stayed green with the gate invocation DELETED -- a test that passes with its subject removed, guarding the one thing this change exists to install. Mutation evidence both ways: with the `run` line deleted and the comment left in place the old assertion still finds `audit-live-rows.py` (the hole), the new one goes RED; restored, 41/41 green. The CI assertion never had the hole. MISSING origin/main IS A HARD FAIL, DELIBERATELY. audit-live-rows aborts when origin/main does not resolve (a clone whose remote is not named `origin`, a shallow or detached checkout), so preflight goes RED there instead of skipping. A skip would have to survive preflight's own "All gates green." banner, and a green preflight that never verified the record is the one unacceptable outcome -- the same reason require_origin_main refuses to let absence of information wear absence of work's face. The repair is one command and the abort message names it. Preflight must NOT fetch to paper over this: it is documented as never writing anything, and a gate that mutates refs to make itself pass is the shape this protocol forbids. Verified in a clone whose remote is named `upstream`: audit EXIT=1, preflight EXIT=1 with the actionable message printed. CI fetches with an EXPLICIT forced refspec rather than a bare `git fetch origin main`: a bare fetch only updates a remote-tracking ref when a CONFIGURED `remote.origin.fetch` refspec matches, and checkout sets that config from its own inputs. This job checks out at `fetch-depth: 0`, which DOES leave `refs/remotes/origin/*` behind, so the ref is present today; the fetch makes the gate independent of that checkout block rather than standing on an assumption about it, and refreshes the ref besides. docs/STATUS.md sat EXACTLY on its 287_815 char ratchet (zero headroom), so the gate note is paid for by a COLLAPSE, not an addition: the two superseded qwen3_5 A3 W2/W3a ATTEMPT paragraphs (both already superseded by the LANDED entry below them, detail retained in .agents/specs/qwen35-a3-grouped-moe-2026-07-31.md) merge into one line. Net -6 chars, and STATUS_RATCHET["chars"] is lowered 287_815 -> 287_809 in the same change -- tightening as the checker's own comment prescribes, never loosening. docs/BENCHMARKS.md records the honest "nothing moved": this is a record checker over matrices and Git refs, no engine code, no kernel, no number on that page. docs/FEATURES.md is untouched and NOT owed here -- no path in this commit trips its narrower trigger set, and no capability changed. audit-live-rows --check EXIT=0 (188 live rows, 0 abandoned ACTIVE); agent-preflight.sh EXIT=0 with the new gate and suite registered; check-doc-checkpoint --commit EXIT=0 on the committed form. FOLLOWING_AGENTS_PROTOCOL Assisted-by: Claude Code:claude-opus-5 [ClaudeCode]
…precondition prose Whole-branch review follow-up. Records and prose only; no tool logic changed, no public capability mark demoted, no checker weakened. THE GATE SELF-BLINDS ON THE TEN ROWS IT JUST REPAIRED (recorded, deliberately NOT fixed). `audit-live-rows.py:main_commits()` credits LANDED to any commit on origin/main whose MESSAGE names the row ID, with no notion of what that commit changed. MEASURED on this branch: 9 of the 10 vacated IDs are named in this branch's OWN commit messages -- all but MODEL-MM-gemma4-mm-... (BACKEND-DISTRIBUTED-TP and ENG-MM-AUDIO-ENCODER twice each). A squash concatenates those messages, so merging does not shed them; once they reach origin/main, main_commits() is non-empty for those nine forever and `--check` can never flag them abandoned again, including if somebody re-flips one to ACTIVE with no work behind it. The generalisation is the real finding: record commits here routinely name row IDs, so the gate's discriminating power decays with every record commit. The fix was already computed in the artifact (records-only vs code-touching, the same split that reads the 44 LANDED verdicts as 36/8). Applying it TODAY flips the 8 records-only-backed LANDED rows to ABANDONED and turns the standing preflight+CI gate RED for everyone -- a correction that needs its own evidence and its own decision, not a ride-along on a tool tweak. So it is written down in the artifact (new subsection 2a, in the section that already carries the LANDED caveat) and carried as a named follow-up in .agents/state.md with the 8 rows listed: adjudicate them against their own anchors, THEN land the path filter with them. PROSE CAUGHT UP WITH THE GATE. `5d8ed26d` imposed a hard repo-wide precondition -- a row in ACTIVE must have a row/<ID> branch with unmerged commits, or a commit on origin/main naming the ID, or preflight and CI go red for everyone -- and nothing an agent reads said so; AGENTS.md, workflow.md and directives.md were untouched by all 33 commits. That is the exact failure check-protocol-consistency.py exists to prevent, and this branch's own spec restates the rule. The trap is live: 0 rows classify IN-FLIGHT and 0 reach LANDED via a branch, so no agent working today has the reflex. .agents/workflow.md (Tabular lifecycle, where an agent looks before moving a row) now states the precondition and states that a RED gate is never relaxed: either the work is real and needs its row/<ID> branch, or the row does not belong in ACTIVE. check-protocol-consistency.py stays green (the doc-obligation contract block is untouched). docs/FEATURES.md count corrected: the audit moved TEN rows, not "3 model, plus 1 quantization and 1 backend" -- it silently omitted 3 engine and 2 kernel rows, and two of those engine rows (ENG-MM-VIDEO-FORWARD, ENG-MM-AUDIO-ENCODER) are exactly what backs the Multimodal table's Video/Audio "correctness-gated" marks sitting five lines below. The existing reasoning already covers them and now says so: READY is the state contracts' legality floor for a row with no Git-visible claim, never a capability statement, and every one of the ten carries in-row anchors asserting a passing gate (video-processor 41/41, A2 encoder-tower 203/203). NO public mark demoted; no checker couples FEATURES.md to engine-matrix.md, so this is a decision, not an oversight. Two one-word scope fixes: feature-matrix.md and sglang-matrix.md do not "together hold 11 live rows" -- feature-matrix.md holds all 11 and sglang-matrix.md holds 0, because its lifecycle column is `Class`, not `State`, so no table in it parses as a claim table. Keeping it in AUDIT_MATRIX_PATHS is still right (free now, automatic coverage if it grows a State column), and both the tool comment and the artifact now say that. And the artifact's bare-`no`/`gap` list and its vague-20 table both name BACKEND-CPU without contradiction -- they are the duplicate IDs living in two matrices; backend-matrix.md:226 reads explicit, feature-matrix.md:277 vague. The locations are now written in, with the parallel BACKEND-CUDA-SM121 split noted. OWED SURFACES. docs/STATUS.md sat EXACTLY on its 287_809 char ratchet (zero headroom), so the gate-limit note is paid for by COLLAPSES, not additions: three superseded Laguna W8-W11 campaign parentheticals (W10's host-sync reading, W11's GPU-compute-bound reading and W11's demotion of device-residency -- all superseded by the 2026-08-04 binding VT_LAGUNA_RESIDENT_BF16W result above them) merge into one line, and the two qwen3_5 A3 scoping/W1 notes drop remaining-work lists that the W2/W3a/W3b LANDED entries below already settle. Net -1 char, and STATUS_RATCHET["chars"] is lowered 287_809 -> 287_808 in the same change -- tightening as the checker's own comment prescribes, never loosening. Long paragraphs stay 86 (ratchet 89), h2 11, oversized cells 47. docs/BENCHMARKS.md records the honest "nothing moved": records and prose only, no engine code, no kernel, no number on that page. NOW.md refreshed with the follow-up and kept in its 6000-char budget. agent-preflight.sh EXIT=0 (all gates green) before and after staging; audit-live-rows --check EXIT=0 (188 live rows, 0 abandoned ACTIVE); check-state-order, check-now-current, check-protocol-consistency, check-public-doc-tables all EXIT=0. FOLLOWING_AGENTS_PROTOCOL Assisted-by: Claude Code:claude-opus-5 [ClaudeCode]
mudler
added a commit
that referenced
this pull request
Aug 6, 2026
…gainst Git reality (#59) spec/issue-native-tracking squash. scripts/audit-live-rows.py reuses the check-agent-record.py row parser and reconciles all live matrix rows against row/<ID> branches and origin/main commits: of 54 rows claiming ACTIVE, none had an unmerged branch; 10 had zero commits and zero branches anywhere and move to READY (the legality floor, not a judgement the work is unstarted); 11 stale coordination claims retired. Wired into agent-preflight and CI LAST, after the record was repaired, so it never had to be relaxed to pass. 41 unit tests. Merge resolutions: STATUS ratchet takes main's lower 284081 (shrink-only); engine-matrix Total recomputed from the merged section rows (140 rows, READY 7 / ACTIVE 18 / INVENTORIED 41); NOW keeps the audit-DONE bullet, trimmed to 5988. Merged-tree gates: audit --check EXIT=0 (188 live rows, 0 abandoned ACTIVE), test_audit_live_rows 41 OK, test_agent_record OK, doc-tables + now-current + state-order green. FOLLOWING_AGENTS_PROTOCOL Assisted-by: Claude Code:claude-opus-4-8 [ClaudeCode]
Collaborator
Author
|
Landed on main as the squash (mudler authorship, per the standing landing flow). Merge resolutions on top of today's four landings: STATUS ratchet takes main's lower 284081; engine-matrix Total recomputed from the merged section rows (140/36/16/4/7/18/8/9/41); NOW keeps the audit-DONE bullet at 5988 chars. Merged-tree gates all green: audit --check EXIT=0 (188 live rows, 0 abandoned ACTIVE), 41 audit tests OK, agent-record tests OK. 🤖 Generated with Claude Code |
mudler
added a commit
that referenced
this pull request
Aug 6, 2026
…to the evidenced 2026-08-06 The MXFP4-campaign records carried stamps through 2026-08-09T21:00 while every corresponding landing is git-author-dated 2026-08-06 00:00-13:43 (PR #59 created 2026-08-06T12:43Z) — a chained stamp bug, each agent placing its entry after the previous already-wrong stamp. The 35 future state anchors rewrite to an order-preserving synthetic minute sequence (T13:10-T13:44); matching heading/body stamps and date-only stamps in NOW/benchmark-record/parity-ledger/STATUS/BENCHMARKS map identically. Dates are now evidence-true; intra-day minutes on corrected entries are synthetic ordering values, documented in the state correction entry. No cited SHA changed; all record checkers green. FOLLOWING_AGENTS_PROTOCOL Assisted-by: Claude Code:claude-opus-4-8 [ClaudeCode]
Merged
4 tasks
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.
Row
No row ID — this is protocol/record work, phase P0 of
.agents/specs/issue-native-tracking.md. Not a helperrow/*claim;check-role-discipline.pypasses over the range.What changed
Builds
scripts/audit-live-rows.py, which reuses the row parser insidecheck-agent-record.py(never reimplements it) and reconciles every live matrix row againstrow/<ID>branches andorigin/maincommits, then applies what it found. The audit established that of 54 rows claimingACTIVE, not one had an unmergedrow/<ID>branch, and 10 had zero commits and zero branches anywhere on any ref. Those 10 moved toREADY— the state contracts' legality floor for a row with no Git-visible claim, explicitly not a judgement that the work is unstarted — and their 11 coordination claims were retired as prose bullets. The audit is then wired as a gate in preflight and CI so the rot cannot silently return. It was wired last, after the record was repaired, so it never had to be relaxed to pass.Evidence
ACTIVE54 → 44, abandoned 10 → 0. Full findings, per-row evidence and the hand-verified sample:.agents/specs/live-state-audit-2026-08-06.md.scripts/agent-preflight.shpassestests/scripts/test_audit_live_rows.py(41),tests/scripts/test_agent_record.py(13, mutation fixture repointed)docs/STATUS.md,docs/BENCHMARKS.md,docs/FEATURES.mdall updatedSpeed claims
Honest gaps
CI will be red on 11 of these commits. Commits from tasks 1–5 fail
check-doc-checkpointper-commit; tasks 6–7's range is clean. A squash passes — verified by building a synthetic squash commit off the merge base (rc=0). A merge commit or rebase-push would land the 11 red. This must land as a squash. Root cause worth fixing separately:agent-preflight.sh:109runs that checker--stagedonly, which passes vacuously after committing, so eleven green preflights never exercised the committed form CI uses.The gate will not re-detect the rows it just vacated.
main_commits()creditsLANDEDto anyorigin/maincommit whose message names the row ID, with no code-touch discriminator — and this branch's own commits name 9 of the 10 vacated IDs. After merge,--checkcan never re-flag those ten, even if one is re-flipped toACTIVEwith nothing behind it. Recorded, not fixed: the known repair (filter on code-touching commits) would flip 8 records-only-backedLANDEDrows toABANDONEDtoday, so it needs its own decision. See.agents/specs/live-state-audit-2026-08-06.md§2a and the.agents/state.mdfollow-up.LANDEDis weaker than it sounds. All 44LANDEDverdicts rest on a commit mentioning the row ID; 8 of those commits changed no code at all. No row was proposedDONEon that basis and none of the 44 was touched.Left deliberately untouched, documented not changed: the 44
LANDEDrows; the ~30 vaguePARTIALrows (20 state no missing modes, and 11 more pass only on a false-positive marker — "no longer double-resides", "max gap 0.0 nats"); and the 2 duplicate IDsBACKEND-CPU/BACKEND-CUDA-SM121, which are live in two matrices each, so 188 live rows carry 186 unique IDs.check-agent-record.pynever caught that because its duplicate check walks only 5 of the 7 matrices — the audit covers all 7 via its ownAUDIT_MATRIX_PATHS, deliberately without widening the CI gate's constant.Known defect, not yet fixed:
docs/STATUS.md:2156says the Laguna W10/W11 readings are superseded by the 2026-08-04 binding result, but W10/W11 are the GGUF UD-Q4_K arm and that result is the NVFP4 arm — and it contradictsdocs/STATUS.md:2158, which still relies on W11's reading. One-sentence scope fix; flagged rather than silently corrected.Not run: the C++
ctestsuite. This branch changes zero C++/CMake files, so it proves nothing here.🤖 Generated with Claude Code