diff --git a/docs/handoff/20260815-after-v1.md b/docs/handoff/20260815-after-v1.md index b623b1dd..77163f18 100644 --- a/docs/handoff/20260815-after-v1.md +++ b/docs/handoff/20260815-after-v1.md @@ -134,3 +134,54 @@ Each cost a cycle today. Pin the failure mode, not the value. - `git push` printing `branch set up to track` does not mean a commit was pushed. Read `git ls-remote` back. + +## After v1.0.1 — the installer divergence + +v1.0.1 shipped the five distribution fixes and its controls inverted. What +followed came from looking at what those fixes touched. + +**#693 — the hook pinned a release.** `commitlore.bin` recorded +`/v/dist/commitlore.mjs`, so an upgrade left a repository +validating commits with the build it was installed from. Three repositories on +the first machine to upgrade were doing that — this one among them, through two +releases. Fixed by `install.sh` maintaining `/current` and hooks +recording it: still an absolute path to a `.mjs`, so the recorded interpreter can +launch it, but naming no release. + +The obvious repair was tried and is wrong. Recording the `bin` wrapper made hooks +fail under the restricted `PATH` a hook actually runs in, because a wrapper is a +shell script and cannot be launched with a recorded interpreter. That is #694, +closed with the measurement so nobody repeats it. + +**#697 — the two installers do different things.** Deleting `install.sh`'s dead +host block revealed that `install.ps1` installs the Codex plugin and +`install.sh` never did: its `wire_codex_plugin` was reachable only from +`wire_codex`, which nothing calls. Windows users got a plugin layer the others +did not. + +The plugin step now lives in the enumeration both installers call. The rest of +the divergence is mapped host by host on the issue. + +## The trap that produced three issues + +`test/agent-configs.test.ts` asserted host config paths were **present in +`install.sh`**. Presence, not reachability. `T-1121` asserted the same sentences +appear in both installers so they "cannot drift" — and the parity was holding +between a live script and a dead block. + +Both assertions passed for years while the shell wired nothing. #689, #697 and +half of #660 were invisible underneath them. + +An assertion that names a file is not an assertion that the file does anything. + +## Why #691 is still open + +`install.sh`'s 291 dead lines look deletable and are not, yet. `install.ps1`'s +wiring is **not** their dead twin: it delegates at line 817 **and** wires hosts +itself from line 1089, so Windows does every host twice. Deleting the POSIX copy +alone breaks `T-1121`, which is the test doing its job. + +The Codex gap proves the two sides are not equivalent, so the order is fixed: +confirm the enumeration performs each row, remove the duplicate, and only then +the dead block. Never the reverse — that removes a step nothing else performs, on +a platform the author cannot run.