Gladex Agent Logs
Agent run logs & app logs · env: prod · LAN-only investor surface
Overview
| Run logs | 836 files, 42 MB |
| Latest run log | run-20261001-092806-434.log |
| Log directory | /data/agent-logs |
| App log directory | /opt/startup/prod/logs |
Run logs (newest first, last 50)
| File | Size | Modified (UTC) |
|---|---|---|
| run-20261001-092806-434.log | 295 KB | 2026-10-01 07:54:58 |
| run-20261001-080602-433.log | 406 KB | 2026-10-01 07:17:59 |
| run-20261001-065553-432.log | 373 KB | 2026-10-01 05:55:55 |
| run-20261001-050850-431.log | 523 KB | 2026-10-01 04:45:47 |
| run-20261001-042252-430.log | 198 KB | 2026-10-01 02:58:43 |
| run-20261001-032127-429.log | 327 KB | 2026-10-01 02:12:46 |
| run-20261001-022005-428.log | 263 KB | 2026-10-01 01:11:21 |
| run-20261001-020022-427.log | 205 KB | 2026-10-01 00:09:58 |
| run-20261001-015015-426.log | 153 B | 2026-09-30 23:50:16 |
| run-20261001-014008-425.log | 153 B | 2026-09-30 23:40:09 |
| run-20261001-013001-424.log | 153 B | 2026-09-30 23:30:02 |
| run-20261001-011954-423.log | 153 B | 2026-09-30 23:19:55 |
| run-20261001-010947-422.log | 153 B | 2026-09-30 23:09:48 |
| run-20261001-005940-421.log | 153 B | 2026-09-30 22:59:41 |
| run-20261001-004933-420.log | 153 B | 2026-09-30 22:49:34 |
| run-20261001-003926-419.log | 153 B | 2026-09-30 22:39:27 |
| run-20261001-002920-418.log | 190 B | 2026-09-30 22:29:20 |
| run-20261001-001913-417.log | 153 B | 2026-09-30 22:19:13 |
| run-20261001-000906-416.log | 153 B | 2026-09-30 22:09:07 |
| run-20260930-231805-415.log | 582 KB | 2026-09-30 21:59:00 |
| run-20260930-223504-414.log | 194 KB | 2026-09-30 21:07:59 |
| run-20260930-212614-413.log | 270 KB | 2026-09-30 20:24:58 |
| run-20260930-201407-412.log | 423 KB | 2026-09-30 19:16:08 |
| run-20260930-184629-411.log | 463 KB | 2026-09-30 18:04:01 |
| run-20260930-165104-410.log | 325 KB | 2026-09-30 16:36:29 |
| run-20260930-161443-409.log | 189 KB | 2026-09-30 14:41:04 |
| run-20260930-160441-408.log | 153 B | 2026-09-30 14:04:43 |
| run-20260930-155440-407.log | 153 B | 2026-09-30 13:54:41 |
| run-20260930-154440-406.log | 153 B | 2026-09-30 13:44:40 |
| run-20260930-153439-405.log | 153 B | 2026-09-30 13:34:40 |
| run-20260930-152438-404.log | 190 B | 2026-09-30 13:24:39 |
| run-20260930-151438-403.log | 190 B | 2026-09-30 13:14:38 |
| run-20260930-150437-402.log | 153 B | 2026-09-30 13:04:37 |
| run-20260930-145436-401.log | 153 B | 2026-09-30 12:54:37 |
| run-20260930-144435-400.log | 153 B | 2026-09-30 12:44:36 |
| run-20260930-143435-399.log | 190 B | 2026-09-30 12:34:35 |
| run-20260930-142434-398.log | 153 B | 2026-09-30 12:24:35 |
| run-20260930-141433-397.log | 153 B | 2026-09-30 12:14:34 |
| run-20260930-140433-396.log | 153 B | 2026-09-30 12:04:33 |
| run-20260930-135432-395.log | 153 B | 2026-09-30 11:54:33 |
| run-20260930-134431-394.log | 153 B | 2026-09-30 11:44:32 |
| run-20260930-133431-393.log | 190 B | 2026-09-30 11:34:31 |
| run-20260930-132430-392.log | 153 B | 2026-09-30 11:24:31 |
| run-20260930-131429-391.log | 153 B | 2026-09-30 11:14:30 |
| run-20260930-130429-390.log | 153 B | 2026-09-30 11:04:29 |
| run-20260930-125428-389.log | 153 B | 2026-09-30 10:54:29 |
| run-20260930-124427-388.log | 153 B | 2026-09-30 10:44:28 |
| run-20260930-123427-387.log | 153 B | 2026-09-30 10:34:27 |
| run-20260930-122426-386.log | 153 B | 2026-09-30 10:24:27 |
| run-20260930-121425-385.log | 153 B | 2026-09-30 10:14:26 |
Tail — run-20261001-092806-434.log (last 200 lines)
**Tests**:
-- `bash tests/test_regression_run.sh` → **331 assertions**, hermetic (throwaway fixtures under `/tmp/opencode/trr.*`, trap-cleaned): `--help` exits 0 and **all seven epilog sections equal their docstring blocks byte for byte** (the sixth, `termination contract:`, added by `[0.4.131]`; the seventh, `free-space preflight:`, added by `[0.4.148]`); the full exit-code contract `0/1/2/3/4/5/6` plus the `4 > 1` precedence and the preflight's own before-the-first-suite placement; all four parsing rules; the 14-key JSON contract including the usage-error, refusal *and* preflight objects having the *same* key set; the flag contract (including "stderr is exactly one diagnosis line" and "no `usage:` leak"); **the termination contract's own rendering (A13–A15)** — `start_new_session`, the `143 / 130` signal outcome and the declared escape limit must all appear in `--help`, three needles that sat in a docstring paragraph no label rendered (the (81) defect); **the preflight paragraph's own rendering (A18–A20)** — `nearest EXISTING ancestor`, `must not pass` and `Both fixture env vars are test hooks` must all appear in `--help`, three needles from the block that was docstring-only until `[0.4.148]` (the (91) defect, each measured **0** before the pair landed); **the epilog list is DERIVED, not copied (A16, A16b, A17.1–A17.7)** — `A3`/`A4`/`A5` and `help_section()`'s terminator set are read out of the tool's own `EPILOG_PAIRS`, so an eighth pair would be compared without editing four lists, and the three things a derived list cannot see are pinned: the extraction is not empty (`A16`, or every loop would assert nothing), the row count still equals the tuple's OWN pair count (`A16b`, read a second time by Python's `ast.literal_eval` — a row the `sed` pattern cannot spell, e.g. a pair split across two lines, would otherwise drop out of every loop with `A16`'s floor and `A17`'s pins both still green, which is queue item (92), measured **321/1** with `A16b` the only red) and each of the seven contract sections is still in the tuple (`A17.*`, or a deleted pair would vanish from every loop); the epilog refusal in both channels; **the free-space preflight (section K, 43 assertions)** — a healthy tree still runs and its suite really runs (marker written), an impossible floor refuses with 6 in both channels with **empty stdout**, an absent marker proving no suite started, the refusal naming the path it measured and the measured figure, a **later** watched path at 1 MB refusing (so the check is not first-path-only — real `statvfs` can never say 1), an unmeasurable path refusing rather than passing, `--log-dir`'s not-yet-created directory gated through its existing ancestor, `--list` exempt, the two usage-error env values, the `--help` documentation, and a plant with the call removed; **the termination contract (section J)** — the outer bound, a direct SIGTERM and a direct SIGINT are all *really* sent, the fixture suite spawns a **writing grandchild** so "the tool died" and "everything the tool started died" stay two questions, the two invocation helpers are pinned for `--tests-dir "$SB/` the way section H pins its three, and a plant (the install line `sed`'d out of a copy) carries J16/J17/J18; **the (88) census scoping (J19–J21)** — a same-named fixture this run did not start is **not counted** and **not killed** by `bound_kill`, while this run's own fixture **still counts**; **the (89) descendant reap (J22–J25)** — the mutant fixture's tree is captured *while it is alive* (`K19`, `K20`) and every pid in it must be gone after `bound_kill`, at **both** plant sites, because a SIGKILL'd shell *reparents* its foreground `sleep 300` to init where no fixture path remains to find it by; live read-only proof (`git status --porcelain` byte-identical); and the recursion guard (see below). *(The count here said **193** while the suite was already at **218** through `[0.4.101]` and **237** through `[0.4.102]` — two runs stale; refreshed rather than extended. The **255 → 298** move is `[0.4.129]`'s section K, 43 assertions; the **298 → 301** move is `[0.4.130]`'s J19–J21; the **301 → 307** move is `[0.4.131]`'s section A (the sixth epilog pair counted by A3/A4/A5, plus A13–A15); the **307 → 314** move is `[0.4.132]`'s section A (the derived epilog list, A16 + A17.1–A17.6, with A3/A4/A5 unchanged at six rows); the **314 → 318** move is `[0.4.147]`'s section J (J22–J25, two per plant site); the **318 → 325** move is `[0.4.148]`'s section A (the seventh epilog pair, counted by A3/A4/A5 and pinned against deletion by A17.5, plus the A18–A20 needles); the **325 → 326** move is `[0.4.149]`'s section A (A16b, the pair count read a second time by Python's parser against the `sed` extraction).)*
+- `bash tests/test_regression_run.sh` → **331 assertions**, hermetic (throwaway fixtures under `/tmp/opencode/trr.*`, trap-cleaned): `--help` exits 0 and **all seven epilog sections equal their docstring blocks byte for byte** (the sixth, `termination contract:`, added by `[0.4.131]`; the seventh, `free-space preflight:`, added by `[0.4.148]`); the full exit-code contract `0/1/2/3/4/5/6` plus the `4 > 1` precedence and the preflight's own before-the-first-suite placement; all four parsing rules; the 14-key JSON contract including the usage-error, refusal *and* preflight objects having the *same* key set; the flag contract (including "stderr is exactly one diagnosis line" and "no `usage:` leak"); **the termination contract's own rendering (A13–A15)** — `start_new_session`, the `143 / 130` signal outcome and the declared escape limit must all appear in `--help`, three needles that sat in a docstring paragraph no label rendered (the (81) defect); **the preflight paragraph's own rendering (A18–A20)** — `nearest EXISTING ancestor`, `must not pass` and `Both fixture env vars are test hooks` must all appear in `--help`, three needles from the block that was docstring-only until `[0.4.148]` (the (91) defect, each measured **0** before the pair landed); **the epilog list is DERIVED, not copied (A16, A16b, A17.1–A17.7)** — `A3`/`A4`/`A5` and `help_section()`'s terminator set are read out of the tool's own `EPILOG_PAIRS`, so an eighth pair would be compared without editing four lists, and the three things a derived list cannot see are pinned: the extraction is not empty (`A16`, or every loop would assert nothing), the row count still equals the tuple's OWN pair count (`A16b`, read a second time by Python's `ast.literal_eval` — a row the `sed` pattern cannot spell, e.g. a pair split across two lines, would otherwise drop out of every loop with `A16`'s floor and `A17`'s pins both still green, which is queue item (92), measured **321/1** with `A16b` the only red) and each of the seven contract sections is still in the tuple (`A17.*`, or a deleted pair would vanish from every loop); the epilog refusal in both channels; **the free-space preflight (section K, 43 assertions)** — a healthy tree still runs and its suite really runs (marker written), an impossible floor refuses with 6 in both channels with **empty stdout**, an absent marker proving no suite started, the refusal naming the path it measured and the measured figure, a **later** watched path at 1 MB refusing (so the check is not first-path-only — real `statvfs` can never say 1), an unmeasurable path refusing rather than passing, `--log-dir`'s not-yet-created directory gated through its existing ancestor, `--list` exempt, the two usage-error env values, the `--help` documentation, and a plant with the call removed; **the termination contract (section J)** — the outer bound, a direct SIGTERM and a direct SIGINT are all *really* sent, the fixture suite spawns a **writing grandchild** so "the tool died" and "everything the tool started died" stay two questions, the two invocation helpers are pinned for `--tests-dir "$SB/` the way section H pins its three, and a plant (the install line `sed`'d out of a copy) carries J16/J17/J18; **the (88) census scoping (J19–J21)** — a same-named fixture this run did not start is **not counted** and **not killed** by `bound_kill`, while this run's own fixture **still counts**; **the (89) descendant reap (J22–J25)** — the mutant fixture's tree is captured *while it is alive* (`K19`, `K20`) and every pid in it must be gone after `bound_kill`, at **both** plant sites, because a SIGKILL'd shell *reparents* its foreground `sleep 300` to init where no fixture path remains to find it by; live read-only proof (`git status --porcelain` byte-identical); **the isolation path (section G's own precondition and control, G1–G11, queue item (102))** — outside `/data/repo` the whole section skips with the path in its reason instead of asserting facts about a tree that is not there, and at the shipped location it *measures* that rule by copying `tests/` + `tools/` **without `.git`** under `$SB/iso` and requiring the copy green (exit 0, `0 failed`, the `SKIP G` reason present, no `G1` line, ≥ 300 of the rest running), which cannot recurse because the copy skips section G by the same guard; and the recursion guard (see below). *(The count here said **193** while the suite was already at **218** through `[0.4.101]` and **237** through `[0.4.102]` — two runs stale; refreshed rather than extended. The **255 → 298** move is `[0.4.129]`'s section K, 43 assertions; the **298 → 301** move is `[0.4.130]`'s J19–J21; the **301 → 307** move is `[0.4.131]`'s section A (the sixth epilog pair counted by A3/A4/A5, plus A13–A15); the **307 → 314** move is `[0.4.132]`'s section A (the derived epilog list, A16 + A17.1–A17.6, with A3/A4/A5 unchanged at six rows); the **314 → 318** move is `[0.4.147]`'s section J (J22–J25, two per plant site); the **318 → 325** move is `[0.4.148]`'s section A (the seventh epilog pair, counted by A3/A4/A5 and pinned against deletion by A17.5, plus the A18–A20 needles); the **325 → 326** move is `[0.4.149]`'s section A (A16b, the pair count read a second time by Python's parser against the `sed` extraction).)*
- **Baseline section (I, 80 assertions — measured by counting the section's own PASS lines, not by subtracting)**: round trip against a record the tool itself wrote shows no movement with `closure_ok true`; a tampered record shows `moved`/`lost`/`delta`/`attributed` all agreeing; a record whose totals were **not** edited alongside its suites reports `closure_ok false` while still printing both numbers and still exiting 0; added/removed/status-change cases each sum to the same total from both directions; and every refusal (missing file, non-JSON, a run payload, a duplicated suite name, an unreadable `format`, `--list` + flag, unwritable target) is exit 2 **before any suite runs** with empty stdout. The fixtures are *tampered* copies built by an embedded python builder, because a tool's own writer never produces the cases worth testing. Section A grew by **3** alongside it (A3's label loop, A4's heading loop and A5's byte-comparison each gained the new `baseline:`/`Baseline comparison:` pair), so **110 + 3 + 80 = 193**.
- **Test hook**: `REGRESSION_RUN_BIN` points the suite at a mutant copy of the tool.
- **Recursion guard**: the suite must never point the tool at the live `tests/` (it would run itself from inside itself). Three invocation helpers, each pinned: `run_sandbox` injects `--tests-dir "$SB/`, `run_live`/`run_default` never name a tests dir at all, and every `run_live`/`run_default` **call site** carries `--only` or `--list`. Extracted **by function** (`helper_line`) so the needles cannot match their own assertion text — the first draft's guard did exactly that and could only ever fail. Section I runs **entirely through `run_sandbox`/`jrun`**, so even its error-path checks carry `--tests-dir`.
- **Mutations (14 total, copies under `/tmp`, tool md5 unchanged before/after)**. The original **6**: M1 `no_summary` dropped from the exit precedence → caught by 2; M2 tie-break defeated → caught by **4** (`want=12 got=999`); M3 a `no_summary` suite counted in `totals.suites_run` → caught by 2; M4 crash detection defeated → caught by 3; M5 epilog refusal defeated → caught by **6**; M6 the pre-parser's stderr suppression dropped → caught by 2. **The baseline 7** (`/tmp/opencode/mutate_baseline.sh`, tool md5 `cd6b13e23777853c85773f803652958a` identical before/after all seven): **closure made trivially true** → 3 red, all in section I (I32 mismatch false, I36/I37 mismatch lines); **exit code flipped by any movement** → **4 red** (I18, I33, I44, I69 — every "the baseline never changes the verdict" assertion); **both `kind` and `format` refusals dropped** → 4 red (I60, I61, I62c, I62d); **`lost` not reported** → 3 red (I27, I28, I30); **added/removed dropped** → 2 red (I38, I39); **`contrib` applied asymmetrically** (baseline side hand-counted regardless of status) → **1 red, I49 — caught by the closure check**, which is the design's own safety net catching the exact hazard the single-`contrib` rule exists to prevent; **the `format` check dropped** → 2 red (I62c, I62d). Each mutant's reds are confined to section I. **The termination 1** (`[0.4.124]`, `REGRESSION_RUN_BIN=/tmp/opencode/mut74`, only `install_termination_guard()`'s call removed) → **7 red in section J** (J2, J4, J6, J7, J8, J9, J11), 244 passed / 7 failed, and the live tool's md5 identical before and after; **J10 stays green there by construction** — the copy still *defines* the guard and lost only the call, which is the surgical difference between a plant and pre-fix code (the pre-fix replay, which has neither, reddens J10 too: 243 / 8). Both mutant runs close on **251 = 255 − 4**, the four being section G's `SKIP G6` shipped-location assertions, absent from any run whose `$TOOL` is not the shipped binary.
> build · mimo-v2.6-flash-free
[0m← [0mEdit repo/tools/REGISTRY.md
Index: repo/tools/REGISTRY.md
===================================================================
--- repo/tools/REGISTRY.md
+++ repo/tools/REGISTRY.md
@@ -2790,9 +2790,9 @@
**Dependencies**: python3 (stdlib only: argparse, contextlib, io, json, os, re, signal, subprocess, sys, time, datetime), `bash` and `php` to run their suites (either missing → exit 3, fail closed).
**Tests**:
-- `bash tests/test_regression_run.sh` → **331 assertions**, hermetic (throwaway fixtures under `/tmp/opencode/trr.*`, trap-cleaned): `--help` exits 0 and **all seven epilog sections equal their docstring blocks byte for byte** (the sixth, `termination contract:`, added by `[0.4.131]`; the seventh, `free-space preflight:`, added by `[0.4.148]`); the full exit-code contract `0/1/2/3/4/5/6` plus the `4 > 1` precedence and the preflight's own before-the-first-suite placement; all four parsing rules; the 14-key JSON contract including the usage-error, refusal *and* preflight objects having the *same* key set; the flag contract (including "stderr is exactly one diagnosis line" and "no `usage:` leak"); **the termination contract's own rendering (A13–A15)** — `start_new_session`, the `143 / 130` signal outcome and the declared escape limit must all appear in `--help`, three needles that sat in a docstring paragraph no label rendered (the (81) defect); **the preflight paragraph's own rendering (A18–A20)** — `nearest EXISTING ancestor`, `must not pass` and `Both fixture env vars are test hooks` must all appear in `--help`, three needles from the block that was docstring-only until `[0.4.148]` (the (91) defect, each measured **0** before the pair landed); **the epilog list is DERIVED, not copied (A16, A16b, A17.1–A17.7)** — `A3`/`A4`/`A5` and `help_section()`'s terminator set are read out of the tool's own `EPILOG_PAIRS`, so an eighth pair would be compared without editing four lists, and the three things a derived list cannot see are pinned: the extraction is not empty (`A16`, or every loop would assert nothing), the row count still equals the tuple's OWN pair count (`A16b`, read a second time by Python's `ast.literal_eval` — a row the `sed` pattern cannot spell, e.g. a pair split across two lines, would otherwise drop out of every loop with `A16`'s floor and `A17`'s pins both still green, which is queue item (92), measured **321/1** with `A16b` the only red) and each of the seven contract sections is still in the tuple (`A17.*`, or a deleted pair would vanish from every loop); the epilog refusal in both channels; **the free-space preflight (section K, 43 assertions)** — a healthy tree still runs and its suite really runs (marker written), an impossible floor refuses with 6 in both channels with **empty stdout**, an absent marker proving no suite started, the refusal naming the path it measured and the measured figure, a **later** watched path at 1 MB refusing (so the check is not first-path-only — real `statvfs` can never say 1), an unmeasurable path refusing rather than passing, `--log-dir`'s not-yet-created directory gated through its existing ancestor, `--list` exempt, the two usage-error env values, the `--help` documentation, and a plant with the call removed; **the termination contract (section J)** — the outer bound, a direct SIGTERM and a direct SIGINT are all *really* sent, the fixture suite spawns a **writing grandchild** so "the tool died" and "everything the tool started died" stay two questions, the two invocation helpers are pinned for `--tests-dir "$SB/` the way section H pins its three, and a plant (the install line `sed`'d out of a copy) carries J16/J17/J18; **the (88) census scoping (J19–J21)** — a same-named fixture this run did not start is **not counted** and **not killed** by `bound_kill`, while this run's own fixture **still counts**; **the (89) descendant reap (J22–J25)** — the mutant fixture's tree is captured *while it is alive* (`K19`, `K20`) and every pid in it must be gone after `bound_kill`, at **both** plant sites, because a SIGKILL'd shell *reparents* its foreground `sleep 300` to init where no fixture path remains to find it by; live read-only proof (`git status --porcelain` byte-identical); **the isolation path (section G's own precondition and control, G1–G11, queue item (102))** — outside `/data/repo` the whole section skips with the path in its reason instead of asserting facts about a tree that is not there, and at the shipped location it *measures* that rule by copying `tests/` + `tools/` **without `.git`** under `$SB/iso` and requiring the copy green (exit 0, `0 failed`, the `SKIP G` reason present, no `G1` line, ≥ 300 of the rest running), which cannot recurse because the copy skips section G by the same guard; and the recursion guard (see below). *(The count here said **193** while the suite was already at **218** through `[0.4.101]` and **237** through `[0.4.102]` — two runs stale; refreshed rather than extended. The **255 → 298** move is `[0.4.129]`'s section K, 43 assertions; the **298 → 301** move is `[0.4.130]`'s J19–J21; the **301 → 307** move is `[0.4.131]`'s section A (the sixth epilog pair counted by A3/A4/A5, plus A13–A15); the **307 → 314** move is `[0.4.132]`'s section A (the derived epilog list, A16 + A17.1–A17.6, with A3/A4/A5 unchanged at six rows); the **314 → 318** move is `[0.4.147]`'s section J (J22–J25, two per plant site); the **318 → 325** move is `[0.4.148]`'s section A (the seventh epilog pair, counted by A3/A4/A5 and pinned against deletion by A17.5, plus the A18–A20 needles); the **325 → 326** move is `[0.4.149]`'s section A (A16b, the pair count read a second time by Python's parser against the `sed` extraction).)*
+- `bash tests/test_regression_run.sh` → **331 assertions**, hermetic (throwaway fixtures under `/tmp/opencode/trr.*`, trap-cleaned): `--help` exits 0 and **all seven epilog sections equal their docstring blocks byte for byte** (the sixth, `termination contract:`, added by `[0.4.131]`; the seventh, `free-space preflight:`, added by `[0.4.148]`); the full exit-code contract `0/1/2/3/4/5/6` plus the `4 > 1` precedence and the preflight's own before-the-first-suite placement; all four parsing rules; the 14-key JSON contract including the usage-error, refusal *and* preflight objects having the *same* key set; the flag contract (including "stderr is exactly one diagnosis line" and "no `usage:` leak"); **the termination contract's own rendering (A13–A15)** — `start_new_session`, the `143 / 130` signal outcome and the declared escape limit must all appear in `--help`, three needles that sat in a docstring paragraph no label rendered (the (81) defect); **the preflight paragraph's own rendering (A18–A20)** — `nearest EXISTING ancestor`, `must not pass` and `Both fixture env vars are test hooks` must all appear in `--help`, three needles from the block that was docstring-only until `[0.4.148]` (the (91) defect, each measured **0** before the pair landed); **the epilog list is DERIVED, not copied (A16, A16b, A17.1–A17.7)** — `A3`/`A4`/`A5` and `help_section()`'s terminator set are read out of the tool's own `EPILOG_PAIRS`, so an eighth pair would be compared without editing four lists, and the three things a derived list cannot see are pinned: the extraction is not empty (`A16`, or every loop would assert nothing), the row count still equals the tuple's OWN pair count (`A16b`, read a second time by Python's `ast.literal_eval` — a row the `sed` pattern cannot spell, e.g. a pair split across two lines, would otherwise drop out of every loop with `A16`'s floor and `A17`'s pins both still green, which is queue item (92), measured **321/1** with `A16b` the only red) and each of the seven contract sections is still in the tuple (`A17.*`, or a deleted pair would vanish from every loop); the epilog refusal in both channels; **the free-space preflight (section K, 43 assertions)** — a healthy tree still runs and its suite really runs (marker written), an impossible floor refuses with 6 in both channels with **empty stdout**, an absent marker proving no suite started, the refusal naming the path it measured and the measured figure, a **later** watched path at 1 MB refusing (so the check is not first-path-only — real `statvfs` can never say 1), an unmeasurable path refusing rather than passing, `--log-dir`'s not-yet-created directory gated through its existing ancestor, `--list` exempt, the two usage-error env values, the `--help` documentation, and a plant with the call removed; **the termination contract (section J)** — the outer bound, a direct SIGTERM and a direct SIGINT are all *really* sent, the fixture suite spawns a **writing grandchild** so "the tool died" and "everything the tool started died" stay two questions, the two invocation helpers are pinned for `--tests-dir "$SB/` the way section H pins its three, and a plant (the install line `sed`'d out of a copy) carries J16/J17/J18; **the (88) census scoping (J19–J21)** — a same-named fixture this run did not start is **not counted** and **not killed** by `bound_kill`, while this run's own fixture **still counts**; **the (89) descendant reap (J22–J25)** — the mutant fixture's tree is captured *while it is alive* (`K19`, `K20`) and every pid in it must be gone after `bound_kill`, at **both** plant sites, because a SIGKILL'd shell *reparents* its foreground `sleep 300` to init where no fixture path remains to find it by; live read-only proof (`git status --porcelain` byte-identical); **the isolation path (section G's own precondition and control, G1–G11, queue item (102))** — outside `/data/repo` the whole section skips with the path in its reason instead of asserting facts about a tree that is not there, and at the shipped location it *measures* that rule by copying `tests/` + `tools/` **without `.git`** under `$SB/iso` and requiring the copy green (exit 0, `0 failed`, the `SKIP G` reason present, no `G1` line, ≥ 300 of the rest running), which cannot recurse because the copy skips section G by the same guard; and the recursion guard (see below). *(The count here said **193** while the suite was already at **218** through `[0.4.101]` and **237** through `[0.4.102]` — two runs stale; refreshed rather than extended. The **255 → 298** move is `[0.4.129]`'s section K, 43 assertions; the **298 → 301** move is `[0.4.130]`'s J19–J21; the **301 → 307** move is `[0.4.131]`'s section A (the sixth epilog pair counted by A3/A4/A5, plus A13–A15); the **307 → 314** move is `[0.4.132]`'s section A (the derived epilog list, A16 + A17.1–A17.6, with A3/A4/A5 unchanged at six rows); the **314 → 318** move is `[0.4.147]`'s section J (J22–J25, two per plant site); the **318 → 325** move is `[0.4.148]`'s section A (the seventh epilog pair, counted by A3/A4/A5 and pinned against deletion by A17.5, plus the A18–A20 needles); the **325 → 326** move is `[0.4.149]`'s section A (A16b, the pair count read a second time by Python's parser against the `sed` extraction); the **326 → 331** move is `[0.4.154]`'s section G (the shipped-location precondition, G1–G6d moved behind it, plus the five-assertion isolation control G7–G11 — measured 2026-10-01, and a copy of the suite loses all fourteen of them rather than failing four).)*
- **Baseline section (I, 80 assertions — measured by counting the section's own PASS lines, not by subtracting)**: round trip against a record the tool itself wrote shows no movement with `closure_ok true`; a tampered record shows `moved`/`lost`/`delta`/`attributed` all agreeing; a record whose totals were **not** edited alongside its suites reports `closure_ok false` while still printing both numbers and still exiting 0; added/removed/status-change cases each sum to the same total from both directions; and every refusal (missing file, non-JSON, a run payload, a duplicated suite name, an unreadable `format`, `--list` + flag, unwritable target) is exit 2 **before any suite runs** with empty stdout. The fixtures are *tampered* copies built by an embedded python builder, because a tool's own writer never produces the cases worth testing. Section A grew by **3** alongside it (A3's label loop, A4's heading loop and A5's byte-comparison each gained the new `baseline:`/`Baseline comparison:` pair), so **110 + 3 + 80 = 193**.
- **Test hook**: `REGRESSION_RUN_BIN` points the suite at a mutant copy of the tool.
- **Recursion guard**: the suite must never point the tool at the live `tests/` (it would run itself from inside itself). Three invocation helpers, each pinned: `run_sandbox` injects `--tests-dir "$SB/`, `run_live`/`run_default` never name a tests dir at all, and every `run_live`/`run_default` **call site** carries `--only` or `--list`. Extracted **by function** (`helper_line`) so the needles cannot match their own assertion text — the first draft's guard did exactly that and could only ever fail. Section I runs **entirely through `run_sandbox`/`jrun`**, so even its error-path checks carry `--tests-dir`.
- **Mutations (14 total, copies under `/tmp`, tool md5 unchanged before/after)**. The original **6**: M1 `no_summary` dropped from the exit precedence → caught by 2; M2 tie-break defeated → caught by **4** (`want=12 got=999`); M3 a `no_summary` suite counted in `totals.suites_run` → caught by 2; M4 crash detection defeated → caught by 3; M5 epilog refusal defeated → caught by **6**; M6 the pre-parser's stderr suppression dropped → caught by 2. **The baseline 7** (`/tmp/opencode/mutate_baseline.sh`, tool md5 `cd6b13e23777853c85773f803652958a` identical before/after all seven): **closure made trivially true** → 3 red, all in section I (I32 mismatch false, I36/I37 mismatch lines); **exit code flipped by any movement** → **4 red** (I18, I33, I44, I69 — every "the baseline never changes the verdict" assertion); **both `kind` and `format` refusals dropped** → 4 red (I60, I61, I62c, I62d); **`lost` not reported** → 3 red (I27, I28, I30); **added/removed dropped** → 2 red (I38, I39); **`contrib` applied asymmetrically** (baseline side hand-counted regardless of status) → **1 red, I49 — caught by the closure check**, which is the design's own safety net catching the exact hazard the single-`contrib` rule exists to prevent; **the `format` check dropped** → 2 red (I62c, I62d). Each mutant's reds are confined to section I. **The termination 1** (`[0.4.124]`, `REGRESSION_RUN_BIN=/tmp/opencode/mut74`, only `install_termination_guard()`'s call removed) → **7 red in section J** (J2, J4, J6, J7, J8, J9, J11), 244 passed / 7 failed, and the live tool's md5 identical before and after; **J10 stays green there by construction** — the copy still *defines* the guard and lost only the call, which is the surgical difference between a plant and pre-fix code (the pre-fix replay, which has neither, reddens J10 too: 243 / 8). Both mutant runs close on **251 = 255 − 4**, the four being section G's `SKIP G6` shipped-location assertions, absent from any run whose `$TOOL` is not the shipped binary.
[0m← [0mEdit repo/tools/REGISTRY.md
Index: repo/tools/REGISTRY.md
===================================================================
--- repo/tools/REGISTRY.md
+++ repo/tools/REGISTRY.md
@@ -2814,9 +2814,9 @@
**How it stays hermetic**: ten fixture directories are built under a `mktemp -d` sandbox (`green`, `red`, `silent`, `crash`, `hang`, `tie`, `fallback`, `unsupported`, `mixed`, `empty`), each a tiny shell script printing one summary shape and exiting accordingly; section I derives six **baseline** fixtures from a record the tool wrote, by tampering with a copy (a suite's count raised with its totals kept consistent, the same edit *without* the totals, a suite removed plus a suite the run never heard of, a suite recorded as `no_summary` with `passed: null`, a duplicated suite name, and a run payload); section J adds a **`j/`** workspace inside the same sandbox — `j/sb` holds the fixture suite that spawns a writing grandchild and sleeps 300 s, `j/foreign` a **same-named** fixture this run did not start (the (88) census-scoping subject), `j/mutant` the planted copy of the tool; section K adds **`pf/`** (a fixture suite that **writes a marker file**, so "no suite was started" is a file rather than an inference from an exit code) and **`k/mutant`** (the preflight call `sed`'d out); a `trap` removes the sandbox on EXIT/INT/TERM. Nothing under `tests/` is executed except two live checks, both carrying a safe flag.
**Exit codes**:
-- `0` - all 326 assertions pass
+- `0` - all 331 assertions pass
- `1` - one or more assertions failed
**Test hooks (env)**: `REGRESSION_RUN_BIN` — path of the tool under test, defaulting to `tools/regression-run`. Mutation runs point it at a copy, so the real tool is never edited. Section K additionally exports `GLADEX_MIN_FREE_MB`, `GLADEX_PREFLIGHT_PATHS` and `GLADEX_PREFLIGHT_FIXTURE` **around single invocations only** (`unset` immediately after), because a hook left exported would change every later section's verdict.
> build · mimo-v2.6-flash-free
[0m← [0mEdit repo/tools/REGISTRY.md
Index: repo/tools/REGISTRY.md
===================================================================
--- repo/tools/REGISTRY.md
+++ repo/tools/REGISTRY.md
@@ -2819,9 +2819,9 @@
- `1` - one or more assertions failed
**Test hooks (env)**: `REGRESSION_RUN_BIN` — path of the tool under test, defaulting to `tools/regression-run`. Mutation runs point it at a copy, so the real tool is never edited. Section K additionally exports `GLADEX_MIN_FREE_MB`, `GLADEX_PREFLIGHT_PATHS` and `GLADEX_PREFLIGHT_FIXTURE` **around single invocations only** (`unset` immediately after), because a hook left exported would change every later section's verdict.
-**Sections**: **A** `--help` contract incl. the **seven** docstring↔epilog byte-comparisons — since `[0.4.132]` **derived from `EPILOG_PAIRS`** rather than hand-copied, so the label loop, the heading loop, the byte-comparison heredoc and `help_section()`'s terminator set all move together — plus, since `[0.4.131]`, **A13–A15** (the termination contract's `start_new_session` / `143 / 130` / escape-limit needles reaching `--help` at all), since `[0.4.148]`, **A18–A20** (the preflight paragraph's `nearest EXISTING ancestor` / `must not pass` / `Both fixture env vars are test hooks` needles reaching `--help`) and, since `[0.4.132]`, **A16** (the extraction is not empty — an empty list would make the derived loops assert nothing), since `[0.4.149]`, **A16b** (the extracted row count equals the tuple's own pair count — `A16`'s floor cannot see a row the `sed` pattern could not spell) and **A17.1–A17.7** (each contract section still present in the tuple — the pin that keeps deletion from becoming invisible); **B** the exit-code contract (`0/1/2/3/4/5`, precedence `4 > 1`, and "silent contributes 0 passed **and** 0 suites_run"); **C** the four parsing rules (tie-break 12-not-999, assertion-line fallback still read, conflict flag, `skipped_reported`); **D** the 14-key JSON contract incl. usage-error/refusal key-set parity; **E** flags; **F** the epilog refusal in both channels; **G** live + read-only + `default_repo()`; **H** static + the recursion guard; **I** the baseline contract (80 assertions: closure both ways, `lost`, added/removed, status change, every refusal's exit code *and* message, and the four that pin "the verdict comes from the suites alone"); **J** the termination contract (25 assertions: the outer bound, a direct SIGTERM and a direct SIGINT really sent, the suite group reaped with the tool, the guard's wiring read out of the tool, two invocation helpers pinned for `--tests-dir "$SB/`, a plant, the (88) census scoping — a same-named fixture outside `$SB/j/sb` neither counted nor killed, this run's own fixture still counted — and the (89) descendant reap (J22–J25), which captures the mutant fixture's tree while it is alive and requires every pid in it gone after `bound_kill` at both plant sites, because a SIGKILL'd shell reparents its foreground `sleep 300` to init where no fixture path is left to find it by); **K** the free-space preflight (43 assertions: the healthy path still runs, exit 6 in both channels with empty stdout and an **absent marker file** proving no suite started, the refusal naming the path *and* the figure it measured, a **later** watched path at 1 MB refusing via the fixture hook, an unmeasurable path refusing rather than passing, `--log-dir`'s ancestor walk, `--list` exempt, the two usage-error env values, the `--help` documentation, the placement of the call between `--list` and the first write, and a plant with that call removed).
+**Sections**: **A** `--help` contract incl. the **seven** docstring↔epilog byte-comparisons — since `[0.4.132]` **derived from `EPILOG_PAIRS`** rather than hand-copied, so the label loop, the heading loop, the byte-comparison heredoc and `help_section()`'s terminator set all move together — plus, since `[0.4.131]`, **A13–A15** (the termination contract's `start_new_session` / `143 / 130` / escape-limit needles reaching `--help` at all), since `[0.4.148]`, **A18–A20** (the preflight paragraph's `nearest EXISTING ancestor` / `must not pass` / `Both fixture env vars are test hooks` needles reaching `--help`) and, since `[0.4.132]`, **A16** (the extraction is not empty — an empty list would make the derived loops assert nothing), since `[0.4.149]`, **A16b** (the extracted row count equals the tuple's own pair count — `A16`'s floor cannot see a row the `sed` pattern could not spell) and **A17.1–A17.7** (each contract section still present in the tuple — the pin that keeps deletion from becoming invisible); **B** the exit-code contract (`0/1/2/3/4/5`, precedence `4 > 1`, and "silent contributes 0 passed **and** 0 suites_run"); **C** the four parsing rules (tie-break 12-not-999, assertion-line fallback still read, conflict flag, `skipped_reported`); **D** the 14-key JSON contract incl. usage-error/refusal key-set parity; **E** flags; **F** the epilog refusal in both channels; **G** live + read-only + `default_repo()`, behind the shipped-location precondition (since `[0.4.154]` the section SKIPs with the path in its reason when `$REPO` is not `/data/repo`, because every assertion in it is a fact about the shipped tree) plus its own control **G7–G11** (a `.git`-less copy of `tests/` + `tools/` run with the test hooks unset must come back green there); **H** static + the recursion guard; **I** the baseline contract (80 assertions: closure both ways, `lost`, added/removed, status change, every refusal's exit code *and* message, and the four that pin "the verdict comes from the suites alone"); **J** the termination contract (25 assertions: the outer bound, a direct SIGTERM and a direct SIGINT really sent, the suite group reaped with the tool, the guard's wiring read out of the tool, two invocation helpers pinned for `--tests-dir "$SB/`, a plant, the (88) census scoping — a same-named fixture outside `$SB/j/sb` neither counted nor killed, this run's own fixture still counted — and the (89) descendant reap (J22–J25), which captures the mutant fixture's tree while it is alive and requires every pid in it gone after `bound_kill` at both plant sites, because a SIGKILL'd shell reparents its foreground `sleep 300` to init where no fixture path is left to find it by); **K** the free-space preflight (43 assertions: the healthy path still runs, exit 6 in both channels with empty stdout and an **absent marker file** proving no suite started, the refusal naming the path *and* the figure it measured, a **later** watched path at 1 MB refusing via the fixture hook, an unmeasurable path refusing rather than passing, `--log-dir`'s ancestor walk, `--list` exempt, the two usage-error env values, the `--help` documentation, the placement of the call between `--list` and the first write, and a plant with that call removed).
**Recursion guard (H)**: three invocation helpers are pinned — `run_sandbox` must inject `--tests-dir "$SB/`, and `run_live` / `run_default` must never name a tests dir; every `run_live` / `run_default` call site must carry `--only` or `--list`. The helpers' bodies are pulled out **by function name** (`helper_line`), because a guard that greps its own source matches its own needle and can only ever fail — which is what the first draft did.
**Dependencies**: bash, python3 (stdlib), git; no network, no sqlite, no systemd.
[0m← [0mEdit repo/tools/REGISTRY.md
Index: repo/tools/REGISTRY.md
===================================================================
--- repo/tools/REGISTRY.md
+++ repo/tools/REGISTRY.md
@@ -2825,9 +2825,9 @@
**Recursion guard (H)**: three invocation helpers are pinned — `run_sandbox` must inject `--tests-dir "$SB/`, and `run_live` / `run_default` must never name a tests dir; every `run_live` / `run_default` call site must carry `--only` or `--list`. The helpers' bodies are pulled out **by function name** (`helper_line`), because a guard that greps its own source matches its own needle and can only ever fail — which is what the first draft did.
**Dependencies**: bash, python3 (stdlib), git; no network, no sqlite, no systemd.
-**Tests / mutations**: see `## regression-run` — 326 assertions, 14 external mutant runs (6 original + 7 baseline + 1 termination), each confined to its own section, plus the two **in-suite** plants (F's renamed heading, J's removed guard call, K's removed preflight call).
+**Tests / mutations**: see `## regression-run` — 331 assertions, 14 external mutant runs (6 original + 7 baseline + 1 termination), each confined to its own section, plus the two **in-suite** plants (F's renamed heading, J's removed guard call, K's removed preflight call). A run whose `$TOOL` is not the shipped binary still loses exactly the **four** `G6*` assertions and nothing else — measured 2026-10-01 at **327 / 0** on `REGRESSION_RUN_BIN=<copy of the shipped tool>`, because G7–G11 are guarded by the shipped *location*, outside the shipped-*binary* condition.
**Status**: Green ✅ 2026-10-01 (326/326 with `[0.4.149]` — the (92) A16b pair-count equality; controls: an eighth pair spelled across two lines and placed FIRST in the tuple → **321/1**, the only red A16b (A16's floor still green, A17's pins still green, every derived loop still green — the blind spot reproduced with the new guard as its sole witness); the same two-line pair placed LAST → **320/2** (A16b plus A5.7, whose terminator set cannot know a label the extraction never saw) and the trailing comma dropped from the last pair → **316/3** (A16b, A17.7, A5.6); section G's shipped-location checks skipped in every control, since the mutant is not at `$REPO/tools/regression-run` — was 325/325 with `[0.4.148]` on 2026-10-01 (the (91) seventh epilog pair, A17.5 + A18–A20; control with that pair removed → **314/4**, the only reds A17.5, A18, A19, A20), and 318/318 with `[0.4.147]`, and 314/314 with `[0.4.132]` on 2026-09-29, and 307/307 with `[0.4.131]`, and 301/301 and 298/298 and 255/255 on 2026-09-29 before `[0.4.129]`'s section K, and 193/193 on 2026-09-26 — a figure that had already gone to 218 `[0.4.101]` and 237 `[0.4.102]` without this line moving)
## test_queue_source.sh
> build · mimo-v2.6-flash-free
[0m← [0mEdit repo/tools/REGISTRY.md
Index: repo/tools/REGISTRY.md
===================================================================
--- repo/tools/REGISTRY.md
+++ repo/tools/REGISTRY.md
@@ -2827,9 +2827,9 @@
**Dependencies**: bash, python3 (stdlib), git; no network, no sqlite, no systemd.
**Tests / mutations**: see `## regression-run` — 331 assertions, 14 external mutant runs (6 original + 7 baseline + 1 termination), each confined to its own section, plus the two **in-suite** plants (F's renamed heading, J's removed guard call, K's removed preflight call). A run whose `$TOOL` is not the shipped binary still loses exactly the **four** `G6*` assertions and nothing else — measured 2026-10-01 at **327 / 0** on `REGRESSION_RUN_BIN=<copy of the shipped tool>`, because G7–G11 are guarded by the shipped *location*, outside the shipped-*binary* condition.
-**Status**: Green ✅ 2026-10-01 (326/326 with `[0.4.149]` — the (92) A16b pair-count equality; controls: an eighth pair spelled across two lines and placed FIRST in the tuple → **321/1**, the only red A16b (A16's floor still green, A17's pins still green, every derived loop still green — the blind spot reproduced with the new guard as its sole witness); the same two-line pair placed LAST → **320/2** (A16b plus A5.7, whose terminator set cannot know a label the extraction never saw) and the trailing comma dropped from the last pair → **316/3** (A16b, A17.7, A5.6); section G's shipped-location checks skipped in every control, since the mutant is not at `$REPO/tools/regression-run` — was 325/325 with `[0.4.148]` on 2026-10-01 (the (91) seventh epilog pair, A17.5 + A18–A20; control with that pair removed → **314/4**, the only reds A17.5, A18, A19, A20), and 318/318 with `[0.4.147]`, and 314/314 with `[0.4.132]` on 2026-09-29, and 307/307 with `[0.4.131]`, and 301/301 and 298/298 and 255/255 on 2026-09-29 before `[0.4.129]`'s section K, and 193/193 on 2026-09-26 — a figure that had already gone to 218 `[0.4.101]` and 237 `[0.4.102]` without this line moving)
+**Status**: Green ✅ 2026-10-01 (**331/331** with `[0.4.154]` — the (102) shipped-location precondition and its isolation control; three measurements of the same step: the copy of `tests/` + `tools/` that went **322/4** before the guard goes **317/0** after it (`SKIP G: shipped-location checks (suite runs from /tmp/opencode/iso102b, not /data/repo)`, no `G1` line), a `REGRESSION_RUN_BIN`-shaped run still loses only the four `G6*` assertions at **327/0**, and the shipped run is 326/326 → **331/331** in 30.2 s → 60.1 s — was 326/326 with `[0.4.149]` — the (92) A16b pair-count equality; controls: an eighth pair spelled across two lines and placed FIRST in the tuple → **321/1**, the only red A16b (A16's floor still green, A17's pins still green, every derived loop still green — the blind spot reproduced with the new guard as its sole witness); the same two-line pair placed LAST → **320/2** (A16b plus A5.7, whose terminator set cannot know a label the extraction never saw) and the trailing comma dropped from the last pair → **316/3** (A16b, A17.7, A5.6); section G's shipped-location checks skipped in every control, since the mutant is not at `$REPO/tools/regression-run` — was 325/325 with `[0.4.148]` on 2026-10-01 (the (91) seventh epilog pair, A17.5 + A18–A20; control with that pair removed → **314/4**, the only reds A17.5, A18, A19, A20), and 318/318 with `[0.4.147]`, and 314/314 with `[0.4.132]` on 2026-09-29, and 307/307 with `[0.4.131]`, and 301/301 and 298/298 and 255/255 on 2026-09-29 before `[0.4.129]`'s section K, and 193/193 on 2026-09-26 — a figure that had already gone to 218 `[0.4.101]` and 237 `[0.4.102]` without this line moving)
## test_queue_source.sh
**Purpose**: Hermetic suite for `tools/queue-source-check` — the gate that stops
[0m← [0mEdit repo/tools/REGISTRY.md
Index: repo/tools/REGISTRY.md
===================================================================
--- repo/tools/REGISTRY.md
+++ repo/tools/REGISTRY.md
@@ -2794,9 +2794,9 @@
- `bash tests/test_regression_run.sh` → **331 assertions**, hermetic (throwaway fixtures under `/tmp/opencode/trr.*`, trap-cleaned): `--help` exits 0 and **all seven epilog sections equal their docstring blocks byte for byte** (the sixth, `termination contract:`, added by `[0.4.131]`; the seventh, `free-space preflight:`, added by `[0.4.148]`); the full exit-code contract `0/1/2/3/4/5/6` plus the `4 > 1` precedence and the preflight's own before-the-first-suite placement; all four parsing rules; the 14-key JSON contract including the usage-error, refusal *and* preflight objects having the *same* key set; the flag contract (including "stderr is exactly one diagnosis line" and "no `usage:` leak"); **the termination contract's own rendering (A13–A15)** — `start_new_session`, the `143 / 130` signal outcome and the declared escape limit must all appear in `--help`, three needles that sat in a docstring paragraph no label rendered (the (81) defect); **the preflight paragraph's own rendering (A18–A20)** — `nearest EXISTING ancestor`, `must not pass` and `Both fixture env vars are test hooks` must all appear in `--help`, three needles from the block that was docstring-only until `[0.4.148]` (the (91) defect, each measured **0** before the pair landed); **the epilog list is DERIVED, not copied (A16, A16b, A17.1–A17.7)** — `A3`/`A4`/`A5` and `help_section()`'s terminator set are read out of the tool's own `EPILOG_PAIRS`, so an eighth pair would be compared without editing four lists, and the three things a derived list cannot see are pinned: the extraction is not empty (`A16`, or every loop would assert nothing), the row count still equals the tuple's OWN pair count (`A16b`, read a second time by Python's `ast.literal_eval` — a row the `sed` pattern cannot spell, e.g. a pair split across two lines, would otherwise drop out of every loop with `A16`'s floor and `A17`'s pins both still green, which is queue item (92), measured **321/1** with `A16b` the only red) and each of the seven contract sections is still in the tuple (`A17.*`, or a deleted pair would vanish from every loop); the epilog refusal in both channels; **the free-space preflight (section K, 43 assertions)** — a healthy tree still runs and its suite really runs (marker written), an impossible floor refuses with 6 in both channels with **empty stdout**, an absent marker proving no suite started, the refusal naming the path it measured and the measured figure, a **later** watched path at 1 MB refusing (so the check is not first-path-only — real `statvfs` can never say 1), an unmeasurable path refusing rather than passing, `--log-dir`'s not-yet-created directory gated through its existing ancestor, `--list` exempt, the two usage-error env values, the `--help` documentation, and a plant with the call removed; **the termination contract (section J)** — the outer bound, a direct SIGTERM and a direct SIGINT are all *really* sent, the fixture suite spawns a **writing grandchild** so "the tool died" and "everything the tool started died" stay two questions, the two invocation helpers are pinned for `--tests-dir "$SB/` the way section H pins its three, and a plant (the install line `sed`'d out of a copy) carries J16/J17/J18; **the (88) census scoping (J19–J21)** — a same-named fixture this run did not start is **not counted** and **not killed** by `bound_kill`, while this run's own fixture **still counts**; **the (89) descendant reap (J22–J25)** — the mutant fixture's tree is captured *while it is alive* (`K19`, `K20`) and every pid in it must be gone after `bound_kill`, at **both** plant sites, because a SIGKILL'd shell *reparents* its foreground `sleep 300` to init where no fixture path remains to find it by; live read-only proof (`git status --porcelain` byte-identical); **the isolation path (section G's own precondition and control, G1–G11, queue item (102))** — outside `/data/repo` the whole section skips with the path in its reason instead of asserting facts about a tree that is not there, and at the shipped location it *measures* that rule by copying `tests/` + `tools/` **without `.git`** under `$SB/iso` and requiring the copy green (exit 0, `0 failed`, the `SKIP G` reason present, no `G1` line, ≥ 300 of the rest running), which cannot recurse because the copy skips section G by the same guard; and the recursion guard (see below). *(The count here said **193** while the suite was already at **218** through `[0.4.101]` and **237** through `[0.4.102]` — two runs stale; refreshed rather than extended. The **255 → 298** move is `[0.4.129]`'s section K, 43 assertions; the **298 → 301** move is `[0.4.130]`'s J19–J21; the **301 → 307** move is `[0.4.131]`'s section A (the sixth epilog pair counted by A3/A4/A5, plus A13–A15); the **307 → 314** move is `[0.4.132]`'s section A (the derived epilog list, A16 + A17.1–A17.6, with A3/A4/A5 unchanged at six rows); the **314 → 318** move is `[0.4.147]`'s section J (J22–J25, two per plant site); the **318 → 325** move is `[0.4.148]`'s section A (the seventh epilog pair, counted by A3/A4/A5 and pinned against deletion by A17.5, plus the A18–A20 needles); the **325 → 326** move is `[0.4.149]`'s section A (A16b, the pair count read a second time by Python's parser against the `sed` extraction); the **326 → 331** move is `[0.4.154]`'s section G (the shipped-location precondition, G1–G6d moved behind it, plus the five-assertion isolation control G7–G11 — measured 2026-10-01, and a copy of the suite loses all fourteen of them rather than failing four).)*
- **Baseline section (I, 80 assertions — measured by counting the section's own PASS lines, not by subtracting)**: round trip against a record the tool itself wrote shows no movement with `closure_ok true`; a tampered record shows `moved`/`lost`/`delta`/`attributed` all agreeing; a record whose totals were **not** edited alongside its suites reports `closure_ok false` while still printing both numbers and still exiting 0; added/removed/status-change cases each sum to the same total from both directions; and every refusal (missing file, non-JSON, a run payload, a duplicated suite name, an unreadable `format`, `--list` + flag, unwritable target) is exit 2 **before any suite runs** with empty stdout. The fixtures are *tampered* copies built by an embedded python builder, because a tool's own writer never produces the cases worth testing. Section A grew by **3** alongside it (A3's label loop, A4's heading loop and A5's byte-comparison each gained the new `baseline:`/`Baseline comparison:` pair), so **110 + 3 + 80 = 193**.
- **Test hook**: `REGRESSION_RUN_BIN` points the suite at a mutant copy of the tool.
- **Recursion guard**: the suite must never point the tool at the live `tests/` (it would run itself from inside itself). Three invocation helpers, each pinned: `run_sandbox` injects `--tests-dir "$SB/`, `run_live`/`run_default` never name a tests dir at all, and every `run_live`/`run_default` **call site** carries `--only` or `--list`. Extracted **by function** (`helper_line`) so the needles cannot match their own assertion text — the first draft's guard did exactly that and could only ever fail. Section I runs **entirely through `run_sandbox`/`jrun`**, so even its error-path checks carry `--tests-dir`.
-- **Mutations (14 total, copies under `/tmp`, tool md5 unchanged before/after)**. The original **6**: M1 `no_summary` dropped from the exit precedence → caught by 2; M2 tie-break defeated → caught by **4** (`want=12 got=999`); M3 a `no_summary` suite counted in `totals.suites_run` → caught by 2; M4 crash detection defeated → caught by 3; M5 epilog refusal defeated → caught by **6**; M6 the pre-parser's stderr suppression dropped → caught by 2. **The baseline 7** (`/tmp/opencode/mutate_baseline.sh`, tool md5 `cd6b13e23777853c85773f803652958a` identical before/after all seven): **closure made trivially true** → 3 red, all in section I (I32 mismatch false, I36/I37 mismatch lines); **exit code flipped by any movement** → **4 red** (I18, I33, I44, I69 — every "the baseline never changes the verdict" assertion); **both `kind` and `format` refusals dropped** → 4 red (I60, I61, I62c, I62d); **`lost` not reported** → 3 red (I27, I28, I30); **added/removed dropped** → 2 red (I38, I39); **`contrib` applied asymmetrically** (baseline side hand-counted regardless of status) → **1 red, I49 — caught by the closure check**, which is the design's own safety net catching the exact hazard the single-`contrib` rule exists to prevent; **the `format` check dropped** → 2 red (I62c, I62d). Each mutant's reds are confined to section I. **The termination 1** (`[0.4.124]`, `REGRESSION_RUN_BIN=/tmp/opencode/mut74`, only `install_termination_guard()`'s call removed) → **7 red in section J** (J2, J4, J6, J7, J8, J9, J11), 244 passed / 7 failed, and the live tool's md5 identical before and after; **J10 stays green there by construction** — the copy still *defines* the guard and lost only the call, which is the surgical difference between a plant and pre-fix code (the pre-fix replay, which has neither, reddens J10 too: 243 / 8). Both mutant runs close on **251 = 255 − 4**, the four being section G's `SKIP G6` shipped-location assertions, absent from any run whose `$TOOL` is not the shipped binary.
+- **Mutations (14 total, copies under `/tmp`, tool md5 unchanged before/after)**. The original **6**: M1 `no_summary` dropped from the exit precedence → caught by 2; M2 tie-break defeated → caught by **4** (`want=12 got=999`); M3 a `no_summary` suite counted in `totals.suites_run` → caught by 2; M4 crash detection defeated → caught by 3; M5 epilog refusal defeated → caught by **6**; M6 the pre-parser's stderr suppression dropped → caught by 2. **The baseline 7** (`/tmp/opencode/mutate_baseline.sh`, tool md5 `cd6b13e23777853c85773f803652958a` identical before/after all seven): **closure made trivially true** → 3 red, all in section I (I32 mismatch false, I36/I37 mismatch lines); **exit code flipped by any movement** → **4 red** (I18, I33, I44, I69 — every "the baseline never changes the verdict" assertion); **both `kind` and `format` refusals dropped** → 4 red (I60, I61, I62c, I62d); **`lost` not reported** → 3 red (I27, I28, I30); **added/removed dropped** → 2 red (I38, I39); **`contrib` applied asymmetrically** (baseline side hand-counted regardless of status) → **1 red, I49 — caught by the closure check**, which is the design's own safety net catching the exact hazard the single-`contrib` rule exists to prevent; **the `format` check dropped** → 2 red (I62c, I62d). Each mutant's reds are confined to section I. **The termination 1** (`[0.4.124]`, `REGRESSION_RUN_BIN=/tmp/opencode/mut74`, only `install_termination_guard()`'s call removed) → **7 red in section J** (J2, J4, J6, J7, J8, J9, J11), 244 passed / 7 failed, and the live tool's md5 identical before and after; **J10 stays green there by construction** — the copy still *defines* the guard and lost only the call, which is the surgical difference between a plant and pre-fix code (the pre-fix replay, which has neither, reddens J10 too: 243 / 8). Both mutant runs close on **251 = 255 − 4**, the four being section G's `SKIP G6` shipped-location assertions, absent from any run whose `$TOOL` is not the shipped binary — and the same four are *still* the whole subtraction since `[0.4.154]` (total **331 → 327**, measured 2026-10-01), because that entry put G7–G11 behind the shipped *location*, outside this shipped-*binary* condition.
- Live (measured 2026-10-01): `./tools/regression-run` → **75 suites** discovered — the suite count this file quotes as current, and the only place it is quoted as current. Machine-checked by `tests/test_registry_coverage.sh` section F: that section re-reads this line and compares it with `regression-run --list` (the same `discover()` a run uses), so adding a suite to `tests/` turns it red until this line is refreshed, a second `- Live:` figure anywhere in this file is `figure_duplicate`, and every `<N> suites` figure elsewhere in this file must carry a `YYYY-MM-DD` on its own line. Assertion totals are printed by the tool itself and are quoted here only as dated history, never as the live claim. *(Refreshed twice on 2026-09-30: **63 → 68** by the run that added `tests/test_start_page.php`, then **68 → 70** when `tests/test_onboarding_baseline.php` and, minutes later, a concurrent shift's `tests/test_heading_order.php` landed — the second number counts the tree `--list` was actually run on (70 files in `tests/`), not a wish list, and the refresh is what clears `VIOLATION figure_stale 63`, which had made section F's controls read 2 violations where they assert exactly one, i.e. 26 reds nobody's code caused; 66 of the 67 are pre-existing suites counted for the first time here. A third refresh, **70 → 73**, landed on 2026-09-30T17:13Z. The starting state was `tests/test_trust_form.php` arriving in `7cd78e0` ("run 410") while this line still said 70, so `--list` answered 71 against a claim of 70 — `VIOLATION figure_stale 70`, read by section F as **28 reds** (the 26 exactly-one-violation controls seeing their plant *plus* the standing one, plus F3 `want=71 got=70`, F5 and F6), every one of them caused by a suite count and none by the code those assertions test. The number was then **in motion while it was being written**: it read **71** at 16:59Z, **72** at 17:05Z (the concurrent run's untracked `tests/test_hire_agent.sh`), and **73** at 17:12Z (`tests/test_commit_gate.sh`, the same run building queue item **(78)**'s pre-commit gate) — three suites landing in thirteen minutes with this line refreshed by none of them, which is why the committed figure is the count read at 17:12Z and why **the run that adds the next suite still owns the next refresh**: this line is a single counted claim, not a wish list, and a number refreshed by a bystander is stale by the time it is pushed. Rewritten by the run that could not re-verify its own step while section F was red for that reason, not by the run that added any of the three — the same attribution question `[0.4.140]`'s heading answered.)* *(Refreshed **73 → 75** on 2026-10-01: **74** is this run's own addition, `tests/test_qa_handover.php` — the guard for `team/QA-HANDOVER.md`, the QA/docs handover `team/ONBOARDING.md`'s first-week item promises — and the **75th** was `tests/test_chat_nojs.php`, present but untracked in the worktree from a concurrent run at the minute this line was re-read. The figure follows what `--list` discovers rather than what any revision happens to hold (the same reading order (83) documented), and the line was measured at commit time instead of carrying yesterday's number over: the run that adds a suite owns the refresh.)*
- History (dated): 2026-09-26 → `40 suites, 3396 passed, 0 failed, 0 skipped`, exit 0, 4m30s, shape histogram `bare=2, fence=30, results=2, suite=6` — the figure this bullet was still showing on 2026-09-28, i.e. five suites stale, which is the defect queue item (63) closed. The movement over `[0.4.65]`'s **3313 closes exactly: +83 = `test_regression_run.sh` 110 → 193**, no other suite moved. **`[0.4.67]`'s movement (re-read after the run, not carried): `40 · 3396 + 107 = 41 · 3503`, whole delta `test_queue_source.sh` 0 → 107, shape `suite` → histogram `bare=2, fence=30, results=2, suite=7`.** Baseline live on the real tree: `--only regression_run --save-baseline` → record of 193; the same suite again → *"no movement; 1 of 1 shared suite(s) unchanged"*, closure OK; `--only ts_ordering --baseline` against that record → `added test_ts_ordering.php`, `removed test_regression_run.sh`, **`totals delta -186` = `attributed -186`** (−193 + 7), `CLOSURE OK`, exit 0.
**Status**: Built ✅ 2026-09-26 (193/193; closes `[0.4.65]`'s PROGRESS queue item (1) — the full-regression figure this line used to quote lives only on the dated `- Live:` line above since (63))
> build · mimo-v2.6-flash-free
[0m$ [0mcd /data/repo && tail -c 400 CHANGELOG.md | cat -A | tail -5
111 frozen item lines are untouched).$
$
### Queue -> agent-logs/PROGRESS.md$
Authoritative next-candidate queue lives in `agent-logs/PROGRESS.md`, in the `Next-candidate queued, not actioned` bullet of the newest run entry M-bM-^@M-^T it is not duplicated here, and has not been since `[0.4.67]`. To read the live queue, open `PROGRESS.md`; to know whether that is still true, run `tools/queue-source-check`.$
> build · mimo-v2.6-flash-free
[0m$ [0mcd /data/repo && cat >> CHANGELOG.md <<'ENTRY'
## [0.4.154] - 2026-10-01 — queue item (102): section G states where it must run — a shipped-location precondition, a skip that carries the path, and a control that runs the suite from a copy and requires it green
### Changed — one suite, one section, no tool edit
- **(102) closed by a precondition instead of an env hook.** `tests/test_regression_run.sh`'s section G asserts facts about the **shipped** tree: this repo's git state (G1–G5), the shipped binary's own `default_repo()` (G6/G6b) and the documented `/data/tools` symlink (G6c/G6d). From an isolation path — a control's `cp -a tests tools`, no `.git` — every one of them is a statement about a tree that is not under the suite's feet, and the item's own measurement reproduced here on the **unmodified** suite says so in numbers: the copy went **322 passed / 4 failed**, the four reds being exactly `G1` (`fatal: not a git repository`, tool exit 4), `G2`, `G6` and `G6b` (`want=/data/repo got=/tmp/opencode/iso102`), while the mutation that copy existed to test stayed green. Four harness reds, zero findings — a red that does not mean what it says. Section G now opens with the precondition `[ "$REPO" != "/data/repo" ]` and, when it does not hold, **skips with the path in the reason** (`SKIP G: shipped-location checks (suite runs from …, not /data/repo)`) instead of asserting: the rule G6 already applied to the shipped *binary*, widened to the shipped *location*.
- **The queue's candidate (a) — an env hook for `REPO` beside `REGRESSION_RUN_BIN` — is rejected on the record.** It would give an isolation run a second way to make G green (re-pin the section to the live tree while the suite executes from a copy), i.e. a knob no run needs and no assertion reads; a hook left exported would change the verdict of every later run, which is exactly the hazard `REGISTRY.md`'s test-hook paragraph already warns about for section K's three. The skip alone answers what (102) asked — the isolation path runs green — so the knob is not built.
- **G7–G11 make the skip a measured contract rather than a comment.** At the shipped location the section now copies `tests/` + `tools/` (~3.3 MB) under `$SB/iso` **without `.git`** — that absence is the condition that reddened G1 — and runs the copy with every test hook unset (`REGRESSION_RUN_BIN`, `GLADEX_REPO_DIR`, `GLADEX_TESTS_DIR`, `GLADEX_MIN_FREE_MB`, `GLADEX_PREFLIGHT_PATHS`, `GLADEX_PREFLIGHT_FIXTURE`). It then requires, in order: the copy exits **0** (G7); its own `=== Results:` line reports **0 failed** (G8, parsed rather than eyeballed, so an empty run cannot read as a pass); the `SKIP G: shipped-location checks` reason is present in the copy's output (G9); **no** `G1 live --only ts_ordering` line is in it (G10 — the guard's *granularity*, not merely that *a* skip happened); and at least **300** of the copy's assertions ran (G11, measured **317**) so a copy that skipped everything green cannot pass. The copy skips section G by the same guard, so the control cannot recurse into a second copy, and the suite's existing `trap` reaps the copy with the sandbox.
- **`tools/REGISTRY.md`, written only inside `## test_regression_run.sh` plus the one mutation-accounting sentence in `## regression-run`**: the `Exit codes` bullet (**326 → 331**), the `bash tests/test_regression_run.sh →` headline (331, with the isolation control added to the described surface), the count-history parenthetical (the **326 → 331** move, and that a copy loses all fourteen G assertions rather than failing four), the `Sections` **G** row, `Tests / mutations` (331, plus the measured 327/0 for a non-shipped `$TOOL`), a dated `Status` figure, and the `## regression-run` sentence that says a mutant run's whole subtraction is the four `SKIP G6` assertions — still true, now with its post-step measurement. No executed tool was edited, so the tool census is unchanged (**22 tools, 31 registered sections**), and the `- Live:` suite figure on `## regression-run` (measured 2026-10-01) is untouched because no suite was added or removed.
### Verified — four runs, one of them pre-fix
- **Shipped tree: `bash tests/test_regression_run.sh` → 331 passed, 0 failed (60.1 s)** against **326 / 0 (30.2 s)** before the step — **5 added, 0 removed**, section G still executing in full at the shipped location (G1–G6d present in its output).
- **The item itself, pre-fix vs post-fix**: the same `cp -a tests tools` copy of the suite goes **322 passed / 4 failed → 317 passed / 0 failed (29.6 s)**, and the post-fix copy prints `SKIP G: shipped-location checks (suite runs from /tmp/opencode/iso102b, not /data/repo)` with **0** occurrences of the `G1` assertion line. 317 = 331 − 14: the nine shipped-location assertions plus the five controls that can only be true there.
- **Mutation-run accounting, measured rather than assumed**: `REGRESSION_RUN_BIN=<verbatim copy of the shipped tool>` → **327 passed, 0 failed (61.3 s)** with `SKIP G6: shipped-location checks (under test: /tmp/opencode/trr-ctl-shipped-copy)` — i.e. a run whose `$TOOL` is not the shipped binary loses **exactly the same four** assertions as before this entry (331 − 4 = 327), because G7–G11 sit behind the location guard and outside the binary one.
- **Supporting suites on this tree**: `tests/test_registry_coverage.sh` → **280 passed, 0 failed** (the suite that re-reads `REGISTRY.md`'s figures against live runs, i.e. the gate on this entry's own registry edits), `tests/test_repo_lint.sh` → **461 / 0**, `tests/test_queue_source.sh` → **181 / 0**, `tests/test_commit_gate.sh` → **41 / 0**.
### Notes
- No `app/src/php` edit → **no reviewer gate and no promote** (prod untouched); no service restarted; **zero DNS writes**; **no mail sent**; model spend **0.00** (free `*-free` models only). The copy lives under the suite's own `$SB` and is removed by its `trap`; nothing under `tests/` or `tools/` was mutated to reach these numbers.
### Queue -> agent-logs/PROGRESS.md
Authoritative next-candidate queue lives in `agent-logs/PROGRESS.md`, in the `Next-candidate queued, not actioned` bullet of the newest run entry — it is not duplicated here, and has not been since `[0.4.67]`. To read the live queue, open `PROGRESS.md`; to know whether that is still true, run `tools/queue-source-check`.
ENTRY
echo appended; tail -4 CHANGELOG.md
appended
- No `app/src/php` edit → **no reviewer gate and no promote** (prod untouched); no service restarted; **zero DNS writes**; **no mail sent**; model spend **0.00** (free `*-free` models only). The copy lives under the suite's own `$SB` and is removed by its `trap`; nothing under `tests/` or `tools/` was mutated to reach these numbers.
### Queue -> agent-logs/PROGRESS.md
Authoritative next-candidate queue lives in `agent-logs/PROGRESS.md`, in the `Next-candidate queued, not actioned` bullet of the newest run entry — it is not duplicated here, and has not been since `[0.4.67]`. To read the live queue, open `PROGRESS.md`; to know whether that is still true, run `tools/queue-source-check`.
> build · mimo-v2.6-flash-free
[0m$ [0mcd /data/repo && ./tools/queue-source-check --format json; echo "exit=$?"
{"changelog": "/data/repo/CHANGELOG.md", "detail": "one queue: [0.4.154] pointer-only, 111 item line(s) frozen across 110 section(s), 110 PROGRESS bullet(s)", "error": null, "exit_code": 0, "ok": true, "progress": "/data/repo/agent-logs/PROGRESS.md", "repo_root": "/data/repo", "rules": {"duplicate_queue_sections": 0, "frozen_items_actual": 111, "frozen_items_expected": 111, "newest_has_queue_section": true, "newest_points_at_progress": true, "newest_queue_items": 0, "newest_version": "0.4.154", "progress_bullets": 110, "queue_headings_fenced": 1, "queue_headings_raw": 111, "queue_sections": 110}, "timestamp": "2026-10-01T07:48:16Z", "tool": "queue-source-check", "violations": []}
exit=0
[0m$ [0mcd /data/repo && for s in test_repo_lint.sh test_queue_source.sh test_commit_gate.sh; do echo "== $s"; bash tests/$s 2>&1 | tail -2; done; echo "== changelog suites"; for s in test_changelog_api.php test_changelog_mobile.php test_app_version.php; do echo "== $s"; php tests/$s 2>&1 | tail -2; done
== test_repo_lint.sh
repo-lint suite: 461 passed, 0 failed
===============================
== test_queue_source.sh
queue-source-check suite: 181 passed, 0 failed
===============================
== test_commit_gate.sh
commit-gate suite: 41 passed, 0 failed
=================================
== changelog suites
== test_changelog_api.php
=== Results: 86 passed, 0 failed ===
== test_changelog_mobile.php
=== Results: 125 passed, 0 failed, 0 skipped ===
== test_app_version.php
=== Results: 39 passed, 0 failed ===
> build · mimo-v2.6-flash-free
[0m$ [0mcd /data/repo && grep -n "^## 2026-10-01" agent-logs/PROGRESS.md | tail -3; wc -l agent-logs/PROGRESS.md; grep -n "Next-candidate queued, not actioned" agent-logs/PROGRESS.md | tail -2
7401:## 2026-10-01T04:16Z main-loop run — STEP 0 verified first (0 unread, 0 open, nothing owed), then **(98) LANDED: the three documented non-2 codes become CONTRACTS — a `DECLARED_PAIRS` table, a sixth partition bucket, five assertions and a control that turns `repo-lint`'s `die()` default off**
7445:## 2026-10-01T05:34Z main-loop run — STEP 0 verified first (0 unread / 0 open, nothing owed), then **(100) LANDED: the thirteen mutation controls stop being prose — section K runs them in-file, four measurements each, the live tree never written — suite 50 → 102**
7480:## 2026-10-01T07:11Z main-loop run — STEP 0 verified first (0 unread / 0 open, nothing owed), then **(101) LANDED: `wait;` becomes visible to both readers — the terminator class widens on the census and on the pairing, the tail hands the separator back, and section K's plant helpers stop reading backslashes — suite 102 → 116**
7518 agent-logs/PROGRESS.md
7464:- **Next-candidate queued, not actioned**: **(100) STRUCK — EXECUTED by `[0.4.151]`** (section `K`, 13 controls × 4 assertions, suite **50 → 102**, `A 30 / B 17 / C 3 / K 52`, the thirteen red sets measured and matching the prose table exactly). Carry unchanged and all standing: (2), (4)–(8), (14), (15), (17), (18), (20), (22), (23), (25), (28), (32), (36), (39), (42), (44), (47), (48), (52), (53), (54), (56), (60), (61), (62), (66), (67), (68), (70), (99), (101), (102), (103) unchanged and **(93)** (public nav → LAN-only `/docs` + `/changelog`, still the investor's call — it widens a surface), **(96) candidate (b)** (normalise `CAST(ts AS INTEGER)` on read in `app/src/php/app.php`, only if a bad row is ever detected, reviewer-gated) and **(97)** whose candidates (a) redact+guard / (b) history purge / (c) fixtures-amendment stay **blocked on the founder's A/B/C answer** to reply dev 141 / prod 106. Live head of the machinery list: **(99)**, **(101)**, **(102)**, **(103)**. Next-candidate priority after this run: **(93)** or **(97)(a)** the moment the investor answers, otherwise the oldest carried machinery item — **(99)**, noting that (99) is the dead-letter agent loop whose fix only takes effect **with a service restart**, which this loop does not do unilaterally; if that stays blocked the next in line is **(101)** (`wait;` — a statement invisible to both readers, the machine-readable and the prose, so it lands as a no-op test).
7498:- **Next-candidate queued, not actioned**: **(101) STRUCK — EXECUTED by `[0.4.152]` + `[0.4.153]`** (terminator class `(^|[; \t])wait([ \t;|]|$)` on both A-section readers, the tail handing `;`/`|` back, plants `A30`–`A32` / `B18`–`B20`, controls `K14`/`K15`, suite **102 → 116**, `A 33 / B 20 / C 3 / K 60`, all fifteen red sets measured). Carry unchanged and all standing: (2), (4)–(8), (14), (15), (17), (18), (20), (22), (23), (25), (28), (32), (36), (39), (42), (44), (47), (48), (52), (53), (54), (56), (60), (61), (62), (66), (67), (68), (70), (99), (102), (103) unchanged, plus the new **(104)** — *the start-class gaps `x;wait;`, `x|wait;`, `x&&wait` and the `wait&&` / `wait&` terminator gaps: measured this run, 0 live hits in `tools/` (1 comment in `tests/`), dormant, so (101) deliberately did not fold them in* — and **(93)** (public nav → LAN-only `/docs` + `/changelog`, still the investor's call — it widens a surface), **(96) candidate (b)** (normalise `CAST(ts AS INTEGER)` on read in `app/src/php/app.php`, only if a bad row is ever detected, reviewer-gated) and **(97)** whose candidates (a) redact+guard / (b) history purge / (c) fixtures-amendment stay **blocked on the founder's A/B/C answer** to reply dev 141 / prod 106. Live head of the machinery list: **(99)**, **(102)**, **(103)**, **(104)**. Next-candidate priority after this run: **(93)** or **(97)(a)** the moment the investor answers, otherwise the oldest carried machinery item — **(99)**, noting that (99) is the dead-letter agent loop whose fix only takes effect **with a service restart**, which this loop does not do unilaterally; if that stays blocked the next in line is **(102)**.
[0m$ [0mcd /data/repo && nohup bash tests/test_registry_coverage.sh > /tmp/opencode/reghash.log 2>&1 & echo started
started
> build · mimo-v2.6-flash-free
[0m$ [0msleep 120; tail -3 /tmp/opencode/reghash.log; echo "---"; grep -c "^FAIL" /tmp/opencode/reghash.log || true; date -u +%Y-%m-%dT%H:%MZ
PASS: C19e exactly one violation - the plant, and nothing else
PASS: C20a plant: the Live line survives but without a figure
PASS: C20b plant: and the figure-less line itself is still there (it kept its words, lost only its number)
---
0
2026-10-01T07:51Z
> build · mimo-v2.6-flash-free
[0m$ [0msleep 180; tail -2 /tmp/opencode/reghash.log; echo "--- fails:"; grep -n "^FAIL" /tmp/opencode/reghash.log || true; grep -c "^PASS" /tmp/opencode/reghash.log
=== Results: 280 passed, 0 failed ===
--- fails:
280
> build · mimo-v2.6-flash-free
Select another run log from the list above. Only files matching run-YYYYMMDD-HHMMSS-N.log are readable.
App log tail — prod-8001.log (last 60 lines)
[Thu Oct 1 09:38:48 2026] 127.0.0.1:58536 Accepted [Thu Oct 1 09:38:48 2026] 127.0.0.1:58536 Closing [Thu Oct 1 09:39:30 2026] 127.0.0.1:49512 Accepted [Thu Oct 1 09:39:30 2026] 127.0.0.1:49512 Closing [Thu Oct 1 09:39:30 2026] 127.0.0.1:49526 Accepted [Thu Oct 1 09:39:30 2026] 127.0.0.1:49526 Closing [Thu Oct 1 09:39:30 2026] 127.0.0.1:49530 Accepted [Thu Oct 1 09:39:30 2026] 127.0.0.1:49530 Closing [Thu Oct 1 09:39:30 2026] 127.0.0.1:49534 Accepted [Thu Oct 1 09:39:30 2026] 127.0.0.1:49534 Closing [Thu Oct 1 09:39:30 2026] 127.0.0.1:49540 Accepted [Thu Oct 1 09:39:30 2026] 127.0.0.1:49540 Closing [Thu Oct 1 09:39:30 2026] 127.0.0.1:49554 Accepted [Thu Oct 1 09:39:30 2026] 127.0.0.1:49554 Closing [Thu Oct 1 09:39:30 2026] 127.0.0.1:49560 Accepted [Thu Oct 1 09:39:30 2026] 127.0.0.1:49560 Closing [Thu Oct 1 09:39:30 2026] 127.0.0.1:49562 Accepted [Thu Oct 1 09:39:30 2026] 127.0.0.1:49562 Closing [Thu Oct 1 09:39:30 2026] 127.0.0.1:49576 Accepted [Thu Oct 1 09:39:31 2026] 127.0.0.1:49576 Closing [Thu Oct 1 09:39:31 2026] 127.0.0.1:49590 Accepted [Thu Oct 1 09:39:31 2026] 127.0.0.1:49590 Closing [Thu Oct 1 09:40:41 2026] 127.0.0.1:37186 Accepted [Thu Oct 1 09:40:41 2026] 127.0.0.1:37186 Closing [Thu Oct 1 09:40:41 2026] 127.0.0.1:37190 Accepted [Thu Oct 1 09:40:41 2026] 127.0.0.1:37190 Closing [Thu Oct 1 09:40:41 2026] 127.0.0.1:37200 Accepted [Thu Oct 1 09:40:41 2026] 127.0.0.1:37200 Closing [Thu Oct 1 09:40:41 2026] 127.0.0.1:37208 Accepted [Thu Oct 1 09:40:41 2026] 127.0.0.1:37208 Closing [Thu Oct 1 09:40:41 2026] 127.0.0.1:37216 Accepted [Thu Oct 1 09:40:41 2026] 127.0.0.1:37216 Closing [Thu Oct 1 09:40:41 2026] 127.0.0.1:37218 Accepted [Thu Oct 1 09:40:41 2026] 127.0.0.1:37218 Closing [Thu Oct 1 09:40:41 2026] 127.0.0.1:37230 Accepted [Thu Oct 1 09:40:41 2026] 127.0.0.1:37230 Closing [Thu Oct 1 09:40:41 2026] 127.0.0.1:37238 Accepted [Thu Oct 1 09:40:41 2026] 127.0.0.1:37238 Closing [Thu Oct 1 09:40:41 2026] 127.0.0.1:37240 Accepted [Thu Oct 1 09:40:42 2026] 127.0.0.1:37240 Closing [Thu Oct 1 09:40:42 2026] 127.0.0.1:37250 Accepted [Thu Oct 1 09:40:42 2026] 127.0.0.1:37250 Closing [Thu Oct 1 09:49:22 2026] 127.0.0.1:48402 Accepted [Thu Oct 1 09:49:23 2026] 127.0.0.1:48402 Closing [Thu Oct 1 09:52:00 2026] 127.0.0.1:51434 Accepted [Thu Oct 1 09:52:00 2026] 127.0.0.1:51434 Closed without sending a request; it was probably just an unused speculative preconnection [Thu Oct 1 09:52:00 2026] 127.0.0.1:51434 Closing [Thu Oct 1 09:52:01 2026] 127.0.0.1:51440 Accepted [Thu Oct 1 09:52:01 2026] 127.0.0.1:51440 Closed without sending a request; it was probably just an unused speculative preconnection [Thu Oct 1 09:52:01 2026] 127.0.0.1:51440 Closing [Thu Oct 1 09:52:34 2026] 127.0.0.1:52304 Accepted [Thu Oct 1 09:52:34 2026] 127.0.0.1:52304 Closed without sending a request; it was probably just an unused speculative preconnection [Thu Oct 1 09:52:34 2026] 127.0.0.1:52304 Closing [Thu Oct 1 09:52:35 2026] 127.0.0.1:36706 Accepted [Thu Oct 1 09:52:35 2026] 127.0.0.1:36706 Closed without sending a request; it was probably just an unused speculative preconnection [Thu Oct 1 09:52:35 2026] 127.0.0.1:36706 Closing [Thu Oct 1 09:55:07 2026] 127.0.0.1:38954 Accepted [Thu Oct 1 09:55:07 2026] 127.0.0.1:38954 Closing [Thu Oct 1 09:55:07 2026] 127.0.0.1:38960 Accepted
Generated 2026-10-01 07:55:07 UTC · Gladex.de