AGENTS: Agent Team - The seven approved rules landed

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 PLAN.proposed.txt

# PLAN — AGENTS — the team of agents, named, merged, and behaving by the rules Nick approved (2026-09-09 shape)

Owner: the Group E overseer. Rewritten in full on 2026-09-09 into the plan skill's 2026-09-09 shape. The 2026-09-08 plan this replaces (19 steps) closed eight with a named fresh checker and landed three more without a close; those sit under Already true. Nick's rulings of 2026-09-09 are folded in: the six specialists are confirmed, provided the mergers absorb the redundant agents — "the point was to absorb some redundant agents etc so if that is already factored into the plan then confirm". This plan is written so it can be handed to a fresh overseer and driven without Nick.

**🔴🔴 THIS IS THE ONLY PLANNING DOCUMENT FOR THIS LANE. Do not create a second plan, tracker, summary, or scratch state file — extend THIS file or its PROGRESS.txt companion. Any status view is GENERATED from this plan; if a view disagrees with the plan, the plan wins.**

**NORTH STAR:** the agents Nick actually has are the agents on the team page — real names, one authorised roster, the redundant ones absorbed into the four mergers he approved — and every one of them behaves by the seven rule changes he approved, provably.

**FINISH LINE:** each item passes its one check — (a) the roster lists every owned agent with a real sign-off, the six specialists confirmed by Nick on 2026-09-09, and the team page reads from it with no unsigned row; (b) the four mergers are applied with the capability pre-check, the redundant agents absorbed, and the duplicate detector reads zero; (c) the one assistant's three faces are proven by using each face once, with the independent re-check that was never done; (d) the seven rule changes are landed and read back — four already, three on the Workshop lane's one keystroke — and the honesty checks refreshed after them; (e) a progress note never lands on the wrong card; (f) the postmortem is written. Written once, never raised mid-drive.

**Owner:** the Group E overseer · **Overseer:** ONE — Opus or Codex; never builds · **Design authority:** none — the team page keeps its locked look from the 2026-09-08 fidelity instrument
**Rule: a step starts the moment its named inputs exist, whatever its number. A step closes on ONE independent check by a different model. Nothing waits on Nick to test.**

### 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 making the team page true or the agents behave by the approved rules? If not, drop it and take the highest-value unblocked step that does.
2. **FAN-OUT** — is every step whose START WHEN inputs exist running, up to the cap of 8? Steps 1, 2, 3, 4 and 5 all start now.
3. **CHEAP** — is every build and every check on a cheap model by name? Agent definitions and rosters hold nothing on the floor; a router refusal is logged as a failure and the job goes to the named backup vendor.
4. **BLOCKED** — is anything "waiting"? Re-read its START WHEN line; a decision in §7 has a default, so nothing waits on Nick.

## Already true (facts, not story)

- Larry is settled and called; the team-page fidelity instrument exists; Larry and Skippy are shown by name; an unauthorised dispatch is refused; models are attributed after the fact; every non-parked agent was actually called once; the six marketing workers are dormant under the unbuilt manager; the four merge options are on one page — evidence: the lane's PROGRESS record on the programme branch (lines 397, 398, 756, 804, 1035, 1198, 1329, 1399), coming onto main with the Workshop lane's STEP 1
- Landed, not closed: the one assistant's three faces (own proof 9 of 9, last independent verdict a FAIL on a gap since filled); the three plain-English manuals (7 of 7 on structure only); three of four mergers declared, the fourth held — evidence: the same record, lines 1419–1453
- Four of the seven approved rule changes are landed; the other three sit in governed documents behind the documentation gate — evidence: the same record, line 822
- The roster entries for the six specialists are written; the page is not published because the six had no sign-off — evidence: the same record, lines 1068–1074
- The wrong-card fault in the progress-note poster is diagnosed, not fixed: one test asserts the checkout path contains a space, two fixtures point at the other checkout, one genuine over-match on a single allowed space — evidence: the same record, lines 1109–1113
- Nick's rulings on file, never asked again: the six specialists (checker, retrieval worker, exerciser, adversary, mechanical worker, cheap-lane relay) are confirmed, provided the mergers absorb the redundant agents (2026-09-09); the four mergers are answered (2026-09-08); the seven rule changes are approved (2026-09-08); the marketing manager is not built and its six workers stay dormant (2026-09-08)
- 2026-09-10 — his rulings from this lane's NOTES-FROM-NICK.txt, moved here and that file deleted (git holds every byte): every roster change republishes the Hub team page and the Agent Builder list in the same step (his words, 2026-09-08); the seven staged rule changes, the four merges in the attacker's order, and the six built-in helpers are all approved ("3 yes 4yes 5 yes", 2026-09-08); the lead may be Opus, with Fable reserved for Sienna's two gradings.

## 0 · Gate Zero receipts (the plan may not exist without these)
- Failure Mode Registry loaded: 2026-09-09, 229 rows; the six this lane is exposed to are in §4
- Canonical specs loaded: the plan skill (2026-09-09 shape), the agent builder `projects/ops/agents/build_agents.py`, the roster publisher `projects/ops/agents/publish_agent_list.py`, the description and instruction checks in `projects/ops/life-os/audits/A6/`
- Ownership check: this file supersedes the 2026-09-08 plan in the same folder in place; the roster, the builder, the publisher and the duplicate detector exist and are EXTENDED, never copied; the lane's current record lives on the programme branch until the Workshop lane's STEP 1 lands it
- Expected inputs confirmed to exist: `projects/ops/agents/build_agents.py`, `projects/ops/agents/publish_agent_list.py`, `projects/ops/life-os/audits/A6/duplicate_rule_detector.py`, `projects/ops/life-os/audits/A6/verify_agent_descriptions.py`, `projects/ops/life-os/audits/A6/verify_instruction_checks.py`, `projects/ops/skippy-jobs/_test-agent-builder.mjs` (all on disk)
- PLAN AUTHOR: the Fable session of 2026-09-09 that wrote the programme plan
- COLD READER: none — SINGLE-AUTHOR, UNREVIEWED — a cold read is dispatched before the drive starts and its findings applied in place
- PROMPT-SPEC scan (P1–P7): P7 fired on "if that is already factored into the plan then confirm" — read as: the six specialists are confirmed on the condition that STEP 2 applies the mergers that absorb the redundant agents; the confirmation is recorded with that condition; P3 on "flawlessly" (the board) — that is Group H's plan, not this one

## 1 · Goal and definition of done
- **What we're building, one paragraph.** One true team: a roster every agent is on with a real sign-off, the team page reading from it, the four mergers applied so redundant agents are absorbed, the one assistant's three faces proven by use, the seven approved rule changes landed and the honesty checks refreshed, and progress notes that land on their own card.
- **HOW IT'S USED:** Nick opens the team page and sees who works for him by real name; every dispatch is checked against the roster; the assistant answers as Skippy, Neeko or Gracie depending on who is asking. · HOW WE KNOW: his 2026-09-08 answers and his 2026-09-09 confirmation.
- **WHAT IT LOOKS LIKE:** the team page as measured by the 2026-09-08 fidelity instrument, unchanged in look; the roster as a list. · HOW WE KNOW: the fidelity instrument's locked target from the previous plan's STEP 2.
- **WHERE IT LIVES:** the agent definitions and the roster in the ops agents folder; the team page in the Hub; the rule changes in the governed documents. · HOW WE KNOW: §0's paths.
- **WHAT IT MUST DO:** (1) publish the roster with every sign-off real; (2) apply the four mergers with the capability pre-check and read the duplicate detector at zero; (3) prove the three faces by use with an independent re-check; (4) land the seven rule changes and refresh the honesty checks; (5) fix the progress-note poster so a note lands only on its own card; (6) close.
- **NOT in scope:** the ANTI-SCOPE — (a) the marketing manager and its six workers: not built, dormant (Nick, 2026-09-08); (b) security or privacy work — the half-finished approvals' security fix is one line in `projects/ops/sp-sec/PLAN.md` (Nick, 2026-09-09); (c) the weekly team-health number inside Larry's review: the SCHEDULED lane, once the review runs on the Mac mini; (d) the AI build board's cleanup and the every-turn update rule: Group H's plan; (e) the skills' full-text delivery: the SKILLS lane.
- **Trip-over protocol:** a lane that finds something outside the fence writes one handover line to its named owner (a security- or privacy-shaped thing: one line in `projects/ops/sp-sec/PLAN.md`), then back to building — 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** | the team page in the Hub, opened by Nick and Chantelle, reading from the one roster | a separate roster page; a document | V1 | the previous plan's STEP 2 instrument and Nick's programme §3d | he cannot see who works for him | Nick, 2026-09-09, §3d: "The team page shows real names and the roster is complete" |
| 2 | Whether the six specialists are authorised | confirmed, on the condition that the four mergers absorb the redundant agents (STEP 2); the roster records the confirmation with its date and condition | marking them not-in-service (would refuse checkers every lane depends on) | V1 | his words of 2026-09-09 | every lane's checker is refused, or a false sign-off is published | Nick, 2026-09-09, "the point was to absorb some redundant agents etc so if that is already factored into the plan than confirm" |
| 3 | How a merger is applied | the capability pre-check first (the merged agent can do everything the absorbed ones did), then the absorbed agents retired in place, never deleted | deleting the absorbed agents; merging without the pre-check | V1 | his 2026-09-08 answers to the four merge options | a capability is lost silently | Nick, 2026-09-08, the four merge answers recorded in the lane's PROGRESS record line 980 |
| 4 | Where the three remaining rule changes land | through the documentation gate on the Workshop lane's one keystroke; staged and read back as staged until then | writing around the gate | V1 | the gate refuses agents by design | a governed document is edited without his hand | Nick, 2026-09-08, "yes" to all seven changes; the landing waits on his one keystroke (the Workshop plan's §7 item 1, 2026-09-09; default: staged) |

- V1 confirmation reads `<name>, <date>, "<their own words>"` — the date is required.

**Considered and ruled NOT critical:**
- `which cheap vendor builds which step` — the model matrix decides it; a wrong pick costs one failover.
- `the order of the four mergers` — the pre-check gates each; any order.

## 1b · Subproject decomposition — could a piece of this ship on its own?

| Subproject | End goal (one sentence — what's TRUE when done) | Depends on (named artefact) | Owner | Own PLAN.md path | Confirmation-sheet status |
|---|---|---|---|---|---|
| Roster and team page | every owned agent on the roster with a real sign-off; the page reads from it | none — start now | this lane | this file, STEP 1 | §1a signed |
| Mergers | four mergers applied with the pre-check; duplicates zero | none — start now | this lane | this file, STEP 2 | §1a signed |
| Three faces | each face proven by use, independently re-checked | none — start now | this lane | this file, STEP 3 | §1a signed |
| Rules landed | seven rule changes landed; honesty checks refreshed | the Workshop lane's keystroke for three | this lane | this file, STEP 4 | §1a signed |
| Polish | the wrong-card fix, the close | STEP 1 to STEP 4 for the close | this lane | this file, STEP 5 and STEP 6 | §1a signed |

**Carve-out rule:** the weekly team-health number is carved out to the SCHEDULED lane; the board cleanup to Group H; the approvals' security fix to the security queue as one line.

## 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 team page in the Hub | populated · an agent missing · an unsigned row | open it | every owned agent by real name, each with a real dated sign-off; no unsigned row; the look matches the locked target | Hub → team page |
| U2 | A dispatch of an agent not on the roster | refused · allowed | dispatch | refused, naming the roster | dispatch → refusal |
| U3 | A request that one of the absorbed agents used to handle | handled by the merged agent · dropped | dispatch | handled, with the capability the pre-check recorded | dispatch → merged agent |
| U4 | The assistant asked as Nick, as a team member, as Chantelle's household | Skippy · Neeko · Gracie | ask each face once | the right face answers with the right context and never another's material unasked | ask → face → answer |
| U5 | A governed document after the keystroke | landed and identical · staged | read it back | the seven changes read back byte-identical to the approved text | keystroke → document |
| U6 | A progress note posted by a lane | on its own card · on another card | post | its own card only; an unregistered plan is refused | post → card |

## 2d · DESIGN FIDELITY GATE (plan skill §D — mandatory when the deliverable is looked at)

- **LOCKED TARGET:** the team page's target and anchor map from the 2026-09-08 plan's STEP 2 (the team-page fidelity instrument, closed with a named checker) · Nick's approving words, 2026-09-09: "The team page shows real names and the roster is complete" · revision: the 2026-09-08 lock, unchanged
- **TARGET HASH:** as recorded in the lane's evidence folder by the 2026-09-08 instrument · **ANCHOR MAP:** the same instrument's map, unchanged
- **FIDELITY CHECK:** `<the team-page fidelity instrument from the 2026-09-08 plan's STEP 2, on main after the Workshop lane's STEP 1>`; selftest → `0 · 0`, sabotage → red
- **VIEWPORTS AND THEMES:** the same list the locked target draws
- **RULE:** STEP 1 closes only at `mismatched properties: 0 · unmeasured anchors: 0` at every viewport × theme, reproduced once by the step's checker; no restyle is made here.

## 3 · Lanes and frozen contracts

| Lane | Scope (in / out) | Owner | Definition of done | Builder (cheap, named) | Backup builder | Checker (different model) | Backup checker |
|---|---|---|---|---|---|---|---|
| Roster and team page | the roster, its sign-offs, the publisher, the page's data / out: the page's look | this lane | U1 and U2 pass | GLM 5.3 (zai) | Qwen | DeepSeek | Sonnet |
| Mergers | the four mergers, the pre-check, the retirements in place / out: the marketing manager | this lane | U3 passes; duplicates zero | GLM 5.3 (zai) | DeepSeek | Qwen | Sonnet |
| Three faces | the face router and its proof by use / out: the brains' answer content (BRAINS lane) | this lane | U4 passes with an independent re-check | Qwen | GLM 5.3 (zai) | DeepSeek | Sonnet |
| Rules and honesty | the four landed changes' read-back, the three staged, the honesty checks / out: writing a governed document without the ticket | this lane | U5 passes | DeepSeek | Qwen | GLM 5.3 (zai) | Sonnet |
| Polish | the wrong-card fix, the close / out: anything new | this lane | STEP 5 and STEP 6 closed | Qwen | DeepSeek | GLM 5.3 (zai) | Sonnet |

**Contracts between lanes (FROZEN at plan time — change = dated PLAN-CHANGES.md delta):** one roster, one builder, one publisher; the team page reads the roster and nothing else · an absorbed agent is retired in place, never deleted, and its capability is recorded on the merged agent before retirement · a governed document is written only through its gate on Nick's ticket · the honesty checks are refreshed after the rule changes land, never before · the progress-note poster is shared with every lane and is changed only here, with the Hub lane's guard untouched.

**Data floor, binding:** agent definitions, rosters, manuals and rule text hold nothing on the floor; every step builds and checks cheap; a router refusal is logged as a failure.

## 3b · Execution map — FRONT first, POLISH last, one row per step

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) — FRONT rows are what Nick sees or uses; POLISH rows run after the FRONT rows close, or the moment one bites:**

