# HOOK-FIX-20260421 Addendum — v2.1.116 argv 重複バグ 朝セッションで commit 527c18b として修正済み。夜セッションで追加検証と、 朝fix でカバーしきれない Claude Code 固有のバグを特定したので補遺を記録する。 ## 朝fixの形式 ```json "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** で失敗する: ```js 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 側の実装 依存のリスクが残る。 ## 夜 適用した追加 fix 第1トークンを `bash`(PATH 解決)に変えた明示的な呼び出しに更新: ```json { "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 登録と 同じパターンで、現実にエラーなく動作している実績あり。 ### Node spawn 検証 ```js spawn('bash "C:/Users/sugig/.claude/skills/continuous-learning/hooks/observe-wrapper.sh" post', [], {shell:true}); // exit=0 → observations.jsonl に正常追記 ``` ## Claude Code v2.1.116 の argv 重複バグ(詳細) 朝fix docの「Defect 2」として `bash.exe: bash.exe: cannot execute binary file` を 記録しているが、その根本メカニズムが特定できたので記す。 ### 再現 ```bash "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。エラー文言は完全一致。 ### Claude Code 側の挙動 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 のフルパス+スペース付きパスにしないこと: 1. ✅ `bash` (PATH 解決の単一トークン)— 夜fix / hooks.json パターン 2. ✅ `.sh` 直接パス(Claude Code の .sh ハンドリングに依存)— 朝fix 3. ❌ `"C:\Program Files\Git\bin\bash.exe" ""` — 1トークン目が quoted で空白込み ## 結論 朝fix(直接 .sh 指定)と夜fix(明示的 bash prefix)のどちらも argv 重複バグを 踏まないが、**夜fixの方が Claude Code の実装依存が少ない**ため推奨。 ただし朝fix commit 527c18b は既に docs/fixes/ に入っているため、この Addendum を 追記することで両論併記とする。次回 CLI 再起動時に夜fix の方が実運用に残る。 ## 関連 - 朝 fix commit: 527c18b - 朝 fix doc: docs/fixes/HOOK-FIX-20260421.md - 朝 apply script: docs/fixes/apply-hook-fix.sh - 夜 fix 記録(ローカル): C:\Users\sugig\Documents\Claude\Projects\ECC作成\hook-fix-report-20260421.md - 夜 fix 適用ファイル: C:\Users\sugig\.claude\settings.local.json - 夜 backup: C:\Users\sugig\.claude\settings.local.json.bak-hook-fix-20260421