Skip to content

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
mainfrom
spec/issue-native-tracking
Closed

P0 live-state audit: 54 rows claimed ACTIVE, none had a branch, 10 had no evidence at all#59
localai-bot wants to merge 34 commits into
mainfrom
spec/issue-native-tracking

Conversation

@localai-bot

Copy link
Copy Markdown
Collaborator

Row

No row ID — this is protocol/record work, phase P0 of .agents/specs/issue-native-tracking.md. Not a helper row/* claim; check-role-discipline.py passes over the range.

What changed

Builds scripts/audit-live-rows.py, which reuses the row parser inside check-agent-record.py (never reimplements it) and reconciles every live matrix row against row/<ID> branches and origin/main commits, then applies what it found. The audit established that of 54 rows claiming ACTIVE, not one had an unmerged row/<ID> branch, and 10 had zero commits and zero branches anywhere on any ref. Those 10 moved to READY — 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

$ python3 scripts/audit-live-rows.py --check ; echo EXIT=$?
188 live rows; 0 abandoned ACTIVE; 20 PARTIAL rows to review; 2 IDs live in two matrices: BACKEND-CPU, BACKEND-CUDA-SM121.
EXIT=0

$ bash scripts/agent-preflight.sh > /tmp/pf.log 2>&1 ; echo EXIT=$?
EXIT=0        # includes `ok audit-live-rows` and `ok test_audit_live_rows`

$ python3 tests/scripts/test_audit_live_rows.py
Ran 41 tests — OK

$ python3 tests/scripts/test_agent_record.py
Ran 13 tests — OK

ACTIVE 54 → 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.sh passes
  • tests that cover this change: tests/scripts/test_audit_live_rows.py (41), tests/scripts/test_agent_record.py (13, mutation fixture repointed)
  • same-change doc obligations: docs/STATUS.md, docs/BENCHMARKS.md, docs/FEATURES.md all updated

Speed claims

  • This PR makes NO speed claim.

Honest gaps

CI will be red on 11 of these commits. Commits from tasks 1–5 fail check-doc-checkpoint per-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:109 runs that checker --staged only, 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() credits LANDED to any origin/main commit 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, --check can never re-flag those ten, even if one is re-flipped to ACTIVE with nothing behind it. Recorded, not fixed: the known repair (filter on code-touching commits) would flip 8 records-only-backed LANDED rows to ABANDONED today, so it needs its own decision. See .agents/specs/live-state-audit-2026-08-06.md §2a and the .agents/state.md follow-up.

LANDED is weaker than it sounds. All 44 LANDED verdicts rest on a commit mentioning the row ID; 8 of those commits changed no code at all. No row was proposed DONE on that basis and none of the 44 was touched.

Left deliberately untouched, documented not changed: the 44 LANDED rows; the ~30 vague PARTIAL rows (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 IDs BACKEND-CPU / BACKEND-CUDA-SM121, which are live in two matrices each, so 188 live rows carry 186 unique IDs. check-agent-record.py never caught that because its duplicate check walks only 5 of the 7 matrices — the audit covers all 7 via its own AUDIT_MATRIX_PATHS, deliberately without widening the CI gate's constant.

Known defect, not yet fixed: docs/STATUS.md:2156 says 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 contradicts docs/STATUS.md:2158, which still relies on W11's reading. One-sentence scope fix; flagged rather than silently corrected.

Not run: the C++ ctest suite. This branch changes zero C++/CMake files, so it proves nothing here.

🤖 Generated with Claude Code

mudler added 30 commits August 6, 2026 06:56
…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]
mudler added 4 commits August 6, 2026 11:13
…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]
@localai-bot

Copy link
Copy Markdown
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

https://claude.ai/code/session_014fZAcg1WcU8V629k6HWKys

@localai-bot localai-bot closed this Aug 6, 2026
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]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants