Review-debt drain

Regenerated from the project's own files. Reads current state; grades nothing; never hand-edited.

Live, right now

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.

ran okOpen review debt (live count — never read this out of STATE.md's prose) · 2026-08-23T14:20:18Z
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
ran okReview-debt guard suite · 2026-08-23T14:20:18Z
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

STATE — Review-debt drain

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.

Where it stands — measured 2026-08-23T10:28:06Z (pacer cycle 5, re-measured at write time)

🔴 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:

runIdverdictbasis (re-run in a fresh shell this pass)
cheap-1787478992360-ho6mmbpassproof 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-ufn626passproof 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-z8eqk2defectsproof 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-03lxw3defectsproof 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.

Where it stands — measured 2026-08-23T09:59Z (pacer cycle 4, re-measured at write time)

🔴 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.

What cycle 4 did

Drained everything that was drainable, then removed one row that should never have been debt:

rowverdictbasis
route-1787476164072-rz9u1zpassown proof re-run in a fresh shell, literal EXIT_B=0
route-1787476177220-10q4qdpassown proof re-run in a fresh shell, literal EXIT_C=0
cheap-1787476289083-p7fgvupassown proof re-run, literal EXIT_D=0
cheap-1787476607049-5vx8iapassown proof re-run, literal EXIT_E=0
test-roundtrip-001pass (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 inferred

It 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:

🔴 CYCLE 4's FINDING — this is the one that changes the decision

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:

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.

NEXT ACTION — one decision, and it is not the pacer's to make

The three honest options, unchanged from cycle 3 and now backed by the field-level measurement above:

  1. Close all 31 with the basis recorded verbatim as "pre-fix row: the ledger records no file, no task and no proof, so there is nothing to review" — same shape as the test-roundtrip-001 close above, which is the precedent. Fast, honest, and the record survives in each --by string.
  2. Add an explicit pre-fix exemption to the guard so it stops counting rows written before the proof-recording fix. This is a change to something unattended, so it needs the triad and a regression artefact before it ships.
  3. Let the guard go red at 15:54Z and treat that as a true signal.

🔴 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.

✅ CYCLE 4's RECORDS — COLD-CHECKED, INDEPENDENT (DeepSeek, 2026-08-23T09:56Z)

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:

🔴 Two rows this cycle may NOT close, and the reason is structural, not an oversight:

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.

What the verdict lane actually found — the 8 genuine defects

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.

The rows still open — the 31 pre-fix rows below, plus 4 others

🔴 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.

B · Proof UNRECOVERABLE — cut off by the send log's own 300-character cap (21)

_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._

idfile the run touchedproof as far as the log kept it
legacy-route-build-2026-08-22T15:54:14.307Zprojects/ops/skippy-jobs/lib.mjsnode -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.030Zprojects/personal/family-app/sw.jstest $(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.707Zprojects/personal/health/intake/_build_nick_intake_v2.mjsnode -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.305Zprojects/personal/family-app/js/actions.jsgrep -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.295Zprojects/personal/family-app/js/updates.jsgrep -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.882Zprojects/personal/family-app/js/panel.jsnode --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.224Zprojects/personal/family-app/js/panel.jsnode --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.718Zprojects/personal/family-app/js/panel.jsnode --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.259Zprojects/personal/family-app/js/panel.jsnode --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.243Zprojects/personal/family-app/js/panel.jsnode --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.197Zprojects/personal/skippy-app/skippy-code/ops/test-neeko-scope.mjsnode --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.136Zprojects/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.398Zprojects/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.006Zprojects/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.702Zprojects/ops/artifacts/skills-library/index.htmlgrep -q 'one workflow script per pass' projects/ops/artifacts/skills-library/index.html &amp;&amp; grep -q 'test sheet' projects/ops/artifacts/skills-library/index.html &amp;&amp; grep -q 'with a separate checker on every piece' projects/ops/artifacts/skills-library/index.html &amp;&amp; ! grep -q '&lt;&lt;&lt;' proje
route-1787444202821-dyyymlprojects/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-voi8nxprojects/ops/artifacts/skills-library/index.htmlgrep -q 'design-taste-frontend-v1","full-output-enforcement' projects/ops/artifacts/skills-library/index.html &amp;&amp; grep -q '"design-taste-frontend": {' projects/ops/artifacts/skills-library/index.html &amp;&amp; grep -q '"full-output-enforcement": {' projects/ops/artifacts/skills-library/index.h
route-1787447247444-io6q28projects/ops/skippy-jobs/grade-skill-evals.mjsnode -e "const m = require('fs').readFileSync('projects/ops/skippy-jobs/grade-skill-evals.mjs','utf8'); if(!m.includes('truncated: full.length &gt; MAX_EXCERPT_CHARS')) throw 'missing truncated flag'; if(!m.includes('MUST be \"unknown\" on a truncated excerpt')) throw 'missing system prom
route-1787447585831-0cjmy6projects/ops/skippy-jobs/grade-skill-evals.mjsnode --check projects/ops/skippy-jobs/grade-skill-evals.mjs &amp;&amp; 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-sjq7hpprojects/ops/skippy-jobs/jobs/work-watch.mjsnode --check projects/ops/skippy-jobs/jobs/work-watch.mjs &amp;&amp; command grep -q "SOURCE 5: walk-away drives" projects/ops/skippy-jobs/jobs/work-watch.mjs &amp;&amp; command grep -q "SOURCE 4: agents asking" projects/ops/skippy-jobs/jobs/work-watch.mjs &amp;&amp; test $(wc -l &lt; projects/ops/skippy-jobs/jo
route-1787454595741-frcuxaprojects/ops/skippy-jobs/jobs/work-watch.mjsnode --check projects/ops/skippy-jobs/jobs/work-watch.mjs &amp;&amp; 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

C · ~~Proof UNRECOVERABLE — no proof line was ever written~~ 🔴 DISPROVED 2026-08-23 — ALL TEN WERE RECOVERABLE AND ALL TEN WERE GRADED

🔴 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.log ONLY. A second log exists and nobody had searched itprojects/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.txt and projects/ops/_pass12b-insert.mjs, and neither file exists on disk. Those two run ids are exactly the two closed defects.

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>

(retired) Proof UNRECOVERABLE — no proof line was ever written (10)

_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._

idtool that opened itopened at
test-roundtrip-001test-worker2026-08-22T15:42:14.651Z
cheap-1787418626698-mlo0h7cheap-task2026-08-22T17:10:26.699Z
cheap-1787419555747-jm9yircheap-task2026-08-22T17:25:55.748Z
cheap-1787436158709-752djtcheap-task2026-08-22T22:02:38.710Z
cheap-1787439252445-fy3hcwcheap-task2026-08-22T22:54:12.446Z
cheap-1787439372553-wfmpcrcheap-task2026-08-22T22:56:12.553Z
cheap-1787443509203-5mlzufcheap-task2026-08-23T00:05:09.204Z
cheap-1787444263444-w5v7bucheap-task2026-08-23T00:17:43.445Z
cheap-1787446900034-eql8wccheap-task2026-08-23T01:01:40.035Z
cheap-1787448643014-dk7vsxcheap-task2026-08-23T01:30:43.015Z

</details>

Standing rules for whoever picks this up

⚡ KICK — 2026-08-23T09:5xZ (pacer cycle 4): drive session dead (session_id null) 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:1030 calls openDebt against the REAL ledger path inside checkProductionDebt(), and jobs/test-suite-runner.mjs globs _test-*.mjs in 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 · exit 0. 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.mjs globs _test-*.mjs in 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 and shardById(2).job = test-suite-runner-b (lib/suite-shards.mjs), and runner.mjs:637 schedules test-suite-runner-b at hours [5] minute 10. So the watcher is jobs/test-suite-runner-b.mjs at 05:10, not the 04:10 test-suite-runner run. ✅ 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 at REBUILD-RECORD.md (~line 5120) and in CHANGELOG.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

Plan (PLAN.md) — the goal and scope this state is measured against

PLAN — Review-debt drain (the first walk-away drive)

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.

0 · Gate Zero receipts

1 · Goal and definition of done

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.

1a · Critical variables (the confirmation-sheet source table)

#VariableValueAlternatives rejectedClassHOW WE KNOWCost if wrongCONFIRMED
1SURFACE — where a human actually sees this drive's outcomeThe morning report (walkaway/REPORT.md delivered by the morning surface)A new dashboard; chat pings per cycleV1Nick set the judging surface himself when he ordered the walk-away systemWork happens where nobody looks; drive is invisible and distrustedNick, 2026-08-22, walk-away order + PROPOSAL.md ruling: "He judges from the morning report in week one"
2What counts as an OPEN rowAn open event with no close sharing its effectiveRunId (derived ids included)Trusting the brief's count of 71; counting only rows with explicit runIdsV2Opened the ledger via its own libraryWrong denominator; 6 rows silently never drainedopened openDebt({olderThanHours:0}) over the ledger, 2026-08-23, saw: 77 unclosed opens (80 opens, 3 closes, 83 rows)
3Reviewer ≠ dispatcher is enforced in CODE, not mannersrecord-review.mjs refuses a close whose --by matches the open row's dispatcher fieldRelying on reviewer honesty aloneV2Opened the sourceSelf-graded closes recreate the exact debt being drainedopened record-review.mjs, 2026-08-23, saw: the SELF-GRADING REFUSAL block (walk-away B4) matching dispatcher against --by, exit 2
4Batch 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)V3The binding proposal's topology ruling sets batches of ~10 per cycleA too-big batch dies mid-cycle and loses work; too small never finishesPROPOSAL.md topology, 2026-08-22/23 build brief: "batches of ~10 rows per cycle" — logged, fork closed
5Which model runs which legProof re-runs → DeepSeek V4 (Qwen for long-context rows); verdicts → Sonnet; oversight → OpusSonnet doing everything (burns the pool); cheap models issuing verdicts (banned by ruling)V2Opened the assignment authorityWrong tier = either wasted pool or a cheap self-passing QAopened 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).

2 · UX map (headless — every entry point, input shape, output shape, failure behaviour)

IdEntry point / stateInputOutputFailure behaviour
U1Swarm cycle picks up the driveSTATE.md next-action + current batchOne batch drained; heartbeat beatenCycle dies mid-batch → heartbeat goes stale >20 min → pacer flags stalled, kicks, respawns from files
U2Per-row proof re-runThe row's own proof command (from STATE.md batch table)Exit code + literal output captured into STATE.md cycle logProof UNRUNNABLE → that is a finding, never a pass (Rule 17); row goes to the unrecoverable list with the search that was made
U3Verdict + closeRe-run result + artifact-on-disk checkrecord-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
U4Cycle accountingCloses this cycledrive-beat.mjs beat + STATE.md rewritten + REPORT.md block appendedA write fails → retry once, then record the miss in STATE.md; never silently continue
U5Drive completionOpen count = 0, guard greendrive-beat.mjs complete + final REPORT blockGuard red at the end → drive stays active with the red output as next-action
U6Defect found by a reviewA re-run proof that failsdefects close + a defects-list entry in STATE.md naming the file's ownerNever fixed in-lane (anti-scope); owner routing recorded, not assumed

3 · Lanes and frozen contracts

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.

LaneScope (may write)ModelDefinition of done
Proof re-run laneSTATE.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 laneLedger closes via record-review.mjs onlySonnetEvery proven row closed pass/defects with the basis in --by; reviewer is not the dispatcher
Oversight / accountingSTATE.md, REPORT.md, heartbeatOpusBatch reconciled, heartbeat beaten, report block appended, next-action rewritten

3b · Execution map

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#TaskEXECUTORCHECKERDONE-PROOF
1 · prep (once)1Extract 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 batchesDeepSeek V4Sonnet (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=&gt;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)2Re-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 namedDeepSeek V4Sonnet (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)3Issue the verdict and close each proven row: pass/defects with the basis recorded verbatimSonnetOpus (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 <passdefects> --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)4Cycle accounting: beat the heartbeat with the new open count, rewrite STATE.md (current state only), append the REPORT.md blockOpusSonnet (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 &lt;n&gt; exits 0 and command grep -c "review-debt-drain" projects/ops/walkaway/REPORT.md grew by 1
3 · close-out (once)5Zero-debt verification: full guard run + open-count measured at 0SonnetOpus (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=&gt;console.log(m.openDebt({olderThanHours:0}).length))" prints 0
3 · close-out (once)6Mark the drive complete in the registry; final morning-report block naming every closed row's proofOpusFable (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"

4 · Regret Check (all 91 registry entries)

Registry entryMeasure in THIS planWhere
A second system was built because the first was invisibleNothing new built: drains the existing ledger with existing tools; ownership rows cited§0
A capability was declared impossible from a stale or unverified claimEvery 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 itOpen 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 productReviewer≠dispatcher travels WITH its reason (the B4 self-grading incident) in §3b prose§3b
An instruction assumed capacity the executor doesn't haveCheap workers get one row's literal proof command per item, batches capped at ~10§3, §5
Expectations/manifest rows carried no groundingEvery eval row carries its runnable command§6
Work was written to a queue no reader ever visitsCloses 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 itThe 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 disagreedThe batch list lives ONLY in STATE.md; this plan points at it, never copies itSTATE.md
A rule constraining the user turned out to be an agent's inventionN/A: no rule touching Nick is created by this drive
Remediation was ordered with diagnosis lastEach 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 systemVerdicts 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 readAll tools opened and quoted before planning (§0 inputs receipt)§0
A cause was named and acted on without eliminating alternativesN/A: closes record pass/defects, not causes — no causal diagnosis in scope
The human was asked a question the record already answersNothing 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 workWorker briefs carry the travel block + the lane fences + the literal proof command§3
One rule was blanket-applied across items needing per-item answersEach row gets its own proof re-run and its own verdict; batch verdicts banned§3b task 3
Pattern-matching scoped too loosely produced false connectionsOpens matched to closes by effectiveRunId only — the library's own pairing§1a row 2
Rules existed but were psychologically dormant at answer-timeThe 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 constraintBriefs quote the row's literal proof command; one single-purpose task per dispatch§3
A claim about the user/system was made without its sourceEvery number in plan/STATE/report carries the command that measured itthroughout
A conclusion was drawn from a partial readLedger read whole via readRows() (83 rows), never head/tail§0
A fact was quoted as current without its dateCounts dated 2026-08-23; STATE.md re-measures at every cycle startSTATE.md
A computed value never reached the persistent recordEvery cycle writes STATE.md + beats the heartbeat + appends the REPORT block§3b task 4
A missing lookup key fell back silently to a wrong defaultRows without runId get derived legacy-* ids, flagged idDerived — counted, never skipped§1a row 2
A hardcoded identifier broke when the referent was recreatedDrive id review-debt-drain is stable; row ids are the ledger's own§5
A placeholder or wrong-level path shipped as a literal instructionEvery done-proof command was executed once at plan time from the repo root§6
A UI reported success while the backend silently failedN/A: headless — the morning report quotes ledger rows directly, there is no UI layer
Mid-session state was assumed unchangedOpen count re-measured at each cycle start, never carried from the previous cycleSTATE.md next-action
Uncertainty was silently absorbed instead of markedUnrecoverable-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 budget8 batches, one per swarm cycle, each independently landable§5
An external action went unlogged and became unrecoverableEvery close is itself a ledger append; beats/kicks logged by drive-beat§5
A tool's own description contradicted house reality and wonN/A: no external tool descriptions consumed; all commands are house scripts read first
Personal/identifying data exposed, or a record written to the wrong subjectN/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 brokenThe drain covers ALL 77 rows; denominator pinned in STATE.md's headerSTATE.md
A read operation mutated stateProof 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, discardedUNRUNNABLE 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-ranN/A: no generated mirrors touched; REPORT.md is append-only history by design
Deployed config silently diverged from source configN/A: no deploys, no config changes (anti-scope)
A delivery path was reordered and its notification behavior changedN/A: no delivery path is altered; the morning-report path is used as-is
A critical boundary was config-editable and could be silently widenedThis drive edits no enforcement code — the refusal stays exactly as shipped§1 anti-scope
A "growing" archive had actually frozenA 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 themN/A: nothing archived by this drive
A pipeline broke silently and looked identical to a working oneHeartbeat staleness >20 min flips the row to stalled and writes the finding into STATE.md§5
Output was delivered somewhere the intended reader never looksSurface settled as V1 by Nick's own ruling: the morning report§1a row 1
Concurrent sessions clobbered each other's work in a shared fileSingle 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 openCloses 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 suppliesNamed limit: --by is self-declared; mitigations = dispatcher-field refusal + Opus spot-check§3b task 3
A new failure state was detected but reached no humanStalls 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 itReviewer ≠ 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 artifactThe 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 correctN/A: this drive changes no code (anti-scope)
A check's verdict depended on wall-clock, machine load, or a concurrent writeropenDebt({olderThanHours:0}) is deterministic over the file; counts quoted with command§6 E1
A test existed but nothing ran itThe guard sits in the skippy-jobs nightly _test-* glob AND runs per cycle here§6 E3
An interactive element or view shipped untested / unseenN/A: headless, nothing interactive produced
Coverage was reported optimisticallyDenominator pinned at 77 in STATE.md's header; only ledger-recorded closes countSTATE.md
A staleness/freshness check used the wrong proxyStaleness = heartbeat timestamp arithmetic (drive-beat), plus the pacer's flat-items check§5
A quantitative claim shipped without its methodEvery number carries its measuring command — plan, STATE, reportthroughout
Done was declared before the live surface was checkedDrive-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 realityN/A: no health or human-state content in scope
A correlation was asserted as a causeN/A: no causal claims made; verdicts are proof re-runs
A nuanced reality was collapsed into a clean binaryVerdict 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, uncitedN/A: no recommendations to Nick in this drive
A wrong record was disclaimed instead of correctedA 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 driftedSTATE.md batch list generated from openDebt() output, verified 1:1 by task 1's checker§3b task 1
A deliverable was referenced instead of deliveredN/A: no human deliverable; the report line IS the surface and is appended directly
A report used names/shorthand only the writer understoodReport 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 themAll commands run on this Mac's checkout; each executed once at plan time§6
A number was published without the population it was counted overCounts 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 itEverything 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 variableNo 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 workAnti-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 itEvery 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 factSurface 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 nobodyUnrecoverable-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 contextContinuation 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 lanesThe "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 itRegistry 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 driftedThe 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 planThis 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 claimRed-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 erodedExecutors 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, unopenedEvery 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 diagnosesN/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 thingE5 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 failedBefore 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 diskAfter each re-run, the verdict is cross-checked against disk state (Rule 17 sibling, named in the checker column)§3b task 2

5 · Topology, roles, and the walk-away contract

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.

StageOverseer (Opus)Sub-overseersWorkers
1 · prep101 (DeepSeek V4 extraction) + 1 Sonnet checker = 2
2 · drain, per cycle ×8103 (2 cheap proof-runners + 1 Sonnet verdict reviewer)
3 · close-out102 (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):

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.

6 · Evals — pass/fail, defined before the work

IdCapabilityCheck (runnable)Pass condition
E1Open count is measurable and shrinkingnode -e "import('./projects/ops/skippy-jobs/lib/outside-review-ledger.mjs').then(m=&gt;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
E2Self-grading is refused in codenode projects/ops/skippy-jobs/lib/record-review.mjs --run &lt;open-id-with-dispatcher&gt; --verdict pass --by "&lt;that same dispatcher&gt;"Exit 2 with the refusal message — proven red before any close is trusted
E3The guard can fail and is runnode projects/ops/skippy-jobs/_test-review-debt.mjsExits 0 on a healthy ledger; its red-capability is on record (triad v2 §3) and it sits in the nightly _test-* glob
E4The drive is visible to the pacernode projects/ops/walkaway/drive-beat.mjs list then command grep -c "review-debt-drain" projects/personal/skippy-app/ala-state/work-threads-*.jsonThe registry row exists with a fresh heartbeat; the fold shows ≥1 hit within ~150s of registration
E5The morning surface carries the outcomecommand 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.