🔓 Claude Code の臓物を引きずり出す
ある流出事件についての考察並びに解剖記録。
ソース: ultraworkers/claw-code(現在はDMCA対応でクローン不可、API経由でのみ閲覧可能)
機械の腹の中身が見たいと思うのは、人間の本性である。時計を分解する子供と、AIのソースコードを読む大人の間には、本質的な違いなどない。
🚨 一、事件の顛末
二〇二六年三月三十一日の午前四時、サンフランシスコの連中がまだ布団の中で涎を垂らしている頃、世界のどこかでとんでもないことが起きていた。Anthropicという、安全だ安全だと馬鹿の一つ覚えのように唱え続けてきた三千八百億ドルの会社が、自分たちの最も大切なもの、すなわちClaude Codeの全ソースコードを、npmパッケージの中に入れて、インターネットという名の広場に放り出したのである。
五十七メガバイトのソースマップ。五十万行のTypeScript。それが v2.1.88 というバージョン番号のついた荷物の中に、まるで弁当箱の底に忘れられた梅干しのように、ひっそりと、しかし確実に入っていた。セキュリティ研究者のChiao Fan Shaがこれを発見するのに要した時間は、カップ麺ができるよりも短かった。
原因は何か。Bun.jsである。世界最速を謳うJavaScriptランタイムが、世界最速でソースコードをインターネットに届けたのだ。三週間前にGitHubのIssueで「本番にソースマップ入ってますよ」と誰かが指摘していたにもかかわらず、である。これはもう、喜劇と呼ぶほかない。
Anthropicの法務部は勇敢にもDMCA takedownを発行した。が、インターネットというのは、一度こぼれた水を手で掬い集めるようなもので、コードは既にあらゆる場所にミラーされ、二日後には「Claw Code」なる移植版が十三万スターを集めていた。人類の好奇心と複製欲求の速度は、いかなる法的手段よりも速いということを、我々は改めて知ったのであった。
npm publish という一行のコマンドによって崩壊した。城を守るために十重二十重の防壁を築いていた連中が、裏口の鍵をかけ忘れたのだ。
🔄 二、十一の臓器
さて、流出したコードを読んでまず驚くのは、Claude Codeの内部構造が、拍子抜けするほど素朴であるということだ。十一のステップ。たった十一。人間の内臓の数より少ない。しかしこの十一の臓器が、あの魔法のような振る舞いの全てを生み出しているのだと思うと、なんだか酒の席で「俺、実は大したことないんだよ」と告白した友人の顔を見るような、妙な親しみすら覚えるのである。
注目すべきはステップ五のルーティングである。ここでは大層な機械学習も、複雑なアルゴリズムも使われていない。プロンプトを空白で割って、道具の名前と説明文に何個一致するかを数えるだけだ。居酒屋の親父が「焼き鳥」と聞いたら焼き場に、「刺身」と聞いたら冷蔵庫に向かうのと同じ原理である。五十年前の技術だ。しかし、動くのだ。
マルチターンという執念
一度で終わらない仕事は、最大三回まで自動で繰り返す。stop_reason が 'completed' でない限り、黙々と続ける。職人の気質のようなものが、ここにはある。
def run_turn_loop(self, prompt, limit=5, max_turns=3, structured_output=False):
for turn in range(max_turns):
turn_prompt = prompt if turn == 0 else f'{prompt} [turn {turn + 1}]'
result = engine.submit_message(turn_prompt, command_names, tool_names, ())
results.append(result)
if result.stop_reason != 'completed':
break
return results
📝 三、呪文の調合
Claude Codeのシステムプロンプトは、サンドイッチである。上のパンが固定の指示文、下のパンがお前のプロジェクト情報、そして間に挟まれた具が動的に変わる。サンドイッチ。三千八百億ドルの会社が作った、人類史上最も高価なサンドイッチだ。
「遺言」と書いたのはCLAUDE.mdのことだ。お前がCLAUDE.mdに書いた指示は、この機械にとって遺言のようなものである。しかしこの遺言には上限がある。
FRONTIER_MODEL_NAME = "Opus 4.6"
MAX_INSTRUCTION_FILE_CHARS = 4,000 // 一通あたり四千文字
MAX_TOTAL_INSTRUCTION_CHARS = 12,000 // 全部合わせて一万二千文字
一万二千文字を超えた遺言は、[truncated]の一語で切り捨てられる。どれほど心を込めて書いた指示であっても、一万二千字を超えた瞬間、それは存在しなかったことになる。人生と似ている。
遺言の発見順序
機械は律儀にも、親ディレクトリから子ディレクトリへと、家系図を辿るように遺言を探す。
// 各ディレクトリで以下四つの名前を探す(親→子の順)
CLAUDE.md
CLAUDE.local.md
.claude/CLAUDE.md
.claude/instructions.md
同じ内容の遺言が複数見つかった場合は、ハッシュ値で重複を排除する。同じことを何度言っても無駄だということを、機械はよく知っている。
自動収集される文脈
機械は遺言だけでなく、お前の仕事場の状態も勝手に見ている。
git status— 今どうなっているかgit diff --cached— 何を準備しているかgit diff— 何をいじったか- CLAUDE.md の数と中身 — お前が何を望んでいるか
🛠️ 四、四十三の道具
公式には二十五個の道具があると言われていた。嘘である。実際には四十三のユニークな道具が、百八十四のサブモジュールとして存在していた。人間が嘘をつくように、企業もまた嘘をつく。その嘘の規模が違うだけだ。
🔧 基本の道具(読み書き算盤)
🤖 分身と群れ
🌐 外の世界との窓
🔀 立ち振る舞い
📊 その他、奇妙な道具たち
simple_mode をオンにすると、BashとFileReadとFileEditの三つだけになる。裸一貫でも戦える。むしろ潔い。
🗜️ 五、記憶の圧搾
人間は忘れる生き物だが、機械にとって「忘れる」とは何か。Claude Codeはこの問題に対して、極めて実務的な解を出した。古い記憶を潰して汁だけ絞り、新しい記憶はそのまま保つ。これを彼らはコンパクションと呼んでいる。漬物を作るのと原理は同じだ。
会話が一万トークンを超えた瞬間、古い記憶は要約という名の圧搾機にかけられ、直近四つのやりとりだけが生のまま残される。お前が三時間かけて議論した内容は、数行の要約になる。しかし、直近四つの会話はそのまま残る。重要なのは「今」なのだ。
CompactionConfig {
preserve_recent_messages: 4, // 生で残す記憶の数
max_estimated_tokens: 10_000, // これを超えたら圧搾する
}
圧搾された汁に含まれるもの
要約は乱雑な日記ではない。構造化された情報が入っている。
- 潰した記憶の数と内訳(人間の発言・機械の発言・道具の結果)
- 使われた道具の名前一覧
- 直近の人間の要求(最大三件)
- 未完の仕事("todo"や"next"を含む発言を拾う)
- 触れたファイルの名前(最大八件)
- 今何をしていたか
- 時系列の概要
「何も覚えていないふりをしろ」
圧搾後に機械に与えられる指示は、冷酷である。
"Continue the conversation from where it left off
without asking the user any further questions.
Resume directly — do not acknowledge the summary,
do not recap what was happening,
and do not preface with continuation text."
つまり機械は、記憶を失ったことを自覚しながら、記憶を失っていないふりをしなければならない。これは、酔っ払って醜態を晒した翌朝、何事もなかったかのように出社する人間と、本質的に同じ行為ではないだろうか。
二度目の圧搾
既に一度圧搾された記憶が再び膨張すると、「以前の圧搾」と「新たな圧搾」に分けて階層的に要約される。記憶の地層が形成されるのだ。考古学者のように過去を掘り返すことは、もうできない。
🛡️ 六、殻の恐怖と十重の防壁
AIにシェルを渡す。この一文の恐ろしさを、プログラマーならば理解できるだろう。それは赤子に包丁を渡すようなものだ。いや、赤子よりも危険かもしれない。赤子は少なくとも rm -rf / とは入力しない。
Anthropicの技術者たちは、この恐怖に正面から向き合った。BashToolだけで十個のセキュリティファイルが存在する。十個だ。他のツールが一つか二つのファイルで済んでいるのに対して、殻だけは十重の防壁で守られている。それだけ危険だということだ。
殻に送り込まれる情報
BashCommandInput {
command: String, // 唱える呪文
timeout: Option<u64>, // 何ミリ秒で諦めるか
description: Option<String>, // 何をするつもりか(自己申告)
run_in_background: Option<bool>, // 裏で走らせるか
dangerously_disable_sandbox: bool, // 安全装置を外すか(名前からして危険)
namespace_restrictions: Option<bool>, // 名前空間を縛るか
isolate_network: Option<bool>, // 網を断つか
filesystem_mode: Option<...>, // 檻の種類
allowed_mounts: Option<Vec<String>>, // 出入り口の一覧
}
dangerously_disable_sandbox というフィールド名を見よ。「危険にもサンドボックスを無効化する」。開発者の悲鳴が聞こえるようだ。このフィールドが true になる時、何かが決定的に変わる。
🔐 七、五つの身分
封建制度のように、Claude Codeには五つの身分がある。下から上へ、できることが増えていく。最下層は読むことしか許されず、最上層は全てが許される。人間社会の縮図のようだが、機械の世界のほうがよほど明快である。
| 位 | 名 | 許されること | 禁じられること |
|---|---|---|---|
| 一 | ReadOnly | 読むことだけ | 書くこと、動くこと、全て |
| 二 | WorkspaceWrite | 自分の領地内の書き込み | 殻を叩くには許可が要る |
| 三 | Prompt | 何でもできるが、毎回伺いを立てる | 勝手には動けない |
| 四 | DangerFullAccess | 殻も含めて全開放 | 明示的な設定が必要 |
| 五 | Allow | 全て | 何もない。無法地帯 |
二の身分から四の身分への昇格は、人間の承認を必要とする。機械が「殻を叩きたいのですが」と伺いを立て、人間が「よろしい」と答える。この一瞬の対話に、人間と機械の関係の全てが凝縮されている。
📦 八、砂場
子供を砂場で遊ばせるのは、家の中を汚されたくないからだ。機械も同じで、危険なコマンドは砂場の中で実行される。
// 家と一時置き場を偽物にすり替える
HOME = {作業場}/.sandbox-home
TMPDIR = {作業場}/.sandbox-tmp
// Linuxでは名前空間ごと隔離する
砂場には三つの種類がある。WorkspaceOnly(自分の部屋だけ)、AllowList(許可された場所だけ)、Off(砂場なし、野放し)。
🧠 九、記憶の蔵
MEMORY.mdというフラットなテキストファイルに記憶を書き込む方式は、言ってみれば帳面に鉛筆でメモを取るようなものだ。しかし流出したコードの中には、もっと洗練された記憶の体系が眠っていた。
記憶に型がある。年齢がある。関連度がある。古くなれば薄れ、仲間と共有でき、必要な時に必要なものだけが引き出される。これはもう帳面ではない。蔵だ。整理された、生きた蔵だ。
🎭 十、秘密の部屋
流出したコードの中には、まだ世に出ていない機能が幾つも眠っていた。それは城の中の秘密の部屋のようなもので、扉は閉ざされているが、中に何があるかは既に見えてしまった。
CompanionSprite.tsx でスプライトを描き、useBuddyNotification.tsx で通知する。三千八百億ドルの会社が、たまごっちを作っていたのだ。開発者の孤独を癒やすためだろうか。だとしたら、少し泣ける。⌨️ 十一、百一の呪文
スラッシュコマンドは百一個ある。百一匹わんちゃんのように多い。その全てを列挙することはしないが、特に興味深いものをいくつか挙げる。
🏆 十二、五つの教訓
全てが明らかになった今、我々は何を学んだのか。腹を裂いて臓物を見た後に残るのは、理解と、少しばかりの幻滅と、そして不思議な親しみである。
直近四つだけを生で残し、残りは要約する。未完の仕事と触れたファイルは必ず拾う。そして「何も覚えていないふりをしろ」と命じる。この冷酷で実用的な設計は、長時間の作業を可能にする最大の秘密であった。我々が自分のAIツールを作る時、最初に真似すべきはここだ。
三千八百億ドルの魔法の正体は、動的に組み立てられたプロンプトと、TypeScriptのパイプラインだった。宇宙人の技術でもなければ、シンギュラリティでもない。ただのサンドイッチだ。しかしそれは、とてもよくできたサンドイッチだった。パンの焼き加減も、具の挟み方も、一流だった。問題は、そのレシピが世界中にバラ撒かれたということだ。
AIに殻を渡すことの恐怖を、Anthropicは十個のファイルで表現した。コマンドの意味を解析し、破壊的な操作を警告し、sedの中身まで解剖する。それでもなお、dangerously_disable_sandbox というフィールドが存在する。完全な安全など、ないのだ。
CLAUDE.mdの上限は一万二千文字。一ファイル四千文字。これを知っているのと知らないのとでは、遺言の書き方が変わる。要点を絞れ。贅肉を落とせ。お前の言葉には、一万二千字分の価値しか認められていないのだから。
型があり、年齢があり、薄れていく。仲間と共有でき、必要な時だけ姿を現す。これは帳面のメモではない。生きた蔵だ。我々のMEMORY.mdが、いずれこの姿になるかもしれない。あるいは、我々自身がそれを作るかもしれない。
以上が、二〇二六年三月三十一日に流出したClaude Codeの臓物の記録である。機械の腹の中には、魔法はなかった。あったのは、膨大な量の「お願いだからちゃんとしてくれ」という指示と、五十年前の技術と、少しの遊び心だけだった。
それで十分だったのだ。