エンジニアリングの制御:『エージェントファースト』の世界でCodexを活用する
OpenAIのチームが、GPT-5を搭載したCodex CLIを用いて、人間が一切コードを書かずに5ヶ月で約100万行のコードを生成し、内部ベータ版ソフトウェア製品を構築・リリースした実験と、その過程で得られた「エージェント優先」開発手法に関する知見を報告している。
キーポイント
人間ゼロコードでの大規模開発実証
3名のエンジニアがCodexを駆動し、5ヶ月間で約100万行のコードを生成、約1500のPRを処理して、内部ユーザー向けのソフトウェア製品のベータ版を構築・リリースした。
「エージェント優先」開発パラダイムの確立
人間の役割がコード記述から、エージェントが効果的に働ける環境(ツール、抽象化、フィードバックループ)の設計と意図の明確化へと移行した新しいソフトウェア工学の形を実践した。
コンテキストエンジニアリングとスキャフォールディングの重要性
エージェントの効率性を最大化するため、巨大なマニュアルではなく、構造化された「地図」としての知識ベース(docs/ディレクトリ)と、UI操作や観測可能性スタックへの直接アクセスを提供するスキャフォールドを構築した。
自律的な「エージェント対エージェント」レビューとQA
PRレビューやQA(品質保証)のボトルネックを解消するため、Codexに自身の変更をレビューさせ、他のエージェントによるレビューを依頼する自律的なワークフローを構築し、人間の時間と注意力という希少資源の制約を克服した。
文档与知识库的工程化治理
通过专门的Linter、CI任务和定期的“文档园丁”智能体,机械化地验证和更新知识库,确保文档与代码行为一致,并强制执行结构合规与交叉链接正确性。
架构约束作为智能体效率的倍增器
围绕严格的架构模型(如分层领域架构)构建应用,通过自定义Linter和结构测试机械化执行边界与依赖规则,为智能体提供可预测的结构,避免架构漂移。
上下文内化与渐进式披露原则
将关键上下文(如设计决策、团队共识)推入版本化仓库,使智能体可直接访问;采用渐进式披露方式,让智能体从小而稳定的入口点开始,逐步获取所需信息,避免信息过载。
影響分析・編集コメントを表示
影響分析
この記事は、AIが単なるコーディングアシスタントを超えて、自律的なソフトウェア開発の主役となる可能性を示す重要な実証例である。ソフトウェアエンジニアリングのプロセス、必要なスキル、組織構造に根本的な変革を迫る内容であり、業界の開発パラダイムを「エージェント優先」へとシフトさせる可能性が高い。
編集コメント
「人間がコードを書かない」という制約が、逆説的に開発の自動化と高速化を推し進めた点が興味深い。単なる技術デモではなく、数百人のユーザーを抱える実製品の開発に適用した点で説得力が高い。
過去五ヶ月、私たちのチームは実験を行いました:人工による記述がゼロ行という内部ベータ版のソフトウェア製品を構築し、公開することです。
この製品には内部の日次アクティブユーザーもいれば、外部のアルファテスターもいます。通常通りリリースされ、デプロイされ、クラッシュもし、修復もされました。唯一の違いは、アプリケーションロジック、テスト、CI 設定からドキュメント、観測性モニタリング、社内ツールに至るまで、すべてのコード行が Codex によって記述されたという点です。推計によると、これらすべてを完了するまでの時間は、純粋な手書きコーディングの十分の一に過ぎませんでした。
私たちはあえてこの制限を選びました。それは、工程速度を数桁向上させるための必要な基盤を構築することを強いるためです。数週間で最終的に百万行規模のコードを持つシステムを納品するためには、ソフトウェアエンジニアリングチームの主要な仕事がコードを書くことではなく、環境を設計し、意図を明確化し、Codex エージェント (Agents) が信頼して動作できるようにフィードバックループを構築することにシフトしたときに何が変わるのかを理解する必要があります。
この記事は、エージェントチームに頼って新製品を構築した経験から得た教訓——何が崩壊し、何が複利効果を生み、そして唯一真に希少なリソースである人間の時間と注意力をどう最大化するか——を記録しています。
私たちは空の Git リポジトリから始めました
2025 年 8 月下旬、空のリポジトリに最初のコミットが行われました。
初期のスクラッチ(スキャフォールディング)——リポジトリ構造、CI 設定、フォーマットルール、パッケージマネージャーの設定、そしてアプリケーションフレームワーク——はすべて、Codex CLI が GPT-5 の駆動により、少数の既存テンプレートに基づいて生成しました。エージェントがリポジトリ内でどのように動作するかを指示する初期の AGENTS.md ファイルさえもそうです。
システムには事前保存された人間のコードによるアンカー(拠り所)はありませんでした。最初からこのリポジトリはエージェントによって形成されました。
五ヶ月後、リポジトリにはアプリケーションロジック、インフラストラクチャ、ツールチェーン、ドキュメント、および内部開発ユーティリティを含め、約百万行のコードが蓄積されました。その間、Codex を駆使したエンジニアはわずか三人で、約 1,500 の PR(Pull Requests)を処理しマージしました。計算すると、一人のエンジニアが毎日平均 3.5 の PR を処理したことになります。驚くべきことに、チームが七人に拡大してもスループットはさらに向上しました。重要なのは、これは単なる数値稼ぎではないということです:数百人の内部ユーザーがこの製品を使用しており、その中には毎日重度に使用するコアユーザーも含まれています。
開発プロセス全体を通じて、人間が直接コードを貢献したことはありませんでした。これがチームの中心的な信条となりました:決して手動でコードを書かないこと。
自らコードを書くことをやめることは、システム、スキャフォールディング、レバレッジ(てこ効果)に焦点を当てた新しいタイプのエンジニアリングワークを生み出しました。
初期の進展は予想よりも遅れました。Codex の能力不足ではなく、環境定義が不十分だったのです。エージェントには、高レベルな目標を推進するために必要なツール、抽象化層、および内部構造がありませんでした。エンジニアリングチームの最優先課題は「エージェントへの権限付与」であり、彼らに価値ある作業を行わせることでした。
具体的には、「深さ優先」のアプローチを採用しました:大きな目標をより小さなブロック(設計、コーディング、レビュー、テストなど)に分解し、プロンプティング (Prompting) を通じてエージェントにこれらのブロックを構築させ、それらを解き放つことでより複雑なタスクへと繋げます。タスクが失敗した場合の修復策は決して「もう一度試す」ことではありません。作業を進める唯一の方法が Codex に手を動かさせることである以上、人間のエンジニアは介入し、「何が不足しているのか?この能力をどのようにすればエージェントにとって読み取り可能かつ実行可能にできるか?」と自問する必要があります。
人間はほぼ完全にプロンプトを通じてシステムと対話します:エンジニアがタスクを記述し、エージェントを実行して PR を提出させます。PR を完了させるために、Codex にローカルで自身の変更をレビューさせ、特定のクラウドまたはローカルのエージェントに再レビューを依頼し、人間や他のエージェントからのフィードバックに応じ、すべてのエージェントレビュアーが満足するまで循環的に反復することを指示しました(本質的にはラルフ・ウィグム (Ralph Wiggum) ループです)。Codex は標準的な開発ツール(gh、ローカルスクリプト、リポジトリ内蔵のスキル)を直接使用してコンテキストを取得し、人間が CLI でコピー&ペーストする必要はありません。
人間は PR をレビューできますが、必須ではありません。時間が経つにつれて、レビュー作業の大部分を「エージェント対エージェント」の相互レビューモードに委ねるようになりました。
コードのスループットが増加するにつれ、ボトルネックは人間の QA(品質保証)の精力に移行しました。制約要因が人間の時間と注意力である以上、私たちはエージェントがシステムをより深く知覚できるように強化することに注力し、アプリケーションの UI、ログ、メトリクスを Codex が直接「読み取れる」ようにしました。
例えば、各 Git Worktree で独立してアプリケーションを起動できるようにすることで、Codex は変更ごとにインスタンスを起動し、それを駆動できるようになります。また、Chrome DevTools プロトコルをエージェントランタイムに統合し、DOM スナップショットの取得、スクリーンショットの撮影、ナビゲーション処理などのスキルを実装しました。これにより、Codex はバグの再現や修正の検証、そして UI 動作そのものの推論が可能になります。

