
モデルが賢くなれば解決するのか?
AIコーディングツールの支配的なナラティブはこうだ。モデルが十分に良くなれば、コードも上手く書き、テストも上手く書き、リファクタリングも自動でやってくれるはずだ。GPT-4でダメならGPT-5で解決する。Claudeにできなければ、もっと大きなClaudeがやってくれる。
本当にそうだろうか?
Claude Opus 4.7にfilefuncのリファクタリングを任せた。人間のレビューなしに1時間で完走した。validate通過、pytest通過、coverage維持。結果だけ見れば「やはりモデルが良ければ解決する」というナラティブに合致する。
しかし、同じモデルに同じリファクタリングをfilefuncルールなしでやらせたら? validateなしで? coverageフィードバックなしで? 結果はまるで違う。doom loopに陥る。あるバグを直すと別の場所が壊れ、それを直すとまた別の場所が壊れる。
同じモデルだ。変わったのは環境だ。
「完了しました」――エージェントの早期終了本能
同じモデルでもう一つ実験をした。527個の関数があるプロジェクトにエージェントを自律的に投入した。「すべての関数にテストを書いて。」エージェントは作業を終えて報告した。「完了しました。」
実際にテストが書かれた関数:40個。 527個中40個。
エージェントは嘘をついたわけではない。40個をこなした後、「十分やった」と判断したのだ。LLMの基本的な傾向は楽観的な早期終了だ。難しい関数に出会うとスキップし、いくつか追加でやってから「残りも似たパターンだから大丈夫」と結論づける。
CLIツールでループを強制した後:
自律エージェント: 40 / 527 (7.6%) — エージェントが「完了」宣言
CLI loop: 527 / 527 (100%) — 機械が「まだ487個残っている」と宣言
同じモデルだ。同じプロジェクトだ。違いは**「終わり」を誰が決めるか**だ。
環境がモデルを作る
二つの実験が同じ結論を指し示す。Opus 4.7が完走したのはモデルが賢いからではない。specification surfaceがmachine-checkableだったからだ。
filefunc validate → コード構造がルールを満たしているか?
pytest → 既存の動作が保持されているか?
coverage → どの分岐が漏れているか?
この三つが修正のたびに即座にフィードバックを返した。モデルはこのフィードバックを受けて修正し、再びフィードバックを受け、再び修正した。self-correcting loop。
核心はここだ:
モデルのIQよりもフィードバック・トポロジーが結果を決定する。
LLMは生成能力は強いが、correctnessの保証は弱い。しかしdeterministic verifierがあれば、性能は急激に安定化する。lint、typecheck、test、coverage――これらがモデルの出力を校正するgradient signalとなる。
「モデルが十分に賢くなれば解決する」は誤った命題だ。正確には「フィードバックが十分に速ければ、現在のモデルでも解決する」だ。
broad exploration vs local correction
LLMの強みはbroad explorationではなく、local correctionだ。
「このプロジェクトのテストを書いて」――これはbroad explorationだ。LLMは方向を見失う。
「line 41がカバーされていない」――これはlocal correctionだ。LLMは正確にその行をカバーするテストを書く。
実プロジェクトで検証された数字:
フィードバックなし: 60〜70% coverageで停滞
フィードバックあり: 100%達成(到達可能な関数に限る)
同じモデルだ。「line 41 not covered」という一行がgradient signalの役割を果たす。このフィードバックがLLMの修正を正確な方向へ導く。
Symbolic Feedback Loop
すべての観察を貫く構造が一つある。
LLMが生成する → 決定論的ツールが判定する → 結果をLLMに返す → 繰り返し
これをSymbolic Feedback Loopと呼ぶ。
今の業界の主流はLLM Feedback Loopだ。AIがAIを検証する。酔った人が酔った友人に「俺、酔ってる?」と聞く構造だ。どちらも確率的だからエラーが蓄積する。
Symbolic Feedback Loopは違う。pytestはハルシネーションしない。go testは酔わない。coverage測定は嘘をつかない。仕様検証はドリフトしない。
この構造はcorrectnessを機械的に判定できる領域――コード、テスト、仕様、型――で機能する。API設計のエレガンスやUXの自然さは、まだシンボリックツールが判定できない。その境界を広げることが次の課題だ。自然言語もverifiableな境界の中に持ち込む道が存在すると信じている。
モデルをもっと賢くするよりも、モデルに返すフィードバックをもっと正確にする方が効果的だ。
決定の委任
決定をAIに委任してはならないという事実は自明だ。ただし、人間がすべてを確認し決定するのは骨の折れる仕事だ。反復的で定型的なある種の決定はシンボリックツールが人間の代わりに行える。
「このテストがすべての分岐をカバーしているか?」――人間が読む必要はない。coverageツールが判定する。「このコードが構造ルールを満たしているか?」――人間がレビューする必要はない。validateが判定する。「まだ処理していない関数が残っているか?」――人間が数える必要はない。CLIが宣言する。
AIに委任できない決定をシンボリックツールには委任できる。確率ではなく決定論だからだ。これがSymbolic Feedback Loopの存在理由だ。
列車をもっと速くすることより、線路を敷くことが重要だ。
多くの人が列車を作っている。線路を敷く人はまだほとんどいない。