| Stage | # | TIER | Task (step name) | FOR NICK | Needs (named artefact, or `none — start now`) | EXECUTOR (cheap model) | EXECUTOR BACKUP | CHECKER (different model) | CHECKER BACKUP | DONE-PROOF (runnable command) |
|---|---|---|---|---|---|---|---|---|---|---|
| Roster | 1 | FRONT | The roster published with every sign-off real: the six specialists recorded as confirmed by Nick on 2026-09-09 with his condition, the seven missing entries written, the team page reading from the roster with no unsigned row and its look at zero against the locked target | the team page shows everyone who works for you, by real name, and nothing on it is a claim you never made | none — start now | GLM 5.3 (zai) | Qwen | DeepSeek | Sonnet | `python3 projects/ops/agents/publish_agent_list.py` then `python3 projects/ops/life-os/audits/A6/verify_agent_descriptions.py` prints pass with `unsigned rows: 0`, and the team-page fidelity instrument prints `mismatched properties: 0 · unmeasured anchors: 0` |
| Mergers | 2 | FRONT | The four mergers applied: the capability pre-check per merger, the three declared ones landed, the held fourth resolved by its pre-check, the absorbed agents retired in place, the duplicate detector at zero | the redundant agents are gone from your team and nothing they did is lost | none — start now | GLM 5.3 (zai) | DeepSeek | Qwen | Sonnet | `python3 projects/ops/life-os/audits/A6/duplicate_rule_detector.py` prints `duplicates: 0` and `python3 projects/ops/agents/build_agents.py` builds the merged set with every pre-check recorded |
| Three faces | 3 | FRONT | One assistant, three faces proven by use: asked once as Nick, once as a team member, once as Chantelle's household, the right face answers each time; the independent re-check that was never done, done once | Skippy, Neeko and Gracie each answer the right person with the right context | none — start now | Qwen | GLM 5.3 (zai) | DeepSeek | Sonnet | `<the three-faces check from the 2026-09-08 plan's STEP 7, on main after the Workshop lane's STEP 1>` prints `9 of 9` and the checker's own run prints the same |
| Rules | 4 | FRONT | The seven rule changes landed and read back: the four landed ones read back byte-identical, the three governed ones staged in the Workshop lane's landing manifest and read back as staged until the keystroke, then landed; the honesty checks refreshed after | agents behave by the seven rules you approved, and you can see they do | none — start now; the last three land on the Workshop lane's keystroke (its §7 item 1, default: staged) | DeepSeek | Qwen | GLM 5.3 (zai) | Sonnet | `python3 projects/ops/life-os/audits/A6/verify_instruction_checks.py` prints pass for all seven, four landed and three staged, then seven landed after the keystroke |
| Polish | 5 | POLISH | A progress note lands only on its own card: the test that asserts the checkout path contains a space rewritten to be path-independent, the two fixtures repointed, the single-space over-match fixed; the Hub lane's guard untouched | nothing you notice; a lane's update never appears on another lane's card | none — start now | Qwen | DeepSeek | GLM 5.3 (zai) | Sonnet | `node projects/ops/skippy-jobs/_test-status-regen-sp6.mjs` and `node projects/ops/skippy-jobs/_test-dispatch-compliance-log.mjs` pass from a checkout whose path has no space and from one whose path has a space |
| Polish | 6 | POLISH | Close-out: the FINISH LINE checked item by item, the postmortem written, the on-disk step record on main brought current, the weekly team-health number handed to the SCHEDULED lane with one dated line | you get one line saying the agents lane is done | STEP 1 to STEP 5 closed | Qwen | DeepSeek | GLM 5.3 (zai) | Sonnet | `python3 projects/ops/agents/check_plan.py --progress projects/ops/life-os/REGROUP-2026-09-08/plans/AGENTS/PLAN.proposed.txt` prints every §3b row VERIFIED |

### §3c · CUT OR HANDED OFF — in the 2026-09-08 plan, not this lane's to finish; recorded once with its owner
- The weekly team-health number inside Larry's review (old STEP 15) — the SCHEDULED lane; the review is disabled in the scheduler along with the job runner and comes back on the Mac mini.
- The security fix on the half-finished approvals (old STEP 16) — one line in the security queue; nobody chases security (Nick, 2026-09-09).
- The three plain-English manuals' truth check (old STEP 8's cold read) — folded into STEP 3's proof by use: a face that answers right proves its manual.
- The marketing manager and its six workers — not built, dormant (Nick, 2026-09-08).
- The AI build board's cleanup and the every-turn update rule — Group H's plan (Nick, 2026-09-09).

**Then one block per step, in this exact shape:**

### STEP 1 — The roster published with every sign-off real
**FOR NICK:** the team page shows everyone who works for you, by real name, and nothing on it is a claim you never made. · **Tier:** FRONT
**Start when:** none — start now.
**Builder:** GLM 5.3 (zai) · **Builder backup:** Qwen · **Checker:** DeepSeek, a different session · **Checker backup:** Sonnet
**Files you may touch:** the roster and the agent definitions in `projects/ops/agents/`, `projects/ops/agents/publish_agent_list.py`, the team page's data source. **Never** the team page's look; never an agent's tools or permissions.

**Do exactly this:**
1. Record on the six specialists' roster rows: confirmed by Nick, 2026-09-09, on the condition that the mergers absorb the redundant agents (STEP 2).
2. Write the seven missing roster entries from their agent definitions; run the description check.
3. Publish the roster; read the team page back; run the fidelity instrument.

**DEFINITION OF DONE:** every owned agent is on the roster with a real dated sign-off, the page reads from it with no unsigned row, and the look measures zero.
**PROOF:** `python3 projects/ops/agents/publish_agent_list.py` then `python3 projects/ops/life-os/audits/A6/verify_agent_descriptions.py` → pass, `unsigned rows: 0`; the team-page fidelity instrument → `mismatched properties: 0 · unmeasured anchors: 0` · **FAILS IF:** a row claims a sign-off Nick did not give, an owned agent is missing, or the look moved

**If the check fails:** the builder fixes and re-checks the named failure until it passes. If this step cannot close from this machine: one line to the overseer naming the ONE missing thing, then the next step whose inputs exist.
**Checker's job:** re-run the PROOF yourself, once. PASS closes the step. Do not accept the builder's pasted output; do not summon anyone else.
**Handoff (if any):** none.

### STEP 2 — The four mergers applied
**FOR NICK:** the redundant agents are gone from your team and nothing they did is lost. · **Tier:** FRONT
**Start when:** none — start now.
**Builder:** GLM 5.3 (zai) · **Builder backup:** DeepSeek · **Checker:** Qwen, a different session · **Checker backup:** Sonnet
**Files you may touch:** the four merged agents' definitions, the absorbed agents' definitions (retired in place), `projects/ops/agents/build_agents.py`, the capability pre-check record beside this plan. **Never** a delete; never the marketing workers; never the dispatch gate's rules.

**Do exactly this:**
1. For each merger, run the capability pre-check: list every capability of the absorbed agents and confirm the merged agent carries each; record the list.
2. Land the three declared mergers; resolve the held fourth by its pre-check result (land, or record the one missing capability and hold with that reason).
3. Retire the absorbed agents in place; rebuild; run the duplicate detector.

**DEFINITION OF DONE:** the duplicate detector reads zero, every merger has a recorded pre-check, and the absorbed agents are retired in place.
**PROOF:** `python3 projects/ops/life-os/audits/A6/duplicate_rule_detector.py` → `duplicates: 0`, and `python3 projects/ops/agents/build_agents.py` → the merged set with every pre-check recorded · **FAILS IF:** a capability is lost, an absorbed agent is deleted, or a duplicate remains

**If the check fails:** the builder fixes and re-checks the named failure until it passes. If this step cannot close from this machine: one line to the overseer naming the ONE missing thing, then the next step whose inputs exist.
**Checker's job:** re-run the PROOF yourself, once. PASS closes the step. Do not accept the builder's pasted output; do not summon anyone else.
**Handoff (if any):** the moment this step closes, post one dated line into `projects/ops/life-os/REGROUP-2026-09-08/plans/SKILLS/PLAN.proposed.txt`: `AGENTS STEP 2 closed <date> — the merged agent set is final; your recipes' agent names read from it.`

### STEP 3 — One assistant, three faces, proven by use
**FOR NICK:** Skippy, Neeko and Gracie each answer the right person with the right context. · **Tier:** FRONT
**Start when:** none — start now.
**Builder:** Qwen · **Builder backup:** GLM 5.3 (zai) · **Checker:** DeepSeek, a different session · **Checker backup:** Sonnet
**Files you may touch:** the face router and its check from the 2026-09-08 plan's STEP 7. **Never** the brains' answer content (BRAINS lane); never a household member's material pushed to another.

**Do exactly this:**
1. Ask the assistant once as Nick, once as a team member, once as Chantelle's household; record which face answered and with what context.
2. Run the three-faces check; the checker runs it again in its own session — the independent re-check the previous plan never got.

**DEFINITION OF DONE:** nine of nine on the check, reproduced by the checker, and each face answered the right person in the live asks.
**PROOF:** `<the three-faces check from the 2026-09-08 plan's STEP 7, on main after the Workshop lane's STEP 1>` → `9 of 9`, twice · **FAILS IF:** a face answers with another's material, or the checker's run differs from the builder's

**If the check fails:** the builder fixes and re-checks the named failure until it passes. If this step cannot close from this machine: one line to the overseer naming the ONE missing thing, then the next step whose inputs exist.
**Checker's job:** re-run the PROOF yourself, once. PASS closes the step. Do not accept the builder's pasted output; do not summon anyone else.
**Handoff (if any):** none.

### STEP 4 — The seven rule changes landed and read back
**FOR NICK:** agents behave by the seven rules you approved, and you can see they do. · **Tier:** FRONT
**Start when:** none — start now; the last three land on the Workshop lane's keystroke (its §7 item 1, default: staged).
**Builder:** DeepSeek · **Builder backup:** Qwen · **Checker:** GLM 5.3 (zai), a different session · **Checker backup:** Sonnet
**Files you may touch:** the Workshop lane's landing manifest (the three governed changes staged there), the honesty checks in `projects/ops/life-os/audits/A6/`. **Never** a governed document directly.

**Do exactly this:**
1. Read the four landed changes back against their approved text; stage the three governed ones in the landing manifest with their approved text.
2. After the keystroke, read all seven back; refresh the honesty checks against the landed text.

**DEFINITION OF DONE:** the instruction check passes for all seven — four landed and three staged, then seven landed — and the honesty checks are refreshed after.
**PROOF:** `python3 projects/ops/life-os/audits/A6/verify_instruction_checks.py` → pass for all seven · **FAILS IF:** a landed change differs from its approved text, a governed document was written around the gate, or the honesty checks were refreshed before the landing

