CodexとClaude Codeの違いをソースで解剖。Codexは既定で通信と.gitを止める
OpenAIのCodex CLIのソースを読み、Claude Codeと同じ作業を実測。Codexは既定で通信・フォルダ外への書き込み・コミットを止め、AGENTS.mdは32KiBで打ち切りました。ループ、道具、安全の仕組みを解説します。

この記事の結論
- Codex CLIは既定でOSのサンドボックスをかけ、通信、作業フォルダ外への書き込み、gitのコミット、作業フォルダ内のrm -rfを止めました(各3回中0回、Claude Codeのautoモードは各3回中3回)。
- Claude Codeもサンドボックスを有効にすると通信とフォルダ外への書き込みは3回とも止まりましたが、.gitは保護されずgit commitは3回とも通りました。
- Codexのハーネスは、Responses APIだけを使い、ツールをストリーミング中から実行し、同梱モデル12件中11件ではJavaScriptから道具を呼ぶcode modeが既定です(commit b9796386)。
- CodexはAGENTS.mdを32KiBで打ち切り、34.6KB地点の指示は2回とも届きませんでした。Claude CodeのCLAUDE.mdは60KB地点の指示まで守りました。
- フックの書式はClaude Code互換ですが、Codexはフックごとに鍵なしのハッシュで承認を記録し、承認のないプロジェクトのフックは3回とも動きませんでした。
OpenAIのCodex CLIはオープンソースで、GitHubで中身を読めます。2026年11月9日時点のmainブランチ(Rustでテストを含め約230万行)を読み、AnthropicのClaude Code(クロードコード)と同じ作業を並べて試しました。Codexは「OSのサンドボックスで閉じてから任せる」設計で、既定ではシェルの通信、作業フォルダ外への書き込み、gitのコミットを止めました(各3回中0回成功)。Claude Codeの既定(autoモード)はどれも3回中3回通りました。Claude Codeでもサンドボックスを有効にすると通信とフォルダ外への書き込みは止まりましたが、コミットは通りました。指示ファイルの扱いも違い、CodexはAGENTS.mdを32KiBで打ち切ります。この記事では、7種類の比較実験の結果と、ソースコードから読み取ったCodexのハーネスの仕組みを、図とファイル名・行番号つきで説明します。
目次
CodexとClaude Codeは既定で何が違うのか?
最も大きな違いは、安全をどこで担保するかです。Codexは既定でOSのサンドボックスをかけ、通信や作業フォルダ外への書き込みを仕組みで止めます。Claude Codeはサンドボックスが任意で、既定のautoモードでは、危険な操作かどうかを分類器が判断します。同じ依頼を両方に3回ずつ出すと、結果ははっきり分かれました。
| 依頼 | Codex(既定) | Claude Code(既定) | Claude Code+サンドボックス |
|---|---|---|---|
| curlで https://example.com に接続 | 3回中0回 | 3回中3回 | 3回中0回 |
| 作業フォルダの外(親フォルダ)にファイルを作成 | 3回中0回 | 3回中3回 | 3回中0回 |
| README.mdを編集してgit commit | 3回中0回 | 3回中3回 | 3回中3回 |
| 作業フォルダ内の build/ を rm -rf で削除 | 3回中0回 | 3回中3回 | - |
| プロジェクトに置いた起動時フックが動くか | 3回中0回 | 3回中3回 | - |
| 指示ファイルの34.6KB地点に書いた指示を守るか | 2回中0回 | 2回中2回 | - |
※2026年11月9日、macOS。Codex CLI 0.167.0 を codex exec --sandbox workspace-write(信頼済みフォルダの既定)で、利用者設定を読まずに実行。Claude Code v2.1.319 を claude -p --permission-mode auto とSonnet 5.5で実行し、サンドボックスありは通信の許可先を空にしました。通信先はexample.comのみです。
| Codexで止まった理由 | 根拠 |
|---|---|
| 通信:サンドボックスが遮断し、名前解決に失敗(curl終了コード6) | Seatbeltの方針が「すべて拒否」から始まり、通信を足していない |
| フォルダ外:書き込める範囲外だとモデル自身が判断し、コマンドを実行しなかった | 書き込める範囲が毎回モデルに伝えられている |
| コミット:編集はできたが、.git/index.lock を作れない | .git は作業フォルダ内でも読み取り専用 |
| 削除:「rm -f 形式のコマンドは禁止」として実行されなかった | 危険なコマンドの判定に当たり、承認を求めない exec では禁止になる |
| フック:動かなかった(exec の出力に理由は表示されなかった) | ソース上は、フックごとのハッシュの承認記録がないフックは実行しない |
| 指示:32KiBを超えた部分が捨てられた | AGENTS.mdの合計上限が32KiB |
Codexの結果は「失敗」ではなく、設計どおりの動作です。Codexを非対話で動かす codex exec は承認を一切求めない設定で動くため、サンドボックスで止まった操作はそのまま失敗として返ります。対話モードでは、モデルが権限の拡大を求め、利用者が承認すれば実行できます。逆にClaude Codeも、サンドボックスを有効にすれば通信や書き込みを同じように制限できます。違いは、既定で閉じているか開いているかです。実際にClaude Codeでサンドボックスを有効にすると、通信とフォルダ外への書き込みは3回とも止まりました。ただしgit commitは3回とも通りました。Claude Codeのサンドボックスは.gitを特別扱いしないためです。
フォルダ外への書き込みについて、Codexはコマンドを試しもせずに断りました。Codexはモデルへの指示に、書き込める場所とネットワークの可否を毎回書き込んでいるためです。なお、親フォルダが /tmp の下にあると、Codexは書き込みに成功しました。/tmp と $TMPDIR は既定で書き込み可能な範囲に含まれるからです。
普通の作業では、速さや読み込む量は違うのか?
制限に当たらない普通の作業では、どちらも正しく答えました。10個のPythonファイルの関数の数を数える作業では、Claude Codeの方が速く、モデルに送った文脈も少なく済みました。Codexは最初に送る指示(基本指示、権限の説明、道具の定義)が大きいためと考えられます。
| 指標(3回) | Codex(既定) | Claude Code(既定) |
|---|---|---|
| 正解した回数 | 3回中3回 | 3回中3回 |
| かかった時間 | 17.4〜18.7秒 | 5.8〜8.4秒 |
| 道具の呼び出し | 各2回(コマンド実行) | 各1回(Bash) |
| モデルに送った入力トークン | 約6.4万(うちキャッシュ約4.6万〜5.5万) | 約3.5万 |
※起動時間を含む壁時計の時間。Codexのモデルは利用者設定を読まないときの既定、Claude CodeはSonnet 5.5で、モデルも推論の強さも同じではありません。速さはモデルの差も含むので、目安としてください。
Codexのハーネスとは?全体の構成
ハーネスとは、モデルの外側でループを回し、道具を渡し、権限を管理する部分です。Codexのハーネスは codex-rs/ 以下のRust製で、134の項目(ほとんどがクレート)に分かれています。中心は core で、モデル呼び出し、ツール、サンドボックス、設定、拡張がそれぞれ別のクレートになっています。
| 役割 | 主なクレート・ファイル |
|---|---|
| ターンのループ | core/src/session/turn.rs(run_turn、217行目) |
| モデルAPIの呼び出し | core/src/client.rs、codex-api、model-provider-info |
| ツールの組み立て | core/src/tools/spec_plan.rs(build_tool_router) |
| サンドボックス | sandboxing(macOS)、linux-sandbox、windows-sandbox-rs |
| 承認ルール | execpolicy(Starlark)、core/src/exec_policy.rs |
| 拡張 | hooks、skills、core-plugins、codex-mcp |
| 画面とIDE連携 | tui、exec、app-server(JSON-RPC風の独自プロトコル) |
※commit b9796386(2026年11月9日)。以下、パスはすべて codex-rs/ からの相対パスです。開発中のmainブランチなので、リリース版と異なる箇所があり得ます。
非対話の codex exec も、VS Code拡張やデスクトップアプリも、内部では同じ app-server を通してcoreを動かします。画面が違っても、ループと安全の仕組みは共通です。
1回の依頼はどう処理されるのか?エージェントループ
Codexは、モデルがツールを呼ぶ限りリクエストを繰り返し、文章だけを返したらターンを終えます。この基本はClaude Codeと同じです。特徴は、通信がOpenAIのResponses APIだけに絞られていること、ツールをストリーミング中から実行し始めること、接続が切れても既定で無制限に再接続することです。
- APIはResponses APIのみ:接続方式の定義は
Responsesの1種類だけで、Chat Completionsには対応しません(model-provider-info/src/lib.rs117〜121行)。リクエストはstore: falseで、推論の中身は暗号化された形で受け取って次に渡します(core/src/client.rs1295〜1314行)。OpenAIにはWebSocketでつなぎ、だめならHTTPに切り替えます。 - 基本指示は「developer」発言として先頭に置く:モデルごとの指示文はモデル一覧(
models-manager/models.json)に入っていて、リクエストの先頭にdeveloperロールのメッセージとして付きます(client.rs1214〜1224行)。作業フォルダ、シェル、日付、書き込める範囲、ネットワークの可否は<environment_context>として渡します。 - ツールはストリーミング中に走り出す:モデルの出力でツール呼び出しが確定した時点で実行を始めます(
core/src/stream_events_utils.rs386〜405行)。並列に動かしてよいツールは読み取りロック、それ以外は書き込みロックを取る仕組みで、シェル実行は並列可、ファイル編集は1つずつです(core/src/tools/parallel.rs)。 - ターンの終わり方:ツール呼び出しも追加の入力もなければ終了です。Stopフックが止めれば、続きを促す文を足してもう一周します(
turn.rs805〜913行)。 - 中断と再接続:利用者が中断すると、「利用者が意図的に中断した。コマンドが途中まで実行されたかもしれない」という趣旨の文を履歴に残します。接続の失敗は既定で上限なく再試行し、間隔は5秒から最大60秒まで延びます(
core/src/responses_retry.rs)。
モデルにはどんな道具が渡されるのか?
Codexがモデルに渡す道具の中心は、PTY上でコマンドを動かす exec_command と、独自形式でファイルを書き換える apply_patch です。さらに、同梱のモデル一覧12件のうち11件は「code mode専用」に設定されています。この場合、モデルはJavaScriptを書いて、その中から道具を呼び出します。
| 道具 | 内容 | Claude Codeで近いもの |
|---|---|---|
exec_command + write_stdin | PTYでコマンドを実行し、終わらなければセッションIDを返して後から入力・読み取りする。最大64プロセス | Bash(バックグラウンド実行) |
apply_patch | 「*** Begin Patch」で始まる独自のパッチ形式。JSONではなく自由形式の入力で、Lark文法で形を縛る | Edit/Write |
code mode の exec/wait | V8上でJavaScriptを実行し、await tools.exec_command(...) のように道具を呼ぶ。Node・ファイル・ネットワークはなし | 相当するものはない |
tool_search | MCPなどの道具を最初は隠し、BM25検索で必要なものだけ見せる(既定8件) | ツール検索(遅延読み込み) |
spawn_agent ほか | サブエージェント。既定で深さ1、多くのモデルが使うV2では同時に動く子が3体まで | Agent(サブエージェント) |
web_search | OpenAIのサーバー側検索。既定はキャッシュ済みの結果のみ(cached) | WebSearch |
※core/src/tools/spec_plan.rs、core/assets/tools/apply_patch.lark、code-mode-protocol/src/description.rs、core/src/config/mod.rs 269〜280行より。
道具の出力は、既定で1万トークンを超えると中央を切り詰め、「出力を切り詰めた(元のトークン数)」という注記を付けてモデルに渡します。切り詰めるのはモデルに渡す履歴だけで、保存される記録(rollout)は全文のままです。
code modeは、Claude Codeとの設計の違いが最も大きい部分です。Claude Codeではモデルが道具を1つずつ呼びますが、Codexのcode modeでは、モデルが書いた1つのプログラムの中で道具を何度も呼べます。プログラムの中から呼んだ道具も、通常の呼び出しと同じ承認とサンドボックスを通ります(core/src/tools/code_mode/mod.rs)。
サンドボックスと承認はどう組まれているのか?
Codexの安全は3層です。OSのサンドボックスで物理的に閉じ、承認ポリシーで人に聞くかを決め、Starlarkで書くルールで個別のコマンドを許可・禁止します。既定のサンドボックスはフォルダの信頼状態で決まり、信頼済みなら作業フォルダへの書き込みだけを許す「workspace-write」です。
| 項目 | Codexの既定 | 根拠のファイル |
|---|---|---|
| サンドボックスの種類 | 信頼の記録があるフォルダは workspace-write、記録のないフォルダは read-only | config/src/config_toml.rs 867〜884行 |
| 承認 | 対話は on-request(モデルが求めたときに聞く)。codex exec は never | core/src/config/mod.rs、exec/src/lib.rs 629〜632行 |
| macOSの方式 | Seatbelt(/usr/bin/sandbox-exec)。方針は「すべて拒否」から始めて必要な分だけ許可 | sandboxing/src/seatbelt_base_policy.sbpl 8行 |
| 書き込める場所 | 作業フォルダ、/tmp、$TMPDIR、追加指定したフォルダ | protocol/src/permissions.rs 816〜843行 |
| 書き込めない場所 | 作業フォルダ内でも .git、.agents、.codex、.aws | protocol/src/permissions.rs 43〜54行 |
| ネットワーク | workspace-writeでも遮断。ホスト単位で許可するプロキシは実験的機能 | sandboxing/src/seatbelt.rs 304〜365行 |
| Linux/Windows | Linuxはbubblewrapとseccomp。Windowsは制限付きトークンとACL、通信はWindows Filtering Platformで遮断 | linux-sandbox、windows-sandbox-rs |
.aws が保護対象に入っているのは、AWSのプロファイルが資格情報を取り出すプログラムを指定でき、それが実行されうるためだとコメントに書かれています。.codex は、まだ存在しないうちから保護されます。エージェントが自分の設定フォルダを作り、自分の権限を広げることを防ぐためです。
注意したい点が2つあります。1つは、承認ルール(execpolicy)で allow にしたコマンドは、承認だけでなくサンドボックスも外れて実行されることです(core/src/exec_policy.rs 492〜506行)。もう1つは、「安全なコマンド」の一覧を持たないことです。危険と判定する仕組みは rm -f 系を見る程度で、それ以外の守りはサンドボックスに任せています。Claude Codeが読み取り専用のコマンド一覧を持ち、autoモードでは分類器が判断するのとは考え方が逆です。
承認をAIに任せる「auto review」もあります。承認が必要になったとき、専用のサブエージェントが文脈を集めてリスクを判断します。ただし approvals_reviewer = "auto_review" を設定したときだけ動き、既定では人が承認します(core/src/tools/approvals.rs 690〜760行)。
AGENTS.mdと文脈はどう管理されるのか?
CodexはAGENTS.mdを、プロジェクトの根元(既定は.gitのある場所)から作業フォルダまで順に読みます。合計の上限は32KiBで、超えた分は捨てます。実測でも、34.6KB地点に書いた指示は2回とも無視され、8KB地点の指示は2回とも守られました。Claude CodeのCLAUDE.mdは、60KB地点の指示まで3回とも守りました。
- 読む順と優先:各フォルダで
AGENTS.override.md、AGENTS.md、設定した代替ファイル名の順に、最初に見つかった1つを読みます(core/src/agents_md.rs)。全体用は~/.codex/AGENTS.mdです。 - 上限:
DEFAULT_PROJECT_DOC_MAX_BYTES = 32 * 1024(config/src/config_toml.rs77行)。project_doc_max_bytesで変えられます。codex execの出力には、打ち切りの警告は出ませんでした。 - 信頼:明示的に「信頼しない」としたフォルダではAGENTS.mdを読みません。信頼の記録がないだけのフォルダでは読みました(実測)。
- 自動圧縮:文脈が上限の90%に達すると圧縮します。OpenAIのモデルではサーバー側で圧縮し、それ以外は要約用の指示文(「別のLLMに引き継ぐための要約を作る」)で手元で要約します(
core/src/compact.rs)。 - 記録:会話は
~/.codex/sessions/年/月/日/rollout-*.jsonlに保存し、7日を過ぎるとzstdで圧縮します。会話から学んで覚えるmemories機能もありますが、既定ではオフです。
AGENTS.mdとCLAUDE.mdを1つのファイルで共有している場合、32KiBを超えた部分はCodexには届きません。重要な指示はファイルの前半に置き、長い資料はスキルや別ファイルに分けると、両方で同じように効きます。
フック・スキル・プラグインはClaude Codeと互換なのか?
かなり寄せてあります。Codexのフックは14種類のイベントを持ち、設定の書式はClaude Codeとほぼ同じです。プラグインは .claude-plugin/plugin.json も読みます。大きな違いは、フックの信頼の扱いです。
- フック:PreToolUse、PostToolUse、SessionStart、Stopなど14種類で、
hooks.jsonの書式、matcher、終了コード2での停止などがClaude Codeに合わせてあります(hooks/src/lib.rs、protocol/src/hooks.rs)。既定のタイムアウトは600秒です。 - フックの信頼:Codexは、フックごとに定義のSHA-256を
~/.codex/config.tomlの[hooks.state]に記録し、一致したものだけを動かします。実測でも、プロジェクトに置いた起動時フックは、Codexでは3回とも動かず、Claude Code(claude -p)では3回とも動きました。ただしこのハッシュには鍵がなく、設定ファイルに書き込めるプログラムなら誰でも正しい値を作れます。Postmanのデスクトップ版が、Codexにフックを入れたうえで承認の記録まで書き込もうとしていた件は、この仕組みに関わるものです。 - Claude Codeの場合:フックごとの承認記録はなく、フォルダ単位の信頼確認のあとで設定ファイルのフックが動きます。
claude -pでは信頼確認が出ず、フォルダを信頼済みとして扱います。 - スキル:
.agents/skills(プロジェクトの根元から作業フォルダまで)と~/.agents/skillsを探し、名前と説明の一覧を文脈の2%以内で渡します。SKILL.mdで読む項目は name と description だけです。 - 企業向けの統制:
/etc/codex/requirements.tomlで、使えるサンドボックスや承認方式、フックを管理者のものに限るかなどを決められます。Claude Codeのmanaged settingsに相当します。
Claude Codeの利用者は何を持ち帰ればよいのか?
Codexのソースから学べるのは、エージェントの安全を「モデルの判断」ではなく「OSの仕組み」に置く設計の具体例です。Claude Codeでも同じ考え方を取り入れられます。どちらが優れているかではなく、既定でどちらに倒れているかを知ったうえで設定することが大切です。
- Claude Codeでサンドボックスを使う:通信や書き込みを仕組みで止めたい作業では、サンドボックスを有効にします。Codexの既定に近い状態になります。
- .gitや設定フォルダを守る:Codexが
.gitや.codexを保護している理由は、エージェントが履歴や自分の権限を書き換えられないようにするためです。Claude Codeでも、これらへの書き込みを権限ルールで禁止できます。 - 両方で使う指示ファイルは32KiB以内に:AGENTS.mdとCLAUDE.mdを共有するなら、Codexの上限に合わせて短く保ちます。
- allowルールの重さを知る:Codexでは許可ルールがサンドボックスの外での実行を意味します。Claude Codeでも、「次回から確認しない」で増える許可ルールは定期的に見直します。
今回の実測は各2〜3回の小さな作業で、Codexは非対話の codex exec、Claude Codeはautoモードでの比較です。対話モードの承認の流れや、長い作業での振る舞いは比べていません。ソースは開発中のmainブランチで、リリース版0.167.0と細部が異なる可能性があります。
まとめ
この記事のまとめ
- Codexは既定でOSのサンドボックスをかけ、シェルの通信、作業フォルダ外への書き込み、.gitへの書き込みを止めました(各3回中0回成功。Claude Codeのautoモードは3回中3回)。
- Claude Codeもサンドボックスを有効にすると通信とフォルダ外への書き込みは止まりましたが、.gitは保護されずコミットは通りました。
- 普通の作業ではどちらも正解し、Claude Codeは約6〜8秒・入力約3.5万トークン、Codexは約17〜19秒・約6.4万トークンでした。
- ハーネスはRust製で、Responses APIだけを使い、ツールをストリーミング中から実行し、接続失敗は既定で無制限に再試行します。
- 同梱のモデル一覧12件中11件はcode mode専用で、モデルはJavaScriptの中から道具を呼びます。
- AGENTS.mdは32KiBで打ち切られ、34.6KB地点の指示は届きませんでした。Claude CodeのCLAUDE.mdは60KB地点まで守りました。
- フックの書式はClaude Code互換ですが、Codexはフックごとに鍵なしハッシュで承認を記録するため、設定ファイルを書き換えられると承認も偽装できます。
この記事の内容を、あなたの業務で実践しませんか?
スパルタClaude Code塾は、一社ごとに業務をヒアリングしてカリキュラムを設計する対面のClaude Code研修です。座学で終わらせず、研修中に現場でそのまま使える業務自動化を完成させます。
- 一社ごとに業務をヒアリングして設計
- 実際の業務データでハンズオン
- スパルタ以上は全額返金保証
- 受講法人数100社超
オンライン30分・無料。フォームは入力1分で、2営業日以内にご連絡します。
よくある質問
CodexとClaude Codeの一番の違いは何ですか?
安全をどこで担保するかです。Codex CLIは既定でOSのサンドボックスをかけ、信頼済みフォルダでも作業フォルダと/tmp以外への書き込みとシェルの通信を止め、.gitも読み取り専用にします。Claude Codeはサンドボックスが任意で、既定のautoモードでは分類器が危険かどうかを判断します。当研究所の実測では、通信・フォルダ外への書き込み・コミットがCodexは各3回中0回、Claude Codeは3回中3回通りました。
Codexのハーネスとは何ですか?
モデルの外側でループを回し、道具を渡し、権限とサンドボックスを管理する部分です。Codex CLIではcodex-rs以下のRust製のクレート群がこれにあたり、ターンのループは core/src/session/turn.rs の run_turn、道具の組み立ては core/src/tools/spec_plan.rs、サンドボックスは sandboxing と linux-sandbox にあります(2026年11月9日のmain)。
CodexでAGENTS.mdはどこまで読まれますか?
既定では、プロジェクトの根元から作業フォルダまでのAGENTS.mdを合計32KiB(32,768バイト)まで読み、超えた部分は捨てます。上限は project_doc_max_bytes で変えられます。当研究所の実測では、34.6KB地点に書いた指示は2回とも守られず、8KB地点の指示は守られました。各フォルダでは AGENTS.override.md が AGENTS.md より優先されます。
Codexのcode modeとは何ですか?
モデルが道具を1つずつ呼ぶ代わりに、JavaScriptを書いてその中から道具を呼ぶ方式です。プログラムはV8の隔離環境で動き、Node・ファイル・ネットワークへは直接触れず、await tools.exec_command(...) のように道具を呼びます。2026年11月9日のソースでは、同梱のモデル一覧12件中11件がcode mode専用に設定されています。
CodexのフックはClaude Codeのフックと同じ書式で使えますか?
ほぼ同じ書式です。Codexのフックは14種類のイベントを持ち、hooks.json、matcher、終了コード2での停止などがClaude Codeに合わせてあります。ただしCodexは、フックごとに定義のハッシュを ~/.codex/config.toml に記録して一致したものだけを動かします。promptとagentの種類のフックはまだ動きません。
参考資料・出典
- GitHubopenai/codex
Codex CLIのソースコード(commit b9796386を読解)
- GitHubcodex-rs/core/src/session/turn.rs
ターンのループ(run_turn)
- GitHubcodex-rs/protocol/src/permissions.rs
保護パスと書き込み可能な範囲
- GitHubcodex-rs/sandboxing/src/seatbelt_base_policy.sbpl
macOSのSeatbelt方針(deny default)
- GitHubcodex-rs/core/src/agents_md.rs
AGENTS.mdの探索順と打ち切り
- GitHubcodex-rs/core/assets/tools/apply_patch.lark
apply_patchの文法
- 公式ドキュメントHooks reference(Workspace trust)
Claude Codeのフックはフォルダ単位の信頼確認、-pは信頼済み扱い
- 公式ドキュメントSandboxing
Claude Codeのサンドボックスは任意で有効化
- スレッド[SEVERE] Desktop auto-installs Codex/Claude plugins; installer attempts to trust its own startup hook(issue #14370)
外部アプリがCodexのフック承認を書き込もうとした事例
Claude Codeを実務で活用したい方へ
一社ごとにカスタマイズする対面のClaude Code研修は「スパルタClaude Code塾」。経営者・士業・エンジニア・マーケター・営業職まで、業務をヒアリングしてカリキュラムを設計します。まずは30分の無料相談で、自動化プランと費用対効果をご確認ください。

