Files
everything-claude-code/docs/fixes/HOOK-FIX-20260421-ADDENDUM.md
2026-04-23 02:14:28 -04:00

4.0 KiB
Raw Blame History

HOOK-FIX-20260421 Addendum — v2.1.116 argv 重複バグ

朝セッションで commit 527c18b として修正済み。夜セッションで追加検証と、 朝fix でカバーしきれない Claude Code 固有のバグを特定したので補遺を記録する。

朝fixの形式

"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 側の実装 依存のリスクが残る。

夜 適用した追加 fix

第1トークンを bashPATH 解決)に変えた明示的な呼び出しに更新:

{
  "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 検証

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 を 記録しているが、その根本メカニズムが特定できたので記す。

再現

"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. OK: bash PATH 解決の単一トークン)— 夜fix / hooks.json パターン
  2. OK: .sh 直接パスClaude Code の .sh ハンドリングに依存)— 朝fix
  3. BAD: "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 の方が実運用に残る。

関連

  • 朝 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