観測性ツールについても同様のアプローチを採用しています。ログ、メトリクス、分散トレーシングは、各 Worktree に対して一時的なローカル観測性スタックを通じて Codex に公開されます。Codex は完全に隔離されたアプリケーションバージョン上で作業を行い、タスク完了後は関連するログやメトリクスも同時に破棄されます。エージェントは LogQL を用いてログをクエリし、PromQL を用いてメトリクスをクエリできます。これらの文脈があれば、「サービスの起動時間を 800ms 未満に保つ」や「主要な 4 つのユーザーパスにおけるトレーススパンを 2 秒以内に抑える」といったプロンプトも扱いやすくなります (Tractable)。

Codex の単一実行が、通常は人間が睡眠中に行われる 6 時間以上にわたって一つのタスクを処理し続ける様子も珍しくありません。
リポジトリの知識を「唯一の信頼できる情報源」として構築する
コンテキストエンジニアリング (Context Engineering) は、エージェントが大規模で複雑なタスクを効果的に処理するための最大の課題の一つです。私たちが最初に学んだシンプルな教訓は、Codex に 1000 ページにも及ぶ説明書を与えるのではなく、地図を提供することです。
コンテキストリソースは希少です。膨大な説明書は、タスクの説明、コード、関連ドキュメントのためのスペースを圧迫し、結果としてエージェントが重要な制約を見落としたり、誤った目標を最適化したりする原因となります。
過度な指示は、指示がないのと同じです。すべてが「重要」である場合、何も重要ではなくなります。その結果、エージェントは意識的なグローバルナビゲーションを行うのではなく、局所的なパターンマッチングに陥ってしまいます。
ドキュメントはすぐに陳腐化します。モノリス型の説明書は、もはや有効ではないルールの墓場へと変貌します。エージェントは何が正しいのかを区別できず、人間によるメンテナンスが行われなくなれば、ファイルは魅力的なトラブルの種となります。
検証が困難です。巨大なテキストブロックでは、カバレッジ、鮮度、所有権、クロスリンクなどの機械的なチェックが難しく、現実との乖離は避けられません。
したがって、AGENTS.md ファイルにリポジトリの知識をすべて詰め込むのではなく、構造化された docs/ ディレクトリ内に主要な知識庫を構築します。
AGENTS.md ARCHITECTURE.md docs/ ├── design-docs/ │ ├── index.md │ ├── core-beliefs.md │ └── ... ├── exec-plans/ │ ├── active/ │ ├── completed/ │ └── tech-debt-tracker.md ├── generated/ │ └── db-schema.md ├── product-specs/ │ ├── index.md │ ├── new-user-onboarding.md │ └── ... ├── references/ │ ├── design-system-reference-llms.txt │ ├── nixpacks-llms.txt │ ├── uv-llms.txt │ └── ... ├── DESIGN.md ├── FRONTEND.md ├── PLANS.md ├── PRODUCT_SENSE.md ├── QUALITY_SCORE.md ├── RELIABILITY.md └── SECURITY.md
設計ドキュメントは目録化・索引付けされ、検証ステータスと「エージェント優先」の操作原則を定義するコア信念が含まれます。アーキテクチャドキュメント(Architecture Document)は、ドメインとパッケージ階層のトップレベルマップを提供します。品質ドキュメントでは、各製品領域とアーキテクチャレイヤーに対してスコアリングを行い、時間経過に伴うギャップを追跡します。
「計画」はファーストクラス citizen として扱われます。小規模な変更には一時的で軽量な計画が用いられ、複雑な作業は実行計画(Execution Plans)に記録され、進捗と意思決定のログが含まれてリポジトリにチェックインされます。アクティブな計画、完了した計画、既知の技術的負債はすべてバージョン管理され、一緒に配置されることで、エージェントが外部コンテキストに依存せずに操作できるようになります。
これにより漸進的な開示(Progressive Disclosure)が実現します。エージェントは小さく安定したエントリポイントから始め、最初から情報で圧倒されるのではなく、次にどこを見るべきかを教えられるのです。
私たちはこれを機械化によって強制しています。専用のリンターと CI タスクが、ナレッジベースの最新性、クロスリンクの正確さ、構造のコンプライアンスを検証します。また、コードの実際の動作を反映しなくなった過剰なドキュメントをスキャンして修正 PR を提出する定期的な「ドキュメント・ガーデナー」エージェントも存在します。
コードベースが進化するにつれて、Codex の設計意思決定フレームワークも進化しなければなりません。
リポジトリが完全にエージェントによって生成されるため、まず Codex による可読性の最適化が行われます。チームが新入りのエンジニアにコードを理解させるために最適化するのと同様に、私たち人間エンジニアの目標は、エージェントがリポジトリそのものからビジネスドメイン全体のロジックを直接推論できるようにすることです。
エージェントにとって、実行時にコンテキストから取得できない情報は、実質的に存在しないのと同じです。Google Docs やチャットログ、あるいは人の頭脳に保存された知識にはシステムはアクセスできません。見えているのはリポジトリローカルのバージョン管理されたアーティファクト(コード、Markdown、スキーマ、実行可能な計画)のみです。

