著者:ユケル
2026年3月31日、セキュリティ研究者のChaofan Shouは、Anthropicがnpmに公開したClaude Codeパッケージからソースマップファイルが削除されていないことを発見した。
これはつまり、クロード・コード氏のTypeScriptのソースコード全体(51万2000行、1903ファイル)がインターネット上に公開されたことを意味する。
数時間で全てのコードを読み通すことは到底不可能だったので、私は以下の3つの疑問を念頭に置いてソースコードに取り組んだ。
Claude Codeと他のAIプログラミングツールとの根本的な違いは何ですか?
なぜ彼は他の人よりもコーディングの「感覚」に優れているのか?
51万行のコードには何が隠されているのか?
それを読んで最初に思ったのは、 「これはAIプログラミングアシスタントではなく、オペレーティングシステムだ」ということだった。
まず、一つの話をさせてください。もしあなたがリモートプログラマーを雇ったとしたら
リモートでプログラマーを雇い、彼に自分のコンピューターへのリモートアクセス権限を与えることを想像してみてください。
あなたは何をしますか?
あなたがカーソル操作者なら、こうします。彼をあなたの隣に座らせ、彼がコマンドを入力する前に、彼をちらっと見て「許可」をクリックします。シンプルで分かりやすいですが、彼から目を離さないようにする必要があります。
あなたがGitHub Copilotエージェントであれば、次の手順に従ってください。新しい仮想マシンをエージェントに提供し、自由に実験できるようにします。実験が完了したら、エージェントはコードをコミットし、あなたはそれをレビューしてマージします。セキュリティは確保されていますが、エージェントはあなたのローカル環境を見ることはできません。
Claude Codeを使用している場合:
あなたは彼に直接あなたのコンピュータを使わせているが、同時に非常に高度なセキュリティシステムも構築している。彼ができることとできないこと、どの操作にあなたの承認が必要か、どの操作を彼自身が行えるか、さらには`rm -rf`コマンドの使用でさえ、実行前に9段階の審査が必要となる。
これらは全く異なる3つのセキュリティ哲学です。
なぜアントロピックは最も困難な道を選んだのか?
このようにすることで初めて、AIはあなたの端末、環境、そして設定を利用して動作できるようになります。これこそが真の意味での「あなたのためにコードを書く」ことであり、「クリーンルームであなたのためにコードを書いて、それをコピーする」ことではありません。
しかし、その費用はどれくらいだったのか?彼らはそのために51万行ものコードを書いたのだ。
II. クロード・コードに対するあなたの認識と実際のクロード・コードとの違い
ほとんどの人は、AIプログラミングツールを次のようなものだと想像するでしょう。
クロード・コードの正式名称は以下のとおりです。
きっと皆さん、一番上に何が入っているのか気になっていることでしょう。ご安心ください、一つずつ分解していきましょう。
第三に、最初の秘密:手がかりとなる単語は書き留めるのではなく、「組み立てる」のです。
src/constants/prompts.tsを開くと、次の関数が表示されます。
export async function getSystemPrompt( tools: Tools, model: string, additionalWorkingDirectories?: string[], mcpClients?: MCPServerConnection[], ): Promise<string[]> { return [ // --- 静态内容(可缓存)--- getSimpleIntroSection(outputStyleConfig), getSimpleSystemSection(), getSimpleDoingTasksSection(), getActionsSection(), getUsingYourToolsSection(enabledTools), getSimpleToneAndStyleSection(), getOutputEfficiencySection(), // === 缓存边界=== ...(shouldUseGlobalCacheScope() ? [SYSTEM_PROMPT_DYNAMIC_BOUNDARY] : []), // --- 动态内容(每次不同)--- ...resolvedDynamicSections, ].filter(s => s !== null) }SYSTEM_PROMPT_DYNAMIC_BOUNDARYに気づきましたか?
これはキャッシュ境界です。境界より上のコンテンツは静的です。Claude APIはトークンコストを節約するためにこれをキャッシュできます。境界より下のコンテンツは動的です。現在のGitブランチ、CLAUDE.mdプロジェクト構成、以前に記憶するように指示した設定など、操作のたびに変化します。
それはどういう意味ですか?
Anthropicはプロンプトを最適化のためのコンパイラ出力として扱います。静的な部分は「コンパイル済みバイナリ」であり、動的な部分は「実行時パラメータ」です。このアプローチの利点は次のとおりです。
費用対効果が高い:静的データはキャッシュされるため、二重請求を防ぐことができます。
高速:キャッシュヒットはこれらのトークンの処理を直接スキップします。
柔軟性:動的な要素により、各会話が現在の環境を認識できるようになります。
⛏️各ツールには専用の「ユーザーマニュアル」が付属しています
さらに驚いたのは、各ツールディレクトリにprompt.tsファイル、つまりLLMユーザー向けに特別に作成されたユーザーマニュアルが含まれていたことだ。
BashToolのファイル(src/tools/BashTool/prompt.ts、370行目付近)をご覧ください。
これは人間向けに書かれた文書ではなく、 AI向けに書かれた行動規範です。これらのルールは、Claude Codeが起動されるたびにシステムプロンプトに組み込まれます。
これが、Claude Code が `git push --force` を恣意的に呼び出さない理由です。一部のツールはそうしますが、これはモデルがより賢いからではなく、プロンプトにルールが明確に示されているからです。
さらに、Anthropicの内部バージョンは、あなたが使用しているバージョンとは異なります。
このコードには、以下のような多数の分岐が含まれています。
Antとは、Anthropic社内のスタッフを指します。彼らのバージョンには、より詳細なコードスタイルガイドライン(「理由が明確でない限りコメントを書かない」)、より積極的な出力戦略(「逆ピラミッド型の記述」)、そして現在A/Bテスト中の実験的な機能(検証エージェント、探索&計画エージェント)が含まれています。
これは、Anthropic社自身がClaude Codeの最大ユーザーであることを示している。彼らは自社製品を使って自社製品を開発しているのだ。
第四に、第二の秘密:42種類のツールがあるが、これは氷山の一角に過ぎない。
src/tools.tsを開くと、ツールレジストリが表示されます。
ツールは42種類ありますが、そのほとんどは直接目にすることはありません。これは、多くのツールが遅延ロードされるためです。つまり、LLMが必要としたときにToolSearchToolを介してオンデマンドで挿入されるのです。
なぜこれをするのか?
追加ツールごとにシステムプロンプトの説明が別途必要となり、トークンにも追加料金が発生するためです。Claude Codeでコードの1行だけを修正したいだけであれば、「スケジュールされたタスクスケジューラ」や「チームコラボレーションマネージャー」を読み込む必要はありません。
さらに賢いデザインがあります。
CLAUDE_CODE_SIMPLE=trueを設定すると、Claude CodeはBash、ファイル読み込み、ファイル編集の3つのツールのみに絞り込まれます。これはミニマリスト向けの裏口と言えるでしょう。
1️⃣ すべての工具は同じ工場で製造されています。
デフォルト値に注意してください。isConcurrencySafe のデフォルト値は false で、isReadOnly のデフォルト値も false です。
これはフェイルクローズド設計と呼ばれ、ツールの作成者がセキュリティ属性を宣言し忘れた場合、システムは「安全ではなく、書き込み可能」とみなします。リスクを見落とすよりは、過度に保守的である方が良いのです。
2️⃣「まず読んでから修正する」という鉄則
FileEditToolは、FileReadToolを使用して既にファイルを読み込んでいるかどうかを確認します。読み込んでいない場合は、エラーを報告し、変更を阻止します。
だからこそ、Claude Codeは一部のツールのように「何もないところからコードを生成してファイルを上書きする」ようなことはしないのです。変更する前に理解しておく必要があるからです。
第五に、第三の秘密:記憶システム――なぜ記憶があなたを「覚えている」のか
Claude Codeを使ったことがある人なら誰でも共通して言えることが一つある。それは、Claude Codeがまるで自分のことをよく理解しているように感じられるということだ。
「テストでデータベースをモックしないでください」と指示すれば、次の会話でもモックは行われません。「私はバックエンドエンジニアで、Reactは初心者です」と指示すれば、フロントエンドコードの説明にバックエンドのアナロジーを用いるようになります。
その背後には、完全なメモリシステムが存在する。
1️⃣ AIを使って思い出を呼び起こす
クロード・コードは、別のAI (クロード・ソネット)を使用して、「現在の会話に関連する記憶はどれか」を判断する。
これはキーワードマッチングでもベクトル検索でもなく、小さなモデルがすべてのメモリファイルのタイトルと説明を素早くスキャンし、最も関連性の高いファイルを最大5つ選択し、それらの全内容を現在の会話の文脈に挿入するというものです。
この戦略は「想起よりも正確さ」を重視するものであり、文脈を汚染する無関係な記憶を含めるよりも、潜在的に有用な記憶を見逃す方が良い。
⏰KAIROSモード:夜間の「夢」
ここが一番SFっぽいと感じる部分です。
コードにはKAIROSという機能フラグがあります。このモードでは、長時間のセッションのデータは構造化ファイルではなく、日付ベースの追記専用ログに保存されます。その後、「夜間」(アクティビティの少ない時間帯)に/dreamスキルが実行され、これらの生ログが構造化されたトピックファイルに抽出されます。
AIは「睡眠中」に記憶を整理する。これはもはや工学ではなく、バイオニクスだ。
第六、第五の秘密:それはエージェントではなく、グループである...
Claude Codeに複雑なタスクを依頼すると、次のような処理が静かに行われている可能性があります。
サブエージェントが生成されました。
さらに、サブエージェントは、再帰的にサブエージェントを生成することを防ぐために、厳格な「自己認識」注入機能を備えている。
このコードは、「あなたは従業員であって、管理者ではない。他の人を雇うことなど考えず、自分で仕事をしなさい」と言っているのです。
👤コーディネーターモード:マネージャーモード
コーディネーターモードでは、Claude Codeは純粋なタスクオーケストレーターとなり、タスクの割り当て以外何も行いません。
基本原則はコードのコメントに記載されています。
「並列処理はあなたのスーパーパワーです」読み取り専用の調査タスク:並列で実行します。ファイル書き込みタスク:ファイルごとにグループ分けして直列で実行します(競合を回避します)。
🗣️プロンプトキャッシュの最適化
子エージェントのキャッシュヒット率を最大化するために、フォークされたすべての子エージェントのツール結果には同じプレースホルダーテキストが使用されます。
理由は、Claude APIのプロンプトキャッシュがバイトレベルのプレフィックスマッチングに基づいているからです。10個のサブエージェントのプレフィックスバイトが完全に同一であれば、最初のサブエージェントのみが「コールドスタート」を必要とし、残りの9個は直接キャッシュにアクセスします。
これは1回の通話あたり数セントの節約になる最適化だが、大規模に利用すれば大幅なコスト削減につながる。
VII.第六の秘密:3層圧縮により、セリフが「決して制限を超えない」ことを保証する
すべてのLLM(ローカルリーダーモジュール)には、コンテキストウィンドウの制限があります。会話が長くなるほど、また過去のメッセージが増えるほど、制限を超える可能性が高くなります。
Claude Codeはこの目的のために3層構造の圧縮設計を採用しています。
1️⃣ 第1層:マイクロコンプレッション – 最小限のコスト
export async function microcompactMessages(messages, toolUseContext, querySource) { // 时间触发:如果上次交互已过很久,服务器缓存已冷const timeBasedResult = maybeTimeBasedMicrocompact(messages, querySource) if (timeBasedResult) return timeBasedResult // 缓存编辑路径:通过API 的缓存编辑功能直接删除旧内容if (feature('CACHED_MICROCOMPACT')) { return await cachedMicrocompactPath(messages, querySource) } }マイクロ圧縮は古いツール呼び出しの結果にのみ影響し、「 10 分前に読み込まれた 500 行のファイルの内容」を「古いツールの結果内容がクリアされました」に置き換えます。
プロンプトと主要な会話内容は完全に保持されています。
2️⃣ 第二層:自動圧縮 – アクティブ収縮
トークンの消費量がコンテキストウィンドウ(ウィンドウサイズ - 13,000バッファ)の87%に近づくと、自動的にトリガーされます。サーキットブレーカーが実装されており、圧縮試行が3回連続で失敗すると、試行が停止し、無限ループを防ぎます。
3️⃣ 第3層:完全圧縮 – AI概要
AIは会話全体の要約を生成し、過去のメッセージをすべてその要約に置き換えます。要約を生成するための厳密な事前コマンドがあります。
なぜそんなに厳格なのか?それは、AIが要約処理中に再びツールを呼び出すと、さらに多くのトークンを消費してしまい、逆効果になるからです。この指示は基本的に「あなたの仕事は要約することです。それ以外のことは一切しないでください」と言っているのです。
圧縮トークン予算:
ファイル復元:50,000トークン
ファイルあたりのトークン数は最大5,000個です。
スキル要件:25,000トークン
これらの数字は単なる恣意的なものではなく、「作業を継続するために十分なコンテキストを維持すること」と「新しいメッセージを受け取るための十分な余地を確保すること」とのバランスを表している。
8. このソースコードを読んで、私は何を学んだか?
1️⃣ AIエージェントの作業負荷の90%は「AI」以外のものです。
51万行のコードのうち、実際にLLM APIを呼び出しているのは5%未満です。残りの95%は何に使われているのでしょうか?
セキュリティチェック(単一のBashToolにつき18ファイル)
アクセス制御システム(許可/拒否/確認/通過の4段階意思決定)
コンテキスト管理(3層圧縮+AIメモリ検索)
エラー回復(サーキットブレーカー、指数バックオフ、トランスクリプトの永続化)
マルチエージェント連携(群知能オーケストレーション+電子メール通信)
UIインタラクション(140個のReactコンポーネント+IDEブリッジ)
パフォーマンス最適化(起動時のキャッシュ安定性向上+並列プリフェッチ)
AIエージェント製品を開発しているなら、これが本当に解決すべき問題です。重要なのは、モデルが十分に賢いかどうかではなく、その基盤となる構造が十分に頑丈かどうかです。
2️⃣ 良いプロンプトワードプロジェクトは体系的なプロジェクトです。
単に素敵なプロンプトを書くだけでは不十分です。クロードコードのヒントは次のとおりです。
7層動的アセンブリ
各ツールには専用のユーザーマニュアルが付属しています。
キャッシュ境界の正確な定義
内部バージョンと外部バージョンでは、命令セットが異なります。
キャッシュの安定性を保つため、ツールのソート順は固定されています。
これは、手作業ではなく、設計された迅速な管理方法です。
3️⃣ 失敗するように設計されている
各外部依存関係には、対応する障害対応戦略があります。
4️⃣AnthropicはClaude Codeをオペレーティングシステムのように扱っています。
42ツール = システムコール権限システム = ユーザー権限管理スキルシステム = アプリストア MCPプロトコル = デバイスドライバエージェントスウォーム = プロセス管理コンテキスト圧縮 = メモリ管理トランスクリプト永続性 = ファイルシステム
これは「チャットボットにいくつかのツールを追加しただけのもの」ではなく、LLMカーネルを搭載したオペレーティングシステムです。
要約する
51万行のコード。1,903個のファイル。1つのBashツールに18個のセキュリティファイル。
9段階の審査はすべて、AIが安全に単一のコマンドを入力できることを保証するためのものです。
これがAnthropicの答えです。AIを真に役立つものにするには、檻に閉じ込めることも、無防備に放置することもできません。AIのために完全な信頼システムを構築する必要があるのです。
この信頼システムのコストは、51万行のコードに相当する。

