From 3dab85418ee4fb19d48152eae4f01ae2b5deedfb Mon Sep 17 00:00:00 2001 From: Noah Gift Date: Tue, 15 Sep 2026 15:06:17 +0200 Subject: [PATCH 1/4] =?UTF-8?q?docs(run):=20=C2=A77=20report=20=E2=80=94?= =?UTF-8?q?=20clean-room=20root-caused,=2011=20PRs=20unstranded?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit APR-RELEASE-001 §7. The interval's two mechanisms, both of the declared-fix-that-cannot-fire class: * cargo publish strips path-only dev-deps, and aprender-compute's src/ named three of them -- 8 consecutive red clean-room runs, two releases shipped over the hard gate. * a .gitattributes merge driver is read from the side being merged INTO, so the union declaration from #3256 never fired on any older branch. Records what is NOT claimed: the A1 half of #3189 stays unreproduced, and the command that would settle it is named. Pmat-Ticket: PMAT-3305 Co-Authored-By: Claude Opus 5 (1M context) --- docs/audits/autonomous-run-2026-09-15.md | 129 +++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 docs/audits/autonomous-run-2026-09-15.md diff --git a/docs/audits/autonomous-run-2026-09-15.md b/docs/audits/autonomous-run-2026-09-15.md new file mode 100644 index 0000000000..d984f8143c --- /dev/null +++ b/docs/audits/autonomous-run-2026-09-15.md @@ -0,0 +1,129 @@ +# Autonomous run — 2026-09-15 + +Operator away. Route = self orchestrator; every decision goes to the quorum, and +anything it cannot decide stops the line for that item and is written here as a +decision request while the other lanes continue. §7 report per interval. + +--- + +## Interval — 13:20Z + +``` +scope: clean-room ROOT-CAUSED and fixed (#3305/#3307) · was the top blocker +queue: 11 PRs unstranded · 4 resolved out of CONFLICTING · 7 updated onto main +pins: unchanged +``` + +### What moved + +**The clean-room hard gate — root cause, not a ticket.** It had been red 8/8 +since 2026-09-08 and **v0.66.0 and v0.67.0 both shipped over it.** The gate was +right the whole time. + +`gates-lib.sh` stage A0 strips path-only dependencies to simulate `cargo +publish`. `cargo publish` omits a dev-dependency carrying only `path` — that +omission is deliberate, and is what makes a dev-dep *cycle* legal — but the +crate's `#[cfg(test)]` code is published anyway. `crates/aprender-compute/src/` +named three stripped crates across two files, which is exactly the 11 error +sites in run `34915682258`: + +| File | Stripped dep | Sites | +|---|---|---| +| `contract_tests_linalg.rs` | `trueno_sparse`, `trueno_solve` | 10 | +| `simulation/mod.rs` | `simular` | 1 | + +Two of the four aliases were **already declared in the root +`[workspace.dependencies]` with a version**; aprender-compute redeclared them +locally and bypassed the table. `trueno-sparse` and `trueno-solve` were in no +workspace table at all. All three siblings are published at 0.67.0 and none +depends back on aprender-compute, so inheritance creates no cycle. +`aprender`/aprender-core stays path-only — that one *is* a cycle, and no `src/` +code touches it. + +Five whys terminates at: **nothing asserts that a path dependency on a +publishable member carries a version.** In-tree builds resolve the path, so +`ci / gate`, `workspace-test` and every nightly are green on the same commit; +the only instrument that can see it runs downstream of publish, and had been red +long enough that its signal never reached a PR. So the guard shipped in the same +PR, not as a follow-up. + +Falsified through the gate's own `drop_sourceless_dev_deps`, not a +re-implementation: **4 aliases stripped before, 4 kept after.** + +The guard found **27 more sites across five other crates**, latent only because +clean-room compiles `aprender-compute` alone. Shrink-only baseline keyed by +`(manifest, alias)` — deliberately not `file:line`, which drifts inside a PR. +Drain is #3306; two of the five are genuine publish cycles whose test code has +to leave `src/`. + +**The PR backlog was stranded, and not for the reason anyone thought.** Eight +PRs went red inside a few minutes. The common failure was +`check_silicon_coverage.sh`, which #3299 had already fixed on main — 18 of 34 +open PRs were simply cut before `ab7619ff5` and read `PROMOTABLE 1`. The same +shape as the 2026-09-14 lesson: a main-level fix leaves every PR stale. + +Seven of those could not even be updated. The measured conflict surface: + +| File | PRs | +|---|---| +| `docs/roadmaps/roadmap.yaml` | 4 | +| `.github/workflows/ci.yml` | 3 | +| `docs/audits/impl-estimates.jsonl` | 2 | +| `lib.rs`, `Makefile`, `tree_reader_tests.txt` | 1 each | + +`impl-estimates.jsonl` should never conflict — it is strictly append-only, and +#3256 declared `docs/audits/*.jsonl merge=union` weeks ago. **It conflicted +anyway: a `.gitattributes` merge-driver declaration is retroactively inert.** +Git reads merge attributes from the side being merged *into*, so a branch cut +before the rule landed never sees it. `agent/T-2` is the measured case — its +`.gitattributes` lists only the roadmap rule, `768e740b1` is not an ancestor, +and the merge conflicts while `git merge-file --union` on the same three stages +returns rc=0, 50 rows, 0 markers. + +Fixed in `ci_resolve_dirty.sh`, which already registered the roadmap driver per +invocation: bind `union` the same way through `core.attributesFile`, the lowest +-priority attribute source, so it applies only where the branch has no rule of +its own and nothing shared is written. #3271's merge, which had failed minutes +earlier, then went rc=0 with all three files auto-merged. + +### Shipped this interval + +| Item | State | +|---|---| +| #3307 — clean-room fix + guard + baseline (closes #3305) | open, auto-merge armed, updated onto main | +| #3309 — union binds on older branches (closes #3308) | open, auto-merge armed | +| #3305, #3306, #3308 | filed with measurements | +| #3297 — missing `ont-delta:` line | fixed, verified against the guard's own vocabulary | +| #3005, #3271, #3278, #3281 | pushed out of CONFLICTING | +| #3205 #3238 #3246 #3249 #3259 #3265 #3270 | updated onto main | + +### Instruments added + +| | | +|---|---| +| `scripts/check_pathonly_devdeps_unused_in_src.sh` | case table 4 must-match / 7 must-not-match; red on the pre-fix manifests AND on a stale baseline row; 3.1 s bare; 0 bashrs errors | +| `ci_resolve_dirty.sh` row 9 | both polarities — must conflict without the override, merge with it. Mutation-verified: blanking the override turns it red (8/9), restoring it green (9/9) | + +### Still open + +- **#3134, #3245, #3248** — genuine `.github/workflows/ci.yml` content conflicts. + Not the mechanical class; they need their authors' intent, so they are not + being force-resolved. +- **#3041** — deliberately not updated. Operator ruled it gets split, not + resolved; updating it would burn CI on a branch that is going to be taken apart. +- **#3306** — 27 baselined sites. Three crates version cleanly; `aprender-core`'s + `entrenar` (19 sites) and `renacer` (3) are publish cycles whose test code must + move out of `src/`, and `ci.yml` runs only an explicit list of `--test` targets, + so a moved file is dark until it is added to that line. +- **Lane B** — contract rows undischarged; PR-1 (wire `contract_tests` into + `ci.yml`) not yet opened. + +### Not claimed + +- The A1 half of #3189 — "the clean-room gate cannot pass on a release commit at + all" — remains **unreproduced**. #3305 explains all 11 observed errors, and + none of them is release-shaped. Whether a release commit fails for an + additional reason is only settled by `make clean-room-p1` at a release-shaped + commit (`CARGO_BUILD_JOBS=2`, doctests `--test-threads=4`). Until #3307 lands + and the gate runs green once, that question is open. +- `pack:` stays `[U]` — §5 P0·Instrument has not written ledger records. From dd6b06b518b5ab4ae9c1b9064f5993ec1c4d3ae3 Mon Sep 17 00:00:00 2001 From: Noah Gift Date: Tue, 15 Sep 2026 15:27:02 +0200 Subject: [PATCH 2/4] =?UTF-8?q?docs(run):=20=C2=A77=20interval=202=20?= =?UTF-8?q?=E2=80=94=20Lane=20B=20PR-1/PR-2,=20and=20the=20class=20behind?= =?UTF-8?q?=20both?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR-1's premise held and widened: 355 tests dark, and the make target that would have run them errored, which is why nobody noticed. PR-2 named 14 anonymous obligations and repointed 4 proofs that referenced nothing -- then the scan showed 824 of 876 contracts carry the same defect, so #3091's "0/17 bound" was never a Qwen finding. Records the judgement call on KANI-QHF-001 as a decision request rather than burying it, and the staging-contracts hazard that was deliberately not actioned. Pmat-Ticket: PMAT-3305 Co-Authored-By: Claude Opus 5 (1M context) --- docs/audits/autonomous-run-2026-09-15.md | 119 +++++++++++++++++++++++ 1 file changed, 119 insertions(+) diff --git a/docs/audits/autonomous-run-2026-09-15.md b/docs/audits/autonomous-run-2026-09-15.md index d984f8143c..cc047105fe 100644 --- a/docs/audits/autonomous-run-2026-09-15.md +++ b/docs/audits/autonomous-run-2026-09-15.md @@ -127,3 +127,122 @@ earlier, then went rc=0 with all three files auto-merged. commit (`CARGO_BUILD_JOBS=2`, doctests `--test-threads=4`). Until #3307 lands and the gate runs green once, that question is open. - `pack:` stays `[U]` — §5 P0·Instrument has not written ledger records. + +--- + +## Interval — 13:45Z + +``` +scope: Lane B PR-1 and PR-2 both open · 355 dark tests wired · 19 obligations named +queue: BEHIND 0 · DIRTY 1 (#3041, split by ruling) · everything else on CI +pins: unchanged +``` + +### Lane B, both ordered items + +**PR-1 — #3312, `contract_tests` wired into the gate.** The premise checked out +and then some. `crates/aprender-core/tests/contracts/` holds **68 modules, 355 +`#[test]` functions, 66 `proptest!` blocks**, and `ci.yml:570` — the one line +naming explicit `--test` targets — lists 38 of them and not this one. CI runs +`--lib` across the workspace, which never reaches an integration target under +`tests/`. + +The reason it could stay dark for so long is that **the hand entry point was +broken too**: + +``` +$ cargo test --test contract_tests --no-run +error: no test target named `contract_tests` in default-run packages +help: available test in `aprender-core` package: contract_tests +``` + +`make contract-test` ran exactly that, with no `-p`. Nobody could run the suite +by hand either, so nobody noticed it was not running in CI. + +The suite is healthy — `300 passed; 0 failed; 55 ignored` — so wiring it does +not red-line main. RED evidence through the exact command ci.yml now carries: +mutating softmax's sum-to-one contract to sum-to-two gives +`299 passed; 1 failed`, `exit=101`. + +**The 55 ignored stay ignored, and that is the correct call.** Each carries a +reason and an EMPTY body — placeholders for obligations whose code does not +exist ("Gated Delta Net not implemented"). Deleting the attribute would make all +55 pass *vacuously*, which is strictly worse than skipping and is the same +enforcement-theater class the PR closes. Reported as +`300 evaluated, 0 failed, 55 blocked-on-unimplemented`. + +**PR-2 — #3316, the 19 obligations get names.** 14 of 19 were anonymous, and +four kani harnesses pointed at ids that do not exist (`QHF-INV-001`, +`QHF-INV-002`, `QE2E-INV-001`, `QE2E-ORD-001`). `pv validate` said +`0 error(s), 0 warning(s)` for all three contracts; `pv proof-status` counted +`9 kani` against `7 obligations` without noticing two of the nine attach to +nothing. + +The 21 that *did* resolve were worse than they looked — they matched the +obligation's `property` **prose**. A proof bound to a sentence unbinds itself +the moment anyone rewords the sentence. All 25 now cite an id. + +One judgement call is stated rather than buried: `KANI-QHF-001` asserts "Shape +preservation through hybrid block", the conjunction of three per-sublayer +invariants that no single obligation states. Pointed at `QHF-INV-001` — +understating what it verifies, overstating nothing. **Decision request:** if a +block-level obligation was intended, it needs writing. + +### The class is repo-wide, and that reframes #3091 + +Scanning all 876 contracts carrying obligations or harnesses: + +| | count | share | +|---|---|---| +| ≥1 **anonymous** obligation | **824** | 94% | +| ≥1 **dangling** kani reference | **287** | 33% | +| dangling references in total | **586** | — | + +"0/17 bound" was never a Qwen problem. It is the visible corner of a repo-wide +one, and `pv validate` reports `0 error(s)` for every instance. Filed as #3314 +with the guard, the `pv` fix, and the ratchet; #3315/#3316 is the 0.68 slice +only, per the ruling that 0.68 does not widen its scope. + +### The merge path, continued + +Three PRs could not be updated, all conflicting on the **same single line**: +`ci.yml:570`, a ~4000-character string holding all 38 `--test` targets. Every PR +adding a target must edit that one line, so two such PRs always collide — the +serial fraction #3297 removed from `roadmap.yaml`, still present here. It +compounds: a new test file is dark until added to that line, so the file every +new target must touch is also the one most likely to conflict. + +Every collision was append-vs-append, resolved as the union with main's order +authoritative. A conflict whose resolution is always the same is a merge driver +nobody wrote. Filed as #3313 with the fix: make it a sequence, one target per +line. + +### Backlog + +| | start of run | now | +|---|---|---| +| DIRTY (cannot update) | 7 | **1** — #3041 only, split by ruling | +| BEHIND | 18 | **0** | +| open non-draft | 34 | 34 | + +### Shipped this interval + +| Item | State | +|---|---| +| #3312 — 355 contract tests wired + broken Makefile target (closes #3311) | open, armed | +| #3316 — 19 obligations named, 25 harnesses cite ids (closes #3315) | open, armed | +| #3311, #3313, #3314, #3315 | filed with measurements | +| #3134, #3245, #3248 | ci.yml union, pushed out of CONFLICTING | +| 9 further PRs | updated onto main | + +### Still open + +- **#3041** — deliberately untouched. Split, not resolved. +- **#3314** — 824 anonymous / 586 dangling. Needs a scope ruling: baseline all + 287 contracts now, or drain by area. +- **`crates/aprender-contracts-staging/contracts/`** — holds stale copies of two + 0.68 contracts; its `gated-delta-net-v1` already differs from `contracts/` by + 88 lines at `origin/main`. Not a mirror anyone maintains, and a hazard if + someone "reconciles" the wrong direction. Deletion candidate, not actioned. +- **A1 (#3189)** — still unreproduced, and cannot be settled until #3307 lands + and clean-room runs green once. From 3699f2952837acea09467e50ccb4e3f99e57465a Mon Sep 17 00:00:00 2001 From: Noah Gift Date: Tue, 15 Sep 2026 16:42:07 +0200 Subject: [PATCH 3/4] =?UTF-8?q?docs(run):=20=C2=A77=20interval=203=20?= =?UTF-8?q?=E2=80=94=20gx10=20reclaimed=20and=20root-caused,=203,612=20obl?= =?UTF-8?q?igations=20named?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Leads with the scope line: GDN 0/5 discharged (5 obligations, 5 tests, all ignored with empty bodies), #3303 not started, andon clock stated. Records that pv proof-status reports L4 for a contract whose every test is an empty stub, and that two of my own changes were caught by the repo's guards rather than by me. Pmat-Ticket: PMAT-3305 Co-Authored-By: Claude Opus 5 (1M context) --- docs/audits/autonomous-run-2026-09-15.md | 65 ++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/docs/audits/autonomous-run-2026-09-15.md b/docs/audits/autonomous-run-2026-09-15.md index cc047105fe..57a9dc2712 100644 --- a/docs/audits/autonomous-run-2026-09-15.md +++ b/docs/audits/autonomous-run-2026-09-15.md @@ -246,3 +246,68 @@ line. someone "reconciles" the wrong direction. Deletion candidate, not actioned. - **A1 (#3189)** — still unreproduced, and cannot be settled until #3307 lands and clean-room runs green once. + +--- + +## Interval — 14:45Z + +``` +scope: GDN 0/5 discharged — 5 obligations, 5 tests, ALL 5 #[ignore]d, empty bodies + #3303 CPU parity ref filed 12:14Z, not started · #3114 still draft + andon 2h06m elapsed at last report, 69h53m to §8 at 2026-09-18T12:19:39Z +queue: BEHIND 0 · DIRTY 1 (#3041, split by ruling) · 7 PRs open and armed +pins: unchanged +``` + +`pv proof-status` reports `gated-delta-net-v1` at **L4 — "5 tests, 7 kani, 4 lean +proved"** — for a contract whose every executable test is an empty `#[ignore]`d +stub asserting nothing. pmat#1369's denominator problem surfacing as a *level*, +not just a count. Nothing is discharged; the number says otherwise. + +### gx10 — reclaimed, root-caused, ticketed + +73 GB freed (`df avail` **8 GB → 84 GB**, now 167 GB). Free space was at 8 GB +when the reclaim began, having fallen from 65 GB while I measured it, so jobs +were hitting ENOSPC live. + +None of the three suspected causes held: the timer is active and hourly, the +service runs `User=root`, and the path is right (same inode, `66306:34610110`). +The sweep had **never run** — 428 consecutive `SKIPPED` in seven days, every one +logged `ok:`. `sweep_shared_registry_src()` returns early whenever any job is +live, which is correct for the genuinely shared registry it was written for +(infra#509) and absolute on a CI host when pointed at a *per-PR* tree that is +attributable. paiml/infra#612, now four parts: split by tree shape, budget cap, +**N consecutive skips exits non-zero**, and a per-run ledger record so this +appears in `build-report` instead of at 8 GB free. + +### Contract obligations — named (#3320) + +3,612 anonymous obligations across 823 contracts, by a committed, idempotent +generator (`scripts/lib/obligation_ids.py`). The 52 already-named files are +skipped whole — measured 0 modified. Ownership resolved across the whole corpus +so the id space is global from day one: **0 ids claimed by more than one file.** + +Two bugs, both caught by assertions rather than review, both the same shape — a +rule that silently did nothing: + +- 83 of 823 contracts **indent** their list items. The first cut matched only + column 0, reported those files as named, and changed nothing; `--check` found + 410 obligations still anonymous. +- collision detection counted only *computed* prefixes, so it could not see that + an untouched file already owned one, and minted `AL-BND-001` in two files. + +The ruling's order is inverted deliberately: `validate_contracts` walks every +contract and is wired at `ci.yml:570`, so arming `pv` first red-lines main on +3,612 rows. Naming lands first; `pv` strictness is the next PR and is this one's +RED evidence. + +### Two guards caught my own work + +- **#3307** — the new baseline was unclassified and declared no instrument. + `check_baseline_ratchets.sh` and `check_tool_versions.sh` both refused it. + Fixed: `# tool_version=none` with its derivation, and registered as kind `set`. +- **Five PRs** — `check_pr_closes_issue.sh` refuses a `Refs #N` with no + `no-close:` reason. That is the guard working exactly as intended; every body + now carries one, verified by running the guard against each. + +Neither was visible to me before CI said so, which is the argument for both. From 9ecec9084fe28a4586ecbb8a72e427172a6032cc Mon Sep 17 00:00:00 2001 From: Noah Gift Date: Tue, 15 Sep 2026 17:59:13 +0200 Subject: [PATCH 4/4] =?UTF-8?q?docs(run):=20=C2=A77=20interval=204=20?= =?UTF-8?q?=E2=80=94=20pv=20ids=20proven=20read,=20P0=C2=B7Instrument=20ru?= =?UTF-8?q?les,=20#3303=20blocker=20named?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The scope line now carries the #3303 blocker with its number, as ruled. Records the two P0·Instrument rules (sampling window >= p95 gate; BEHIND=0 without group batching pays the burst all at once), and the census gate catching my own naming widening duplicate-stem drift. Pmat-Ticket: PMAT-3305 Co-Authored-By: Claude Opus 5 (1M context) --- docs/audits/autonomous-run-2026-09-15.md | 95 ++++++++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/docs/audits/autonomous-run-2026-09-15.md b/docs/audits/autonomous-run-2026-09-15.md index 57a9dc2712..d820c1ec9e 100644 --- a/docs/audits/autonomous-run-2026-09-15.md +++ b/docs/audits/autonomous-run-2026-09-15.md @@ -311,3 +311,98 @@ RED evidence. now carries one, verified by running the guard against each. Neither was visible to me before CI said so, which is the argument for both. + +--- + +## Interval — 16:05Z + +``` +scope: GDN 5/5 discharged, mutation-verified (#3322) · 305/0/50 + #3303 BLOCKED — llama.cpp at pin 39173bcac has 0 lines of `qwen35` in src/ (16 of + `qwen3next`); apr refuses rc=8 on both backends. Neither side can produce a logit. + Needs a decider on B3 (bump / second pin / re-convert) and B5 (known-bad model). + andon ~66h to §8 at 2026-09-18T12:19:39Z +queue: BEHIND 0 · DIRTY 1 (#3041, by ruling) · 11 PRs open and armed · 0 merged since 11:09Z +pins: unchanged +``` + +### P0·Instrument — two rules recorded, per ruling + +**Sampling window ≥ p95 `ci / gate` duration.** A 3-minute window read a +healthy fleet as stalled: 0 completions inside it, because no aprender CI run +finishes in 3 minutes. Measured properly — 17 runs in 30 min, 29 in 60 — the +same fleet was draining at ~29/hr with 17 intel workers at load 62. Any +throughput sample shorter than one run's p95 measures nothing but its own +window. + +**"main moved → every PR stale → burst" is the cost of BEHIND=0 without group +batching.** Main advanced at 12:49Z; every open PR went stale; bringing 18 of +them back to BEHIND=0 plus 9 new PRs produced ~50 queued runs and 4.5 h with +nothing merging — not a stall, the price of the discipline paid all at once. +Group size 8 in the ruleset after PR3 is what removes that burst: one batch +absorbs the update instead of eighteen runs paying for it separately. + +### Ruling 1 — the ids are now a fact, not a text edit (#3327) + +`ProofObligation` had no `id` field and no `deny_unknown_fields`. Every id +#3320 wrote was dropped on parse — decoration, by this repo's own definition. +`pub id: Option` plus `pv validate --check-ids`, run with one binary +against both trees: + +| | `main` (un-named) | #3320 (named) | +|---|---|---| +| obligations | 3764 | 3764 | +| **with id** | **161** | **3750** | +| referenced | 34 | 117 | + +**Reconciled, not rounded.** The generator says 3,773; pv says 3,750. The 23 +are five files under `contracts/entrenar/kaizen/`, which pv's walker excludes +by directory name at any depth. Replicating that walk gives `3764 / 3750` +exactly. Round-trip hazard checked and cleared: `pv unlock` writes through +`serde_yaml::Value`, so unknown keys survive — and the PR body says so, so +nobody "improves" it into a typed round trip. Two tests lock the field in, +mutation-verified (rename the serde key → red). + +### #3320 — the census gate caught a real consequence of my naming + +`real_corpus_census_names_every_baselined_stem` went 48 → 55. Eight pairs +`contracts/X.yaml` ↔ `contracts/aprender/X.yaml` were byte-identical at main — +one logical contract in two places — and the generator treated each copy as a +separate claimant, giving the second a path-keyed suffix. Identical pairs became +divergent pairs, differing only in ids. The gate counted them exactly as it +should. Byte-identical candidates are now one claimant; 48 == 48 again. What +"globally unique" means after this, stated precisely: an id names one *distinct* +contract — 38 ids appear in two files, and in every case the files are +byte-identical. + +### Ruling 3 — #3326 + +The C14 presence glob is case-insensitive **and** a mismatch fails loudly: a +case-insensitive hit returns rc=3, the caller prints `NAME-MISMATCH` and sets +rc=1, because a registry disagreeing with its artifact is a defect and measuring +it silently is how it sat. The resolution was extracted into a function so the +case table could reach it at all; the fixture is deliberately mixed-case, since +a row in the registry's own casing cannot see the defect. 12/12 rows, +mutation-verified. + +### Two things that were not this run's fault, and one that was + +- **#3328** — `aprender-gpu`'s test binary **SIGSEGVs** on gx10 on identical + Rust: `gpu-quick` passed on #3307 at 14:19Z and crashed at 15:13Z with only + shell scripts changed between. Not charged to the PR; ticketed with the + schedule that would name the dying test. +- `guard-tree` on #3312/#3316 was the frozen-payload class from the previous + interval; the post-reopen run on #3316 is green. +- **#3307 lacked an `ont-delta:` line** — it was the first PR I opened, before + the guard taught me the rule on #3297. Added, reopened for a fresh payload. + +### Open + +| | | +|---|---| +| #3307 | reopened; gpu-quick and guard-tree re-running on the corrected body | +| #3327 | armed; its `--check-ids` numbers are the evidence #3320 was waiting for | +| #3318 | held behind #3307, arms immediately after | +| `ci.yml:570` → file | held behind #3312 | +| pv strictness | held behind #3320 + #3327 | +| #3303 B3 / B5 | **need a decider** — the comparator baseline does not exist at the pin |