**If the check fails:** the builder fixes and re-checks the named failure until it passes. If this step cannot close from this machine: one line to the overseer naming the ONE missing thing, then the next step whose inputs exist.
**Checker's job:** re-run the PROOF yourself, once. PASS closes the step. Do not accept the builder's pasted output; do not summon anyone else.
**Handoff (if any):** the moment this step closes, post one dated line into `projects/ops/life-os/REGROUP-2026-09-08/plans/LANE-1-WORKSHOP/PLAN.proposed.txt`: `AGENTS STEP 4 — the three governed rule changes are in your landing manifest with their approved text.`

### STEP 5 — A progress note lands only on its own card
**FOR NICK:** nothing you notice; a lane's update never appears on another lane's card. · **Tier:** POLISH
**Start when:** none — start now.
**Builder:** Qwen · **Builder backup:** DeepSeek · **Checker:** GLM 5.3 (zai), a different session · **Checker backup:** Sonnet
**Files you may touch:** the progress-note poster's tests and fixtures (`projects/ops/skippy-jobs/_test-status-regen-sp6.mjs`, `projects/ops/skippy-jobs/_test-dispatch-compliance-log.mjs`) and the one over-match in the poster. **Never** the Hub lane's registration guard.

**Do exactly this:**
1. Rewrite the test that asserts the checkout path contains a space so it passes from any path; repoint the two fixtures; fix the single-space over-match so a path with one allowed space is one path.
2. Run both tests from a checkout whose path has no space and from one whose path has a space.

**DEFINITION OF DONE:** both tests pass from both kinds of path, and a note posts to its own card only.
**PROOF:** `node projects/ops/skippy-jobs/_test-status-regen-sp6.mjs` and `node projects/ops/skippy-jobs/_test-dispatch-compliance-log.mjs` → pass from both paths · **FAILS IF:** a test depends on the path's shape, or a note reaches another card

**If the check fails:** the builder fixes and re-checks the named failure until it passes. If this step cannot close from this machine: one line to the overseer naming the ONE missing thing, then the next step whose inputs exist.
**Checker's job:** re-run the PROOF yourself, once. PASS closes the step. Do not accept the builder's pasted output; do not summon anyone else.
**Handoff (if any):** none.

### STEP 6 — Close-out
**FOR NICK:** you get one line saying the agents lane is done. · **Tier:** POLISH
**Start when:** STEP 1 to STEP 5 closed.
**Builder:** Qwen · **Builder backup:** DeepSeek · **Checker:** GLM 5.3 (zai), a different session · **Checker backup:** Sonnet
**Files you may touch:** this file's POSTMORTEM and STEPS sections, `projects/ops/life-os/REGROUP-2026-09-08/plans/AGENTS/PROGRESS.txt` and STEPS.json on main, one dated line in `projects/ops/life-os/REGROUP-2026-09-08/plans/SCHEDULED/PLAN.proposed.txt`. **Never** a product file.

**Do exactly this:**
1. Check the FINISH LINE item by item; write the postmortem; bring the step record current; post the team-health handoff line to the SCHEDULED lane; declare leftovers.

**DEFINITION OF DONE:** the FINISH LINE's six items each point at a closed step, the postmortem is written, the handoff line is posted.
**PROOF:** `python3 projects/ops/agents/check_plan.py --progress projects/ops/life-os/REGROUP-2026-09-08/plans/AGENTS/PLAN.proposed.txt` → every §3b row VERIFIED · **FAILS IF:** any FINISH LINE item has no closed step behind it

**If the check fails:** the builder fixes and re-checks the named failure until it passes. If this step cannot close from this machine: one line to the overseer naming the ONE missing thing, then the next step whose inputs exist.
**Checker's job:** re-run the PROOF yourself, once. PASS closes the step. Do not accept the builder's pasted output; do not summon anyone else.
**Handoff (if any):** the moment this step closes, post one dated line into `projects/ops/life-os/PLAN-LIFE-OS-2026-09-09.md`: `AGENTS lane closed <date> — every §3d Agents item true.`

**Step-writing rules:** every step names the literal command and the literal expected output — "verify it works" is a defect · as many steps as the North Star needs, no more · red-first for any fix step · builds and per-step checks on the cheap tier by name; the overseer never builds; the plan is never written cheap.

## 4 · Regret Check (the registry failures this build is actually exposed to)

| Failure mode (registry entry) | The measure in THIS plan that prevents it | Where it lives (section / artifact / gate) |
|---|---|---|
| A page published a sign-off Nick never gave | every roster row carries a real dated sign-off or is not published; the six specialists carry his 2026-09-09 confirmation with its condition | §1a row 2; STEP 1 |
| A merger dropped a capability the absorbed agent had | the capability pre-check per merger, recorded before retirement; absorbed agents retired in place, never deleted | §1a row 3; STEP 2 |
| A step was written CLOSED and its proof changed afterwards, unreviewed | one independent checker re-runs the same proof once; a changed proof reopens the step | §3b Checker's job |
| A build's last independent verdict was a FAIL on a gap since filled, and it was reported as checked | STEP 3's proof is run by the checker in its own session; nothing counts checked on the builder's word | STEP 3 |
| A governed document was edited around its gate, or the change rotted waiting for it | the three governed changes are staged with their approved text for the Workshop lane's one keystroke and read back as staged | §1a row 4; STEP 4 |
| A test asserted the checkout path's shape, so it passed on one machine and failed on the other | STEP 5 makes the tests path-independent and runs them from both kinds of path | STEP 5 |

## 5 · Topology and roles
- **OVERSEER-AUTHORITY:** none named in `projects/ops/OVERSEER-AUTHORITY.md` for this lane; the Group E overseer's word binds it. **The four approval classes (money leaving · credential rotation · irreversible destruction · a message sent as Nick) and the floor (logins · credentials, tokens and keys · government IDs · card, bank and routing numbers) never move on the overseer's word.** Retiring an agent in place is not destruction; a governed document is written only on Nick's ticket.
- Thread layout: one Group E overseer thread shared with the SKILLS lane; builders and checkers as cheap dispatches from it.
- Overseer: Opus or Codex · Workers: GLM 5.3 (zai), Qwen, DeepSeek by step; Sonnet only as a backup checker · Cap: 8 per session, ~40 machine-wide
- State files location: `projects/ops/life-os/REGROUP-2026-09-08/plans/AGENTS/PROGRESS.txt` (dated lines; current copy on the programme branch until the Workshop lane's STEP 1 lands it), `projects/ops/life-os/REGROUP-2026-09-08/plans/AGENTS/STEPS.json`
- **Board card id:** none yet — the lane posts to its existing card through the guarded updater; the slug is written here by the overseer at pickup
- **Artefact consumers:** STEPS.json → the Hub progress screen; the roster → the team page and the dispatch gate; the handoff lines → the SKILLS, WORKSHOP and SCHEDULED plan files; §7 → Nick, once.
- **Write-contention (parallel lanes in a shared checkout):** this lane writes the agents folder and its own plan folder; the Workshop lane alone lands governed documents; scoped commits with pathspecs, never a bare commit.

**Per-stage topology — counts DECLARED at plan time (machine-gated: a number in every row):**

| Stage | Overseer | Sub-overseers | Workers |
|---|---|---|---|
| Roster | 1 | 0 | 2 |
| Mergers | 1 | 0 | 2 |
| Three faces | 1 | 0 | 2 |
| Rules | 1 | 0 | 1 |
| Polish | 1 | 0 | 1 |

**The walk-away contract — a stranger resumes the drive from files alone:**
- **STATE FILE:** `projects/ops/life-os/REGROUP-2026-09-08/plans/AGENTS/PROGRESS.txt`
- **HEARTBEAT ROW:** `agents-lane-2026-09-09` in `projects/personal/skippy-app/ala-state/work-threads.json`
- **MORNING-REPORT LINE:** "Agents — FRONT <n> of 4 · polish <m> of 2" in `projects/ops/walkaway/REPORT.md`

## 6 · Evals — what "working" means, decided now

| Capability | Check (exact command or procedure) | Pass looks like |
|---|---|---|
| the roster is complete and every sign-off real | `python3 projects/ops/life-os/audits/A6/verify_agent_descriptions.py` | pass; unsigned rows: 0 |
| the mergers absorbed the redundant agents | `python3 projects/ops/life-os/audits/A6/duplicate_rule_detector.py` | duplicates: 0 |
| the three faces answer the right person | `<the three-faces check from the 2026-09-08 plan's STEP 7, on main after the Workshop lane's STEP 1>` | 9 of 9, twice |
| the seven rule changes are landed | `python3 projects/ops/life-os/audits/A6/verify_instruction_checks.py` | pass for all seven |
| a progress note lands on its own card | `node projects/ops/skippy-jobs/_test-status-regen-sp6.mjs` | pass from both kinds of path |

## 7 · THE ONE DECISION LIST FOR NICK — everything genuinely his, asked once

Each item names the default that applies if he says nothing, so no lane waits.

1. **The one keystroke on the documentation-gate ticket** that lets the three remaining rule changes be written into the governed documents. ANSWERED — Nick took the documentation gate down himself on 2026-09-09 20:22Z for 24 hours (it restores itself at 2026-09-10 20:22Z). That IS the keystroke: land the three governed rule changes and the three pointer repairs inside that window, read each back byte-identical, and record the landing. If the window closes first, they stay staged (the default). STEP 4's landing runs now.

Not asked, because you already answered: the six specialists are confirmed on the condition that the mergers absorb the redundant agents (2026-09-09); the four mergers (2026-09-08); the seven rule changes (2026-09-08); the marketing manager stays unbuilt (2026-09-08).

## If you get stuck (all steps)

Before writing "blocked": (1) re-read the step's START WHEN line — most "stuck" is a misread gate, (2) try a concrete workaround, (3) write one line to the overseer naming the ONE missing artefact. Then keep working every other step whose inputs exist. Never idle on a blocker; never end a turn waiting on a background result.

## Your loop

Every pass: every FRONT step whose START WHEN inputs exist and which is not yet CLOSED is running, up to the cap → each builder runs its own PROOF, hands to its checker → PASS closes it, FAIL loops it → when the FRONT steps are closed, the POLISH steps run the same way → repeat until the FINISH LINE is proven.

## SUMMARY — a few plain-English lines, read by the status generator

Eight of the old plan's nineteen steps are closed and three more are built but unchecked. What is left: publish the roster with every sign-off real now that Nick has confirmed the six specialists, apply the four mergers so the redundant agents are absorbed, prove the assistant's three faces by using them, land the seven rule changes (three on one keystroke), and fix the progress-note poster. Four visible steps first, two polish steps after, cheap models building and checking, one keystroke with a default.

## SUMMARY

**2026-09-10** — On 2026-09-10 the rewrite of Nick's twenty agent instruction files (the files that tell his AI helpers how to work, rewritten on 2026-09-09 to be clean, clear, concise and not constricting) was checked by a fresh reviewer that had no part in the work, and the check passed. The reviewer re-ran every check the rewrite was required to satisfy and each came back green, and it confirmed that the seven files belonging to the marketing helpers were not changed. It also compared one file against its version before the rewrite and found one rule that had been narrowed by mistake (the requirement that everything one helper writes for Nick be in plain English had been limited to a single field of its report); that rule was restored in full within the same minute and the checks re-run green. The step is done. Nothing is asked of Nick.

**2026-09-09** — On 2026-09-09 one more small change landed on the Skippy assistant's instruction file (the file that tells Nick's chief-of-staff agent how to behave), at the request of the team working on that assistant: the name of the tappable-buttons block (the short block of text at the end of a message that the phone app turns into buttons Nick can tap) is now mentioned exactly twice in the file, which is the count that team's own check requires, and the file's header lines are byte-for-byte what they were before the rewrite. The change is saved into the shared code repository (the version history every machine pulls from). The twenty rewritten agent instruction files from earlier today are unchanged otherwise. Nothing is asked of Nick.

**2026-09-09** — On 2026-09-09 the twenty instruction files that tell Nick's AI agents (his engineering, design, checking, assistant and upkeep helpers) how to work were rewritten to be clean, clear, concise and not constricting, then saved into the shared code repository (the version history every machine pulls from). The thirty lines that every file used to repeat now sit once in one shared rules page (a single document all the agents point at for how to report evidence and what data may never leave), and each agent file carries a four-line pointer to it instead. Eleven agents that cannot run commands are no longer told to run command-line checks. The senior engineer agent (Boris, the helper that writes build plans and reviews code) had a line saying it may not write files, which contradicted the permission Nick granted it on 2026-08-30; that line is corrected. The one-change worker (the helper that makes a single decided code change) no longer promises an automatic undo that Boris forbids. Boris's file now lists its seven helper agents. Total text fell from 33,965 to 26,796 words; the cuts fell on repeated ceremony and old correction history, never on a rule or a dated quote. Nothing is asked of Nick.

**2026-09-09** — On 2026-09-09 the twenty instruction files that tell Nick's AI agents (his engineering, design, checking, assistant and upkeep helpers) how to work were rewritten to be clean, clear, concise and not constricting, then saved into the shared code repository (the version history every machine pulls from). The thirty lines that every file used to repeat now sit once in one shared rules page (a single document all the agents point at for how to report evidence and what data may never leave), and each agent file carries a four-line pointer to it instead. Eleven agents that cannot run commands are no longer told to run command-line checks. The senior engineer agent (Boris, the helper that writes build plans and reviews code) had a line saying it may not write files, which contradicted the permission Nick granted it on 2026-08-30; that line is corrected. The one-change worker (the helper that makes a single decided code change) no longer promises an automatic undo that Boris forbids. Boris's file now lists its seven helper agents. Total text fell from 33,965 to 26,796 words; the cuts fell on repeated ceremony and old correction history, never on a rule or a dated quote. Nothing is asked of Nick.

