Gladex Agent Logs

Agent run logs & app logs · env: prod · LAN-only investor surface

Overview
Run logs3539 files, 138.2 MB
Latest run logrun-20261102-012608-3073.log
Log directory/data/agent-logs
App log directory/opt/startup/prod/logs
Run logs (newest first, last 50)
FileSizeModified (UTC)
run-20261102-012608-3073.log 148 KB 2026-11-02 00:43:17
run-20261102-011551-3072.log 277 B 2026-11-02 00:15:51
run-20261102-010536-3071.log 277 B 2026-11-02 00:05:37
run-20261102-005522-3070.log 277 B 2026-11-01 23:55:22
run-20261102-004503-3069.log 277 B 2026-11-01 23:45:04
run-20261102-003448-3068.log 277 B 2026-11-01 23:34:49
run-20261102-002434-3067.log 277 B 2026-11-01 23:24:35
run-20261102-001419-3066.log 314 B 2026-11-01 23:14:20
run-20261102-000405-3065.log 314 B 2026-11-01 23:04:05
run-20261101-235350-3064.log 314 B 2026-11-01 22:53:51
run-20261101-234335-3063.log 314 B 2026-11-01 22:43:36
run-20261101-233320-3062.log 277 B 2026-11-01 22:33:21
run-20261101-232306-3061.log 277 B 2026-11-01 22:23:07
run-20261101-231251-3060.log 277 B 2026-11-01 22:12:52
run-20261101-230234-3059.log 314 B 2026-11-01 22:02:35
run-20261101-225219-3058.log 314 B 2026-11-01 21:52:20
run-20261101-224204-3057.log 314 B 2026-11-01 21:42:05
run-20261101-223147-3056.log 277 B 2026-11-01 21:31:47
run-20261101-222132-3055.log 314 B 2026-11-01 21:21:33
run-20261101-221117-3054.log 314 B 2026-11-01 21:11:18
run-20261101-220059-3053.log 314 B 2026-11-01 21:01:00
run-20261101-215042-3052.log 277 B 2026-11-01 20:50:45
run-20261101-214023-3051.log 314 B 2026-11-01 20:40:28
run-20261101-213005-3050.log 277 B 2026-11-01 20:30:06
run-20261101-211950-3049.log 277 B 2026-11-01 20:19:51
run-20261101-210936-3048.log 277 B 2026-11-01 20:09:36
run-20261101-205921-3047.log 277 B 2026-11-01 19:59:22
run-20261101-204906-3046.log 277 B 2026-11-01 19:49:07
run-20261101-203851-3045.log 277 B 2026-11-01 19:38:52
run-20261101-202835-3044.log 277 B 2026-11-01 19:28:37
run-20261101-201821-3043.log 277 B 2026-11-01 19:18:21
run-20261101-200806-3042.log 277 B 2026-11-01 19:08:07
run-20261101-195750-3041.log 277 B 2026-11-01 18:57:52
run-20261101-194732-3040.log 277 B 2026-11-01 18:47:33
run-20261101-193717-3039.log 314 B 2026-11-01 18:37:18
run-20261101-192702-3038.log 277 B 2026-11-01 18:27:03
run-20261101-191701-3037.log 277 B 2026-11-01 18:17:02
run-20261101-190647-3036.log 314 B 2026-11-01 18:06:47
run-20261101-185632-3035.log 277 B 2026-11-01 17:56:33
run-20261101-184614-3034.log 314 B 2026-11-01 17:46:15
run-20261101-183559-3033.log 314 B 2026-11-01 17:35:59
run-20261101-182544-3032.log 277 B 2026-11-01 17:25:45
run-20261101-181531-3031.log 277 B 2026-11-01 17:15:31
run-20261101-180530-3030.log 277 B 2026-11-01 17:05:31
run-20261101-175517-3029.log 277 B 2026-11-01 16:55:18
run-20261101-174504-3028.log 277 B 2026-11-01 16:45:05
run-20261101-173452-3027.log 277 B 2026-11-01 16:34:53
run-20261101-172440-3026.log 277 B 2026-11-01 16:24:41
run-20261101-171428-3025.log 314 B 2026-11-01 16:14:28
run-20261101-170415-3024.log 277 B 2026-11-01 16:04:16
Tail — run-20261102-012608-3073.log (last 200 lines)
9f30d05 identity aylin shift 2026-10-31T07:25Z model=opencode/muse-spark-1.3-contributor-free
fb8c644 identity leon shift 2026-10-31T07:20Z model=opencode/nemotron-3-ultra-free
70d12c5 identity mia shift 2026-10-31T07:16Z model=opencode/ling-3.1-flash-free
fc5a516 identity jonas shift 2026-10-31T07:10Z model=opencode/nemotron-3-ultra-free
6e61837 identity lena shift 2026-10-31T07:06Z model=opencode/nemotron-3-ultra-free
b3ccb31 run 2819: 2026-10-31T03:37Z model=opencode/mimo-v2.6-flash-free
e1b6050 run 1025: close-correction — post-push re-reads on pushed tree 06ae6ac: queue-source R8 clear (337 sections), record-gap rc 0 (window since 06ae6ac), inbox rc 0 (STEP 0 re-paid), version 0.4.28/0.4.28, system-status errors 3 (standing rows only), sidecars 131, tree clean
06ae6ac run 1025: verify run 1024's concurrent completion + characterize the post-exit auto-resume hazard — loop run 2817's session (ses_e708f859) resumed 27 min after its CLI exit via a background-shell completion and landed 4c4431a+e2f86ba while this run (true loop run 2818) was live in the same tree; every run-1024 figure re-measured true by this session (43/0, 497/0, 487/0, 278/0, 41/0, 64/0, 519/0, 127 suites); entry's (loop run 2818) self-label corrected; queue: concurrent-builder fence next, then red-watch timeout
e2f86ba run 1024: close-correction — post-push re-reads on pushed tree 4c4431a: queue-source R8 clear ([0.4.383], sections 337), record-gap rc 0 (sweep 6c0b464 behind a recorded run — red cleared by design), system-status errors 5->3, push carried 2 commits, tree clean
4c4431a run 1024: record-gap closes the unrecorded-run hazard class — tools/record-gap + system-status row + 127th suite (43/0), coverage suite C28g 35->36 + G38 33->35 refreshed from measured child runs (497/0), changelog [0.4.383], - Live: 126->127; first live run caught sweep 6c0b464, this entry closes its window
6c0b464 run 2817: 2026-10-31T02:03Z model=opencode/mimo-v2.6-flash-free
be3ab8f run 1023: close-correction — post-push re-reads on pushed tree 78eed65: inbox rc 0 (STEP 0 re-paid), queue-source R8 clear after push (sections 336), system-status errors 5->4 (queue-source dropped), push carried 23 commits closing A3, sidecar count 129 (run-2687..2815)
78eed65 run 1023: verify run 1022's unrecorded jsonl-rotate work + restore the missing PROGRESS record — [0.4.382] closed (inode 2889771 preserved across 2 rotations + 2 appends, unattended timer fire 00:46:26 measured, chain 18 lines/1,060,277 B exact, suite 106/0); queue: record-gap check next
cef0071 identity sofia shift 2026-10-30T17:56Z model=opencode/nemotron-3-ultra-free
33de9c9 identity dispatcher shift 2026-10-30T17:50Z model=opencode/nemotron-3-ultra-free
f4342bb identity aylin shift 2026-10-30T17:26Z model=opencode/muse-spark-1.3-contributor-free
3d7595f identity leon shift 2026-10-30T17:20Z model=opencode/nemotron-3-ultra-free
3fa0241 identity mia shift 2026-10-30T17:16Z model=opencode/ling-3.1-flash-free
faeb8fd identity jonas shift 2026-10-30T17:10Z model=opencode/nemotron-3-ultra-free
519c868 identity lena shift 2026-10-30T17:06Z model=opencode/nemotron-3-ultra-free
32cc8dd identity sofia shift 2026-10-30T12:55Z model=opencode/nemotron-3-ultra-free
=== last PROGRESS touch ===
e1b6050 run 1025: close-correction — post-push re-reads on pushed tree 06ae6ac: queue-source R8 clear (337 sections), record-gap rc 0 (window since 06ae6ac), inbox rc 0 (STEP 0 re-paid), version 0.4.28/0.4.28, system-status errors 3 (standing rows only), sidecars 131, tree clean
06ae6ac run 1025: verify run 1024's concurrent completion + characterize the post-exit auto-resume hazard — loop run 2817's session (ses_e708f859) resumed 27 min after its CLI exit via a background-shell completion and landed 4c4431a+e2f86ba while this run (true loop run 2818) was live in the same tree; every run-1024 figure re-measured true by this session (43/0, 497/0, 487/0, 278/0, 41/0, 64/0, 519/0, 127 suites); entry's (loop run 2818) self-label corrected; queue: concurrent-builder fence next, then red-watch timeout
e2f86ba run 1024: close-correction — post-push re-reads on pushed tree 4c4431a: queue-source R8 clear ([0.4.383], sections 337), record-gap rc 0 (sweep 6c0b464 behind a recorded run — red cleared by design), system-status errors 5->3, push carried 2 commits, tree clean
$ cd /data/repo && ls -la tools/concurrent-builder tests/test_concurrent_builder.sh 2>&1; ./tools/queue-source-check; echo "rc=$?"
-rwxr-xr-x 1 root root 23696 Nov  1 02:32 tests/test_concurrent_builder.sh
-rwxr-xr-x 1 root root 29992 Nov  1 02:32 tools/concurrent-builder
queue-source-check: FAIL - 2 violation(s): [0.4.384] is not named in agent-logs/PROGRESS.md - the newest CHANGELOG entry has no record in the authoritative file; CHANGELOG.md was last touched by 80c529a, agent-logs/PROGRESS.md by e1b6050 - the newest changelog entry landed after the run that recorded it
  - [0.4.384] is not named in agent-logs/PROGRESS.md - the newest CHANGELOG entry has no record in the authoritative file
  - CHANGELOG.md was last touched by 80c529a, agent-logs/PROGRESS.md by e1b6050 - the newest changelog entry landed after the run that recorded it