私たちは、時間とともにリポジトリにコンテキストを徐々に押し込む必要があることに気づきました。例えば、Slack 上でアーキテクチャパターンについてチームが合意した内容であっても、エージェントが発見できないのであれば、新入社員が入社して3ヶ月経ってもその事実を知らないのと同じくらい無効です。
Codex により多くの文脈を与えることは、組織化して適切な情報を公開し、一時的な指示で埋め尽くすのではなく、その情報に基づいて推論できるようにすることです。新入りのチームメンバーに製品原則やエンジニアリング規範、チーム文化(さらには絵文字の好みまで)を紹介するのと似ています。これらの情報を智能体(エージェント)に提供することで、より一貫した成果が得られます。
このフレームワークは多くのトレードオフを明確にします。私たちは、リポジトリ内で完全に内化・推論可能な依存関係や抽象化を好みます。「地味」と呼ばれる技術ほど、コンポーザビリティが高く、API が安定しており、トレーニングデータセットでの出現頻度が高いため、智能体によってモデル化されやすい傾向があります。場合によっては、不透明な外部ライブラリの挙動を迂回するよりも、一部の機能を智能体に再実装させる方がコストが低くなることもあります。例えば、汎用的な p-limit ライブラリを導入しませんでした。
システムのより多くの部分を、智能体が直接チェック・検証・修正できる形式に変換することは、Codex のレバレッジ効果を高めるだけでなく、コードベース上で作業する他の智能体(Aardvark など)にも恩恵をもたらします。
文書だけでは、完全に智能体によって生成されたコードベースの一貫性を維持することはできません。実装の詳細を細かく管理するのではなく、不変性(Invariants)を強制することで、基盤を損なうことなく快速に成果物を提供できるようにしています。例えば、Codex には境界でデータ形状を解析させるよう要求していますが、具体的な方法までは指定していません(モデルは Zod を好むようですが、そのライブラリを指定したわけではありません)。
厳格な境界と予測可能な構造を持つ環境において、智能体は最も効率的に動作します。そのため、私たちは厳格なアーキテクチャモデルを中心にアプリケーションを構築しています。各ビジネスドメインは固定された階層に分割され、厳密に検証された依存関係の方向性と限られた許可されるエッジ(接続点)を持ちます。これらの制約は、カスタム Linter(もちろん Codex によって生成されたものです!)と構造テストによって機械的に強制されます。
以下の図はこのルールを示しています:各ビジネスドメイン(アプリケーション設定など)内では、コードは「Types → Config → Repo → Service → Runtime → UI」という固定された層に対してのみ、「前方」に依存することができます。認証、コネクタ、テレメトリ、機能フラグなどの横断的関心事項は、一意の明示的なインターフェースである Providers を通じてのみアクセス可能です。それ以外の依存関係は禁止されており、機械によって強制されます。

