AI主導開発の決定版「v3.1 Unified」:
人間は“指示”をやめ、AIは“迷い”を捨てる
AIに「ここ直して」「ついでにこれも…」を繰り返すほど、なぜか整合性が壊れていく。
それ、AIの性能問題というよりプロセス設計の問題かもしれません。
- 仕様の整合性が取れなくなる
- AIが以前の修正を忘れ、デグレ(回帰バグ)が止まらない
- 何が正しい仕様なのか、誰も説明できなくなる
※このあたり、実体験がある人ほど刺さるやつ。
そこでこの記事では、私が(実運用を前提に)定義したAI駆動開発プロトコル 「AI Driven Development v3.1 Unified (Lifecycle & Defense)」 を、ブログ読者向けに噛み砕いて紹介します。
1. コアコンセプト:v3.1 (Baseline) と v3.1+ (Loop)
このプロトコルの核心は、開発フェーズを2つに分断することです。 「正(ベースライン)を作るフェーズ」と、「運用(反復)を回すフェーズ」を混ぜない。
v3.1(Lane A)
「正(Baseline)」を作るフェーズ。実装はせず、要件と設計を固め、Build Packageを作成してFreezeします。
v3.1+(Lane B)
「運用(Loop)」を回すフェーズ。Baselineからタスクを切り出し、最小変更で積み上げます。
🚫 絶対ルール:Freeze後の自然言語 “仕様追加” を禁止
Baseline(要件・設計・Build Package)が承認されFreeze(凍結)された瞬間から、 人間による自然言語での仕様追加・変更を原則禁止します。
「口頭指示」は設計書に残らない“隠れ仕様”を生みます。これが積み上がると、 Source of Truth(信頼できる唯一の情報源)が失われ、プロジェクトが破綻しやすくなります。
2. システム防衛論理(The Constitution)
AIが人間の曖昧な介入を拒絶できるように、あえて「憲法(防衛ルール)」を定義します。 ここが“AI主導開発っぽさ”の中核です。
- Trigger: Freeze後に、人が自然言語で仕様追加・変更を要求
- Action: 拒否し、S1(タスク抽出)またはUI例外レーンへ誘導
例:「やっぱりボタン赤くして」→ AIは従わず、「UI-PATCHですか? UI-REQですか?」と分類に戻します。
- Trigger: 検証コマンドを省略、またはタスクごとに変えようとする
- Action:
verify_commands.mdの smoke(必須)を強制
「動いた気がする」で進めない。これは地味に一番効きます。
3. ワークフロー:3つのレーン
状況に応じて3つのレーン(Lane)を使い分けます。 “例外”を例外として隔離するのがポイント。
graph TD
Start((開始)) --> LaneA
subgraph Lane A: Baseline Creation [v3.1]
A1[要件定義] --> A2[基本設計]
A2 --> A3[詳細設計]
A3 --> A4[Build Package作成]
A4 --> Freeze{Human PM承認\nFreeze Point}
end
Freeze --> LaneB
subgraph Lane B: Operational Loop [v3.1+]
S1[S1: タスク抽出\nTask Packet] --> S2[S2: 実装\nMinimal Diff]
S2 --> S3[S3: AIレビュー]
S3 -- NG --> S2
S3 -- GO --> S4[S4: 人間によるVerify]
S4 -- Fail --> S5[S5: 修正ループ]
S5 --> S4
S4 -- Pass --> S6[S6: Memo更新]
end
subgraph Lane C: UI Exception
UI[画像/スクショ指摘] --> Classify{分類判定}
Classify -- Visual Only --> LaneB
Classify -- Spec Change --> LaneA
end
S6 --> S1
S4 -.-> UI
S3 -.-> |仕様変更検知| LaneA
※Mermaidの描画は行っていません。必要なら別途Mermaid対応環境に貼り付けてください。
Lane C: UI Exception(UIだけは例外として“画像入力”を許可)
見た目の微調整は、言語で説明しにくい。そこで例外的に「スクショ+赤入れ」での入力を許可します。 ただしAIはそれを解析し、必ず次のどちらかに分類します。
- UI-PATCH: 見た目だけの修正 → Lane Bでタスク化して処理
- UI-REQ: API変更や挙動変更を伴う修正 → Lane Aへ強制送還(仕様変更)
4. 役割分担(Roles)
このプロトコルでは「誰が何をしていいか」を明確にします。 役割が曖昧だと、結局“雑な口頭指示”が復活するので。
| Role | Responsibility | Constraints (Banned) |
|---|---|---|
| Human PM | 最終承認者(GO/NG、Baseline改訂の許可) | Freeze後の自然言語による仕様追加 |
| Human Operator | 実行・検証係(コマンド実行→結果共有) | 仕様文章の作成、全文ログ貼り付け |
| Creator AI | 実装・文書管理(最小差分で進める) | タスク外の実装 |
| Reviewer AI | 監査・門番(GO/NGと修正指示) | 曖昧なACの通過許可 |
5. 重要なアーティファクト
反復開発を安定させるために、以下のドキュメントを“軽量に”維持します。
- repo_memo.md:API契約、Config、落とし穴をまとめた地図(コンテキスト溢れ防止)
- verify_commands.md:最低限OKの smoke テスト定義(毎タスク固定)
- run_log_summary.md:ログ全文を貼らず、要点だけ渡すためのテンプレ
付録:プロトコル定義(JSON)
下のJSONは、AIエージェントの System Prompt / Custom Instructions に貼り付けて使う想定です。 「このルールを破ると破綻する」部分を機械的に固定できます。
{
"protocol_meta": {
"name": "AI Driven Development v3.1 Unified (Lifecycle & Defense)",
"version": "3.1.2-unified",
"updated_at": "2025-12-26",
"timezone": "Asia/Tokyo",
"execution_mode": "chat_implementation_strict",
"core_concept": "v3.1で『正(Baseline)』を作り、v3.1+で『運用(Loop)』を回す。UI例外は厳格に分別し、Baseline汚染を防ぐ。",
"source_of_truth": {
"baseline": "build_package.json",
"ops": [
"repo_memo.md",
"verify_commands.md",
"run_log_summary.md"
],
"task": "S1_TASK_PACKET"
}
},
"baseline_governance": {
"baseline_version": "0.0.0",
"freeze_point": "build_package.json approved",
"approved_by_role": "human_pm",
"rules": [
"Freeze後、Baseline(要求/要件/設計/Build Package)に対する自然言語の仕様追加・変更を禁止する(UI例外レーンを除く)",
"タスクは必ず build_package.json から導出される(derived_fromが必須)",
"UI-REQ(仕様変更)発生時は Lane A にエスカレーションし、新baseline_versionを発行する"
],
"change_log": [
{
"baseline_version": "0.0.0",
"changed_reason": "initial",
"diff_summary": "initial baseline",
"approved_by": "human_pm",
"approved_at": "YYYY-MM-DD"
}
]
},
"system_defense_logic": {
"description": "AIが判断に迷った時、または人間の不適切な介入を拒否/誘導するための論理(憲法)",
"rules": [
{
"rule_id": "NO_HUMAN_TEXT_INJECTION",
"trigger": "Freeze後に、人が自然言語で仕様追加・変更を要求した時",
"action": "拒否し、(a) S1(Task Extraction) で既存Baselineからタスク化、または (b) UIレーン(画像入力)へ誘導する",
"rationale": "Baseline以外の『隠れ仕様』が混入すると、設計と実装の整合性が崩壊しプロジェクトが破綻するため"
},
{
"rule_id": "TASK_SOURCE_OF_TRUTH",
"trigger": "S1_TASK_PACKET を生成・更新する時",
"action": "derived_from.requirement_ids と derived_from.design_sections を必須化。欠けている場合はS1をNGにしてLane A(設計側)へ差し戻す",
"rationale": "タスクがBaseline由来であることを機械的に証明し、隠れ仕様混入を防ぐため"
},
{
"rule_id": "UI_REQ_ESCALATION",
"trigger": "UI修正依頼(Lane C)の中に、API変更/スキーマ変更/挙動変更/非機能変更/verify基準変更が含まれる時",
"action": "UI-PATCHではなくUI-REQと判定し、Lane A(v3.1)へ強制エスカレーション(改訂→新Baseline発行)",
"rationale": "『見た目の修正』に見せかけた仕様変更は検知しにくく、最も致命的な負債になりやすいため"
},
{
"rule_id": "FIXED_VERIFY_ENFORCEMENT",
"trigger": "検証コマンドを省略、またはタスクごとにコロコロ変えようとした時",
"action": "verify_commands.md に定義された smoke(必須)を強制する。変更が必要ならLane A改訂(UI-REQ含む)扱いにする",
"rationale": "検証基準が揺らぐと『動いた気がする』で進行し、後で原因不明の回帰に襲われるため"
},
{
"rule_id": "LOG_COMPRESSION",
"trigger": "数百行のログ全文が貼られた時",
"action": "run_log_summary.md 形式への要約を要求し、全文ログの継続貼付を停止させる",
"rationale": "入力が肥大化すると推論精度が落ち、同じ修正を繰り返すループに陥るため"
}
]
},
"roles_and_constraints": {
"human_pm": {
"role": "最終承認者",
"allowed": [
"GO/NG判断",
"Baseline更新の許可/承認",
"task_idによる優先順変更(例外)"
],
"banned": [
"Freeze後の自然言語による仕様追加/変更",
"タスク本文の勝手な書き換え(UI-REQはLane Aへ)"
]
},
"human_operator": {
"role": "実行・検証マシーン(文章は書かない)",
"allowed": [
"Verify実行",
"結果貼り付け(pass/fail)",
"UIスクショ/赤入れ画像の提示",
"GO/NG(実行結果ベース)"
],
"banned": [
"仕様文章の作成",
"全文ログ貼り付け(要点のみ)",
"Freeze後の要求追加"
]
},
"creator_ai": {
"role": "実装・文書管理",
"responsibility": [
"Task抽出/選定/パケット生成",
"RepoMemo/Verify/Logテンプレの生成・更新",
"最小差分実装",
"変更サマリ/影響範囲の提示"
]
},
"reviewer_ai": {
"role": "門番・監査",
"responsibility": [
"AC整合性チェック",
"S1妥当性判定",
"S2差分レビュー(GO/NG + 修正指示)",
"UI-PATCH/REQ分類",
"差し戻し/エスカレーション宣言"
]
},
"summarizer_ai": {
"role": "圧縮・固定化",
"responsibility": [
"承認済み成果物を build_package.json に圧縮",
"Baselineの更新差分を簡潔に記録(change_log用)"
]
}
}
}
※元データのうち、記事内に出していない詳細スキーマ(workflow_lanes 等)は、必要ならこのJSONに追記して拡張してOKです。
まとめ:AI開発は「対話」から「運用」へ
v3.1 Unifiedは、AIとのやり取りを“雑談”から“運用”へ寄せるための仕組みです。 いちばん効くのは「Freeze後にルールを破らない」こと。
AIに“自由”を与えすぎていないか?
そろそろ、AIに“規律”を与えるタイミングかもしれません。
(あなたの追記:実運用でハマった点/改善例をここに追記すると“あなたのブログ感”が強く出ます)

コメント