---
name: v092-onnode-update-skew-brick
description: On-node update verify DONE (0.9.0→0.9.2) but mid-session update bricked ALL tools — old dispatch.sh + new bare hook_cmd skew; /reload-plugins recovered
metadata: 
  node_type: memory
  type: project
  originSessionId: d8460aba-1a48-401d-a0c9-4e89c12d5eec
---

2026-07-01 (perri): The deferred "on-node update verify" ran live. Node was still adapter v0.9.0
(v0.9.1 env bug reproducing: `hook: command not found` per Bash from unquoted SPTC_HOOK_BIN
session-env line; CC snapshots hook env output in-memory at SessionStart — editing the file
mid-session does NOT fix it). `spt adapter update claude-spt` applied 0.9.0→0.9.2 cleanly
(gh_release, U1 message) and re-registered under NEW dir `adapters/_github/SaberMage-claude-spt`
(repo is `SaberMage/claude-spt` now) — old `SaberMage-spt-claude-code` dir orphaned.

**Major finding — mid-session skew brick:** old on-disk plugin dispatch.sh (cplugs 0.1.8) execs
`"$bin" <event>`; new v0.9.2 manifest hook_cmd = bare path → ran `claude-spt PreToolUse` →
"unknown subcommand" → nonzero exit → CC blocked EVERY tool call (Bash/Read/Write/Glob/
AskUserQuestion) AND the Stop hook looped (agent couldn't even end its turn). Zero self-repair
possible; operator `/reload-plugins` (picked up sptc 0.1.9 dispatch.sh) recovered fully.

**Why:** 0.1.9 dispatch handles old-manifest (strips legacy ` hook` suffix), but the reverse
direction — stale 0.1.8 dispatch + new manifest — is unprotected.

**Open threads:** (1) protect the reverse skew (post-update reconcile of live plugin cache dir,
or transition shim); (2) verify whether `claude-spt post-update` reconciles ccs-instance plugin
roots (`~/.ccs/instances/<x>/plugins/...`) or only `~/.claude/plugins` — suspected miss,
unconfirmed; (3) orphaned old adapter dir + many stale session-env files referencing it.
Related: [[v091-bugfix-sweep]], [[v090-d1-shipped]].
