最近、Vibe Codingにおける様々なSDD開発手法を試しています。OpenSpec、SpecKit、oh-my-openagentのPrometheusなどです。
Andrej Karpathyは2025年2月にVibe Codingという概念を提唱しました——自然言語で意図を記述し、LLMにコードを生成させ、「Accept All」でdiffを確認せず、エラーが出たらそのままエラー情報をコピーしてAIに修正させる。
しかし、実際に始めてみると、致命的な問題を発見しました:AIが勝手に振る舞いすぎる。
特に既存プロジェクトの保守時、要件を与えると3つの異なる実装案を出してくる。それぞれ「妥当に見える」が、どれが本当に望んでいるものなのか?
Spec-Driven Development (SDD)とは
仕様駆動開発(Spec-Driven Development、SDD)、または「契約優先開発」(Contract-First Development)の核心は単純です:
先に仕様を定義し、その後AIに実行させる。
これは従来の「先にコードを書き、ドキュメントは足場」ではなく、仕様を唯一の真実の源泉(Single Source of Truth)として扱うことです。
GitHub Spec Kitは6段階のワークフローを提案しています:
/constitution- プロジェクトレベルの原則を定義(品質標準、アーキテクチャ制約)/specify- 「何をするか」を記述、「どうやるか」には触れない/clarify- 曖昧性を排除、境界条件を識別/plan- 技術選定、アーキテクチャ決定/tasks- 実行可能な単位に分解/implement- 仕様に従ってコードを記述
このワークフローから気づきました:Vibe Codingの究極の目標はモデルの創造性を最大化することではなく、意図が100%理解され実装されることを確保することです。
Harness Engineering:モデルに手綱を付ける
Anthropicには古典的な比喻があります:
|
|
Harness EngineeringはAI Agentインフラを設計、構築、運用する学問——本番環境でのAIを制約、誘導、検証、修正することです。
これはPrompt Engineeringとは根本的に異なります:
| 比較维度 | Prompt Engineering | Harness Engineering |
|---|---|---|
| 範囲 | Modelに送信する指示テキスト | Modelを囲むインフラ全体 |
| 焦点 | Modelにタスクを理解させる | システムがModelをどう制約、検証、修正するか |
| 信頼性向上 | 5-15% | 50-80% |
ある実例が印象に残りました:某金融会社のAgentが深夜3時に暴走し、失敗したAPIを11分間連続で再試行——合計847回の再試行、2200ドルのAPI費用を消費し、同一顧客に14通の重複メールを送信。
事後分析で判明:Modelは正常に動作し、Promptも慎重に設計されていましたが、問題はインフラレベル——3つの硬性制御が不足:再試行上限、実行タイムアウト、サーキットブレーカー。
この事件からHarnessの核心価値を真に理解しました:Promptに書く「10回以上再試行しないでください」は単なる提案——AIは無視でき、他の指示で上書き可能。しかしHarness層で強制実行される再試行上限は真のガバナンス——Agentは回避不可能、遵守必須です。
工学パラダイムが完全に変化した
対話型インタラクションから厳格な制約へ
過去、我々は:
- AIと対話型にやり取りを続けた
- より良いpromptを書いた
- より強力な単一モデルを使用(GPT-4 → GPT-4o → Claude Opus)
現在のHarness Engineering:
- 厳格な制約:何をするか、何をしないか
- 人間の意図理解:面接式質問、曖昧性排除
- 全プロセス制御:仕様 →計画 →実行 →検証
- 多Agent多モデル協調(oh-my-openagentプラグイン):Sisyphus + Prometheus + Metis + Momus
核心コンポーネント
Harness Engineeringには5つの核心コンポーネントがあります:
- Context Engineering - Agentが各ステップで見る情報を決定
- Tool Orchestration -ツール選択、パラメータ検証、実行サンドボックス
- Verification Loops - 各ステップで出力を検証(83% → 96%タスク完了率)
- Cost Envelope Management - タスク単位の予算上限(中央値 × 3)
- Observability -構造化実行追跡、因果関係記録
##私のHarness Engineering実践:DDD + gRPCプロジェクト
第1歩:gRPC入出力仕様を定義
DDDアーキテクチャのプロジェクトでは、先に人工でgRPCの入出力仕様を定義必須。
|
|
この .protoファイルは契約——AIはこの範囲を超えて勝手に振る舞えません。
第2歩:AIにプロジェクトを全量探索させる
プロジェクトにはrepo層に多くの再利用可能なリソースがある。AIにグローバル探索(読み取り専用)を行い、プロジェクト概要markdownを产出させる。
oh-my-openagentの /init-deepを使用、複数Agentを並行起動:
- 既存データモデルを検索
- repo層インターフェースを分析
- 再利用可能コンポーネントを抽出
第3歩:業務詳細markdownを記述
切记:大量の業務詳細を1つのドキュメントにまとめようとしない。
小粒度に分割:
|
|
原則:主Agentが各タスクで過多のコンテキストを占用しないようにする。コンテキスト圧縮しても、情報精度の損失です。
第4歩:調査段階——絶対に直接コードを書かせない
これが最も重要なステップ:AIに最初からコードを書かせないことを必ず伝える。
特にコンテキストが蓄積して長くなる時、モデルは幻覚を起こしやすく、勝手に実行を開始します。単一AIセッションのコンテキスト空間を利用し、先にAIに厳格な調査を行わせ、疑問を提起させ、共に以前に記述した仕様規範を完善します。
シミュレートされた対話シーン:
|
|
上記の対話シーンは私がシミュレートした例です。このような反復的明確化は、直接AIにコードを書かせるより効果が遥かに高いです。
第5歩:調査終了後、OpenSpecまたはPrometheusでTasks/Plansを構築
私が常用する2つの方法:
OpenSpecの /opsx:propose:
|
|
oh-my-openagentの Prometheus:
|
|
個人的には、omoプラグインの「面接式」、または「対話式」で多くの詳細を確認することを好みます。
第6歩:Plans/Tasks作成後、新セッションで実行
PlansまたはTasksのmarkdownファイルが作成された後、私は新AIセッションを作成し、専一的にこのタスクを実行させます。
omoの /start-work、またはOpenSpecの /opsx-apply xxxxを使用:
- 検証済み計画を読取
- 専門Agentに委任(コード生成、テスト、統合)
- 独立して結果を検証
- 主Agentが調整
余談:oh-my-openagentの多agent、多category方式は、OpenSpecのskillsを使用する時、正常に動作しないようです——現在の主モデルに実行させるだけです。
##総結:実践後の真実の感想
2ヶ月以上Harness Engineering方式でVibe Codingを行い、最大の感想はデータ改善ではなく、心境が変わったことです。
以前、AIでコードを書く時、各ステップで不安でした——理解を誤ったか?不要な機能を勝手に追加するか?簡単なことを複雑にするか?
現在、仕様制約があり、これらの問題は基本的に消失しました。より強力なモデルを使用したからではなく、AI実行前に意図を「固定」したからです。
いくつかの明確な変化:
手戻りが減少。以前、機能は平均3-4回の手戻りが必要。現在、大部分は1回で通過。AIが突然聪明になったではなく——仕様が「どうやるか」を事前に明確に定めたからです。
コスト低下。同タスクで、Token消費は約1/3削減。AIが反復試行、反復修正が必要なくなったからです。
モデル要求が低下。以前はClaude Opus必須と感じた。現在、完全な仕様とSonnetで、効果は同様です。
Vibe Codingの本质は「AIを聪明にする」ではなく、「AIに指示に従わせる」です。
指示に従う前提:先に明確に述べること。
これがHarness Engineeringの核心——モデルの強力な能力を発揮させることではなく、意図が正確に理解され、厳格に実行されることを確保することです。
このインフラを構築する确实に時間がかかり、2ヶ月以上探索を反復してようやく使い慣れました。しかし一旦構築すれば、AIコーディングは「推測ゲーム」から「図面施工」に変化——Vibe Codingの楽しみを真に享受でき、常に暴走を監視する必要がなくなります。
仕様駆動開発に興味がある場合、OpenCode での OpenSpec 体験を参照してください。AI agent モデル設定については、oh-my-opencode 最適化歷程を参照してください。