このようなアーキテクチャは、通常数百名のエンジニアを抱える組織になってから導入されるものです。しかし、コーディング用の智能体にとっては、これは早期の前提条件です。まさにこれらの制約こそが、速度を維持しつつ腐敗やアーキテクチャのドリフトを防ぐことを可能にしています。
実際には、私たちはカスタム Linter と構造テスト、そして少量の「品味に関する不変性」を組み合わせてこれらのルールを執行しています。例えば、構造化ログ記録、スキーマと型の命名規則、ファイルサイズの制限、特定のプラットフォームにおける信頼性の要件などを静的に強制しています。Linter はカスタムであるため、エラーメッセージを作成する際に、修復指示を直接智能体の文脈に注入します。
人間中心のワークフローでは、これらのルールは古風あるいは制約的に見えるかもしれません。しかし、智能体にとっては増幅器となります:一度コード化されれば、それらはすべての場所で同時に適用されます。
同時に、どこで制約が重要で、どこで重要でないかを明確に区別しています。これは大規模なエンジニアリングプラットフォーム組織を率いるのに似ています:中央では境界を強制し、地方では自治を許可します。あなたは境界、正確性、再現性を深く懸念しますが、その境界内では、チーム(または智能体)が解決策の表現方法において大きな自由度を持つことを許容します。
生成されたコードは必ずしも人間のスタイルの好みに合致するわけではありませんが、それは問題ありません。出力が正しく、保守可能であり、将来の智能体にとって「明確に見える」ものであれば、要件を満たしています。
人間の「品味」はシステムに継続的にフィードバックされます。レビューコメント、PR のリファクタリング、ユーザー向けのバグは、ドキュメントの更新として捕捉されるか、あるいは直接ツールにコード化されます。ドキュメントが行動を規範化するのに不十分な場合、ルールはコードへと昇格します。
Codex のスループットが増加するにつれ、多くの従来のエンジニアリング規範が逆効果になりつつあります。
リポジトリの運用では、ブロック的なマージの障壁を最小限に抑えます。PR の生存期間は非常に短くなります。テストの不安定性(フラッキ)は、通常、無限に進行を阻害するのではなく、後続の実行によって解決されます。人間の注意力を遥かに上回るスループットを持つシステムでは、修正は安価ですが、待機は高価です。
低スループット環境では、このアプローチは無責任と見なされるでしょう。しかしここでは、これが通常は正しいトレードオフとなります。
コードベースが Codex エージェントによって生成されると言うとき、私たちはコードベース内のすべてを指しています。
評価ハーンセス(Evaluation harnesses)
人間は常にループ内(Human-in-the-loop)にいますが、私たちは過去よりも高い抽象レベルで作業を行っています。私たちが担当するのは優先順位の決定、ユーザーフィードバックの受入基準への変換、そして結果の検証です。エージェントが struggling するときは、それをシグナルとして捉え、不足しているもの——ツール、ガードレール、ドキュメント——を特定し、これらのフィードバックをリポジトリに戻します。もちろん、修正作業自体は Codex が自ら記述します。
エージェントは私たちが使用する標準的な開発ツールを直接利用します。彼らはレビューフィードバックを取得し、行内で返信し、更新をプッシュし、頻繁に自分自身の PR を圧縮してマージ(Squash and merge)します。
テスト、検証、レビュー、フィードバック処理と回復といった多くの開発サイクルがシステム内に直接コード化されるにつれ、リポジトリは最近、画期的な閾値を越えました。Codex はエンドツーエンドで新機能を駆動できるようになったのです。
プロンプトを与えられれば、エージェントは現在、以下のようなことができます:
この動作は、リポジトリ固有の構造とツールに強く依存しており、同様の投資なしに他の場所で再利用できるとは現時点では仮定できません。
完全なエージェントの自律性も新たな問題をもたらします。Codex はリポジトリ内に既に存在するパターン——不均衡なものや最適化されていないものさえも——を複製します。時間が経つにつれ、これは必然的にドリフト(drift)を引き起こします。
当初は人間が手動でこの問題に対処していました。私たちのチームは過去、毎週金曜日(つまり週の 20% の時間)に「AI スロップ(AI slop)」の掃除を行っていました。当然のことながら、これはスケーラブルではありませんでした。
その代わり、私たちはいわゆる「ゴールデンルール」をリポジトリに直接コード化し、循環的なクリーンアッププロセスを構築しました。これらの原則は独断的かつ機械的な規則であり、コードベースが将来のエージェント実行に対して明確で一貫性を持つように維持することを目的としています。例えば:(1) 不変性の集中を保つため、手書きのヘルパー関数よりも共有されたツールキットを優先します。(2) データを「YOLO スタイル」で試行しません——境界を検証するか、型付けされた SDK に依存し、エージェントが推測に基づく形状に基づいて誤ってコードを構築しないようにします。一定のリズムで、一組のバックグラウンド Codex タスクが逸脱をスキャンし、品質スコアを更新し、ターゲットを絞ったリファクタリング PR を開始します。ほとんどの PR は 1 分以内にレビューされ、自動的にマージされます。
これはガベージコレクション(GC)メカニズムに似ています。技術的負債は高利貸しのようであり、継続的な少額返済が、利子がついて膨れ上がり、苦痛を伴う一度きりの解決よりも常に優れています。人間の品味は一度捕捉され、その後すべてのコード行で継続的に強制されます。これにより、不良パターンが数日または数週間コードベースに蔓延するのを防ぐのではなく、毎日発見して解決することが可能になります。
この戦略は、OpenAI 内部での公開と採用の段階において効果的でした。実際のユーザー向けに真のプロダクトを構築することは、投資を実際の文脈に固定し、長期的な保守性へと導くのに役立ちました。
完全なエージェント生成システムにおいて、アーキテクチャの一貫性が数年間にわたってどのように進化するかについては、まだ分かっていません。私たちは、人間の判断力がどこで最大のレバレッジを生み出すか、そしてその判断力を複利効果を生むようにコード化する方法をまだ学習中です。また、モデルの能力が時間とともに強化されるにつれてこのシステムがどう進化するかについても不明です。
現時点で明確なのは、ソフトウェア構築には依然として規律が必要であるという事実ですが、その規律はコードそのものよりも「足場」に多く現れます。コードベースの一貫性を保つためのツール、抽象化、フィードバックループは、ますます重要になっています。
現在、私たちの最も困難な課題は、エージェントが私らの目標を達成するための環境、フィードバックループ、および制御システムの設計に集中しています:大規模で複雑かつ信頼性の高いソフトウェアの構築と維持です。
Codex などのエージェントがソフトウェアライフサイクルのより大きな部分を担うようになるにつれ、これらの問題はますます重要になっていきます。私たちが共有するこれらの初期経験が、どこに注力すべきかを考える際の参考となり、あなたが創造することに集中できる(just build things)ことを願っています。