rc=1
> build · mimo-v2.6-flash-free
The queue's designated step (`concurrent-builder`) was executed by loop run 2941 and a CHANGELOG `[0.4.384]` landed in run 2942 — both committed by the loop sweep with **no PROGRESS record**. This is the record-gap hazard class, instances 4 and 5. My job: verify their work independently, restore the missing record, close both gaps.
$ cd /data/repo && tail -40 CHANGELOG.md
- **No promote, and none exists to take**: only `CHANGELOG.md`, `tools/REGISTRY.md`, `STRUCTURE.md` (unit rows + design note) and `agent-logs/PROGRESS.md` are repo scope — dev and prod stay **0.4.28** (the 2026-10-05 correction stands; `0.4.29` quoted nowhere). STEP 0 paid first and owed nothing: **0 unread** `investor_to_agent` in both DBs, `./tools/inbox-status` rc 0 "nothing owed", `INBOX.md` 80/80/0, last reply dev 150 / prod 115 — no `agent_to_investor` row written. The only `systemctl` actions this run: `daemon-reload`, `enable --now jsonl-rotate.timer`, one manual `start tmp-sweep.service` (its own verification append; the unit stays **dry-run**, `--apply` in it is unchanged). `tmp-sweep.timer` is untouched. No DNS/zone write (apex incident `DOMAIN.md ## INCIDENT 2026-10-24` untouched), no mail, no messages-DB write, no `hiring/queue/` write (2 proposals still `status=proposed`), no API key, never `git stash`, staging by explicit pathspec. Spend **0.00**, free `*-free` models only.

### Queue
Authoritative next-candidate queue lives in `agent-logs/PROGRESS.md`, in the newest run entry's `Queue — next small step` bullet — 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`.

## [0.4.383] - 2026-10-31 — `record-gap` closes the unrecorded-run hazard class: the loop's post-run sweeps that carried CONTENT work no run recorded are now a dashboard red the moment they land (`tools/record-gap` + the `record-gap` row of `tools/system-status`, window = since the last `agent-logs/PROGRESS.md` touch; new suite **43/0**, `- Live:` 126 → **127**)

### Fixed
- **The class, measured twice, now has a check instead of prose.** The loop's post-run safety net (`add -A && commit` under the generic subject `run <loopid>: <ts> model=<provider/model>`) commits whatever a session left behind. When that sweep carried a CONTENT path (`CHANGELOG.md`, `STRUCTURE.md`, `tools/`, `tests/`, `app/`, `team/`) no run's `agent-logs/PROGRESS.md` entry ever recorded, the work landed on main under a subject no reader can connect to a run and the authoritative queue never said what it was: `fec13e8` (run 2689's jsonl-rotate content — run 1023 found the queue pointing at a step that was DONE but unrecorded and had to re-verify the whole schedule from prose) and `3829df3` (run 2440's loop-outcomes pair rule, patched by run 1016). A full-history census found more instances of the same shape behind them, every one costing a later run the job of re-deriving from prose what a commit already knew.
- **`tools/record-gap`** (new, python3, read-only by construction — `git rev-parse` + `git log` only, pinned statically by its suite): a sweep-shaped commit touching a content path is a **record gap**, reported with its sha, subject and the content paths it carried; identity-shift sweeps (`identity <id> shift …`) touching only `agent-logs/identity-*.md` stay green; deliberate commits (a builder run's own `run <NNNN>: …` — which never carries the sweep's timestamp+`model=` tail, measured across the whole history) are never gaps. The **window is the point**: default `<last commit that touched agent-logs/PROGRESS.md>..HEAD`, because an older gap was already in front of a recorded run (repaired or accepted on the record — a standing red nobody acts on would be the wrong shape), the live hazard sits at the TOP of history, and one recorded run after a gap closes its window — the repair clears the red, not a suppression list. `--since <ref>` (exclusive, like every git range) and `--all` serve forensics. Exit 0 no gap / 1 gaps named / 2 invalid arguments (before any git I/O) / 3 cannot verify (non-repo, unresolvable `--since`, no committed `agent-logs/PROGRESS.md` — never a pass).
- **Wired where it is seen**: the `record-gap` row of `tools/system-status`, child contract identical to the `queue-source` row (`0` → ok, `1` → error + `ERRORS++` with the child's own sanitised detail — the row never restates a cause list, `[0.4.106]`'s rule —, `3`/unrunnable → warning, never ok and never an error on a tree that was not checked); hooks `GLADEX_RECORD_GAP_BIN`/`GLADEX_RECORD_GAP_TIMEOUT`, both in `--help`; the `## system-status` registry section carries the row bullet and the hook bullet. Measured live on all three row paths before landing: the real child → `ok`, a no-output stub → `warning cannot verify`, an `exit_code: 1` stub → `error`, errors 3 → 4.

### Tests
- **`tests/test_record_gap.sh`** (new, the 127th suite — owns the `- Live:` **126 → 127** refresh, re-measured `regression-run --list` → 127 at the write): **43 assertions / 0 failed**, one `mktemp -d` sandbox, fixture repos only — the arg contract (9), the cannot-verify class (4), the hazard fixture (8: the sweep named with both content paths, the deliberate builder commit and the identity shift NOT named, json classification 1/1/1 with `base_source`/`commits`, embeddable `detail`), the window closing on repair (2), forensics `--since`/`--all`/exclusivity (5), 3 precondition-asserted mutations (M1 the content-path list emptied — the queue's own required mutant — makes the gap INVISIBLE while the real tool still names it; M2 the sweep regex defeated likewise; M3 the classifier dropped makes the deliberate commit get named, proving the "deliberate is never a gap" branch carries the verdict), the static read-only source rule (6), and the live box race-safely (2: exit 0 or 1, json agrees with its own exit code).
- **`tests/test_registry_coverage.sh`** re-measured to completion: **497 assertions / 0 failed** — and the new tool moved two of its scope claims, each refreshed from a MEASURED live child run rather than a prediction: **C28g** the option-list scope **35 → 36** (`record-gap` prints an argparse `options:` list; the C28 sandbox was replicated directly — its `verify-landing` plant *replaces* the real committed tool of that name, so the plant holds scope at the measured 36 with `syn_ok` 35), and **G38** `cl_other` **33 → 35** — two non-classified pairs, `--since REF` *and* `--repo DIR` (the same pair `attribution-gap` added; `--all` has no metavar so it is not a pair), so the six-bucket partition still closes against the independently recounted `scope_total`.
- Gates after the edits: `bash tests/test_record_gap.sh` **43/0**, `bash tests/test_system_status_failed_units.sh` **519/0** against the new row, `bash tests/test_registry_coverage.sh` **497/0**, `bash tests/test_repo_lint.sh` **487/0**, `bash tests/test_queue_source.sh` **278/0** (R8 transitional until this entry's own commit lands it), `tests/test_leak_figure_readers.sh` **41/0** + `tests/test_registry_figure_readers.sh` PASS + `tests/test_cross_reader_agreement.sh` **64/0** (the `- Live:` refresh is the only figure this entry moves). Re-read after the commit rather than carried, per this file's own rule.

### Notes
- **No promote, and none exists to take**: `tools/record-gap`, `tools/system-status`, `tools/REGISTRY.md`, `tests/test_record_gap.sh` and this file are repo scope — dev and prod stay **0.4.28** (the investor's 2026-10-05 correction stands; `0.4.29` quoted nowhere). STEP 0 paid first and owed nothing: **0 unread** `investor_to_agent` in both DBs (table `messages`, column `direction`), `./tools/inbox-status` rc 0 "nothing owed", `INBOX.md` 80/80/0, last reply dev 150 / prod 115 — no `agent_to_investor` row written. `./tools/version-check` → dev=0.4.28 prod=0.4.28 (match); `./tools/budget-show` → 2026-10 spent **0.00** / remaining 5.00; `./tools/system-status --format json` → `overall=error, errors=3` — the standing rows: 7 `identity-run@*` failed units (A12/A30), the DNS apex incident (awaiting the investor's answer to dev 150 / prod 115 — the zone untouched), `ip-drift public_ip_unavailable`; `loop-outcomes` green. No `systemctl` change, no DNS/zone write, no mail, no messages-DB write, no `hiring/queue/` write (2 proposals still `status=proposed`), no API key, never `git stash`, staging by explicit pathspec. Spend **0.00**, free `*-free` models only.

### Queue
Authoritative next-candidate queue lives in `agent-logs/PROGRESS.md`, in the newest run entry's `Queue — next small step` bullet — 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`.

## [0.4.384] - 2026-11-01 — `concurrent-builder` fences the post-exit auto-resume class run 1025 measured: a builder session whose assistant messages post-date its loop run's exit sidecar (the wake trigger = the automatic completion delivery of a pending background shell) is now a read-only check with `concurrent`/`stray` classes and record-gap's self-clearing window (new suite **64/0**, `- Live:` 127 → **128**, `STRUCTURE.md` rule: a run must not end while background shells are still pending)

### Fixed
- **The class, measured to the minute in run 1025, now has a rule and a detector instead of prose.** Loop run 2817's session (`ses_e708f8591ffe…`) went `idle` at 03:03:51.698 +0100 and the loop wrote `run-2817.exit` 0.1 s later (sub-second mtime `.798944` — the healthy pairing every run shows); then a `synthetic` row with **no user message** kicked it back to life at **+590 s (03:13:41)** — the pending background shell's completion delivery arriving after the `opencode run` process was gone, the wake trigger itself. It wrote **18 assistant messages**, the last **+2097 s (03:38:48, ≈ 35 min)** after exit, while loop run 2818 was live in the same tree (born 03:14:03) — class **`concurrent`** — and landed two commits into the SHARED index mid-flight (`4c4431a` 03:35:59, close-correction `e2f86ba` 03:38:23), content run 2817 never recorded, which is why run 1025 also found `[0.4.383]`'s step already done but unrecorded and the resume falsified a queue heading until the record caught up. Run 1025's own manual window opened mid-burst at 03:30:59 and counted the final 11 rows through the 03:39:12 `idle` marker — hence its "11 / 27+ min"; the detector's rule counts all 18. A second, milder instance: run 2689 `[stray]` — 4 messages, last 425.5 s after its exit (sidecar 2026-10-30 03:46:14 +0100), no later run in flight.
- **`STRUCTURE.md` — the rule + the anatomy, worked example included** (queue item (1) of run 1025's fence): *a run must not end while background shells are still pending* — before a run ends, `wait` for its background shells or stop them, so no completion delivery can arrive after the exit; if one must outlive the run, expect the resume — `tools/concurrent-builder` will name it. The section carries run 1025's timeline step by step from primary sources only (git, `opencode.db`, file mtimes): session creation 0.7 s from the run-log filename stamp, idle/sidecar pairing, the +590 s synthetic kick, run 2818's birth, the 18-message burst with its two shared-index commits, and the `[stray]` second instance.
- **`tools/concurrent-builder`** (new, extensionless python3, read-only by construction — `git rev-parse`/`git log`, list/stat, sqlite `mode=ro`, pinned statically by its suite): a session maps to its loop run by START TIME (log filename `run-YYYYMMDD-HHMMSS-<loopid>.log`, `session_v2.time_created` within ±5 s, nearest by `ORDER BY ABS` — unmapped runs are counted, never guessed); the run's EXIT is the sidecar's sub-second mtime; a hazard is an ASSISTANT message strictly > `RACE_THRESHOLD_S = 2.0` s after it — the filter that turns the 100+ phantom 1-message "resumes" a second-granularity clock shows into 0 benign races, leaving exactly the 2 real instances; class `concurrent` when a later run was in flight at the resume's last message, `stray` when not. The source was **weighed by measurement** as the queue asked: `opencode.db` `session_message` (`time_created` in milliseconds, indexed — 3–6 ms range reads on the ~723 MB live DB, exact per-message time, the only candidate that can separate a 381 ms race from a 426 s / 2097 s resume) over shell-dir `.out` mtimes (command completions, no message time) and run-log windows alone (bound the run, cannot tell one late message from an eighteen-message burst). Window = the author time of the last commit touching `agent-logs/PROGRESS.md` (self-clearing like `record-gap`: one recorded run after a resume closes it; `--all` waives it for forensics; `--since-hours N` replaces it with recency). Exit 0 / 1 / 2 / 3 with precedence 2 > 3 > 1 > 0, usage-error json on the json channel (`[0.4.62]` contract), sanitised `detail`. Standalone — no `system-status` row was designated, and a self-clearing window would stand green between hazards by construction.

### Tests
- **`tests/test_concurrent_builder.sh`** (new, the 128th suite — owns the `- Live:` **127 → 128** refresh, re-measured at the write: `regression-run --list` → **128**, `ls tests/test_*` → **128**, `git ls-tree -r --name-only HEAD tests/` → **127** while the suite is untracked): **64 assertions / 0 failed**, one `mktemp -d` sandbox under `${TMPDIR:-/tmp}/opencode/`, trap-removed — arg contract (unknown flag, `--format xml`, bare `--format`, `--all`+`--since-hours` → exit 2 before any I/O, empty human stdout, json object with `exit_code: 2`; `--help` names the tool and the exit-codes block); cannot-verify A1 run logs / A2 DB absent-or-wrong-schema / A3 base outside `--all` → exit 3 never a pass, plus the three `GLADEX_*` env hooks read and reported; the five-run hazard fixture (300 `[stray]`, 500 `[concurrent]` with 600 in flight, 400's 1 s write-race and late USER message both eaten, 600 healthy, 700 unmapped and counted → both classes named, neither healthy run dragged in); the window closing on repair while `--all`/`--since-hours` still show it; 3 precondition-asserted mutants (threshold → 999999 makes the hazard INVISIBLE; window guard dropped reddens the repaired window; direction flipped drags healthy run 400 in); the static read-only source rule (no git write verb, `rev-parse`+`log`+`mode=ro`+threshold intact); live H1–H4 race-safe (exit 0 or 1, json agrees with its own channel — a genuine resume landing mid-run may redden it).
- **`tests/test_registry_coverage.sh` → 497 passed / 0 failed**, with the two live scope claims it pins refreshed from **MEASURED** child values rather than predictions: **C28g** the option-list scope **36 → 37** (`concurrent-builder` prints an argparse `options:` list) and **G38** `cl_other` **35 → 39** (its `--repo DIR`, `--runlog-dir DIR`, `--db FILE`, `--since-hours N` — bare `DIR`/`FILE`/`N` decide nothing a class may reject — while `--format {human,json}` goes to `cl_fmt`, 33 → 34). Both partitions close against the independent recount: six buckets **98 = 34+4+3+15+3+39**, probe scope **98 = miss 60 + fmt 34 + port 4**, `synp_n 94 == conv_pairs 94`, `fmt_claim_mismatch 0`, `allflag_mismatch 0`, and the live snapshot's `violations=0` — the two violations the unregistered tool caused (`unregistered concurrent-builder`, `figure_stale 127`) are exactly the two this entry clears.
- **Gates after the edits, measured this run**: `tests/test_concurrent_builder.sh` **64/0** (re-read after every edit), `tests/test_record_gap.sh` **43/0**, `tests/test_queue_source.sh` **278/0** (hermetic) with the live `tools/queue-source-check` **rc 0** pre-append (`[0.4.383]` pointer-only, 337 sections — this heading makes it the expected transitional R8 until the PROGRESS entry's commit lands it), `tests/test_leak_figure_readers.sh` **41/0**, `tests/test_registry_figure_readers.sh` **44/0** (census reported, not pinned: 18 figure-carrying sections, 17 read, the 1 unread is its own by construction — neither new section carries a bare `**N assertions**` pattern), `tests/test_cross_reader_agreement.sh` **64/0**, `tests/test_repo_lint.sh` **487/0** re-read after this append, per this file's own rule.

### Notes
- **No promote, and none exists to take**: `STRUCTURE.md`, `tools/REGISTRY.md`, `tools/concurrent-builder`, `tests/test_concurrent_builder.sh`, `tests/test_registry_coverage.sh` and this file are repo scope — dev and prod stay **0.4.28** (the investor's 2026-10-05 correction stands; `0.4.29` quoted nowhere). STEP 0 paid first and owed nothing: **0 unread** `investor_to_agent` in both DBs (table `messages`, column `direction`), `./tools/inbox-status` rc 0 "nothing owed", `INBOX.md` **80/80/0**, last reply **dev 150 / prod 115** — no `agent_to_investor` row written and nothing marked read. `./tools/version-check` → dev=0.4.28 prod=0.4.28 (match). **The apex incident still awaits the investor's answer to dev 150 / prod 115** — the zone untouched, the evidence not re-derived. **No `systemctl` change**, no DNS/zone write, no mail, no messages-DB write, no `hiring/queue/` write (**2 proposals still `status=proposed`**), no API key, never `git stash`, staging by explicit pathspec (never `git add -A` on this shared index). Spend **0.00**, free `*-free` models only.

### Queue
Authoritative next-candidate queue lives in `agent-logs/PROGRESS.md`, in the newest run entry's `Queue — next small step` bullet — 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`.
$ cd /data/repo && git show --stat 6816369 | cat && echo "=== 80c529a ===" && git show --stat 80c529a | cat
commit 6816369c6af2c7ac5abdd4026b06f66e86931c61
Author: Atlas <atlas@gladex.de>
Date:   Sun Nov 1 02:56:09 2026 +0100

    run 2941: 2026-11-01T01:56Z model=opencode/mimo-v2.6-flash-free

 STRUCTURE.md                     |  46 +++
 tests/test_concurrent_builder.sh | 472 +++++++++++++++++++++++++
 tests/test_registry_coverage.sh  |  14 +-
 tools/REGISTRY.md                | 131 ++++++-
 tools/concurrent-builder         | 720 +++++++++++++++++++++++++++++++++++++++
 5 files changed, 1377 insertions(+), 6 deletions(-)
=== 80c529a ===
commit 80c529ae7f05d86a5ce4dd48d049e2576742b0f5
Author: Atlas <atlas@gladex.de>
Date:   Sun Nov 1 03:06:31 2026 +0100

    run 2942: 2026-11-01T02:06Z model=opencode/mimo-v2.6-flash-free

 CHANGELOG.md | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)
> build · mimo-v2.6-flash-free
Full picture: run 2941 executed the queue's designated step (`concurrent-builder` fence, `[0.4.384]`), run 2942 landed the CHANGELOG — both via sweep, neither recorded. Like runs 1023/1025 before me, my job is to independently verify their work and restore the missing record. Starting verification.
$ cd /data/repo && bash tests/test_record_gap.sh > /tmp/opencode/gate-rg.log 2>&1; echo "record_gap rc=$?"; tail -3 /tmp/opencode/gate-rg.log
record_gap rc=0
PASS: H1: live repo answers 0 or 1 (got 1) — a genuine gap landing mid-run is allowed
PASS: H2: live json agrees with its own exit code (exit_code + ok)
result: 43 passed, 0 failed, exit 0
$ cd /data/repo && bash tests/test_concurrent_builder.sh > /tmp/opencode/gate-cb.log 2>&1; echo "concurrent_builder rc=$?"; tail -5 /tmp/opencode/gate-cb.log
concurrent_builder rc=0
PASS: H1: live box with default paths answers 0 or 1 (got 1) — a resume landing mid-run may redden it
PASS: H2: live json agrees with its own exit code (exit_code + ok)
PASS: H3: live detail is embeddable (no quote, no backslash)
PASS: H4: live hazards are well-formed (empty when green, fully keyed when red)
result: 64 passed, 0 failed, exit 0
> build · mimo-v2.6-flash-free
Both green (64/0, 43/0). Kicking off the long coverage suite in the background while verifying the rest.
$ cd /data/repo && bash tests/test_registry_coverage.sh > /tmp/opencode/gate-rc.log 2>&1; echo "coverage rc=$?"; tail -6 /tmp/opencode/gate-rc.log
Command moved to the background (shell ID: sh_199a8f833001mCaiw0NWqc5Z0K).
Output is streaming to: /root/.local/share/opencode/shell/fa3e85b2145a60c127b5c9261e76a7ba6d520299/sh_199a8f833001mCaiw0NWqc5Z0K.out
$ cd /data/repo && grep -n "must not end while background shells" STRUCTURE.md | head -3; echo "=== REGISTRY ==="; grep -n "^## concurrent-builder\|^## record-gap\|- Live:" tools/REGISTRY.md | head -20; echo "=== suite count ==="; ./tools/regression-run --list | wc -l; ls tests/test_* | wc -l; git ls-tree -r --name-only HEAD tests/ | wc -l
g [], series [0.1, 0.2, 0.3, 0.4]`, human line `changelog-version: 86 changelog version heading(s), 86 unique, 2289 citation(s) checked, 0 missing` — all six paths this step touches were **already tracked**, so `files_total` is predicted **unchanged at 192** and `entries` becomes **87** once `[0.4.82]` lands (the citation counts move with the new prose and are therefore re-read after the commit, never carried). **Re-read after `34d1bb2`: exit 0, `files_total 192`, `entries 87`, `unique 87`, `duplicates []`, `citations_missing []` — both predictions hit**; the citation counts read `2367 / 2280 / 0` on that pass and move again with each commit's own prose, which is why they are quoted as a measurement and never as a constant.
5271:- Live (measured 2026-11-01): `./tools/regression-run` → **128 suites** discovered *(Refreshed **127 → 128** on 2026-11-01 by the run that added `tests/test_concurrent_builder.sh`, the 128th suite — the hermetic guard for `tools/concurrent-builder`, run 1025's queue step (the post-exit auto-resume fence, whose two historical instances it measures live: run 2689 `[stray]` and run 2817 `[concurrent]`). Measured at the moment of the write: `./tools/regression-run --list` → **128 suite(s) discovered**, `ls tests/test_*` → **128**, `git ls-tree -r --name-only HEAD tests/` → **127** because this suite is untracked until its commit lands (re-read after it lands, as every note above is); `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for, and the run that lands the 129th suite owns the next refresh.)* *(Refreshed **126 → 127** on 2026-10-31 by the run that added `tests/test_record_gap.sh`, the 127th suite — the hermetic guard for `tools/record-gap`, run 1024's queue step (the unrecorded-run hazard class run 1023 repaired, now closed by a check instead of prose). Measured at the moment of the write: `./tools/regression-run --list` → **127 suite(s) discovered**, `ls tests/test_*` → **127**, `git ls-tree -r --name-only HEAD tests/` → **126** because this suite is untracked until its commit lands (re-read after it lands, as every note above is); `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for, and the run that lands the 128th suite owns the next refresh.)* *(Refreshed **125 → 126** on 2026-10-28 by the run that added `tests/test_agent_loop_watchdog.sh`, the 126th suite — the hermetic guard for the system-scope `/usr/local/sbin/agent-loop-watchdog.sh`, whose defect run 1014 reproduced live the same day (42 consecutive `exit=1` runs 2394→2435 against 35 × `loop fresh, nothing to do`, 0 restarts, 0 warnings). Measured at the moment of the write: `./tools/regression-run --list` → **126 suite(s) discovered**, `ls tests/test_*` → **126**, `git ls-tree -r --name-only HEAD tests/` → **125** because this suite is untracked until its commit lands (re-read after it lands, as every note above is); `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for, and the run that lands the 127th suite owns the next refresh.)* *(Refreshed 123 → 124 on 2026-10-16 by the run that added `tests/test_jsonl_rotate.sh`, the 124th suite; it owns this refresh in the same commit, which is what clears section F's `figure_stale`.)* *(Refreshed **124 → 125** on 2026-10-16 by the run that added `tests/test_failed_units_classify.sh`, the 125th suite — the hermetic guard for `tools/failed-units-classify`, run 984's durable form of run 983's finding (which failed units will self-heal and which cannot, decided on whether their model still exists in the provider catalog). Measured at the moment of the write: `./tools/regression-run --list` → **125 suite(s) discovered**, `ls tests/test_*` → **125**, `git ls-tree -r --name-only HEAD tests/` → **124** because this suite is untracked until its commit lands (re-read after it lands, as every note above is); `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for, and the run that lands the 126th suite owns the next refresh.)* — 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.)* *(Refreshed **75 → 76** on 2026-10-01 (19:05 CEST) as a bystander, and for the second time: `tests/test_chat_header_320.php` (a concurrent shift's `/investor` chat-header fix, `3e50254`) landed as the 76th suite without moving this line, the first refresh was written into the worktree and then lost when this file was rewritten from an older base at 18:57 CEST, so `VIOLATION figure_stale 75` stood through both — 29 reds in `tests/test_registry_coverage.sh`, every one of them caused by a suite count and none by the code those assertions test. Re-measured against `regression-run --list` (76) at the moment this was written, which is what section F compares it with.) *(Refreshed **76 → 77** on 2026-10-02 by the run that added the suite: `tests/test_system_status_staged.sh`, the guard for queue item **(109)(e)** — the `git-tree` row must not call a PARKED STEP healthy. Measured at the moment of the write: `regression-run --list` → **77 suite(s) discovered**, `ls tests | wc -l` → 77, and `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for; the figure follows what `--list` discovers, as the three notes above document.) *(Refreshed **77 → 78** on 2026-10-02 by the run that added `tests/test_template_sync.sh`, the guard for queue item **(113)** — the template copies of the mission documents. Measured at the moment of the write: `regression-run --list` → **78 suite(s) discovered**, `ls tests | wc -l` → 78; `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for, and the figure follows what `--list` discovers rather than what the run hopes for.)* *(Refreshed **78 → 79** on 2026-10-02 by the run that added `tests/test_table_scroll_320.php`, the guard for this shift's 320px scroll-box step on `/stats` and `/log` (chrome measurement + 3 mutants). Measured at the moment of the write: `regression-run --list` → **79 suite(s) discovered**, `ls tests | wc -l` → 79; `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for, and the figure follows what `--list` discovers rather than what the run hopes for.)* *(Refreshed **79 → 80** on 2026-10-02 by the run that added `tests/test_never_send_from.php`, the guard for the send-from rule: MAIL-POLICY.md §1 states "no identity may ever reply FROM" the send-only address and names two enforcement points, the webmail 403 (pinned by `tests/test_webmail_session_routing.php`) and "shift duties forbid `sendmail -f noreply@gladex.de`", which named no suite — every shift hand-ran the two greps and committed the sentence instead of the check. The new suite reads both live sources with one implementation shared by its controls: every `from=<noreply@gladex.de>` envelope line in `GLADEX_MAIL_LOG`, and the HEADER BLOCK (never the body, so a quotation is not a send) of every delivered message under `GLADEX_MAILDIR_ROOT`, plus the `X-Gladex-Identity: noreply` composer stamp; a planted line in a copy of the real log, a planted sandbox message, a body quotation and an own-address message are the four controls, an absent source is SKIPPED rather than passed, and the suite says so in its result line. Measured at the moment of the write: `regression-run --list` → **80 suite(s) discovered**, `ls tests | wc -l` → 80; `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for, and the figure follows what `--list` discovers rather than what the run hopes for.)* *(Refreshed **80 → 81** on 2026-10-02 by the Jonas shift that added `tests/test_start_320.php`, the guard for `/start`'s page-level horizontal scroll: one unbreakable list token (`git://git.gladex.de/gladex.git`) grew the document 6px at a 305px viewport and 21px at 290px, so the whole page scrolled to read a clone URL. Chrome measurement at 290/305/320/1200 on dev + prod, the scoped `overflow-wrap: anywhere` invariant read after comment stripping, `pre.g-code`'s scroller pinned as still load-bearing (10/10 scrolling at 305), and three mutants — declaration dropped, declaration parked in a CSS comment, and `white-space: nowrap` on `.g-list` (which passes the static layer and still scrolls the page, so section 4 cannot be a restatement of section 1). Measured at the moment of the write: `regression-run --list` → **81 suite(s) discovered**, `ls tests | wc -l` → 81; `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for, and the figure follows what `--list` discovers rather than what the run hopes for.)* *(Refreshed **81 → 82** on 2026-10-02 by the run that added `tests/test_red_watch.sh`, the hermetic guard for queue item **(116)** (the gap `[0.4.172]` recorded as "no dedicated suite yet"). Measured at the moment of the write: `regression-run --list` → **82 suite(s) discovered**, `ls tests | wc -l` → 82; `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for, and the figure follows what `--list` discovers rather than what the run hopes for.)* *(Refreshed **82 → 83** on 2026-10-02 by the run that added `tests/test_system_status_red_watch.sh`, the guard for queue item **(117)** — the `red-watch` row of `tools/system-status` must never report `ok` for a state file it did not read, and must never grow a path that fails the tool (warn-only by construction). Measured at the moment of the write: `regression-run --list` → **83 suite(s) discovered**, `ls tests | wc -l` → 83; `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for, and the figure follows what `--list` discovers rather than what the run hopes for.)* *(Refreshed **83 → 84** on 2026-10-03 by the run that added `tests/test_no_dsn_reply.php`, the guard for the sentence `team/APPLICATIONS.md` §"When an answer cannot be delivered" states as "Nobody at this desk replies to a delivery report" — prose with no reader, so whether anybody obeyed it was a claim a shift wrote down rather than a fact a run could make: `tests/test_applications_hr.php` checks the PAGE says it, nothing checked whether anybody DID it. The new suite reads both live sources with one implementation shared by its controls — the HEADER BLOCK (never the body, so a quotation is not an answer) of every delivered message under `GLADEX_MAILDIR_ROOT`, and every envelope recipient line in `GLADEX_MAIL_LOG` — and flags a hit only when a message left FROM this desk AND is addressed TO the report (a `mailer-daemon` recipient or a `Re:` on the report's own subject), so a delivery report arriving here, a colleague message, an outside sender's answer and a body quotation are each a control that must stay clean. Anti-vacuity is a plant against the LIVE corpus: one planted answer must make the live count rise by exactly one, and one planted envelope line must do the same for the log, so `0` means "read and none found"; an absent source is SKIPPED and counted, never reported as clean. Measured at the moment of the write: `regression-run --list` → **84 suite(s) discovered**, `ls tests | wc -l` → 84; `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for, and the figure follows what `--list` discovers rather than what the run hopes for.)* *(Refreshed **84 → 85** on 2026-10-03 by the Jonas shift that added `tests/test_links_tap_target.php`, the guard for the shared `.links` footer nav: the same component rendered at 43.75px on /info, /team and /templates but at 23.05–23.77px on /start and /download — under the 24px WCAG 2.5.8 minimum (their computed display is `block`, so the inline exception does not apply) and half the size of the same footer on three sibling pages, in the middle of the quickstart → download path. Chrome at 320 on dev and prod plus 1200 on dev across all five pages, the layout box read as border height + margins against the element's own computed line-height, so the padding-cancels-margin claim is a measurement rather than a sentence — deliberately no pinned document height, because /start moved 6993 → 7220 inside this very shift under a concurrent GETTING-STARTED.md edit while the `.links` container stayed 88.53 — an anchor-vs-anchor overlap check, the three pill pages pinned as untouched controls, and three mutants each caught by a different layer: padding dropped (the size reading), negative margin dropped (the layout-box reading, while the size still reads a happy 35.3px), all four declarations parked in a CSS comment (only the comment stripper sees that in source). Measured at the moment of the write: `regression-run --list` → **85 suite(s) discovered**, `ls tests | wc -l` → 85; `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for, and the figure follows what `--list` discovers rather than what the run hopes for.)* *(Refreshed **85 → 86** on 2026-10-04 by the run that added `tests/test_leak_figure_readers.sh`, the guard for queue item **(131)**'s durable half — "no leak figure for any of the nine (128) suites may be quoted off a glob" became a cross-suite reader instead of prose. Measured at the moment of the write: `regression-run --list` → **86 suite(s) discovered**, `ls tests | wc -l` → 86, and `git ls-tree` HEAD reads 86 too because the suite reached `4204437` through Sofia's loop safety-net sweep mid-run (`git add -A` at 05:00:07Z took the in-flight file), so claim, repository and checkout agree on all three sides; `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for, and the figure follows what `--list` discovers rather than what the run hopes for.)* *(Refreshed **86 → 87** on 2026-10-04 — **a bystander refresh**, and the notes above are exactly why it is allowed: `tests/test_verify_landing.sh` landed as the 87th suite in `ed006cf` (jonas's 09:35 CEST shift) without moving this line, so `VIOLATION figure_stale 86` stood on the live tree and read as section A's **A1** and **A3**, section F's **F3/F5/F6**, and **48** of this suite's "exactly one violation" controls red — **53 reds in total, every one of them caused by a suite count and none by the code those assertions test** (the same shape the four notes above each record). Measured at the moment of the write: `regression-run --list` → **87 suite(s) discovered**, `ls tests | wc -l` → 87, `git ls-tree HEAD tests/` → 87 — all three sides agree. The run that lands the 88th suite owns the next refresh.)* *(Refreshed **87 → 89** on 2026-10-04 — a bystander refresh, the second this line has needed today: `tests/test_version_check.sh` landed as the 88th suite in `959bfda` (run 687, 16:32Z) and `tests/test_system_status_failed_units.sh` as the 89th in `eda56bd` (dispatcher shift, 16:59Z), neither moving this line, so `VIOLATION figure_stale 87` stood on the live tree and read as section A's **A1/A3**, section F's **F3/F5/F6** and 48 of this suite's exactly-one-violation controls — **53 reds in `tests/test_registry_coverage.sh` (411 passed / 53 failed), every one of them caused by a suite count and none by the code those assertions test** (the same shape each note above records). Measured at the moment of the write: `regression-run --list` → **89 suite(s) discovered**, `ls tests/test_*` → 89, `git ls-tree -r --name-only HEAD tests/` → 89 — all three sides agree. The run that lands the 90th suite owns the next refresh.)* *(Refreshed **89 → 90** on 2026-10-04 by the run that added `tests/test_system_status_ip_drift.sh`, the guard for this shift's queue item **(d)** — the `ip-drift` row of `tools/system-status`, which put the weekly `tools/ip-drift-cron` verdict on a dashboard that read neither its dated logs nor its ALERTS channel (section 7 of `tests/test_ip_drift_cron.sh` had measured the writer as the only code in `tools/` naming a live ip-drift channel). Measured at the moment of the write: `./tools/regression-run --list` → **90 suite(s) discovered**, `ls tests/test_*` → **90**; `git ls-tree -r --name-only HEAD tests/` → **89** because this suite is still untracked and reaches `HEAD` through this very commit (re-read after it lands, as every note above is), and `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for — the figure follows what `--list` discovers, not what any revision happens to hold.) *(Refreshed **90 → 92** on 2026-10-07 by the run that added `tests/test_healthcheck.sh`, the guard for `tools/healthcheck` — the only one of the 26 tools with no suite of its own (`grep -rln healthcheck tests/` → 6 files, every one a mention of some OTHER subject), written after that run repaired the answered-500 exit-code collapse (an endpoint that ANSWERED `500` was reported as `service not reachable`: exit 3, `status_code` null, `response` null). Measured at the moment of the write: `./tools/regression-run --list` → **92 suite(s) discovered**, `ls tests/test_*` → **92**, `git ls-tree -r --name-only HEAD tests/` → **91** because this suite is untracked until its commit lands (re-read after it lands, as every note above is); `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for — the figure follows what `--list` discovers, not what any revision happens to hold, and the run that lands the 93rd suite owns the next refresh.)* (Refreshed **92 → 93** on 2026-10-08 by the run that added `tests/test_cache_show.sh`, the guard for `tools/cache-show` — the read-only twin of `disk-show` and the home queue item **(ax)** gave to the access-time cut `/` needed on 2026-10-08. Measured at the moment of the write: `./tools/regression-run --list` → **93 suite(s) discovered**; `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for, and the run that lands the 94th suite owns the next refresh.)* *(Refreshed **93 → 94** on 2026-10-09 by the run that added `tests/test_tmp_lock.sh`, the guard for `tools/tmp-lock` — the mutex queue item **(ag)** built so two desks never cut the same `/tmp/opencode` prune list at the same instant. Measured at the moment of the write: `./tools/regression-run --list` → **94 suite(s) discovered**, `ls tests/test_*` → 94, `git ls-tree -r --name-only HEAD tests/` → 93 because this suite is untracked until its commit lands (re-read after it lands, as every note above is); `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for — the figure follows what `--list` discovers, not what any revision happens to hold, and the run that lands the 95th suite owns the next refresh.)* *(Refreshed **94 → 95** on 2026-10-09 by the run that added `tests/test_monitor_cascade.sh`, the guard for queue item **(r1b)** — the system-status cascade half: one `failed-units` root cause must cost one family red (the derived `sysverdict` probe + A30's row), not the six A12/A13/A16/A17/A18/A30 reds five encodings of one claim produced. Measured at the moment of the write: `./tools/regression-run --list` → **95 suite(s) discovered**, `ls tests/test_*` → 95, `git ls-tree -r --name-only HEAD tests/` → 94 because this suite is untracked until its commit lands (re-read after it lands, as every note above is); `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for — the figure follows what `--list` discovers, not what any revision happens to hold, and the run that lands the 96th suite owns the next refresh.)* *(Refreshed **95 → 96** on 2026-10-10 by the run that added `tests/test_go_compile_drift_verify.sh` — the guard for `tools/go-compile-drift-verify`, measured before this line moved as the last registered tool with no suite of its own (`grep -rln go-compile-drift-verify tests/` → 2 files, both naming it in passing). Measured at the moment of the write: `./tools/regression-run --list` → **96 suite(s) discovered**, `ls tests/test_*` → 96, `git ls-tree -r --name-only HEAD tests/` → 95 because this suite is untracked until its commit lands (re-read after it lands, as every note above is); `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for — the figure follows what `--list` discovers, not what any revision happens to hold, and the run that lands the 97th suite owns the next refresh.)* *(Refreshed **96 → 97** on 2026-10-10 by the run that added `tests/test_report_demo.sh` — the reader for `REPORT.md` §11's demo block, which no suite read (`grep -rln demo tests/` → nothing): it extracts the `**5-minute getting started**:` fence verbatim, runs its nine commands line by line in a sandbox with its own `HOME`, pins the byte figure and the step line §11 quotes plus the `/investor` URL claim, keeps the three `[0.4.285]` controls green (nameless step refused, missing-file push failed, nothing written outside the sandbox), and replays a planted PRE-FIX §11 out of tree — **21 failed / 46 passed, exit 1** — so a green run proves the guard would reddens rather than that it finishes. Measured at the moment of the write: `./tools/regression-run --list` → **97 suite(s) discovered**, `ls tests/test_*` → 97, `git ls-tree -r --name-only HEAD tests/` → 96 because this suite is untracked until its commit lands (re-read after it lands, as every note above is); `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for — the figure follows what `--list` discovers, and the run that lands the 98th suite owns the next refresh.)* *(Refreshed **97 → 98** on 2026-10-10 by the run that added `tests/test_getting_started.sh` — the reader for `GETTING-STARTED.md`, the guide the public `/start` page serves: running its own fences verbatim in a fresh workspace had **9 of 34 runnable commands exit non-zero** (the pushes read files a fresh workspace does not have, which then took `context pull` and both `workflow run`s down with them), so the guide now seeds its own sample files and this suite executes every fence — 98 passed / 0 failed, with the pre-fix guide as its negative control (≥5 non-zero exits and the `failed to read ./src/**/*.go` payload) and the install/`serve`/`mcp` fences classified EXCLUDED rather than started. Measured at the moment of the write: `./tools/regression-run --list` → **98 suite(s) discovered**, `ls tests/test_*` → 98, `git ls-tree -r --name-only HEAD tests/` → 97 because this suite is untracked until its commit lands (re-read after it lands, as every note above is); `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for — the figure follows what `--list` discovers, and the run that lands the 99th suite owns the next refresh.)* *(Refreshed **98 → 99** on 2026-10-10 by the run that added `tests/test_readme_fences.sh` — the reader for `README.md`, the third instance of the class `[0.4.285]`/`[0.4.286]` closed for `REPORT.md` §11 and `[0.4.287]` for `GETTING-STARTED.md`: the repository's front door was the one document none of the three reading suites executed (`grep -rln README tests/` → three files before this run, all passing mentions: `test_cli_version.php`, `test_repo_lint.sh`, `test_report_demo.sh`). Extracting its eight bash fences verbatim and running them in a fresh workspace made **8 of its 29 runnable commands exit non-zero** and left **4 lines unclassified**, and the four were the interesting ones — `gladex context pull`'s *illustrative output* pasted into the "Complete Workflow" fence as live shell (`// file: src/api/server.go`, `package main`, `...`, `// Just the content, no header/footer`), which a pasting reader runs as shell: twice `//: Is a directory` (126), twice `command not found` (127) — beside the two `context push`es that read files a fresh workspace does not have (`./src/**/*.ts`, `./src/api/*.go`) and the inline "Workflow Execution" definition still on the legacy flat step schema, which `workflow create` refuses with `invalid workflow (7 problems)`. The README now seeds both file pushes (a plain shell has no `globstar`, so the sample sits where `./src/**/*.ts` actually matches), comments that output instead of running it, and writes the current per-step `name`/`config` schema behind `--allow-shell`; the suite is green at **135 passed / 0 failed, exit 0, ~2.3 s**, with the pre-fix README as its negative control (**8 of 29 non-zero, 4 UNCLASSIFIED**, payloads `failed to read ./src/**/*.ts`, `failed to read ./src/api/*.go`, `invalid workflow`, `context 'backend' not found`) and a behavioural control for the flag (the definition README writes, run without `--allow-shell` → exit 1 `shell step requires --allow-shell flag`, then with it → exit 0). Measured at the moment of the write: `./tools/regression-run --list` → **99 suite(s) discovered**, `ls tests/test_*` → 99, `git ls-tree -r --name-only HEAD tests/` → 98 because this suite is untracked until its commit lands (re-read after it lands, as every note above is); `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for — the figure follows what `--list` discovers, not what any revision happens to hold, and the run that lands the 100th suite owns the next refresh.)**(Refreshed **99 → 100** on 2026-10-11 as a bystander, the third this line has needed: `tests/test_build_sh.sh` landed in `4c1c6ee` (leon shift, 08:27 CEST) without moving this line, so `VIOLATION figure_stale 99` stood on the live tree and read as section A's A1/A3, section F's F3/F5/F6 and 51 of this suite's exactly-one-violation controls — **53 reds (411 passed / 53 failed)**, every one of them caused by a suite count and none by the code those assertions test (the same shape each note above records, and measured as pre-existing at the parent commit `4038cb7` before this run's own change was committed). Measured at the moment of the write: `./tools/regression-run --list` → **100 suite(s) discovered**, `ls tests/test_*` → **100**, `git ls-tree -r --name-only HEAD tests/` → **100** — all three sides agree; `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for, and the run that lands the 101st suite owns the next refresh.)* *(Refreshed **100 → 102** on 2026-10-12 by the run that added `tests/test_download_colours.php` — run 910's queued colour-fidelity suite for `/download`, the Medium finding of `VERDICT-20261012T071910Z-download-php-design-system-deploy.md`. TWO suites landed without moving this line: `tests/test_download_counter.php` (run 912, the 101st, whose entry records no refresh) and this one (the 102nd), so `figure_stale 100` stood on the live tree and read as section A's A1/A3, section F's F3/F5/F6 and this suite's exactly-one-violation controls (C32h measured `want=1 got=2` at 10:47 CEST) — every one of them caused by a suite count and none by the code those assertions test. Measured at the moment of the write: `./tools/regression-run --list` → **102 discovered**, `ls tests/test_*` → **102**, `git ls-tree -r --name-only HEAD tests/` → **101** because this suite is untracked until its commit lands (re-read after it lands, as every note above is); `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for — the figure follows what `--list` discovers, not what any revision happens to hold, and the run that lands the 103rd suite owns the next refresh.)* *(Refreshed **102 → 103** on 2026-10-12 by the run that added `tests/test_download_stats.sh` — the guard for `tools/download-stats`, the read-only summariser over `<env>/logs/downloads.log` that `[0.4.313]`'s counter writes, taken from run 912's queue as this run's step. Measured at the moment of the write: `./tools/regression-run --list` → **103 suite(s) discovered**, `ls tests/test_*` → **103**, `git ls-tree -r --name-only HEAD tests/` → **102** because this suite is untracked until its commit lands (re-read after it lands, as every note above is); `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for — the figure follows what `--list` discovers, not what any revision happens to hold, and the run that lands the 104th suite owns the next refresh.)* *(Refreshed **103 → 104** on 2026-10-12 by the run that added `tests/test_shift_tally.sh` — the guard for `tools/shift-tally`, the dedicated `tests/` follow-up the tool's own registry section and CHANGELOG `[0.4.318]` both named as deliberate, taken from run 919's queue. Measured at the moment of the write: `./tools/regression-run --list` → **104 suite(s) discovered**, `ls tests | wc -l` → **104**, `git ls-tree -r --name-only HEAD tests/` → **103** because this suite is untracked until its commit lands (re-read after it lands, as every note above is); `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for — the figure follows what `--list` discovers, not what any revision happens to hold, and the run that lands the 105th suite owns the next refresh.)*(Refreshed **104 → 105** on 2026-10-12 by the run that added `tests/test_live_version_consistency.php` — the guard for the LIVE half of the version-train invariant (`test_app_version.php` covers the static side): it parses the changelog's first `## [x.y.z]` heading and asserts every HTTP surface on dev (:8000) and prod (:8001) — `/healthz`, `/api/version`, the `/docs` footer and the first `/api/changelog` entry — reports exactly it, plus a mutation layer (a tampered payload is detected, the comparator is not vacuous). It exists because the 2026-10-05 investor correction ("production is 0.4.28, not 0.4.29") showed the confusion class: the newest APPENDED heading is not the train. Measured at the moment of the write: `./tools/regression-run --list` → **105 suite(s) discovered**, `ls tests | wc -l` → **105**, `git ls-tree -r --name-only HEAD tests/` → **104** because this suite is untracked until this commit lands (re-read after it lands, as every note above is); `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for — the figure follows what `--list` discovers, not what any revision happens to hold, and the run that lands the 106th suite owns the next refresh.)* *(Bystander repair, 2026-10-12: the refresh above for the 105th suite was appended as a trailing note on this line but never moved the claim position, so the checker read `figure_stale 104` against the 105 `test_*` files `regression-run --list` discovers and reddened 25 controls of `tests/test_registry_coverage.sh` — measured pre-existing at `HEAD`, the repairing run’s diff carrying neither this file nor a new suite, so nothing here was caused by it. The claim position now says what the note appended to it already said; the 106th suite owns the next refresh as before.)* *(Refreshed **105 → 106** on 2026-10-13 by the run that added `tests/test_deploy_ledger.sh` — the guard for run 933's `deploy-path recurrence` queue line: the LIVE `promote-dev-to-prod --ledger-check` assertion over the real /opt/startup trees plus sandbox controls replaying the 2026-10-13 direct-copy incident. Measured at the moment of the write: `./tools/regression-run --list` → **106 suite(s) discovered**, `ls tests/test_*` → **106**, `git ls-tree -r --name-only HEAD tests/` → **105** because this suite is untracked until its commit lands (re-read after it lands, as every note above is); `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for, and the run that lands the 107th suite owns the next refresh.)* *(Refreshed **107 → 108** on 2026-10-13 by the run that added `tests/test_shift_census.sh` — the guard for `tools/shift-census`, the durable post-fire census (failed set + in-flight probe + per-unit class) that run 936 queued with two requirements of its own: the transcript-never-journal SOURCE DECISION and the IN-FLIGHT GUARD, so an empty failed set with a shift running reads `in-flight` (exit 4) instead of the measured 8 m 17 s false-green. Measured at the moment of the write: `./tools/regression-run --list` → **108 suite(s) discovered**, `ls tests/test_*` → **108**, `git ls-tree -r --name-only HEAD tests/` → **107** because this suite is untracked until its commit lands (re-read after it lands, as every note above is); `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for, and the run that lands the 109th suite owns the next refresh.)* *(Refreshed **108 → 109** on 2026-10-14 by the run that added `tests/test_registry_figure_readers.sh`, the 109th suite — the cross-suite REGISTRY assertion-figure reader carrying run 931's recovered line, with its own `## test_registry_figure_readers.sh` section added in the same commit; the census it prints (`17 figure sections, 1 read` before its own section landed) is REPORTED, never pinned, so this refresh is the only suite-count claim this run moves. Measured at the moment of the write: `./tools/regression-run --list` → **109 suite(s) discovered**, `ls tests/test_*` → **109**, `git ls-tree -r --name-only HEAD tests/` → **108** because this suite is untracked until its commit lands (re-read after it lands, as every note above is); `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for, and the run that lands the 110th suite owns the next refresh.)* *(Bystander refresh **109 → 110**, 2026-10-14, run 952: `tests/test_info_contrast.php` — the 110th suite, a `/info` WCAG-contrast guard — landed in `114086d` (08:17 CEST) without moving the claim above, so `VIOLATION figure_stale 109` stood on the live tree and read as section A's **A1/A3**, section F's **F3/F5/F6** and this suite's exactly-one-violation controls (**C1e** measured `want=1 got=2`); measured **pre-existing at this run's start commit `2bb572e`**, whose `tests/` already held **110** `test_*` files against this line's **109**, so nothing here was caused by the run that repaired it (the same shape each note above records, and the same attribution question they each answered). Measured at the moment of the write: `./tools/regression-run --list` → **110 suite(s) discovered**, `ls tests/test_*` → **110**, `git ls-tree -r --name-only HEAD tests/` → **110** — all three sides agree; `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for, and the run that lands the 111th suite owns the next refresh.)* *(Refreshed **110 → 111** on 2026-10-14 by run 954 as a **bystander refresh** — the third this line has needed: `tests/test_landing_contrast.php`, the 111th suite (a `/landing` WCAG-contrast guard), landed in `4a61dce` at 13:18 CEST without moving this line while run 954 was mid-verification, so `VIOLATION figure_stale 110` stood on the live tree and read as **32 reds in `tests/test_registry_coverage.sh` (465 passed / 32 failed)** — every one a family-C exactly-N-violation control reporting one violation more than it planted, none caused by the code those assertions test. Measured **pre-existing at this run's start commit `6b9721f`**: its `tests/` held **110** `test_*` files against this line's **110** (run 953 recorded `497 / 0` there), so nothing here was caused by the run that repaired it. Measured at the moment of the write: `./tools/regression-run --list` → **111 suite(s) discovered**, `ls tests/test_*` → **111**, `git ls-tree -r --name-only HEAD tests/` → **111** — all three sides agree; `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for, and the run that lands the 112th suite owns the next refresh.)* *(Refreshed **111 → 114** on 2026-10-14 by run 959 — **three suites landed without moving this line**: `tests/test_download_contrast.php` (the 112nd, `/download` colour-fidelity + the version-badge contrast fix, `b460155`), `tests/test_version_correction.php` (the 113rd, the version-correction regression test, `6895a58`) and `tests/test_attribution_gap.sh` (the 114th, run 959's own suite, which reached HEAD through a concurrent identity's `git add -A` safety-net sweep at `c2ee73f` while its tool reached it at `ee266f7` — the same mid-run sweep class the 85 → 86 note records), so `VIOLATION figure_stale 111` stood on the live tree until this refresh. Measured at the moment of the write: `./tools/regression-run --list` → **114 suite(s) discovered**, `ls tests/test_*` → **114**, `git ls-tree -r --name-only HEAD tests/` → **114** — all three sides agree; `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for, and the run that lands the 115th suite owns the next refresh.)* *(Refreshed **114 → 115** on 2026-10-15 by the run that added `tests/test_coverage_guard.sh`, the 115th suite — the hermetic guard for `tools/coverage-guard`, run 963's re-queued trend guard (`[0.4.353]`), whose `## coverage-guard` and `## test_coverage_guard.sh` sections landed in the same commit. Measured at the moment of the write: `./tools/regression-run --list` → **115 suite(s) discovered**, `ls tests/test_*` → **115**, `git ls-tree -r --name-only HEAD tests/` → **114** because this suite is untracked until its commit lands (re-read after it lands, as every note above is); `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for, and the run that lands the 116th suite owns the next refresh.)* *(Refreshed **115 → 116** on 2026-10-15 by the run that added `tests/test_baseline_stale.sh`, the 116th suite — the hermetic guard for `tools/baseline-stale`, run 964's re-queued baseline reader (`[0.4.353]`), whose `## baseline-stale` and `## test_baseline_stale.sh` sections landed in the same commit. Measured at the moment of the write: `./tools/regression-run --list` → **116 suite(s) discovered**, `ls tests/test_*` → **116**, `git ls-tree -r --name-only HEAD tests/` → **115** because this suite is untracked until its commit lands (re-read after it lands, as every note above is); `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for, and the run that lands the 117th suite owns the next refresh.)* *(Refreshed **116 → 117** on 2026-10-15 by the run that added `tests/test_system_status_baseline_stale.sh` (at the moment of this first write the 117th, renumbered the 119th by the `117 → 119` refresh below) — the guard for the `baseline-stale` row of `tools/system-status` (run 964's re-queued row, `[0.4.355]`), whose `## system-status` bullet, hook entry, Tests bullet and `## test_system_status_baseline_stale.sh` section landed in the same commit. Measured at the moment of the write: `./tools/regression-run --list` → **117 suite(s) discovered**, `ls tests/test_*` → **117**, `git ls-tree -r --name-only HEAD tests/` → **116** because this suite is untracked until its commit lands (re-read after it lands, as every note above is); `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for; superseded minutes later by the `117 → 119` refresh below, which re-measured the same tree.)* *(Refreshed **117 → 119** on 2026-10-15 — a **bystander-plus-own refresh**: `tests/test_gladex_binary.sh` (the 118th suite, a binary smoke test, `7807966`) landed from a concurrent Leon shift mid-run without moving this line, and `tests/test_system_status_baseline_stale.sh` (the 119th, this run's suite) is untracked, so `VIOLATION figure_stale 117` stood on the live tree and read as section F's F3 (`want=118 got=117` at the moment the batch measured it), F5, F6 and this suite's exactly-one-violation controls (`C7d` etc. measured `want=1 got=2`) — **56 reds in `tests/test_registry_coverage.sh` (441 passed / 56 failed)**, every one of them caused by a suite count and none by the code those assertions test (the same shape each note above records). Measured at the moment of the write: `./tools/regression-run --list` → **119 suite(s) discovered**, `ls tests/test_*` → 119, `git ls-tree -r --name-only HEAD tests/` → 118 because this suite is untracked until its commit lands (re-read after it lands, as every note above is); `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for, and the run that lands the 120th suite owns the next refresh.)* *(Refreshed **119 → 120** on 2026-10-15 by the run that added `tests/test_system_status_coverage_guard.sh`, the 120th suite — the guard for the `coverage-guard` row of `tools/system-status` (run 967's re-queued finding, `[0.4.357]`), whose `## system-status` bullet, hook entry, Tests bullet and `## test_system_status_coverage_guard.sh` section landed in the same commit. Measured at the moment of the write: `./tools/regression-run --list` → **120 suite(s) discovered**, `ls tests/test_*` → 120, `git ls-tree -r --name-only HEAD tests/` → 119 because this suite is untracked until its commit lands (re-read after it lands, as every note above is); `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for, and the run that lands the 121st suite owns the next refresh.)* *(Refreshed **120 → 121** on 2026-10-15 by the run that added `tests/test_cross_reader_agreement.sh`, the 121st suite — the cross-reader agreement guard for run 968's re-queued line (one child reading must yield the same count and the same identity list on the `system-status` row and in `red-watch`), whose own `## test_cross_reader_agreement.sh` section landed in the same commit. Measured at the moment of the write: `./tools/regression-run --list` → **121 suite(s) discovered**, `ls tests/test_*` → **121**, `git ls-tree -r --name-only HEAD tests/` → **120** because this suite is untracked until its commit lands (re-read after it lands, as every note above is); `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for, and the run that lands the 122nd suite owns the next refresh.)* *(Bystander refresh **121 → 122**, 2026-10-15, run 970: `tests/test_docs_contrast.php` — the 122nd suite, a `/docs` WCAG-contrast guard — landed in `49b22cf` (18:21 CEST) without moving the claim above, so `VIOLATION figure_stale 121` stood on the live tree and read as section F's **F3** (`want=122 got=121`), **F5**, **F6**, **C39d** and every exactly-N-violation control that counts live violations — **55 reds in `tests/test_registry_coverage.sh` (442 passed / 55 failed)**, every one of them caused by a suite count and none by the code those assertions test (the same shape each note above records). Measured **pre-existing at this run's start commit**: its `tests/` already held **122** `test_*` files against this line's **121**, so nothing here was caused by the run that repaired it. Measured at the moment of the write: `./tools/regression-run --list` → **122 suite(s) discovered**, `ls tests/test_*` → **122**, `git ls-tree -r --name-only HEAD tests/` → **122** — all three sides agree; `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for, and the run that lands the 123rd suite owns the next refresh.)* *(Refreshed **122 → 123** on 2026-10-16 by the run that added `tests/test_tmp_sweep.sh`, the 123rd suite — the hermetic guard for `tools/tmp-sweep`, run 977's queued durable half of the hand sweep (“a periodic age-based /tmp sweep … so a SIGKILL orphan cannot pile up for days again”), whose own `## tmp-sweep` and `## test_tmp_sweep.sh` sections landed in the same commit. Measured at the moment of the write: `./tools/regression-run --list` → **123 suite(s) discovered**, `ls tests/test_*` → 123, `git ls-tree -r --name-only HEAD tests/` → 122 because this suite is untracked until its commit lands (re-read after it lands, as every note above is); `tests/test_registry_coverage.sh` section F is the reader this line is refreshed for, and the run that lands the 124th suite owns the next refresh.)*
5274:**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))
5731:of them on a `- Live:` bullet that still said **40** while `regression-run
6374:numeric `- Live:` bullet — the `fig_scope` union, its dedupe and the `live`
6936:**Since `[0.4.126]`** — registers with the `- Live:` suite figure **60 → 61**,
7105:**Since 2026-10-10** the tool has a suite of its own, `tests/test_go_compile_drift_verify.sh` (queue: the standing "whoever lands the next suite owns the `- Live:` refresh" line). It is deliberately NOT a fifth scenario: the default path never clones (every probe runs against a missing or `.git`-stub repo), and it covers what the registry table above promises but nothing executed — `--help`, `--list` in both formats, the whole exit-2 family with its `2 > 3` precedence, and the four exit-3 preconditions. The five scenarios stay here, on demand, exactly as the design decision below says. Its section F runs **two** of them (`--only S1,S2`, measured **72 s** for S1 alone and **152–155 s** for the pair on 2026-10-10) only when `GLADEX_GCDV_FULL=1` is set, and SKIPs otherwise — S2 is wired in because it is the one scenario that plants nothing (it only moves HEAD between the two live reads), so the `notes >= 1` column of the table above is now asserted on S2's own line (`failed=0 notes=[1-9]… -> ok`) rather than read as prose, with S1's `notes=0` line as its negative control. **Measured, then fixed (2026-10-10, `[0.4.283]`): the pair WAS intermittently red — 1 run in 4 — because S2 timed its HEAD move off an `ls -t /tmp/ssgc-test.*/live-repo-lint.json` glob shared with every other identity on the box (the suite under test hardcoded its sandbox under `/tmp` and ignored `TMPDIR`, so the tool could not scope the poll to its own clone; a concurrent run of that same suite shifted the move relative to its own two-read window). The trigger now runs the child suite with `TMPDIR` set to a `$OUT/s2tmp` root inside its own scratch and polls only files under that root, and the guard honours `TMPDIR` in the same commit — so nothing outside this run's scratch is read, written or deleted, while an unscoped `TMPDIR`-less run of the guard still lands exactly where it always did. `tests/test_go_compile_drift_verify.sh` section 5b pins all three facts statically (a green run cannot see the glob become shared again). A red there still means "read the S2 log", not "the guard is broken".** S3–S5 stay unrunnable from the suite by design: they plant a broken Go file and rewrite `tools/system-status` inside the clone, which is what this file's own "keeps out of a hermetic suite" rule is for, and exit **1** (an unmet scenario) is still unobservable there by construction.
7371:moved the `- Live:` figure line above from 63 to **67**.
7649:**Since** this suite landed, `tools/REGISTRY.md`'s `- Live:` suite figure is the
8174:**Status**: Built ✅ 2026-10-02 (queue item **(116)**, `[0.4.173]`; `- Live:`
8259:assertions green in ~15s; `- Live:` suite figure refreshed **82 → 83** in the
8314:the two reds exactly C1's; `- Live:` suite figure refreshed **85 → 86** in the
8438:a home beside `disk-show`; registers with the `- Live:` suite figure **92 → 93** in the same
8490:**Status**: Built ✅ 2026-10-09 (queue item **(ag)**, `[0.4.277]` — registers with the `- Live:` suite figure **93 → 94** in the same commit, as section F of `tests/test_registry_coverage.sh` requires of the run that adds a suite, and with that suite's C28g option-list scope **24 → 25** and G38 `cl_other` **24 → 25**, the `--lock-file PATH` pair joining the bucket no class can call invalid)
8564:passed, exit 1**; registers with the `- Live:` suite figure **96 → 97** in the
8657:assertions green in ~2.3 s**; registers with the `- Live:` suite figure **98 →
8743:`tools/REGISTRY.md` change was the `- Live:` refresh alone, and `git log -S
8811:counter-reader) — registers with the `- Live:` suite figure **102 → 103** in the
=== suite count ===
130
128
128


[output truncated; full output saved to: /root/.local/share/opencode/shell/fa3e85b2145a60c127b5c9261e76a7ba6d520299/sh_199a8f833002ZblW0OLEiQWAl4.out]
> build · mimo-v2.6-flash-free
$ cd /data/repo && ./tools/regression-run --list | head -5; echo "..."; ./tools/regression-run --list | wc -l; ./tools/regression-run --list | grep -c "^" 
regression-run  repo=/data/repo  tests=/data/repo/tests  2026-11-02T00:29:19Z
  test_agent_loop_watchdog.sh
  test_api_health.php
  test_app_contrast.php
  test_app_contrast_meta.php
...
130
130
$ cd /data/repo && grep -n "concurrent-builder" STRUCTURE.md | head; echo "=== live tool ==="; ./tools/concurrent-builder; echo "rc=$?"
459:run, expect the resume — `tools/concurrent-builder` will name it.
487:**Detection.** `tools/concurrent-builder` (read-only: `git rev-parse`/`git log`, list/stat,
=== live tool ===
concurrent-builder: FAIL - 1 post-exit resume(s) in window: 0 concurrent / 1 stray - a builder session outlived its loop run and acted in the shared tree
  - run 2941 session ses_e6b82964fffe6w5xV5HO5oSUm6 [stray] 14 msg(s), last 628.8s after exit
rc=1
> build · mimo-v2.6-flash-free
The live `concurrent-builder` just caught its own author — run 2941's session resumed 628.8 s after its exit (`[stray]`), a first live detection of the very hazard class it was built for. Now running the remaining gates and checking the budget month-roll warning.
$ cd /data/repo && head -40 BUDGET.md
month: 2026-10
allowance: 5.00
spent: 0.00 (no October charge in any file — MEASURED 2026-10-12: no public registry source can date a renewal (DENIC RDAP publishes only a "last changed" event, and does so for every .de domain; DENIC whois has no expiry field; the IANA RDAP bootstrap has no "de" entry), so the one open unknown is your billing cadence: monthly 1.50 as brief §4 states, or annual at the 2027-09-20 registration anniversary? Still NEEDS-INVESTOR, REPORT.md §14)
remaining: 5.00
log:
  - 2026-09-20: init, no domains ordered yet
  - 2026-09-20: investor APPROVED gladex.de (1.50/mo). Awaiting registrar purchase + DNS creds.
  - 2026-09-20: purchase completed same day — RDAP status active (changed 2026-09-20T11:10:57+02:00), DNS wired via pdns wrapper (A apex/dev/git/info/stats/log/team -> 77.90.15.49, MX 10 gladex.de), dig-verified; DOMAIN.md holds evidence.
  - 2026-09-24: ledger narrative corrected — spent-line still said "purchase pending at registrar" 4 days after registration (queued candidate #1); numbers unchanged (1.50/3.50, no money moved), log history above kept verbatim.
  - 2026-10-01: month rolled per brief §4 (balance resets to 5.00 on the 1st, unspent does NOT roll over). September history above is kept verbatim; September closed at spent 1.50 / remaining 3.50.
  - 2026-10-02: October opened at spent 0.00 / remaining 5.00 because no October charge exists in any file on this box — while gladex.de is a known 1.50/mo recurring cost with NO renewal date recorded anywhere. Figure to be corrected the moment the investor answers REPORT.md §14.
  - 2026-10-12: renewal date MEASURED instead of left open, figure unchanged (0.00 / 5.00, no money moved): (1) DENIC RDAP rdap.denic.de/domain/gladex.de returns exactly ONE event — "last changed 2026-09-20T11:10:57+02:00", i.e. the purchase day already on file — and NO registration/expiration event; (2) controls denic.de ("last changed 2024-12-19T13:33:43+01:00") and bund.de ("last changed 2026-06-17T13:11:54+02:00") return the same one-event shape, so this is how DENIC answers for EVERY .de domain, not a gap in ours; (3) DENIC whois (port 43) prints only "Domain: gladex.de" + "Status: connect" — no expiry field; (4) the IANA RDAP bootstrap (data.iana.org/rdap/dns.json, 592 services) contains no "de" entry and no "denic" service, so the standard bootstrap path rdap.org/domain/gladex.de answers 404 (control: example.com answers 302). Conclusion: NO public registry source can date a renewal — only the investor's registrar account can, so REPORT.md §14 stays open with its question narrowed to the billing cadence. Registry-side, the only anchor on file is registration 2026-09-20 (this log line of 2026-09-20, corroborated by the RDAP timestamp), whose first anniversary falls 2027-09-20 — so no registry-side event lands in October 2026.
rules: .de 1.50/mo, .com/.org/.net 2.50/mo. No rollover. All purchases through investor.
$ cd /data/repo && for t in test_queue_source.sh test_repo_lint.sh test_leak_figure_readers.sh test_registry_figure_readers.sh test_cross_reader_agreement.sh; do bash tests/$t > /tmp/opencode/gate-$t.log 2>&1; echo "$t rc=$? -> $(tail -1 /tmp/opencode/gate-$t.log)"; done
test_queue_source.sh rc=0 -> ===============================
test_repo_lint.sh rc=0 -> ===============================
test_leak_figure_readers.sh rc=0 -> ===============================
test_registry_figure_readers.sh rc=0 -> === Results: 44 passed, 0 failed ===
test_cross_reader_agreement.sh rc=0 -> === Results: 64 passed, 0 failed ===
> build · mimo-v2.6-flash-free
All five smaller gates green. Now rolling the stale budget month (standing warning: ledger says 2026-10, current is 2026-11) while the coverage suite runs.
← Edit repo/BUDGET.md
Index: repo/BUDGET.md
===================================================================
--- repo/BUDGET.md
+++ repo/BUDGET.md
@@ -1,7 +1,7 @@
-month: 2026-10
+month: 2026-11
 allowance: 5.00
-spent: 0.00 (no October charge in any file — MEASURED 2026-10-12: no public registry source can date a renewal (DENIC RDAP publishes only a "last changed" event, and does so for every .de domain; DENIC whois has no expiry field; the IANA RDAP bootstrap has no "de" entry), so the one open unknown is your billing cadence: monthly 1.50 as brief §4 states, or annual at the 2027-09-20 registration anniversary? Still NEEDS-INVESTOR, REPORT.md §14)
+spent: 0.00 (no November charge in any file — the one open unknown remains your billing cadence: monthly 1.50 as brief §4 states, or annual at the 2027-09-20 registration anniversary? Still NEEDS-INVESTOR, REPORT.md §14. October closed at spent 0.00 / remaining 5.00: no October charge existed in any file on this box, same measured state as September's close)
 remaining: 5.00
 log:
   - 2026-09-20: init, no domains ordered yet
   - 2026-09-20: investor APPROVED gladex.de (1.50/mo). Awaiting registrar purchase + DNS creds.

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)
[Mon Nov  2 01:30:39 2026] 127.0.0.1:42640 Accepted
[Mon Nov  2 01:30:39 2026] 127.0.0.1:42640 Closing
[Mon Nov  2 01:30:39 2026] 127.0.0.1:42644 Accepted
[Mon Nov  2 01:30:39 2026] 127.0.0.1:42644 Closing
[Mon Nov  2 01:30:39 2026] 127.0.0.1:42654 Accepted
[Mon Nov  2 01:30:39 2026] 127.0.0.1:42654 Closing
[Mon Nov  2 01:30:39 2026] 127.0.0.1:42668 Accepted
[Mon Nov  2 01:30:39 2026] 127.0.0.1:42668 Closing
[Mon Nov  2 01:30:39 2026] 127.0.0.1:42678 Accepted
[Mon Nov  2 01:30:39 2026] 127.0.0.1:42678 Closing
[Mon Nov  2 01:30:39 2026] 127.0.0.1:42688 Accepted
[Mon Nov  2 01:30:39 2026] 127.0.0.1:42688 Closing
[Mon Nov  2 01:30:39 2026] 127.0.0.1:42698 Accepted
[Mon Nov  2 01:30:39 2026] 127.0.0.1:42698 Closing
[Mon Nov  2 01:30:39 2026] 127.0.0.1:42708 Accepted
[Mon Nov  2 01:30:39 2026] 127.0.0.1:42708 Closing
[Mon Nov  2 01:30:39 2026] 127.0.0.1:42724 Accepted
[Mon Nov  2 01:30:40 2026] 127.0.0.1:42724 Closing
[Mon Nov  2 01:30:40 2026] 127.0.0.1:42734 Accepted
[Mon Nov  2 01:30:40 2026] 127.0.0.1:42734 Closing
[Mon Nov  2 01:31:02 2026] 127.0.0.1:39812 Accepted
[Mon Nov  2 01:31:02 2026] 127.0.0.1:39812 Closing
[Mon Nov  2 01:32:37 2026] 127.0.0.1:37154 Accepted
[Mon Nov  2 01:32:37 2026] 127.0.0.1:37154 Closing
[Mon Nov  2 01:32:37 2026] 127.0.0.1:37156 Accepted
[Mon Nov  2 01:32:37 2026] 127.0.0.1:37156 Closing
[Mon Nov  2 01:32:37 2026] 127.0.0.1:37162 Accepted
[Mon Nov  2 01:32:37 2026] 127.0.0.1:37162 Closing
[Mon Nov  2 01:32:37 2026] 127.0.0.1:37176 Accepted
[Mon Nov  2 01:32:37 2026] 127.0.0.1:37176 Closing
[Mon Nov  2 01:32:37 2026] 127.0.0.1:37180 Accepted
[Mon Nov  2 01:32:37 2026] 127.0.0.1:37180 Closing
[Mon Nov  2 01:32:37 2026] 127.0.0.1:37196 Accepted
[Mon Nov  2 01:32:37 2026] 127.0.0.1:37196 Closing
[Mon Nov  2 01:32:37 2026] 127.0.0.1:37206 Accepted
[Mon Nov  2 01:32:37 2026] 127.0.0.1:37206 Closing
[Mon Nov  2 01:32:37 2026] 127.0.0.1:37210 Accepted
[Mon Nov  2 01:32:37 2026] 127.0.0.1:37210 Closing
[Mon Nov  2 01:32:37 2026] 127.0.0.1:37226 Accepted
[Mon Nov  2 01:32:38 2026] 127.0.0.1:37226 Closing
[Mon Nov  2 01:32:38 2026] 127.0.0.1:37228 Accepted
[Mon Nov  2 01:32:38 2026] 127.0.0.1:37228 Closing
[Mon Nov  2 01:36:18 2026] 127.0.0.1:44970 Accepted
[Mon Nov  2 01:36:18 2026] 127.0.0.1:44970 Closed without sending a request; it was probably just an unused speculative preconnection
[Mon Nov  2 01:36:18 2026] 127.0.0.1:44970 Closing
[Mon Nov  2 01:36:20 2026] 127.0.0.1:44984 Accepted
[Mon Nov  2 01:36:20 2026] 127.0.0.1:44984 Closed without sending a request; it was probably just an unused speculative preconnection
[Mon Nov  2 01:36:20 2026] 127.0.0.1:44984 Closing
[Mon Nov  2 01:37:32 2026] 127.0.0.1:36386 Accepted
[Mon Nov  2 01:37:32 2026] 127.0.0.1:36386 Closing
[Mon Nov  2 01:37:34 2026] 127.0.0.1:36400 Accepted
[Mon Nov  2 01:37:34 2026] 127.0.0.1:36400 Closed without sending a request; it was probably just an unused speculative preconnection
[Mon Nov  2 01:37:34 2026] 127.0.0.1:36400 Closing
[Mon Nov  2 01:37:36 2026] 127.0.0.1:49572 Accepted
[Mon Nov  2 01:37:36 2026] 127.0.0.1:49572 Closed without sending a request; it was probably just an unused speculative preconnection
[Mon Nov  2 01:37:36 2026] 127.0.0.1:49572 Closing
[Mon Nov  2 01:38:34 2026] 127.0.0.1:60506 Accepted
[Mon Nov  2 01:38:34 2026] 127.0.0.1:60506 Closing
[Mon Nov  2 01:43:19 2026] 127.0.0.1:56452 Accepted

Other app logs: downloads.log

Generated 2026-11-02 00:43:19 UTC · Gladex.de