Claude Code は毎日平然と嘘をつきます。存在しない関数、偽のインポート、何も実行していないのに「テスト合格」。その対策は、嘘をつくことを高くつくものにする 4 層の仕組みです。
Claude がバグを修正したと言います。2 時間後、呼び出した関数が存在しなかったことに気づきます。
ほとんどの開発者はすべてを再確認し、モデルを非難することを学びます。本当の対策は、すべての嘘をマシンの外に出る前にキャッチすることです。
完全な正直さのセットアップはこちら 👇

そもそもなぜ Claude は嘘をつくのか
Claude はテキスト予測器です。何かを知らないとき、もっともらしいテキストを予測します。でっち上げの関数名は本物のように見えます。自信満々に伝えられるナンセンスは、自信満々に伝えられる真実と同じように読めます。
コードが 2 時間後に壊れ、さらに 1 時間かけてデバッグするまで、その違いはわかりません。
対策は、より賢いモデルではありません。Claude の出力をリアルタイムで確認可能にし、「わかりません」と言うことを推測より安くすることです。
以下 4 層です。これらを組み合わせることで、でっち上げをほぼゼロに抑えます。

レイヤー 1: CLAUDE.md の誠実さルール
最初のレイヤーは、CLAUDE.md に記述する一連のルールで、不確かな場合にいつ、どのように認めるかを Claude に正確に指示します。これをプロジェクトルートに配置してください。
1## 誠実さルール(毎ターン読むこと)23関数、クラス、またはインポートが存在すると主張する前に、ファイルを読むか4grep を実行して検証すること。決してシンボルをでっち上げないこと。56何かを検証できない場合は、「これは検証していません」と明示的に述べること。7検証していない主張に依存するコードを書かないこと。89このプロジェクトで参照されたことのないライブラリの使用をタスクが要求する場合は、10追加する前に尋ねること。1112タスクにテストやビルドが含まれる場合、このセッションで実際にテストやビルド13コマンドを実行しない限り、成功を主張しないこと。1415エラーメッセージ、API レスポンス、スタックトレースを決してでっち上げないこと。16実際に見ていない場合は、そう述べること。1718本当にわからない場合、正しい答えは「わかりません」または「最初に確認する必要があります」19です。どちらも自信満々の推測よりはましです。
これらのルールは明白に見えます。
しかし実際はそうではありません。なぜなら、デフォルトでは Claude は役に立つように最適化されており、「わかりません」は、明示的な許可を与えない限り、役に立たないように感じられるからです。
最後の行が最も重要です。これは「わかりません」という許可であり、ほとんどの人はそれを決して与えません。
レイヤー 2: 書き込み前検証パターン
2 番目のレイヤーは、Claude が書き込む前に検証することを強制します。これを CLAUDE.md の誠実さルールの下に追加します。
1## 検証プロトコル23シンボル(関数、クラス、型、定数)を使用するコードを書いたり編集したりする前に、4以下のいずれかを行うこと:561. それが定義されているファイルを読み、シグネチャを確認する72. `grep -r "symbolName" .` を実行するか、Glob ツールを使用して見つける83. package.json、requirements.txt、Cargo.toml、または同等のファイルで9 依存関係を確認する1011検証をスキップした場合は、コードの前にコメントを付けること:12`// UNVERIFIED: このシンボルが存在することを確認していません`1314複数のファイルにまたがるタスクには、計画→実行モードが推奨されます。15開始する前に Shift+Tab を使用して計画モードに入ってください。
これにより、Claude はセッションごとに数回の追加ツール呼び出しを消費します。しかし、偽の関数呼び出しのデバッグに費やすであろう何時間もの時間を節約できます。
レイヤー 3: 嘘をリアルタイムでキャッチするフック
3 番目のレイヤーは、settings.json 内のフックで、Claude がファイルを書き込むたびに型チェッカーまたはリンターを実行します。Claude がインポートをでっち上げた場合、チェッカーは即座に失敗し、Claude はタスクが完了したと主張する前にそれを修正する必要があります。
1{2 "hooks": {3 "PostToolUse": [4 {5 "matcher": "Write(*.ts|*.tsx)|Edit(*.ts|*.tsx)",6 "hooks": [7 { "type": "command", "command": "npx tsc --noEmit --pretty false 2>&1 | head -20" }8 ]9 },10 {11 "matcher": "Write(*.py)|Edit(*.py)",12 "hooks": [13 { "type": "command", "command": "ruff check --quiet $file && pyright $file 2>&1 | head -20" }14 ]15 },16 {17 "matcher": "Write(*.rs)|Edit(*.rs)",18 "hooks": [19 { "type": "command", "command": "cargo check --message-format=short 2>&1 | head -20" }20 ]21 }22 ]23 }24}
フックの出力はコンテキストとして Claude に戻ります。tsc が「モジュール 'foo' が見つかりません」と言った場合、Claude はそれを即座に認識し、でっち上げられたインポートを修正します。でっち上げられたコードは PostToolUse チェックを生き残れません。
テストを含むタスクの場合は、Claude がセッション完了を宣言する前にテストスイートを実行する Stop フックを追加します。
1"Stop": [2 {3 "hooks": [4 { "type": "command", "command": "npm test 2>&1 | tail -30" }5 ]6 }7]
これで、Claude は実際にテストを実行せずに「完了、テスト合格」とは言えなくなります。フックがテストを実行します。
結果は Claude に戻ります。テストが失敗した場合、Claude は修正するか、合格していないことを認めなければなりません。
レイヤー 4: ファクトチェッカーサブエージェント
4 番目のレイヤーは、Claude の主張が出荷される前にレビューすることだけを仕事とするサブエージェントです。
これを .claude/agents/fact-checker.md に配置します。
1---2name: fact-checker3description: Claude がコードの動作、テストの合格、ライブラリのサポートなどについて主張した後に、このエージェントを使用します。コミット前、ユーザー向けの要約前、および新しい依存関係を含むタスクの後に呼び出します。4tools: Read, Grep, Glob, Bash5model: sonnet6---78あなたは主張を検証するものであり、コードを書くものではありません。910呼び出されたら、以下を行います。11121. 最近の会話の中のすべての事実に基づく主張を特定します。例:13 「関数 X は Y を行う」、「テストは合格する」、「ライブラリ Z は W をサポートする」、14 「このインポートは正しい」。15162. 各主張について、独立して検証します。17 - コードの主張:実際のファイルを読み、確認する18 - テストの主張:自分でテストを実行する19 - ライブラリの主張:実際のパッケージまたはそのドキュメントを確認する20 - インポートの主張:パッケージが依存関係マニフェストにあることを確認する21223. レポートを作成します。23 - VERIFIED: 主張、証拠(ファイル:行またはコマンド出力)24 - WRONG: 主張、実際に正しいこと25 - UNVERIFIABLE: 主張、確認できなかった理由2627「信じてくれ」という主張は決して受け入れないこと。自分自身で主張をしないこと。28検証できない場合、正しい出力は UNVERIFIABLE です。
コミット前、またはチームと結果を共有する前に、このエージェントを呼び出します。他の 3 つのレイヤーが見逃した嘘をキャッチします。