原文を表示
过去五个月,我们团队开展了一项实验:构建并发布一款软件产品的内部 Beta 版,其中 0 行代码由人工编写。
这款产品既有内部日活用户,也有外部 Alpha 测试者。它照常发布、部署,会崩溃,也能修复。 唯一不同的是,每一行代码——从应用逻辑、测试、CI 配置,到文档、可观测性监控和内部工具——皆由 Codex 编写。据估算,我们完成这一切的时间,仅为纯手工编码的十分之一。
我们刻意选择这一限制,旨在倒逼自己构建必要的体系,将工程速度提升数个量级。要在几周内交付最终达百万行代码的系统,我们需要搞清楚:当软件工程团队的主要工作不再是写代码,而是设计环境、明确意图、建立反馈循环,以便让 Codex 智能体 (Agents) 可靠地工作时,一切会发生什么变化。
本文记录了我们依靠智能体团队构建全新产品的经验教训——什么崩溃了,什么产生了复利,以及如何最大化利用唯一真正稀缺的资源:人类的时间和注意力。
我们从一个空的 Git 仓库开始
2025 年 8 月下旬,空仓库迎来了第一次提交。
最初的脚手架——包括仓库结构、CI 配置、格式化规则、包管理器设置和应用框架——均由 Codex CLI 在 GPT-5 的驱动下,依据少量现有模板生成。甚至连指导智能体如何在仓库中工作的初始 AGENTS.md
系统没有任何预存的人类代码作为锚点。从一开始,这个仓库就是由智能体塑造的。
五个月后,仓库已积累约一百万行代码,涵盖应用逻辑、基础设施、工具链、文档和内部开发实用程序。期间,仅三名工程师驱动 Codex,就处理并合并了约 1,500 个 PR(Pull Requests)。折算下来,每位工程师每天平均处理 3.5 个 PR。令人惊讶的是,随着团队扩至七人,吞吐量反而提升了。重要的是,这并非为了刷数据:数百名内部用户正在使用该产品,其中不乏每天重度使用的核心用户。
整个开发过程中,人类从未直接贡献过任何代码。这成了团队的核心信条:绝不手动写代码。
不再亲手写代码,催生了一种侧重于系统、脚手架和杠杆效应的新型工程工作。
早期进展比预期慢。并非 Codex 能力不足,而是环境定义不够具体。智能体缺乏推进高层目标所需的工具、抽象层和内部结构。工程团队的首要任务变成了“赋能智能体”,让它们开展有价值的工作。
具体来说,我们要采取“深度优先”的策略:将大目标拆解为更小的积木(设计、编码、评审、测试等),通过提示词 (Prompting) 引导智能体构建这些积木,再利用它们解锁更复杂的任务。当任务失败时,修复办法绝不是“再试一次”。既然推进工作的唯一途径是让 Codex 动手,人类工程师总要介入并反问:“缺少什么能力?如何让这种能力对智能体既可读又可执行?”
人类几乎完全通过提示词与系统交互:工程师描述任务,运行智能体,让它提交 PR。为了完成 PR,我们指示 Codex 在本地评审自己的变更,请求特定的云端或本地智能体复审,响应人类或智能体的反馈,并循环迭代直到所有智能体评审员都满意(本质上就是个 Ralph Wiggum 循环)。Codex 直接使用我们的标准开发工具(gh、本地脚本和仓库内置技能)获取上下文,无需人类在 CLI 中复制粘贴。
人类可以评审 PR,但非必须。随着时间推移,我们将绝大部分评审工作都推给了“智能体对智能体”的互评模式。
随着代码吞吐量提升,瓶颈变成了人类 QA(质量保证)的精力。既然限制因素是人类的时间和注意力,我们就致力于增强智能体对系统的感知能力,让应用程序的 UI、日志和指标能被 Codex 直接“读懂”。
例如,我们让应用支持在每个 Git Worktree 中独立启动,这样 Codex 就能为每次变更启动并驱动一个实例。我们还将 Chrome DevTools 协议接入智能体运行时,并创建了处理 DOM 快照、截图和导航的技能。这使得 Codex 能够重现 Bug、验证修复并直接推理 UI 行为。

