Skip to content

docs(roadmap): five defects the linfa/burn sweep tripped over, four of them in the tooling doing the sweeping - #3175

Merged
noahgift merged 4 commits into
mainfrom
fix/session-defect-sweep
Sep 13, 2026
Merged

noahgift merged 4 commits into
mainfrom
fix/session-defect-sweep

Conversation

@noahgift

Copy link
Copy Markdown
Contributor

Files #3170#3174. Roadmap rows only, no code changed.

None of these were the task — all five were hit while doing something else, which is the only reason they surfaced.

# Defect Evidence
#3170 P1 apr-agent accepts any flag as a task slug apr-agent --help created a worktree, branch and claim lockfile. The guard case $slug in *[!a-zA-Z0-9._-]*) rejects characters outside that class — - is inside it. Also: apr-agent is untracked, yet .git/hooks/pre-commit blocks every commit and directs you to it
#3171 P1 .claude/ = 58 worktrees, 25 GB, 571,815 .rs files in the repo root A tree-wide count returned 222,601,319 lines; the truth is 3,947,294 — wrong by 56×, and plausible-looking. The exclusion lives in .git/info/exclude, which is per-clone and protects one machine
#3172 P2 CRUX registry: 250 stories vs 275 contracts Categories L (15) and M (9) have contracts and no story rows. coverage_intake says 250
#3173 P2 verify gate reads prose as a test citation gates_extended.rs:81 rsplit("::") over the whole string; never consults classify_binding, which handles LIVE-PENDING explicitly. Fails a build over a sentence
#3174 P2 aprender-train-canary is dark Workspace-excluded, in no workflow, pinned to burn 0.21.0-pre.2 four months after 0.21.0 shipped. No measured trueno-vs-Burn number exists

ACs written to exclude the cheap fix

🤖 Generated with Claude Code

…f them in the tooling doing the sweeping

None of these were the task. All five were hit while doing something else, which
is the only reason they surfaced at all — each had been sitting quietly.

#3170  apr-agent accepts any flag as a task slug.
       `apr-agent --help` did not print usage. It created a worktree, a branch
       and a claim lockfile, then tried to launch a session. The guard is
       `case $slug in *[!a-zA-Z0-9._-]*) die` — it rejects characters OUTSIDE
       that class, and `-` is INSIDE it, so every flag a user tries first is a
       valid slug. Separately: apr-agent is not tracked (git ls-files returns 0)
       and nothing installs it, yet .git/hooks/pre-commit refuses every commit in
       the main checkout and directs you to it. A required workflow step enforced
       by an untracked hook naming an untracked tool.

#3171  .claude/ holds 58 worktrees, 25 GB and 571,815 .rs files in the repo root.
       A tree-wide line count returned 222,601,319 lines. The true figure is
       3,947,294 — wrong by 56x, and the wrong answer looked entirely plausible.
       The containment is worse than the leak: the exclusion lives in
       .git/info/exclude, which is per-clone and never committed, so it protects
       exactly one machine and no CI runner.

