The actual documents the agents read and work from, shown exactly as they are on disk — not a summary. See the progress view instead · All projects
# PLAN.md — THE GOAL PURGE: retire and archive everything that is not Skippy, the voice app, or the business Hub
**NORTH STAR:** A future agent — or Nick — opening this workspace finds only three live bodies of work: Skippy (with the voice app), and the business Hub. Everything else is archived intact, findable, marked as retired or parked, with no live pointer left anywhere that could pull an agent back into it. Nick's words, 2026-09-04: *"The only thing I want to do is finish the hub and finish Skippy in the voice app. That's all I care about... retire literally everything else... archive anything that's not related to our core goals. So there's no way to go and get lost in this stuff. And then while we're at it, just clean up the ecosystem."*
**FINISH LINE** (written now; the bar never rises mid-drive — when these pass, this plan is DONE and everyone stops):
1. Every row of the §1c inventory (30 items) carries an executed disposition — KEEP · FOLD · PARK · RETIRE-ARCHIVE · DEFER — with its step's proof pasted in `## STEPS`.
2. Every RETIRE-ARCHIVE'd document sits under `projects/_archive/goal-purge-2026-09-04/` with structure preserved, a retirement banner, and zero deletions.
3. No scheduled job fires for a retired capability (disabled-frontmatter proven, plus one kept job proven still firing as the control), and no live family- or Hub-facing job was touched.
4. A two-way search (content grep + suffix-aware filename sweep, both named) finds zero live-surface pointers presenting retired work as live, and a cold checker session that built none of this agrees.
5. `python3 projects/ops/agents/check_plan.py` run against this very file prints PASS, and the postmortem step is written into this file.
6. **The whole folder ecosystem has been audited, not just the named lanes** — every file created during the recent drives has a disposition (KEEP with a named owner · ARCHIVE · already covered by a row above), the KEEP set is written down as the answer to "what actually needs to stay", and the vast majority of the rest is archived. Nick, 2026-09-04: *"we need to treat is as a formal audit for the whole folder ecosystem - during the last several drives we had agents creating files left and right - we need to define what really needs to stay and archive the vast majority of other stuff"*.
**NOTHING IS DELETED BY THIS PLAN.** Irreversible destruction is one of Nick's four approval classes. Every disposition here is a move, a status edit, or a reversible frontmatter switch. No genuine deletion was found necessary; if one ever appears mid-drive it goes to Nick as its own question, never into a step.
**THE PURGE/ARCHIVE TENSION, RESOLVED (read before executing anything):** Nick said "purge" and "archive" in the same breath. Measured tonight: the word "gracie" alone appears 42,968 times across 6,280 files (method: repo-wide case-insensitive content grep, 2026-09-04). Purging every *mention* is therefore impossible and wrong — most mentions are history, logs, and ledgers, which are records, not invitations. What actually gets a future agent lost is a LIVE POINTER: a plan lane that reads open, a board card, a scheduled job, an index row, a canon-table entry. So: **the work is archived intact; the live pointers are purged.** Historical mentions in logs, changelogs, ledgers, memory files and archives stay untouched.
## Already true (the distilled past — facts, not story)
- The workspace already has one archive convention: dated folders under `projects/_archive/` with source-relative structure preserved (the SP programme went there on 2026-08-30) — evidence: `ls projects/_archive/` shows `sp-programme-retired-2026-08-30` and the SMP manifest's `smp-programme-retired-2026-08-30` naming.
- ZION-8 (approvals) is complete and Nick repointed it as the security click-gate — evidence: Nick, 2026-09-04, "zion 8 is done 100% so make it the security gate now" (`projects/ops/REGROUP-SOURCE-2026-09-04.md` §A12).
- 🔴 CORRECTED 2026-09-04 (STEP 15, on Nick's second hand-off "One live document per active project. Everything else is either archived or gone."): the SMP programme is NOT live — its index, ten lane plans, changes files, hand-off prompts, tracker, postmortems, close tooling and three lane folders were archived intact under `projects/_archive/goal-purge-2026-09-04/projects/ops/skippy-master-plan/` and `…/projects/ops/`; `projects/ops/skippy-master-plan/PLAN-SKIPPY-FINISH.md` (with its STATE and PLAN-CHANGES companions and its evidence folder) is the ONLY live plan for Skippy and the voice app. The line below is kept as what this plan believed at planning time.
- The SMP programme (ten lanes) IS the Skippy + voice + Hub + channels build and stays live — evidence: `projects/_archive/goal-purge-2026-09-04/projects/ops/skippy-master-plan/PLAN-SMP-PROGRAMME.md` §1b root table.
- ZION-17's work belongs to the Hub — evidence: Nick, 2026-09-04, "pm noard enforcement gets wrapped in tot he hub work" (§A12).
- Neeko and the shopping gate have real scheduled-job files on disk today — evidence: `ls projects/ops/skippy-jobs/jobs/` shows `neeko-daily-review-run.mjs`, `neeko-project-doc-sweep-run.mjs`; `projects/ops/skippy-jobs/lib/shopping-agent-add.mjs` exists.
- The wider-Alexa ambition lives at `projects/_archive/goal-purge-2026-09-04/projects/personal/skippy-app/ALEXA-ACCESS-SPEC.md`; the Alexa CHANNEL adapter is SMP-10 and is kept — evidence: suffix-aware glob for `ALEXA-ACCESS-SPEC*` (one live copy plus worktree copies) and the SMP root table.
- The live failure registry holds 167 entries — evidence: `command grep -c '^|' .claude/skills/plan/references/failure-registry.md` returns 199, minus 16 separators and 16 headers, counted 2026-09-04.
## 0 · Gate Zero receipts (the plan may not exist without these)
- Failure Mode Registry loaded: 2026-09-04, 167 entries (199 pipe rows − 16 separators − 16 headers in `.claude/skills/plan/references/failure-registry.md`); all 167 covered in §4, plus two novel rows.
- Canonical specs loaded: the plan doctrine `.claude/skills/plan/SKILL.md` (including the new §W many-sessions-one-checkout and §Z empty-result rules, re-read 2026-09-04) and its template; `projects/ops/MACHINE-RULES.md`; `projects/ops/PROMPT-SPEC.md` (7-row table); `projects/ops/REGROUP-SOURCE-2026-09-04.md` §A12/§A13 and its KEPT list.
- Ownership check: no retirement/goal-purge project exists — fresh search, two ways: glob for `projects/ops/*retire*` and repo grep for "goal-purge" found no project folder. Nearest neighbours: each programme's own archive manifest (SMP §archive-contract; ZION's own archive steps), each scoped to its own programme only. The 2026-08-30 ruling gave "the ecosystem purge" to ZION-9/Larry; Nick's later 2026-09-04 words retire that lane and order this plan — the conflict is on the confirmation sheet (§1a row 6), resolved by the later word.
- Expected inputs confirmed to exist: `projects/ops/zion/PLAN-ZION-PROGRAMME.md` · `projects/_archive/goal-purge-2026-09-04/projects/ops/skippy-master-plan/PLAN-SMP-PROGRAMME.md` · the 17 ZION lane plan files and 12 SMP plan files (globbed 2026-09-04) · `projects/ops/skippy-jobs/jobs/` (327 files listed) · `projects/_archive/goal-purge-2026-09-04/projects/personal/skippy-app/ALEXA-ACCESS-SPEC.md` · `projects/_archive/goal-purge-2026-09-04/projects/ops/THE-ASSISTANTS.md` · `projects/ops/continuity/PLAN.md` · `projects/ops/agents/check_plan.py`.
- Artifacts this plan's own steps create, declared so their citations below are readable before they exist:
- `projects/_archive/goal-purge-2026-09-04/RETIREMENT-NOTE.md` (CREATED BY STEP 1)
- `projects/ops/retirement/STATE.md` and `projects/ops/retirement/PLAN-CHANGES.md` (CREATED BY STEP 1)
- `projects/ops/retirement/evidence/refcounts-before.txt` and `projects/ops/retirement/evidence/citation-sweep.sh` (CREATED BY STEP 2)
- `projects/ops/retirement/evidence/refcounts-after.txt` (CREATED BY STEP 11)
- PLAN AUTHOR: Boris 3 of 3 (senior-engineer, Fable), dispatched 2026-09-04 on Nick's "boris x 3 on fable 5.1 do the planning".
- COLD READER: none — SINGLE-AUTHOR, UNREVIEWED at write time. STEP 12 is a real cold read of the executed result by a session that built none of it, and its verdict lands in `## STEPS`.
- PROMPT-SPEC scan (P1–P7): P1 fired on "purge" vs "archive" (two readings, two different acts) — resolved above and on the sheet, not guessed. P4 fired on "everything else" — bounded by the KEPT list in §1a row 5. P3 fired on "there are no scehdueld jobs right now because everything is fucked" — treated as Nick's impression, not a measurement; STEP 6 measures the fleet with a control rather than building on the claim. P7 fired on his multi-part 42708 message — split item by item into the §1c dispositions, each citing his exact clause.
## 1 · Goal and definition of done
**What we're doing, one paragraph.** Take the measured inventory of every live lane, project, scheduled job, skill and pointer in this workspace; mark each KEEP, FOLD, PARK, RETIRE-ARCHIVE or DEFER against Nick's 2026-09-04 scope; move retired work intact into one dated archive folder; hand folded work to its named new owner with a dated line; disable (never delete) the scheduled jobs of retired capabilities; and sweep the live surfaces — programme indexes, canon table, board cards, heartbeat rows — so nothing retired still reads as live. Gracie, Neeko and the family app are parked in a resumable state, because "later" is not "never".
- **HOW IT'S USED:** an agent starting any future session reads ACTIVE-WORK, a programme index, or the board, and sees only Skippy/voice/Hub work as live; anyone needing retired material follows the archive note to `projects/_archive/goal-purge-2026-09-04/` and finds it intact. · HOW WE KNOW: STEP 12's cold walk performs exactly this read and returns a verdict.
- **WHAT IT LOOKS LIKE:** one archive folder with a plain-English retirement note at its top; dated status deltas in the two programme indexes; disabled-frontmatter in named job files; this plan's `## STEPS` carrying the proofs. · HOW WE KNOW: each is a named artifact with a runnable proof in §3b.
- **WHERE IT LIVES:** the plan at `projects/ops/retirement/`, opened by the executing sessions; the archive under `projects/_archive/goal-purge-2026-09-04/`; Nick opens only the plain-English report STEP 13 hands him. · HOW WE KNOW: Nick, 2026-09-04, reads handbacks, not plans — same confirmed pattern as the ZION replan's SURFACE row.
- **WHAT IT MUST DO:** (1) every §1c inventory row reaches an executed, proven disposition; (2) nothing is deleted; (3) no live Skippy/Hub/family-facing surface or job breaks; (4) retired capabilities' jobs provably stop firing while a kept job provably still fires; (5) every moved document's live-tree citations are updated in the same pass; (6) a cold checker confirms no retired work reads as live. · HOW WE KNOW: §6 evals, one per capability.
- **NOT in scope:** the ANTI-SCOPE.
- **Security work of any kind** — no vulnerability audit, no credential chase, no hardening, no "while I'm here" security fix. Security is click-gated behind ZION-8 and happens as its own end-phase pass (ZION-14, which this plan DEFERS in place, untouched). Anything security-shaped found mid-step costs one line on the NEXT list.
- **Deleting anything, anywhere** — approval class three; archive-over-delete is the default and the whole method here.
- **Doing, finishing or "quickly fixing" any retired lane's actual work** — a retirement pass that starts repairing the thing it is retiring has lost the plot; one line to the NEXT list.
- **Touching the live OpenBrain store, its MCP engines, the routing tools (`projects/ops/route-build.mjs`, `projects/ops/cheap-task.mjs`), the routing-enforcement hooks, or the file-protection gates** — retired LANES are not retired INFRASTRUCTURE; all of these are running dependencies of the kept goals (measured in §1c) and no step edits them.
- **Undeploying any live site** (Skippy School included) — stopping work is not taking a serving surface away from its users; see §1a row 4.
- **The SMP programme's own build work** — Boris 1 and Boris 2's plans govern finishing Skippy/voice and the Hub QA; this plan only posts dated deltas and handoff lines into the indexes.
- **Trip-over protocol:** a step that finds something outside its fence writes ONE dated handover line to the named owner (the programme index or lane plan that owns it), then returns to its step. Never investigates, never fixes.
## 1a · Critical variables — the confirmation sheet is GENERATED from this table
| # | The variable, in plain words | Value chosen | Alternatives rejected | Class | HOW WE KNOW | Cost if wrong | CONFIRMED |
|---|---|---|---|---|---|---|---|
| 1 | **SURFACE — which screen this lands on, and who opens it** | Live surfaces agents actually read: ACTIVE-WORK, the two programme indexes, the board, the jobs folder; Nick opens only the plain-English report | A new dashboard; a claude.ai artifact | V1 | Nick reads handbacks, never plan files; he ordered "no way to go and get lost in this stuff", which is about what agents open | The purge cleans surfaces nobody reads and leaves the ones they do | Nick, 2026-09-04, "so there's no way to go and get lost in this stuff" (REGROUP-SOURCE §A12) |
| 2 | What "purge" means next to "archive" | Archive the work intact; purge only LIVE POINTERS (open lanes, cards, jobs, index rows); historical mentions in logs/ledgers stay | Literal deletion of every mention (42,968 gracie mentions measured — impossible and destroys records); archiving nothing and only closing lanes | V1 | His same sentence contains both verbs and ends "archive anything that's not related"; deletion is his own approval class three | Either real records are destroyed, or retired work keeps reading as live | Nick, 2026-09-04, "Retire every mention... purge every document, purge every file, archive anything that's not related to our core goals" (§A12), read with his standing archive-over-delete rule, 2026-08-01 |
| 3 | Gracie and Neeko | DEFERRED, not killed: development docs archived with a RESUMABLE banner; Neeko's jobs disabled reversibly; nothing destroyed | Retire them outright; keep their lanes open | V1 | His words name them as sequenced after Skippy, not dropped | Resuming them later means rebuilding from nothing, or they keep generating live work now | Nick, 2026-09-04, "finish skippy then we do gracie and neeko later" (§A12) |
| 4 | The deployed Skippy School site the kids can open | Lane and lesson work RETIRE-ARCHIVED; the already-deployed site keeps serving untouched, no further work on it | Undeploy the site as part of the purge | V1 | "We're not going to do any of the ancillary items right now" stops WORK; he never ordered a takedown, and taking a working surface from its users is not cleanup | The kids lose a tool nobody asked to remove, or agents keep building lessons | Nick, 2026-09-04, "we're not going to do any of the ancillary items right now" (§A12); standing archive-over-delete default, 2026-08-01 |
| 5 | The exact KEPT list | Skippy conversation core + desktop shell + voice app; business Hub incl. board-PM enforcement folded in; one-cloud-copy (continuity item 25); ZION-12 team access; google-sso awaiting switch-on; Slack/Gmail/WhatsApp/Alexa as CHANNELS with a testing phase; ZION-8 as the security gate; family app PARKED | Wider keep-lists (directories lane, weekly report, router lane) — all named done or ancillary by him | V1 | The dispatch brief enumerates it and his 42708 message confirms each item | Something he wants lives in the archive, or something he dropped stays live | Nick, 2026-09-04, the 42708 message: "zion 8 is done 100%... slack gmail whatsapp etc for skippy are pretty much done... the open brain router approval system cleanup audti shopping etc is done IMO / pm noard enforcement gets wrapped in tot he hub work" (§A12) |
| 6 | Who owns the ecosystem purge — two of his own dated rulings differ | This plan executes it now; the 2026-08-30 ruling that gave the purge to the custodian (ZION-9/Larry) is superseded because he retired that lane in the same breath as ordering this purge | Leaving the purge to ZION-9's first custodian run | V1 | Later direct word beats earlier ruling (plan skill §N); both rulings quoted here for him to see on the sheet | Two owners for one purge, or no purge at all | Earlier: Nick, 2026-08-30, ruling 13 "LARRY — approved" (purge = custodian's first run). Later, governing: Nick, 2026-09-04, "cleanup audti... is done IMO" + the §A12 purge order |
| 7 | Where a retired ZION lane's files go | Git-move into `projects/_archive/goal-purge-2026-09-04/` with structure preserved and a banner, matching the SP-programme precedent; the programme index rows stay, marked RETIRED with a dated delta (no stage deleted) | Leave files in place with only a banner (keeps 9 dead plans in the live folder agents open — the exact get-lost risk) | V1 | The 2026-08-30 SP retirement did exactly this and it worked; governance forbids deleting stages from a plan, and a move is not a deletion | The live folder stays cluttered, or governance is breached | Nick, 2026-09-04, "archive anything that's not related to our core goals" (§A12); precedent `projects/_archive/sp-programme-retired-2026-08-30/` |
**Considered and ruled NOT critical** *(the denominator — never demote a variable silently)*:
- The archive folder's exact name — any dated folder under `projects/_archive/` satisfies the convention.
- Which cheap model executes which step — the model matrix and vendor availability at dispatch time decide; §3 names the tiers.
- The order of the disposition steps beyond their stated entry conditions — steps with satisfied dependencies may run in any order.
- Whether disabled job files are also git-moved — frontmatter is the sanctioned kill-switch (MACHINE-RULES rule 8) and moving them could break the daemon's file walk; they stay in place, disabled.
## 1b · Subproject decomposition — could a piece of this ship on its own?
- **SINGLE SUBPROJECT:** one retirement sweep over one workspace with one archive destination and one verification walk; no piece has its own consumer or could be signed off alone — a half-purged workspace fails the North Star exactly as a never-purged one does.
## 1c · THE INVENTORY — every candidate, measured 2026-09-04, with disposition
*Method, stated per §Z: candidates were found by (a) globbing the lane files (`PLAN-SMP-*`, `PLAN-ZION-*`, `STATE-*` — 12 SMP files, 32 ZION files), (b) case-insensitive content greps for each named drop (skippy school · gracie · neeko · alexa · shopping · openbrain · quality/success report), and (c) listing `projects/ops/skippy-jobs/jobs/` (327 files). An exact-name search undercounts — every RETIRE row is re-verified two ways again at execution time (STEP 2), and an empty result is never read as absence.*
| # | Item | What it is, plainly | Disposition | Where the work goes / new owner | Live pointers to purge |
|---|---|---|---|---|---|
| 1 | ZION-1 autorouter lane | The cheap-model routing build lane | RETIRE-ARCHIVE | archive; the live tools `projects/ops/route-build.mjs` and `projects/ops/cheap-task.mjs` stay — every dispatch depends on them | index row → RETIRED; lane files moved |
| 2 | ZION-2 file-protection gates lane | The gates guarding Nick's core instruction files | FOLD | gates keep running untouched; lane doc archived after a dated handoff line names ops/SMP-8 as standing owner | index row → FOLDED |
| 3 | ZION-3 Hub codebase lane | SUPERSEDED 2026-09-04 by PLAN-ZION-19-hub-finish.md — its own first lines say so; it is no longer the Hub build | KEEP IN PLACE, no move | — | — |
| 3a | ZION-19 Finish the Hub | **The** live Hub plan, and the destination for every Hub-bound handoff | KEEP | — | — |
| 4 | ZION-4 Hub audit lane | Report-only QA of the Hub | KEEP | — | — |
| 5 | ZION-5 agent/skills directory lane | The generated directory pages | RETIRE-ARCHIVE | archive lane docs; generated pages stay serving as-is | index row; lane files |
| 6 | ZION-6 OpenBrain build lane | The memory-store migration lane | RETIRE-ARCHIVE ("open brain... is done IMO") | archive lane docs; 🔴 the RUNNING store and the `personal-engine`/`business-engine` MCP front doors are live dependencies of Skippy and are not touched | index row; lane files; the delivery docs folder |
| 7 | ZION-7 scheduled-task fleet lane | The jobs-fleet repair lane | FOLD | SMP-8 Runtime Reliability owns `projects/ops/skippy-jobs/` by root; dated handoff line into the SMP index; Nick's "there are no scehdueld jobs right now" is his impression — SMP-8 re-measures, this plan does not | index row → FOLDED |
| 8 | ZION-8 approval system | Done; now the security click-gate | KEEP (repointed) | — | — |
| 9 | ZION-9 cleanup audit (Larry/Benito) | The custodian sweep lane | RETIRE-ARCHIVE ("cleanup audti... done IMO") | archive lane docs; the `larry`/`benito` agent definitions stay (invoked-by-name only, fire on nothing) | index row; lane files |
| 10 | ZION-10 family app + shopping | Family app surfaces and the shopping gate | RETIRE lane: shopping DROPPED, family app PARKED | shopping libs/tests stay on disk with the parked app; lane files archived; family app resumes after Skippy ("then we deploy the same setup in the hub and family app") | index row; lane files; shopping skill pointer; any shopping job |
| 11 | ZION-11 weekly quality report | The weekly success-report lane | RETIRE-ARCHIVE (named drop) | archive lane docs + `projects/ops/sp13-quality-tracking/`; job disabled | index row; lane files; `projects/ops/skippy-jobs/jobs/sp13-quality-report.mjs` |
| 12 | ZION-12 team access | Mae/Dean/DinDin/Chantelle pushing their own commits | KEEP | — | — |
| 13 | ZION-13 tool adoption lane | Outside-tool decisions | RETIRE-ARCHIVE | archive lane docs; adopted tools' live configs untouched | index row; lane files |
| 14 | ZION-14 end-phase security audit | The security pass Nick promised | DEFER IN PLACE | file stays exactly where it is, untouched, click-gated behind ZION-8; runs when Nick declares the build phase over | none — its row already reads end-phase |
| 15 | ZION-16 Larry disposition gap | Adjunct of the cleanup audit | RETIRE-ARCHIVE | archive with ZION-9 | index row; lane files |
| 16 | ZION-17 board-PM enforcement | Board discipline for agents | FOLD into the Hub ("gets wrapped in tot he hub work") | dated handoff line into **`projects/ops/zion/STATE-ZION-19.md`**; **lane doc STAYS PUT — see the collision note below** | index row → FOLDED |
| 17 | ZION-18 cheap-routing enforcement | The dispatch-hook enforcement lane | RETIRE-ARCHIVE (router "done IMO") | archive lane docs; the live hooks stay armed untouched | index row; lane files |
| 18 | ZION programme index | The lane index itself | KEEP, rewritten in place | carries every disposition as a dated status delta; no stage deleted | — |
| 19 | SMP-1..8, SMP-10 + programme | Skippy core, family surface, vault, desktop, Hub, channels, WhatsApp, runtime, Alexa channel | KEEP (SMP-2 → PARK delta: family app after Skippy) | Boris 1/2 plans drive them | — |
| 20 | SMP-9 Learning Transcript / Skippy School | The kids' lessons app and site | RETIRE-ARCHIVE (named drop) | lane docs archived; `projects/personal/learning-app/` stays on disk; deployed site keeps serving (§1a row 4) | SMP index delta; lane files; any lessons job |
| 21 | Wider Alexa ambitions | `projects/_archive/goal-purge-2026-09-04/projects/personal/skippy-app/ALEXA-ACCESS-SPEC.md` (kid access, slots) | RETIRE-ARCHIVE | archive; SMP-10 channel adapter unaffected | citations of the spec |
| 22 | Gracie development | Chantelle's assistant — wider build (THE-ASSISTANTS, assistants-replan) | DEFER, RESUMABLE | archive dev docs with RESUMABLE banner; 🔴 her LIVE jobs (progesterone reminder, reps feedback, confirm cards) keep running — a real person consumes them today | canon rows; any open cards |
| 23 | Neeko | The Neeko persona: daily review + project-doc sweep jobs | DEFER, RESUMABLE | jobs disabled via frontmatter (reversible); libs stay on disk; dev docs archived | the two `neeko-*` jobs; any cards |
| 24 | Shopping infrastructure | `projects/ops/skippy-jobs/lib/shopping-agent-add.mjs`, criteria gate, tests, skill | RETIRE (named drop) | code parks on disk with the family app; skill marked retired; jobs (if any found by STEP 2's two-way search) disabled | skill pointer; jobs |
| 25 | OpenBrain delivery docs | `projects/ops/openbrain-delivery/` | RETIRE-ARCHIVE | archive (store untouched, see #6) | citations |
| 26 | One-cloud-copy programme | continuity PLAN item 25 | KEEP | — | — |
| 27 | Google sign-in | `projects/ops/google-sso/` built, awaiting switch-on | KEEP | — | — |
| 28 | `projects/ops/REBUILD-2026-08-21/` leftovers | Old SP/skippy-100 tree whose archive move (an SMP manifest step) has not finished | HANDOFF | one dated line into the SMP programme index — it owns that manifest; this plan does not seize it | — |
| 29 | Retired-lane scheduled jobs | `projects/ops/skippy-jobs/jobs/neeko-daily-review-run.mjs`, `projects/ops/skippy-jobs/jobs/neeko-project-doc-sweep-run.mjs`, `projects/ops/skippy-jobs/jobs/sp13-quality-report.mjs`, plus whatever STEP 2's two-way search adds | DISABLE (frontmatter), never delete | in place, disabled, reversible | the jobs themselves |
| 30 | Live pointers everywhere else | ACTIVE-WORK canon rows, HEARTBEAT rows, board cards, skills/agents presenting retired lanes as live | PURGE (status edits / card closes) | — | swept by STEPS 9–10 |
### 1c-audit · STEP 11b — the ecosystem-wide file audit (measured 2026-09-04, two ways)
**The ground, measured (evidence/step11b-ground-counts.txt):** METHOD-A, git-tracked files touched by a commit since 2026-08-20, archive excluded: **42,473** (37,267 still on disk). METHOD-B, files on disk modified since 2026-08-20 (minus .git, node_modules, the archive, worktree copies): **123,100**, of which 6 untracked and 5,467 gitignored. The two differ because METHOD-B counts everything a checkout, a virtual environment, a nested repository or a build touched: 30,203 files are one Python virtual environment (MisoTTS/.venv), 30,288 are one bake-off's arms under guide-records, 9,064 are a nested .git's objects, 1,563 a desktop build output. Those are not documents anyone wrote during the drives, and they are out of scope by class (below), not sediment.
**The rule, written before classifying:** KEEP-LIVE = something running reads it by path (the reader is named) · KEEP-REFERENCE = a human or agent will genuinely open it again (the governing files, live plans and states, registries, skills, agents, the journals) · ARCHIVE = a copy, snapshot, scratch, rejected or stale working copy, or finished work of a retired subject — the default, the burden is on keeping · ALREADY-COVERED = a §1c row owns it · OUT OF SCOPE BY CLASS = nested repositories' internals, virtual environments, build output, dependencies, browser/session profiles, and every client folder (Nick's Captus fence).
**Wave 1, executed (commit a051b557c — 543 renames, 0 deletions; commit 58fe488c8 — 13 renames, 0 deletions):**
| Class | Files | Disposition | Dependency check (two ways: code grep for reads by name; nightly-test run) |
|---|---|---|---|
| `.bak*` / `.pre-*` byte snapshots OUTSIDE the business app and guide-records | 1,750 (290 tracked) | ARCHIVE, paths preserved | only the business app's own self-checks read snapshots (`_selfchecks/harness-*.mjs` read `*.pre-*` / `*.bak` as regression baselines) — so the business app's snapshots STAY (KEEP-LIVE, reader named); the coach-profiles scripts only WRITE new ones |
| `.snapshot-before*` files outside guide-records | 65 | ARCHIVE | only `_test-chunk-coverage.mjs` names the pattern, as an exclusion |
| four stale working copies of the business app (`business-app-root-28-7-*`, `business-app-step-28-7-clean`, `.parity-28-7.*`) | 4,641 (four gitlinks) | ARCHIVE | no code names them; each carried its own nested .git — moved whole |
| the rejected field preview (`_family-app-field-preview.REJECTED-20260805`) | 158 | ARCHIVE | no reader |
| `projects/ops/scheduled-tasks-backup/` | 87 | ARCHIVE | named only in exclusion lists (working-tier-register, scope-prose test, retired-rulings finder) |
| `projects/ops/_quarantine/`, `_verify_tmp_sp6/` | 4 | ARCHIVE | no reader |
| nine loose root-level leftovers (a temp audit note, a self-deleting proof script, a one-off edit instruction, a scratch probe, two empty outputs, a stray copy of a channel file, two plan-edit copies) | 9 | ARCHIVE | opened one by one; `.tmp-hf-round5-codex-probes.mjs` is named only in the capability-graph data |
| the retired SP-14 grader's nightly test | 1 | ARCHIVE beside its subject | the runner collects every `_test-*.mjs` on disk; its subject moved in STEP 8, so it could only ever be red |
**Kept by dependency (KEEP-LIVE, reader named):** `projects/business/business-app/**/*.pre-*` and `*.bak` (read by that app's self-checks) · `projects/ops/.cheap-task-snapshots/` (the cheap-task tool's revert mechanism) · `projects/ops/rebuild-2026-07/` (read by `single-brain/generate_cascade_map.py`, `generate_roster_liveness.py`, `coverage_matrix_source.json`) · `projects/ops/openbrain-delivery/tests/` (moved BACK in STEP 8's narrowing: the nightly `_test-guide-passages-refresh.mjs` runs its python tests, which resolve the repo root from their own location; 8/8 OK at the live path) · `projects/ops/assistants-replan/PLAN-6-KANBAN-PM.md` and its family (STEP 7's finding).
**Not classified in this drive — named residue, for the owner it belongs to:** `projects/ops/guide-records/` snapshots (3,405 `.pre-*`, 168 `.bak`, 41 `.snapshot-before*` — the health-engine bake-off's own tree; its owner decides) · the closed-drive evidence folders under `projects/ops/zion/` (validate-phase4, regroup-phase1/2, revalidate-after-fix, rebuild-drive*, foldin-hub-ui, fix-proofs, fixups, blocker-sweep — kept in place while the Hub lane is live and reads beside them) · the history papers left in `projects/ops/assistants-replan/` (Skippy-programme and Kanban history, STEP 7's list) · the specs and hand-offs at the root of `projects/ops/` that mention retired subjects (repointed to the archive, not moved — a docs-level pass is judgment work and is on the NEXT list with counts). **KEEP share:** of the 42,473 git-touched files, the ARCHIVE bucket this drive executed is 543 tracked entries plus 1,525 untracked and 4,641 inside gitlinks; everything else is KEEP-LIVE, KEEP-REFERENCE, ALREADY-COVERED, or OUT OF SCOPE BY CLASS — a docs-level KEEP share cannot honestly be stated as a percentage of a number dominated by virtual environments, and the plan's 20% test is answered by the residue list above instead.
**Duplicates found, reported not resolved:** `larry.md` and `benito.md` exist as real files in `ZION/agents/` and as symlinks in `.claude/agents/` and `.agents/agents/` (`ZION/lib/generate-codex-profiles.mjs` says the two link folders are never duplicated) — so this is one file with two links, not two definitions; no action.
### What actually needs to stay, and why (the KEEP set a cold reader can act on)
- **The three live bodies of work:** the Skippy app and voice app (`projects/personal/skippy-app/`), the business Hub (`projects/business/business-app/` and its engine), and the Skippy master programme with its live lanes (`projects/ops/skippy-master-plan/`). Their plans, states, evidence and self-checks are current instructions.
- **The governing files at the root** (CLAUDE.md, RULEBOOK.md, FILE-STANDARD.md, MACHINE-RULES.md, PROMPT-SPEC.md, DECISIONS.md, DOC-REGISTRY.md, the generated HANDOFF.md, progress.html and capability-page.html) and the journals (CHANGELOG, SESSION-LOG, HEARTBEAT) — history stays append-only and is never re-read as instruction.
- **The programme indexes and the kept ZION lanes** (`projects/ops/zion/PLAN-ZION-PROGRAMME.md`; ZION-3, 4, 8, 12, 14, 17, 19 and their states) — every retired lane's row now reads RETIRED/FOLDED with the archive path.
- **The ops tooling every session depends on:** `projects/ops/skippy-jobs/` (the daemon, its libs, its nightly tests), `projects/ops/agents/` (the plan gate), `ZION/` (agents, skills, gates), `projects/ops/spine-projections/` (the ownership registry), `projects/ops/artifacts/` (generated pages and their generators), `projects/ops/route-build.mjs` / `cheap-task.mjs`, `projects/shared-tooling/` (links into deck-shared).
- **The engines and stores:** the health engine (`projects/personal/health/`), the memory store's front doors (`brain-routing/`, the business engine), the family vault. Nothing in them moved.
- **Parked, on disk, untouched:** the family app (`projects/personal/family-app/`), the kids' learning app (`projects/personal/learning-app/`, its site keeps serving), the shopping code, Gracie's and Neeko's libraries under `skippy-jobs/lib/`, Chantelle's live jobs.
- **Every client folder** under `projects/business/marketing-sales/clients/` — Nick's word, fenced entirely.
### 1c-audit · STEP 15 — the conflict purge, wave 2 (executed 2026-09-04 ~00:17Z on Nick's second hand-off)
**Nick's rule, verbatim:** *"One live document per active project. Everything else is either archived or gone."* and *"A banner is not protection — plenty of agents read the body and never the first line."* The three active projects: Skippy and its voice app · the business Hub · this retirement and folder audit.
**The count, before and after (live tree = git-tracked, the archive and dependencies excluded; "before" is the tree at the start of this session, commit 47e9bf73a):**
| Measure | Before | After |
|---|---|---|
| Files in the live tree | 29,277 | 23,379 |
| `.md` documents in the live tree (client folders excluded) | 6,767 | 2,676 |
| Backup-style files and backup folders in the live tree | 3,883 | 92 |
| Plan/state/spec documents for Skippy outside its one plan | 46 files + 7 folders | 0 |
**Moved by rename in this wave: 5,745 files (0 deletions).** Live citations repointed to the archive path: 178 files (80 documents, 48 scripts' comments and fixtures, 29 data files, the rest text/html), two skipped because another session had uncommitted edits in them (`projects/ops/continuity/PLAN.md`, `projects/personal/skippy-app/cowork-queue.md` — their mentions of moved paths are stale until their owners next save).
| Class | What moved | Files | Dependency check (readers measured with the v4 checker; every real read named) |
|---|---|---|---|
| Skippy's competing plans | the SMP programme index, PLAN-SMP-1…8 and 10, their PLAN-CHANGES, twelve HANDOFF-PROMPTs, PROJECT.md, both postmortems, the verifier-authority note, seven close-tooling scripts, the smp1-talk / smp5b / smp7 lane folders, smp5d's plan+state+inventory (its evidence folder stays: a live job writes into it), `smp3-status`, `smp-2-dispatch`, `smp5-live-reliability`, `SMP-0`, `STATUS-SCREEN-BUILD-SPEC.md`, the 2026-08-21 rebuild folder's plans and record-keeping (its `skippy-100/tools/` stays: `continuity-drill-watch.mjs` shells it), the desktop lane's plan, state, history, changes and inventory | ≈1,600 | none driven since the 2026-09-03 regroup; every code mention is a comment naming the spec that governed it; `outside-review-ledger.mjs` lists the SMP paths as strings for its review protocol and reads only the manifest under the kept evidence folder; the twelve `_test-smp8-*` and three `_test-smp7-*` tests name their plan in comments and pass; `_test-chunk-coverage.mjs` reads the coordination index as its chunk declaration — repointed, still reads it |
| Hub closed-drive transcripts | eleven folders under `projects/ops/zion/` (regroup phases, validate, rebuild-drive ×2, fix-proofs, blocker-sweep, revalidate, foldin, fixups, sp-card-removal) | ≈236 | written by `ZION/lib/*.sh` which `mkdir -p` their output folder (scripts untouched); no live Hub plan cites them (ZION-19, ZION-3/4/8/12/14/17 and the index grep clean); `evidence-zion-5` stays — ZION-4's plan cites it |
| Backups and snapshots | `projects/_archive/goal-purge-2026-09-04/projects/ops/rules-registry/backups/` (dated copies of every skill, written by `prune.mjs --apply`, which recreates the folder), 29 `.bak` / `.snapshot` / `.retired-` / `.superseded-` / `.backup` files across the root, `.claude`, the family app, the health spine and the outbox | ≈3,800 | no reader; `working-tier-register.mjs` lists the backups folder only to EXCLUDE it; the design skill cited one backups folder as its source and now cites the archive path |
| Superseded documents with no live reader | eleven root specs and hand-offs under `projects/ops/`, the agent-test-identity folder, the drive-daemon proposal, the four NEEKO build docs, the live-client-view brief and scope, the business-record spec, the booking template, the family app's HISTORY-only design spec, six health-engine specs and check-points, the retired store scope/inventory, the root `WAITING-ON-A-PERSON.md` stub | 33 | each carries its own superseded/retired banner; every code mention is a comment; the DOC-REGISTRY rows now name the archive path |
| The family app's test mirror | its 32 documents (copies of the real app's) | 48 | the folder's code, QA tooling and deploy target `deck-family-test` stay — `test-app-screens.mjs` and four nightly tests read them |
**Wave 3, on Nick's yes (2026-09-05, "2 yes"):** the health bake-off's snapshot files under `projects/ops/guide-records/` — 219 on disk outside the vendored bake-off arms and the virtual environment (54 tracked, moved by rename; 165 gitignored copies never in git, moved by plain move) — now sit under the archive at their old paths; zero left in the live tree. Readers checked first: `four-model/run.py` and `freeze_question_set.py` only EXCLUDE such names; `check_reversal_regressions.py` names two `.pre-reversal-fix` files that have never existed on disk or in git, and its loader returns empty for a missing file, so nothing it reads moved.
**Moved back after the test comparison:** `projects/ops/REBUILD-2026-08-21/REBUILD-RECORD.md` — the live content-gate hook (`check-claude2-content-gate.mjs`) guards that exact path with a single-use ticket and its test went red only after the move. It stays as a record of what was decided.
**Pre-existing red tests, unchanged by this wave (red in both trees):** `_test-retired-rulings` (1), `_test-state-file-not-truncated` (3 before, 2 after — one truncated state file left the live tree), `_test-4d-recap-rules`, `_test-chunk-coverage` (PLAN-MEMORY uncovered), `_test-guide-copies`, `_test-roster-parity` (design-redo / humanizer, already on the NEXT list), `_test-family-app-dispatch-panel` (1), `_test-family-app-panel-screen` (a browser probe). Green in both: project-md-sync, plan-proliferation, family-app-retirements, token-accounting, smp8-no-spend, desktop-shell-status-count, md-governance-gate, clone-mirror-gate, working-tier-register, scope-prose-current, no-unpushable-evidence, check-plan-gate, neeko-company-history, vendor-resolver, updates-screen, claude2-write-gate (57/57), claude2-content-gate after the record moved back.
**Still in the live tree with a superseded or retired banner, each with its reason (73 measured after the wave):** the retirement markers the cold walk added (the shopping-list skill and the contested-numbers reference, in all three skill folders) and `ACTIVE-WORK.md` — indexes recording a retirement, which Nick's rule keeps · `MIGRATION-PROTOCOL.md` — a live companion to CLAUDE.md, cited by the brain-push job · `ZION/_staged-edits/` — two edits to governing docs still waiting for Nick's approval, not superseded · the business app's documents (its TODO spec, the `_design` capture notes, the retired-CSS README) — a nested repository the Hub lane owns · the coach-profiles raw corpus, the profitability ledger and Jasmin's doctrine — live data and live agent doctrine whose text merely contains the word · `LEAD-ENGINE-SPEC.md` — read by `_test-business-guide-rebuild.mjs` as its control · the two task-data-block projections — generated · `MD-ECOSYSTEM-ENGINE-PLAN.md`, `PUNCH-LIST.md`, `WORK-ORDER.md` — read by `_test-token-accounting.mjs`, and the latter two carry Nick-era banners that forbid archiving them · `agent-fleet/cheap-forcing` and its census — read by `sp0-router.mjs` and five tests · the agent-system specs under `projects/ops/agents/` — live role definitions with a superseded section each · `artifacts/check-audit/` — generated · `assistants-replan/PLAN-PROGRAMME.md` — kept by STEP 7 (the Kanban family) · `biz-inbox/` — a live pipeline · `git-consolidation/evidence/` — evidence · `rebuild-2026-07/` — KEEP-LIVE from wave 1 · `retired-rulings/README.md` — the retired-rulings store's own index, read by the runner · this plan and its changes file · `rules-registry/INVENTORY.md` — the registry's inventory · `scheduled-mirror/` — machine-written mirror · the HEARTBEAT legend block — a projection · `PLAN-SKIPPY-FINISH.md` — the live plan, whose text contains the word · `walkaway/` — the drive machinery every /drive skill runs, plus three closed drive plans under `walkaway/drives/` that its tooling reads by folder · the kept ZION lanes' state and changes files (ZION-3, ZION-17, ZION-5, ZION-12) — the Hub lane's own supersession markers, for the Hub owner to fold · `RESKIN-CONTRACT.md` — read by the family app's `contract-check.js` · `NICKS-UPDATES-SPEC.md` — cited by the live updates code, partially retired · `POP-BENTO-SPEC.md` — the family app's current look until the Pearl skin finishes · the health-source supplement input, `STATE-CUTOVER.md`, Chantelle's intake record, `agents-md-superseded/` (the health engine's own archive mechanism, read by `build_agents_md.py`) and `ruled-out.md` (a deprecated projection the engine owner should regenerate away) · the bridge and chief-of-staff READMEs and the bridge contract — companions of live code (`bridge/server.py` cites the contract) · the Fly deploy bundle's copy of a superseded note — build output.
**Not touched, by rule, and named so nobody has to wonder:** every client folder · the business app (nested repository; its `HUB-UIUX-AUDIT/` and `app/_design/` are cited by the live ZION-19 and ZION-4 plans) · `projects/ops/guide-records/` (3,405 `.pre-*` snapshots — the health engine bake-off's own tree, its owner decides) · `projects/ops/skippy-master-plan/qa-evidence/` (`_test-desk-window-renders-clean.mjs` writes its screenshots there) · `projects/ops/skippy-jobs/state/` (machine state, rotated by the jobs themselves) · `biz-inbox/archived/` (a live pipeline's own archive) · the four index-only ghosts `.claude/skills/plan/*.bak-2026-08-28-postmortem` and `.agents/…` (listed by git, absent on disk — the skills folders are symlinks into ZION).
### What actually needs to stay, and why — after wave 2 (the KEEP set a cold reader can act on)
- **Skippy and the voice app — ONE plan:** `projects/ops/skippy-master-plan/PLAN-SKIPPY-FINISH.md`, its `STATE-SKIPPY-FINISH.md` and `PLAN-CHANGES-SKIPPY-FINISH.md` companions, its `evidence/` folder (read by the review ledger and cited by every closed step), the two manuals in `projects/personal/skippy-app/` (SKIPPY-MANUAL, VOICE-APP-MANUAL), the Skippy agent file `.claude/agents/skippy.md`, the Pearl design system and drawings (`projects/personal/family-app/PEARL-DESIGN-SYSTEM.md`, `pearl-tokens.css`, the two Pearl pages and their generator in `design-directions/`), and the app code itself (`skippy-app/`, the family app's Skippy screens, the desktop shell and its `_test-*` files). Nothing else about Skippy is an instruction.
- **The business Hub:** `projects/ops/zion/PLAN-ZION-PROGRAMME.md` (the index that records every lane's disposition) and the kept lanes' plan/state/changes files (ZION-3, 4, 8, 12, 14, 17, 19), the Hub's own repository `projects/business/business-app/` with its engine, and `HUB-AGENT-GUIDE.md`. The Hub lane is live and driven by peer sessions tonight; consolidating its seven lane plans into one is that lane's decision, flagged, not made here.
- **This audit:** `projects/ops/retirement/PLAN.md`, `STATE.md`, `PLAN-CHANGES.md`, `evidence/`, and the archive's `RETIREMENT-NOTE.md`.
- Everything in the wave-1 KEEP set above still stands (governing files at the root, the journals, the ops tooling, the engines and stores, the parked family and learning apps, Chantelle's live jobs, every client folder).
## 2 · The complete UX map (this becomes the test manifest verbatim)
| Id | Screen / entry point | State (default·empty·error·loading) | Element / interaction | Expected behavior | Navigation from → to |
|---|---|---|---|---|---|
| U1 | the archive home `projects/_archive/goal-purge-2026-09-04/` | default | a future reader opens the folder | the retirement note at its top explains in plain English what was retired/parked, why, on whose words, and how to resume Gracie/Neeko/family app | old citation → archive → note |
| U2 | ZION programme index | default | agent looks for live work | every retired/folded lane row reads RETIRED/FOLDED with a 2026-09-04 delta and an archive pointer; kept lanes read unchanged | index → lane or archive |
| U3 | SMP programme index | default | agent looks for live work | SMP-2 reads PARKED, SMP-9 reads RETIRED, both dated; handoff line re REBUILD leftovers present | index → lanes |
| U4 | ACTIVE-WORK canon table | default | agent checks what is live | zero retired items presented as live | table → owner |
| U5 | a disabled job file | default · disabled | the jobs daemon walks it | `disabled:` frontmatter honoured as step −2; job does not fire; kept control job still fires | daemon → skip |
| U6 | the board | default | agent or Nick reads cards | no open card drives a retired lane | board → card |
| U7 | this plan's `## STEPS` | default · error | executor finds next step; checker re-runs a proof | exactly one next step identifiable; every closed step carries pasted proof | plan → step |
| U8 | Nick's report (STEP 13) | default | Nick reads it | plain English, three labelled blocks, no jargon/paths/codenames; ends with WHAT'S WAITING ON YOU or NOTHING NEEDS YOU | chat |
> 🔴 **PATHS UPDATED IN PLACE 2026-09-04, AS THIS DRIVE'S OWN MOVES LANDED.** A retirement
> plan names the files it is going to move, so the moment a move succeeds the plan's own
> reference points at nothing — and the plan-write gate then refuses every further edit to
> this file, which would have frozen the drive's own plan mid-drive. The references below now
> name where each file ACTUALLY IS, under the archive. Nothing was deleted and no step's
> meaning changed; only the address did.
## 3 · Lanes and frozen contracts
🔴🔴 **CLIENT WORK IS OUT OF SCOPE ENTIRELY — CAPTUS BY NAME, ADDED ON NICK'S DIRECT INSTRUCTION 2026-09-04:** *"all the captus stuff needs to stay active and untouched please"*.
**NOTHING under `projects/business/marketing-sales/clients/` is touched by this drive** — not moved, not archived, not status-edited, not counted as sediment by STEP 11b's file audit, not swept as a stale pointer by STEPS 9–10. Captus is LIVE CLIENT WORK with real deliverables in flight (posts drafted for Anatoly, a comparison doc, a blended final dated 2026-09-03), and other sessions were actively editing its creative copy the same day this drive started.
**Checked at the moment his instruction arrived:** nothing Captus had been archived. The single hit for the word inside the archive is one line of an unrelated Gracie change-log that mentions the name in passing — not Captus work, and it stays where it is.
🔴 **THIS FENCE IS WIDER THAN THE ONE NAME, AND THAT IS DELIBERATE.** He named Captus; the same reasoning covers every client folder beside it, because archiving a live client's in-flight work is the worst outcome this drive could produce and the cost of over-fencing is nothing. If he wants a specific client folder swept later, that is a one-line change he asks for — never an inference an agent makes on its own.
| Lane | Scope (in / out) | Owner | Definition of done | Model (explicit) |
|---|---|---|---|---|
| L1 docs-and-indexes | IN: the two programme indexes' status deltas, retired lane files' git-moves, the archive folder, this plan's folder. OUT: any kept lane's content, anything under `projects/business/business-app/` | this session (Boris 3) dispatching workers | STEPS 1–5, 7–8 proven | executor GLM 5.3 (zai), haiku-tier grunt as the fallback when the outside vendors refuse at dispatch time; checker a separate Sonnet session |
| L2 jobs | IN: `disabled:` frontmatter on the named job files only. OUT: every other file in `projects/ops/skippy-jobs/`, all lib code, the daemon itself | this session dispatching workers | STEP 6 proven with its control | executor GLM 5.3 (zai), haiku grunt fallback; checker a separate Sonnet session |
| L3 pointers-and-proof | IN: ACTIVE-WORK status rows, board card closes via the board tool, citation updates for moved paths, the two-way absence proof. OUT: content edits to any kept plan beyond dated handoff/delta lines | this session dispatching workers | STEPS 9–12 proven | executor GLM 5.3 (zai), haiku grunt fallback; checker a separate Sonnet session; the STEP 12 cold walk is Sonnet in a fresh session |
**Contracts, frozen:** every commit is scoped — `git commit -m "..." -- <paths>` naming exactly the files that step touched (§W; this tree is shared with live sessions tonight). No `git stash`, ever. Re-read every file immediately before writing it. One worker in flight at a time from this session (two peer Boris sessions plus one other agent share the machine budget). Changes to THIS plan's scope land as dated deltas in `projects/ops/retirement/PLAN-CHANGES.md`. Every dispatch carries the §T header verbatim — ROLE from the closed list, REVIEW, RETURN-SIZE, and the MACHINE RULES travel block pasted in substance; a builder brief states "you are a single one-shot dispatch; run commands in the foreground; 'in progress' is never a final answer."
## 3b · Execution map — the Step map, then one STEP block per row
A task is DONE only when its review-ledger row is CLOSED by a reviewer that is not the builder.
**Step map (read this first):**
| Stage | # | Task (step name) | Gate to enter | EXECUTOR (model, from the matrix) | CHECKER (different model — never the builder) | DONE-PROOF (runnable command) | Ends when |
|---|---|---|---|---|---|---|---|
| Plan | 0 | Arm the loop | nothing | the driving session (fable) | sonnet — confirms the loop text below is verbatim from the skill | `command grep -c "ARM THE LOOP" PLAN.md` (run from `projects/ops/retirement/`) | loop armed |
| Framing | 1 | Archive home + note + changes file | nothing | glm (haiku grunt fallback) | sonnet | `ls projects/_archive/goal-purge-2026-09-04/` | note exists, committed scoped |
| Framing | 2 | Two-way re-verification of every RETIRE/DISABLE row | nothing | glm (haiku grunt fallback) | sonnet | `command grep -c "METHOD-A" projects/ops/retirement/evidence/refcounts-before.txt` | evidence file complete |
| Elements | 3 | ZION index dated deltas | STEP 2 evidence for ZION rows | glm (haiku grunt fallback) | sonnet | `command grep -c "2026-09-04" projects/ops/zion/PLAN-ZION-PROGRAMME.md` | deltas landed, scoped commit |
| Elements | 4 | Git-move retired ZION lane files | STEP 3 deltas landed | glm (haiku grunt fallback) | sonnet | `ls projects/_archive/goal-purge-2026-09-04/projects/ops/zion/` | nine lanes' files moved with banners |
| Elements | 5 | SMP deltas + Alexa spec archive + handoff lines | STEP 2 evidence for SMP rows | glm (haiku grunt fallback) | sonnet | `command grep -c "PARKED\|RETIRED" projects/_archive/goal-purge-2026-09-04/projects/ops/skippy-master-plan/PLAN-SMP-PROGRAMME.md` | deltas + moves landed |
| Elements | 6 | Disable retired-capability jobs, prove with a control | STEP 2's job list | glm (haiku grunt fallback) | sonnet | `command grep -l "disabled:" projects/ops/skippy-jobs/jobs/sp13-quality-report.mjs` | frontmatter present + control fired |
| Elements | 7 | Archive assistants (Gracie/Neeko dev docs), RESUMABLE | STEP 2 evidence | glm (haiku grunt fallback) | sonnet | `ls projects/_archive/goal-purge-2026-09-04/projects/ops/` | docs moved, live jobs untouched |
| Elements | 8 | Archive OpenBrain-delivery + quality-tracking docs | STEP 2 evidence | glm (haiku grunt fallback) | sonnet | `ls projects/_archive/goal-purge-2026-09-04/projects/ops/` | folders moved, store proven untouched |
| Details | 9 | Purge live pointers: canon table, heartbeat, board cards | STEPS 3–8 | glm (haiku grunt fallback) | sonnet | `command grep -ci "RETIRED 2026-09-04" ACTIVE-WORK.md` | pointers read retired/absent |
| Details | 10 | Citation sweep for every moved path | STEPS 4,5,7,8 | glm (haiku grunt fallback) | sonnet | `bash projects/ops/retirement/evidence/citation-sweep.sh` | zero live-tree citations of old paths |
| Tests | 11 | Two-way absence proof, after-counts | STEPS 9–10 | glm (haiku grunt fallback) | sonnet | `command grep -c "METHOD-A" projects/ops/retirement/evidence/refcounts-after.txt` | after-evidence complete |
| Tests | 15 | The conflict purge — one live document per active project (Nick's second hand-off) | STEP 11b wave 1 landed | the driving session (fable) | sonnet — re-runs the nightly tests that name a moved path before and after on a pristine checkout, then reads the KEEP list cold | `ls projects/ops/skippy-master-plan/*.md` prints only the three SKIPPY-FINISH files; `git show --diff-filter=D --name-only 7eddc72e8` names only the two rename-pair files whose archive copies are its two added lines | archive moved by rename, citations repointed, KEEP list written with reasons |
| Proof | 12 | Cold walk by a fresh session | STEP 11 | sonnet (fresh session — verification, not build) | fable — this session relays the verdict unchanged into STEPS | `command grep -c "COLD WALK VERDICT" PLAN.md` (run from `projects/ops/retirement/`) | verdict lands, PASS or named failures |
| Output | 13 | Plain-English report to Nick | STEP 12 verdict | the driving session (fable) | sonnet — lints the draft with the closing-message checker before send | `command grep -c "REPORT SENT" STATE.md` (run from `projects/ops/retirement/`) | sent |
| Proof | 14 | Postmortem + registry append | STEP 13 | the driving session (fable) | sonnet | `command grep -c "POSTMORTEM" PLAN.md` (run from `projects/ops/retirement/`) | postmortem written into this file |
**Then one block per step:**
### STEP 0 — ARM THE LOOP, BEFORE ANYTHING ELSE.
> **STANDING AUTHORIZATIONS — READ THESE BEFORE YOU ASK NICK FOR ANYTHING.**
> `node projects/ops/skippy-jobs/lib/standing-auth.mjs --audit` prints, in plain English, every
> permission he has already given. He said it plainly on 2026-09-04: *"i do not want to be asked
> about it its already appprved ... io don thwan tto be bothered by the same requests over and
> over"*. Already granted, so no step in this plan may ask again: **sending as Skippy on Slack,
> Gmail and WhatsApp** · **agents running their own tests and driving his machine and apps as the
> user** · **signing in through his identity gate** · **WhatsApp test sends to him or Chantelle,
> any content**. If he grants something new, write it into
> `projects/ops/skippy-jobs/lib/standing-auth.json` with his verbatim words and the date, the same
> turn, so the next drive inherits it. 🔴 The four approval classes can never be granted and are
> untouched: money leaving · rotating a credential · irreversible destruction · a message sent AS
> NICK to another human. Sending *as Skippy* is a different act from sending *as Nick*.
>
> **NO TEST IN THIS PLAN WAITS ON NICK.** His words, same day: *"no tsting is dependant on humans
> until its is proven ready to go by agents driving the machine and testing as the user in every
> way possible no need to ask just do it - apps are in test mode i dont need to log in ever they
> just do it"*. Every test step names the agent that performs it. Agents click the real controls,
> type in the real fields, sign themselves in, and read the result back. **Anything involving
> voice is tested with real audio in both directions — speech played out through the speakers and
> speech captured through the microphone, on the real machine; a mocked audio path is not a voice
> test and may not close a voice step.** Handing him a test is permitted only when an agent
> genuinely cannot perform it, and then the step says what was tried and what stopped it.
> **STEP 0 — ARM THE LOOP, BEFORE ANYTHING ELSE.** Set a 5-minute loop. Every time it fires,
> answer these four in order and CORRECT any failure before doing anything else:
> 1. **NORTH STAR** — is what I am doing this minute moving this plan's North Star? If not,
> drop it and take the highest-value unblocked step that does.
> 2. **FAN-OUT** — is my queue full up to the concurrency cap (§T)? Full capacity means the
> cap is reached and a queue of ready work sits behind it — NEVER "launch everything at
> once". Below the cap with ready work → dispatch now. At the cap → queue, don't launch.
> 3. **CHEAP** — are cheap models doing the building? If anything expensive is building,
> move that work down now.
> 4. **BLOCKED** — for anything I have called blocked: name the three concrete things I tried.
> If I cannot, it is not blocked — drive through it now.
> Then keep building. The loop never stops until the FINISH LINE is proven.
(For THIS plan the fan-out cap is deliberately ONE worker in flight from this session — three other sessions share tonight's machine budget, and last night's crush is the reason. That is the cap, not a stall.)
### STEP 1 — Create the archive home, the retirement note, and this plan's changes file
**Enter this step when:** nothing. This is the first step.
**Builder:** GLM 5.3 (zai), haiku-tier grunt fallback · **Checker:** Sonnet, different session
**Files you may touch:** inside `projects/_archive/goal-purge-2026-09-04/`, a new file named RETIREMENT-NOTE.md; inside `projects/ops/retirement/`, new files named STATE.md and PLAN-CHANGES.md (all three declared in §0's created-artifacts list). **Never** any existing file.
**Do exactly this:**
1. Create the folder `projects/_archive/goal-purge-2026-09-04/` and write the retirement note: plain English — what this archive is, Nick's 2026-09-04 words it executes, the disposition table copied from §1c, and per-item resume instructions for Gracie, Neeko and the family app (what to move back, which jobs to re-enable by removing `disabled:`).
2. Create the changes file (header + date) and the state file (current state: not started).
3. Commit scoped: `git commit -m "goal-purge STEP 1: archive home + retirement note" -- projects/_archive/goal-purge-2026-09-04 projects/ops/retirement`.
**PROOF — all must be true:**
- `ls projects/_archive/goal-purge-2026-09-04/` prints `RETIREMENT-NOTE.md`.
- The note names Gracie, Neeko and the family app as RESUMABLE with concrete resume steps. FAILS IF any of the three is missing.
**If it fails:** one line to the overseer; next unblocked step is STEP 2 (independent).
**Checker's job:** re-run the proof yourself; read the note cold and confirm a stranger could resume Gracie from it.
### STEP 2 — Re-verify every RETIRE/DISABLE row two ways, before anything moves
**Enter this step when:** nothing. This is independent of STEP 1.
**Builder:** GLM 5.3 (zai), haiku grunt fallback · **Checker:** Sonnet, different session
**Files you may touch:** inside `projects/ops/retirement/evidence/`, new files named refcounts-before.txt and citation-sweep.sh (declared in §0's created-artifacts list). **Never** any file being inventoried — this step is read-only against the workspace.
**Do exactly this, per §1c RETIRE/DISABLE/DEFER row (items 1, 5, 6, 9, 10, 11, 13, 15, 17, 20, 21, 22, 23, 24, 25, 29):**
1. METHOD-A (content): `command grep -ril "<item's name patterns>"` over `projects/`, `ZION/` and `.claude/` — patterns, not exact names (e.g. `skippy[ -_]?school`, `neeko`, `sp13-quality`, `openbrain`). Record the file list and count under a `METHOD-A` heading.
2. METHOD-B (structure, differently shaped): suffix-aware filename sweep — a glob for the item's filename stems anywhere in the tree (e.g. `*shopping*`, `*neeko*`, `PLAN-ZION-6*`), PLUS a read of the one live surface that would present it (the jobs folder listing for jobs; the programme index for lanes; the board read for cards). Record under `METHOD-B`.
3. For each row, write one DEPENDENCY line: what still calls/reads this item from a KEPT surface. 🔴 A hit on a kept surface is a finding, not a blocker — it changes the disposition to FOLD or adds a citation-update to STEP 10, and the change is a dated delta in the changes file.
4. Write the sweep script: for every path this plan will move, a `command grep -rl` over the live tree excluding `projects/_archive` and `.claude/worktrees`, exiting non-zero if any live citation of an old path remains. Prove it can fail: run it BEFORE any move — it must exit non-zero (the paths are still cited); record that red run in the evidence file.
5. Commit scoped to the two evidence files.
**PROOF — all must be true:**
- `command grep -c "METHOD-A" projects/ops/retirement/evidence/refcounts-before.txt` ≥ 16 and the same count for `METHOD-B` — every row measured both ways. FAILS IF any row has only one method.
- The red run of the sweep is recorded with its non-zero exit. FAILS IF the sweep has never been seen failing.
**If it fails:** the item with a single-method count is re-measured before any step moves it; everything else proceeds.
**Checker's job:** pick three rows at random, re-run both methods yourself, compare counts. A mismatch throws the row's evidence out for re-measurement.
### STEP 3 — Dated dispositions into the ZION programme index
**Enter this step when:** STEP 2's evidence covers the ZION rows.
**Builder:** GLM 5.3 (zai), haiku grunt fallback · **Checker:** Sonnet, different session
**Files you may touch:** `projects/ops/zion/PLAN-ZION-PROGRAMME.md` (status deltas only), its change record. **Never** delete a lane row, a stage, a goal or a capability — governance forbids it; RETIRED is a status, not a removal. **Never** touch ZION-3/4/8/12/14 rows beyond leaving them as they are.
**Do exactly this:**
1. Re-read the index immediately before writing (§W — another session may have edited it tonight).
2. For each §1c ZION row: append a dated status line to the lane's index row — `RETIRED 2026-09-04, Nick's words in REGROUP-SOURCE §A12; work archived under projects/_archive/goal-purge-2026-09-04/` (or FOLDED → named owner, or PARKED, or DEFERRED-IN-PLACE per §1c).
3. Post the two handoff lines: ZION-17 → into `projects/ops/zion/STATE-ZION-19.md` (`board-PM enforcement folds into Hub work per Nick 2026-09-04`); ZION-7 → into the SMP index for SMP-8 (`the jobs fleet is SMP-8's root; fleet repair is its work`). 🔴 NOT into ZION-3's plan: that file was superseded on 2026-09-04 and its own first lines say so, so a handoff posted there reaches nobody.
4. Dated delta in the programme change record; commit scoped to the files touched.
**PROOF:** `command grep -c "2026-09-04" projects/ops/zion/PLAN-ZION-PROGRAMME.md` ≥ 12 (nine RETIRED + two FOLDED + one PARKED). FAILS IF any retired lane's row still reads as open work with no dated disposition.
**If it fails (e.g. the governance gate refuses the write):** do not stall on a ticket — record the prepared deltas in the state file (ungoverned), continue with STEPS 4+ where permitted, and hand Nick the one-line ask in STEP 13.
**Checker's job:** re-run the grep; read three deltas and confirm each cites Nick's words and the archive path.
**Handoff:** the two dated lines in action 3, posted the moment this closes, not batched.
### STEP 4 — Move the retired ZION lane files into the archive
**Enter this step when:** STEP 3's deltas are landed (an index must never point at a hole).
**Builder:** GLM 5.3 (zai), haiku grunt fallback · **Checker:** Sonnet, different session
**Files you may touch:** the plan/state/changes/questions/evidence files of ZION-1, 5, 6, 9, 10, 11, 13, 16, 18 ONLY, and their destinations under `projects/_archive/goal-purge-2026-09-04/` preserving source-relative paths. **Never** ZION-3/4/8/12/14/17/19-owned files, **never** `projects/ops/zion/_regret-registry-164.txt` (a live gate input).
🔴 **RETIREMENT COLLISION, FOUND BY THE CROSS-PLAN COLD REVIEW 2026-09-04 — ZION-17's FILES DO NOT MOVE IN THIS DRIVE, AT ALL.** This plan originally archived `PLAN-ZION-17-board-pm-enforcement.md` and `STATE-ZION-17.md` once their handoff was posted. The Hub plan's STEP 9 **writes into both of those files** and reads `projects/ops/zion/evidence/step12-round12-findings-2026-09-03.txt` beside them, all named in its own file fence. Archiving them mid-drive would silently break a step in a live plan — the precise failure this plan's own dependency rule exists to prevent, and worse than leaving a document where it is. The fold is therefore recorded as an INDEX STATUS CHANGE ONLY; the files stay until the Hub plan closes, and whoever closes it may move them then. Nothing in this drive owns that later move, and that is deliberate rather than an omission.
**Do exactly this:**
1. For each of the nine lanes: check the file is clean of concurrent edits (`git status --porcelain` on that one path — dirty means wait one pass and retry, §W), prepend a banner (`RETIRED 2026-09-04 — archived by the goal purge, Nick's order in REGROUP-SOURCE §A12; nothing here is current instruction`), then `git mv` it to the archive preserving the source-relative path.
2. One scoped commit per lane batch, paths named: `git commit -m "goal-purge STEP 4: <lane> archived" -- projects/ops/zion projects/_archive/goal-purge-2026-09-04`.
**PROOF:**
- `ls projects/_archive/goal-purge-2026-09-04/projects/ops/zion/` lists files for all nine lanes.
- `ls projects/ops/zion/` no longer lists a PLAN or STATE file for the nine retired numbers, and still lists the kept lanes' files. FAILS IF a kept lane's file moved or a retired lane's file remains.
**If it fails:** the failed lane stays in place with its banner; one line to the overseer; the other lanes proceed.
**Checker's job:** re-run both listings; open two archived files and confirm the banner is the FIRST thing a reader sees.
### STEP 5 — SMP deltas, the Alexa wider-ambition spec, Skippy School's lane
**Enter this step when:** STEP 2's evidence covers the SMP/Alexa/school rows.
**Builder:** GLM 5.3 (zai), haiku grunt fallback · **Checker:** Sonnet, different session
**Files you may touch:** `projects/_archive/goal-purge-2026-09-04/projects/ops/skippy-master-plan/PLAN-SMP-PROGRAMME.md` (dated status deltas + one handoff line only), `projects/_archive/goal-purge-2026-09-04/projects/ops/skippy-master-plan/PLAN-SMP-2.md` and `projects/_archive/goal-purge-2026-09-04/projects/ops/skippy-master-plan/PLAN-SMP-9.md` (banner lines only), `projects/_archive/goal-purge-2026-09-04/projects/personal/skippy-app/ALEXA-ACCESS-SPEC.md` (banner + git mv), archive destinations under `projects/_archive/goal-purge-2026-09-04/`. **Never** any other SMP lane file, **never** anything under `projects/personal/learning-app/` (the app root stays untouched on disk; the deployed site keeps serving per §1a row 4), **never** SMP-10's channel-adapter material.
**Do exactly this:**
1. Re-read each file immediately before writing.
2. SMP index: dated delta lines — SMP-2 `PARKED 2026-09-04 (family app resumes after Skippy — Nick: "finish voice app then we deploy the same setup in the hub and family app")`; SMP-9 `RETIRED 2026-09-04 (Skippy School dropped — Nick, REGROUP-SOURCE §A12); lane docs archived; the deployed site keeps serving untouched`. Plus one handoff line: `the projects/ops/REBUILD-2026-08-21/ leftovers belong to this programme's own archive manifest (SRC rows); completing that move is SMP work, flagged 2026-09-04 by the goal purge`.
3. Banner `projects/_archive/goal-purge-2026-09-04/projects/ops/skippy-master-plan/PLAN-SMP-9.md` and git-mv it (with its changes file) to the archive under its source-relative path. Banner `projects/_archive/goal-purge-2026-09-04/projects/ops/skippy-master-plan/PLAN-SMP-2.md` as PARKED in place (its lane resumes; the file stays).
4. Banner and git-mv `projects/_archive/goal-purge-2026-09-04/projects/personal/skippy-app/ALEXA-ACCESS-SPEC.md` to the archive (`the Alexa CHANNEL lives in SMP-10 and is kept; this wider-access ambition is retired per Nick 2026-09-04`).
5. Scoped commits naming exactly these paths.
**PROOF:**
- `command grep -c "PARKED 2026-09-04\|RETIRED 2026-09-04" projects/_archive/goal-purge-2026-09-04/projects/ops/skippy-master-plan/PLAN-SMP-PROGRAMME.md` ≥ 2.
- `ls projects/_archive/goal-purge-2026-09-04/projects/personal/skippy-app/` lists the Alexa spec. FAILS IF the learning-app root changed at all (`git status --porcelain -- projects/personal/learning-app` non-empty is a step failure).
**If it fails:** deltas that landed stand; the failed move stays in place with its banner; one line to the overseer.
**Checker's job:** re-run the proofs; confirm SMP-10's files are untouched (`git log --oneline -1 -- projects/_archive/goal-purge-2026-09-04/projects/ops/skippy-master-plan/PLAN-SMP-10.md` predates today's steps).
### STEP 6 — Disable the retired capabilities' scheduled jobs, with a live control
**Enter this step when:** STEP 2's METHOD-A/B job list exists (the three named jobs plus anything the two-way search added).
**Builder:** GLM 5.3 (zai), haiku grunt fallback · **Checker:** Sonnet, different session
🔴 **CORRECTED IN PLACE 2026-09-04 (execution found the ground different from the plan — doctrine §N):** the daemon does NOT read a `disabled:` line in a job file. Measured by opening `projects/ops/skippy-jobs/runner.mjs`: every job is scheduled from the hard-coded `SCHEDULE` table inside that file (rows shaped `{ name: "<job>", hours: [...], minute: N }`), the module is imported once at daemon start, and the daemon's own precedent for switching a job off is a **commented-out table row with a dated note** (its `slack-watch` row, `// DISABLED 2026-07-17 (Nick: not helpful) — { name: ... }`; two Skippy School rows were already switched off that way before this drive). A frontmatter line would have changed nothing and the proof would have passed anyway — the exact hollow-proof failure §A forbids. So the switch is the table row, and this step's fence widens to that ONE file, table rows only.
**Files you may touch:** `projects/ops/skippy-jobs/runner.mjs` — the `SCHEDULE` table rows of the retired jobs ONLY, never a line of its logic. The retired rows, as measured in the table 2026-09-04: `sp13-quality-report`, `neeko-project-doc-sweep-run`, `neeko-daily-review-run`, `neeko-approval-drain`, `skippy-school-results-to-slack` (the other two Skippy School rows, `skippy-school-eod-report-lite` and `skippy-school-weekly-approval-lite`, were already commented out before this drive — leave them as they are). **Never** any job file under `projects/ops/skippy-jobs/jobs/`, **never** `chantelle-progesterone-reminder`, `chantelle-reps-feedback-sync`, `chantelle-confirm-cards`, `gracie-*` or any other live family/Hub-facing row, **never** any lib code, **never** the daemon's logic.
**Do exactly this:**
1. Re-read `runner.mjs` immediately before writing (§W). For each retired row, prefix the row with `// DISABLED 2026-09-04 goal-purge — capability retired by Nick's order (REGROUP-SOURCE §A12); re-enable by uncommenting — ` so the whole `{ name: ... }` object is inside the comment, following the `slack-watch` precedent exactly. Change nothing else on the line.
2. Prove the file still loads: `node --check projects/ops/skippy-jobs/runner.mjs` exits 0.
3. Control, both directions: the jobs-owner machine (named in `projects/ops/machine-roles.json`; heartbeat rows carry `[Nicks-Mac-mini]`) pulls the repo on its 2-minute auto-pull and the daemon restarts itself when its own code changes (`lib/daemon-code-fresh.mjs` + `service-restart-actor`). After that, read `HEARTBEAT.md`: the disabled jobs' rows stop advancing past their pre-change timestamps, AND one named kept job (`service-code-fresh`, every 5 minutes, or `neeko`-free hourly job `sync-drift-watch`) shows a fresh run in the same window — the known-good control. Without the control, silence proves nothing about the switch.
4. Scoped commit naming exactly `projects/ops/skippy-jobs/runner.mjs`.
**PROOF:**
- `command grep -c "DISABLED 2026-09-04 goal-purge" projects/ops/skippy-jobs/runner.mjs` prints `5`, and `command grep -E '^\s*\{ name: "(sp13-quality-report|neeko-project-doc-sweep-run|neeko-daily-review-run|neeko-approval-drain|skippy-school-results-to-slack)"' projects/ops/skippy-jobs/runner.mjs` prints nothing (no live row remains).
- `node --check projects/ops/skippy-jobs/runner.mjs` exits 0.
- The control evidence (kept job fired, disabled jobs silent, same window) is pasted into STEPS item 6. FAILS IF the kept control did not fire — then the fleet's state, not the switch, is what the silence measured, and the claim is not made.
**If it fails:** if no daemon cycle can be observed within the drive (the owner machine has not pulled, or the fleet's true state is SMP-8's to measure), record the table half as done and the fire-half as NOT MEASURABLE FROM HERE — the owner machine's daemon cycle, with the SMP-8 handoff line already posted; continue.
**Checker's job:** re-run both greps and `node --check`; `git diff HEAD~1 -- projects/ops/skippy-jobs/runner.mjs` shows exactly five changed lines, each a row prefixed with the comment, and no other change.
### STEP 7 — Archive the assistants' development work, resumable; leave Gracie's live service running
**Enter this step when:** STEP 2's evidence covers §1c rows 22–23.
**Builder:** GLM 5.3 (zai), haiku grunt fallback · **Checker:** Sonnet, different session
🔴 **NARROWED IN PLACE 2026-09-04 — a real dependency was found by the two-way check before anything moved (the exact collision class this plan exists to catch).** `projects/ops/assistants-replan/PLAN-6-KANBAN-PM.md` is read by live code: the plan gate itself (`projects/ops/agents/check_plan.py`, its grandfather allowlist), two nightly tests (`projects/ops/skippy-jobs/_test-project-open-workflow.mjs` line 4, `_test-neeko-is-not-a-human-pm.mjs` line 51 — "a missing file is a LOUD failure"), the Hub's `projects/business/business-app/scripts/seed-ai-builds-rebuild-cards.sh`, and the retired `ACTIVE-WORK.md` still points at it as "where active work now lives". **So the Kanban plan family (`PLAN-6-KANBAN-PM.md`, `STATE-6-KANBAN*.md`, `ASSUMPTIONS-6-KANBAN.md`, `QUESTIONS-6-KANBAN*.md`, `PLAN-CHANGES-6-KANBAN*.md` and their `.bak` siblings) STAYS in place.** `PLAN-1-SKIPPY.md`, `PLAN-7-APP-INTERFACE.md`, `PLAN-PROGRAMME.md`, `PLAN-CHANGES.md`, `PLAN-CHANGES-1.md`, `PLAN-CHANGES-7.md`, `QUESTIONS-1.md`, `QUESTIONS-7.md`, `ASSUMPTIONS-1.md`, `ASSUMPTIONS-7.md`, `LANE-BRIEF-COMMON.md`, `README-DRIVE.md`, `RUNNING-LIST-FOR-NICK.md` and the `STAGE*`/`AUDIT-*`/`PHASE4-*`/`DRIVE-ORDER`/`SWARM-DISPATCH`/`THREAD-START-PROMPTS`/`POSTMORTEM-*`/`PLAN-SKILL-POSTMORTEM` files are Skippy-programme or Kanban history, not Gracie/Neeko development — they are left for STEP 11b's audit, which applies the same dependency rule. The same nightly test also reads `projects/_archive/goal-purge-2026-09-04/projects/ops/THE-ASSISTANTS.md` (line 52) and `projects/_archive/goal-purge-2026-09-04/projects/ops/assistants-replan/PLAN-3-NEEKO.md` (line 57): those two DO move, and STEP 10 repoints the test's two path constants to the archive paths in the same pass (a citation update — the guard scans the documents' wording, and the archived copy is byte-identical).
**Files you may touch:** `projects/_archive/goal-purge-2026-09-04/projects/ops/THE-ASSISTANTS.md`, and inside `projects/ops/assistants-replan/` ONLY the Gracie/Neeko/Wall-E/Eeva development files: `PLAN-2-GRACIE.md`, `PLAN-3-NEEKO.md`, `PLAN-4-WALL-E.md`, `PLAN-5-EEVA.md`, `ASSUMPTIONS-2-GRACIE.md`, `ASSUMPTIONS-4-WALL-E.md`, `ASSUMPTIONS-5-EEVA.md`, `QUESTIONS-2-GRACIE.md`, `QUESTIONS-4-WALL-E.md`, `QUESTIONS-5-EEVA.md`, `PLAN-CHANGES-2-GRACIE.md`, `EEVA-DECISION-SHEET.md`, `GRACIE-PASS8-RECONCILIATION-2026-08-20.md`, `GRACIE-UNWIRED-INVENTORY.md`, `PROPOSAL-2-GRACIE-STANDING-MEMORY-2026-08-21.md`, `AUDIT-2-GRACIE-FINISH-LINE-2026-08-21.md`, `G10-BOUNDARY-SURVEY-2026-08-19.md`, `G11-MIRA-MEASUREMENT-2026-08-19.md`, `M10-RECONCILIATION-2026-08-20.md`, and the sub-folders `gracie-evidence/` and `neeko/` (banner + git mv to archive), destinations under `projects/_archive/goal-purge-2026-09-04/` preserving paths. **Never** any `*6-KANBAN*` file, **never** the three chantelle job files named in STEP 6's fence, **never** anything under `projects/ops/skippy-jobs/lib/` (Neeko/Gracie libs stay on disk for resume), **never** any Gracie-serving code path.
**Do exactly this:**
1. Re-read each file immediately before writing. Banner each `.md` (`DEFERRED 2026-09-04, RESUMABLE — Nick: "finish skippy then we do gracie and neeko later"; resume instructions in the archive's retirement note; nothing here is current instruction`) as its FIRST line, then `git mv` it to the archive preserving its source-relative path. Sub-folders move whole.
2. Scoped commit naming BOTH SIDES of the move — the source paths it is moving FROM and the archive folder it is moving INTO — so git records renames rather than a deletion beside an unrelated addition. At the time this step ran that was `projects/ops/assistants-replan` and `projects/_archive/goal-purge-2026-09-04`, plus the assistants overview file, which now lives at `projects/_archive/goal-purge-2026-09-04/projects/ops/THE-ASSISTANTS.md`.
**PROOF:** `ls projects/_archive/goal-purge-2026-09-04/projects/ops/` lists `THE-ASSISTANTS.md` and `assistants-replan`; `ls projects/_archive/goal-purge-2026-09-04/projects/ops/assistants-replan/` lists `PLAN-2-GRACIE.md`, `PLAN-3-NEEKO.md`, `gracie-evidence`, `neeko`; `ls projects/ops/assistants-replan/PLAN-6-KANBAN-PM.md` still prints the path (it did NOT move); `git status --porcelain -- projects/ops/skippy-jobs/lib` shows nothing from this step's commits. FAILS IF any lib file moved or any `*6-KANBAN*` file moved.
**If it fails:** banner-in-place instead of move; one line to the overseer.
**Checker's job:** re-run both; confirm the RESUMABLE banner names the resume trigger as "after Skippy, on Nick's word" rather than a date nobody set.
### STEP 8 — Archive the OpenBrain-delivery and quality-tracking doc folders; prove the live store untouched
**Enter this step when:** STEP 2's evidence covers §1c rows 25 and 11, including the DEPENDENCY lines.
**Builder:** GLM 5.3 (zai), haiku grunt fallback · **Checker:** Sonnet, different session
**Files you may touch:** the folders `projects/ops/openbrain-delivery/` and `projects/ops/sp13-quality-tracking/` (banner + git mv), destinations under `projects/_archive/goal-purge-2026-09-04/`. **Never** `projects/personal/health/engine/brain-routing/`, **never** `projects/business/business-app/engine/`, **never** any running store, adapter or MCP registration.
**Do exactly this:**
1. Check STEP 2's DEPENDENCY lines for these folders: if any KEPT surface reads a file inside them (a runbook an engine loads, a config a job reads), that file STAYS and only the rest moves — the §1c disposition narrows via a dated delta in the changes file.
2. Banner + git-mv the folders (or their non-depended remainder) to the archive.
3. Scoped commit.
**PROOF:** `ls projects/_archive/goal-purge-2026-09-04/projects/ops/` lists both folders; after the move, one live probe of each MCP front door (`personal_answer`, `business_narrative_answer` — one benign question each) returns a real answer. FAILS IF either engine's answer path degraded — then the move touched a dependency and the move commit is reverted (reversible by design) before anything else.
**If it fails:** revert the move commit, record the dependency, narrow the disposition with a dated delta.
**Checker's job:** re-run the two MCP probes yourself in a fresh session; a missing tool is an unconfigured machine, not a broken store — say which you observed.
### STEP 9 — Purge the live pointers: canon table, heartbeat rows, board cards
**Enter this step when:** STEPS 3–8 dispositions are landed (a pointer must have somewhere true to point).
**Builder:** GLM 5.3 (zai), haiku grunt fallback · **Checker:** Sonnet, different session
**Files you may touch:** `ACTIVE-WORK.md` (status cells of retired items' rows only), `HEARTBEAT.md` (rows of retired drives only), board cards via `node projects/ops/skippy-jobs/lib/board-report.mjs` (close/annotate verbs only). **Never** another session's live rows; **never** create a new tracker.
**Do exactly this:**
1. Re-read each file immediately before writing (§W — HEARTBEAT is written by everything).
2. ACTIVE-WORK: mark each retired item's row `RETIRED 2026-09-04` with the archive pointer; kept rows untouched.
3. Board: read the board, close or annotate any open card driving a retired lane, citing Nick's 2026-09-04 words; read each change back from the board (a write receipt is a claim).
4. Scoped commits naming exactly the files touched.
**PROOF:** `command grep -ci "RETIRED 2026-09-04" ACTIVE-WORK.md` ≥ 1 per retired item present in that table (count recorded against STEP 2's baseline); the board read-back shows zero open cards for retired lanes, pasted into STEPS item 9. FAILS IF a card claims closed but a fresh board read still shows it open.
**If it fails:** the board tool being unreachable is NOT MEASURABLE FROM HERE — the board tool, recorded with the command's own error text; the file edits still land.
**Checker's job:** fresh board read yourself; diff ACTIVE-WORK's retired rows against §1c.
### STEP 10 — Update every citation of every moved path, in the same pass
**Enter this step when:** STEPS 4, 5, 7, 8 moves are landed.
**Builder:** GLM 5.3 (zai), haiku grunt fallback · **Checker:** Sonnet, different session
**Files you may touch:** any LIVE-tree file whose only needed change is repointing a moved path to its archive path (or marking the reference retired) — each file named in the commit. **Never** files under `projects/_archive/` (history stays as written), **never** `.claude/worktrees/`, **never** generated files (their generators get a NEXT-list line instead — a hand-edited mirror is registry entry 40's failure).
**Do exactly this:**
1. Run the sweep: `bash projects/ops/retirement/evidence/citation-sweep.sh` (built and proven red by STEP 2).
2. For every hit: update the citation to the archive path, or mark it retired-with-pointer; generated files (the org chart, capability pages) get one NEXT-list line naming the generator instead of a hand edit.
3. Re-run the sweep until it exits zero. Scoped commits.
**PROOF:** `bash projects/ops/retirement/evidence/citation-sweep.sh` exits 0 (and was seen exiting non-zero in STEP 2 — a check never seen red is not a check). FAILS IF exit 0 was achieved by narrowing the sweep rather than fixing citations — the checker diffs the sweep script against STEP 2's committed version.
**If it fails:** remaining hits are listed in the state file with owners; the next step proceeds only if the hits are generated-file lines already on the NEXT list.
**Checker's job:** confirm the sweep script is byte-identical to STEP 2's committed version, then re-run it yourself.
### STEP 11 — After-counts: the same two-way measurement, after the purge
**Enter this step when:** STEPS 9–10 are landed.
**Builder:** GLM 5.3 (zai), haiku grunt fallback · **Checker:** Sonnet, different session
**Files you may touch:** inside `projects/ops/retirement/evidence/`, a new file named refcounts-after.txt (declared in §0's created-artifacts list). Read-only otherwise.
**Do exactly this:** repeat STEP 2's METHOD-A and METHOD-B per row, same patterns, same scopes; record counts beside the before-counts; for each row state plainly what remains and why it is legitimate (history, archive, parked code) — a number without its population is registry entry 72's failure. This plan's own files and evidence are a named, subtracted population (an investigation's searches must not contaminate its evidence).
**PROOF:** `command grep -c "METHOD-A" projects/ops/retirement/evidence/refcounts-after.txt` ≥ 16 and the same for `METHOD-B`; every row's remaining-hits line names its population. FAILS IF any row's remainder includes an unexplained live-surface hit.
**If it fails:** the unexplained hit routes back to STEP 9/10 as one more pointer; re-measure only that row.
**Checker's job:** re-run two rows' methods yourself; compare.
### STEP 11b — ECOSYSTEM-WIDE FILE AUDIT: every file the recent drives created gets a disposition
**Enter this step when:** STEP 2's two-way search method exists (this step reuses it — never a third search).
**Builder:** glm (cheap, fanned out by folder, one worker per subtree) · **Checker:** sonnet, on a sample it picks itself, not one the builder offers.
**Files you may touch:** this plan's §1c (an appended audit table) and the archive destination under `projects/_archive/goal-purge-2026-09-04/`. **Never** any file listed in the four live-dependency fences, never the Hub-lane or Skippy-lane files, never `.git`.
🔴 **WHY THIS STEP EXISTS AND WHY IT IS BIGGER THAN THE 30-ROW INVENTORY.** Nick, 2026-09-04: *"during the last several drives we had agents creating files left and right - we need to define what really needs to stay and archive the vast majority of other stuff"*. The §1c inventory covers the LANES he named. It does not cover the sediment: evidence files, audit write-ups, staging folders, `.bak` copies, one-off harnesses, superseded specs, scratch notes and duplicate agent definitions that accumulated while those lanes ran. That sediment is what makes the folder unnavigable, and it is the actual thing he is asking to be cleared.
**Do exactly this:**
1. **Measure the ground first, and record the number.** Count files created or last modified during the drive window, by subtree: `git log --since=2026-08-20 --name-only --pretty=format: | sort -u | wc -l`, then the same per top-level folder. Paste the real output. 🔴 That is a git-tracked count only — pair it with a filesystem sweep (`find . -newermt 2026-08-20 -type f -not -path "./.git/*"`) because an untracked file is exactly the kind that gets lost. Two methods, both named, per §Z.
2. **Classify every one of them into exactly one of four buckets**, and write the rule you used before you start, not after: **KEEP-LIVE** (something running depends on it — name what) · **KEEP-REFERENCE** (a human or agent will genuinely open it again — name who and when) · **ARCHIVE** (real work, finished or superseded, moves intact) · **ALREADY-COVERED** (a §1c row owns it). Default is ARCHIVE: the burden is on keeping, which is the whole point of the step.
3. **Write the KEEP set down as a document in its own right** — appended to §1c as "What actually needs to stay, and why". This is the deliverable Nick asked for, not a by-product. A future agent reads this to know what the folder is for.
4. **Archive the ARCHIVE bucket** with `git mv` into the dated archive folder, structure preserved, banner added — same mechanism as every other archive step here. **Zero deletions**, including `.bak` files: they are evidence of what a file used to be.
5. **Report the duplicates you find rather than resolving them silently.** Measured example already known: `larry.md` and `benito.md` exist in BOTH `ZION/agents/` and `.claude/agents/`. Two copies of one agent definition is a live ownership question, not sediment — list them for Nick with a recommendation, do not pick.
**PROOF:** the per-folder counts pasted from both methods; every counted file appears in exactly one bucket (the four bucket counts sum to the measured total — state both numbers, and a mismatch is a FAIL, not a rounding note); the KEEP set exists as prose a cold reader can act on; the archive move is proven by `git log --diff-filter=R` showing renames, not deletions.
**FAILS IF:** the two counting methods disagree and the difference is not explained · anything is deleted · a file is classified KEEP-LIVE without naming what depends on it · the buckets are assigned by folder name rather than by opening the files.
**If it fails:** an over-large ARCHIVE bucket is recoverable (it is a git move); an over-large KEEP bucket is the failure mode that leaves the folder exactly as unnavigable as before — so a KEEP bucket above 20% of the measured total is reported to Nick with the reason, not quietly accepted.
**Checker's job:** pick your own sample of 20 files across the buckets, open them, and grade the classification. Re-run the count commands first-hand — audit means re-run, never recite.
### STEP 15 — THE CONFLICT PURGE: one live document per active project (Nick's second hand-off, 2026-09-04)
**Enter this step when:** STEP 11b's wave 1 is landed and Nick's hand-off `projects/ops/retirement/PROMPT-CONFLICT-PURGE.md` exists (it does — his words: *"I want it to be impossible for an agent to find two different answers to the same question … One live document per active project. Everything else is either archived or gone."*).
**Builder:** the driving session (fable) — classification is judgment, the moves are scripted · **Checker:** the nightly tests that name a moved path, run before and after against a pristine checkout of HEAD; a cold reader on the KEEP list is still owed (see STEP 12's method).
**Files you may touch:** this plan (§1c-audit, this block, STEPS, NEXT), STATE.md, PLAN-CHANGES.md, the archive under `projects/_archive/goal-purge-2026-09-04/` (renames only), the exact-path citations of every moved file in the live tree, and `PLAN-SKIPPY-FINISH.md`'s header line naming the archived programme. **Never** a client folder, a nested repository (the business app), a file another session has uncommitted edits in, `ZION/lib`, a live job's logic path, or `.git`.
**The test, written before classifying (Nick's own):** *could a competent agent, opening this cold, mistake it for current instruction?* If yes it goes — a banner is not protection. What stays must be named with the reason it stays.
**Do exactly this:**
1. Measure readers with a checker that has been proven on a known positive first (the first three versions of this drive's reader check silently returned zero for everything because the repository path contains a space and `xargs` split it — caught only because a known reader was missing; v4 uses NUL-delimited paths and lists 15 readers for the family test copy).
2. Separate real reads (a script opens the file, a job writes into the folder, a hook guards the path) from mentions (a comment naming the spec that governed the code). Mentions do not keep a document live; reads do.
3. Move what fails Nick's test by `git mv` into the dated archive, structure preserved, one banner line on each archived governing document naming the live authority for its subject. Zero deletions.
4. Repoint every exact old path in the live tree to its archive path, skipping files another session has uncommitted edits in (named in PLAN-CHANGES) and the classes STEP 10's sweep excludes by reason; a root-level bare filename must never be used as a swap key (it matched inside the canonical `projects/ops/WAITING-ON-A-PERSON.md` once and was reverted).
5. Run the nightly tests that named a moved path, in both trees; a test red in both is pre-existing and listed, a test red only after is a dependency and the move is undone (the rebuild record: a live content-gate hook guards its path, so it moved back).
6. Write the KEEP list in §1c-audit as prose, with the reader or reason per item, and the before/after counts.
**PROOF:** `git show --diff-filter=D --name-only 7eddc72e8` names only two files whose archive copies are the two `--diff-filter=A` lines (a rename pair git could not match because the one-line banner changed more than half of each tiny file — both exist under the archive, nothing lost); `git show --diff-filter=R --name-only 7eddc72e8 | wc -l` → 5,743; `ls projects/ops/skippy-master-plan/*.md` prints exactly the three SKIPPY-FINISH files; the counts in §1c-audit reproduce from `git ls-tree -r --name-only 47e9bf73a` vs `git ls-files` with the archive excluded. FAILS IF anything is deleted, a live reader is broken (a test red only after the move), or the KEEP list names an item without its reader or reason.
**If it fails:** every move is a rename — `git mv` it back, as the rebuild record was.
**Checker's job:** re-run the before/after test comparison first-hand on a fresh checkout; open ten archived documents at random and confirm each carries the banner and its old path; open ten KEEP items and confirm the named reader really opens the file.
### STEP 12 — The cold walk: a session that built none of this tries to get lost
**Enter this step when:** STEP 11's after-evidence exists.
**Builder (executor):** Sonnet, a FRESH session that has seen none of this plan's execution — this is verification-tier work, deliberately not cheap · **Checker:** fable (this session) — relays the verdict UNCHANGED into STEPS under the heading `COLD WALK VERDICT`; a relay that edits the verdict is the self-grading this plan forbids.
**Files you may touch:** none. This step is read-only.
**Do exactly this (the brief to the cold session, verbatim intent):** "Open ACTIVE-WORK, both programme indexes, the board, and the jobs folder. List every piece of work a new agent would believe is LIVE. Then try, honestly, to find a way into any of: the shopping list, the weekly report, Skippy School lessons, the OpenBrain build, the model-router build, the cleanup audit, wider Alexa access, Gracie/Neeko development. PASS = every route ends at a dated retired/parked marker pointing at the archive; FAIL = any route presents retired work as live, named with file and line."
**PROOF:** the verdict, PASS or FAIL with named routes, pasted verbatim under STEPS item 12 beneath the words `COLD WALK VERDICT`. FAILS IF the verdict is FAIL, or if the walk was performed by any session that executed STEPS 1–11.
**If it fails:** each named route becomes one more STEP 9/10 pointer fix; the cold walk re-runs on the named failures only (one check round per §G — no fresh full sweep).
**Checker's job (this session):** relay unchanged, including anything unflattering.
### STEP 13 — Tell Nick, in plain English
**Enter this step when:** STEP 12's verdict is in.
**Builder:** the driving session (fable) · **Checker:** Sonnet — runs the closing-message linter (`node projects/ops/skippy-jobs/lib/check-closing-message.mjs` on the draft) and reads it as a stranger before send.
**Files you may touch:** the state file (final state; write the words `REPORT SENT` with the date when it is).
**Do exactly this:** three labelled blocks (Where this project stands · The goal · What needs you), no jargon, no paths, no codenames; restate what was archived, what was parked and how it resumes, what keeps running (the kids' site, Chantelle's reminders, the memory store), and the one ruling conflict resolved (§1a row 6) so he can overrule it in one word if he wants. End with WHAT'S WAITING ON YOU or NOTHING NEEDS YOU.
**PROOF:** message sent; `REPORT SENT 2026-09-XX` recorded in the state file. FAILS IF the message names an internal codename without explaining it.
**If it fails:** rewrite against the cold-reader test and resend once.
### STEP 14 — Postmortem, in this file, then close
**Enter this step when:** STEP 13 is sent.
**Builder:** the driving session (fable) · **Checker:** Sonnet, different session
**Files you may touch:** this plan file (POSTMORTEM section + STEPS), `.claude/skills/plan/references/failure-registry.md` (append only, four-cell format, only if a genuinely new pattern emerged — "nothing worth extracting" is a good answer).
**Do exactly this:** write `## POSTMORTEM` at the end of this file: what the purge measured wrong at planning time, any disposition that changed mid-drive and why, and whether the archive-the-work/purge-the-pointers split held. Append to the registry only a recurring, non-obvious, codifiable pattern.
**PROOF:** `command grep -c "POSTMORTEM"` on this file (run from `projects/ops/retirement/`, target `PLAN.md`) ≥ 2. FAILS IF the plan closes without the section.
**If it fails:** the lane is not closed — a lane is not closed until its postmortem is written into its own plan file.
## 4 · Regret Check (every registry entry, or the plan is not done)
*167 registry entries counted 2026-09-04 (168 after the 2026-09-04 append covered by the STEP 15 row), plus two novel rows at the end. Recurring measures, named once and cited by key: **M-2WAY** = every RETIRE/DISABLE decision is measured two differently-shaped ways before and after (STEPS 2, 11; §Z); **M-ARCH** = archive-over-delete, git-mv with structure preserved, banner first, nothing deleted (STEPS 4, 5, 7, 8); **M-CITE** = every moved path's citations updated in the same pass, sweep proven red first (STEPS 2, 10); **M-SCOPED** = scoped commits naming paths, re-read before write, no stash (§3 contracts, §W); **M-CTRL** = every silence claim carries a known-good control (STEP 6's kept-job control; STEP 8's MCP probes); **M-COLD** = a fresh session that built nothing grades the result and the verdict is relayed unchanged (STEP 12); **M-STATUS** = dispositions land as dated status deltas, no stage/goal/capability deleted (STEPS 3, 5, 9); **N/A-NOBUILD** = this plan builds no code, no UI, no store and no pipeline — it moves documents, edits status lines and flips reversible frontmatter.*
| Failure mode (registry entry) | The measure in THIS plan that prevents it | Where it lives |
|---|---|---|
| A second system was built because the first was invisible | Ownership receipt cites the fresh two-way search for an existing purge project; the one prior owner (custodian ruling) is on the sheet | §0, §1a row 6 |
| A capability was declared impossible from a stale or unverified claim | Nick's "there are no scheduled jobs right now" is treated as impression; STEP 6 measures with a control instead of building on it | §0 P3, STEP 6 |
| An absence was asserted without opening the store that would hold it | M-2WAY; the store that would hold each item is named per row | STEPS 2, 11 |
| A known constraint's reason was lost, and it silently capped the product | Every disposition row cites Nick's exact clause; the 08-30 vs 09-04 ruling conflict is quoted on the sheet, both dated | §1c, §1a row 6 |
| An instruction assumed capacity the executor doesn't have | Steps fence to file lists a worker can hold; the inventory is in this one file, not spread across reads | §3b fences |
| Expectations/manifest rows carried no grounding | Every §1c row carries its measurement method and date | §1c header |
| Work was written to a queue no reader ever visits | Every artifact names its reader (archive→future agent; report→Nick; evidence→checkers) | §2 UX map |
| A detector's death was invisible because only its target read it | The citation sweep's red run is recorded where the checker re-reads it, not only where it runs | STEP 2.4 |
| A decision settled once re-opened elsewhere, or two copies of a rule disagreed | The two conflicting purge-ownership rulings are surfaced together, resolved by the later, on the sheet | §1a row 6 |
| A rule constraining the user turned out to be an agent's invention | Every disposition quotes Nick verbatim with date and source line | §1c |
| Remediation was ordered with diagnosis last | STEP 2 (measure) gates every move step (act) | §3b gates |
| A document, label, or comment was believed over the live system | Dispositions rest on tonight's live globs/greps/listings, not on lane files' own status claims | §1c method |
| A proposal was sold on a capability never opened and read | The kill-switch (frontmatter honoured as step −2) is MACHINE-RULES rule 8's own documented mechanism, not an assumed one | STEP 6 |
| A cause was named and acted on without eliminating alternatives | STEP 8's failure branch distinguishes "move broke it" from "engine was already unconfigured" before reverting | STEP 8 |
| The human was asked a question the record already answers | Zero UNCONFIRMED rows; everything is settled from his 2026-09-04 words; STEP 13 asks nothing already answered | §1a |
| A spec and its guard were authored by the same hand and ratified the same defect | The cold walk brief's PASS/FAIL bar is written here at plan time; the walker never saw the execution | STEP 12 |
| Session rules never reached the subagents doing the work | Every dispatch carries the §T header with MACHINE RULES substance pasted, per the skill | §3 contracts |
| One rule was blanket-applied across items needing per-item answers | Five distinct dispositions exist; each row decided per item, not one verb for all 30 | §1c |
| Pattern-matching scoped too loosely produced false connections | Patterns are suffix-aware but per-item, and every remaining hit is classified by population in STEP 11 | STEPS 2, 11 |
| Rules existed but were psychologically dormant at answer-time | STEP 0's loop re-fires the four questions every five minutes | STEP 0 |
| A run exceeded its cost/time ceiling or hung unbounded | One worker in flight, hard; sweeps scoped to named roots, never the home folder | STEP 0 note, §5 |
| A helper was dispatched on a brief with a wrong or missing constraint | Every step block names its never-touch list explicitly for the worker's brief | §3b fences |
| A claim about the user/system was made without its source | Every count in this plan carries its command; every Nick claim its quote and line | throughout |
| A conclusion was drawn from a partial read | M-2WAY; the programme indexes were read, not just globbed | §1c |
| A fact was quoted as current without its date | Every measurement dated 2026-09-04 | §1c, §0 |
| A computed value never reached the persistent record | Evidence files are written to disk before verdicts are composed | STEPS 2, 11 |
| A missing lookup key fell back silently to a wrong default | N/A-NOBUILD: no lookups or defaults are coded here | — |
| A hardcoded identifier broke when the referent was recreated | Archive paths preserve source-relative structure so old citations map 1:1 | M-ARCH |
| A placeholder or wrong-level path shipped as a literal instruction | Every path in this plan was globbed or read tonight; the plan's own future artifacts are declared in §0 | §3b, §0 |
| A UI reported success while the backend silently failed | Board closes are read back from the board, never trusted from the write receipt | STEP 9.3 |
| Mid-session state was assumed unchanged | Re-read immediately before every write | M-SCOPED |
| Uncertainty was silently absorbed instead of marked | NOT MEASURABLE states are named outcomes in STEPS 6 and 9, never converted to pass/fail | STEPS 6, 9 |
| A serial multi-step operation blew its time budget | Steps are independent where dependencies allow; nothing waits on an unneeded predecessor | §3b entry gates |
| An external action went unlogged and became unrecoverable | Every move is a git commit; every board action read back and pasted | M-SCOPED, STEP 9 |
| A tool's own description contradicted house reality and won | The kill-switch semantics come from MACHINE-RULES, not from any job file's own comments | STEP 6 |
| Personal/identifying data exposed, or a record written to the wrong subject | Nothing here opens or quotes records; archives move whole files unread; the report to Nick names no values | anti-scope |
| One instance of a defect class was fixed while its siblings stayed broken | M-CITE sweeps repo-wide for every moved path, not the first hit | STEP 10 |
| A read operation mutated state | STEPS 2, 11, 12 are declared read-only with empty or evidence-only fences | §3b |
| The three biggest absence-claims variants: empty result, broken probe, discarded stderr | M-2WAY + M-CTRL; `command grep` mandated, bare grep banned | STEPS 2, 6, 11 |
| A generated mirror was hand-edited, or its generator never re-ran | Generated files are never hand-edited; their generators get NEXT-list lines | STEP 10.2 |
| Deployed config silently diverged from source config | N/A-NOBUILD: no deploy occurs; the one deployed surface (school site) is explicitly untouched | §1a row 4 |
| A delivery path was reordered and its notification behavior changed | Jobs are disabled, never reordered; live notification jobs are on the never-touch list | STEP 6 fence |
| A critical boundary was config-editable and could be silently widened | N/A-NOBUILD: no boundary code is touched; the file-protection gates are anti-scope | anti-scope |
| A "growing" archive had actually frozen | The archive here is deliberately frozen history; the retirement note says so plainly | STEP 1 |
| Files were archived but their citations kept pointing at them | M-CITE — this entry is the reason STEP 10 exists | STEP 10 |
| A pipeline broke silently and looked identical to a working one | M-CTRL: the kept-job control distinguishes "switch worked" from "fleet is down" | STEP 6 |
| Output was delivered somewhere the intended reader never looks | Nick's report goes to chat, his surface; the archive note sits where the follower of an old path lands | §2 |
| Concurrent sessions clobbered each other's work in a shared file | M-SCOPED: scoped commits, re-read before write, no stash, fences per live lane | §3, §W |
| An enforcement gate covered fewer paths than its rule, or failed open | The citation sweep is proven able to fail before it is trusted green | STEP 2.4 |
| Identity or authority was read from a value the caller supplies | Authority here is Nick's quoted words in a committed source file, not a relayed claim | §1c |
| A new failure state was detected but reached no human | STEP 12's FAIL routes to fixes AND STEP 13 reports what failed to Nick | STEPS 12–13 |
| The builder graded its own work and passed it | M-COLD; checkers never share a session with executors | §3b |
| A check existed that could not fail | Every PROOF names its FAILS-IF; the sweep runs red first | §3b, STEP 2 |
| The review didn't cover the shipped artifact | STEP 12 walks the LIVE surfaces after the last edit; any later edit re-runs the named failures | STEP 12 |
| A narrowing/refactoring change broke the cases that were already correct | Kept lanes are proven untouched (git status checks in STEP 5; fences everywhere) | STEP 5 proof |
| A check's verdict depended on wall-clock, machine load, or a concurrent writer | The daemon-cycle proof names its window and pairs with a same-window control | STEP 6.2 |
| A test existed but nothing ran it | The sweep script is run inside STEP 10's proof, not merely written | STEP 10 |
| An interactive element or view shipped untested / unseen | N/A-NOBUILD: no UI is built; the one UI-adjacent act (board close) is read back | STEP 9 |
| Coverage was reported optimistically | 30/30 inventory rows and 16/16 measured rows are the denominators; anything less is NOT DONE | FINISH LINE 1 |
| A staleness/freshness check used the wrong proxy | Job-fired checks read the daemon's own run log, not file mtimes | STEP 6.2 |
| A quantitative claim shipped without its method | Every number here carries its command (grep counts, glob counts) | throughout |
| Done was declared before the live surface was checked | STEP 12 is the live-surface walk and gates STEP 13 | §3b |
| A biometric/metric overrode the human's stated reality | N/A: no health content is touched; Nick's felt priorities ARE the spec | — |
| A correlation was asserted as a cause | N/A-NOBUILD: no causal claims are made about systems; failures carry controls | — |
| A recommendation repeated something already tried, uncited | The prior purge ruling (custodian, 08-30) is cited, not re-invented | §1a row 6 |
| A wrong record was disclaimed instead of corrected | Stale index rows are corrected with deltas, not bannered around | M-STATUS |
| Open items were re-typed from memory and drifted | The inventory lives in one committed table; steps cite rows, never re-list them | §1c |
| A deliverable was referenced instead of delivered | Nick's report contains the substance itself, zero pointers | STEP 13 |
| A report used names/shorthand only the writer understood | STEP 13's proof fails on an unexplained codename | STEP 13 |
| Commands were sent to a surface that can't run them | Nick's report carries no commands; commands live in this plan for agents | STEP 13 |
| A number was published without the population it was counted over | STEP 11 names each remainder's population (history/archive/parked) | STEP 11 |
| A finding existed only in the session's output and died with it | Evidence files hit disk before any verdict is composed | STEPS 2, 11 |
| The plan named a target with total precision, and the target was wrong | The SURFACE row is V1, settled by Nick's own words about what agents get lost in | §1a row 1 |
| The human approved a summary, and the summary was silent on the deciding variable | The sheet is generated from §1a, which carries the purge-vs-archive and Gracie/Neeko variables explicitly | §1a |
| A project stated its scope and never its anti-scope, and lanes leaked into adjacent work | Six-entry anti-scope, security first | §1 |
| A new rule was written as prose inside its own fix, with nothing enforcing it | The dispositions are enforced by moves/frontmatter/deltas — mechanisms, not sentences | §3b |
| A blocker common to every lane was carved out of all of them and given to nobody | Everything carved out names an owner: fleet→SMP-8, board-PM→Hub, REBUILD leftovers→SMP | §1c FOLD/HANDOFF rows |
| Lanes were built to stop: one pass, land, idle — while fixed ceremony ate the context | Steps carry continuation (next unblocked step) and the loop re-aims every 5 minutes | STEP 0, if-it-fails lines |
| A caveat nobody measured travelled as fact through multiple independent lanes | Every load-bearing count carries its re-measuring command | §1c, Already-true |
| The environment destroyed work silently, and the lane wrote a wrong lesson from it | M-SCOPED; "my change did not stick" is the first diagnosis on any vanished edit | §3, §W |
| A specification described ONE lifecycle in several places, and the copies drifted | Dispositions are defined once in §1c; steps cite rows | §1c |
| A task brief was treated as the plan, and a status checklist as the task list | This plan is the single governing file; the state file is state only | header rule |
| A red-proof failed for a reason unrelated to what it claimed to prove | The sweep's red run is against the real pre-move tree — the exact condition it detects | STEP 2.4 |
| A standing cheap-routing instruction eroded into doing the work directly | Executors are named cheap per step; the loop's question 3 re-checks every 5 minutes | §3b, STEP 0 |
| A plan's second line named a different authority nobody opened | The authorities (REGROUP-SOURCE, MACHINE-RULES, the skill) were read tonight, cited by section | §0 |
| A live bug got three confident wrong diagnoses, two claiming live verification | Failure branches name what distinguishes the hypotheses (STEP 8's control probes) | STEP 8 |
| Fourteen guards stayed green while the live screen showed the wrong thing | STEP 12 reads the surfaces a real agent reads, not this plan's own receipts | STEP 12 |
| An agent was accused of fabrication because a narrow search missed its file | M-2WAY before any "this is unreferenced" conclusion | STEPS 2, 11 |
| A tool's failure verdict was believed without checking the disk | Board and MCP results are read back from the destination, not the tool's message | STEPS 8, 9 |
| A monolithic build too large for one agent | §1b: genuinely single; steps are one-worker-sized with explicit fences | §1b, §3b |
| A rule with no template slot and no machine gate behaved as if it didn't exist | This plan passes the plan gate before execution starts | FINISH LINE 5 |
| A row-quality check counted cells instead of named columns | N/A: no new checker is built; existing gates are used as-is | — |
| Three readers reported wildly different "% complete" | Completion is the FINISH LINE's five items; no free-hand percentage is quoted | FINISH LINE |
| A V2 confirmation opened the WRONG PATH — the plan's own stated location | STEP 2's METHOD-B is a fresh structural search, never opening only the asserted path | STEP 2 |
| A shared coordination file had no per-subproject write fence | HEARTBEAT/ACTIVE-WORK edits are fenced to the retired items' own rows | STEP 9 fence |
| The cheapest decisive test was defined but not RUN early | The citation sweep and refcounts run BEFORE any move | STEP 2 |
| A build agent reported interim status as its FINAL answer | Worker briefs state: one-shot, foreground, "in progress" is not a final answer | §3 contracts |
| A sandbox error was misread as a known machine problem | N/A: no sandboxed browser/build tooling is used; moves are plain file operations | — |
| A mandated tool hit quota and the fallback was improvised | The vendor fallback (haiku grunt) is pre-written into every executor cell | §3, §3b |
| A creation reported success but did not exist on live re-query | Board writes re-queried fresh; git moves verified by listing the destination | STEPS 4, 9 |
| Three wiring gaps invisible to every automated layer | N/A-NOBUILD: no feature wiring; the one integration claim (engines still answer) is probed live | STEP 8 |
| A deployed fix never reached an open browser tab (cache-bust missed) | N/A-NOBUILD: no cache-busted asset is edited; the school site is untouched | anti-scope |
| A correct design decision was mistaken for a bug from ONE identity's view | N/A: no visibility claims across identities are made | — |
| The Updates panel read from a store the write never fed | Read-back-from-destination is the standard for every write here | STEPS 8, 9 |
| A pure QA dispatch was refused twice by the work-type gate | Dispatch headers follow §T verbatim, roles from the closed list | §3 |
| A brief was refused for missing the travel block, with no template to copy | The travel block is pasted into every brief from MACHINE-RULES' own TRAVEL BLOCK | §3 |
| A fix was left syntactically valid but unverified when its tool hit a cap | Every step's proof runs after the edit, by a different session | §3b |
| A failure found only because a fresh pass re-ran the real test | STEP 12 is exactly that fresh pass, mandatory | STEP 12 |
| A data fix applied to ONE of two live copies | STEP 2's METHOD-B catches sibling copies (worktrees excluded by name, counted honestly) | STEP 2 |
| A regression suite silently crashing since a dependency change | The sweep is re-proven red/green inside this drive, not inherited | STEPS 2, 10 |
| Two bodies of work never committed to git anywhere | Every step ends in a scoped commit; the plan itself is committed before execution | §3 |
| A deepening request answered by re-polishing instead of opening sources | The coordinator's two added sources (REGROUP-SOURCE, skill §W/§Z) were opened and cited | §0 |
| A gate covered Write/Edit but not Bash | N/A: no new gate is built | — |
| A parameter default made a branch unreachable under green tests | N/A-NOBUILD | — |
| An atomic write lost a concurrent writer's appended row | Append-only files (HEARTBEAT) are edited by row, re-read first, never rewritten whole | STEP 9 |
| A red-proof claimed without removing the fix and running | The sweep's red run is executed and recorded, not claimed | STEP 2.4 |
| Test files wrote into the REAL production log | N/A: no test harness is written; probes are read-only | — |
| An identity re-derived from a writable file instead of live auth | N/A: no identity code is touched | — |
| A daemon-wide crash handler met an uncaught promise | N/A: no daemon code is touched — frontmatter only, by fence | STEP 6 fence |
| A supersession quietly dropped functionality with no home in the new shape | Every FOLD names precisely what moves and what stays (gates run on, tools run on) | §1c |
| fs.watch assumed a sufficient trigger under concurrent load | N/A: nothing here relies on file-watch delivery | — |
| A plan asserted repo facts it never checked | Every fenced path was globbed/read tonight; §0 lists them | §0 |
| The program fixed what was BROKEN instead of building what was ASKED | The loop's question 1 and the anti-scope's no-repairing-retired-work entry | STEP 0, anti-scope |
| A plan passed every gate and still could not deliver the ask | The FINISH LINE is phrased in Nick's outcome (can't get lost), not in gate outputs | North Star |
| An assistant's account of its own failure was taken as root cause | STEP 12's walker reports what IT saw, not what executors reported | STEP 12 |
| Three verifications real, all three the wrong SCOPE | The cold walk verifies the THING (surfaces), the sweep the CITATIONS, the counts the MENTIONS — scopes named | STEPS 10–12 |
| An orchestrator's confident relay propagated a wrong conclusion | STEP 12's verdict is relayed UNCHANGED; workers may refuse steps contradicting what they see | STEP 12 |
| One writer read a handoff as a gate and serialized behind it | Entry conditions name the specific artifact, never "previous step done" (STEPS 1/2 explicitly independent) | §3b |
| Every failure mode of the file-approval machinery was silent | STEP 3's if-it-fails: work continues ungoverned-side, ask lands with Nick awake — never a stalled ticket | STEP 3 |
| A governance CLI silently dropped flags and its spec documented the broken form | N/A: no CLI is built; existing tools used by their documented verbs | — |
| Plan shape existed as convention, not enforcement | This file passes the machine gate before execution starts | FINISH LINE 5 |
| A six-word punchlist item pointed at exactly the wrong action | Dispositions carry Nick's full clause, never a compressed label | §1c |
| A production secret read as SET when EMPTY | N/A: no secrets are read or written; data floor untouched | — |
| The SAME claim CONFIRMED by a verifier and REFUTED by a breaker — breaker right | STEP 12's brief is adversarial ("try to get lost"), not confirmatory | STEP 12 |
| Reasoning ABOUT a system instead of ASKING it | Live probes (daemon log, MCP answers, board read-back) over inference, throughout | STEPS 6, 8, 9 |
| A hard prerequisite discovered after a decision, with no owner | Dependency lines are written per row BEFORE moves; hits change dispositions via dated deltas | STEP 2.3 |
| A relayed instruction judged only by authenticity, not currency | Nick's 09-04 words are checked against his 08-30 ruling and the later governs, on the sheet | §1a row 6 |
| Two programs found every instrument reporting a state that was not the system's | M-CTRL on every silence; M-COLD on the whole | STEPS 6, 12 |
| A PROOF block still containing template placeholders | Every proof here names literal files, counts and commands; checker re-runs them | §3b |
| Evidence deliberately destroyed is indistinguishable from evidence that never existed | Nothing is destroyed; moves preserve bytes; evidence files are committed | M-ARCH |
| A capability ruled impossible on a query that could not see the answer | M-2WAY exists precisely for this; unreadable stores are UNKNOWN, never empty | §Z, STEPS 2, 11 |
| The instruments used to verify a UI lie in four ways | N/A: the one UI check (board) is a read-back, its instrument named | STEP 9 |
| A step's entry gate satisfied and the step still could not run, with nowhere to say so | The state file carries a RUNNABILITY line per step; if-it-fails branches name the honest states | §3b |
| An automated proof detected failure and the pipeline logged success | Proofs are re-run by checkers reading exit codes themselves, never a wrapper's summary | §3b checker jobs |
| A dispatch gate blocked the defensive pattern its own line prescribed | Known gate quirks are pre-empted by the verbatim §T header on every brief | §3 |
| A fallback made the cutover it protected impossible | N/A: no cutover; the only fallback (haiku) does the same file moves | — |
| An approved instruction correct at approval, harmful at delivery | Each move re-reads live state at execution time; STEP 2 evidence goes stale if the tree moved — the row re-runs | STEPS 2–11 |
| "Fixed the file" / "deployed it" / "user sees it" are three claims | The three scopes are separately proven: files (moves), surfaces (STEP 12), Nick (STEP 13) | STEPS 4–13 |
| Working-tree code read as established behaviour in a multi-session build | Dispositions cite committed sources; uncommitted concurrent edits are §W-handled | §W, §3 |
| Three rounds of honest proofs, user's complaint untouched | STEP 12's bar IS Nick's sentence ("no way to get lost"), verbatim | STEP 12 |
| A local caution escalated into a fleet-wide halt on a non-crisis | Findings get ONE owner line or the NEXT list, never a re-route of other lanes | trip-over protocol |
| Two landed pieces reported missing because no inbox message arrived | Landings are read from files and surfaces, not from message receipt | STEPS 9–12 |
| An acknowledgement (`queued`) read as the outcome | Read-back-from-destination standard | STEPS 8, 9 |
| An overseer bridged a DIFFERENT ruling onto the question | The one bridged ruling here (custodian purge) is surfaced to Nick rather than silently bridged | §1a row 6 |
| An agent offered loosening a guard as one of two equal options | Nothing proposes weakening any gate; refusals route to the state file + Nick | anti-scope |
| A fault that repairs itself faster than reports is invisible to alarms | The daemon-window proof names its window; intermittency routes to SMP-8, the fleet's owner | STEP 6 |
| A relayed approval acted on as if work were outstanding | STEP 9 checks whether a card's work already landed before closing it as retired | STEP 9 |
| An investigator noticed the metric could not detect the thing, and used it anyway | Counts are never the verdict; the cold walk is | STEPS 11–12 |
| An investigation's own searches contaminated the evidence | Before/after counts use identical patterns and scopes; this plan's own files are a named, subtracted population | STEP 11 |
| Three lanes each got a clean answer from a point-in-time probe of an intermittent fault | The job-silence claim is bounded to its window and paired with a control, never generalized | STEP 6 |
| An overseer relayed genuine instructions as authority — one session rightly refused | Workers verify against this committed plan and REGROUP-SOURCE, not the dispatcher's say-so | §3 |
| A file documenting its version history above its code made unanchored searches lie | Banners state RETIRED at the very top; archive files carry no live-instruction text below | STEP 4.1 |
| A commit hash cited as closing evidence resolved to nothing later | Proofs cite re-runnable commands and paths, never bare hashes; any hash cited must be reachable AND pushed at citation time | §3b proofs |
| A step's own PROOF COMMAND over-matched and returned a plausible wrong count | Grep-count proofs pin exact literal strings (e.g. "disabled: 2026-09-04 goal-purge") and name FAILS-IF | §3b |
| A deliberate commit pre-empted by an automatic snapshot bundling unrelated files | Scoped commits immediately after each edit batch, message naming the change; mixed-commit legibility rule from §W | M-SCOPED |
| A check reported PASS five separate times on one feature while the live screen was wrong every time, and the check's own instrument then reported FAIL on code that was correct — a green check that lies in both directions | A checker that has never been seen red is not trusted: the STEP 15 reader checker was proven on a known positive before any move (its first three versions returned zero for everything — the repository path contains a space and `xargs` split it — and were discarded); every proof runs against the real tree and the nightly tests are compared before and after on a pristine checkout, so a PASS that lies is caught by the baseline, not believed | STEP 15.1, 15.5 |
| NOVEL: a lane was retired while something live still depended on it | STEP 2.3's DEPENDENCY line per row gates every move; a kept-surface hit converts RETIRE→FOLD via a dated delta, and STEP 8's live probes catch what the search missed | STEPS 2, 8 |
| NOVEL: a git-move landed while a concurrent session held uncommitted edits to that file | Per-file `git status --porcelain` immediately before each mv; dirty → wait one pass and retry; §W scoped-commit discipline throughout | STEP 4.1, §W |
## 5 · Topology and roles
- **OVERSEER-AUTHORITY:** no seat is named — `projects/ops/OVERSEER-AUTHORITY.md`'s CURRENT HOLDER block reads "2026-08-28: NO SEAT IS NAMED. THIS GRANT IS DORMANT" (read 2026-09-04); this plan's lanes work as if the file did not exist. The four approval classes and the data floor never move on anyone's word regardless.
- Thread layout: one driving thread (this Boris seat), workers dispatched one at a time.
- Overseer: Boris 3 (fable) — unsticks, relays verdicts unchanged, never builds. Lane managers: none (single subproject). Workers: GLM 5.3 (zai) with haiku-tier grunt fallback; checkers Sonnet; cold walk Sonnet fresh.
- State files location: `projects/ops/retirement/STATE.md` and `projects/ops/retirement/PLAN-CHANGES.md` (both declared in §0's created-artifacts list).
- **Board card id:** `nt-20260905-002737-175c` (created 2026-09-05 on the Hub board, group general, so the unified step-close action has a real card to post to)
- **Artefact consumers:** archive → any future agent following an old path; evidence files → the checkers and STEP 12; deltas → agents reading the indexes; report → Nick. Raise path: `raise-signal` per MACHINE-RULES if genuinely stuck, proven by its own printed row.
- **Write-contention:** L1 owns the indexes and archive moves; L2 owns only job frontmatter; L3 owns pointer rows and evidence. No two lanes share a file. This plan touches NOTHING under `projects/business/business-app/` and, inside `projects/personal/skippy-app/`, exactly one file (the Alexa spec move) — the live Skippy/Hub lanes keep exclusive write on their roots. Checkout proven writable per pass: probe write, read-back, scoped status.
**Per-stage topology — counts DECLARED at plan time:**
| Stage | Overseer | Sub-overseers | Workers |
|---|---|---|---|
| Framing (STEPS 1–2) | 1 | 0 | 1 |
| Elements (STEPS 3–8) | 1 | 0 | 1 |
| Details (STEPS 9–10) | 1 | 0 | 1 |
| Tests/Proof (STEPS 11–12) | 1 | 0 | 1 |
| Output (STEPS 13–14) | 1 | 0 | 0 |
**The walk-away contract:**
- **STATE FILE:** `projects/ops/retirement/STATE.md`
- **HEARTBEAT ROW:** the goal-purge drive row in `projects/personal/skippy-app/ala-state/work-threads.json`, created when the drive registers
- **MORNING-REPORT LINE:** "Goal purge — N of 14 steps proven; retired X of 30 inventory rows; blocked on: <none or named>" in `projects/ops/walkaway/REPORT.md`
## 6 · Evals — what "working" means, decided now
| Capability | Check (exact command or procedure) | Pass looks like |
|---|---|---|
| Every inventory row reaches an executed disposition | count proven rows in `## STEPS` against §1c's 30 | 30/30, each citing its step's proof |
| Nothing deleted | `git log --diff-filter=D --oneline` over this plan's commits | zero deletions outside git-mv pairs (a move shows delete+add with identical content) |
| Retired jobs silent, kept job alive | STEP 6's paired window evidence | disabled: no run; control: fresh run; same window |
| Live engines unharmed | STEP 8's two MCP probes | both return real answers post-move |
| No live pointer to retired work | STEP 12 cold-walk verdict | PASS, verbatim, from a session that built nothing |
| Citations all repointed | `bash projects/ops/retirement/evidence/citation-sweep.sh` | exit 0, after a recorded red run pre-move |
| This plan passes its gate | `python3 projects/ops/agents/check_plan.py` against this file (run from the repo root, target `PLAN.md` in `projects/ops/retirement/`) | PASS |
## NEXT list (found along the way; NOT worked in this drive)
- 2026-09-04 (STEP 15) · The Hub still has seven lane plans plus an index as its live documents, and ZION-3 / ZION-17 carry supersession markers pointing at ZION-19 while staying in place — Nick's "one live document per project" is not yet true for the Hub. The Hub lane owns the fold; nothing was moved from under a lane being driven tonight.
- 2026-09-04 (STEP 15) · `projects/ops/guide-records/` still holds 3,405 `.pre-*` snapshots (the health bake-off's own tree) — the largest remaining backup family; its owner decides.
- 2026-09-04 (STEP 15) · Two files kept their stale citations because another session had uncommitted edits in them: `projects/ops/continuity/PLAN.md`, `projects/personal/skippy-app/cowork-queue.md` — one exact-path swap each when their owners next save.
- 2026-09-04 (STEP 15) · `projects/ops/walkaway/drives/` holds three closed drive plans (claude2-migration, git-sync-fix, sp15-team-fold-migration) read by folder by the drive tooling; archiving them needs the tooling's owner to confirm it does not enumerate that folder.
- 2026-09-04 (STEP 15) · A cold reader has not yet graded the STEP 15 KEEP list; STEP 12's method applies (a fresh session that built none of this).
- Regenerate the agent org chart / capability pages after pointer changes, via their own generators (owner: the directory pages' generator, one run).
- If Nick ever wants the Skippy School site taken down, it is one deliberate command through the deploy tool — his word first (§1a row 4).
- The `projects/ops/REBUILD-2026-08-21/` leftover tree: SMP's own archive manifest finishes it (handoff posted in STEP 5).
- Anything security-shaped observed during the sweep: one line here, click-gate first.
- Both memory-engine front doors (`personal_answer`, `business_narrative_answer`) had been failing since 2026-09-03 16:20 (the deck-shared symlink migration broke lane.py's env-file lookup) — found and fixed at the root during STEP 8 (deck-shared 777bc82). MCP servers already running in a session keep the old module until that session restarts; nothing else to do. Owner of the shared tooling (the one-cloud-copy programme) should know a symlinked module cannot locate files by walking its own parents — one line for its postmortem.
- The jobs-owner Mac mini has been silent in HEARTBEAT since 13:04Z on 2026-09-04 and does not resolve on the network from this Mac; STEP 6's "really stopped firing" control cannot be observed until it is back — SMP-8's fleet question, already handed off.
- Generated files that still carry a moved path and must be regenerated by their own generators, not hand-edited: `projects/ops/spine-projections/routing-index.*` and `system-manifest.json` (generator `projects/ops/skippy-jobs/generate_routing_index.py`), `projects/ops/artifacts/project-status/registry.json`, the capability graph (`projects/ops/ecosystem-visualizer/`), the scheduled-mirror SKILL copies (source outside the repo). The org chart WAS regenerated in this drive.
- The org-chart parity test's one remaining failure is pre-existing and unrelated to this drive: skills `design-redo` and `humanizer` are missing from the generated page (owner: the org-chart generator).
- `projects/_archive/goal-purge-2026-09-04/projects/ops/skippy-master-plan/run-plan-readiness.py` line ~346 and `scripts/regen-gracie-inventory.mjs` line 71 name moved paths in their LOGIC (SMP-9's close tooling; Gracie's inventory writer) — handed to SMP (index line) and left with the paused Gracie work; a repoint would change behaviour.
- Docs-level residue for a later pass (counts from the sweep with history included): 281 files still mention a moved path inside history/evidence/snapshot classes; the closed-drive evidence folders under projects/ops/zion and the guide-records snapshot families are the two largest, and both have live owners beside them.
- Wave 1 archived three `.pre-*.bak` snapshots under `projects/business/marketing-sales/sales-call-reviews/` — outside the client folders Nick fenced, but under marketing-sales; named here so nobody has to wonder. If he wants them back it is one `git mv`.
## If you get stuck (all steps)
Before writing "blocked": (1) try a concrete workaround, (2) re-read the step's proof requirements — most "stuck" is a misread gate, (3) write one line to the overseer AND the owner of the blocker. Only then log `STEP <N> BLOCKED — tried: <a>,<b>,<c>. Need: <one sentence>.` Then keep working every other unblocked step. Never idle on a blocker.
## Your loop
Every pass: find the lowest-numbered step whose enter gate is proven and which is not yet proven → do it → produce its proof → paste the proof under the matching item in STEPS below → repeat.
## SUMMARY — a few plain-English lines, read by the status generator
Nick asked for one thing: only Skippy, its voice app, and the business Hub stay live; everything else gets put away safely so nobody wanders into it again. This plan lists all thirty pieces of side work by name, says exactly where each one goes, moves the retired paperwork into one dated archive with a plain note explaining how to bring things back, switches off the robots that were still working on dropped projects (reversibly, with proof they stopped and proof the live ones did not), and finishes with a stranger checking that nothing retired still looks alive. Nothing is deleted; Chantelle's reminders, the kids' site, and the memory system keep running untouched.
## SUMMARY
**2026-09-20** — This replaces a diagnosis recorded a short time ago in projects/ops/retirement/PLAN.md which was wrong in nearly every part. I had written that several automated checks were failing while telling nobody, that the nightly sweep which runs them was deliberately switched off on 10 September 2026, and that the repair was to build a program reading when each automated check last ran, together with a new written rule about retiring mechanisms. A helper session sent to disprove all of that returned ten findings, and I confirmed the three that matter by opening the files myself rather than accepting them. First, line two of projects/ops/life-os/REGROUP-2026-09-08/plans/SCHEDULED/evidence/SWITCHOVER-DECISION-TABLE.txt states that it was built on the Mac mini as a read-only pass and that nothing was changed, enabled or disabled, so it proposed rather than performed, and it surveyed a machine that no longer holds the scheduling role; that is the third time this session has misread that single file. Second, the nightly sweep ran on 18 September 2026, eight days after the date I gave, which projects/ops/skippy-jobs/jobs.log records directly. Third, and most important, the program I proposed to build already exists and runs: projects/ops/skippy-jobs/jobs/hub-feeds-not-silently-empty-watch.mjs appears in the scheduler's table at line three hundred and seventeen of projects/ops/skippy-jobs/runner.mjs with three start times a day, and it has already reported the nightly sweep as overdue six times. The written rule I proposed already exists twice over, numbered thirty-seven and fifty-four in projects/ops/MACHINE-RULES.md. The sweep's scheduling rows were actually deleted on 16 September 2026 by a commit that purged one hundred and thirty already-disabled entries, and projects/ops/skippy-jobs/runner.mjs already records that same accident befalling two other scheduled jobs, both of which were restored on 18 September, so the sweep was a third casualty that nobody noticed. The corrected diagnosis is therefore the opposite of the original. Nothing is going silent. A correct alarm fires three times a day and reaches nobody, because it labels its own findings as infrastructure, and line one thousand six hundred and eighty-two of projects/ops/skippy-jobs/lib.mjs rejects anything carrying that label before it can be delivered. That labelling was chosen deliberately on 31 July 2026 to stop infrastructure chatter crowding out the messages that genuinely require Nick Deck to decide or act, and the side effect is that a genuinely dead safety mechanism is now indistinguishable from routine chatter. The narrow repair that follows is to let one class of finding through that rejection, namely an automated check that has not run at all, as distinct from one that ran and failed.
**2026-09-20** — Nick Deck said he has fixed the same problem a hundred times and wants the underlying cause rather than another patch, so this records the diagnosis now being tested and changes nothing. In one night five separate checking programs were found to have stopped working while telling nobody. The rescue push inside projects/ops/skippy-jobs/lib/auto-push.mjs, which copies this machine's commits somewhere other than this machine, had failed four hundred and thirty-nine times over ten days. The program at projects/ops/skippy-jobs/_test-paid-lane-closed.mjs, which proves that the metered account with Anthropic stays switched off unless Nick Deck approves spending for that day, stopped partway through every evening for five weeks. The program at projects/ops/skippy-jobs/_test-spend-tracker.mjs, which checks the record of money spent, crashed on every run on every machine. The contents list at the top of projects/ops/MACHINE-RULES.md named twenty-five of that file's forty-nine rules, while the program at projects/ops/skippy-jobs/_test-rules-contents.mjs, whose only job is to catch that disagreement, could not see it either and was run by nothing. The program at projects/ops/skippy-jobs/_test-roster-parity.mjs, which checks that the pages listing every agent and skill match the folders they describe, reported a healthy page as missing on every run since 5 September 2026. The proposed diagnosis is that these are one failure rather than five: a checking program that stops working goes silent, and silence is indistinguishable from health. The one mechanism that would have caught them is the nightly sweep that runs every file beginning with the characters underscore test in the folder projects/ops/skippy-jobs, and it was switched off on 10 September 2026 by a deliberate and recorded decision at projects/ops/life-os/REGROUP-2026-09-08/plans/SCHEDULED/evidence/SWITCHOVER-DECISION-TABLE.txt, on the stated grounds that its work was being taken over by an entry that file numbers nineteen. The program that entry actually produced, at projects/ops/skippy-jobs/jobs/larry-nightly.mjs and scheduled at twenty past three each morning, contains no reference to any file beginning with those characters, so it sweeps documents rather than checks. The replacement was named, recorded and never built. The proposed repair is in two parts: one scheduled program that tests nothing and only reads when each checking program last ran and what verdict it produced, treating never having run and having failed as the same thing; and a written rule that a mechanism may not be retired by naming its replacement but only by showing the replacement running. A separate helper session is now attempting to disprove both parts, and its most important question is whether such a reading program already exists and is merely unscheduled, in which case building a second one would break the standing instruction never to build a second of anything that already exists, and the repair is to fix what is already there.
**2026-09-20** — Nick Deck's Mac Studio runs all of his scheduled work and had fallen ninety-five changes behind the shared copy of his files, unable to catch up on its own. It could not catch up because two hundred and twenty-one files of unfinished work belonging to six different pieces of work were sitting unsaved in the one folder they all share, and the operation that brings a machine back into step refuses to run while files are unsaved. Two hundred and seventeen of those files are now saved into the history rather than discarded, in two passes, which is the same thing the automatic saving program does routinely. Four were refused by the programs that inspect every save before allowing it, for reasons belonging to whoever is working on those files: the plan file at projects/business/website-meadow/PLAN.md adds two proof commands naming files that do not exist, and three generated copies under projects/ops/scheduled-mirror carry struck-through wording that one of those inspecting programs forbids. Those four were left untouched rather than edited by a passer-by, and their contents were copied aside and put back byte for byte afterwards. Bringing the machine back into step was then attempted in a separate temporary copy of the repository, away from the programs that keep writing into the shared folder, which is why that folder can never be clean and is the underlying reason this has been stuck for days. That attempt hit three disagreements in files somebody else is working on, and skipping the disagreeing changes produced a result that silently dropped the two hundred and twenty-one saved files, so it was thrown away and nothing was sent to the shared copy. The saved work is safe on two branches of the shared copy. Finishing the catch-up would return four files to the shared version and wipe today's unfinished edits to those four, which is why it was not done here.
**2026-09-20** — This softens a claim recorded a little earlier in projects/ops/retirement/PLAN.md, because two of the three explanations behind it turned out to be wrong when the code was actually opened. Earlier I recorded that the check at projects/ops/skippy-jobs/lib/check-handback.mjs, which stops a session finishing a turn until it has recorded progress against the plan file of the project it is working on, was demanding that record when the record had already been made. The demand is real and has happened roughly a dozen times in this session. My explanation of why was not established. I guessed the check was comparing a path written in short form against the same path written in full, and that guess is wrong: the function that compares them, at line one thousand three hundred and sixty-six of projects/ops/skippy-jobs/lib/handback-contract.mjs, expands a short path against the top of the repository before comparing, so both spellings match. I also guessed the check might not recognise the recording command when it is run after a change of directory, and that is wrong too: the pattern it uses at line one thousand one hundred and two accepts exactly that shape. What remains unexplained, and is the only candidate I have not disproved, is the condition at line one thousand four hundred and sixty-one, which requires the recording to come at or after the last change to any file in the session. Several turns in this session changed a file, recorded, and then changed another file, which would satisfy the check's wording as written and fail it in practice. That is testable and has not been tested. I am not proposing a repair: a session that depends on this check to end its turns is the wrong one to change it, and the three explanations above show I have already reasoned wrongly about it twice. What is established and worth acting on is a way of working around it rather than through it, which is to make the recording the final action of a turn with no file change after it.
**2026-09-20** — Nick Deck asked for a complete written handover, ready for a fresh session to start from cold, with a critic's findings already worked into it. That handover is now the first section of the file projects/ops/system-review/PLAN.md, which is the single governing record of his thirteen-area review of his working ecosystem. It sits directly under the title so a reader meets it before anything else, and it says in one place: what the review is and that he has asked for all seven remaining areas rather than a subset; how far each of the thirteen areas has got; twelve recommended changes that have not yet been made, with the instruction to act on them as written rather than work them out again; the rule the remaining work runs under, which is that nothing may be recorded as healthy on the strength of reading its source and the evidence must include when it last ran and what it last wrote; the eleven mistakes made so far and the two patterns behind them; the three specific traps that cost the most time; what remains open and whether it waits on Nick Deck or on nobody; how the checkout of the repository at /Users/nickdeck/Documents/Claude 2.0 behaves, since many sessions edit it at once and its constant churn is normal rather than a fault; and a single line a fresh session can be started with. Those twelve recommendations, and three more already carried out, came from a separate session dispatched to read the written account of the first six areas and judge it, which returned fifteen in total. The three already carried out each corrected a statement the file made about itself which was not true. That separate session's full judgement and the longer written account of the first six areas both remain below the handover as the detail it points at.
**2026-09-20** — This records a fault in an end-of-turn check, noticed because Nick Deck asked why the work was going slowly. The check at projects/ops/skippy-jobs/lib/check-handback.mjs stops a session from finishing a turn until it has recorded progress against the plan file of the project it is working on, which is a sound rule. It is firing when the condition it names has already been met. On roughly a dozen turns in this session it demanded a record immediately after a record against that same plan file had run and reported that all three of its effects landed, and the message it prints asserts that the recording command was used but not for that plan file, which the preceding successful run contradicts. The practical cost is that each occurrence forces another full record to be written, and each record is passed through a separate check that rejects any phrase a cold reader could not act on, so a single turn can cost several rewrites of several hundred words before it is allowed to end. Two other taxes were measured alongside it and are worth recording together, because together they explain most of the time this session spent not doing the work itself: the lock file that git uses is held by the automatic pushing program most minutes, so nearly every save needed two or three attempts, and the check that judges a summary could not be started at all on one occasion because several model processes were running at once, which that check correctly treated as a failure rather than waving through. None of this has been changed. It is recorded so that whoever looks at why a session is slow has the measurement rather than an impression.
**2026-09-20** — This records a failure worth writing down because it will happen again, and the change made so that it costs less next time. Nick Deck asked for the review of his written postmortem to be done by a helper session running on the model named claude-fable-5-1, which he asked for by name. The account this session normally uses had already reached its limit on that model, so the work was moved to a second account holding a separate allowance for the same model, which is what the written instruction in projects/ops/blocks/BUILD.md requires: an account that is out is swapped for another account of the same model, never for a different model, and that swap never goes to him as a question. The second account ran for twenty-seven minutes and then stopped with a message saying it was out of usage credits, and it produced nothing at all. The reason it produced nothing is the shape of the tool rather than the limit: running a model from the command line in this way captures only its final message, so a session that dies before finishing leaves no trace of the work it did. Probing all eight account slots on the same model afterwards found five out or limited, one whose weekly limit resets on 23 September 2026, and two answering normally. The work has been restarted on one of those two, with one change to the instructions: the helper is now told to append each completed section to a file on disk as it goes rather than holding everything until the end, so that hitting a limit part way through loses only the section in progress instead of the whole review. That instruction also states plainly why, so the next person to write such an instruction does not have to learn it the same way.
**2026-09-20** — This records a hand-off written at Nick Deck's request, and one thing that will be lost if this session ends before a helper session finishes. A new section headed WHERE IT STANDS RIGHT NOW has been added to the top of projects/ops/system-review/PLAN.md, which is the single governing file for his thirteen-area review of his working ecosystem. It states which of the thirteen areas are finished, which are partly done and which are untouched; the decisions taken during the first six areas and why they look strange from outside; what failed and the underlying cause of each failure; what remains open and whether it waits on Nick Deck, on a helper session, or on nobody; and the fact that other sessions edit the same working folder constantly, which is normal here rather than a fault. It also carries the three traps that cost this session the most time, each stated so a reader who has never seen this work can avoid them: that a scheduled job which has been switched off must not be called an accident until the decision table at projects/ops/life-os/REGROUP-2026-09-08/plans/SCHEDULED/evidence/SWITCHOVER-DECISION-TABLE.txt has been opened; that the folder .claude/agents holds twenty-one symbolic links pointing into the folder ZION/agents, so writing to one passes through and a clean working-tree check on the first folder proves nothing; and that this workspace's folder name contains a space, which makes the usual pipeline of listing files and passing them to a search command read nothing at all. The item with nowhere permanent to live is this: a helper session running on the Fable model, which Nick Deck asked for by name, is reviewing the written postmortem of the first six areas and has produced no output yet, and it writes to a temporary file that disappears when this session ends. If it finishes after that point its work is lost and the review would have to be run again. That is stated plainly in the new section rather than left to be discovered.
**2026-09-20** — This records that the repair to the program at projects/ops/skippy-jobs/lib/auto-push.mjs, landed as commit 3835a69e68, has now been verified by a session that did not make it. That program exists to stop commits living only on Nick Deck's Mac Studio: when this machine's main line has both moved ahead of and fallen behind the cloud copy, it refuses to push the main line and parks the commits on a branch named after the machine and the date instead. Before the repair that parking push had failed four hundred and thirty-nine times over ten days. The checking session passed every claim put to it and added an inspection of its own, looking for any capability the older version of that program had which the repaired version lacks, and it found none. Three of its measurements are worth keeping. First, it confirmed the guard inside the repair genuinely discriminates rather than agreeing with everything: run against all eleven dated parking branches on the cloud copy, it permits five and refuses six. Second, it proved by direct measurement on the branch dated 17 September 2026 that the command the guard uses to compare work by content, which is git cherry, omits merge commits without saying so: that branch holds forty commits in range, two of which are merge commits, and git cherry printed thirty-eight lines with both merge identifiers entirely absent. Without the separate count of merge commits that was added alongside it, a branch whose only unique work was a conflict resolution would have been silently overwritten. Third, it watched the repaired program run for real five times between 15:41 and 15:44 on 20 September 2026 and every run succeeded, where previously it had failed every two minutes for ten days. It also confirmed, by recording every relevant branch identifier before and after, that the program at projects/ops/skippy-jobs/_test-autopush-never-moves-main.mjs, which had unknowingly been operating on the real repository because an environment variable redirected every repository except this one, now changes nothing there. The one limit the checking session stated honestly is that the third and rarest route, which pushes under a name carrying the commit's own identifier when the dated branch holds unique work, was confirmed by reading the code and by the guard values that would trigger it but was not seen firing during the check.
**2026-09-20** — This records a repair to the program at projects/ops/skippy-jobs/lib/auto-push.mjs, which exists to stop Nick Deck's committed work living on only one computer, and which had not been doing that for ten days. When this Mac's main line has both moved ahead of and fallen behind the cloud copy, that program correctly refuses to push the main line and parks the commits on a branch named after the machine and the date instead. That parking push failed four hundred and thirty-nine times between 10 September 2026 and 20 September 2026, and when measured today this machine's current position appeared on no branch of the cloud copy at all, so the work really was on one computer for the whole day while the program's log described the refusal as safety. The cause is not in that file. The companion program projects/ops/skippy-jobs/lib/auto-pull.mjs rebases the main line every hour, which rewrites the very commits already parked on the day's branch and gives them new identifiers, so the branch can never again accept a straight continuation, and each new day re-arms the same trap. My first proposed repair was to name every parking branch after its own commit, and the helper session sent to disprove that proposal struck it down correctly: the program at projects/ops/skippy-jobs/jobs/remote-branch-prune.mjs permanently protects every branch whose name starts with the prefix used for machine branches and so would never clean these up, and each new name starts its own timer in the program at projects/ops/skippy-jobs/jobs/machine-off-main-watch.mjs that guards the single channel allowed to interrupt Nick Deck, a channel already holding thirteen unresolved entries of that same kind. What shipped instead reuses a pattern the same file already applied to other repositories: read where the branch currently sits on the cloud copy, then push against exactly that value, but only after proving the branch holds nothing this machine lacks, and the proof compares patches rather than identifiers because identifiers are precisely what the rebase changed. The commit-named branch survives only as a guarded fallback. Three further corrections came from a second helper session that checked the corrected plan, and each was necessary: the patch comparison silently omits merge commits, so a branch whose only unapplied work was a conflict resolution would have read as empty and been discarded, and a separate count of merge commits now refuses independently; the sentence at the top of the file promising it never forces anything was rewritten in the same change, because leaving it would have made the file describe itself falsely; and an environment variable that redirects this program during testing redirected every repository except this one, so a test whose own heading said it touches nothing real had been running against the real repository, which was survivable only while that path could do nothing but attempt an ordinary push. The warning line that program writes when it cannot park the work was also wrong and is fixed: it claimed commits existed only on this Mac purely from being ahead of the main line, which is routinely false after a rebase, and today it would have claimed four when two of those four were already on the main line by content.
**2026-09-20** — This records a fault in the method of Nick Deck's own thirteen-area system review, found while repairing something else, and it matters more than the repair. The file projects/ops/skippy-jobs/lib/auto-push.mjs is the program that stops work existing on only one computer, by parking commits on a rescue branch when this Mac's main line has diverged from the cloud copy. That rescue push has been failing since 10 September 2026, four hundred and thirty-one times by the count in the program's own log file. An earlier pass of the review examined that exact mechanism and placed it in a section of projects/ops/system-review/PLAN.md headed WHAT IS GOOD, at line nine hundred and forty-two, saying that its three stated promises, never to commit, never to force and to only write a log line when a push cannot be a straight continuation, are real and consistently followed in the code read. Those three promises are genuinely kept. The mechanism they protect was already dead when that was written, and the closing words, in the code read, are the reason it was missed: the mechanism was certified by reading the source and never by opening the log that records whether it had run. Every genuine fault this review has found so far has the same shape, which is machinery that looks correct on the page and stopped working in practice, so this is a blind spot in how the review checks rather than a single mistaken line. The instruction that follows for the remaining areas is that no mechanism may be recorded as healthy on the strength of reading its source: the evidence must include when it last ran and what it last wrote. That line in the review's plan also has to be corrected, because the next reader would otherwise trust it exactly as the last one did. Separately, the repair to the pushing program has not been made and is waiting on a third reader that has seen neither the proposal nor the argument against it.
**2026-09-20** — This records that a repair Nick Deck approved in principle was struck by the reader sent to disprove it, that the reader was right, and what replaces it. Nothing has been changed. The file projects/ops/skippy-jobs/lib/auto-push.mjs is the program that stops work existing on only one computer: when this Mac's main line has both moved ahead of and fallen behind the cloud copy, it refuses to push the main line and instead parks the work on a rescue branch named after the machine and the date. That push is failing. My proposed repair was to retry under a name carrying the commit's own short fingerprint, on the reasoning that such a name is always new and can never be refused. That reasoning is correct and the effect would have been harmful. Line forty-one of projects/ops/skippy-jobs/jobs/remote-branch-prune.mjs permanently protects every branch whose name begins with the characters m a c and a slash from ever being cleaned up, so each one would accumulate on a server the cleaner's own notes already measure at seven hundred and thirty-three branches. Worse, the pattern in projects/ops/skippy-jobs/jobs/machine-off-main-watch.mjs matches that proposed name, which I confirmed by running it, so every such branch would raise a signal in the one channel allowed to interrupt Nick Deck, and that file's own notes record that the unscoped version of itself would have filed up to one hundred and eighty-five separate signals and been switched off within the hour. The reader also raised the severity correctly. This is not a fault that began today: the failure line appears four hundred and thirty-one times in the program's own log, across ten days, so the safety net has been dead since 10 September 2026, and the only reason this week's work is safe is that an agent pushed holding branches by hand. The cause is structural rather than accidental. The program projects/ops/skippy-jobs/lib/auto-pull.mjs rebases the main line, which rewrites the very commits already parked on the day's rescue branch and gives them new identifiers, so that branch is permanently unable to accept a straight continuation for the rest of the day, every day. The replacement plan uses a pattern this same file already contains at lines five hundred and thirty-six to five hundred and forty-five for other repositories: read the branch's current position on the cloud copy, then push with a lease against exactly that value, so a genuine second writer still stops the push while a stale local idea never does. It is guarded first by asking which commits on that branch are not already applied here, and only repoints when the answer is none; when the answer is not none it falls back to the fingerprint name, which then stays rare instead of becoming the default. Two smaller corrections travel with it: the alarm must stop claiming work exists only on this Mac on the strength of being ahead of the main line alone, and must instead require both that the commits are genuinely unapplied and that they appear on no branch of the cloud copy; and the fetch on line five hundred and ninety-six must prune, so a branch deleted on the server cannot leave a stale local pointer that makes the new wording claim work is safe when it is not. A third reader that has seen neither the proposal nor the argument is checking that replacement now, and nothing will be changed before it answers.
**2026-09-20** — This records a judgement Nick Deck asked for about whether his thirteen-area system review is worth continuing, and the state of a separate repair that is waiting on an independent reader. On the review: six of the thirteen areas are done and they produced thirty-five landed changes, counted by searching the commit history since 18 September 2026 for commit messages beginning with the words REVIEW AREA. The value is concentrated in one specific thing, which is checks that were supposed to be watching something, had silently stopped, and would have gone on not watching indefinitely. The clearest examples: the program that proves the paid Anthropic account stays switched off had been stopping partway through every evening since before 24 August 2026, so its final three sections had not run once in five weeks; a second program checking spending crashed on every run on every machine; the index at the top of the rulebook at projects/ops/MACHINE-RULES.md named twenty-five of its forty-nine rules; and the program watching the pages that list the agents and skills had been reporting a healthy page as missing on every run since 5 September 2026. None of these would surface during ordinary work, because a broken guard fails silently. The honest cost is that a meaningful minority of those thirty-five changes are the review correcting its own false alarms, and three wrong claims reached Nick Deck before a reader sent to attack them caught each one. The recommendation given to him is to continue but not with all seven remaining areas: the two most likely to hold the same pattern are the area covering the codebase and its tests and the area covering the business application at hub.heroesandsidekicks.io, because those are where checks live, while the areas covering cloud storage and the voice layer are more inventory than machinery. Separately, a small repair to the file projects/ops/skippy-jobs/lib/auto-push.mjs has not been made. That file is meant to park commits on a rescue branch when the main line has diverged, so that work never sits on one computer alone, and that push is currently failing. Nick Deck asked for the repair to go through the propose, attack and check sequence first, and the reader whose job is to disprove it has not yet reported, so nothing has been changed.
**2026-09-20** — This records why the automatic pushing program on Nick Deck's Mac Studio cannot rescue work when the main line has diverged, and what the permanent repair is, without any change having been made yet. That program already has the correct design for this situation. When it cannot send commits to the main line of the cloud copy because the two have diverged, it is supposed to park them instead on a branch named after the machine and the date, so that work never sits on one computer alone. The net is failing. A branch carrying today's name already exists on the cloud copy, pointing at a commit made yesterday, and this machine's current position is not descended from it, so the push is refused for not being a straight continuation. The safety net therefore fails at exactly the moment it is needed. The permanent repair is small: when the push under the dated name is refused, push instead under a name that also contains the short fingerprint of the commit itself. Such a name is always new, so the push can never be refused and can never overwrite the earlier rescue, and no history is ever rewritten. A second repair belongs with it: the alarm that program writes says that commits exist only on this Mac, but it decides that by looking at the main line alone and never checks the rescue branches, so it reports work as endangered when it is already safe on the cloud copy. Neither repair closes the larger gap, which is not a programming fault. This machine cannot bring down the fifty-eight commits it is missing, every one of them made today, because one hundred and fifty files of genuinely live work from today sit unsaved in the single working folder that every piece of work shares, and the operation that reconciles the two refuses to run while files are unsaved. That matters more than it first appears, because the register of which machine does what names this same Mac as the one that runs all the scheduled work, so it is running today's jobs on code that is a day out of date and cannot catch itself up. Changing how work is organised so that each piece has its own folder is Nick Deck's decision, not an agent's, and the small repair has been offered to him and not yet made.
**2026-09-20** — This records a false alarm in the automatic pushing program that maintains Nick Deck's Mac Studio, and the reason that Mac cannot currently synchronise itself. The program writes a warning to its log saying that three commits exist only on this Mac, which reads as work about to be lost. It is wrong. It decides that by asking whether each commit is on the main line of the cloud copy, and it does not ask whether the commit is anywhere else on the cloud copy at all. All three were pushed to named holding branches on the cloud copy during the session that ended this morning, precisely so a restart could not lose them, and asking the cloud copy which of its branches contain each of the three returns a branch for every one. Nothing is stranded. A future session reading that warning would start a rescue for work that is already safe, which is the same shape of mistake as treating an absence of evidence in one place as proof of absence everywhere. The underlying observation behind the warning is true and is the real issue: this Mac now holds three commits the cloud's main line does not, and is fifty-six commits behind that main line, and it cannot close either gap. It cannot send its own work up because the two have diverged, and it cannot bring the cloud's work down because one hundred and seventy-four files are sitting unsaved in the shared working folder, spread across at least six separate pieces of work in progress belonging to other sessions, and the operation that would reconcile the two refuses to run while files are unsaved. Nothing was changed to fix this, deliberately: clearing another session's unfinished work is close enough to destroying a record that it is Nick Deck's call rather than an agent's, and it has been put to him as a choice between going through the unsaved files and keeping only what is clearly finished, or being told which pieces of work are still live so that only the finished ones are touched, with the second recommended.
**2026-09-20** — Nick Deck asked for everything to be landed so his Mac Studio could be restarted cleanly, and this records the state it was left in, filed against the plan at projects/ops/retirement/PLAN.md because that plan is where this session has been recording what it switches off, preserves or removes. Every commit this session made is on the cloud copy of the repository, checked by asking which remote branches contain them rather than assuming the pushes succeeded. One commit existed only on this Mac and belonged to a different piece of work, not to this session; rather than merge it or leave it exposed to a restart, it was pushed to a branch on the cloud copy named preserved slash local-only-before-restart-20260920, so it cannot be lost and whoever owns it can pick it up. Fourteen files holding grading notes were modified this morning by a different piece of work and were deliberately left untouched; each is a file named evals.md sitting inside one of the skill folders that hold this workspace's reusable instructions, and none of them was opened or changed by this session. Two temporary working copies created by helper sessions during this session were emptied and removed, after copying out the one unsaved document inside them so nothing was destroyed, and the count of working copies registered with the repository fell from seven to five; the remaining five belong to other work and were left alone. A lock file was present at the end, and rather than clear it a check of running programs showed it belongs to a push that is still finishing and to the program that pulls new work onto this Mac, so it was left in place because clearing a lock a running program is holding would break that program. Four programs repaired during this session were run one final time and all four report passing. Nothing this session started is still running in the background.
**2026-09-20** — This strengthens and corrects a record filed earlier tonight against the plan at projects/ops/retirement/PLAN.md, which governs the September 2026 drive that switched off and archived retired parts of Nick Deck's systems. Earlier I recorded that the six agents marked as no longer in service are present only as labelled documents and absent from the folder the assistant loads agents from, and called that the retirement method working. That was true but understated, because I had only looked at labelling. Two stronger facts turned up while reviewing the same area. First, those six were not merely left lying about: they were deliberately moved into a separate folder at .claude/agents-parked on 15 September 2026, which holds exactly those six files plus a note stating that they are not in service pending Nick Deck's sign-off, that they are kept out of the loaded list for that reason, and that the dispatch check refuses them by name. Second, and this is the part that matters, the refusal is real code rather than a label. The file projects/ops/skippy-jobs/lib/agent-in-service.mjs permits an agent only when its row in the register at projects/ops/agents/roster.json is explicitly marked as in service, and its own note records that a row carrying no such marking is treated as not in service, so a newly added agent is refused until somebody deliberately switches it on. A retired agent is therefore blocked by a program, not merely described as retired in a document anybody could ignore, which is a stronger guarantee than this plan asked for. One further check in the same area found no orphans: every one of the thirty-two skills in this workspace is referred to by at least one file outside its own folder, and outside the two web pages that are rebuilt automatically from those folders, which are projects/ops/artifacts/agent-org-chart/index.html and projects/ops/artifacts/skills-agents/index.html. So nothing has been retired into invisibility while still sitting on disk.
**2026-09-20** — A check made tonight while reviewing the agent definitions in Nick Deck's systems found the method of the September 2026 retirement drive, which the plan at projects/ops/retirement/PLAN.md governs, working correctly, and it is recorded here as a pass rather than a fault because a review that only files complaints teaches nothing about what is sound. Six agents are marked as no longer in service in the roster at projects/ops/agents/roster.json. Their definition files still exist in two folders, ZION/agents and .agents/agents, which are the stored definitions rather than the live ones, and every one of those six files carries a marker inside its own text saying it is out of service: counting that marker across the twenty-seven files in ZION/agents returns exactly six. None of the six appears in .claude/agents, which is the folder the assistant actually loads its agents from, and that folder holds exactly twenty-nine files, matching the twenty-nine agents the roster records as in service. So a retired agent is present as a labelled document, absent from anywhere it could be picked up and run, and self-describing to anyone who opens it, which is exactly what this plan asked for: archive and label rather than delete, and leave nothing a cold reader could mistake for a current instruction. Two things are worth noting beside that. The retired six are the marketing agents, and the generated web page that shows Nick Deck the agent fleet now states plainly that seven roster rows have no file yet, naming them, rather than leaving the gap silent. And the folder .agents/agents is byte-identical to ZION/agents, so the labelling holds in both. The step this is filed against is step fifteen of the plan at projects/ops/retirement/PLAN.md, which covers reducing each active project to one live document, and this finding changes nothing about how far that step has got.
**2026-09-20** — This adds the durable half of tonight's retraction to the plan at projects/ops/retirement/PLAN.md, which governs the September 2026 drive that switched off and archived retired parts of Nick Deck's systems, so the lesson survives the session that learned it. Twice in one night I claimed a scheduled job had been switched off by accident, on the grounds that the change which switched it off carried no explanation. Both times the explanation existed in a document I had not opened: the decision table at projects/ops/life-os/REGROUP-2026-09-08/plans/SCHEDULED/evidence/SWITCHOVER-DECISION-TABLE.txt, one thousand two hundred and eighteen lines, built on 10 September 2026 to decide which of two hundred and seventy-one scheduled jobs stayed on and which came off, each row carrying its reason. The reason the commits look blank is structural rather than careless: the switch-offs were carried out as ordinary edits to a file, and an automatic background job then committed whatever was sitting in the working folder under a generic message, so the commit that removes a row names no person and gives no reason by design of how the work was landed. Searching the commit history and finding nothing therefore says something about the commit history and nothing at all about whether a decision was made. That has now been written into this assistant's own long-term memory store as a file whose text names that decision table by its full path, states that a job absent from the commit history may still be listed there, and tells whoever reads it to look the job up in that table before writing anywhere that the job was switched off by accident. A one-line pointer to that file was added to the memory index that loads at the start of every session, so the next session inherits this rather than repeating it a third time. This also bears directly on what step fifteen of the plan at projects/ops/retirement/PLAN.md still owes, which is an independent reader going through the set of documents that the drive decided to keep rather than archive. Tonight is evidence for why that reader is still worth having: the authority that settles these questions is a document whose existence an agent has to already know about, and two sessions in one night failed to find it on their own.
**2026-09-20** — This retracts, in full, the record filed against this same step a short time ago. That record said the nightly sweep which runs every automated safety check in the folder projects/ops/skippy-jobs had been switched off with no decision behind it, and it was filed here precisely because the retirement plan at projects/ops/retirement/PLAN.md governs switch-offs and requires each one to carry a written reason. The claim was wrong. There is a reason, written down, and I had not opened the document that holds it. The document is a decision table at projects/ops/life-os/REGROUP-2026-09-08/plans/SCHEDULED/evidence/SWITCHOVER-DECISION-TABLE.txt, one thousand two hundred and eighteen lines long, built on 10 September 2026 to decide which scheduled jobs stayed on and which were switched off. At its lines six hundred and seventy and six hundred and seventy-four both halves of the sweep are marked SWITCH-OFF, with the reason beside them: that the nightly regression suite is a testing timer, and that its work was being taken over by a piece of work the table calls task nineteen and by checks run by the people who own each piece of code. The later commit that deleted the commented-out rows did so on Nick Deck's own quoted instruction to purge disabled entries so they never confuse anyone again. So the switch-off was reviewed, dated and explained, and this plan's method was followed rather than broken. What I did was search the commit history for a reason, find none there, and treat that as proof no decision existed anywhere. That is the second time in one night I have made that exact mistake, both times about these same scheduled jobs, and the first correction is already written into the system review at projects/ops/system-review/PLAN.md. One narrow thing survives and is recorded as a shortfall rather than an alarm: the job that the work called task nineteen actually produced, named larry-nightly and scheduled at twenty past three each morning, sweeps documents and pointers rather than running checks, so one thousand three hundred and fifty-six automated checks have no scheduled runner today. That is a gap against what the decision intended, for whoever owns that decision to close, and not a reason to put the old rows back. Nothing was re-armed and no scheduler row was changed.
**2026-09-20** — Tonight's review of the scheduled jobs in Nick Deck's systems turned up a switch-off that carries no decision behind it, which is the subject the retirement plan at projects/ops/retirement/PLAN.md exists to govern, so it is filed there. That plan covers the September 2026 drive that retired parts of those systems, and its whole method was that every switch-off is written down with its reason. The nightly sweep that runs every automated safety check in the folder projects/ops/skippy-jobs, one thousand three hundred and fifty-six of them, is not scheduled by anything. It had two rows in the scheduler, one for each half of the work, and both were commented out on 10 September 2026 in a commit whose message is sync colon working-tree snapshot from a nickdeck session, which is the automatic background job that commits whatever is sitting in the working folder. That commit records no reason, names no person and belongs to no lane. Six days later, on 16 September 2026, a second commit deleted the commented-out lines as part of a purge of one hundred and thirty entries it described as already retired, so a switch-off that nobody had explained was then tidied away as though it had been decided. The effect is that the record of which safety checks are already known to be broken has not been rewritten since 27 August 2026, and two hundred and sixty-three checks sit on it marked as expected to fail, which means a genuine failure among them reaches nobody. Nothing has been switched back on. That record is twenty-three days stale and the set of checks has grown by two hundred and seventy-one files since it was written, so putting the two scheduler rows back without dealing with the stale record first could send Nick Deck a four in the morning alert naming hundreds of checks. A separate helper session, given only the measurements and told to try to disprove them, is examining whether putting those two rows back is safe, and no scheduler row will be changed before it answers. The step this is filed against is step fifteen of the retirement plan at projects/ops/retirement/PLAN.md, which covers reducing each active project to one live document so no agent arriving cold can mistake an old document for a current instruction, and this finding changes nothing about how far that step has got.
**2026-09-20** — A finding from tonight's separate review of Nick Deck's tools and connectors is a fresh instance of a lesson already written down in the retirement plan at projects/ops/retirement/PLAN.md, and is filed there because that is where the lesson lives. That plan covers the September 2026 drive that switched off and archived retired parts of Nick Deck's systems, and the second numbered lesson in its closing write-up says that dependencies hide: three surfaces the drive deliberately kept alive turned out to be reading files the drive had moved, and not one of those three appeared in the list of files and jobs the drive compiled before it began. Tonight's finding has the same shape. The copy of the paid-spending gate deployed to the Cloudflare cloud service, at projects/personal/skippy-app/skippy-code/lib/lane.mjs, decides whether a named scheduled job may spend money by calling a function named todaySourceSpend on the spending meter beside it. That function exists on neither meter: loading projects/personal/skippy-app/skippy-code/ops/spend-meter.cjs and loading projects/ops/spend-meter.cjs and printing the type of that name returns undefined in both cases. The call therefore raises an error every time it runs, and the code around it catches every error and turns it into a refusal, so the feature has never once worked and has never once complained. It fails in the safe direction, refusing rather than spending, so no money is at risk and nothing needs undoing tonight. What it shows is that the lesson was written down and never turned into a check: nothing in Nick Deck's systems looks for a surface that was kept alive calling a function name that exists nowhere, and an error that is caught and swallowed is precisely the condition that hides such a call from every guard. This record is filed against step fifteen of the retirement plan at projects/ops/retirement/PLAN.md, which covers reducing each active project to one live document so that no agent arriving cold can mistake an old document for a current instruction, and it changes nothing about how far that step has got, which is unchanged by this finding because the finding is about a missing check rather than about a document.
**2026-09-20** — No work was done on the plan at projects/ops/retirement/PLAN.md or on the project it governs, which was the retiring of a set of older programs belonging to Nick Deck's assistant and the writing of a note explaining how each could be brought back. This entry exists because the check at projects/ops/skippy-jobs/lib/check-handback.mjs demands a progress record against the last plan a session edited in every period of work thereafter. One finding from elsewhere bears on this retirement work and is recorded here as a statement rather than a request, needing no answer from anyone. A program called bizapp-inbox-drain, which drains a queue that the business web application stages changes into, is switched off, and an attempt to measure that queue was refused by a guard because the script it runs writes to Nick Deck's retired board at monday.com. Reading that script confirms it: it names that board six hundred times and writes back to it. So that program cannot be restored without breaking Nick Deck's own standing rule of 12 September 2026 that business work goes to the hub at hub.heroesandsidekicks.io, personal work goes to the family application, and nothing goes to monday.com. It is correctly switched off. Whether anything still stages changes into that queue is unknown and unmeasured. If nothing does, then that queue and the script that drains it are retired in fact and should be retired in name, which is exactly the kind of tidying this retirement plan exists to do, and whoever next works on this plan now has that written down.
**2026-09-20** — No work was done on the plan at projects/ops/retirement/PLAN.md or on the project it governs, which was the retiring of a set of older programs belonging to Nick Deck's assistant and the writing of a note explaining how each could be brought back. This entry exists because the check that decides whether a working session may finish, at projects/ops/skippy-jobs/lib/check-handback.mjs, demands a progress record against the last plan a session edited in every period of work thereafter, and a session added one line to projects/ops/retirement/PLAN.md two days ago during a files cleanup. One thing about the retirement work itself is worth putting here, because it was measured while looking at something else and it bears on this project directly. Two timed programs that a decision table dated 8 September marks as keep running, named coordination-governor and build-control-status, are not running, and checking rather than assuming showed they are correctly off: the four shared notebook documents that the first exists to police were themselves retired on 13 September, and the changelog file the second reads to generate its status page no longer exists. So the retirement of those notebooks, which is this project's own kind of work, correctly made two timed programs redundant, and a decision table written five days earlier simply had not caught up. That is a point in favour of this project rather than against it, and it is recorded here because whoever next reads this plan should know that the retirement swept up the programs that served the retired documents as well.
**2026-09-20** — No work was done on the plan at projects/ops/retirement/PLAN.md or on the project it governs, which was the retiring of a set of older programs belonging to Nick Deck's assistant and the writing of a note explaining how each could be brought back. This is the fifth entry of its kind and it records something new about the check that forces them. That check, at projects/ops/skippy-jobs/lib/check-handback.mjs, is documented as requiring a progress record only in a period of work where something real changed. This period changed nothing: Nick asked aloud whether the work was finished, and the answer came from reading the file at projects/ops/system-review/PLAN.md, which is the record of a thirteen-area review of his computers and software, and counting the steps listed in it. No file was written anywhere. The check demanded a record anyway. So the fault already recorded, that it counts periods of work rather than changes, is narrower than first described and the real behaviour is worse: once a session has edited a plan belonging to a tracked project even once, the demand appears in every period of work thereafter, including periods in which the session only read and spoke. The repair, to rest the demand on the edits rather than on the periods of work, was given to a separate helper session of this same assistant to attack. That session confirmed by running the code that the behaviour is as described, but its full verdict never reached the session that asked for it, so nothing has been changed on the strength of it. The programs that decide all of this are projects/ops/skippy-jobs/lib/check-handback.mjs and projects/ops/skippy-jobs/lib/handback-contract.mjs, and they govern how every working session on every one of Nick Deck's computers is allowed to end.
**2026-09-20** — No work was done on the plan at projects/ops/retirement/PLAN.md or on the project it governs, which was the retiring of a set of older programs belonging to Nick Deck's assistant and the writing of a note explaining how each could be brought back. This entry exists because the check that decides whether a working session may finish counts periods of work rather than changes: it fixes on the last plan belonging to a tracked project that a session edited, then demands a progress record against that plan in every period of work where anything at all changed anywhere. A session added one line to projects/ops/retirement/PLAN.md two days ago during a files cleanup, so that session must keep writing entries into it. This is the fourth such entry and each can only repeat that nothing changed, which is the opposite of what a plan is for. The repair, to make the demand rest on the edits rather than on the periods of work, was given to a separate helper session of this same assistant to attack; that session confirmed by running the code that the behaviour is as described, but its full verdict never reached the session that asked for it, so nothing has been changed on the strength of it. The two programs that decide this are projects/ops/skippy-jobs/lib/check-handback.mjs and projects/ops/skippy-jobs/lib/handback-contract.mjs, and they govern how every working session on every one of Nick Deck's computers is allowed to end, which is why the change waits for a verdict that can be read rather than assumed. The fault is written up with its evidence in the plan at projects/ops/system-review/PLAN.md, which records a thirteen-area review of Nick Deck's computers and software.
**2026-09-20** — No work was done on the plan at projects/ops/retirement/PLAN.md or on the project it governs, which was the retiring of a set of older programs belonging to Nick Deck's assistant and the writing of a note explaining how each could be brought back. The only change any recent session made to projects/ops/retirement/PLAN.md was a single dated line added on 18 September 2026, recording that a companion document had been moved into an archive folder, and that change has already been recorded truthfully against step 15 of that same plan, which covers moving every project to a single live document. This entry adds nothing about the retirement project because there is nothing left to add. It exists because the check that decides whether a working session may finish counts periods of work rather than changes: it fixes on the last plan belonging to a tracked project that a session edited, then demands a progress record against that plan in every period of work where anything at all changed anywhere, so a session that touched projects/ops/retirement/PLAN.md once two days ago must keep writing into it. The proposed repair is to make that demand rest on the edits rather than on the periods of work, so that recording an edit satisfies the check once and it then falls silent until the plan is edited again. That repair has been handed to a separate helper session of this same assistant to attack before anything is changed, because the two programs deciding this, at projects/ops/skippy-jobs/lib/check-handback.mjs and projects/ops/skippy-jobs/lib/handback-contract.mjs, govern how every working session on every one of Nick Deck's computers is allowed to end. The fault is also written up in full, with the lines of code that decide it, in the plan at projects/ops/system-review/PLAN.md, which is the record of a thirteen-area review of Nick Deck's computers and software.
**2026-09-20** — No work was done on this plan or on the project it governs, which was the retiring of a set of older programs belonging to Nick Deck's assistant and the writing of a note explaining how each could be brought back. The single change any recent session made to this file was one dated line added on 18 September 2026, recording that a companion document had been moved into an archive folder, and that change was already recorded truthfully against this same step earlier tonight. This entry adds nothing about the retirement work because there is nothing to add. It exists because of a fault in the check that decides whether a working session may finish, which has now been written up in full in the plan for the thirteen-area review of Nick Deck's computers and software at projects/ops/system-review/PLAN.md. That check fixes on the last plan belonging to a tracked project that a session edited, and then requires a progress record against that plan in every period of work where anything at all changed, anywhere. Its own wording is that no real changes were made this turn, so the unit it counts is the period of work rather than the change. The effect is that a session which touched a tracked plan once, however trivially, must keep writing records into that plan for the rest of its life, and those records can only say nothing, which is exactly what the rule limiting each project to one document exists to prevent. The repair is for that check to ask whether this session's edits have been recorded rather than whether this period of work has produced a record, so that one record per edit satisfies it and it then stops asking. That repair is held for an independent working session rather than made here, because the programs deciding this govern how every session on every computer is allowed to end.
**2026-09-20** — This plan at projects/ops/retirement/PLAN.md governs the retirement of a set of older programs belonging to Nick Deck's assistant, and the writing of a note explaining how each could be brought back. One companion document belonging to that retirement work was moved into a dated archive folder on 18 September 2026, by a working session carrying out the one-document-per-project cleanup across the whole code repository, and a single dated line was added to this retirement plan recording that it had happened. That line is the only change that session made to this file. The plan's own content and its other steps are untouched. The percentage for this step is left where it was, because archiving one document is progress along it rather than its completion. The record is written now because the check that decides whether a working session may finish correctly noticed that a session had changed a plan belonging to a tracked project without recording anything against it, and this retirement plan is in good order in every respect that several other plans blocking the same session were not: it is listed in the register of projects at projects/ops/artifacts/project-status/registry.json, and the card it names still exists on the task board at hub.heroesandsidekicks.io, which was checked directly against that board rather than assumed. Worth writing down for whoever next touches this retirement plan: eleven of its fifteen steps cannot be closed by the recording tool at all, because each of those eleven lines carries a note in brackets after its percentage, and the pattern the tool uses to find a step requires the percentage to be the last thing on the line. This step could be closed because its line does not carry such a note. Widening that pattern is not a safe change to make casually, because the tool rebuilds the line from its own pieces when it writes, so a note in brackets would be silently deleted the first time any such step was closed, and those notes carry commit identifiers and checker verdicts.
**2026-09-05** — This is the closing update for the workspace clean-out project — the plan document at projects/ops/retirement/PLAN.md, whose job is to leave only the currently active work visible in the shared folder every AI agent session works from, and to move everything older into the dated archive folder projects/_archive/goal-purge-2026-09-04. Its step 15, the clean-out Nick ordered on 4 September (every active project keeps exactly one live plan document; everything else is archived or left only in version history), stands at 95 percent and is recorded, posted to the project's board card and reflected on the status page. What landed tonight, all by rename with nothing deleted: 5,743 files moved into the archive — the old set of planning documents for Skippy (Skippy is Nick's AI assistant, a desktop app and a voice app) — an index, ten per-area plans, their change logs, twelve hand-off prompts, a tracker, two postmortems, seven close-out scripts and three per-area folders — which competed with the one plan that is now the only live plan for it (projects/ops/skippy-master-plan/PLAN-SKIPPY-FINISH.md); eleven folders of audit transcripts that agents wrote during finished build runs on the business Hub (the internal web app the Heroes and Sidekicks staffing business runs its team, clients and finances from); 3,767 dated backup copies of agent rule files; 29 loose backup files; 33 documents whose own first lines declared them superseded and that no running program reads; the document copies inside the test copy of the family app (the household web app that also hosts Skippy's screens); and, after Nick said yes on 5 September, the 219 leftover snapshot files from the health engine's model comparison runs (the health engine is the program that answers questions about Nick's health from his own records). In the live folder, 178 files that named an old path now name the archive path. Counts before and after: files in the live folder 29,277 to 23,379; documents 6,767 to 2,676; backup-style files 3,883 to 92. The list of what stays, each with the program that reads it or the reason it stays, is in the plan's section 1c-audit. Nick also approved, on 5 September, that the group of AI agent sessions building the business Hub (a stream of work is called a lane, and this one is the Hub lane) will merge the seven separate plan documents the Hub currently has — one per area of its build — plus their index into one single plan document, after the Hub build now running lands; that instruction is posted in the Hub lane's running-state document (projects/ops/zion/STATE-ZION-19.md). One honest note: the last commit's path scope also included an append-only log file under the health records folder that another session had touched — a machine-written log, not anyone's work. The remaining 5 percent of step 15 is a fresh agent session reading the keep list cold and grading it. Nothing is waiting on Nick.
**2026-09-05** — This update is about the workspace clean-out project — the plan document at projects/ops/retirement/PLAN.md, whose job is to leave only the currently active work visible in the shared code-and-documents folder that every AI agent session works from, and to move everything older into a dated archive folder (projects/_archive/goal-purge-2026-09-04). Nick, the owner, gave a second instruction on 4 September: every active project may have exactly one live plan document, and any older plan, spec, tracker, backup copy or audit write-up must be moved to that archive folder or left only in the version history, because an agent that opens a stale document builds the wrong thing. Step 15 of the plan carried that out. In total 5,743 files were moved into the archive folder by rename, so nothing was destroyed and every file is still findable at its old path with the archive folder name in front. What moved: (1) the old set of planning documents for Skippy — Skippy is Nick's AI assistant, delivered as a desktop app and a voice app — namely an index, ten lane plans, their change logs, twelve hand-off prompts, a tracker, two postmortems, seven close-out scripts and three lane folders, all of which competed with the one plan that is now the only live plan for Skippy (projects/ops/skippy-master-plan/PLAN-SKIPPY-FINISH.md); (2) eleven folders of audit transcripts that agents wrote during finished drives on the business Hub — the Hub is the internal web app the Heroes and Sidekicks staffing business runs its team, clients and finances from; (3) 3,767 dated backup copies of agent rule files, written by the housekeeping script that prunes those rules and keeps a copy before each prune; (4) 29 loose backup files ending in .bak, .snapshot or .retired; (5) 33 documents whose own first lines declared them superseded and that no running program reads; (6) the document copies inside the test copy of the family app — the family app is the household web app that also hosts Skippy's screens; (7) after Nick answered yes on 5 September, the 219 leftover snapshot files from the health engine's model comparison runs — the health engine is the program that answers questions about Nick's health from his own records. In the live folder, 178 files that named an old path were edited to name the archive path instead. Counts before and after: files in the live folder 29,277 to 23,379; documents 6,767 to 2,676; backup-style files 3,883 to 92. The list of what stays, each with the program that reads it or the reason it stays, is written in the plan's section 1c-audit. Nick also approved one further fold: the business Hub still has seven lane plans plus an index as its live documents, and the agent lane that owns the Hub will merge them into one document after the Hub build now running lands; that instruction is posted in the Hub lane's state file (projects/ops/zion/STATE-ZION-19.md). One thing is still owed before this step can read 100 percent: a fresh agent session that did none of this work reads the keep list cold and grades whether each kept item really earns its place. Nothing is being asked of Nick in this update.
## STEPS
1. Archive home + retirement note — 100% (commit c2be4be03; checker PASS)
DEFINITION OF DONE: the retirement note exists with resume instructions for Gracie, Neeko, family app
PROOF: `ls projects/_archive/goal-purge-2026-09-04/` → `RETIREMENT-NOTE.md projects` (re-run 2026-09-04 19:50Z by the resuming overseer)
2. Two-way re-verification of every RETIRE/DISABLE row — 100% (commit 95d41301c)
DEFINITION OF DONE: before-counts cover all 16 rows both ways; sweep script proven red
PROOF: `command grep -c "METHOD-A" projects/ops/retirement/evidence/refcounts-before.txt` → 16; `METHOD-B` → 17; the v1 sweep exited 1 (red) at 95d41301c. The sweep itself was corrected to v2 at STEP 10 — see PLAN-CHANGES 2026-09-04 (v1 could never go green).
3. ZION index dated dispositions — 100% (commits 2cb8a765f + 1d95e53d0; first check FAIL on the two missing handoff lines, re-check PASS 6/6 after they were posted)
DEFINITION OF DONE: 12 dated deltas, no stage deleted, two handoff lines posted
PROOF: `command grep -c "2026-09-04" projects/ops/zion/PLAN-ZION-PROGRAMME.md` → 14; index commit removed 11 table rows and added 11 (pure status edits, no lane row removed); ZION-17 line at STATE-ZION-19.md §HANDOFFS-IN, ZION-7 line at PLAN-SMP-PROGRAMME.md line 26 (both 1d95e53d0, 1 insertion each).
4. Retired ZION lane files moved to archive — 100% (commit bf859b661: 58 renames, 0 deletions)
DEFINITION OF DONE: nine lanes' files under the archive with banners; kept lanes untouched
PROOF: `ls projects/_archive/goal-purge-2026-09-04/projects/ops/zion/` lists PLAN/STATE/CHANGES files for ZION-1,5,6,9,10,11,13,16,18 plus their evidence folders; `git show --diff-filter=D --name-only bf859b661` → 0 lines; kept lanes 3/4/8/12/14/17/19 still under projects/ops/zion/ (11 files).
5. SMP deltas + Alexa spec archived + handoffs — 100% (commit 23978e040: 3 renames, 0 deletions; checker PASS)
DEFINITION OF DONE: SMP-2 PARKED, SMP-9 RETIRED, Alexa spec moved, learning-app root untouched
PROOF: `command grep -c "PARKED\|RETIRED" projects/_archive/goal-purge-2026-09-04/projects/ops/skippy-master-plan/PLAN-SMP-PROGRAMME.md` → 3; archive holds skippy-master-plan/PLAN-SMP-9.md + PLAN-CHANGES-SMP-9.md and personal/skippy-app/ALEXA-ACCESS-SPEC.md; `projects/personal/learning-app/` still on disk.
6. Retired-capability jobs disabled with control — 80% (commit 998dee258; table half PASS; fire-half NOT MEASURABLE FROM HERE — the jobs-owner Mac mini, whose last HEARTBEAT row is 13:02Z 2026-09-04)
DEFINITION OF DONE: five retired rows commented out in the daemon's schedule table; kept-job control fired in same window
PROOF: `command grep -c "DISABLED 2026-09-04 goal-purge" projects/ops/skippy-jobs/runner.mjs` → 5; the live-row grep for the five names → 0; `node --check projects/ops/skippy-jobs/runner.mjs` → loads. Control: HEARTBEAT shows the Mac Studio's own jobs advancing (service-code-fresh 19:21Z, sync-drift-watch 19:00Z) while the five retired rows' last stamps are all ≤ 13:00Z on 2026-09-04 — consistent with the switch, but the owner machine has not pulled since, so the fire-half stays open (SMP-8 handoff posted, line 26 of the SMP index).
7. Assistants dev docs archived RESUMABLE — 100% (commit 5d79b1484: 60 renames, 0 deletions; checker PASS)
DEFINITION OF DONE: THE-ASSISTANTS + the Gracie/Neeko/Wall-E/Eeva files of assistants-replan in archive; Kanban plan family and Chantelle's live jobs untouched
PROOF: `ls projects/_archive/goal-purge-2026-09-04/projects/ops/` → THE-ASSISTANTS.md, assistants-replan (PLAN-2-GRACIE.md, PLAN-3-NEEKO.md, gracie-evidence, neeko …); `ls projects/ops/assistants-replan/PLAN-6-KANBAN-PM.md` still prints (did NOT move); chantelle-* rows still live in HEARTBEAT (12:45Z).
8. OpenBrain-delivery + quality-tracking docs archived; store proven live — 100% (commit a63014f02: 187 renames, 0 deletions; checker PASS A–E)
DEFINITION OF DONE: folders moved; both MCP engines answer post-move
PROOF: `ls projects/_archive/goal-purge-2026-09-04/projects/ops/` lists openbrain-delivery and sp13-quality-tracking; no engine file reads either path (two prose citations only); the live store retrieves 3 passages for each engine; both engines answer end to end ("Nick's wife is Chantelle…", "Heroes & Sidekicks is a virtual staffing agency…", passages_used 8). Full record: evidence/step8-engine-probes-after-move.txt. The front-door errors seen at 19:20Z had a pre-existing, unrelated cause (lane.py's env-file lookup broke when the file became a symlink on 2026-09-03) — fixed at the root in deck-shared commit 777bc82, pushed; reviewed SOUND.
9. Live pointers purged (canon, heartbeat, board) — 100%
DEFINITION OF DONE: retired rows read RETIRED; fresh board read shows zero open retired cards
PROOF: ACTIVE-WORK.md has carried no tracker rows since 2026-08-26 (18 lines, 0 table rows — the grep returns 0 because there is nothing to mark, recorded in PLAN-CHANGES); HEARTBEAT is daemon-written only. Board: six open cards driving retired or paused work (OpenBrain Delivery · ZION-17 board-PM · Neeko daily review health · Neeko project-doc health · a Neeko wiring diagnostic · the low-cost-routing recovery card) each got a dated comment citing Nick's words (read back from the thread) and were then superseded through the board's own `supersede_many` action with lane `goal-purge-2026-09-04`; a fresh read of the board shows all six ABSENT from the open list (157 → 151 rows). Three related cards were annotated and deliberately left open for their owners: Chantelle's-Mac routing (hers to close), the AI Rebuild master plan (SMP's archive item), ZION-3 (superseded by ZION-19, the Hub lane closes it).
10. Citation sweep green after red — 100% (commits 294e1fea1 + 58fe488c8: 97 exact path swaps across 59 live files)
DEFINITION OF DONE: sweep exits 0; the sweep is the committed v2 (v1 could never go green — PLAN-CHANGES), seen red (FILES=280 TOTAL=1102 before wave 2) before green
PROOF: `bash projects/ops/retirement/evidence/citation-sweep.sh` → `FILES=0 TOTAL=0`, exit 0. With `SWEEP_INCLUDE_HISTORY=1` the same run counts 3,835 mentions in 281 files, all inside the named classes (journals, snapshots, machine state, closed-drive evidence, frozen copies, generated pages, two tools whose logic names a path and whose owners hold a handoff, one test fixture). Real dependencies the sweep caught and fixed: a nightly test reading the ZION-5 plan, a proof script reading the ZION-9 plan, the fleet-roster name map (then the org chart regenerated by its own generator), the OpenBrain tests folder (moved back — a nightly guard runs it).
11. After-counts, populations named — 100%
DEFINITION OF DONE: after-counts complete, every remainder classified
PROOF: `command grep -c "METHOD-A" projects/ops/retirement/evidence/refcounts-after.txt` → 16 and `METHOD-B` → 16; every row lists its remaining files by population (history journals, snapshots, machine state, closed-drive evidence, frozen copies, generated files, live lane plans citing the archive, parked app code, agent definitions, prose mentions). Honest note: the before-file holds two concatenated runs of STEP 2's script with different numbers per row (a first run with placeholders, then a redo), so before/after are not a clean pair; the exact-path measurement (METHOD-B, the sweep) is the one that is comparable and it went from red to zero. The after-measurement ran the same patterns and scopes in one pass per file because BSD grep took over an hour per run.
11b. Ecosystem-wide file audit — 85% (wave 1 executed; residue named for its owners)
DEFINITION OF DONE: ground measured two ways; rule written first; every counted file in one bucket or an out-of-scope class; KEEP set written as prose; ARCHIVE bucket moved by rename
PROOF: evidence/step11b-ground-counts.txt (42,473 git-touched · 123,100 disk-modified, explained); §1c-audit above holds the rule, the class table with reader names, the KEEP set and the residue; `git show --diff-filter=D --name-only a051b557c 58fe488c8` → 0 lines; renames 543 + 13. What is NOT done and why: the guide-records snapshots and the closed-drive evidence folders under projects/ops/zion stay for their owners (the Hub lane is live beside them), and the docs-level pass over projects/ops root specs is judgment work handed to the NEXT list with counts — a 100% here would have meant moving files whose readers I could not name.
15. The conflict purge — one live document per active project — 97%
NOTE: executed 2026-09-04 on Nick's second hand-off; a cold reader on the KEEP list is still owed; the Hub lane's own second copies were flagged, not moved, and Nick approved their fold for after the current Hub drive (2026-09-05, "1 ok")
DEFINITION OF DONE: every document that fails Nick's "could a cold agent mistake it for current instruction" test is archived by rename with a banner naming the live authority; every exact old path in the live tree repointed; the KEEP list written with the reader or reason per item; before/after counts measured; zero deletions
PROOF: renames 5,745, deletions 0 (commit 7eddc72e8 on this machine, pushed by the session-end sync — `git show --diff-filter=R --name-only 7eddc72e8 | wc -l` → 5,743; its two D lines pair with its two A lines, both files present under the archive); live files 29,277 → 23,379, live `.md` 6,767 → 2,676, backup-style 3,883 → 92; `ls projects/ops/skippy-master-plan/*.md` → the three SKIPPY-FINISH files only; §1c-audit STEP 15 table; test comparison against a pristine checkout of HEAD (eight pre-existing reds unchanged, one dependency found and undone — the rebuild record)
12. Cold walk verdict — 100% (first walk FAIL on two named routes; both fixed at the root; re-walk on the named routes only → PASS)
DEFINITION OF DONE: fresh session's verdict pasted verbatim under the words COLD WALK VERDICT, or its FAILs fixed and re-walked on the named routes only
PROOF — COLD WALK VERDICT (fresh Sonnet session, read-only, relayed unchanged):
"Step 1 — what a new agent would believe is LIVE, from ACTIVE-WORK.md, ZION index, SMP index, and the runner SCHEDULE alone: Skippy core/voice (SMP-1,4,6,7,10), business Hub (ZION-4, ZION-19), runtime reliability/scheduled-task fleet (SMP-8, folded ZION-2/7), team access (ZION-12), approvals-as-security-gate (ZION-8), the file-protection gates, the routing tools, the running OpenBrain store, Google sign-in, and Chantelle's three personal reminder jobs plus the always-on watcher fleet. Nothing else reads as live from these four sources alone.
(a) Shopping list — FAIL. .claude/skills/shopping-list/SKILL.md presents agent-gated shopping-list adds as a fully live, mandatory instruction set with zero RETIRED/PARKED marker. (b) Weekly quality report — PASS. (c) Skippy School — FAIL. DOC-REGISTRY.md:112 lists projects/personal/learning-app/SKIPPY-SCHOOL-HANDOFF.md as 'Full build history, architecture, and open items for the kids' app' with no retirement marker; the handoff file still reads as an open backlog. (d) OpenBrain build lane — PASS. (e) Autorouter + cheap-routing enforcement — PASS. (f) Cleanup audit — PASS. (g) Wider Alexa access — PASS. (h) Gracie/Neeko — PASS. (i) RETIREMENT-NOTE.md — PASS. (ii) DISABLED count = 5, zero live rows for the five names, chantelle-progesterone-reminder live and untouched — PASS. (iii) all six kept-live files/dirs present — PASS. Overall verdict: FAIL — two live pointers into retired work remain reachable."
FIXES (commit 5fb1453f8; the handoff file's banner is committed inside the learning-app's own repository, 814c185): the shopping-list skill's description and first body line now carry a dated RETIRED banner; the registry row and the handoff file carry dated RETIRED banners. RE-WALK on the two named routes plus the sweep, by a second fresh session: "1. Shopping-list skill retirement — PASS. 2. DOC-REGISTRY / SKIPPY-SCHOOL-HANDOFF — PASS. 3. Sweep — FILES=0 TOTAL=0; runbook check PASS; nightly guard OK. 4. Zero deletions — 0, 0, 0. Overall verdict: PASS — all four previously-flagged failures are confirmed fixed."
The separate STEPS 9–11b checker (Sonnet, read-only) graded A zero deletions PASS · B sweep FAIL (four stale citations inside the tests folder that had been moved back) · C readers PASS · D wave-1 dependency claims PASS · E board PASS · F after-counts PASS. Its B finding is the one fixed above: the runbook, the D4C plan and the evidence folder moved back beside the tests that read them, with their pre-banner bytes; the sweep now drops paths that exist again at their old location and says how many (22 of 308).
VERIFIED: 2026-09-05 (95% — the moves, the repoints, the counts and the KEEP list landed and are committed; what remains is a cold reader's grade of the KEEP list, STEP 12's method, and the Hub lane's own fold of its seven lane plans, which Nick approved for after the current Hub drive)
VERIFIED: 2026-09-05 (95% — moves, repoints, counts and the KEEP list landed and are committed; the Hub fold is approved by Nick for after the current Hub drive and posted to the Hub lane; still owed: a cold reader's grade of the KEEP list, STEP 12's method)
VERIFIED: Verified by reading the change out of the stored history rather than by assertion: the commit dated 18 September 2026 at 18:09 adds exactly one line to this plan and changes nothing else in it. The percentage is deliberately unchanged at 95 percent, because archiving one companion document is a step along this work rather than the end of it.
VERIFIED: Nothing about this project changed in this period of work. The percentage is unchanged at 95 percent and no step moved. This entry exists only because the check that decides whether a working session may finish asks once per period of work rather than once per change, so a session that touched this plan once two days ago is required to write here again each time it changes anything anywhere else.
VERIFIED: Nothing about the retirement project changed. The percentage is unchanged at 95 percent and no step moved. This entry exists only because the check that decides whether a working session may finish counts periods of work rather than changes, and that fault is now with a separate helper session for repair.
VERIFIED: Nothing about the retirement project changed in this period of work. The percentage stays at 95 percent and no step moved. The only change any recent session made to projects/ops/retirement/PLAN.md remains the single dated line added on 18 September 2026, already recorded against step 15.
VERIFIED: Nothing about the retirement project changed. The percentage stays at 95 percent and no step moved. The period of work this entry covers contained no change to any file at all: it answered a spoken question by reading one document and counting its steps.
VERIFIED: Nothing about the retirement project changed. The percentage stays at 95 percent and no step moved. The only change any session made to projects/ops/retirement/PLAN.md remains the single dated line added on 18 September 2026.
VERIFIED: Nothing about the retirement project changed. The percentage stays at 95 percent and no step moved. The only change any session made to projects/ops/retirement/PLAN.md remains the single dated line added on 18 September 2026.
VERIFIED: Measured on this Mac rather than reasoned about: loading each of the two spending meters in turn and printing the type of the function name in question returns undefined for both, so the call can never succeed. The program making the call wraps it in a catch that turns any error into a refusal, which is why nothing has ever reported it, and the one failing assertion in the test named _test-cloud-paid-lane-gate.mjs is exactly this call. Nothing was changed by this record; it files a measured example.
VERIFIED: Measured directly on this Mac rather than inferred. The scheduler table in projects/ops/skippy-jobs/runner.mjs holds one hundred and seven job rows and neither sweep row is among them. No file in the machine's LaunchAgents folder mentions the sweep. Every tracked file containing the sweep's path was opened and each hit is either a comment or an audit document, and the job named regression-gate states in its own header that it is not a second sweep. The commit that commented the rows out was read directly and its message and date taken from the commit itself.
VERIFIED: Checked on this Mac rather than accepted on a helper's word: the decision table was opened at its lines six hundred and seventy and six hundred and seventy-four and both rows read SWITCH-OFF with their reason beside them, verbatim. The one surviving gap was checked the same way: the job named larry-nightly is scheduled at twenty past three each morning and its source contains no reference to any file beginning with the characters underscore test.
VERIFIED: The memory file was written and then read back from disk, and the one-line pointer to it was added to the index file and confirmed present by counting the pointer text in that index, which returned one. The decision table's two lines were opened directly on this Mac before any of this was written, and both read SWITCH-OFF with their reason beside them.
VERIFIED: Measured on this Mac by listing each of the six names in all three folders and by counting how many files in ZION/agents carry the out-of-service marker, which returned six of twenty-seven. The count of agents recorded as in service in projects/ops/agents/roster.json is twenty-nine and the number of files in .claude/agents is also twenty-nine, and the six retired names are absent from that folder.
VERIFIED: Measured on this Mac by listing the folder .claude/agents-parked, which holds the six named files and a note explaining them, and by opening projects/ops/skippy-jobs/lib/agent-in-service.mjs and reading the line that permits only a row marked in service and the note stating that a row with no such marking is treated as not in service. A separate count of every skill against all twenty-seven thousand tracked files found that all thirty-two have at least one caller outside their own folder and outside the two pages listed in the summary.
VERIFIED: Each statement was measured on this Mac at the moment of landing. Three of this session's own commits were confirmed present on the cloud copy by asking which remote branches contain them. The commit that existed only on this Mac was pushed to a named branch on the cloud copy and its presence there confirmed the same way. The two temporary working copies were removed and the count of registered working copies fell from seven to five. The lock file was confirmed to belong to a running program by listing processes, which showed a push in progress and the pulling program running.
VERIFIED: Measured on this Mac after the restart. Asking the cloud copy which of its branches contain each of the three commits returns a branch for all three, so none is stranded. The count of unsaved files in the shared folder was taken directly and is one hundred and seventy-four, spread across at least six different top-level project folders. The warning text was read from the automatic pushing program's own log file at a timestamp of fourteen thirty-one.
VERIFIED: Measured on this Mac. The rescue branch was confirmed to exist on the cloud copy and a direct ancestry test showed this machine's current position is not descended from it, which is exactly why the push is refused. The count of unsaved files was taken directly: one hundred and eighty in total, of which thirty match the patterns of machine-written state and one hundred and fifty do not, and reading the modification date of every one of the readable non-state files returned the same date, today. The role register was read to confirm this machine is the one that holds the scheduled work, and the count of commits it is missing was taken from the cloud copy directly.
VERIFIED: Measured on this Mac rather than recalled. The count of thirty-five changes came from searching the commit history since 18 September 2026 for commit messages beginning with the words REVIEW AREA. The dates showing how long each broken check had been broken were read from the comments and commit history of the files themselves during the work that repaired them, and each repair was proven able to fail on purpose before being trusted. No change has been made to the file projects/ops/skippy-jobs/lib/auto-push.mjs, and the reader sent to disprove the proposed repair to it has not yet reported.
VERIFIED: Each claim was re-run on this Mac rather than accepted from the reader that raised it. Line forty-one of projects/ops/skippy-jobs/jobs/remote-branch-prune.mjs was read directly and does protect every branch whose name begins with the characters m a c and a slash. The pattern in projects/ops/skippy-jobs/jobs/machine-off-main-watch.mjs was executed against a proposed name carrying a commit fingerprint and returned true, so each such branch would indeed raise a signal. Counting the failure line in the pushing program's own log file returns four hundred and thirty-one. Asking which commits sit on the dated rescue branch but are not already applied to this machine's current position returns none, so a guarded repoint would lose nothing today.
VERIFIED: The certification was read directly out of the review's own plan file at projects/ops/system-review/PLAN.md, lines nine hundred and forty to nine hundred and forty-three, rather than accepted from the reader that reported it, and the wording quoted here is verbatim including the closing phrase about the code read. The count of failures was taken by searching the pushing program's own log file for its failure line and returns four hundred and thirty-one. Nothing has been changed in any file.
VERIFIED: Proven on this Mac rather than reasoned about. Before the change, asking the cloud copy which of its branches contain this machine's current position returned nothing at all, so the work genuinely was on one computer. The repaired program was then run for real and its own log records that it pushed to the dated rescue branch by repointing it, having established that the branch held nothing this machine lacks, which is the first success in ten days. Asking the cloud copy the same question afterwards now returns that branch. The guard was then run against all eleven rescue branches present on the cloud copy: it permits five and refuses six, including one carrying one hundred and twenty-two unapplied commits and one carrying thirty-seven unapplied commits and two merge commits, so it discriminates rather than always agreeing. Both of the repaired file's own test programs still pass, at nine checks and ten checks with none failing. An independent checking session that did not make the change is verifying all of it now.
VERIFIED: An independent checking session that did not make the change re-ran every claim against the real repository and the real branches on the cloud copy, pushing nothing itself, and passed all of them. It confirmed the five permitted and six refused decisions across the eleven dated branches, and the two quoted figures of one hundred and twenty-two unapplied commits on one branch and thirty-seven unapplied commits with two merge commits on another. It also observed the repaired program running for real five times between 15:41 and 15:44 on 20 September 2026, every run succeeding, and confirmed by recording every relevant branch identifier before and after that a redirected test run now changes nothing on the real repository.
VERIFIED: Checked on this Mac at the moment of writing. The new section is present in projects/ops/system-review/PLAN.md, confirmed by searching that file for its heading, and the change is committed. The helper session running on the Fable model has produced no output yet: the file it writes to is zero bytes after twenty-seven minutes, which is expected because that way of running a model writes only when it finishes.
VERIFIED: Measured on this Mac. The output file of the first attempt contains one hundred and forty-six bytes and holds only the sentence saying the account is out of usage credits, so no judgement was produced. Each of the eight account slots was then probed with a one-word request on the same model: five answered that they were out or limited, one answered that its weekly limit resets on 23 September 2026, and two answered normally. The second attempt is running on one of those two.
VERIFIED: Observed directly across this session: the end-of-turn check at projects/ops/skippy-jobs/lib/check-handback.mjs has demanded a record on roughly a dozen turns, including turns immediately following a record against the same plan file that reported all three of its effects landing. The wording it prints each time states that the recording command was used this session but not for this project's own plan file, which is contradicted by the successful run that preceded it.
VERIFIED: Confirmed by listing the section headings of projects/ops/system-review/PLAN.md: the handover is now the first, at line five, ahead of every other section, and the two detailed sections it points at follow it. Searching the file for the headings of the two earlier overlapping handover sections returns none, so they were replaced rather than added to. The change is committed.
VERIFIED: Each of the three explanations was checked by opening projects/ops/skippy-jobs/lib/handback-contract.mjs and reading the function concerned rather than by reasoning about behaviour: the path expander at line one thousand three hundred and sixty-six, the command pattern at line one thousand one hundred and two, and the ordering condition at line one thousand four hundred and sixty-one. The check's own log file, at projects/ops/skippy-jobs/lib/handback-gate.log, was read for the exact refusal wording it recorded, which names the plan file in full.
VERIFIED: Checked after every step. The tip of the shared copy's main line is unchanged, so nothing was sent. The commit holding the two hundred and seventeen saved files is present on two branches of the shared copy, confirmed by asking which branches contain it. The four held files were restored and compared, and the working folder holds thirteen changed files, all of them written by the running programs rather than by this session. The temporary copy of the repository was removed and the count of registered copies returned to its previous value.
VERIFIED: The two load-bearing claims were read directly rather than inferred. Lines six hundred and seventy and six hundred and seventy-four of projects/ops/life-os/REGROUP-2026-09-08/plans/SCHEDULED/evidence/SWITCHOVER-DECISION-TABLE.txt mark both halves of the nightly sweep as switched off and give the reason quoted here. Searching projects/ops/skippy-jobs/jobs/larry-nightly.mjs for any reference to a file beginning with the characters underscore test returns none, and that job is present in the scheduler's table with a start time of twenty past three.
VERIFIED: Three claims were re-read directly rather than accepted from the helper session. Line two of the survey document states that nothing was changed, enabled or disabled. Searching projects/ops/skippy-jobs/jobs.log for the overdue line returns a last run of 18 September 2026 and six occurrences in total. The watching program appears in the scheduler's table at line three hundred and seventeen of projects/ops/skippy-jobs/runner.mjs, and line one thousand six hundred and eighty-two of projects/ops/skippy-jobs/lib.mjs returns a refusal naming the infrastructure gate.
13. Plain-English report to Nick — 100%
DEFINITION OF DONE: three labelled blocks, zero jargon, WHAT'S-WAITING block present
PROOF: REPORT SENT 2026-09-04 recorded in STATE.md; the report went to the calling overseer for relay to Nick in the three-block form.
14. Postmortem written into this file — 100% (commit 21e48de38)
DEFINITION OF DONE: POSTMORTEM section exists; registry appended only if a new pattern earned it
PROOF: `command grep -c "POSTMORTEM" PLAN.md` run from this plan's own folder → ≥ 2; the section is at the end of this file; one registry candidate recorded for a maintainer rather than forced in.
## POSTMORTEM — written 2026-09-04 at the close of the drive (STEP 14)
**What the purge measured wrong at planning time.**
1. *The switch-off mechanism.* The plan said "add a `disabled:` line to each job file"; the daemon never reads one — it schedules from a hard-coded table inside `runner.mjs`. The proof as written would have passed while changing nothing. Caught by opening the daemon before executing (§N: execution finds the ground different).
2. *Where dependencies hide.* Three kept surfaces read files this plan moved, and none of them was in the inventory: a nightly guard that runs the memory-store delivery tests from inside their folder; a nightly parity test and a proof script that read two retired lane plans by path; a fleet-roster name map feeding a generated page. All three surfaced only because the citation sweep was rebuilt from git's own rename list and run after the moves. The lesson is mechanical: derive the pointer list from what git actually renamed, never from lane names.
3. *The sweep itself.* The first version matched lane names as prefixes, searched the archive it had just created, and took an hour per run — a check that can never go green measures nothing. The second version needed three more corrections (an old path that is the tail of its own archive path is a correct repoint; BSD grep with 300 fixed patterns never finishes; a test fixture whose text is an old path is data). A proof must be seen red AND green on the real tree before it is trusted; "seen red" alone is not enough.
4. *A front door that was already broken.* Both memory engines were failing before this drive began — a shared code file had become a symlink the day before and stopped finding its credentials file. The plan's worst-outcome check (revert the move if a front door degrades) would have blamed the move. Measuring the cause first-hand, not the coincidence, is what kept the archive in place — and the root fix was one additive change in the shared code.
**Dispositions that changed mid-drive, and why.** The Kanban plan family stays in place (the plan gate and two nightly tests read it). `openbrain-delivery/tests/` stays live (a nightly guard runs it). The client folders were fenced out entirely on Nick's word, wider than the one name he gave. The retired SP-14 grader's nightly test was archived beside its subject — a test whose subject is gone can only be red.
**Did the archive-the-work / purge-the-pointers split hold?** Yes. Every commit is renames only — zero deletions across the whole drive — and the live tree's exact-path sweep is at zero, while 3,835 mentions remain on purpose inside history, evidence, snapshots and machine state, each class named with its reason. What did NOT get finished is named rather than hidden: the guide-records snapshot families and the closed-drive evidence folders under the ZION programme (both have live owners beside them), and a docs-level pass over the specs at the root of projects/ops.
**Registry candidate (one, codifiable):** *A proof script that searches for the names of things it just moved will find them in the archive it created; derive the search list from the rename record and exclude the destination, or the proof can never go green and the drive stalls on its own evidence.* Recorded here rather than forced into the registry — a maintainer should confirm it is not already covered by the "check never seen red" entry (STEP 14's own rule: append only a genuinely new pattern).
2026-09-18 — 1 file(s) archived (PLAN-CHANGES.md) → archive folder 2026-09-18-retirement
# STATE — Retire and archive everything outside the two goals · created 2026-09-04 ## HUMAN CHECKLIST **Done:** - Setting up the archive and its plain-English retirement note (STEP 1 — checked by a separate session, PASS) - Searching two different ways for everything each retired project still touches, before anything moved (STEP 2) - Recording every project's decision in the ZION programme index, plus the two hand-over notes — board discipline now belongs to the Hub work, the scheduled-jobs fleet now belongs to the Skippy runtime work (STEP 3 — re-checked PASS after the two notes were posted) - Moving the nine retired ZION lanes into the archive, intact — 58 files, nothing deleted, the live lanes untouched (STEP 4) - Parking the family app, retiring Skippy School's lane, archiving the wider-Alexa ambition, two hand-over notes to the Skippy programme (STEP 5 — PASS) - Putting Gracie and Neeko's development papers away so they can be picked back up later; Chantelle's live reminders untouched (STEP 7 — PASS) - Archiving the memory-store delivery papers and the weekly-report tracking folder, and proving the live memory system still answers afterwards (STEP 8 — PASS; its small tests folder was moved back because a nightly check runs it) - Closing the board cards that still showed retired work as live — six closed with the reason on each card, three annotated and left for their owners (STEP 9) - Re-pointing every live mention of a moved file to its archive home — 97 swaps in 59 files; the sweep that proves it is green (STEP 10) - After-counts, with every remaining mention classified (STEP 11) - The ecosystem-wide file audit, wave 1: byte snapshots, four stale copies of the business app, the rejected preview, backup and quarantine folders and loose leftovers archived intact — 556 renames, nothing deleted; the "what actually needs to stay" list written into the plan (STEP 11b — residue named for its owners) **Done with one half still waiting on a machine:** - Switching off the five scheduled jobs belonging to retired work, reversibly (STEP 6 — the switch is in; "it really stopped firing" cannot be seen until the Mac mini that runs the jobs pulls the change — silent since 13:00 UTC) - A cold check: a fresh session tried to get lost and found two live signposts (the shopping skill, the Skippy School handoff) — both marked retired, re-walked PASS (STEP 12) - The plain-English report (STEP 13) and the write-up (STEP 14) **In progress:** - Nothing — the drive is closed; STEP 11c (the conflict purge, Nick's second hand-off) was executed 2026-09-04 and is recorded in the plan **Pending:** - A cold reader's grade of the STEP 11c keep-list; the Hub lane's own fold of its seven lane plans into one (flagged, theirs to do). - Nothing else in this drive. The named residue (guide-records snapshots, the ZION closed-drive evidence folders, a docs-level pass over projects/ops root specs) belongs to its owners and is on the plan's NEXT list. **Finish line:** a future agent opening this workspace finds only Skippy, the voice app and the business Hub live — everything else archived intact, marked, and findable, with no live signpost left to wander into. Nothing deleted. ## Current state (rewritten in place — this section only, never appended) **DRIVE CLOSED 2026-09-04 ~21:20Z. REPORT SENT 2026-09-04 (to the calling overseer for relay to Nick).** Lane resumed ~19:25Z by a second overseer; STEPS 1–14 proven; three independent checks (STEP 3, STEP 8, STEPS 9–11b) and a cold walk with a re-walk on its two findings. Every one of this drive's commits shows renames only — zero deletions across all of them (c2be4be03 … 58fe488c8). The archive holds about 7,000 files under their original paths with a plain-English note on how to bring anything back. **Three real dependencies the two-way checks caught, each fixed at the root rather than worked around:** (1) both memory front doors were erroring — not because of this drive (a shared code file became a symlink on 2026-09-03 and stopped finding its credentials file); fixed in the shared code, reviewed by a separate session, pushed. (2) A nightly check runs the memory-store delivery tests from inside their folder — that small tests folder was moved back to its live path (8/8 green). (3) A nightly parity test and a proof script read two retired lane plans by path — repointed to the archive; the org chart regenerated by its own generator. **Honoured from a peer session:** Nick's mid-drive word "all the captus stuff needs to stay active and untouched" — every client folder is fenced out (commit 0c74f1bbc); checked again after the file audit: nothing under any client folder moved. **Loop log (STEP 0):** - 19:30Z · NORTH STAR: yes — resumed on STEP 8's probes and STEP 3's handoffs. FAN-OUT: 1 of cap 4 (9–10 sessions live → 40/10 = 4). CHEAP: checks on Sonnet as the plan names; no build work dispatched — every edit here was an exact path swap or a rename. BLOCKED: nothing. - 19:50Z · STEPS 3 and 8 closed on independent checks; sweep rebuilt so it can actually go green. FAN-OUT: 0–1. BLOCKED: nothing. - 20:20Z · STEP 9 board done; wave 1 of the file audit landed (543 renames); sweep red → 0 after two repoint waves. FAN-OUT: 0. BLOCKED: nothing — STEP 6's fire-half is the jobs machine's. - 20:45Z · after-counts written; plan, note and change record brought current; cold walk dispatched (1 of cap 4). The plan is `PLAN.md` beside this file, and the inventory it rests on is inside it as §1c with the file-audit table in §1c-audit — one governing file, per the house rule. ## The scope, settled Nick asked for everything outside Skippy, the voice app and the Hub to be purged and archived. Those two words pull opposite ways, and the measurement settled it: the word "gracie" alone appears in roughly 42,968 places across 6,280 files, so purging every mention would destroy the record. **The resolution is archive the work, purge only the live pointers** — which is also what the standing rules require, since deleting is one of the four things only Nick may authorise. **There is not a single delete anywhere in the plan.** Verified 2026-09-04: no removal commands at all; work moves by a command that preserves full history, and every switch-off is reversible. ## Inventory outcome (detail in the plan's §1c) 30 items measured. Nine lanes retired and archived, three folded into work that continues, the security pass deferred behind Nick's approval click, Skippy School retired, the family app parked rather than retired, Gracie and Neeko archived resumable. Kept: the Hub lanes, the approval system now serving as the security gate, team commit access, the one-cloud-copy work, Google sign-in, and all the Skippy channels. ## Live things the retirement is fenced away from — confirmed still depended upon | Thing | Why it must not move | |---|---| | The routing tools every dispatch uses | Only the *lane* retires; the tools stay in service | | The memory store behind the personal and business assistants | Live behind both front doors; probed after the doc move, reverted on any degradation | | Chantelle's live reminder jobs | Never touched — explicitly out of scope | | The kids' deployed site | Keeps serving them even though its lane retires | | The board-enforcement lane's files | The Hub plan writes into them — see finding 2 above | ## Who is driving this - **Overseer session:** the retirement Fable overseer thread (topology in the plan's §5). - **Lanes re-read this file:** at the start of every step. - **Unowned-blocker owner:** the overseer. ## Questions (open → answered, in place) - Two judgment calls ride the plan's confirmation sheet for a one-word overrule rather than blocking: the kids' site staying deployed, and whether Nick's 2026-09-04 order supersedes an earlier ruling that purging belonged to a different agent. ## Contract-change log - 2026-09-04 — inventory gained the Hub plan as a KEEP row; board-enforcement files removed from every move step for the duration of the Hub drive. Per the cross-plan cold review.