在可观测性工具上也如法炮制。日志、指标和链路追踪都通过一个本地的可观测性栈暴露给 Codex,该栈对每个 Worktree 都是临时的。Codex 在一个完全隔离的应用版本上工作——任务完成后,相关的日志和指标也会随之销毁。智能体可以用 LogQL 查询日志,用 PromQL 查询指标。有了这些上下文,像“确保服务启动时间低于 800ms”或“这四个关键用户路径中的链路跨度不超过 2 秒”这样的提示词就变得易于处理 (Tractable) 了。

我们经常看到单次 Codex 运行持续处理一个任务长达六个多小时(通常是在人类睡觉的时候)。
将仓库知识打造为“单一事实来源”
上下文工程 (Context Engineering) 是让智能体有效处理庞大复杂任务的最大挑战之一。我们最早学到的一个简单教训是:给 Codex 一张地图,而不是一本 1000 页的说明书。
上下文资源稀缺。 巨大的说明文件会挤占任务描述、代码和相关文档的空间——导致智能体要么忽略关键约束,要么优化了错误的目标。
过多的指导等于没有指导。 当一切都“重要”时,就没什么是重要的了。智能体最终会陷入局部模式匹配,而不是有意识地进行全局导航。
文档即刻腐烂。 单体式的说明书会变成过时规则的坟场。智能体分不清什么是对的,人类不再维护,文件就变成了一个诱人的麻烦。
难以验证。 一个巨大的文本块难以进行机械化检查(如覆盖率、新鲜度、所有权、交叉链接),因此偏离现实在所难免。
因此,我们不把 AGENTS.md
仓库的知识库主要存在于结构化的 docs/
AGENTS.md ARCHITECTURE.md docs/ ├── design-docs/ │ ├── index.md │ ├── core-beliefs.md │ └── ... ├── exec-plans/ │ ├── active/ │ ├── completed/ │ └── tech-debt-tracker.md ├── generated/ │ └── db-schema.md ├── product-specs/ │ ├── index.md │ ├── new-user-onboarding.md │ └── ... ├── references/ │ ├── design-system-reference-llms.txt │ ├── nixpacks-llms.txt │ ├── uv-llms.txt │ └── ... ├── DESIGN.md ├── FRONTEND.md ├── PLANS.md ├── PRODUCT_SENSE.md ├── QUALITY_SCORE.md ├── RELIABILITY.md └── SECURITY.md
设计文档会被编目和索引,包含验证状态和定义“智能体优先”操作原则的核心信念。架构文档 提供了领域和包分层的顶层地图。质量文档则对每个产品领域和架构层级进行评分,并追踪随时间推移的差距。
“计划”被视为一等公民。临时的轻量级计划用于小变更,而复杂工作则记录在 执行计划 (Execution Plans) 中,包含进度和决策日志,并签入仓库。活跃计划、已完成计划和已知的技术债务都被版本化并放在一起,让智能体无需依赖外部上下文即可操作。
这实现了渐进式披露:智能体从一个小的、稳定的入口点开始,被教导下一步去哪里看,而不是一开始就被信息淹没。
我们通过机械化手段强制执行这一点。专用的 Linter 和 CI 任务会验证知识库是否最新、交叉链接是否正确、结构是否合规。还有一个定期的“文档园丁”智能体,负责扫描那些不能反映真实代码行为的过时文档,并提交修复 PR。
随着代码库的演进,Codex 的设计决策框架也必须随之进化。
由于仓库完全由智能体生成,它首先是为 Codex 的可读性 优化的。就像团队为了新入职工程师能看懂代码而优化一样,我们人类工程师的目标是让智能体能够直接从仓库本身推导整个业务领域的逻辑。
在智能体看来,凡是无法在运行时从上下文中获取的信息,实际上都不存在。存储在 Google Docs、聊天记录或人们脑子里的知识,系统是访问不到的。它只能看到仓库本地的、版本化的工件(如代码、Markdown、Schema、可执行计划)。

