v0.17.1
Fixed
-
The walk can no longer be installed and silently unwired.
qa/walk-status.mjsis
lane code, replaced wholesale onupgrade --harness; its two surfaces are not — the
statusLineand theUserPromptSubmithook live in.claude/settings.json, which is
app-owned and, correctly, never clobbered. So an app that hand-edited its settings could
take the machinery and lose the wiring, and the failure mode was silence — the exact
thing the walk exists to end, in the one shape nothing in the system could notice.
create-cmp doctornow carries awalk-wiringfinding: warn when the script is
installed but settings.json does not invoke it, naming which half is missing, healable
with--fixfrom the engine's own template (read at fix time, so the heal cannot drift
from what a fresh scaffold gets). The heal only ever claims an unclaimed slot — an app
that set its own status line keeps it, an existingUserPromptSubmitis appended to
rather than replaced, settings it cannot parse are never written over, and a second run
is a no-op. -
Minimal mode no longer ships a status line pointing at a lane it deletes. 0.17.0 added
a top-levelstatusLineto the template — a command surfaceclassifyHooknever saw,
because it is not a hook.minimalHookSettingstherefore passed it through untouched,
giving a minimal scaffold a status line readingqa/walk-status.mjs, a file minimal
removes. The command is guarded (test -f … || true), so it printed nothing rather than
erroring: dead config that fails silently, which is precisely why it survived review. The
lane-reference rule now applies to every settings surface that carries a command, not only
tohooks. -
The Node 18 lane was red on main across two releases, and it was telling the truth.
package.jsondeclaresengines: ">=18"and the CI matrix tests 18, but
scripts/check-plugin-sync.mjsusedimport.meta.dirname(Node 20.11+) — so the
plugin-drift detector was dead on load for anyone on the declared floor, and its test
file took the whole Node 18 job down with it. Both sites now resolve the long way
(fileURLToPath(import.meta.url)). A newtest/node-floor.test.mjsscans every shipped
.mjsfor APIs newer than the declared floor, so the next violation fails locally rather
than becoming background noise in a job nobody reads.
Note
upgrade --harness was not at fault here and needed no change: .claude/settings.json
lands in the sweep's applied bucket, so an app that never touched its settings receives the
walk wiring along with the machinery. Verified against the showcase (0.14.1 → 0.17.0).
No change to @create-cmp/harness (0.15.0) or @create-cmp/inspector (0.8.0) — both
version independently and neither was touched.