# Row 179: docs/TOOLS.md follow-ups from the row 169 review Brief `docs/plans/2026-10-19_tools-md-169-followups.md` (b2a75f318). Filbert raised the follow-ups in the row 169 round 1 review (#1666 comment 29263). Owner Darkwing, reviewer Dewey, gate owner Sage. ## Files | File | What | |---|---| | `build.patch` | the change, `git diff ce5807989 -- docs/TOOLS.md` | | `candidate-manifest.sha256` | one line, `docs/TOOLS.md` | - Base: ce5807989 (origin/refactor at 23:32Z, after the row 169 landing 264756a30). Its `docs/TOOLS.md` is sha256 31e80ff21e78...f091, the blob the brief's line numbers refer to. - Candidate `docs/TOOLS.md` sha256 67acbed1f505ffe565c179ede1889a0795018ec1b99bd292d989f3fe000c60f4. - Manifest digest 2b161c5186098f1bc8c3dd8198b3666785a89852987051661f741a509317bd67. - `git patch-id --stable`: 35e385ff93cb3fd13b7da54375eb95bd455431c4. - Diff: `docs/TOOLS.md` only, 22 insertions and 7 deletions, all in the three spots F1-F3 name. ## The change - F1, at :454 (now :467-469): `pm-on` and a `pm-on-failed` run leave the Console running, and `pm-on-down` stops it. None of them touches the copy or the store. Checked against the landed `scripts/stack-release.sh`: `do_pm_on` stops and starts the bus alone (`stop_bus`). `pm_on_fail` uses `stop_bus` too and exits 1 on a phase-1 pass. Only the `pm-on-down` path runs `systemctl --user stop "$CONSOLE_UNIT"`, then exits 2. - F2, at :426 and :446. - Step 2 of the two-phase section gives the working form `node /packages/cli/src/cli.mjs plugins set --file P --business ID`. `` is the pointer's copy, because the bus accepts the human proof only from its own tree. - It gives the PATCH shape `{"revision":"<64 hex>","plugins":{"":|null}}`, where the revision comes from the `plugins` read and null removes a kind. A kind the patch doesn't name keeps its setting, as `packages/cli/src/plugins.mjs` and `packages/business/src/plugin-settings.mjs` say. - One line says row 175's fixed `mosaic plugins set` replaces the form once that row lands. Row 175 hasn't landed (sage-1098), so the form stays in. - Rollback step 7 points to that step for the null set. - F3, in activate step 5 and rollback step 7. - `business-unreadable` covers a copy older than eaeb5ebf2, which has no `plugins/src/kinds.mjs`, and a file the target's loader refuses. - The code is `plugin_checks` at `scripts/stack-release.sh:267` and `:275`. `do_activate` and `do_rollback` both run it, with and without `--plan` (:804, :806, :816, :818). - `git log --diff-filter=A -- packages/plugins/src/kinds.mjs` gives eaeb5ebf2. The live copy 5fa9cc8f2 contains it (`merge-base --is-ancestor`), as Sage found. TOOLS.md doesn't name the live copy, since that fact changes with each re-pin. The added lines pass `tools/unslop-hook/unslop-check.js` and add no em dash. TOOLS.md has the same 5 em dashes it had at the base. ## Gate The brief's grep, `grep -rn "TOOLS.md" packages/*/tests scripts/test-*.sh`, finds one line: ``` packages/cli/tests/stack-release.test.mjs:428: ... (e)=>`... TOOLS.md step 4`], ``` That is an expected refusal message string, not a read. A wider `git grep -ln "TOOLS.md" -- '*test*' '*spec*'` outside v1/, agents/ and docs/ finds the same file and nothing else. No test reads the file, so under decision 137 (Mos 10-16) Dewey's approval of the candidate manifest is the gate, and I ran no suite. ## Review Dewey approved round 1 (#1677 comment 29271, rev 2062) on manifest 2b161c51. Their rebuild on ce5807989 matched the manifest, the TOOLS.md sha256 and the patch-id. Note N1 isn't a finding. A host that can't find the business file fails ENOENT at `stack-release.sh:267` and refuses `business-unreadable` too. The lead clause in F3 covers that case, but the list after it reads as complete. I'm leaving it unless there's another round. Row 175 r2 also changes TOOLS.md, at :277. This patch applies to that tree with line offsets only. Whichever row lands second rebases.