#3172  The CRUX master registry declares 250 stories against 275 contracts.
       Categories L (15) and M (9) have contracts and no story rows at all.
       coverage_intake says total: 250, so anything derived from it under-counts
       by 24, and nothing compares the two. Found because category N (#3146)
       deliberately did not repeat the pattern.

#3173  The verify gate reads descriptive prose as a test citation.
       gates_extended.rs:81 takes `raw.rsplit("::").next()` over the whole test:
       string. A LIVE-PENDING body — the repo's own sanctioned state for a gate
       that cannot bind yet — that names the test it will eventually bind to is
       reported as Unfalsifiable. The error message names a "test" that runs from
       the identifier to the end of the sentence, which is the tell. Two
       classifiers disagree: classify_binding has a considered taxonomy that
       handles LIVE-PENDING explicitly, and this gate never consults it. The
       workaround in #3169 was to write module paths with `/` — changing
       documentation wording to satisfy a code heuristic, the wrong direction.

#3174  aprender-train-canary is dark, so no measured trueno-vs-Burn number exists.
       It is the only thing in the tree comparing the two, and it never runs:
       workspace-excluded (own [workspace], invisible to cargo metadata), in no
       workflow, and pinned to burn 0.21.0-pre.2 four months after 0.21.0
       shipped. Cargo.toml:143 records the exclusion as intentional; being
       UNRUNNABLE is a different decision and the two were conflated.

Each ticket's acceptance criteria name a test that can fail, and several are
written specifically to exclude the cheap fix that would pass without fixing
anything:

- #3171 asserts `git check-ignore` resolves to .gitignore, NOT to
  .git/info/exclude. Asserting merely that the path is ignored passes today.
- #3172 requires the bijection to fail in BOTH directions; an orphan contract
  and an orphan story are each an error.
- #3173 requires a genuine bare citation to still raise PV-VER-001, so a fix
  that simply stops reporting cannot pass.
- #3174 requires the canary to be BUILT AND RUN and its ratio COMPARED against a
  floor — the repo has an incident where a number was recorded 18,292 times and
  never compared — or else deleted and the claim withdrawn. Leaving it dark
  closes nothing.

Roadmap rows only. No code changed here; the fixes are the tickets' work.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@noahgift noahgift added the bug Something isn't working label Sep 12, 2026
@noahgift
noahgift enabled auto-merge September 12, 2026 12:29
@github-actions

github-actions Bot commented Sep 12, 2026

Copy link
Copy Markdown

§13.11 rung 1 — quorum shadow verdict

S13-SHADOW pr=3175 head=8c9973e6defc05c0e9bfcb066aaad5646a60632b verdict=REFUSE class=Q1 arm_rc=1

Shadow mode: this records a verdict and merges nothing. A refusal
to arm is not a block (§13 adds zero rows to §7) — the pull request is
exactly as green as it was.

@noahgift
noahgift added this pull request to the merge queue Sep 12, 2026
@noahgift
noahgift removed this pull request from the merge queue due to a manual request Sep 12, 2026
@noahgift

Copy link
Copy Markdown
Contributor Author

Dequeued by the 0.67.0 release train (APR-RELEASE-001 §3.4, heijunka: one aprender PR in CI at a time). This PR's merge-group run was sharing the fleet with the release bump #3145 while the bump's workspace-test was on intel.

Nothing is wrong with the PR: it is roadmap-only and additive (+95/-0). Auto-merge is re-armed on it right after v0.67.0 is tagged; it then ships in 0.68.0.

noahgift added a commit that referenced this pull request Sep 12, 2026
…, #3068/#3139/#3175 dequeues, the T-0 correction table, G3.EX GO, and the model return (opus -> fable) recorded

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@noahgift
noahgift added this pull request to the merge queue Sep 12, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to a conflict with the base branch Sep 12, 2026
@noahgift
noahgift enabled auto-merge September 12, 2026 17:07
@noahgift noahgift added this to the 0.68.0 milestone Sep 12, 2026
@noahgift
noahgift added this pull request to the merge queue Sep 12, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to a conflict with the base branch Sep 12, 2026
check_roadmap_diff_additive.sh reported base id(s) missing at head: this branch forked before they landed on main, and a plain update takes one side of the 847-entry file whole. Resolved as main's roadmap plus this branch's own new entries. The other three roadmap guards pass on the result.

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
check_roadmap_diff_additive.sh reported base id(s) missing at head: this branch forked before they landed on main, and a plain update takes one side of the 847-entry file whole. Resolved as main's roadmap plus this branch's own new entries. The other three roadmap guards pass on the result.

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@noahgift
noahgift enabled auto-merge September 13, 2026 06:08
@noahgift
noahgift added this pull request to the merge queue Sep 13, 2026
Merged via the queue into main with commit 0ffc59f Sep 13, 2026
18 of 19 checks passed
@noahgift
noahgift deleted the fix/session-defect-sweep branch September 13, 2026 07:21
noahgift added a commit to guyernest/aprender that referenced this pull request Sep 14, 2026
… — the 0.67.0 train (paiml#3164)

* docs(release): APR-RELEASE-001 — the release train + build kaizen spec, and the R-17 model-movement row for PMAT-1098

The spec was dropped by the operator on 2026-09-12 and is untracked until this commit; the routing row records the orchestrator model moving opus->fable-5-1 at phase 4 (phase-boundary.sh).

Pmat-Ticket: PMAT-1098

* docs(audits): PMAT-1098 receipt-so-far for APR-RELEASE-001 session 1 (the 0.67.0 train) + the two agy lane receipts

Andon obligation: K=240 was crossed at k_measured=312 when the operator issued the spec run; WIP committed and this draft PR carries the receipt-so-far. Amended at phase 5.

Pmat-Ticket: PMAT-1098

* ledger(APR-RELEASE-001 §3.6): 182 measured gate-job records — intel is the bottleneck, gx10 is 2.3x faster and half idle

One append-only JSON per (sha, host, job) from the Actions REST API: queue_wait_s
(created->started), exec_s, total_s, host, conclusion. peak_rss_mb and
free_disk_gb are null with an explicit "[U]" in unmeasured[]: the REST API does
not expose them, and an absent measurement must never read as a zero.

What the 182 records say (p50 / p95 exec_s, this repo, 2026-09-12):

  workspace-test   intel 1790 / 4148 s   gx10  790 / 790 s   yoga  259 / 3167 s
  guard-cargo      intel 1201 / 1820 s   gx10  422 / 516 s   yoga  830 / 1046 s
  guard-tree       intel  604 /  879 s   gx10  192 / 213 s   yoga  379 /  379 s

  queue wait p95   intel 2995 s          gx10  233 s         yoga 1654 s

Per-run required-check wall clock, grouped by which boxes the run touched:

  gx10 only          n=4    mean  9.4 min
  gx10 + yoga        n=4    mean 11.3 min
  gx10 + intel       n=10   mean 42.6 min
  gx10 + intel + yoga n=11  mean 31.6 min

Every run that touched intel cost 32-43 min; no run that avoided it cost more
than 11.3. intel took 15 of the 22 workspace-test records because that job is
pinned to X64 -- and it is the job whose p95 is 69 minutes. paiml#3139 unpins it.

§1 coupling, no longer [U]: p95 gate = 72.3 min, so max PRs per train = 72h /
72.3 min = 59.7. §8's "stop cutting trains below 10" does not fire.

Pmat-Ticket: PMAT-1098
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* receipt(PMAT-1098): the orchestrator model moved mid-phase-4, and the ledger answered §1

Three things the receipt did not yet carry:

1. orch_model. The harness moved this session from claude-fable-5-1 to
   claude-opus-5 in the middle of phase 4. A model change mid-session is a
   recorded event, never a silent one: route.sh record-event wrote the row to
   docs/audits/impl-routing.jsonl and the frontmatter now names the live model.
   fable_binding drops to false with the reason, rather than asserting a binding
   that no longer holds.

2. The build ledger, 182 records, and what they say about which box to fill.

3. §1's max-PRs-per-train, measured at 59.7 from 29 runs, so it stops being [U]
   and §8's stop condition can be evaluated instead of guessed.

Pmat-Ticket: PMAT-1098
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* dogfood(G3.EX): 981 examples run for the first time on a release — 6 real defects, 38 classifier gaps

The gate paiml#3121/paiml#3122 added during this cycle had never been executed against a
tag. Its first run says 23 fail + 21 timeout, and that number is wrong in the
interesting direction: re-running all 44 with each target's own required-features
and keeping the logs leaves SIX genuine defects.

  9 rows pass once the feature they name at runtime is enabled (cuda,
    compression, embeddings, tensor, shell-autocomplete). They declare no
    required-features and gate themselves in code, so the sweep ran them wrong.
 20 rows are servers, TUIs and unbounded benchmarks. Killing them at 120 s and
    calling it `timeout` -- a class the skill defines as a defect -- is wrong on
    all twenty.
  6 rows are a missing model or a missing argument worded outside the regexes.
  1 is a TTY, 1 is this box's glibc against a prebuilt ort artifact, 1 is a
    wall-clock perf assertion failing under load.

Verdict GO. Every one of the six defects is byte-identical at v0.66.0: the
expect() on weight.rs:356, the five PinnedBuffer imports, the three
cwd-relative config literals in llama2/train.rs. §3.1 skips a train whose CUT
cannot go green; this cut did not cause any of them, the previous tag shipped
them all, and a new instrument finding a backlog is not the same event as a
regression. They are paiml#3178 paiml#3179 paiml#3180 paiml#3181, and the classifier gaps are paiml#3182.

Not claimed: that the 20 timeouts are healthy. They were not individually
verified and the gate cannot yet tell a serving server from a wedged one.

Pmat-Ticket: PMAT-1098
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* docs(audits): PMAT-1098 receipt — four missing CHANGELOG rows (aa61219), paiml#3068/paiml#3139/paiml#3175 dequeues, the T-0 correction table, G3.EX GO, and the model return (opus -> fable) recorded

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* docs(ledger): 49 more APR-RELEASE-001 §3.6 records (231 total) — runs 34693750243..34700216664 incl. the discarded paiml#3145 workspace-test (4958 s) and the two cancelled docs-PR runs [skip ci]

Pushes to this docs branch were starting full CI runs on intel next to the train (34694025825, 34700216664, 34701097504 — all cancelled by hand); until v0.67.0 is tagged every push here carries [skip ci]. The final push before merge does not.

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* docs(evidence): the ph4 teamwork delegate receipt carried two absolute checkout paths — the shipped-tier machine-specific-path ratchet went RED on paiml#3164 (+2 vs 81da9bc) [skip ci]

check_hardcoded_paths.sh --full-if-capable, run 34700216664 step 43: evidence/release/0.67.0/agy/ph4-teamwork/delegate-receipt.json|/home/noah/src/aprender and |/home/noah/src/aprender/.git/config. Replaced with <repo_root>; the receipt is this session's artifact, not a tool output anyone re-reads by path.

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* docs(audits): PMAT-1098 receipt — T-1 stand-in dispatched on the idle GPU hosts, cuda-nightly standing-RED since the v0.66.0 sha, why gx10 idles (X64 pin, paiml#3139 795 s, ENOSPC), §6 triage to untriaged=0, one-at-a-time drain [skip ci]

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* spec(APR-RELEASE-001): packing rule — yoga and gx10 ≥80% full of aprender PR work under any intel queue pressure is P0 (selector row 0, §1, §3.4, §3.5 SSH, §5 P0·Pack + P0·Reap, §7 pack: line, §8 stops) [skip ci]

Operator 2026-09-12, verbatim in §1. §3.4 no longer says one PR at a time: the queue builds 3 by design, dequeue only a KNOWN-RED group. §3.5 distinguishes durable config (forjar) from measurement/unclogging over SSH. Ground truth (§2) gains the measured X64 pin and the gx10/yoga disk layout.

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* docs(audits): PMAT-1098 receipt — the four operator rulings and what changed (SSH measurement, 146 GB reclaimed, forjar P0·Reap live on gx10+yoga via infra#549, packing rule, spec e874769), the stacked-merge-group resolver defect paiml#3186paiml#3187, 16 ledger records incl. fleet-pack samples [skip ci]

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* docs(ledger): 15 more §3.6 records — the two stacked merge groups RED on paiml#3186, the GPU-host nightlies on the cut, fleet-pack samples [skip ci]

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* docs(receipt): session 2 — the cut's own bashrs red (paiml#3188), the clean-room gate that discriminates nothing (paiml#3189), the steward's unreachable live path (paiml#3190), and the packing denominator [skip ci]

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* docs(spec): APR-RELEASE-001 T-4 is automated, never attended — operator ruling 2026-09-13; the train publishes itself after dogfood GO + assets + preflight [skip ci]

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* docs(spec): APR-RELEASE-001 T-5 Reconcile is a HARD gate — measured 308 open / 424:124 arrival:closure / 95 fixed-but-open / 847 PR-less branches; five predicates, receipt in the ledger, no DONE without it (operator 2026-09-13, kaizen) [skip ci]

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* docs(ledger): T-5 reconcile receipt for v0.67.0 — R1 0 / R2 28 / R3 0 (776 branches archived) / R4 1 / closure:arrival 22:61; 2 issues closed, 3 dirty PRs resolved, 1 closed, 10 verdicts pending [skip ci]

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* docs(ledger): the v0.67.0 train record and 818 §3.6 collector records — 3 bashrs NO-GO(s), then GO + tag at e45eaab

Pmat-Ticket: PMAT-1098

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: Noah Gift <claude@noahgift.com>
noahgift added a commit to guyernest/aprender that referenced this pull request Sep 14, 2026
…findings about the predicates themselves (paiml#3212)

APR-RELEASE-001 §6 makes T-5 a hard gate of every train. It had never been run. This is
`scripts/check_reconcile.sh v0.67.0 --prev-tag v0.66.0` (the guard from PR paiml#3200, not yet
on main) executed against live GitHub state, recorded as a ledger record rather than
asserted in prose.

    R1 fixed-but-open     0
    R2 missing-closing   35
    R3 dead-branches      1   (was 2 before paiml#3211)
    R4 dirty-stale-prs    1   (was 0 six minutes earlier)
    R5 arrival/closure    63 / 27 = 0.4286   (recorded, not gated)

R1 = 0 and R4 was 0 at 11:44Z: no issue in the window was closed-by-keyword yet left
open, and every dirty stale PR had been resolved. The other three are not simply debt,
they are defects in the predicates, and the receipt says so rather than reporting a
number nobody can act on.

**T5-F1 — R2 cannot be zero over a window that predates its own guard.**
`check_pr_closes_issue.sh` is not on main; it is in paiml#3200, in the merge queue as this was
measured. All 35 PRs in v0.66.0..v0.67.0 merged before any such check existed. They cite
39 still-open issues, and inspection shows most citations are CORRECT: paiml#3160 and paiml#3175
FILED their follow-ups (paiml#3147-paiml#3159, paiml#3170-paiml#3174) and cite them without closing, which is
what a backlog-opening PR should do. R2's remedy for that shape is the `no-close:` line,
which those bodies could not carry. R2 needs an EPOCH — count only PRs merged after the
guard was armed — or T-5 hard-fails every train forever on history.

**T5-F2 — R3 cannot tell a DEAD branch from a STRANDED one, and acting on it literally
destroys evidence.** Both branches R3 named carry unique unmerged work. `feat/y2-calibrate`
holds `evidence/perf-060/`, 791 insertions, the ONLY measurement of mini's throughput that
exists (prefill 2.371-2.372, decode 2.318 tok/s, measured 2026-08-30 against 34248e8) —
and mini became a full-time build host on 2026-09-13. Deleting it to make a counter zero
would have destroyed that. It is landed as paiml#3211 instead, and R3 fell 2 -> 1.
`feat/y1-7bgarbage` is deliberately NOT archived: it touches
contracts/continuous-batching-v1.yaml and needs a review, not a publish.

**T5-F3 — R4 is volatile against main, not a property of the PR.** It read 0 at 11:44Z
and 1 at 11:50Z, because paiml#3164, paiml#3162 and paiml#3201 merged as one queue group in between and
made paiml#3041 dirty. Either measure R4 at a fixed sha or re-run it after the queue drains;
as a hard gate against a moving base it reports the queue's timing, not the tree's health.

attended_minutes is [U]: this train's T-4 was automated, so no attended window was timed.

no-close: this receipt records a T-5 run; it resolves no issue. The three findings are
recommendations against paiml#3200's guard, which is still in the queue.

Pmat-Ticket: PMAT-1098

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
@noahgift noahgift mentioned this pull request Sep 16, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant