Regenerated from the project's own files. Reads current state; grades nothing; never hand-edited.
Every figure below was measured by running the named command at the moment this page was built — never read out of the prose underneath, which can go stale between one reading and the next.
node -e "import('./projects/ops/skippy-jobs/lib/outside-review-ledger.mjs').then(m=>{const o=m.openDebt({olderThanHours:0});const n=Date.now();console.log('open',o.length,'over24h',o.filter(r=>n-Date.parse(r.at)>864e5).length)})"open 1 over24h 0
node projects/ops/skippy-jobs/_test-review-debt.mjs🧪 Running self-proof tests... ✓ normalizeReview accepts t1/t2/t3 case-insensitive ✓ normalizeReview rejects invalid values ✓ computeTier t3 for files > 15 ✓ computeTier t3 for floorAdjacent ✓ computeTier t3 for newSystem ✓ computeTier t2 for files >= 3 ✓ computeTier t2 for visibleSurface ✓ computeTier t2 for isPlanOrSpec ✓ computeTier t1 for single plain file ✓ openDebt detects unclosed row aged 25h ✓ openDebt excludes closed rows ✓ openDebt respects age boundary ✓ openDebt returns empty array when file does not exist ✓ closeRow throws on invalid verdict ✓ openRow REFUSES to write a row with no runId (the exact historical bug) ✓ openRow returns the runId it wrote (so a caller can never print "undefined" as success) ✓ TWO id-less rows (pre-fix shape) now produce TWO DISTINCT debt entries via derived IDs ✓ route-build.mjs's source mints its own real runId and passes it into openRow (structural) ✓ (GAP 1a) openRow writes task field and readRows retrieves it ✓ (GAP 1b-route) route-build.mjs source carries task field in openRow call (structural) ✓ (GAP 1b-cheap) cheap-task.mjs source carries task field in openRow call (structural) ✓ (GAP 2c) record-review.mjs exits non-zero when runId has no matching open row ✓ (GAP 2d) record-review.mjs exits zero and writes close when open row exists (positive control) ✓ (DUP-CLOSE 1) closeRow throws when called a second time for same runId without amend ✓ (DUP-CLOSE 2) closeRow succeeds on second close when amend: true is passed ✓ (DUP-CLOSE 3) record-review.mjs CLI exits 2 on duplicate close without --amend ✓ (DUP-CLOSE 4) record-review.mjs CLI exits 0 with --amend true and writes amended close ✓ (DUP-CLOSE 5) regression: two separate closes with DIFFERENT verdicts (live incident shape) ✓ effectiveRunId is DETERMINISTIC: same row yields identical id across calls ✓ record-review.mjs can CLOSE a row by its derived legacy ID (end-to-end) ✓ closing ONE derived legacy row does NOT discharge others (three id-less rows, close one, two remain) ✓ openRow records a dispatcher when given, and omits the key when not ✓ record-review REFUSES a close whose --by names the recorded dispatcher (exit 2, no close written) ✓ record-review ACCEPTS an independent reviewer on a dispatcher-carrying row ✓ a row WITHOUT a dispatcher stays warning-only — never fail-closed on missing history ✓ (R3) dispatcher X closed --by exactly X → REFUSED (exit non-zero, no close written) ✓ (R3) dispatcher X closed --by "X-independent" → ALLOWED (a different actor is never refused for containing a common token) ✓ (R3) legacy row WITHOUT dispatcher → close allowed, warning only (never fail-closed on missing history) ✓ (R3) an annotated self-close is still refused (dispatcher plus a parenthetical is the same actor) ✓ (R3 structural) route-build.mjs openRow call passes dispatcher (the producer half of the refusal) ✓ (R3 structural) cheap-task.mjs openRow call passes dispatcher (the producer half of the refusal) 🔍 Checking production debt... ✓ Production ledger checked: no unreviewed work older than 24h 42 passed, 0 failed
CURRENT STATE ONLY. Rewritten in place at every pass — this is not a log. History belongs in projects/ops/walkaway/REPORT.md and the CHANGELOG. Plan: PLAN.md beside this file. A fresh agent takes over from these two files alone.
🔴 CYCLE 5 EXHAUSTED THE MECHANICAL DRAIN. There is no drainable row left. Measured at write time: open 30 · over-24h 0 · rows carrying a prove field 0. Guard _test-review-debt.mjs = 42 passed, 0 failed, exit 0. The four rows that still had a recorded proof were all closed this pass, so no future cycle can reduce this count by re-running anything — the decision in NEXT ACTION is now the only way the number moves.
What cycle 5 closed, and on what basis:
| runId | verdict | basis (re-run in a fresh shell this pass) |
|---|---|---|
cheap-1787478992360-ho6mmb | pass | proof exit 0, AND the artefact was read past the proof: .tmp-pacer4/CHECK.md, 47 lines, 4 VERDICT lines, all four PASS, no FAIL |
route-1787478828275-ufn626 | pass | proof exit 0, 42 passed, 0 failed; falsifiable — set -e over a real suite plus 7 named grep -q assertions, not a parse check |
cheap-1787479158228-z8eqk2 | defects | proof exit 0 but CANNOT SEE ITS OWN CONTENT — grep -c VERDICT >= 4 counts strings without reading them; 2 of its 4 verdicts are FAIL |
cheap-1787473654437-03lxw3 | defects | proof exit 1 — .tmp-rowcheck/ no longer exists. The defect is in the PROOF (it pointed at an ephemeral scratch dir), not a finding about the work |
🔴 ONE OF THAT COLD CHECK'S OWN FAILS WAS FABRICATED, AND THIS IS THE LESSON WORTH CARRYING. z8eqk2 stated "a repository-wide search for CHANGELOG (and CHANGELOG.md) returned zero matches" and concluded the file was absent. Refuted by measurement this pass: ls -la CHANGELOG.md returns a 284,865-byte file at the repo root modified 2026-08-23 05:12, and find . -maxdepth 3 -iname 'CHANGELOG*' returns 20+ hits. The worker searched only projects/ops/walkaway/CHANGELOG.md and reported a repository-wide negative it never ran. A checker's FAIL is a claim like any other — re-open the thing before acting on it.
✅ Its OTHER fail was correct and has been acted on: this file's own "rows open: 31" was stale. Corrected in place.
✅ DEFECT IN THE PACER'S OWN TOOL — FOUND, RECORDED, AND NOW FIXED (cycle 9, 2026-08-23). The history below is kept so nobody re-imposes the old workaround by guess; read to the end of this paragraph before acting on any of it. drive-beat.mjs beat --note "..." is silently ignored: beat reads --dispatch and --items; --note belongs to the sibling kick subcommand, and the shared usage line lists all three together with no hint which is which. The command reports success and updates the heartbeat timestamp while leaving the PREVIOUS cycle's last_dispatch in place — i.e. the cross-cycle handoff baton silently does not move. Cycle 5 hit this and caught it only by re-reading list instead of trusting the echo. Logged mx-38cee1822a; guard proposed ag-9b4d555773. Not patched this pass because drive-beat.mjs is unattended code and needs the triad plus a regression artefact. ✅ FIXED AND VERIFIED 2026-08-23 BY PACER CYCLE 9 — THIS WARNING IS RETIRED. --note NOW WORKS ON beat. Do not go on avoiding it. beat accepts BOTH --items N --dispatch "..." and --note "...", and an unrecognised flag is now REFUSED out loud (drive-beat: 'beat' does not accept --bogusflag (no subcommand accepts it)) instead of silently dropped — the silent-ignore bug class is closed, not just the one instance. Tested on THIS row: a canary note written with --note landed in last_dispatch. Two guards cover it and the overnight suite runner that globs them is confirmed alive (it ran 09:32 and 10:29 today): _test-drive-beat.mjs 14/0 and _test-drive-beat-flags.mjs 8/0. The new guard was negative-controlled — planting the old behaviour in a scratch copy drove it to 1 passed / 7 failed — so it can genuinely fail. Live file sha256 2e136db1de9480bf. 🔴 STILL TRUE AND WORTH KEEPING: re-read list after any write. The echo is not evidence.
🔴 The number below is the LIVE count at the moment of writing, not this pass's mid-point. An earlier draft of this header said 31 — true mid-pass, stale by the time it was read, and caught by an independent checker. The drive's own contribution this cycle was 36 → 31; two further rows then arrived from other running work.
🔴 DO NOT READ AN OPEN COUNT OUT OF THIS FILE. Run the command — the count moves while you read.
node -e "import('./projects/ops/skippy-jobs/lib/outside-review-ledger.mjs').then(m=>{const o=m.openDebt({olderThanHours:0});const n=Date.now();console.log('open',o.length,'over24h',o.filter(r=>n-Date.parse(r.at)>864e5).length)})"
node projects/ops/skippy-jobs/_test-review-debt.mjs
Why this file no longer states a live count, and it is not fussiness. Three separate numbers were written into this header during a single pass — 31, then 33, then 34 — and each was true when written and stale within minutes. Other sessions open rows on this machine continuously, and draining the ledger itself opens rows, because dispatching a checker is dispatched work. A static file cannot hold a moving number honestly. An independent checker caught the 31; the 33 went stale before the correction was saved.
What IS stable and safe to read here: at 09:56:43Z the guard returned 42 passed, 0 failed, exit 0, and 0 rows were over 24 hours. Cycle 3's one-off 37 passed / 5 failed did not reproduce in four re-runs. This drive's own contribution this cycle was five rows discharged; the total moved 36 → 31 by its own work and then rose again from other traffic.
🔴 THE DEADLINE IS REAL AND IT IS TODAY: the oldest open row crosses 24h at 2026-08-23T15:54:14Z. From that moment the guard goes red and — on the evidence below — can never go green again without a decision, because these rows have nothing left to review.
Drained everything that was drainable, then removed one row that should never have been debt:
| row | verdict | basis |
|---|---|---|
route-1787476164072-rz9u1z | pass | own proof re-run in a fresh shell, literal EXIT_B=0 |
route-1787476177220-10q4qd | pass | own proof re-run in a fresh shell, literal EXIT_C=0 |
cheap-1787476289083-p7fgvu | pass | own proof re-run, literal EXIT_D=0 |
cheap-1787476607049-5vx8ia | pass | own proof re-run, literal EXIT_E=0 |
test-roundtrip-001 | pass (disposition, not approval) | NOT REAL WORK — see below |
🔴 Every one of those proofs was negative-controlled before it was accepted, because a proof that cannot fail is decoration. For the two route- rows a wrong-expectation variant of the same shape (js/panel.js?v=99 instead of v=12) exited 1. For the two cheap- rows a missing-file variant exited 1. Both shapes can fail; both passed on the real subject.
test-roundtrip-001 was never real work — measured, not inferredIt is line 1 of the production ledger: {"runId":"test-roundtrip-001","tool":"test-worker","vendor":"qwen","files":2,"task":"sample build task"}. No file, no proof, no dispatcher. It is the synthetic seed row written when the ledger was created, and it was the row that would have tripped the 24h guard first.
Searches that could have matched and did not — the terms come from the row's own field values, not from the vocabulary of the fix:
command grep -rn "test-roundtrip" projects/ .claude/ — every hit is an unrelated Skippy School KV date string in functions/api/skippy-results.js, plus one line of REBUILD-RECORD.md that merely lists this row. No code emits this runId into the review ledger.command grep -c '"tool":"test-worker"' projects/ops/skippy-jobs/lib/outside-review-ledger.jsonl → 1. One row, ever. This is a one-off seed, not an ongoing leak, so no code fix is owed.The 31 remaining rows carry no file and no task. Not "a truncated proof" — nothing to review at all.
Measured this pass over the live ledger:
node -e "import('./projects/ops/skippy-jobs/lib/outside-review-ledger.mjs').then(m=>console.log(m.openDebt({olderThanHours:0}).length))". An independent DeepSeek cold check flagged this exact line as a FAIL and it was right.file / dir / target field: 0task text: 8 (so 23 have an empty task string)prove field: 1 — cheap-1787473654437-03lxw3 alone, and its proof points at .tmp-rowcheck/CHECK.md, which was cleaned up. Re-run this pass: literal EXIT_A=1. It is category D — a recorded proof that is not a re-runnable one — so it is open debt that no amount of shell access can discharge.legacy-route-build-* rows: 15 (section B's table below lists 21; six of those were closed by earlier cycles and the table has not been re-cut)Those 15 legacy rows are the worst case: task is "", idDerived is true, and there is no file field. The only pointer to what any of them touched is the 286-character truncated proof prefix recovered from route-build.log, listed in section B below.
🔴 This kills the obvious rescue plan, so it is written down rather than left to be rediscovered. The natural idea — "forget the lost proof, just cold-read the file the run touched and judge it against the task" — cannot be executed from the ledger, because the ledger row records neither the file nor the task. The file name survives only in section B's recovered log line, and the intent survives nowhere. A reviewer cannot grade work when the record does not say what the work was.
The three honest options, unchanged from cycle 3 and now backed by the field-level measurement above:
test-roundtrip-001 close above, which is the precedent. Fast, honest, and the record survives in each --by string.🔴 Option 3 has a cost the first two do not: a guard that is permanently red is indistinguishable from no guard at all. That is the argument against simply waiting.
This is a judgment call about what the guard is FOR, so it belongs to Nick or to the drive's owner. It is recorded here — a passive file he opens when he chooses — and is deliberately NOT pushed to any surface.
An outside agent that did not write any of this re-checked four claims straight against the raw ledger file, quoting whole lines verbatim rather than summarising them. 4/4 PASS:
pacer-cycle-4, all verdict pass — all five quoted with their runIds and timestamps (ledger lines 177–181).test-roundtrip-001 / tool:"test-worker" / task:"sample build task" — quoted whole.cheap-1787473654437-03lxw3 has an open event and no close — quoted; still correctly open.test-roundtrip-001 has exactly two lines, one open and one close — both quoted.🔴 Two rows this cycle may NOT close, and the reason is structural, not an oversight:
cheap-1787478992360-ho6mmb — opened by this cycle's own cold-check dispatch. The pacer dispatched it, and a reviewer may never be its own dispatcher, so the NEXT cycle closes it.route-1787478828275-ufn626 — opened at 09:53:48Z by a different, concurrent session on this machine, not by this drive. Draining the ledger while other work is running means the count is a moving target; that is normal, not a leak.Final measurement of this pass, 2026-08-23T09:56:43Z: 33 open, 0 over 24 hours, guard 42 passed, 0 failed. Open reached 31 mid-pass and rose to 33 as two new rows arrived from elsewhere — the drive's own contribution this cycle was 36 → 31.
None of these are "the check failed, therefore broken". Each was opened and diagnosed:
🔴 One row exposed a defect in CYCLE 1's own evidence: the re-run worker recorded EXIT 0 for a row whose own pasted output showed two FAILs. The verifier re-ran it independently, got exit 1, and opened the file to confirm. Caught downstream, as it should be — but it is the reason a worker's summary is never relayed without the raw data beside it.
🔴 SUPERSEDED BY CYCLE 4 — re-measured 2026-08-23T09:53:07Z: 31 open, of which 30 carry no proof at all and 1 (cheap-1787473654437-03lxw3) carries an unrunnable one. The four rows cycle 3 called drainable were drained this pass. The tables below have NOT been re-cut and still list rows that are now closed: treat them as the historical evidence of what each row's proof looked like, never as the current open list. The current open list comes from the command, not from this file.
_Direct evidence of truncation, not an inference: all 21 are exactly 286 characters long (300 minus the 14-character proof passed: prefix) and every one of them ends part-way through a word or a quoted string. The command cannot be re-run because the end of it no longer exists anywhere._
| id | file the run touched | proof as far as the log kept it | ||
|---|---|---|---|---|
| legacy-route-build-2026-08-22T15:54:14.307Z | projects/ops/skippy-jobs/lib.mjs | node -e 'import("/Users/nickdeck/Documents/Claude/projects/ops/skippy-jobs/lib.mjs").then(m=>console.log("loaded ok; SKIPPY_OWN_DM =", m.SKIPPY_OWN_DM, "; isEscalated(skippy-own-dm) =", m.isEscalated("slack(skippy-own-dm)"), "; isEscalated(skippy:nicks-life) =", m.isEscalated("slack(sk | ||
| legacy-route-build-2026-08-22T17:21:22.030Z | projects/personal/family-app/sw.js | test $(grep -c 'deck-family-v334' projects/personal/family-app/sw.js) -ge 1 && test $(grep -c 'panel.js?v=6' projects/personal/family-app/sw.js) -ge 1 && test $(grep -c 'actions.js?v=14' projects/personal/family-app/sw.js) -ge 1 && test $(grep -c 'updates.js?v=24' projects/personal/fam | ||
| legacy-route-build-2026-08-22T17:26:16.707Z | projects/personal/health/intake/_build_nick_intake_v2.mjs | node -e "const s=require('fs').readFileSync('projects/personal/health/intake/_build_nick_intake_v2.mjs','utf8'); const lines=s.split('\n'); if(/slice\(0,\s*140\)/.test(s)) throw new Error('FAIL: the 140-character cut is still present'); if(!/const wshort = words;/.test(s)) throw new Er | ||
| legacy-route-build-2026-08-22T18:02:20.305Z | projects/personal/family-app/js/actions.js | grep -q 'function card(item)' projects/personal/family-app/js/actions.js && grep -q 'var pending = state.items.filter' projects/personal/family-app/js/actions.js && ! grep -q 'SIGNAL_ANSWER_API' projects/personal/family-app/js/actions.js && ! grep -q 'signal:' projects/personal/family- | ||
| legacy-route-build-2026-08-22T18:04:33.295Z | projects/personal/family-app/js/updates.js | grep -q 'function card(item)' projects/personal/family-app/js/updates.js && grep -q 'digestLaneEl' projects/personal/family-app/js/updates.js && ! grep -q 'jobsDrawerEl' projects/personal/family-app/js/updates.js && ! grep -q 'job_counts' projects/personal/family-app/js/updates.js && n | ||
| legacy-route-build-2026-08-22T19:31:28.882Z | projects/personal/family-app/js/panel.js | node --check projects/personal/family-app/js/panel.js && grep -q 'Nothing was lost — what you typed is still in the box' projects/personal/family-app/js/panel.js && grep -q 'function recencyOf' projects/personal/family-app/js/panel.js && grep -q 'route.sent' projects/personal/family-ap | ||
| legacy-route-build-2026-08-22T21:19:36.224Z | projects/personal/family-app/js/panel.js | node --check projects/personal/family-app/js/panel.js && node -e "const s=require('fs').readFileSync('projects/personal/family-app/js/panel.js','utf8'); if(!/already sorted by recency of activity, newest first/.test(s)) throw new Error('new text missing'); if(/waiting-on-you first, the | ||
| legacy-route-build-2026-08-22T21:20:22.718Z | projects/personal/family-app/js/panel.js | node --check projects/personal/family-app/js/panel.js && node -e "const s=require('fs').readFileSync('projects/personal/family-app/js/panel.js','utf8'); if(/personLower/.test(s)) throw new Error('person filter still present'); if(/oneDayMs/.test(s)) throw new Error('24h window still pr | ||
| legacy-route-build-2026-08-22T21:21:20.259Z | projects/personal/family-app/js/panel.js | node --check projects/personal/family-app/js/panel.js && node -e "const s=require('fs').readFileSync('projects/personal/family-app/js/panel.js','utf8'); if(!/function panelState\(payload, status, renderedRows\)/.test(s)) throw new Error('signature missing'); if(!/var visible = Array\.i | ||
| legacy-route-build-2026-08-22T21:22:01.243Z | projects/personal/family-app/js/panel.js | node --check projects/personal/family-app/js/panel.js && node -e "const s=require('fs').readFileSync('projects/personal/family-app/js/panel.js','utf8'); const m=s.match(/fetchThreads\(\)\.then\(function \(res\) \{[\s\S]{0,400}/); if(!m) throw new Error('call site not found'); const b=m | ||
| legacy-route-build-2026-08-22T21:29:50.197Z | projects/personal/skippy-app/skippy-code/ops/test-neeko-scope.mjs | node --check projects/personal/skippy-app/skippy-code/ops/test-neeko-scope.mjs && test $(command grep -c 'allowed:' projects/personal/skippy-app/skippy-code/ops/test-neeko-scope.mjs) -eq 23 && grep -q 'Per Nick.*2026-08-21' projects/personal/skippy-app/skippy-code/ops/test-neeko-scope. | ||
| legacy-route-build-2026-08-22T21:47:22.136Z | projects/ops/agent-fleet/CHEAP-LANE-TOOLS-BOOT.md | `command grep -q '2026-08-16' projects/ops/agent-fleet/CHEAP-LANE-TOOLS-BOOT.md && command grep -qi 'CLASS_HEALTH\\ | health' projects/ops/agent-fleet/CHEAP-LANE-TOOLS-BOOT.md && command grep -qi 'CLASS_PRIVATE\\ | Chantelle' projects/ops/agent-fleet/CHEAP-LANE-TOOLS-BOOT.md && test $(wc -l <` |
| legacy-route-build-2026-08-22T21:49:40.398Z | projects/ops/agent-fleet/TOOL-TRANSLATION-BUILD-PROMPT.md | `command grep -q '2026-08-16' projects/ops/agent-fleet/TOOL-TRANSLATION-BUILD-PROMPT.md && command grep -qi 'CLASS_HEALTH\\ | health' projects/ops/agent-fleet/TOOL-TRANSLATION-BUILD-PROMPT.md && command grep -qi 'CLASS_PRIVATE\\ | Chantelle' projects/ops/agent-fleet/TOOL-TRANSLATION-BUILD-PRO` |
| legacy-route-build-2026-08-22T21:55:15.006Z | projects/ops/artifacts/check-audit/FIVE-GATES-REPAIR.md | `command grep -c 'awaiting independent grader' projects/ops/artifacts/check-audit/FIVE-GATES-REPAIR.md \ | command grep -qx '0' && command grep -q 'THEN the 107' projects/ops/artifacts/check-audit/FIVE-GATES-REPAIR.md && command grep -q 'CLOSED, commit' projects/ops/artifacts/check-audit/` | |
| legacy-route-build-2026-08-22T22:01:08.702Z | projects/ops/artifacts/skills-library/index.html | grep -q 'one workflow script per pass' projects/ops/artifacts/skills-library/index.html && grep -q 'test sheet' projects/ops/artifacts/skills-library/index.html && grep -q 'with a separate checker on every piece' projects/ops/artifacts/skills-library/index.html && ! grep -q '<<<' proje | ||
| route-1787444202821-dyyyml | projects/ops/spine-projections/guard_history.py | `python3 projects/ops/spine-projections/guard_history.py ownership runbooks 2>&1 \ | grep -q 'NOT FOUND' && ! python3 projects/ops/spine-projections/guard_history.py ownership runbooks 2>&1 \ | grep -q 'Traceback' && python3 -c 'import ast,sys; ast.parse(open("projects/ops/spine-projections` |
| route-1787446694698-voi8nx | projects/ops/artifacts/skills-library/index.html | grep -q 'design-taste-frontend-v1","full-output-enforcement' projects/ops/artifacts/skills-library/index.html && grep -q '"design-taste-frontend": {' projects/ops/artifacts/skills-library/index.html && grep -q '"full-output-enforcement": {' projects/ops/artifacts/skills-library/index.h | ||
| route-1787447247444-io6q28 | projects/ops/skippy-jobs/grade-skill-evals.mjs | node -e "const m = require('fs').readFileSync('projects/ops/skippy-jobs/grade-skill-evals.mjs','utf8'); if(!m.includes('truncated: full.length > MAX_EXCERPT_CHARS')) throw 'missing truncated flag'; if(!m.includes('MUST be \"unknown\" on a truncated excerpt')) throw 'missing system prom | ||
| route-1787447585831-0cjmy6 | projects/ops/skippy-jobs/grade-skill-evals.mjs | node --check projects/ops/skippy-jobs/grade-skill-evals.mjs && node -e "const m=require('fs').readFileSync('projects/ops/skippy-jobs/grade-skill-evals.mjs','utf8'); if(!m.includes('OPENING \${MAX_EXCERPT_CHARS} characters')) throw 'interpolation still broken'; if(m.includes('OPENING \\ | ||
| route-1787453517529-sjq7hp | projects/ops/skippy-jobs/jobs/work-watch.mjs | node --check projects/ops/skippy-jobs/jobs/work-watch.mjs && command grep -q "SOURCE 5: walk-away drives" projects/ops/skippy-jobs/jobs/work-watch.mjs && command grep -q "SOURCE 4: agents asking" projects/ops/skippy-jobs/jobs/work-watch.mjs && test $(wc -l < projects/ops/skippy-jobs/jo | ||
| route-1787454595741-frcuxa | projects/ops/skippy-jobs/jobs/work-watch.mjs | node --check projects/ops/skippy-jobs/jobs/work-watch.mjs && node -e "const s=require('fs').readFileSync('projects/ops/skippy-jobs/jobs/work-watch.mjs','utf8'); const must=['SOURCE 5: walk-away drives','SOURCE 4: agents asking','work-drives-','aged out of the fold','24 * 60 * 60 * 1000 |
🔴 DO NOT ACT ON THIS SECTION. Its heading and its search note below are WRONG and were disproved on 2026-08-23. They are kept, unedited, because this section personally misled a later pacer cycle into accusing another agent of fabricating nine review verdicts — an accusation that was written into the changelog, this drive's report, the heartbeat and a board card before it was retracted (
mx-883c7fa08f). A stale section is not harmless; this one manufactured a false accusation.What was actually true: the search below looked in
projects/ops/route-build.logONLY. A second log exists and nobody had searched it —projects/ops/skippy-jobs/lib/cheap-build-sends.log(1,521,165 bytes, confirmed on disk 2026-08-23), which records the task, the taskKey and the files touched for every cheap dispatch, and matched all ten rows by timestamp within ~200ms of their ledger open.Outcome: all nine remaining rows were graded on 2026-08-23 at 14:06:33Z — seven held up, two failed. The two failures are real and independently re-verified: the runs' own logs claim they wrote
projects/ops/.cheap-task-final-verdict.txtandprojects/ops/_pass12b-insert.mjs, and neither file exists on disk. Those two run ids are exactly the two closeddefects.The lesson this section earns: "cause found in the source, not guessed" below is the sentence that made it feel settled. The cause was found in ONE source. Naming a mechanism for an absence makes the absence feel proven, and it is the most convincing way to be wrong — a mechanism explains why you found nothing; it never proves there was nothing to find. A negative needs every store that could hold it enumerated, not one store plus a plausible reason.
<details><summary>The original section, kept verbatim and retired — read as history, never as current state</summary>
_Search made: every line of projects/ops/route-build.log carrying the string proof passed: (162 lines) was matched against each open row by timestamp, widening the window to 1s, 5s, 30s and 120s — the match count stopped moving at 1 second and these rows never matched at any width. Cause found in the source, not guessed: cheap-task.mjs writes an open row via openRow() but never records the proof command anywhere, so for these there is nothing to find._
| id | tool that opened it | opened at |
|---|---|---|
| test-roundtrip-001 | test-worker | 2026-08-22T15:42:14.651Z |
| cheap-1787418626698-mlo0h7 | cheap-task | 2026-08-22T17:10:26.699Z |
| cheap-1787419555747-jm9yir | cheap-task | 2026-08-22T17:25:55.748Z |
| cheap-1787436158709-752djt | cheap-task | 2026-08-22T22:02:38.710Z |
| cheap-1787439252445-fy3hcw | cheap-task | 2026-08-22T22:54:12.446Z |
| cheap-1787439372553-wfmpcr | cheap-task | 2026-08-22T22:56:12.553Z |
| cheap-1787443509203-5mlzuf | cheap-task | 2026-08-23T00:05:09.204Z |
| cheap-1787444263444-w5v7bu | cheap-task | 2026-08-23T00:17:43.445Z |
| cheap-1787446900034-eql8wc | cheap-task | 2026-08-23T01:01:40.035Z |
| cheap-1787448643014-dk7vsx | cheap-task | 2026-08-23T01:30:43.015Z |
</details>
node projects/ops/skippy-jobs/lib/record-review.mjs --run <id> --verdict <pass|defects> --by "<reviewer, not the dispatcher>" — a direct append to the JSONL is a contract breach (PLAN.md §3).defects verdict routes the defect to the file's owner — never fix the artifact in this lane (anti-scope).cheap-task.mjs --dir MUST BE A REPO-RELATIVE PATH INSIDE THE REPO. It is compared as a literal string prefix against path.relative(REPO, abs) (cheap-task.mjs:813-816, fence at :869), so an absolute path — especially a /private/tmp scratchpad — can never match. It fails SILENTLY in the worst way: the vendor does the work, every write_file is refused, it burns its whole 24-step budget retrying path spellings, reverts, and exits 0 — so it reads as a slow or empty vendor, not a dispatch error. Two consecutive cold checks were lost to this on 2026-08-23 (mx-a3af21586e). Use something like --dir ".tmp-rowcheck".openDebt compares age STRICTLY greater than its threshold, so {olderThanHours: 0} silently excludes any row written in the same millisecond as the call. Irrelevant for real rows, fatal in a test — pin now ahead if you assert on it.cheap-task.mjs gives its vendor only list_files/read_file/search/write_file (cheap-task.mjs:719-725) — an outside vendor cannot execute a proof command at all. Dispatching the Anthropic exerciser agent instead is refused by the work-type gate as unclear. Until that is resolved, the overseer runs the proofs in its own shell and records every command and literal exit code, which is what cycle 3 did. Do not read PLAN.md §3's "DeepSeek V4" executor as achievable./private/tmp/.../scratchpad/*.sh; they happened to still exist and passed. One pointed at .tmp-rowcheck/CHECK.md, which had been cleaned up, and is now permanently unprovable. A proof whose subject is scratch dies with the scratch.⚡ KICK — 2026-08-23T09:5xZ (pacer cycle 4): drive session dead (
session_idnull) and stalled after three prior kicks, so the pacer ran one bounded pass from PLAN.md + STATE.md. Drained all 4 drainable rows (all pass, each negative-controlled), disposed of the synthetic seed row, and measured the field-level finding above. Open went 36 → 31. Guard re-run green (42/0). One decision left, recorded in NEXT ACTION, not pushed anywhere.
⚡ KICK — 2026-08-23T09:53:50.994Z: session dead (session_id null) + stalled after three prior kicks — pacer cycle 4 ran one bounded pass from PLAN.md + STATE.md: drained 4, disposed of the synthetic seed row, open 36->31, guard green 42/0, field-level finding recorded
🔴 STALLED — 2026-08-23T10:17:54.611Z: heartbeat last touched 2026-08-23T09:57:15.600Z (~21 min ago) while status=active. Detected by drive-beat.mjs check; the pacer (full-speed-swarm-drive) kicks stalled drives — see its Step 0.5.
⚡ KICK — 2026-08-23T10:18:31.355Z: session dead (session_id null) + stalled after four prior kicks — pacer cycle 5 running one bounded pass from PLAN.md + STATE.md
🔴 STALLED — 2026-08-23T11:22:29.705Z: heartbeat last touched 2026-08-23T10:59:31.976Z (~23 min ago) while status=active. Detected by drive-beat.mjs check; the pacer (full-speed-swarm-drive) kicks stalled drives — see its Step 0.5.
⚡ KICK — 2026-08-23T11:23:10.249Z: session dead (session_id null) + stalled after five prior kicks — pacer cycle 8 ran one bounded pass: measured open debt 33 (up from 30, three rows opened by this cycle's own outside runs and not closeable by their dispatcher), heartbeat refreshed, no rows drained, nothing pushed to Nick
🔴 STALLED — 2026-08-23T12:12:04.764Z: heartbeat last touched 2026-08-23T11:51:36.598Z (~20 min ago) while status=active. Detected by drive-beat.mjs check; the pacer (full-speed-swarm-drive) kicks stalled drives — see its Step 0.5.
⚡ KICK — 2026-08-23T12:17:49.383Z: Pacer cycle 10 takeover: session dead, stalled after 6 kicks. Ran one bounded pass. MEASURED open debt = 35, not the 34 in cycle 9's beat (openDebt({olderThanHours:-1})). 🔴 THE FINDING THIS CYCLE: openDebt's DEFAULT is olderThanHours=24, and at that threshold it returns 0 — the oldest unclosed row is 2026-08-22T15:54:14Z, ~20.4h old at 12:15Z. So the 24h review-debt alarm has NOT fired yet and is silent for a reason that is not health: 30 rows cross 24h at ~15:54Z TODAY. Cycles 4-9 all worked t
🔵 CORRECTION FROM THE PACER — 2026-08-23T12:4xZ, cycle 11. Cycle 10's heartbeat says "
openDebt()is called by NOTHING in production… so the '24h unreviewed' alarm this drive is premised on does not exist as running code." That half is WRONG and I am correcting it before a later cycle builds a second alarm on the strength of it. The alarm is wired and runs unattended:_test-review-debt.mjs:1030callsopenDebtagainst the REAL ledger path insidecheckProductionDebt(), andjobs/test-suite-runner.mjsglobs_test-*.mjsin that directory nightly and runs every match. Run live by me, not remembered:node projects/ops/skippy-jobs/_test-review-debt.mjs→✓ Production ledger checked: no unreviewed work older than 24h·42 passed, 0 failed· exit0. The mistake is understandable — "it's a test file, so it isn't production" — but in this workspace the nightly_test-glob IS the unattended-guard mechanism, which is exactly what the house rule "ship it with a guard… the nightly runner already globs it" means. ✅ Cycle 10's OTHER finding in the same sentence is CORRECT and survives: the default threshold is 24h, it returns 0 there, and ~30 rows cross 24h at ~15:54Z today. So the alarm is silent for a correct reason, not a broken one. Two claims were bundled; only the first is wrong — do not discard both. Full working in REBUILD-RECORD.md under the same timestamp. Heartbeat deliberately NOT beaten by me: this drive is not stalled right now, and beating it would hide that its session is dead.
🔵 CORRECTION FROM THE PACER — 2026-08-23, cycle 12. The cycle-11 correction above (line ~197) is RIGHT that the alarm is wired and runs unattended, and WRONG about which job runs it. It says "
jobs/test-suite-runner.mjsglobs_test-*.mjsin that directory nightly and runs every match" — true before the sweep was split into shards, false for THIS file since. Re-derived at write time, not remembered:shardIdOf('_test-review-debt.mjs')= 2 andshardById(2).job=test-suite-runner-b(lib/suite-shards.mjs), andrunner.mjs:637schedulestest-suite-runner-bat hours [5] minute 10. So the watcher isjobs/test-suite-runner-b.mjsat 05:10, not the 04:10test-suite-runnerrun. ✅ Everything else in that correction survives untouched — the alarm exists, it is unattended, it is silent for a correct reason. Only the job name and the hour were wrong. 🔴 THIS WAS THE THIRD COPY OF THE SAME WRONG SENTENCE: the other two were atREBUILD-RECORD.md(~line 5120) and inCHANGELOG.md("every night at 4:10am"), both corrected the same day. A fresh read-only checker found this one after the first two were fixed — which is the lesson worth keeping: correcting a claim in the place you noticed it does not correct the copies, and a search written from the defect's own words is what finds them.
🔴 STALLED — 2026-08-23T13:57:39.882Z: heartbeat last touched 2026-08-23T13:36:27.088Z (~21 min ago) while status=active. Detected by drive-beat.mjs check; the pacer (full-speed-swarm-drive) kicks stalled drives — see its Step 0.5.
⚡ KICK — 2026-08-23T13:58:00.091Z: Pacer detected the stall at 13:57Z, at the very END of its own cycle — heartbeat 13:36Z, session_id null (dead). NO bounded pass was run by this cycle and its heartbeat was deliberately NOT beaten, so the stall stays visible rather than being masked by a pacer that did no work. Its two open items are unchanged from cycle 12's note: (a) mistake row mx-571b03a14a needs a supersede pointer to mx-7a7bed08f2, which needs a small change to log.py since no supported supersede operation exists; (b) the
⚡ KICK — 2026-08-23T14:11:28.668Z: Pacer cycle 14 takeover: session dead (session_id null), stalled after 8 kicks. Ran one bounded pass. MEASURED at write time: open(all)=0, open(>24h)=0. 🔴 BUT ZERO IS NOT A CLEAN FINISH AND MUST NOT BE READ AS ONE. I closed exactly ONE row myself (route-1787493379294-dm0yvy, pass) after re-running its own proof AND negative-controlling it (mutated input made the proof exit 1, so its exit 0 is a real signal). The other nine rows that made up the remaining debt were closed at 2026-08-23T14:06:33Z
THIS IS THE ONLY PLANNING DOCUMENT FOR THIS PROJECT. Do not create a second plan, tracker, or scratch state file for it — extend this one, or its STATE.md companion, and log a dated delta in PLAN-CHANGES.md.
Written 2026-08-23 under projects/ops/walkaway/PROPOSAL.md (triad reconcile v2 + build verdicts, binding) and .claude/skills/plan/SKILL.md. This is the first plan gated by the rebuilt check_plan.py and the first drive the pacer watches overnight.
.claude/skills/plan/references/failure-registry.md; every entry mapped in §4.projects/ops/agents/DEV-QA-SPEC.md, projects/ops/HANDBACK-GATE-SPEC.md, projects/ops/verification-subagent.md (referenced per the SKILL's "reference, don't paraphrase" rule); no design standard applies (nothing visual is produced).projects/ops/skippy-jobs/lib/outside-review-ledger.mjs + record-review.mjs (closes go ONLY through it); drive liveness is owned by projects/ops/walkaway/drive-beat.mjs writing into the EXISTING work-threads registry (v2 reconcile §2 cancelled any second registry); the morning surface is the existing projects/ops/walkaway/REPORT.md. This drive only DRAINS and REPORTS through those owners.record-review.mjs (self-grading refusal present in source), _test-review-debt.mjs (36KB, on disk), drive-beat.mjs (register/beat/check/kick/list all present), matrix-evidence.mjs (ran clean), REPORT.md (exists, append-only), projects/ops/walkaway/MODEL-MATRIX.md (9-row matrix read in full).openDebt({olderThanHours:0}) = 77 unclosed opens. The plan uses 77 everywhere. No other class fired: terms defined, scope fenced, landing spots named.Drain the open review-debt rows in the outside-review ledger to zero. Every close re-runs that run's OWN proof against the artifact on disk, and is recorded by a reviewer who is not the dispatcher of the run — the refusal in record-review.mjs enforces this in code. Verdicts run at Sonnet tier per the model matrix; the mechanical proof re-runs go to the cheap vendors per the matrix.
full-speed-swarm-drive) picks this drive up each cycle, reads STATE.md's next-action, drains one batch (~10 rows), beats the heartbeat, and moves on. No human touches it; Nick reads the outcome in the morning report.projects/ops/walkaway/REPORT.md, (d) a live row in the work-threads registry.projects/ops/walkaway/drives/review-debt-drain/ (this plan + STATE.md); the work itself lands in projects/ops/skippy-jobs/lib/outside-review-ledger.jsonl. Who opens it: the swarm cycles execute it; Nick opens only the morning report._test-review-debt.mjs green at the end.defects verdict records the defect and routes it to the file's owner via STATE.md's defects list; this drive never patches the defective artifact itself (that is the owner's work, and fixing here would make the reviewer a builder). NOT a code-change project — it edits no enforcement code, no guards, no ledger library (a gap found in tooling is reported, never fixed in-lane). NOT the pacer build — kicking stalled drives belongs to full-speed-swarm-drive Step 0.5. NOT a vendor-attribution backfill — the 67 unrecorded-vendor rows get closed as reviews, but fixing vendor attribution at write time stays the separate build item named in MODEL-MATRIX.md. A lane that trips over any of these reports it in STATE.md and moves on.| # | Variable | Value | Alternatives rejected | Class | HOW WE KNOW | Cost if wrong | CONFIRMED |
|---|---|---|---|---|---|---|---|
| 1 | SURFACE — where a human actually sees this drive's outcome | The morning report (walkaway/REPORT.md delivered by the morning surface) | A new dashboard; chat pings per cycle | V1 | Nick set the judging surface himself when he ordered the walk-away system | Work happens where nobody looks; drive is invisible and distrusted | Nick, 2026-08-22, walk-away order + PROPOSAL.md ruling: "He judges from the morning report in week one" |
| 2 | What counts as an OPEN row | An open event with no close sharing its effectiveRunId (derived ids included) | Trusting the brief's count of 71; counting only rows with explicit runIds | V2 | Opened the ledger via its own library | Wrong denominator; 6 rows silently never drained | opened openDebt({olderThanHours:0}) over the ledger, 2026-08-23, saw: 77 unclosed opens (80 opens, 3 closes, 83 rows) |
| 3 | Reviewer ≠ dispatcher is enforced in CODE, not manners | record-review.mjs refuses a close whose --by matches the open row's dispatcher field | Relying on reviewer honesty alone | V2 | Opened the source | Self-graded closes recreate the exact debt being drained | opened record-review.mjs, 2026-08-23, saw: the SELF-GRADING REFUSAL block (walk-away B4) matching dispatcher against --by, exit 2 |
| 4 | Batch size per swarm cycle | ~10 rows per cycle (8 batches over 77 rows) | All 77 in one pass (context blowout); 1 row per cycle (weeks of drift) | V3 | The binding proposal's topology ruling sets batches of ~10 per cycle | A too-big batch dies mid-cycle and loses work; too small never finishes | PROPOSAL.md topology, 2026-08-22/23 build brief: "batches of ~10 rows per cycle" — logged, fork closed |
| 5 | Which model runs which leg | Proof re-runs → DeepSeek V4 (Qwen for long-context rows); verdicts → Sonnet; oversight → Opus | Sonnet doing everything (burns the pool); cheap models issuing verdicts (banned by ruling) | V2 | Opened the assignment authority | Wrong tier = either wasted pool or a cheap self-passing QA | opened projects/ops/walkaway/MODEL-MATRIX.md, 2026-08-23, saw: mechanical row → deepseek, verification-of-worker-output row → Sonnet (Chantelle 2026-08-18 ruling), overseer row → Opus |
Variables considered and ruled non-critical (the denominator): the exact order of batches (oldest-first chosen, logged in ASSUMPTIONS — any order drains the same set); whether the 3 already-closed rows need re-audit (no — closes are outside this drive's scope fence); the drive id string (stable, review-debt-drain, cosmetic beyond registry matching).
| Id | Entry point / state | Input | Output | Failure behaviour |
|---|---|---|---|---|
| U1 | Swarm cycle picks up the drive | STATE.md next-action + current batch | One batch drained; heartbeat beaten | Cycle dies mid-batch → heartbeat goes stale >20 min → pacer flags stalled, kicks, respawns from files |
| U2 | Per-row proof re-run | The row's own proof command (from STATE.md batch table) | Exit code + literal output captured into STATE.md cycle log | Proof UNRUNNABLE → that is a finding, never a pass (Rule 17); row goes to the unrecoverable list with the search that was made |
| U3 | Verdict + close | Re-run result + artifact-on-disk check | record-review.mjs close row (pass/defects, basis in --by) | Close refused (self-grading / no open row) → refusal text logged, row escalated to a different reviewer, never forced |
| U4 | Cycle accounting | Closes this cycle | drive-beat.mjs beat + STATE.md rewritten + REPORT.md block appended | A write fails → retry once, then record the miss in STATE.md; never silently continue |
| U5 | Drive completion | Open count = 0, guard green | drive-beat.mjs complete + final REPORT block | Guard red at the end → drive stays active with the red output as next-action |
| U6 | Defect found by a review | A re-run proof that fails | defects close + a defects-list entry in STATE.md naming the file's owner | Never fixed in-lane (anti-scope); owner routing recorded, not assumed |
One thread (small build, 1–2 lanes running inside each swarm cycle). Single-writer contracts, frozen: STATE.md is written ONLY by the drive overseer · ledger closes happen ONLY through record-review.mjs (a direct append to the JSONL is a contract breach) · REPORT.md is append-only · this drive writes no other file. Reads are unfenced. Contract changes require a dated delta in PLAN-CHANGES.md.
| Lane | Scope (may write) | Model | Definition of done |
|---|---|---|---|
| Proof re-run lane | STATE.md cycle log only (via overseer handback) | DeepSeek V4 (deepseek; Qwen for rows whose proof context exceeds a mechanical brief) | Every row in the batch has its proof re-executed with literal output captured, or is on the unrecoverable list with the search named |
| Verdict lane | Ledger closes via record-review.mjs only | Sonnet | Every proven row closed pass/defects with the basis in --by; reviewer is not the dispatcher |
| Oversight / accounting | STATE.md, REPORT.md, heartbeat | Opus | Batch reconciled, heartbeat beaten, report block appended, next-action rewritten |
A task is DONE only when its review-ledger row is CLOSED by a reviewer that is not the builder — for this drive the dispatcher of a run counts as its builder, so the row's ledger close by a non-dispatcher IS the check, named as such in the CHECKER column. Model identity is unverifiable (record-review.mjs says so itself); the closed-by-a-non-dispatcher ledger row is the binding, measurable criterion.
| Stage | # | Task | EXECUTOR | CHECKER | DONE-PROOF | |||
|---|---|---|---|---|---|---|---|---|
| 1 · prep (once) | 1 | Extract all 77 open-row ids + each row's own proof command (from the ledger row and route-build send logs) into STATE.md's batch tables, oldest first, 8 batches | DeepSeek V4 | Sonnet (verifies the 77-row list matches openDebt output exactly — the ledger close on this task by a non-dispatcher is the check) | node -e "import('./projects/ops/skippy-jobs/lib/outside-review-ledger.mjs').then(m=>console.log(m.openDebt({olderThanHours:0}).length))" prints 77 and every id appears in STATE.md (`command grep -c 'legacy-\ | route-\ | cheap-\ | test-roundtrip' projects/ops/walkaway/drives/review-debt-drain/STATE.md` ≥ 77) |
| 2 · drain (per cycle, ×8) | 2 | Re-run each row's own proof for the current batch (~10 rows); capture literal exit codes and output; unrunnable proofs go to the unrecoverable list with the search named | DeepSeek V4 | Sonnet (checks captured output against the disk, not the worker's claim — Rule 17; its ledger close by a non-dispatcher is the check) | STATE.md cycle log carries one COMMAND/OUTPUT pair per row in the batch, re-runnable via node projects/ops/skippy-jobs/lib/verify-agent-evidence.mjs projects/ops/walkaway/drives/review-debt-drain/STATE.md --cwd . | |||
| 2 · drain (per cycle, ×8) | 3 | Issue the verdict and close each proven row: pass/defects with the basis recorded verbatim | Sonnet | Opus (overseer spot-check per the matrix — a QA that passes everything is no QA; the close itself must be by a non-dispatcher or record-review refuses it) | `node projects/ops/skippy-jobs/lib/record-review.mjs --run <id> --verdict <pass | defects> --by "<reviewer, not the dispatcher>" exits 0 per row; batch delta visible in node projects/ops/walkaway/matrix-evidence.mjs --days 7` | ||
| 2 · drain (per cycle, ×8) | 4 | Cycle accounting: beat the heartbeat with the new open count, rewrite STATE.md (current state only), append the REPORT.md block | Opus | Sonnet (re-reads the three surfaces and confirms the numbers match the ledger — its ledger close by a non-dispatcher is the check) | node projects/ops/walkaway/drive-beat.mjs beat --id review-debt-drain --items <n> exits 0 and command grep -c "review-debt-drain" projects/ops/walkaway/REPORT.md grew by 1 | |||
| 3 · close-out (once) | 5 | Zero-debt verification: full guard run + open-count measured at 0 | Sonnet | Opus (final reconcile; the closing ledger row by a non-dispatcher is the check) | node projects/ops/skippy-jobs/_test-review-debt.mjs exits 0 AND node -e "import('./projects/ops/skippy-jobs/lib/outside-review-ledger.mjs').then(m=>console.log(m.openDebt({olderThanHours:0}).length))" prints 0 | |||
| 3 · close-out (once) | 6 | Mark the drive complete in the registry; final morning-report block naming every closed row's proof | Opus | Fable (architecture/final-review seam per the matrix; verifies the drive row left the active set and the report is complete) | node projects/ops/walkaway/drive-beat.mjs complete --id review-debt-drain exits 0; node projects/ops/walkaway/drive-beat.mjs list shows status "complete" |
| Registry entry | Measure in THIS plan | Where |
|---|---|---|
| A second system was built because the first was invisible | Nothing new built: drains the existing ledger with existing tools; ownership rows cited | §0 |
| A capability was declared impossible from a stale or unverified claim | Every load-bearing count re-measured by quoted command (brief's 71 → measured 77) | §0, §1a row 2 |
| An absence was asserted without opening the store that would hold it | Open counts come only from openDebt() over the ledger itself, command quoted | §6 E1 |
| A known constraint's reason was lost, and it silently capped the product | Reviewer≠dispatcher travels WITH its reason (the B4 self-grading incident) in §3b prose | §3b |
| An instruction assumed capacity the executor doesn't have | Cheap workers get one row's literal proof command per item, batches capped at ~10 | §3, §5 |
| Expectations/manifest rows carried no grounding | Every eval row carries its runnable command | §6 |
| Work was written to a queue no reader ever visits | Closes land in the ledger read by matrix-evidence + the morning report; heartbeat folded into the registry the pacer reads | §5 contract |
| A detector's death was invisible because only its target read it | The pacer watches the heartbeat from OUTSIDE the drive (full-speed-swarm-drive Step 0.5) | §5 |
| A decision settled once re-opened elsewhere, or two copies of a rule disagreed | The batch list lives ONLY in STATE.md; this plan points at it, never copies it | STATE.md |
| A rule constraining the user turned out to be an agent's invention | N/A: no rule touching Nick is created by this drive | — |
| Remediation was ordered with diagnosis last | Each close re-runs the run's own proof BEFORE any verdict is issued | §3b task 2→3 order |
| A document, label, or comment was believed over the live system | Verdicts come from re-executed proofs against disk, never from the row's own claim | §3b |
| A proposal was sold on a capability never opened and read | All tools opened and quoted before planning (§0 inputs receipt) | §0 |
| A cause was named and acted on without eliminating alternatives | N/A: closes record pass/defects, not causes — no causal diagnosis in scope | — |
| The human was asked a question the record already answers | Nothing here asks Nick anything; every variable settled from files or an existing dated ruling | §1a |
| A spec and its guard were authored by the same hand and ratified the same defect | _test-review-debt.mjs predates this plan and is RUN, never edited, by this drive | §1 anti-scope |
| Session rules never reached the subagents doing the work | Worker briefs carry the travel block + the lane fences + the literal proof command | §3 |
| One rule was blanket-applied across items needing per-item answers | Each row gets its own proof re-run and its own verdict; batch verdicts banned | §3b task 3 |
| Pattern-matching scoped too loosely produced false connections | Opens matched to closes by effectiveRunId only — the library's own pairing | §1a row 2 |
| Rules existed but were psychologically dormant at answer-time | The binding criterion is written INTO §3b and machine-gated by check_plan.py | §3b |
| A run exceeded its cost/time ceiling or hung unbounded | ~10 rows per cycle; the $10/night overflow cap already binds (PROPOSAL ruling 2) | §5 |
| A helper was dispatched on a brief with a wrong or missing constraint | Briefs quote the row's literal proof command; one single-purpose task per dispatch | §3 |
| A claim about the user/system was made without its source | Every number in plan/STATE/report carries the command that measured it | throughout |
| A conclusion was drawn from a partial read | Ledger read whole via readRows() (83 rows), never head/tail | §0 |
| A fact was quoted as current without its date | Counts dated 2026-08-23; STATE.md re-measures at every cycle start | STATE.md |
| A computed value never reached the persistent record | Every cycle writes STATE.md + beats the heartbeat + appends the REPORT block | §3b task 4 |
| A missing lookup key fell back silently to a wrong default | Rows without runId get derived legacy-* ids, flagged idDerived — counted, never skipped | §1a row 2 |
| A hardcoded identifier broke when the referent was recreated | Drive id review-debt-drain is stable; row ids are the ledger's own | §5 |
| A placeholder or wrong-level path shipped as a literal instruction | Every done-proof command was executed once at plan time from the repo root | §6 |
| A UI reported success while the backend silently failed | N/A: headless — the morning report quotes ledger rows directly, there is no UI layer | — |
| Mid-session state was assumed unchanged | Open count re-measured at each cycle start, never carried from the previous cycle | STATE.md next-action |
| Uncertainty was silently absorbed instead of marked | Unrecoverable-proof rows go on a named list with the search that was made — never quietly passed | §2 U2 |
| A serial multi-step operation blew its time budget | 8 batches, one per swarm cycle, each independently landable | §5 |
| An external action went unlogged and became unrecoverable | Every close is itself a ledger append; beats/kicks logged by drive-beat | §5 |
| A tool's own description contradicted house reality and won | N/A: no external tool descriptions consumed; all commands are house scripts read first | — |
| Personal/identifying data exposed, or a record written to the wrong subject | N/A: ledger rows are build metadata; no personal records touched, data floor untouched | — |
| One instance of a defect class was fixed while its siblings stayed broken | The drain covers ALL 77 rows; denominator pinned in STATE.md's header | STATE.md |
| A read operation mutated state | Proof re-runs are guard/test commands; anything that would mutate is fenced out of the lane | §3 |
| The three biggest absence-claims variants: empty result, broken probe, discarded | UNRUNNABLE is a finding, not a pass; the search behind any "missing proof" is named | §2 U2 |
| A generated mirror was hand-edited, or its generator never re-ran | N/A: no generated mirrors touched; REPORT.md is append-only history by design | — |
| Deployed config silently diverged from source config | N/A: no deploys, no config changes (anti-scope) | — |
| A delivery path was reordered and its notification behavior changed | N/A: no delivery path is altered; the morning-report path is used as-is | — |
| A critical boundary was config-editable and could be silently widened | This drive edits no enforcement code — the refusal stays exactly as shipped | §1 anti-scope |
| A "growing" archive had actually frozen | A cycle with 0 closes and no stated blocker is drift; the pacer's flat-items detection catches it | §5, §6 E4 |
| Files were archived but their citations kept pointing at them | N/A: nothing archived by this drive | — |
| A pipeline broke silently and looked identical to a working one | Heartbeat staleness >20 min flips the row to stalled and writes the finding into STATE.md | §5 |
| Output was delivered somewhere the intended reader never looks | Surface settled as V1 by Nick's own ruling: the morning report | §1a row 1 |
| Concurrent sessions clobbered each other's work in a shared file | Single writer per file (frozen contract); ledger is append-only JSONL; registry writes atomic | §3 |
| An enforcement gate covered fewer paths than its rule, or failed open | Closes go ONLY through record-review.mjs; a direct JSONL append is a named contract breach | §3 |
| Identity or authority was read from a value the caller supplies | Named limit: --by is self-declared; mitigations = dispatcher-field refusal + Opus spot-check | §3b task 3 |
| A new failure state was detected but reached no human | Stalls are kicked by the pacer; a genuinely 1000%-stuck drive raises via raise-signal (needs-nick), else quiet records | §5 |
| The builder graded its own work and passed it | Reviewer ≠ dispatcher enforced in code (refusal, exit 2) + Sonnet-tier ruling | §3b, §1a row 3 |
| A check existed that could not fail | _test-review-debt.mjs proven able to fail (triad v2 §3); check_plan proven red by 28 selftest sabotages | §6 E3 |
| The review didn't cover the shipped artifact | The close re-runs the run's OWN proof against the artifact on disk | §3b task 2 |
| A narrowing/refactoring change broke the cases that were already correct | N/A: this drive changes no code (anti-scope) | — |
| A check's verdict depended on wall-clock, machine load, or a concurrent writer | openDebt({olderThanHours:0}) is deterministic over the file; counts quoted with command | §6 E1 |
| A test existed but nothing ran it | The guard sits in the skippy-jobs nightly _test-* glob AND runs per cycle here | §6 E3 |
| An interactive element or view shipped untested / unseen | N/A: headless, nothing interactive produced | — |
| Coverage was reported optimistically | Denominator pinned at 77 in STATE.md's header; only ledger-recorded closes count | STATE.md |
| A staleness/freshness check used the wrong proxy | Staleness = heartbeat timestamp arithmetic (drive-beat), plus the pacer's flat-items check | §5 |
| A quantitative claim shipped without its method | Every number carries its measuring command — plan, STATE, report | throughout |
| Done was declared before the live surface was checked | Drive-done requires guard green + measured count 0 + the report block present on the real surface | §6 E5 |
| A biometric/metric overrode the human's stated reality | N/A: no health or human-state content in scope | — |
| A correlation was asserted as a cause | N/A: no causal claims made; verdicts are proof re-runs | — |
| A nuanced reality was collapsed into a clean binary | Verdict basis recorded verbatim in --by; unrecoverable rows get their own category, not a forced pass/fail | §3b task 3, §2 U2 |
| A recommendation repeated something already tried, uncited | N/A: no recommendations to Nick in this drive | — |
| A wrong record was disclaimed instead of corrected | A defect verdict creates a routed defects-list entry for the owner — never a disclaimer on a pass | §2 U6 |
| Open items were re-typed from memory and drifted | STATE.md batch list generated from openDebt() output, verified 1:1 by task 1's checker | §3b task 1 |
| A deliverable was referenced instead of delivered | N/A: no human deliverable; the report line IS the surface and is appended directly | — |
| A report used names/shorthand only the writer understood | Report blocks explain the drive in plain words each time (4D rules bind the morning surface) | §5 |
| Commands were sent to a surface that can't run them | All commands run on this Mac's checkout; each executed once at plan time | §6 |
| A number was published without the population it was counted over | Counts name their population: unclosed opens via effectiveRunId over the whole ledger | §6 E1 |
| A finding existed only in the session's output and died with it | Everything lands in ledger/STATE/REPORT files — session death loses nothing (the walk-away contract) | §5 |
| The plan named a target with total precision, and the target was wrong | §1a V2 rows opened the actual stores; the brief's own number was corrected against the store | §1a |
| The human approved a summary, and the summary was silent on the deciding variable | No approval sought (nothing in the four classes); §1a IS the sheet source, generated not summarised | §1a |
| A project stated its scope and never its anti-scope, and lanes leaked into adjacent work | Anti-scope names four exclusions with reasons, each with the trip-over behaviour | §1 |
| A new rule was written as prose inside its own fix, with nothing enforcing it | Every rule leaned on here is already code-enforced: refusal, plan gate, staleness check | §3b, §5 |
| A confirmation was satisfied by checking the wrong kind of fact | Surface classed V1 (person), stores classed V2 (opened) — routed by kind | §1a |
| A blocker common to every lane was carved out of all of them and given to nobody | Unrecoverable-proof rows are owned by the verdict lane by name, never dropped between lanes | §2 U2, §3 |
| Lanes were built to stop: one pass, land, idle — while fixed ceremony ate the context | Continuation cadence in every brief: finish a row → take the next; land only on the honest reasons | §5 |
| A caveat nobody measured travelled as fact through multiple independent lanes | The "model identity is unverifiable" caveat carries its source (record-review.mjs's own text) | §3b |
| The environment destroyed work silently, and the lane wrote a wrong lesson from it | Registry writes are atomic (drive-beat writeAtomic); STATE.md single-writer; git commit at seams | §3, §5 |
| A specification described ONE lifecycle in several places, and the copies drifted | The row lifecycle (open→close) is defined once, in outside-review-ledger.mjs; this plan points at it | §3b |
| A task brief on an existing project was treated as the plan | This PLAN.md was written and gated BEFORE work; the brief's numbers were re-measured, and it sits below this plan | §0 |
| A regression test's "red-proof" failed for a reason unrelated to its claim | Red-proofs here assert the NAMED failure (check_plan selftest pattern; guard failure modes named) | §6 E3 |
| A standing instruction to route work to an outside/cheap engine eroded | Executors are named per task from the matrix; weekly matrix correction measures drift from ledger rows | §3b |
| A plan's own second line named a different document as the authority, unopened | Every named authority was opened: PROPOSAL.md, MODEL-MATRIX.md, SKILL.md, the four scripts | §0 |
| A live bug got three consecutive confident wrong-or-unproven diagnoses | N/A: no live-bug diagnosis in scope — verdicts are re-run proofs, not diagnoses | — |
| Fourteen guards stayed green all day while the live screen showed the wrong thing | E5 checks the surface itself (the report block present in REPORT.md), not only the guards | §6 E5 |
| An agent was accused of fabricating its report because a narrow search failed | Before calling any row's proof missing, the send/route-build logs are searched and the search is named in the close | §3b task 2 |
| A tool's failure verdict was believed without checking the disk | After each re-run, the verdict is cross-checked against disk state (Rule 17 sibling, named in the checker column) | §3b task 2 |
One overseer pass per swarm cycle (the drive is one thread inside full-speed-swarm-drive's cycle — no new scheduled task, per the fleet ruling). Workers per the model matrix. Batches of ~10 rows per cycle. No single choke point beyond the cycle itself: if the cycle dies, the pacer respawns a fresh overseer briefed from PLAN.md + STATE.md alone.
| Stage | Overseer (Opus) | Sub-overseers | Workers |
|---|---|---|---|
| 1 · prep | 1 | 0 | 1 (DeepSeek V4 extraction) + 1 Sonnet checker = 2 |
| 2 · drain, per cycle ×8 | 1 | 0 | 3 (2 cheap proof-runners + 1 Sonnet verdict reviewer) |
| 3 · close-out | 1 | 0 | 2 (1 Sonnet zero-debt verifier + 1 Fable final reviewer) |
The walk-away contract (all three live before the first cycle — a stranger resumes this drive from files alone):
projects/ops/walkaway/drives/review-debt-drain/STATE.md — current state only, rewritten every cycle; the respawn briefing.review-debt-drain — registered via drive-beat.mjs into work-drives-<machine>.json, folded into the work-threads registry by the work-watch daemon (SOURCE 5, every ~120s); the pacer reads it each ~10-min cycle and kicks stalls >20 min.review-debt-drain block appended to projects/ops/walkaway/REPORT.md every cycle (closes with their proofs, kicks, open count), joined by morning-line.mjs into the morning surface Nick reads.Consumers named: the pacer (staffed: the enabled full-speed-swarm-drive task) consumes the heartbeat; Nick consumes the morning report (his own ruling, §1a row 1); a respawned overseer consumes STATE.md.
| Id | Capability | Check (runnable) | Pass condition |
|---|---|---|---|
| E1 | Open count is measurable and shrinking | node -e "import('./projects/ops/skippy-jobs/lib/outside-review-ledger.mjs').then(m=>console.log(m.openDebt({olderThanHours:0}).length))" | Prints an integer; strictly lower after every drain cycle; 0 at drive completion. Population: unclosed opens via effectiveRunId over the whole ledger |
| E2 | Self-grading is refused in code | node projects/ops/skippy-jobs/lib/record-review.mjs --run <open-id-with-dispatcher> --verdict pass --by "<that same dispatcher>" | Exit 2 with the refusal message — proven red before any close is trusted |
| E3 | The guard can fail and is run | node projects/ops/skippy-jobs/_test-review-debt.mjs | Exits 0 on a healthy ledger; its red-capability is on record (triad v2 §3) and it sits in the nightly _test-* glob |
| E4 | The drive is visible to the pacer | node projects/ops/walkaway/drive-beat.mjs list then command grep -c "review-debt-drain" projects/personal/skippy-app/ala-state/work-threads-*.json | The registry row exists with a fresh heartbeat; the fold shows ≥1 hit within ~150s of registration |
| E5 | The morning surface carries the outcome | command grep -c "review-debt-drain" projects/ops/walkaway/REPORT.md | ≥1 after the first cycle; grows by 1 per cycle; the final block names every closed row's proof |
PLAN-CHANGES.md: none yet — created on first contract or scope change. ASSUMPTIONS.md logged inline: batch order oldest-first (any order drains the same set); rows whose dispatcher field is absent close under the warning path per record-review's own never-fail-closed-on-missing-history rule.
Source: /Users/nickdeck/Documents/Claude/projects/ops/walkaway/drives/review-debt-drain · generator: projects/ops/project-status-page.py — reads only, never grades.