メインコンテンツまでスキップ

調査・修正中に効く rule と hook

Step 0 で道具が揃ったら、いよいよ調査と修正です。この段階では、ファイルを読むたび・書き換えるたびに、別の要素が割り込んできます。

ファイルを読むと rule が自動で付いてくる

/debug がバグの調査で fetchUser の実装(user-service.ts)を Read します。このとき、.ts ファイルを開いたことをきっかけに、関連する path-scoped rule が自動的に読み込まれます。

rule の frontmatter(イメージ)
---
name: typescript-strict
paths:
- "**/*.ts"
- "**/*.tsx"
---

paths: の glob にマッチするファイルを開くと、その rule がコンテキストに注入されます。.ts を読めば typescript-strict.mdany 禁止、型ガード優先など)や coding-patterns.md が効いてくる、という具合です。この「paths: で読み込みを切り替える」機構は Claude Code 標準(📦)で、rule ファイルの中身は筆者の自作(🔧)です。

この「対象を開いたときだけ読み込む」設計のおかげで、TypeScript の規範は TypeScript を触るときだけ、Terraform の規範は .tf を触るときだけ働きます。必要なものが必要な場面で出てくるので、常時すべてを抱える必要がありません(仕組みの詳細は rule のロード機構)。

書き換える瞬間に hook が割り込む

原因が「空配列のとき array[0] を返している」ことだと分かり、修正に入ります。ここで Edit / Write を実行すると、2 種類の hook が前後で割り込みます。これらは Guides と Sensors でいう Computational な仕掛けです。

修正の前(PreToolUse)— 危険な書き込みを止める

Edit / Write が実行される直前check-protected-files.sh が走ります。もし修正のついでに .env を書き換えようとしたり、秘密鍵をコードに直書きしようとすると、ここで止まります。この hook は、.env や lockfile の誤編集・秘密情報の直書きを実際に踏みかけた経験から、「文章で注意する」のではなく「実行前に物理的に止める」形で作られました。

check-protected-files.sh が止めるもの(抜粋)
# .env / credentials / lockfiles / .git/ / secrets/ への書き込み
# AWS Access Key(AKIA...)/ GitHub PAT(ghp_...)等のハードコード
echo "Blocked: '$FILE_PATH' は保護対象です..." >&2
exit 2

exit 2 で差し戻されるので、「うっかり秘密情報をコミット」が構造的に起きません。

修正の後(PostToolUse)— 「楽な修正」を塞ぐ

これがデバッグでいちばん効く仕掛けです。Edit / Write直後check-suppression.sh が走り、lint や型エラーを握り潰すコメントの新規追加を検出します。

check-suppression.sh が検出するもの(抜粋)
PATTERNS='eslint-disable|@ts-ignore($|[^a-zA-Z])|# type: ignore|# noqa|//[[:space:]]*tslint:disable'
# 新規追加されていたら exit 2(stderr が Claude に返り、自己修正を促す)

たとえば、型エラーを根本から直す代わりに // @ts-ignore を 1 行足して黙らせるとします。これは /debug のアンチパターン「症状を消すだけの対症療法」そのものです。check-suppression.sh はその新規追加を検出し、exit 2 で stderr を Claude に返して、適用済みの編集を自分で修正させます。PreToolUse と違って PostToolUseexit 2 は実行をブロックしません——編集が自動で取り消されるわけではなく、握り潰しを残したまま先に進めなくする仕掛けです。この hook が生まれたのも、「楽な修正」が症状を隠すだけだという失敗の繰り返しからです。エラーを黙らせるコメントは一見すると修正に見えるため、文章の規範だけでは止まりませんでした。

なお PostToolUse には、このほかにも subagent の成果物を即時保存する hook やレート上限を監視する hook が登録されています(一覧は hooks の仕組み)。この章では /debug の修正の物語に関わる 2 本に絞っています。

Guide と Sensor の二重構え

/debug の SKILL.md 本文にも「対症療法を避けよ」と書かれています(Inferential Guide)。しかし文章の指示は確率的にすり抜けます。だから check-suppression.sh(Computational Sensor)で、すり抜けた 1 回を決定的に捕まえる。同じ規範を文章と機械の両方で守る、ハーネスの典型的な構えです。

この段階の割り込みマップ

この章のまとめ

要点は次のとおりです。

  • ファイルを開くと、その種類に対応する path-scoped rule が自動でロードされる
  • 修正の直前に check-protected-files.sh が秘密情報・保護ファイルへの書き込みを止める
  • 修正の直後に check-suppression.sh@ts-ignore 等の握り潰しを検出し、自己修正を促す
  • 「対症療法を避けよ」という文章の規範を、hook が機械的に裏打ちする

次は 検証ループ で、「直した」を「直ったと証明する」に変える反復を見ます。