PaPoo
cover

WorktreeRemove hook failed が出るのに、hook 自体は悪くないことがある

最初に切り分けたいのは、「本当に WorktreeRemove hook が失敗したのか」と「削除経路の都合でそう見えているだけか」です。今回の issue 群では、その2通りが混ざっています。

ひとつは #82097 です。ここでは、claude agents の agent 削除で WorktreeRemove hook failed が出るものの、報告者の言葉では ~/.claude/hooks/worktree-remove.sh はどの経路でも 0 を返しており、hook が直接壊れているわけではありません。報告では、WorktreeCreate で作られた worktree のセッション記録に hookBased: true が入り、originalHeadCommit がないため、CLI 側が worktree 状態を検証できず削除を拒んでいる、という説明になっています。つまり、見えているエラー文と実際の原因がずれている可能性があります。

もうひとつは #79872 です。こちらは claude agents からセッションを削除すると、plugin に入っている WorktreeRemove hook が使われず、WorktreeRemove hook failed と表示されるという報告でした。報告者は、同じ plugin の hook はセッション内で worktree を外すときには動くが、削除経路では動かないと書いています。つまり、この症状は「hook があるのに呼ばれていない」ケースでも起きます。

実際に寄せられたコメントでも、似た流れが確認されています。worktree を plugin の WorktreeCreate で作ると、あとから削除できず、しかも別の文言では Could not verify worktree state. と出たとあります。WorktreeRemove hook failed だけを見て hook 実装を疑うと、外す可能性があります。

今回こちらで確認できたのは、設定ファイルが見つからなかったことです。少なくとも、この環境では settings.json の有無を探した範囲で次の通りでした。

[settings_structure]
~/.claude/settings.json: (存在しない)
/mnt/vda5/git/papoo/newsbot_openai/.claude/settings.json: (存在しない)
/mnt/vda5/git/papoo/newsbot_openai/.claude/settings.local.json: (存在しない)

この出力から言えるのは、「少なくともこの検証環境では、該当する settings ファイルは見つからなかった」というところまでです。どの設定が効いているか、あるいは plugin がどう定義されているかまでは分かりません。

なので、現時点で安全に言える切り分けはこうです。WorktreeRemove hook failed が出ても、すぐに hook の中身だけを疑わないこと。claude agents の削除経路でだけ起きるなら、#79872 のように「plugin 側の hook が削除経路で拾われていない」可能性があります。WorktreeCreate 由来の worktree だけで再現するなら、#82097 のように、originalHeadCommit がないために CLI が状態確認に失敗している可能性があります。

どちらの issue も open で、ここに書ける範囲では恒久的な解決策は確認できません。少なくとも報告ベースでは、ユーザー側の設定ミスと断定できる状況ではなく、削除経路側の不具合として扱うのが自然です。


検証環境

OS          : Linux 3.10.0-1160.76.1.el7.x86_64 (x86_64)
Python      : 3.8.13
検証日時    : 2026-09-03T08:51:27+09:00

参照した Issue(anthropics/claude-code): #82097, #79872

同じ著者の記事