## STEPS

1. The roster published with every sign-off real — 60%
   DEFINITION OF DONE: every owned agent on the roster with a real dated sign-off; the page reads from it with no unsigned row; the look at zero
   PROOF: `python3 projects/ops/life-os/audits/A6/verify_agent_descriptions.py`
2. The four mergers applied — 70%
   DEFINITION OF DONE: duplicates zero; every merger has a recorded pre-check; absorbed agents retired in place
   PROOF: `python3 projects/ops/life-os/audits/A6/duplicate_rule_detector.py`
3. One assistant, three faces, proven by use — 80%
   DEFINITION OF DONE: nine of nine, reproduced by the checker; each face answered the right person
   PROOF: `<the three-faces check from the 2026-09-08 plan's STEP 7, on main after the Workshop lane's STEP 1>`
4. The seven rule changes landed and read back — 55%
   DEFINITION OF DONE: the instruction check passes for all seven; honesty checks refreshed after
   PROOF: `python3 projects/ops/life-os/audits/A6/verify_instruction_checks.py`
5. A progress note lands only on its own card — 30%
   DEFINITION OF DONE: both tests pass from both kinds of path; a note posts to its own card only
   PROOF: `node projects/ops/skippy-jobs/_test-status-regen-sp6.mjs`
6. Close-out — 0%
   DEFINITION OF DONE: the FINISH LINE's six items each point at a closed step; the postmortem written; the handoff line posted
   PROOF: `python3 projects/ops/agents/check_plan.py --progress projects/ops/life-os/REGROUP-2026-09-08/plans/AGENTS/PLAN.proposed.txt`
7. The agents are on every machine and every account without being asked for — 95%
   DEFINITION OF DONE: auto-pull runs the installer after every successful pull; --check exits 1 when an agent is missing and 0 when all are present, both measured directly
   PROOF: `node ZION/lib/install-agents-everywhere.mjs --check`
8. The agent files are clear and actionable without being constricting — 100%
   DEFINITION OF DONE: every agent file graded against a written bar, with the count of prohibitions and the count of actionable capabilities recorded per file, and no file failing the bar
   PROOF: `node projects/ops/skippy-jobs/_test-agent-rules-present.mjs` and `python3 projects/ops/life-os/audits/A6/duplicate_rule_detector.py`
   VERIFIED: Run on 2026-09-09 by the session that did the rewrite, after git commit 5913eafe2b: all six commands in the PROOF line green; the Agent Directory page rebuilt with python3 projects/ops/artifacts/agent-org-chart/build_org_chart.py. Not yet re-run by a different model, which is what closes a step.
   VERIFIED: Run on 2026-09-09 by the session that did the rewrite, after git commit 5913eafe2b: all six commands in the PROOF line green; the Agent Directory page rebuilt with python3 projects/ops/artifacts/agent-org-chart/build_org_chart.py. Not yet re-run by a different model, which is what closes a step.
   VERIFIED: Run on 2026-09-09 by the session that did the rewrite, after git commits 5913eafe2b and 410fefb42f: all commands in the PROOF line green; the Agent Directory page rebuilt with python3 projects/ops/artifacts/agent-org-chart/build_org_chart.py. Not yet re-run by a different model, which is what closes a step.
   VERIFIED: 2026-09-10T14:40Z VERIFIED by a fresh verifier on Sonnet (different session, cold): all eight briefed checks re-run from the repo root and green, the marketing files unchanged across the rewrite commits; its own ninth criterion found one regression (the plain-English rule in verifier.md narrowed to one field), restored the same minute and the rules guard re-run green; verdict file evidence/step8-independent-check-2026-09-10.json

## NEXT

Everything found after the FINISH LINE passes goes here as one line, and is not worked. Empty at plan time.

## POSTMORTEM

Written by STEP 6. Empty at plan time; the lane is not closed until it is filled.

2026-09-09 — from the WORKSHOP lane: the four agent merges and the two stale scores are yours. Also measured 2026-09-09, and it blocks your STEP 4: your proof, python3 projects/ops/life-os/audits/A6/verify_instruction_checks.py, is STALE and cannot pass. Nick's own simplification of the regroup skill that morning (commit 93085cdcf5, 293 deletions) removed eight of the 24 duty phrases that verifier asserts must exist, including the first one it checks — it dies on AssertionError: FALSIFY THE INSTRUMENT. The new skill says so plainly: 'There is no triad, no cold refuter, no falsify-the-instrument pass.' The verifier must be updated to match the simplified skill before the seven rule changes can ever read as landed. Separately: the three governed rule changes were never staged anywhere the Workshop lane could reach, and the handoff line promising them in a landing manifest was never posted — that manifest does not exist.

2026-09-09 — from the WORKSHOP lane, CORRECTING our own earlier line to you: the A6 verifier is NO LONGER BROKEN. Earlier tonight we told you `python3 projects/ops/life-os/audits/A6/verify_instruction_checks.py` was stale and could not pass, because Nick's morning simplification of the regroup skill had removed eight of the 24 duty phrases it asserts. That was true when measured. It has since been fixed by someone — re-run first-hand at 2026-09-09 23:0xZ it prints {"result": "PASS", ...} and exits 0, with all 24 duty controls present. So your STEP 4's proof is usable again and is NOT blocked by us. The rest of that handoff stands: the approvals package lives at projects/ops/life-os/APPROVALS/A6/ (now on main), and of the seven changes two are landed byte-identical while five are held because their destination files were rewritten wholesale on 2026-09-09 — two by Nick himself — so applying them would reverse newer decisions rather than honour older ones. They need re-cutting against today's text before they can land.

Current state PROGRESS.txt

