- Add gstack-settings-hook prune-stale --repoint command to remove dead entries, fix stale ones, restore stripped tags, and collapse duplicates
- Hook registration now uses only canonical paths pointing to ~/.claude/skills/gstack install
- Hook ownership is now decided by a fixed identity table in bin/gstack-settings-hook
- Prevent ephemeral workspace paths from being baked into global settings
- Resolve PostToolUse:AskUserQuestion hook errors caused by deleted workspaces or git worktrees
- Fix Conductor auto-opt-in overriding the flag that prevents baking in physical paths
- Prevent hook dedupe tag stripping from creating duplicate stale entries
From gstack
No ephemeral path can ever be baked in again. If you work in Conductor workspaces or git worktrees, you have probably seen it: PostToolUse:AskUserQuestion hook error ... No such file or directory spraying on every question, pointing at a workspace you deleted last week. The cause was a three-part failure. Setup baked the running tree's physical path into your global ~/.claude/settings.json, the Conductor auto-opt-in overrode the exact flag bin/dev-setup passes to prevent that, and the dedupe tag gstack relied on gets stripped by Claude Code itself, so every new workspace appended a fresh dead entry instead of replacing the old one. All three are fixed at the root. Hook registration is now canonical-only: commands point at the stable ~/.claude/skills/gstack install or are not registered at all. Ownership is decided by a fixed identity table in bin/gstack-settings-hook, per hook item, so it survives tag-stripping and can never claim a hook you wrote yourself. And every ./setup run now heals first: gstack-settings-hook prune-stale --repoint removes dead gstack entries, re-points stale ones, restores stripped tags, and collapses duplicates, printing one line only when it changed something.