我们意识到,必须随着时间推移将越来越多的上下文推入仓库。比如团队在 Slack 上对某个架构模式达成的共识,如果不让智能体可发现,那就像新员工入职三个月后还不知道这件事一样无效。
给 Codex 更多上下文,意味着组织并暴露正确的信息,让智能体能够基于此进行推理,而不是用临时的指令淹没它。就像你向新队友介绍产品原则、工程规范和团队文化(甚至包括表情符号的偏好)一样,给智能体提供这些信息能带来更一致的产出。
这种框架澄清了许多权衡。我们更倾向于那些可以在仓库内完全内化和推理的依赖项和抽象。那些常被称为“枯燥”的技术,往往因为可组合性强、API 稳定且在训练集中出现频率高,而更容易被智能体建模。某些情况下,让智能体重新实现部分功能,比绕过公共库中不透明的上游行为成本更低。例如,我们没有引入通用的 p-limit
将更多系统部分转化为智能体可以直接检查、验证和修改的形式,不仅增加了 Codex 的杠杆作用,也惠及了其他在代码库上工作的智能体(例如 Aardvark)。
光靠文档无法保持一个完全由智能体生成的代码库的连贯性。通过强制执行不变性 (Invariants),而不是微观管理实现细节,我们让智能体在不破坏地基的前提下快速交付。 例如,我们要求 Codex 在边界解析数据形状,但不规定具体怎么做(模型似乎喜欢 Zod,但我们并没有指定这个库)。
在拥有严格边界和可预测结构的环境中,智能体最为高效。因此,我们围绕严格的架构模型构建应用。每个业务领域被划分为固定的层级,具有严格验证的依赖方向和有限的允许边缘。这些约束通过自定义 Linter(当然也是 Codex 生成的!)和结构测试进行机械化强制。
下图展示了这一规则:在每个业务领域(如应用设置)内,代码只能“向前”依赖于一组固定的层(Types → Config → Repo → Service → Runtime → UI)。横切关注点(认证、连接器、遥测、功能标志)通过唯一的显式接口进入:Providers。其他任何依赖都被禁止,并由机器强制执行。

