docs/fixes/HOOK-FIX-20260421-ADDENDUM.md
朝セッションで commit 527c18b として修正済み。夜セッションで追加検証と、 朝fix でカバーしきれない Claude Code 固有のバグを特定したので補遺を記録する。
"command": "C:/Users/sugig/.claude/skills/continuous-learning/hooks/observe-wrapper.sh pre"
.sh ファイルを直接 command にする形式。Git Bash が shebang 経由で実行する前提。
Node.js の child_process.spawn で .sh ファイルを直接実行すると Windows では
EFTYPE で失敗する:
spawn('C:/Users/sugig/.claude/skills/continuous-learning/hooks/observe-wrapper.sh',
['post'], {stdio:['pipe','pipe','pipe']});
// → Error: spawn EFTYPE (errno -4028)
shell:true を付ければ cmd.exe 経由で実行できるが、Claude Code 側の実装
依存のリスクが残る。
第1トークンを bash(PATH 解決)に変えた明示的な呼び出しに更新:
{
"hooks": {
"PreToolUse": [{
"matcher": "*",
"hooks": [{
"type": "command",
"command": "bash \"C:/Users/sugig/.claude/skills/continuous-learning/hooks/observe-wrapper.sh\" pre"
}]
}],
"PostToolUse": [{
"matcher": "*",
"hooks": [{
"type": "command",
"command": "bash \"C:/Users/sugig/.claude/skills/continuous-learning/hooks/observe-wrapper.sh\" post"
}]
}]
}
}
この形式は ~/.claude/hooks/hooks.json 内の ECC 正規 observer 登録と
同じパターンで、現実にエラーなく動作している実績あり。
spawn('bash "C:/Users/sugig/.claude/skills/continuous-learning/hooks/observe-wrapper.sh" post',
[], {shell:true});
// exit=0 → observations.jsonl に正常追記
朝fix docの「Defect 2」として bash.exe: bash.exe: cannot execute binary file を
記録しているが、その根本メカニズムが特定できたので記す。
"C:\Program Files\Git\bin\bash.exe" "C:\Program Files\Git\bin\bash.exe"
# stderr: "C:\Program Files\Git\bin\bash.exe: C:\Program Files\Git\bin\bash.exe: cannot execute binary file"
# exit: 126
bash は argv[1] を script とみなし読み込もうとする。argv[1] が bash.exe 自身なら ELF/PE バイナリ検出で失敗 → exit 126。エラー文言は完全一致。
hook command が "C:\Program Files\Git\bin\bash.exe" "C:\Users\...\wrapper.sh"
のとき、v2.1.116 は第1トークン(= bash.exe フルパス)を argv[0] と argv[1] の
両方に渡すと推定される。結果 bash は argv[1] = bash.exe を script として
読み込もうとして 126 で落ちる。
第1トークンを bash.exe のフルパス+スペース付きパスにしないこと:
OK: bash (PATH 解決の単一トークン)— 夜fix / hooks.json パターンOK: .sh 直接パス(Claude Code の .sh ハンドリングに依存)— 朝fixBAD: "C:\Program Files\Git\bin\bash.exe" "<path>" — 1トークン目が quoted で空白込み朝fix(直接 .sh 指定)と夜fix(明示的 bash prefix)のどちらも argv 重複バグを 踏まないが、夜fixの方が Claude Code の実装依存が少ないため推奨。
ただし朝fix commit 527c18b は既に docs/fixes/ に入っているため、この Addendum を 追記することで両論併記とする。次回 CLI 再起動時に夜fix の方が実運用に残る。