対応 issue: #728(loop-safety gates) 適用ドメイン(Phase 1): ①plangate 本体 = docs/workflows/ai-loop/ 配下のみ(dogfooding 域・本番フロー WF-00〜07 非適用。
design-philosophy.md冒頭)。②導入先リポジトリ = ho-paths 確定 + LoopSpec scope.allowed_paths 宣言を前提に適用可。 思想的根拠:design-philosophy.mdI-6「停止できないループはループではない」 (+ サーキットブレーカーによる自律そのものの一時停止という 2 層停止機構)。 発火位置:flow-detect.md§2 flow フェーズへの進入前に置く事前ゲート。 flow-detect.md 本体(boundary / lite / class 判定)は変更しない。本書はその手前の 「ループを始めてよい指示か」を判定する層であり、flow-detect の判定対象を狭めも広げもしない。
flow-detect.md §2 の flow フェーズは「変更対象ファイルが低リスク帯か」を判定する。
これは変更内容に対する判定であり、指示(プロンプト)そのものの停止可能性は
判定していない。「完璧になるまで改善し続けろ」のような指示は、変更対象が
boundary=clean かつ lite=true であっても、flow に乗った後の反復(Generate →
Evaluate → Remember → Schedule → Optimize → Recurse サイクル)が終端に到達しない
リスクを持ち込む。
したがって本ゲートは flow-detect の判定軸を追加するのではなく、flow に乗せる指示 自体の入場条件として独立に置く:
指示(プロンプト)
↓
[本書: loop-safety gates] ← 非停止リスクの事前検出・再形成
↓ 通過
flow-detect.md §2 flow フェーズ(boundary / lite / class 判定)
↓
detect / escalate(既存)
いずれかのゲートで拒否された指示は、flow に進入させず「再形成された安全な指示」を 提案するか、feasibility 不能として人間に差し戻す(§3 参照)。
以下は非停止リスクを内包する典型的な指示パターンである。各パターンについて、 検出観点と再形成テンプレート(安全な書き換え)を定義する。
再形成テンプレート:
最大 3 改善サイクルまで実行する。
各サイクルで [具体的な受入基準] を満たすか判定する。
3 サイクル後も未達なら停止し、未達項目・根本原因・次の選択肢を報告する。
再形成テンプレート:
最大 5 件の情報源、3 件の設計案、7 件のレビュー観点までを対象とする。
それ以上必要と判断した場合は、拡大理由を示した上で人間に budget 拡張を確認する。
再形成テンプレート:
実行前に制約の同時充足可能性を検証する。
矛盾が見つかった場合は実行せず、以下を報告する: 矛盾する制約の組・矛盾の理由・
解消のための制約変更案(複数)。制約変更の採否は人間が判断する。
再形成テンプレート:
最大 2 リトライサイクルまでとする。
1 回目と同じ失敗が再発した場合はアプローチを変更する。
2 回目も失敗した場合は停止し、失敗理由と次の選択肢を報告する(同じ手順の
3 回目の反復は行わない)。
再形成テンプレート:
目標に優先順位を付ける(例: 品質 > 期限 > 予算)。
優先順位下位の基準が満たせない場合は、そのトレードオフを明示して報告し、
人間の判断を仰ぐ(無条件の同時最大化は行わない)。
flow 進入前に、以下 5 ゲートをこの順で通過確認する。いずれか 1 つでも 通過しない場合は flow に進入させず、再形成案または feasibility 不能報告を返す。
decision-table.md
の terminal state(AUTO_APPROVED / HUMAN_ESCALATED / BLOCKED)のいずれかに
有限回の反復で到達できる終了条件を持つか。00_concept.md §「収束ルール」/
adaptive-production-loop.md の terminal state
遷移表が正本。escalate 予算(severity 別の昇格上限・サーキットブレーカー連動)は
arbiter-policy.md §7 /
decision-table.md §6 が正本。本ゲートはこれらの値を
変更・再宣言せず、「budget が設定されていること」自体の存在確認のみ行う。Gate 1〜4 のいずれかで停止した場合、以下の定型で報告する。この定型は
decision-table.md の provenance 記録とは別レイヤー(loop-safety gate 自身の
出力形式)であり、provenance フィールドを再定義しない。
[問題のある指示]: <元指示の該当部分>
[該当ゲート]: Gate 1-5 のいずれか
[未達/矛盾の内容]: <何が達成できないか、または何と何が矛盾するか>
[理由]: <なぜ非停止・実行不能と判定したか>
[安全な代替案]: <§2 の再形成テンプレートに基づく書き換え案>
[推奨される stop condition]: <最大反復回数・budget・判定基準>
unsafe(元指示):
このコードが完璧になるまで改善し続けて。全部のエッジケースを考慮して、 矛盾する要求があっても両方満たすように何とかして。
safe(変換後):
最大 3 改善サイクルまで実行する。各サイクルで [受入基準] を満たすか判定する。 エッジケースは budget 上限 7 件までを対象とする。要求間に矛盾が見つかった場合は 解消しようとせず、矛盾する要求の組・理由・解消のための選択肢を報告し、 人間の判断を仰ぐ。3 サイクル後も未達なら停止し、未達項目と次の選択肢を報告する。
本書は以下を再定義しない。値・機構の変更が必要になった場合は、当該正本の
版上げ手続き(design-philosophy.md §6.2)に従う。
| 事項 | 正本 |
|---|---|
| 対応ラウンド上限(3 ラウンド)・terminal state | 00_concept.md / adaptive-production-loop.md |
| escalate 予算・severity 別の昇格上限 | arbiter-policy.md §7 |
| サーキットブレーカー(CB-1〜CB-3) | decision-table.md §6 |
| boundary / lite / class 判定 | flow-detect.md §2 |
| provenance スキーマ | decision-table.md §5 |
design-philosophy.md — I-6(本ゲートの思想的根拠)・§8 トリアージ(#728 の仕分け結果)flow-detect.md — 本ゲートの直後に発火する flow フェーズ(参照のみ、変更なし)00_concept.md — 対応ラウンド上限・収束ルールの正本adaptive-production-loop.md — 1 サイクル contract(Goal/Evaluate/Stop/Memory/Schedule/Boundary)arbiter-policy.md — escalate 予算の正本decision-table.md — terminal state・サーキットブレーカーの正本stop-rollback.md — Gate 1〜5・対応ラウンド上限を「stop 条件」として横断集約し、AUTO_APPROVED 後の事後 reject 巻き戻し手順を扱う(EPIC #822 項目4。§6 と同じく本書は再定義しない)