0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AIにコードを書かせた後、誰が止めるのか-半日でAI-native Change Verification Platformを作ってみた

0
Posted at

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.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?