这种架构通常要等到你有数百名工程师时才会实施。但对于编码智能体来说,这是早期的先决条件:正是这些约束使得我们在保持速度的同时,避免了腐化或架构漂移。
实际上,我们通过自定义 Linter 和结构测试,加上少量“品味不变性”来执行这些规则。例如,我们静态强制执行结构化日志记录、Schema 和类型的命名约定、文件大小限制以及特定平台的可靠性要求。由于 Linter 是自定义的,我们编写报错信息时会直接将修复指令注入到智能体的上下文中。
在以人类为主的工作流中,这些规则可能显得迂腐或受限。但对智能体而言,它们变成了倍增器:一旦编码,它们就同时适用于所有地方。
同时,我们明确区分哪里约束重要,哪里不重要。这很像领导一个大型工程平台组织:在中央强制边界,在地方允许自治。你深切关注边界、正确性和可复现性;在这些边界内,你允许团队——或智能体——在解决方案的表达方式上有很大的自由度。
生成的代码并不总是符合人类的风格偏好,但这没关系。只要产出是正确的、可维护的,并且对未来的智能体运行是“清晰可见”的,它就达标了。
人类的“品味”会被持续反馈回系统。评审评论、重构 PR 和面向用户的 Bug 会被捕捉为文档更新或直接编码进工具中。当文档不足以规范行为时,我们就把规则升级为代码。
随着 Codex 吞吐量的增加,许多传统的工程规范变得适得其反。
仓库运作时尽量减少阻塞性的合并门槛。PR 存活时间很短。测试的不稳定 (Flakes) 通常通过后续运行来解决,而不是无限期阻碍进度。在一个智能体吞吐量远超人类注意力的系统中,修正很廉价,等待却昂贵。
在低吞吐量环境中,这种做法是不负责任的。但在这里,这通常是正确的权衡。
当我们说代码库是由 Codex 智能体生成时,我们指的是代码库里的一切。
评估工具 (Evaluation harnesses)
人类始终在环,但我们在比过去更高的抽象层面上工作。我们负责确定优先级,将用户反馈转化为验收标准,并验证结果。当智能体挣扎时,我们将其视为信号:识别缺少了什么——工具、护栏、文档——并将这些反馈回仓库,当然,修复工作依然由 Codex 自己编写。
智能体直接使用我们的标准开发工具。它们拉取评审反馈,在行内回复,推送更新,并经常自行压缩合并 (Squash and merge) 自己的 PR。
随着越来越多的开发循环(测试、验证、评审、反馈处理和恢复)被直接编码进系统,仓库最近跨越了一个有意义的门槛:Codex 可以端到端地驱动一个新功能。
给定一个提示词,智能体现在可以:
这种行为严重依赖于该仓库特定的结构和工具,目前还不能假设无需类似投入就能在其他地方复用。
完全的智能体自主性也引入了新问题。 Codex 会复制仓库中已有的模式——即使是那些不均匀或次优的模式。随着时间推移,这必然导致漂移。
最初,人类手动处理这个问题。我们团队过去每周五(即每周 20% 的时间)都要清理“AI 垃圾代码 (AI slop)”。不出所料,这无法扩展。
取而代之的是,我们开始将所谓的“黄金原则”直接编码进仓库,并建立了一个循环清理流程。这些原则是独断的、机械的规则,旨在保持代码库对未来智能体运行的清晰和一致。例如:(1) 我们更倾向于共享的工具包,而不是随手写的辅助函数,以保持不变性的集中;(2) 我们不以“YOLO 风格”试探数据——我们要么验证边界,要么依赖类型化的 SDK,这样智能体就不会基于猜测的形状意外构建代码。按照固定的节奏,我们有一组后台 Codex 任务扫描偏差,更新质量评分,并开启针对性的重构 PR。大多数 PR 可以在一分钟内完成评审并自动合并。
这就像垃圾回收机制。技术债务就像高利贷:持续小额偿还总是比让它利滚利然后痛苦地一次性解决要好。人类的品味被捕捉一次,然后在每一行代码上持续强制执行。这也让我们能按日发现并解决不良模式,而不是让它们在代码库中蔓延数天或数周。
这一策略在 OpenAI 内部发布和采用阶段效果良好。为真实用户构建真实产品,帮助我们将投资锚定在现实中,并引导我们走向长期的可维护性。
我们尚不知道的是,在一个完全由智能体生成的系统中,架构的一致性在数年内会如何演变。我们仍在学习人类判断力在何处能增加最大杠杆,以及如何编码这种判断力使其产生复利。我们也不知道随着模型能力随时间不断增强,这个系统将如何进化。
目前已明确的是:构建软件依然需要纪律,但这种纪律更多地体现在“脚手架”而非代码本身。保持代码库连贯性的工具、抽象和反馈循环变得日益重要。
我们现在最艰巨的挑战集中在设计环境、反馈循环和控制系统上,以帮助智能体实现我们的目标:大规模构建和维护复杂、可靠的软件。
随着像 Codex 这样的智能体承担起软件生命周期中更大的部分,这些问题将变得愈发重要。我们希望分享的这些早期经验能帮助你思考应该在何处投入精力,以便你只管去创造 (just build things)。




関連記事
今日のまとめ
AI日報で今日の重要ニュースをまとめ読み