AIにコードを書かせた後、誰が止めるのか
半日でAI-native Change Verification Platformを作ってみた
最近、CodexやClaude CodeのようなCoding Agentを触っていると、かなりの速度でコードを書ける。
機能追加を頼めばコードを書く。
テストが落ちれば修正する。
Repository全体を読ませれば、それなりに文脈も理解する。
ここまで来ると、自然に一つの疑問が出てきた。
AIにコードを書かせた後、その変更を誰が信用するのか?
人間が毎回すべてのdiffを最初から最後まで精査するのであれば、AIによって生成速度が100倍になっても、Review側がボトルネックになる。
かといって、
「別のAIにレビューさせればいい」
だけでは少し怖い。
GeneratorとReviewerが同じ間違いをするかもしれないし、テストが通ったからといって、その変更をProductionに入れていいとも限らない。
そこで半日ほど使って、ローカルMacBook上に最小構成のVerification Platformを作ってみた。
名前は AIVP — AI-native Verification Platform。
狙っているものは、いわゆる「AI Coding Agent」そのものではない。
AIが生成したChangeを、どこまで自動で信用してよいか判断するためのControl Layerである。
GeneratorとVerifierを分ける
最初に決めた原則は単純だった。
Generator ≠ Verifier
コードを書いたAI自身に、
「これ正しい?」
と聞いて、
「はい、正しいです」
と言わせても、それだけではVerificationにならない。
そこでAIVPでは役割を分けた。
Codex CLIには、
Generator / Fixer
を担当させる。
Claude Codeには、
Independent Reviewer
を担当させる。
さらにその外側に、AIではないPython製のOrchestratorを置いた。
このOrchestrator自身は賢くない。
LLMではなく、ただのDeterministic Controllerである。
しかし、
- 何回AIを呼べるか
- 何回修正してよいか
- どの順番でVerificationするか
- いつ止めるか
- いつ人間へEscalationするか
を決めるのは、このControllerである。
これがAIVPの中心になった。
AIをAIだけで囲わない
実行フローは概ねこうなっている。
Task
↓
Codex Generate
↓
Git Diff
↓
Deterministic Gates
↓
Claude Independent Review
↓
Risk Evaluation
↓
必要なら Codex Fix
↓
再Verification
↓
AUTO_FINISHED
or
HUMAN_REQUIRED
Deterministic Gateには、Tests / Lint / Typecheck / Security Commandsなどを置ける。
つまり、
「AIが問題ないと言った」
より先に、
機械的に確認できるものは機械的に確認する
という設計にした。
LLMは強いが、Deterministicな条件までLLMに判断させる必要はない。
テスト結果が0か1か分かるなら、その判断をAIに委ねる理由はない。
AIに無限修正させない
もう一つ重要だったのが、Repair Loopを無限に回さないことだった。
AIVP v1では、
最大Fix回数 2
Codex calls 最大4
Claude calls 最大3
AI call timeout 300秒
Whole run 最大900秒
Concurrent run 1
とBudgetを固定した。
理由は単純で、
AIが直せないものを、AIに永遠に直させても仕方がない
からである。
収束しない場合は、
HUMAN_REQUIRED
にして止める。
AI-nativeというと、
「人間をなくす」
方向へ考えがちだけれど、自分が作りたかったのは逆だった。
人間を全部のChange Reviewから解放し、本当に人間が判断すべきChangeだけを人間へ送る。
実験してみた
Architectureだけ作って終わると面白くないので、いくつか違う種類の変更を実際に流してみた。
Run #001 — LOW Risk
最初はかなり単純な変更。
Usernameを、
username.strip().lower()
のようにNormalizeする変更を生成させた。
結果は、
AUTO_FINISHED
62.845 sec
Codex calls : 2
Claude calls: 1
Fix : 0
Final Risk : LOW
特に問題なく自動終了した。
これは期待通り。
Run #002 — MEDIUMなBusiness Logic
次はPricing Logic。
会員には10%割引するが、割引上限は2,000円。
これも、
AUTO_FINISHED
60.858 sec
Codex calls : 2
Claude calls: 1
Fix : 0
Final Risk : LOW
となった。
ここまではかなり平和だった。
ところが、少し意地悪をしたところから面白くなった。
AIが直せない問題を入れてみる
Run #002F-1 — Specification Conflict
Taskには、
会員は10%割引
と書く。
しかしDownstream Contractには、
1,000円未満の商品には割引してはいけない
という別条件を置いた。
つまり、二つのSource of Truthを意図的に衝突させた。
するとCodexはTaskとContractの間で揺れ始めた。
一方を満たすように修正すると、もう一方に違反する。
さらに直すと逆へ戻る。
2回のFix Budgetを使い切っても収束しなかった。
結果、
HUMAN_REQUIRED
Codex calls : 3
Claude calls: 1
Fix : 2
Final Risk : UNKNOWN
となった。
これはかなり面白かった。
一見すると、
「Codexがバグを直せなかった」
ように見える。
でも問題の本質はそこではない。
そもそも正解が存在しない。
TaskとContractのどちらを優先するかは、Business / Product側の意思決定だからである。
つまり、モデルをもっと強くすれば解決する問題ではない。
必要なのは、
どちらがAuthoritative Sourceなのかを人間が決めること
だった。
ここで、
AIの能力不足
と
Specification Ambiguity
を分離できた。
Run #002F-2 — Controlled Fault Injection
次は、あえて一度だけPricing Bugを注入した。
これは自然発生したバグではなく、Verification Pipelineを試すためのControlled Fault Injectionである。
初回Verificationでは、
FAIL
Codexが修正。
その後もう一度Verificationすると、
PASS
Claude Reviewも通り、
AUTO_FINISHED
94.381 sec
Codex calls : 3
Claude calls: 1
Fix : 1
Final Risk : LOW
となった。
これは、
検出 → 修正 → 再検証 → 終了
というRepair Loopそのものの確認になった。
Testsが通っても危険なChangeはある
Run #003 — HIGH Risk Authorization Change
最後にAuth周りを変更した。
Admin Areaへsuperadminを許可する変更。
コードそのものは正常。
テストも通る。
Claudeも、
critical findings: 0
major findings : 0
risk : LOW
と判断した。
ところがRule Engineは、
auth/**
をHigh-risk pathとして扱う。
さらにCodex Risk Judgeも、
Authorization Policyの変更なのでHIGH
と評価した。
つまり、
Tests : PASS
Claude : LOW
Rule Engine : HIGH
Codex Risk : HIGH
になった。
ここでAIVPは自動承認しなかった。
Risk disagreementが大きいため、
HUMAN_REQUIRED
へEscalateした。
これは自分にとってかなり重要な結果だった。
なぜなら、
Code Correctness ≠ Change Risk
だからである。
コードとして正しいことと、
「この変更を組織として承認してよい」
は別問題だ。
Authorization Policy、IAM、DB Migration、CI/CD Workflowなどでは、特にこの差が大きくなる。
Riskは一つの数字ではないかもしれない
Run #003を見ていて、AIVP v1のRisk Modelには改善余地があると思った。
ClaudeがLOWと言ったこと自体は、必ずしも間違いではない。
Claudeは主に、
コード品質 / Correctness
を見ていた可能性がある。
一方Rule EngineやCodexは、
Security Sensitivity / Business Impact
を見ていた。
つまり、同じ「Risk」という言葉で別のものを測っていた。
次に作るなら、
Correctness Risk
Security Sensitivity
Business Impact
Blast Radius
Reversibility
のような多次元Risk Modelにしたい。
ただ、これはv1には入れなかった。
今回の目的はRisk Engineそのものを完成させることではなく、
異なるRisk Signalを集約して、人間へEscalationできるか
を確認することだったからだ。
何を作らなかったか
AIVP v1には、かなり多くのものがない。
- Production Serviceではない
- Multi-userでもない
- Cloud Runnerでもない
- RAGもない
- Agent Memoryもない
- EKSもArgo CDもない
- Auto Mergeもない
- Auto Deployもない
- 3つ目、4つ目のReviewerもいない
ローカルMacBook上のPython ScriptからCodex CLIとClaude Codeを呼んでいるだけである。
これは意図的だった。
最初から全部入れると、
「AI-generated Changeを安全にVerificationできるか?」
という本来確認したかった問いが見えなくなる。
だからv1では、
Thinnest possible control loop
だけを作った。
AIVPを作って一番面白かったこと
最初は、
Codexにコードを書かせて、ClaudeにReviewさせよう
くらいの発想だった。
でも実際に作っていくと、問題の中心がAI Modelそのものから離れていった。
重要だったのは、
誰が生成するか
よりも、
誰が止めるか
だった。
AIが10倍、100倍コードを書けるようになるなら、人間が毎回すべての行をReviewする世界はスケールしない。
しかしAIに全部任せるのも危険。
そこで必要になるのは、
AI
↓
Deterministic Guardrails
↓
Independent Verification
↓
Risk Evaluation
↓
Human Judgment
というControl Planeなのではないか。
AIVPを作ってみて、かなりその感覚が強くなった。
人間の仕事は消えるのではなく、上に移る
AIVPでHuman Reviewが必要になったケースを見ると、人間が必要だった理由は、
Syntax Errorを探す
ことではなかった。
#002F-1では、
どのSpecificationを正とするか
だった。
#003では、
Authorization Policyとしてこの変更を承認するか
だった。
つまりHumanが必要なのは、
Intent
Domain Semantics
Architecture
Policy
Business Impact
Responsibility
の領域だった。
これならAIが強くなればなるほど、
人間がコードを書く時間
は減っても、
何を作るべきか、何を信用してよいか、誰が責任を持つかを判断する仕事
はむしろ重要になる。
AIVPとTVP
自分の中では、AIVPと以前作ったTVP(Thinnest Viable Platform)はかなり綺麗につながっている。
TVPは、
信用可能なChangeをどうProductionへ運ぶか
を扱う。
AIVPは、
そのChangeを信用可能にするにはどうするか
を扱う。
なので将来的には、
AI-generated Change
↓
AIVP
Verification / Risk Control
↓
Trusted Change
↓
TVP
CI/CD / GitOps / Runtime
↓
Production
という関係になる。
今回はそこまで統合していない。
AIVP v1はあくまでLocal PoCで止めた。
最後に
AIVPを作る前は、
「AI Codingが進むなら、人間のReviewもAIに置き換わる」
くらいに考えていた。
作った後は少し考えが変わった。
問題は、
AIかHumanか
ではない。
むしろ、
どの判断をDeterministicにするか
どの判断を別AIへ任せるか
どの判断だけHumanへ残すか
を設計することだと思う。
AI-native Developmentで必要なのは、より強いGeneratorだけではない。
Generation速度に負けないVerification Architectureが必要になる。
AIVPは、その考えを確認するために作った小さな実験である。
そして今のところ、一番気に入っている結果は、
HUMAN_REQUIRED
がちゃんと出たことだった。
AI Platformを作ったのに、
「ここから先は人間が決めてください」
と止まれる。
案外、それが一番重要な機能なのかもしれない。
AIVP — AI-native Verification Platform
A risk-aware change verification pipeline for AI-generated code.