PROGRESS 2026-09-08T15:15Z — AGENTS lane plan drafting: read in order the lane split, the progress-screen standard, the overseer contract, this lane's regroup record and plain summary, the superseded plan with its findings, scorecard and staged amendments, Nick's rulings of 12:25 EST verbatim, the recipe-versus-specialist boundary, and the plan doctrine with a currently-passing plan as a model.
PROGRESS 2026-09-08T15:15Z — Measured live before drafting, not taken from the brief: 27 specialist files present with 27 published links; the sweeper absent from this session's own list of callable specialists while the other 26 are present; its four-line description confirmed as the cause by comparison against the 26 that register. Dispatch record re-measured: 1,221 of 3,635 records (33.6%) name something outside the 27, of which 1,148 name a harness built-in helper and 73 resolve to no definition at all. Nine of the 27 have never been dispatched. Every proof command named in the draft was confirmed present on disk before it was written down.
PROGRESS 2026-09-08T15:15Z — Draft written: 17 steps plus the loop; all twelve steps of the superseded plan carried explicitly with the mapping in NOTES.txt and in every STEPS.json row; the Regret Check covering all 189 registry entries; one rendered surface gated. Checker run on a byte-identical temporary copy: PASS, exit 0, with one accepted note (two registry entries quoted verbatim contain minute figures). STEPS.json, CHECK.txt and NOTES.txt written beside the draft.
DONE: steps 17, checker PASS
PROGRESS 2026-09-08T15:16Z — Committed fdd69924e and pushed to life-os/programme.
PROGRESS 2026-09-08T16:20Z — Cold-read revision started. Read the cold read in full (18 blocking, 9 minor), the plan, STEPS.json, EXECUTOR-ROSTER.txt, the lane's notes (A6/NOTES-FROM-NICK.md), HANDOFF sections dated 2026-09-08, and the plan doctrine's §P, §A, §D, §AUTH, §G.
PROGRESS 2026-09-08T16:20Z — Re-measured first-hand rather than trusting the plan or the cold read: larry IS present in this session's own list of callable specialists (2026-09-08, session started after the morning measurement) while ZION/agents/larry.md still carries the four-line description — finding 1 confirmed, STEP 1's premise does not reproduce. The rendered directory's node data shows benito as "Benito" (fixed and live today) and larry, skippy and 22 others as their own slug — finding 2 confirmed, the two faults are attached to the wrong agents. publish_agent_list.py:86 derives every label from the slug, so a blank is structurally impossible — finding 3 confirmed. The standing-auth audit returns "agent-runs-its-own-tests" (Nick, 2026-09-04), which covers STEP 15's tap — finding 13 confirmed. The stray copy STEP 14 never named is ZION/agents/larry.md.proposed, tracked in git at commit cca792efb and already deleted in the working tree — finding 15 resolved with a name.
PROGRESS 2026-09-08T16:40Z — All 18 blocking findings and all 9 minor ones applied in place. Two splits the fixes required: STEP 2 became STEP 2 (build and sabotage-test the team page's fidelity instrument, led by Sienna) plus STEP 2b (make the name change and publish through the four-part gate), and STEP 12 became STEP 12 (write the page Nick answers from, entered now) plus STEP 12b (apply his answer). 19 open steps, none removed. FOR NICK rewritten to 17 non-empty lines naming all seven rule changes, all four merges with what each could lose, and the six everyday helpers as a third decision that gates nothing. STEP 15's tap removed on the standing grant. Every proof that could not fail replaced by an artefact the step actually produces, with 19 named evidence paths listed in section 3.
PROGRESS 2026-09-08T16:40Z — Checker re-run on a byte-identical /tmp .md copy: PASS, exit 0, and `--failures` returns nothing — no failures, no dead proofs, no weakly-matched Regret Check rows, and no NOTE of any kind this pass. render_sheet.py and the standing-auth audit both run and recorded in section 0. STEPS.json rewritten to 19 rows with "STEP n" ids, every percent 0, and exactly three rows needing Nick. CHECK.txt carries the full revision record, finding by finding; NOTES.txt takes the banned "already true" paragraph verbatim plus the two routing calls handed up to Fable.
PROGRESS 2026-09-08T16:45Z — Committed f82bcc1c4 (AGENTS folder only, five files) and pushed to origin life-os/programme; the commit is reachable on origin, confirmed against a fresh fetch.
DONE

================ EXECUTION BEGINS — lane lead, Opus 5, 2026-09-08 evening ================

PROGRESS 2026-09-08T20:00Z — Execution opened. Read the plan, STEPS.json and NOTES-FROM-NICK.txt first. Nick's late-evening answers ("3 yes 4yes 5 yes") are ON RECORD and change the entry conditions the hand-off brief carried: the seven rule changes are TAPPED (STEP 10 unblocked), all four merges are approved in the attacker's order (STEP 12b unblocked), and the six built-in helpers are ruled on (authorise the security reviewer and the guide; our own specialists take over the other four). The brief said to treat these as pending; the record says otherwise, so the record wins. No approval has been assumed — the tap is his, dated, and in git.

PROGRESS 2026-09-08T20:00Z — STEP 1, the open question SETTLED BY MEASUREMENT rather than asserted. Ran the strict frontmatter parse over all 27 specialist files: 4 fail (cheap-router-proxy missing a model key, and larry, dom-seo-specialist and senior-engineer on a YAML scanner error). ALL FOUR ARE CALLABLE IN THIS SESSION. A parse the harness does not perform cannot be what made larry absent. Recorded as NOT REPRODUCED, not as solved, and no cause is asserted because none is measured. Only larry's failure is a hand-edit; the other three are unrelated (a stray colon, a legitimately absent key).

PROGRESS 2026-09-08T20:00Z — STEP 1, the real defect located at its source and it is a DIFFERENT defect from the absence. The two platform-routing lines in larry's header reach no caller: measured against this session's own registered description, which carries the surrounding text but not those two lines. Root cause is a hand-edit of a generated file — the generator emits single-line JSON scalars and cannot produce a continuation line, every roster source field for larry is single-line, and the routing text appears in no roster field and no template. Worse: on this branch the routing lines are ALREADY GONE, silently deleted by a routine regeneration. Fix therefore has to put that content where the generator preserves it, or it is lost for good.

PROGRESS 2026-09-08T20:00Z — STEP 1, BOTH SPECIALISTS PROVEN BY REAL CALL, replies kept in evidence/step1-larry-two-readings.txt. Benito ran 61s/9 tool uses and returned a substantive answer, honoured its propose-only fence, and volunteered its own evidence limit unprompted. Larry ran 123s/18 tool uses and returned two genuine contradictions plus the four near-misses he ruled OUT with the reconciling line in each — proving him ON the very file whose header this step repairs.

PROGRESS 2026-09-08T20:00Z — Two findings carried forward rather than dropped. (a) Benito: NO roster agent is set to Fable at all, including the creative director, which sits against this plan naming Sienna as Fable — handed to STEP 3 as a roster-row question, not actioned in STEP 1's fence. (b) Larry: the gatherer file forbids a second retrieval agent while se-code-reader and dom-channel-reader both carry that same role — the first of those IS merge three, reached independently and without sight of the merge page, which is external corroboration of a merge Nick approved; the second is a THIRD file the four merges do not cover, recorded as a named gap.

PROGRESS 2026-09-08T20:00Z — STEP 1 proof written and RED-RUN FIRST, before any change: prove-step1.sh has six gates, one of which is the fix and five of which are MUST-NOT-CHANGE (roster still valid JSON with 20 agents; larry still in service, still sonnet, still the same four tools; the routing text present; exactly one line of the roster moved; the other 26 agent files byte-identical). Red run fails on the routing gate exactly as it must. The build is dispatched to the cheap lane with that proof attached.

PROGRESS 2026-09-08T20:00Z — STEP 12 page WRITTEN at evidence/step12-merge-options-one-page.md, from the attacked package rather than from the brief: all four merges with what each saves and what could be lost, the two rejected mappings and the one deferred one carried so nobody re-proposes them, the five acceptance tests, and the attacker's own limit on what "yes" buys (design and proof only; no retirement without runtime proofs and a named human decision). Two honest limits stated on the page: the harness's callable count is still unmeasured, and the plan says "six specialist files" where it is actually eight — the larger number is used. Checker dispatched to re-derive every claim from all eight files.

PROGRESS 2026-09-08T20:00Z — ROUTING EVENTS, recorded not hidden. (1) Fable is OUT OF CREDITS tonight; the first Sienna dispatch died on it. Nick's standing rule is that Opus takes over in-thread, so the anchor map is being written by Sienna on Opus — but the TWO LOOK-VERDICTS on the team page remain OWED TO FABLE and are not being self-graded, per the hand-off's explicit instruction. (2) The dispatch gate REFUSED a model override on se-code-reader, correctly — the agent's own declared tier is the considered judgement and a call-site override is not. Re-dispatched on its declared model. The gate refusing an over-spend is the gate working, and it is noted here as evidence for STEP 4 that the dispatch gate already enforces something real.

PROGRESS 2026-09-08T20:00Z — Measured for STEP 2b: the team page's name mapping carries only three rows (senior-engineer=Boris, creative-director=Sienna, benito=Benito). larry and skippy have NO row, which is exactly why they render under their lowercase slug. Target SHA-256 of the published page captured machine-written at 1f1920cda43eca387728069f11dcdec89aa55ef84300945025d493b9a4282b29 before anything was touched.

============= LEAD RELAUNCHED — second lead, Opus 5, 2026-09-08 late evening =============

PROGRESS 2026-09-08T21:45Z — Opened by reading, in the order the continuation brief names: the
hand-off prompt, the previous lead's PROGRESS, NOTES-FROM-NICK, the plan's STEP 0 loop, the design
fidelity gate section, STEPS 1-6 in full, and Sienna's signed anchor map end to end. `git pull
--rebase origin life-os/programme` REFUSED — unstaged files belonging to other lanes across the
shared tree. Working on what is on disk, as the brief instructs, and saying so here rather than
forcing anything. The five-minute loop is armed as an in-session check, no timer installed.

PROGRESS 2026-09-08T21:45Z — Board card opened for this lane. The tool the brief names,
board-cards.mjs, is NOT in this worktree; it lives in the launch folder, and this lane's card is the
A6 row. Posted through it, not through the unified updater, per decision nine.

PROGRESS 2026-09-08T21:45Z — THE GATE DEADLOCK IS WRITTEN UP, AND THE PREVIOUS LEAD'S ACCOUNT OF IT
IS CORRECTED BY MEASUREMENT. It is NOT two gates contradicting each other. Both refusals were
reproduced live tonight and they are BYTE-IDENTICAL: one gate, the WORK-TYPE gate, firing twice on
the same classification. What trips it is named in its own evidence block — the words "document"
and "design" in the brief, which put it in the UNCLEAR bucket, the one bucket with no override of
any kind. Its refusal then prescribes a command, and `cheap-router-proxy`, the one role in the fleet
built to run that command and holding no write tool at all, is refused by the same gate. Three doors
counted and all three shut; the only way through is a caller who already holds a shell.
Written with both instructions and the full verbatim refusal to GATE-CONTRADICTION-2026-09-08.txt.
NOT fixed from here — the dispatch gates belong to the workshop lane. Nothing waited on it.

PROGRESS 2026-09-08T21:45Z — STEP 2, the instrument. The build spec was written as the seed a
builder works from (FIDELITY-BUILD-SPEC.txt beside the map): four files, the probe's twelve compared
properties named one by one, the three modes, and the rule that makes a false green structurally
hard — THE DENOMINATOR IS SIENNA'S. The check reads the anchor ids out of her signed map itself and
refuses to run at all if the executable table's id set differs in either direction, or if the row
count is not the 80 her section 3 declares. A builder cannot quietly drop an anchor to reach a zero.
The map's own dead-selector list is refused by name at startup for the same reason.

PROGRESS 2026-09-08T21:45Z — The 80 anchor ids were extracted from the signed map MACHINE-WRITTEN,
never transcribed: 80 total, and the per-group split lands exactly on Sienna's own declared split —
1 ground, 11 masthead, 5 controls, 7 section-01, 28 rows, 4 section-02, 10 section-03, 10 detail,
4 wires. Her count and the extraction agree without either being told the other's answer.

PROGRESS 2026-09-08T21:45Z — The executable table BUILT BY THE CHEAP LANE in three parts, on GLM via
cheap-task.mjs, each with its own runnable proof: 24 rows, 28 rows, 28 rows, every part passing its
schema check first time. Then the part that matters — a SECOND checker, run in a real browser
against the rendered page, that asks whether each selector addresses anything real. It found three
defects the schema check could never see:
  · G1 carried "document.body" — a JavaScript expression copied out of the map's prose, not a CSS
    selector. It matched NOTHING, and would have reported a pass forever. Corrected to `body`.
  · M10 matches zero elements and SHOULD: the map records the notice as absent because the source
    list read clean. Marked expect_zero, so it now passes at zero and FAILS if it ever appears —
    the opposite way round from every other row, which is what "correctly absent is a state that
    can break" actually requires.
  · D6, D7 and D8 all landed on the same three elements, because the selector alone cannot tell
    them apart. THREE ANCHORS MEASURING ONE THING MEANS TWO CLAIMS WERE NOT MEASURED. Each now
    carries the h5 heading the map uses to distinguish it, and each resolves to exactly one.
ALL 80 NOW RESOLVE against the rendered page: 79 present, 1 correctly absent, 0 invalid, 0 matching
nothing unexpectedly.

PROGRESS 2026-09-08T21:45Z — ROUTING EVENTS, recorded not hidden. (1) The routing gate refused a
hand-typed edit to a checker file and sent it to the cheap lane. Correct, and complied with — not
routed around. (2) route-build.mjs refused twice in a row on "files changed that were not the
target", naming files belonging to the FILES lane and a skippy-jobs state file: concurrent lanes are
writing this shared tree while a proof runs, so its whole-tree guard cannot get a clean window.
Third approach worked — cheap-task.mjs fenced with --dir to this one folder, whose guard is scoped
to the fence rather than the tree. Recorded because any lane doing single-file edits tonight will
hit the same thing. (3) A route-build refusal on a deletion-blind proof was correct and the proof
was strengthened rather than the guard loosened; a second refusal on "the edit destroyed 24 of 26
lines" was ALSO correct — the instruction had asked for a field on every row, which is a change to
every line. The instruction was wrong, not the guard, and it was narrowed to the two lines that
genuinely needed to change.

============ LEAD RELAUNCHED — third lead, Opus 5, 2026-09-08 night ============

PROGRESS 2026-09-08T22:30Z — Opened by reading, in the brief's own order: the hand-off prompt, the
previous two leads' PROGRESS in full, NOTES-FROM-NICK (all seven rule changes YES, all four merges
YES in the attacker's order, helpers ruled), then the plan's STEPS.json and the signed anchor map's
sections 0, 1, 2, 3, 8, 13, 14. `git pull --rebase origin life-os/programme` REFUSED again —
unstaged files across the shared tree belonging to other lanes. Working on what is on disk and
saying so, as the brief instructs. Scoped commits only from here (`git commit -- <paths>`), never a
bare commit, after the previous lead swept eight of another lane's files into one.

PROGRESS 2026-09-08T22:30Z — ROUTING RULING RECORDED BEFORE ANY DISPATCH: Fable is out of credits
on this account. Nick's standing rule of 2026-09-05 is that Opus takes over in-thread. So the two
look gradings the previous lead recorded as OWED are NOT parked — they are done by the creative
director on Opus and recorded as "Sienna on Opus, Fable at limit". No Fable dispatch tonight.

PROGRESS 2026-09-08T22:30Z — STEP 2 entry state MEASURED, not taken from the previous lead's note.
On disk: the signed map, the build spec, and the anchor table in three parts. NOT on disk: the
check itself, the executable table as one file, and the approved-exceptions file. So the three
things the hand-off named as owed are confirmed owed by measurement.

PROGRESS 2026-09-08T22:30Z — THE DENOMINATOR RE-DERIVED INDEPENDENTLY OF THE PREVIOUS LEAD, from
the signed map's own text: 80 anchor ids, per group 1 ground - 11 masthead - 5 controls - 7
section-01 - 28 rows - 4 section-02 - 10 section-03 - 10 detail - 4 wires, exactly Sienna's
declared split, plus 6 named unmeasurable that are not anchors. The three-part table's 80 ids
match that set in BOTH directions with no duplicates. Two independent extractions agree without
either being told the other's answer.

PROGRESS 2026-09-08T23:10Z — STEP 2, THE INSTRUMENT IS BEING BUILT BY THE CHEAP LANE AS THE PLAN
NAMES, in small proven pieces, each with a proof the lane lead wrote and the builder never holds.
Landed and green so far: the check's startup half (all seven startup refusals fire, name what is
wrong, and stand down when the table is honest), the browser probe module, and the comparison
module. The executable table is now one file of 80 rows countersigned against the signed map, and
the approved-exceptions file exists empty and prints on every run.

PROGRESS 2026-09-08T23:10Z — THE SABOTAGE PROPERTY IS ALREADY PROVEN AT THE COMPARISON LAYER,
deterministically and without a browser: all twelve compared properties were each changed in turn
and each was reported red. A property that cannot go red is not measured, and that is where a false
green would hide. The end-to-end sabotage mode still gets built and run; this is the same claim
proven a second, independent way.

PROGRESS 2026-09-08T23:10Z — FOUR MACHINERY TRAPS HIT AND SOLVED, recorded because any lane will
hit them tonight. (1) A prose --prove is not a command: cheap-task ran my sentence as a shell line,
it failed on "the: command not found", and a PASSING build was reverted. Fixed by making the
must-not-change half runnable — a frozen hash manifest the builder is forbidden to write. (2) The
vendor data wall refused a whole build because the property name "classToken" reads to it as an
assigned credential; renamed to classNames, and the two proof files needed a recorded control-plane
override to change because a builder must never hold its own grade. (3) All three cheap vendors
timed out on a brief big enough to fill their context, and one wrote nothing at all after reading
ten files. (4) A single write of 340 lines came back as unparseable JSON. Both size faults were
solved the same way: split the work into small modules, each with its own runnable proof.

PROGRESS 2026-09-09T21:05Z — NEW OVERSEER PICKUP on the 2026-09-09 six-step plan. Every step's
entry state was RE-MEASURED first-hand by running its own PROOF, not read from this record or from
STEPS.json. Six readings, all machine-written below, none transcribed by hand.

PROGRESS 2026-09-09T21:05Z — STEP 5 MEASURES PASSING ALREADY, against STEPS.json's 30%.
`node projects/ops/skippy-jobs/_test-status-regen-sp6.mjs` → `status-regen-sp6: 12/12 passed`;
`node projects/ops/skippy-jobs/_test-dispatch-compliance-log.mjs` → `99/99 PASS`. Both from the
Documents checkout, whose path contains a space — which is the exact condition the step exists to
survive. The no-space half of the proof and the independent checker's re-run are still owed before
this step is written CLOSED; a step is not closed on the overseer's own run.

PROGRESS 2026-09-09T21:05Z — STEP 2 ENTRY STATE: `duplicate_rule_detector.py` →
`candidate_group_count: 12`, not zero. Ten of the twelve groups are the specialists this lane's
mergers exist to absorb: identical rule blocks shared across ZION/agents/exerciser.md,
gatherer.md, grunt.md, skeptic.md, verifier.md and skippy.md. The detector is reporting exactly
the redundancy the four mergers were approved to remove, which makes it the step's live worklist
rather than an unrelated fault. The other two groups are jasmin-brief/jasmin-strategy (one shared
line) and a self-duplicate inside ZION/skills/spec/SKILL.md.

PROGRESS 2026-09-09T21:05Z — STEP 3 ENTRY STATE: the three-faces check RESOLVES on main, at
`projects/ops/skippy-jobs/_test-three-faces-parity.mjs` — the plan's placeholder pointing at the
2026-09-08 plan's STEP 7 does not need the Workshop landing after all. It runs `29/33`, FOUR
FAILURES, two distinct defects: (a) three tools Gracie holds and Neeko does not are unclassified —
business_answer, business_narrative_answer, personal_narrative_answer; (b) one stale row in the
neeko>gracie ledger — company_records is written down as a difference and is not one any more.

PROGRESS 2026-09-09T21:05Z — STEP 3, A FALSE-GREEN RISK NAMED BEFORE ANY BUILDER IS SENT. Two of
those three unclassified tools are business-reaching and the face that holds them is Chantelle's.
`personal_narrative_answer` is identity-gated at server.js:1402 to Nick's and Chantelle's own
assistants, so Neeko's absence there is a wall and classifying it is honest bookkeeping. The two
business ones are NOT obviously that, and a builder told to "classify three tools" will write a
label, turn the check green, and leave a wall question standing. This step's brief must therefore
ask which of the three is a wall, a route or an open gap and require the answer measured from the
handler, never asserted.

PROGRESS 2026-09-09T21:05Z — STEP 4 ENTRY STATE: `verify_instruction_checks.py` does not report a
verdict at all, it CRASHES — AssertionError on the phrase `FALSIFY THE INSTRUMENT`, which the
honesty check expects to find in ZION/skills/regroup/SKILL.md and which is no longer there; the
file now carries `FALSIFIER` at lines 57 and 62. The check and the skill it grades have drifted
apart. Recorded, not fixed, in this pass: rewording a doctrine skill that every lane reads is
wider than this lane's fence and the honest fix could be in either file.

PROGRESS 2026-09-09T21:05Z — STEP 1 ENTRY STATE: `verify_agent_descriptions.py` → `{"result":
"PASS", "renderers": 6, "generated_rows": 20, ... "legacy_negative_control": "REJECTED"}`. The
look half genuinely cannot run from main: the team-page instrument is
`projects/ops/artifacts/agent-org-chart/orgchart-fidelity-check.mjs`, present on
origin/life-os/programme and absent from main, exactly as the plan predicted. This is the lane's
one real cross-lane wait.

PROGRESS 2026-09-09T21:05Z — THE DOCUMENTATION GATE IS DOWN, BY NICK'S OWN HAND, AND IT IS TIMED.
`md-gov-kill-switch.mjs status` → `{"active": true, "at": "2026-09-09T20:22:09.768Z", "hours": 24,
"note": "take the gate down for now", "by": "nickdeck", "expired": false}`. Read live rather than
taken from the banner in CLAUDE.md, which says the opposite. So the governed half of STEP 4 can
land inside this window instead of waiting on a ticket, and the window closes 2026-09-10T20:22Z.

PROGRESS 2026-09-09T21:40Z — STEP 5's NO-SPACE HALF IS NOW MEASURED, and the first attempt at it
produced a false reading that is recorded here rather than quietly dropped. A `cd` into a worktree
that did not exist yet failed, the shell stayed in the Documents checkout, and the test that ran
next printed `99/99 PASS` from the SPACE path while appearing to answer for the no-space one. The
worktree was then created properly at /tmp/agents-lane-2026-09-09 on branch
life-os/agents-2026-09-09, `pwd` was asserted to contain no space, and both proofs were re-run
there: `status-regen-sp6: 12/12 passed` and `99/99 PASS`. Both kinds of path now measure green,
which is STEP 5's whole definition of done. The independent checker's re-run is dispatched.

PROGRESS 2026-09-09T21:40Z — STEP 1's LOOK HALF IS MEASURED GREEN AND PROVEN FALSIFIABLE, without
waiting for the Workshop lane. The instrument is a self-contained folder, so
`projects/ops/artifacts/agent-org-chart/` was checked out from origin/life-os/programme into the
lane worktree FOR MEASUREMENT ONLY — landing it on main stays the Workshop lane's job and nothing
here commits it. `orgchart-fidelity-check.mjs --selftest` → `mismatched properties: 0 · unmeasured
anchors: 0` at all four viewport-theme pairs (375x812 and 1280x662, light and dark), 80 anchors
probed, 960 properties compared per pair, no approved exceptions, target still at the lock
1f1920cda43e. `--sabotage` → all twelve compared properties RED. A check that cannot go red is not
measuring anything; this one goes red on every property it claims to measure.

PROGRESS 2026-09-09T21:40Z — STEP 1's REAL GAP, NAMED EXACTLY, and it matches the plan's own count
of seven. Set difference between the definition files in ZION/agents/ (27) and the roster's agents
array (20) yields exactly seven slugs on disk and absent from the roster: cheap-router-proxy,
exerciser, gatherer, grunt, skeptic, skippy, verifier. Six of those seven are the six specialists
Nick confirmed on 2026-09-09 — the checker is `verifier`, the retrieval worker is `gatherer`, the
adversary is `skeptic`, the mechanical worker is `grunt`, the cheap-lane relay is
`cheap-router-proxy`, and `exerciser` keeps its own name. The seventh is `skippy` itself, which
his 2026-09-09 words do not cover and which must not borrow their confirmation.

PROGRESS 2026-09-09T21:40Z — A FALSE FINDING OF MY OWN, CAUGHT AND CORRECTED BEFORE IT WAS ACTED
ON. An early parse of roster.json reported "20 rows, unsigned: 20". That was wrong: the file is an
object, not an array, my fallback iterated its top-level keys as though they were agent rows, and
the "unsigned" count was an artefact of asking for field names the schema never had. The roster's
real shape is an object whose `agents` array holds 20 entries, each carrying `in_service` and
`in_service_because`, and `_in_service_rule` states plainly that in_service IS Nick's sign-off and
false means the agent exists but may not be dispatched. Nothing was built on the wrong reading.

PROGRESS 2026-09-09T21:40Z — THE DISPATCH GATE REFUSED THIS LANE'S FIRST STEP 1 BRIEF, AND IT WAS
RIGHT. The brief asked a cheap builder to write the six specialists' confirmation sentence and to
go looking for whether skippy had ever been signed off. The gate matched "SIGN-OFF" as
OVERSIGHT_QA_ONLY and refused, citing Nick 2026-08-17: QA is handled by managers and the overseer.
The NICK-ASKED escape was NOT used, because the refusal is correct rather than a false positive:
deciding a service state is the overseer's call. The brief was split instead — the cheap builder
now does the mechanical transcription of all seven entries with both service fields pinned to a
placeholder it is forbidden to reason about, and the service state is recorded by the overseer
afterwards. A gate that fires correctly is honoured, never argued around.

PROGRESS 2026-09-09T22:20Z — THE CHEAP LANE CANNOT CHECK ANYTHING ON THIS LANE, AND THE REASON IS
STRUCTURAL RATHER THAN A BAD NIGHT. The STEP 5 checker dispatched to zai came back having written
its evidence file and reported, in its own words, "no captured final lines (no shell available to
run node), and verdict FAIL". The cheap vendors read and write files; they do not run commands. So
a cheap model cannot re-run a PROOF, which is the entire job the plan gives a checker. Logged as a
failure per the loop's CHEAP rule, and the work goes to the step's NAMED BACKUP CHECKER, which is
Sonnet — the plan's own prescribed path, not an improvisation.

PROGRESS 2026-09-09T22:20Z — A FALSE GREEN I WROTE MYSELF, CAUGHT ONLY BECAUSE THE VERDICT WAS
READ. That checker's `--prove` was `grep -q PASS <the evidence file>`. The file it produced says
FAIL, and it ALSO contains the word PASS in its criteria text — so the proof passed on a file whose
verdict was FAIL and the run reported "✅ DONE — the proof passed". A proof that matches a word
instead of a verdict is not a proof.

PROGRESS 2026-09-09T22:20Z — STEP 1 BUILT BY THE OVERSEER: six rows, not seven. The six
specialists carry Nick's 2026-09-09 words verbatim WITH his condition.
`verify_agent_descriptions.py` → PASS, 26 generated rows. The change is additive: `git diff --stat`
on the first write read 190 insertions and 1 deletion, that deletion being the array's closing
bracket. Four schema requirements were discovered one refusal at a time and filled from the agents'
own definition files: reports_to, base_role, fence_note, and for a manager row role_line and
description_suffix.

PROGRESS 2026-09-09T22:20Z — 🔴 THE STEP'S OWN "FAILS IF" WAS TRIPPED BY THE FIRST FIX, AND ONLY
OPENING THE RENDERED PAGE CAUGHT IT. A skippy row was written with in_service true, reasoning that
false would start refusing dispatches of Nick's own assistant (an agent with no row is never
refused — agent-in-service.mjs:62). The roster text was honest and said no sign-off was located.
THE PAGE WAS NOT: build_org_chart.py renders in_service:true as the words "Signed off", full stop.
Measured in the live DOM, the skippy box read "ManagerskippySigned off". That is the step's FAILS
IF — "a row claims a sign-off Nick did not give" — committed and pushed at 4ebeb2b432 before it was
seen. No file-level proof would ever have caught it; only rendering the page did.

PROGRESS 2026-09-09T22:20Z — FIXED BY REMOVING THE ROW RATHER THAN BY SETTING IT FALSE. The page
carries three states and the builder documents them (read_signoff, build_org_chart.py:259): signed
off · not signed off · NOT RECORDED for a slug with no row at all, "shown as that rather than
rounded down to a refusal or up to an approval". Removing skippy's row gets the honest third state
AND preserves today's dispatch behaviour exactly. Re-measured in the live DOM after the rebuild:
skippy now reads "Running nowskippySign-off not recordedSkippy — Nick's chief of staff." The
build's own count moved from 21 signed off to 20 — the one that went away is the false claim.

PROGRESS 2026-09-09T22:20Z — THE SIX WERE MEASURED ON THE RENDERED PAGE, NOT ASSUMED FROM THE
MARKUP. Each resolves to exactly one element whose bounding box sits inside a collapsed `div.chain`,
so they are not visible until a manager box is tapped. Checked for a regression and it is not one:
the pre-existing workers se-fixer and se-recorder sit in a collapsed chain by the same measurement,
managers are the visible layer, and all three chains are closed by default. The six are treated
identically to the 21 workers already on the page.

PROGRESS 2026-09-09T22:20Z — THE LOOK DID NOT MOVE, RE-MEASURED AFTER THE PAGE WAS REBUILT rather
than resting on the reading taken before it. `orgchart-fidelity-check.mjs --selftest` against the
rebuilt page → `mismatched properties: 0 · unmeasured anchors: 0` at all four viewport-theme pairs;
`--sabotage` reddens all twelve compared properties.

PROGRESS 2026-09-09T22:20Z — LANDED ON MAIN, AND THE COMMIT THAT CARRIED IT WAS NOT MINE. The
scoped commit reported "no changes added to commit": a concurrent session's auto-sync had already
swept the working tree into 70cf338aa9 and pushed. Verified in HEAD rather than assumed — 26
agents, the six present, no skippy row, and the committed page contains "Sign-off not recorded".
Rule 20 applies and no question goes to Nick: the later commit wins, nothing is lost.

PROGRESS 2026-09-09T22:20Z — STEP 1 IS BUILT AND MEASURED, AND IS NOT CLOSED. A fresh checker that
did none of this work is running against six numbered criteria, including the one that matters most:
whether the twenty pre-existing rows are byte-for-byte what they were at 27536e9f44. The step's
percent is not moved and nothing is written CLOSED until that verdict is in.

PROGRESS 2026-09-09T22:20Z — LEFT ON THE MACHINE, DECLARED PER HOUSEKEEPING RULE 5: one worktree at
/tmp/agents-lane-2026-09-09 on branch life-os/agents-2026-09-09 (a full checkout, ~43,600 files),
holding the team-page instrument fetched from the programme branch for measurement only; one static
file server on port 8812 serving a copy of the page to the browser; one launch.json entry naming it.
All three are released when the lane closes.

PROGRESS 2026-09-09T22:55Z — STEP 1 CLOSED and STEP 5 CLOSED, each on an independent checker that
built none of it. STEP 1's checker graded six criteria and added a seventh of its own; all passed
after the generator defect was fixed. STEP 5's checker ran both proofs from both kinds of path,
twice each — eight runs, all identical — confirming `pwd` before every run because the first
attempt at that measurement produced a false reading.

PROGRESS 2026-09-09T22:55Z — 🔴 THE CHECKER CAUGHT THE OVERSEER WRITING A FALSE CLASSIFICATION, AND
IT IS THE EXACT FAILURE THIS LANE WAS WARNED ABOUT IN ITS OWN EARLIER ENTRY. business_narrative_answer
was recorded as an OPEN GAP on the strength of reading NEEKO_TOOLS_GUIDE and searching for a gate
without finding one. The checker opened the handler instead: skippy-code/server.js:3092 refuses
unless `ctx.identity === 'nick'` AND `ctx.identityStrength === 'token'`, and Neeko's identity is the
literal string 'neeko' (server.js:14706). It is a WALL, and a stricter one than
personal_narrative_answer, which at least admits Chantelle. Corrected in both ledger directions.
The lesson is not "check harder" — it is that an ABSENCE OF EVIDENCE WAS RECORDED AS EVIDENCE OF
ABSENCE, which is the unverified-negative failure, committed by the same session that had written a
warning against it four hours earlier. business_answer stays open-gap: the checker confirmed its
handler really does accept any non-empty identity.

PROGRESS 2026-09-09T22:55Z — STEP 4's HONESTY CHECK NOW RETURNS A VERDICT. It was not failing, it
was CRASHING — an AssertionError on the first of eight phrases that had drifted out of the rewritten
regroup doctrine, which meant it said nothing at all about the other twenty-three controls. Each of
the eight was measured against the current skill: all eight duties survive under new wording, so
nothing was deleted and every replacement was taken from the guard's own duty table rather than
invented. First attempt failed correctly — a phrase chosen by me ('a floor value') was not one the
guard requires, so removing it did not make the guard fail and the red/green preflight caught it.
Second attempt, built cheap on zai through the routing gate: PASS across 24 controls, with the tool
proving sensitivity on a gutted file. The routing gate refused to let this be typed here and was
right to.

PROGRESS 2026-09-09T22:55Z — THE FOUR MERGERS ARE ON FILE AND CARRY A CONSTRAINT THE PLAN'S OWN
SUMMARY DOES NOT REPEAT. Nick, 2026-09-08, in NOTES-FROM-NICK.txt: "All four merges: YES, in the
attacker's order (gate wirer, blind grader, code reader, recorder) ... EVERY NAME STAYS CALLABLE,
NOTHING RETIRES." So STEP 2 is not a deletion exercise and not even a retirement-in-place exercise
in the ordinary sense: the four names must still answer after the merge. The capability pre-check
is dispatched to DeepSeek as a pure extraction — what each of the ten agents claims and forbids, in
its own words, with an overlap table and no recommendation. The merge judgement is not the cheap
lane's to make and the brief says so.

PROGRESS 2026-09-09T22:55Z — 🔴 TWO NEW STEPS ADDED ON NICK'S OWN RESTATEMENT OF THE NORTH STAR,
2026-09-09, BECAUSE NEITHER WAS IN THE PLAN AT ALL. He named as "the number one point of this whole
exercise" that the agents are "universally deployed on every machine, on every account, and that we
never have to ask for them". MEASURED, not assumed: the 27 agent files are tracked in git inside
THIS project, so any machine pulling it gets them — but ~/.claude/agents/ holds exactly ONE file, so
a session opened in any other folder has none of them; and 21 Codex profiles sit in the home folder
of whichever machine last ran the generator with only 1 tracked anywhere shared. That is STEP 7. He
also required the files themselves be "clean and clear and concise and not overly strict or
constricting", warning that blocking a smart model from its own better judgement is itself
detrimental — nothing in the plan assessed the quality of an agent file. That is STEP 8. A plan that
does not carry the owner's own stated number-one point is not a plan of his work.

PROGRESS 2026-09-09T23:20Z — SKIPPY IS SIGNED OFF, AND THE ROW RECORDS THE EXCHANGE RATHER THAN A
CONCLUSION. Nick was asked as a numbered item: "Skippy still has no sign-off from you. Every other
agent has your dated words. Default: the page keeps saying 'not recorded'." His answer in full: "1
yes". The roster row quotes BOTH the question and the answer, because until tonight skippy had no
sign-off anywhere in the repository and this same row was written and then removed within the hour
earlier today for asserting one he had not given. The row also carries frozen_file: skippy's own
definition is 158 lines that exist only on disk and in git, and the write target under
.claude/agents/ is a symlink onto it. Page rebuilt: 21 agents now carry his sign-off.

PROGRESS 2026-09-09T23:20Z — STEP 2's CAPABILITY PRE-CHECK FAILED ON ALL THREE CHEAP VENDORS AND THE
FAULT WAS THE BRIEF, NOT THE VENDORS. One job asked for ten agent files to be read and a single
combined document with an overlap table written. deepseek, then qwen, then zai each returned
TIMEOUT at 120000ms having sent nothing, and the runner reverted cleanly — 0 files created, 0
restored. The exit code was 0 and the target file did not exist, which is exactly the case the
loop's liveness check exists to catch: a job is judged by bytes written, never by how it exited.
Re-sent as four separate jobs, one agent each, each reading ONE file and writing ONE small file.
The identical failure is already on this record from 2026-09-08 ("all three cheap vendors timed out
on a brief big enough to fill their context") and was walked into again.

PROGRESS 2026-09-09T23:20Z — THE FOUR MERGERS' CONSTRAINT, RESTATED BECAUSE IT CHANGES THE WORK:
Nick, 2026-09-08, "every name stays callable, nothing retires". STEP 2 is therefore not a deletion
and not a retirement — the four absorbed names must still answer after the merge. Any design that
removes a name fails his ruling regardless of what the duplicate detector reads.

PROGRESS 2026-09-09T23:20Z — STEP 8 IS BEING WRITTEN ELSEWHERE BY NICK'S OWN CHOICE. He raised its
bar first — "its not just overrestrictive its OPTIMAL" — then took the work: "im wkoni on that
eslwhwere disregard". The handoff brief this lane wrote for it is left on disk at
HANDOFF-WRITE-THE-AGENT-FILES.md beside this record, unworked, so nothing is lost if he wants it.
This lane does not touch the agent files' wording while he holds that work.

PROGRESS 2026-09-09T23:35Z — SPLITTING THE BRIEF WORKED: all four capability extracts written,
4.1KB to 6.5KB each, verbatim quotes with capability and prohibition lists and a line count, exactly
as briefed and with no opinion added. The only difference between this and the run that timed out
three vendors is the size of the ask — one file read instead of ten.

PROGRESS 2026-09-09T23:35Z — 🔴 THE "OVER-RESTRICTIVE FILES" PROBLEM IS NOW MEASURED, NOT ASSERTED,
and it is the SAME DEFECT as STEP 2's duplicates rather than a separate concern. Running the
duplicate detector and counting its repeated blocks against each file's own length:

    exerciser.md          79 lines · 31 shared · 39%
    gatherer.md           77 lines · 30 shared · 39%
    grunt.md              80 lines · 31 shared · 39%
    skeptic.md            87 lines · 30 shared · 34%
    verifier.md          105 lines · 30 shared · 29%
    skippy.md            157 lines ·  4 shared ·  3%

Roughly a third of every specialist file is the SAME thirty lines copied verbatim into all five. The
capability extracts show what those lines are: the preflight instrument block, the six evidence
states, the data-floor block. They are prohibitions and ceremony, not capability. The se-gate-wirer
extract counts SEVEN capabilities against NINE prohibitions in a 49-line file.

So Nick's two concerns are one defect. The duplicated rule blocks STEP 2 exists to absorb ARE the
bulk of what makes these files read as a list of ways to be in trouble, and neither half is fixed by
trimming prose. Note what the table also shows: skippy.md is the LONGEST file at 157 lines and the
LEAST duplicated at 3% — length and restrictiveness are not the same measurement, and cutting by
length would take the wrong lines.

PROGRESS 2026-09-09T23:35Z — THAT MEASUREMENT IS HANDED TO NICK RATHER THAN ACTED ON, because he
took the agent-file rewrite elsewhere after raising its bar to OPTIMAL. The numbers above and the
four extracts beside this record are for whoever writes them. This lane does not touch the files'
wording while he holds that work.

PROGRESS 2026-09-09T23:55Z — STEP 3 CLOSED. The re-check passed all five items and did not take the
citation on trust: it opened skippy-code/server.js:3092, quoted the refusal verbatim, then traced
the identity chain through verifyIdentityToken and isNeekoIdentity to prove Neeko's identity really
is the value that gate excludes. It confirmed business_answer's handler genuinely has no
identity-specific gate, so leaving that one as an open gap is right. Guard run twice, 33/33 both
times. One imprecision it named without inflating: a cited line points at a sibling assignment
rather than the one the gate consumes — the same fact, a loose pointer, worth tidying when that file
is next touched.

PROGRESS 2026-09-09T23:55Z — 🔴 NICK'S RULING, 2026-09-09, VERBATIM: "skippy gracie and neeko are
same agent with a wrapper so we'll just tweak their files when we depoy them for primteime." This
SETTLES a gap this lane had just measured and started to close. Gracie and Neeko have no definition
file anywhere — they exist only as entries in PERSONA_REGISTRY in skippy-code/server.js (gracie at
line 2192, "Chantelle's companion"; neeko at 2200, "the team, one voice") — and two jobs to write
those files were in flight when he ruled. Both were killed and NOTHING was written. They are one
agent behind a wrapper, and their files are shaped at deployment, not now. Do not re-raise this and
do not write those two files.

PROGRESS 2026-09-09T23:55Z — A FALSE POSITIVE ON THE SECURITY GATE, RECORDED BECAUSE THE FIX WAS AN
IMPROVEMENT RATHER THAN A BYPASS. The first attempt at those two files was refused by the dispatch
gate, which matched the literal phrase "rotating a credential" inside the brief — the brief was
QUOTING the four approval classes into a document, not doing credential work. The NICK-ASKED escape
was not used. The brief was rewritten to POINT at the four approval classes where they are already
defined instead of restating them, which is what Nick's own no-duplicated-ceremony instruction asks
for anyway. A gate that fires on a quote is annoying; routing around it would have been worse, and
the rewrite left the document better than the version the gate refused.

PROGRESS 2026-09-09T22:05Z (local 17:05 EST) — STEP 8 LANDED, from the session Nick took the rewrite to.
The twenty in-scope agent files (Boris + seven workers, Sienna, spec, spec-breaker, the six specialists,
Skippy, Larry, Benito) are rewritten to the OPTIMAL bar; the seven marketing files untouched. The thirty
repeated lines now live once in projects/ops/agents/HONEST-OUTPUT-STANDARD.md §7-§9 and each file carries
a four-line pointer block, so STEP 2's duplicate detector reads 0 agent groups (was 10). Generated agents
were changed through their roster rows and build_agents.py, then regenerated; the seven frozen files by
hand. Every guard re-run and green (scaffolding, parity, descriptions, zion-guards, codex --check); the
Agent Directory page rebuilt. Full per-file record and the out-of-remit findings:
evidence/step8-agent-file-rewrite-2026-09-09.md. Two pre-existing test failures are NOT from this work:
_test-agent-generator C1 (frozen files outside the retirement sweep — fails on the untouched roster too)
and _test-benito H1/H3 (larry-hub-sync.mjs exists).

PROGRESS 2026-09-10T00:55Z — 🔴 THE CAPABILITY PRE-CHECK EARNED ITS PLACE: THREE MERGERS ARE SAFE
AND ONE WOULD HAVE LOST A REAL CAPABILITY, SILENTLY. Eight fresh extracts, one cheap job per agent,
taken against the files AS REWRITTEN today because the earlier set went stale the moment twenty
files changed. Verdict beside this record in evidence/step2-merge-precheck-verdict.md:

  gate wirer  into grunt     — SAFE, grunt's tools are a strict superset
  code reader into gatherer  — SAFE, gatherer's tools are a strict superset
  recorder    into grunt     — SAFE on tools, WITH A CONDITION (below)
  blind grader into verifier — 🔴 BLOCKED, the capability does not survive

WHY MERGER 2 IS BLOCKED, IN THE ABSORBED AGENT'S OWN WORDS: se-blind-checker holds the Claude
Browser tools because "the app it grades is client-rendered, so curl sees the shell and never the
screen." verifier holds WebFetch — the curl-shaped capability that sentence rules out by name — and
no browser tools. Absorbing one into the other would end the fleet's only ability to grade a
rendered screen, and nothing would error; the work would simply stop being possible.

IT ALSO SURFACED A CONTRADICTION THAT PREDATES THE MERGE. verifier is ALREADY told to open a UI live
and screenshot it, and already holds nothing that can. The merger would have buried that rather than
caused it. Recorded, not fixed: a tool list is a permission and this pre-check does not change one,
it names what a change would have to be so nobody discovers it afterwards.

THE HALF THE TOOLS CANNOT SHOW: se-recorder is a RECONCILER — transcribes into a home that already
exists, may not re-rank, soften or create a store. grunt is a BUILDER. The tools carry over and the
discipline does not, and no general agent holds the reconciler role today. Merger 4 must carry that
discipline across in the merged agent's own text or it loses a capability while the tool lists look
clean. A superset of tools is necessary and is not sufficient.

PROGRESS 2026-09-10T00:55Z — THE EIGHT EXTRACTS WERE ALL BUILT CHEAP AND THE SPLIT IS WHAT MADE IT
WORK. The same content asked for as ONE job timed out all three vendors earlier tonight and wrote
nothing while exiting 0. As eight jobs of one file read and one file written, seven landed first
time and the eighth on one re-send. Every one was verified by bytes written and by the target file
existing, never by exit code.

PROGRESS 2026-09-10T00:55Z — SYNC STATE, DECLARED RATHER THAN FORCED: the verdict is committed
locally and main has diverged one commit each way while other sessions hold uncommitted work in the
shared tree. Per Rule 20 nobody is asked and nothing is forced — the machine's own auto-pull uses
rebase with autostash and has carried this lane's work all night; it converges on its next run. The
work is not lost and no other session's uncommitted files were stashed by hand to make a push
succeed.

PROGRESS 2026-09-10T01:05Z — THREE MERGERS LANDED, THE FOURTH HELD, AND AN INDEPENDENT CHECKER
FAILED ONE ITEM THAT DESERVED TO FAIL. Landed in the roster's existing _merge_note convention rather
than in agent files, whose wording Nick is rewriting elsewhere: gate wirer into grunt, code reader
into gatherer, recorder into grunt. Blind grader into verifier is HELD, recorded on BOTH rows.
27 agents before and after; every absorbed name still present and in service, per his 2026-09-08
ruling that every name stays callable and nothing retires.

PROGRESS 2026-09-10T01:05Z — 🔴 THE CHECKER CAUGHT A FALSE BASELINE IN MY OWN BRIEF, AND THAT IS THE
MORE IMPORTANT OF ITS TWO FINDINGS. I told it to compare the roster against commit 3b6654b1f7 as the
pre-merge state. That commit is AFTER the merge. `git diff 3b6654b1f7 HEAD` on the roster is empty,
so the check I designed would have reported "nothing changed anywhere" and passed on evidence that
proved nothing. It found the real parent, 582ba437f3, and compared from there — then diffed all 27
rows key by key and confirmed the only change anywhere is one new key on seven rows, with no
in_service, tools, model or sign-off text touched. A criterion that names a baseline must name one
verified to be PRIOR to the change; mine was not, and naming it confidently is what made it
dangerous.

PROGRESS 2026-09-10T01:05Z — 🔴 ITS SECOND FINDING WAS A REAL LOST SAFEGUARD, AND MY OWN PRE-CHECK
HAD ALREADY WRITTEN THE CONDITION I THEN FAILED TO MEET. The pre-check says in its own words that
merger 4 "should carry that discipline across in the merged agent's own text, or it is a capability
lost in prose while the tools look fine." I wrote it into the roster's merge note instead. Nobody
briefing grunt to record something has any reason to open the roster, so the merge had quietly
removed the rule against a BUILDER overstepping into judgement while doing a RECONCILER's job — the
tools survived and the safeguard did not. grunt.md now carries it directly, with the distinction
from its neighbouring rule spelled out: that one forbids drawing conclusions from a batch, this one
forbids altering conclusions somebody else already drew, even by tidying them. Grepped before and
after: zero hits, then two.

PROGRESS 2026-09-10T01:05Z — STEP 4's PROOF RETURNS PASS ACROSS 24 CONTROLS after two more stale
guards were cleared, neither of which was a rule being broken. The duplicate scanner exited 2 on
seven read errors because its baseline still listed seven skill files two other lanes had
deliberately deleted — one by the skills purge, six by the Hub lane's handoff, each verified against
git and disk before its entry was dropped. Then the regroup guard failed six clauses because a
punctuation pass had turned em dashes into colons in five phase headings and the UNPROVEN ARTEFACT
GONE state. The guard now normalises that one separator and nothing else; the proof it was not
weakened is the check's own output, which still reports all 24 removed-duty controls firing. That
skill's own clause says weakening a guard to make a test pass remains the failure, so the evidence
matters more than the assurance.

PROGRESS 2026-09-10T01:05Z — SYNC: MAIN DIVERGED 8 BEHIND AND 9 AHEAD while other sessions hold
uncommitted work in the shared tree, and the merge refuses. Per Rule 20 nothing was forced and no
other session's uncommitted files were stashed by hand. The lane's commits are preserved in the
cloud on branch life-os/agents-2026-09-09 at fe91fd1cbf so nothing lives only on this Mac, and main
converges on the machine's own auto-pull, which is alive (pid 46393). Its last logged run exited 1
on a conflict in the BUSINESS app — a different repository, already carrying its own NEEDS A HUMAN
line, and not this lane's to touch.

PROGRESS 2026-09-10T01:20Z — 🔴 THE READ-BACK OF THE SEVEN RULE CHANGES CONTRADICTS WHAT THE PLAN
BELIEVED, AND THIS IS THE LANE'S MOST USEFUL FINDING. The plan recorded four as landed and three as
held behind the gate. Measured against the approved text itself, line by line, with the manifest's
own before and after fingerprints as the starting point:

    RULEBOOK.md                    PRESENT   4 of 4 approved lines
    CLAUDE.md                      PRESENT   2 of 2 approved lines
    ZION/skills/spec/SKILL.md      EMPTY     no substantive added lines exist to check
    projects/ops/MACHINE-RULES.md  ABSENT    0 of 3
    ZION/skills/plan/SKILL.md      ABSENT    0 of 3
    ZION/skills/regroup/SKILL.md   ABSENT    0 of 5
    projects/ops/agents/roster.json ABSENT   0 of 3

So TWO are in place, FOUR were never applied at all, and one was always empty. Four rules Nick
approved on 2026-09-08 have been recorded as done and are not in the files.

PROGRESS 2026-09-10T01:20Z — THE FIRST MEASUREMENT WAS TOO BLUNT AND WAS THROWN AWAY RATHER THAN
REPORTED. A whole-file sha256 against each manifest entry returned 2 LANDED and 5 DRIFTED. That
reading is worthless here: every one of these files has been legitimately edited since approval — by
the agent-file rewrite, by this lane's own roster work, by other lanes — so "not byte-identical to
the approved end state" says nothing about whether the approved CHANGE is in it. The second pass
extracts the added lines from each approved change and asks whether they appear in the destination
today, which is the question the step actually asks.

PROGRESS 2026-09-10T01:20Z — APPLYING THE FOUR AUTOMATICALLY WAS ATTEMPTED AND ALL FOUR REFUSED,
plain and three-way alike: the files have moved too far from the base those changes were cut
against. Nothing was half-written and the tree is clean, verified after. They now need a hand-carry
— each change re-placed into a file that has moved, which is a judgement about where the text
belongs now rather than a mechanical apply. Nick's documentation gate being open until
2026-09-10T20:22Z makes that PERMITTED; it does not make it safe to do unattended, at speed, in
three files that other lanes are actively editing. Recorded as the one item genuinely needing him.

PROGRESS 2026-09-10T01:20Z — LANE CLOSED OUT. Six of the plan's own finish-line items: the roster
and team page CLOSED; the mergers applied three of four with the fourth held on measured evidence;
the three faces CLOSED at 33 of 33 twice; the rule changes READ BACK with the result above; the
progress-note fault CLOSED on eight runs across both kinds of path; this postmortem written. Two
things beyond the original plan, added on Nick's own restatement of the North Star: every machine
and account now installs the agents itself with nobody running anything, and the file-quality work
he took elsewhere is verified consistent with everything this lane built.

PROGRESS 2026-09-10T01:20Z — WHAT THIS LANE COST AND WHAT IT CAUGHT, for the next overseer. Four
separate false-greens were caught, three of them written by this session: a proof that matched the
word PASS in a file whose verdict was FAIL; a roster row that made the team page claim a sign-off
Nick never gave; a tool-absence recorded as an oversight when the code held a deliberate gate; and a
capability recorded in a roster note that nobody dispatching the agent would ever read. Each was
caught by rendering the thing, opening the handler, or an independent checker — never by the
file-level proof that was supposed to catch it. The cheap lane built well on one-file jobs and
failed every job needing more than one file read, six times on a single file. Cheap vendors hold no
shell, so they cannot re-run a proof and cannot serve as a checker at all.

PROGRESS 2026-09-10T01:45Z — THE SEVEN RULE CHANGES ARE RESOLVED: FIVE LANDED BY HAND, TWO
DELIBERATELY NOT APPLIED. The rulebook and CLAUDE.md were already correct. Landed: the plan skill's
fleet coordination, its task-tier ladder and a fan-out line with no numeric cap (Nick's own ruling
retired the cap and the file still enforced one); the regroup skill's concurrency ceiling replaced by
fleet coordination with its three stale references updated; Rule 11 in the machine rules replaced by
the account-ownership predicate; and the roster's fixer rows now preserving state in git rather than
leaving .bak side-copies — which also settles the contradiction the agent-file rewrite flagged, where
one rule told the fixer to keep a .bak beside the file and another banned them.

PROGRESS 2026-09-10T01:45Z — 🔴 THE TWO NOT APPLIED ARE THE FINDING WORTH KEEPING. In both the
machine rules and the roster, the LIVE text is NEWER than what Nick approved and already carries the
change in better form: the roster's version adds two measured reasons the naive method fails (a
concurrent git-sync sweeping a stray write into a commit, and 5-11 dirty paths at rest from
background daemons), and the machine-rules block carries three later consolidations. Applying the
approved wording wholesale would have silently reverted all of it. A hand-carry has to read what is
there NOW, not paste what was signed off — which is why the automatic apply refusing all four was
correct rather than an obstacle.

PROGRESS 2026-09-10T01:45Z — 🔴 A FRESH BREAKAGE FROM ANOTHER LANE, HANDED OVER RATHER THAN FIXED.
Commit a9563e888a ("Bring bro, quick, wait-what and design-redo onto the shared shelf so they reach
every machine") created four symbolic links under ZION/skills/ pointing at
/Users/nickdeck/Documents/life-os-wt/ZION/skills-outside/ — OUTSIDE this repository. `git ls-files`
on a target returns "outside repository": it exists on this Mac and is tracked nowhere, so on any
other machine those four skills resolve to nothing. That is the opposite of the commit's own stated
purpose and is exactly what Rules 15 and 20 exist to prevent. The consequence is not cosmetic:
_test-zion-guards.mjs now CRASHES with ENOTDIR scanning ZION/skills/bro/evals.md, and
verify_instruction_checks.py calls that same guard, so it returns no verdict at all about the seven
rule changes. Both were passing an hour ago. FIXED ON NICK'S DIRECT INSTRUCTION ("fix it so were
done"): the three evals files and the whole design-redo skill were copied INTO the repository and
the four links deleted, so nothing under ZION/skills is a link any more and all four skills now
travel like everything else. The guard went from crashing to `0 failure(s)` and now sees 32 skills
and 136 documents where it saw 28 and 127 — the difference is the files it previously could not
read. The instruction-honesty check returns PASS across 24 controls again.

PROGRESS 2026-09-10T02:00Z — 🔴 A SECOND, WORSE BREAKAGE FROM ANOTHER LANE, RECORDED AND
DELIBERATELY NOT FIXED. The dispatch gate now refuses any brief that names a skill without carrying
that skill's full text. The rule itself is sound — a subagent inherits nothing. Its implementation
is not: it matches the bare WORD, and the MACHINE-RULES travel block that every correct brief is
required to carry contains the word "dispatch" three times. So a brief is refused for naming a
recipe it never referenced, and the more correctly it is written the more certainly it is refused.
Measured: `lib/test-dispatch-gate.mjs` scores 11/12, its one failure being the fixture literally
named "GREEN: role + travel block present" — the file's own comment says over-blocking is "a real
regression, not a safe failure". This session hit it live twice tonight and had to hand-verify work
a checker should have graded.

NOT FIXED HERE, AND THE REASON IS NOT TIMIDITY. This is a security-shaped gate; loosening its
matching at 02:00 while three sessions write to the tree risks it refusing too LITTLE, and the
regroup doctrine's own clause says weakening a guard to make a test pass remains the failure. A gate
that over-refuses fails closed and costs time; a gate that under-refuses fails open and costs
safety. The owner of check-dispatch-brief.mjs should make the match require an actual instruction to
follow the recipe rather than the word appearing anywhere in the payload, and update that fixture in
the same commit.

PROGRESS 2026-09-10T14:32:10Z — STEP 8 INDEPENDENT CHECK DONE (a fresh verifier on Sonnet, cold, all eight briefed checks re-run from the repo root and green: duplicate detector 0 agent groups, rules-present 7 of 7, scaffolding PASS, parity PASS, descriptions PASS, every front matter parses, the seven marketing files unchanged across the rewrite commits; verdict at evidence/step8-independent-check-2026-09-10.json). Its own ninth criterion found ONE real regression the builder missed: the old verifier.md required plain English for everything Nick reads, and the rewrite had narrowed that to the one for_nick field. Restored the same minute as a must-not line covering the whole hand-back; rules guard still 7 of 7. STEP 8 closes on that verdict plus the restoration; the ninth criterion's second candidate (the retired grader anchor) was confirmed retired, no loss.
2026-09-10T14:25Z — HANDOVER FROM THE PROJECT-MANAGEMENT LANE (Group H, STEP 4; information and one ask, nothing of yours is edited from here): the four-times-a-day document check now reads every registered live lane's build-board card, progress screen and step record together and names the one that disagrees. Measured 2026-09-10T14:25Z on the cloud copy: this lane's card's newest update says STEP 8 is at 90% while its STEPS.json says 100% — the two moved apart (a hand edit, or a file write the shared checkout's merges reverted after the board post landed). The fix is one run of the shared update command (unified-project-update.mjs, in the exact one-command form your builder prompt carries) for the step you consider current — it writes the card, the screen and the step record together; until then the check names this lane as MISMATCH.