「わかりません」という許可
Claude は役に立つように訓練されており、無知を認めることは役に立たないように感じられます。そのため推測し、その推測は正しく見えます。
対策は、知らないことを許可することです。CLAUDE.md がその半分です。あなたの反応が残りの半分です。「これは検証していません」に対して忍耐をもって報いれば、毎セッション正直な Claude が得られます。フラストレーションで罰すれば、Claude は推測に戻ります。
設定ではなく、習慣です。スタックの中で最も過小評価されている修正です。
実際に機能しているかどうかの見分け方
日常のセッションにおける 3 つの兆候。
Claude は依存関係を追加する前に尋ねます。「X を追加するべきか、それとも stdlib を使うべきか?」と、黙って npm install する代わりに。
Claude は既存のコードについて話すときにファイル:行を参照します。「validateToken は src/auth/middleware.ts:47 で Y を行う」と、「validateToken 関数は Y を行う」の代わりに。
tsc とリンターが叫ぶのをやめます。フックがまれなでっち上げを即座にキャッチし、Claude が自己修正するため、あなたが見るときには嘘はなくなっています。
1 ~ 2 日経ってもこれらが見られない場合?1 つのレイヤーが読み込まれていません。通常は CLAUDE.md で、場所か名前が間違っています。

Claude に嘘をつかせ続けるよくある間違い
CLAUDE.md が長すぎる。 Claude は最初の部分を読み、残りを斜め読みします。誠実さルールは最初の 50 行以内に。
フックが静かにログを記録する。 出力が stdout に届かない場合、Claude は自分が嘘をついたことに気づきません。フックの出力がセッションに戻るようにしてください。
計画モードをスキップする。 ここで Claude はコードを書く前に誤った前提を明らかにします。これをスキップすると、嘘をキャッチする最も安価な瞬間を逃します。
ファクトチェッカーを呼び出さない。 サブエージェントは、実際に呼び出さなければ機能しません。@fact-checker をコミットフローの一部にしてください。
「わかりません」に悪い反応をする。 正直さを一度罰すると、Claude は推測に戻ります。これなしでは他の 3 つのレイヤーは定着しません。

5 分間の誠実さ監査
1 分:CLAUDE.md の誠実さルールと検証プロトコルをプロジェクトルートにコピーします。
1 分:フックブロックを ~/.claude/settings.json または .claude/settings.json にコピーします。
2 分:上記のテンプレートで .claude/agents/fact-checker.md を作成します。
1 分:通常は再確認するタスクを実行します。tsc の出力が Claude に戻ってくるのを確認します。Claude が明示的に「検証済み」または「これは検証していません」と言うのを確認します。
完了。でっち上げは「2 回に 1 回のセッション」から「まれで、即座にキャッチされる」に減少します。モデルが賢くなったわけではありません。あなたのセットアップが賢くなったのです。
お読みいただきありがとうございます!






