Status: Phase 0.1 canon(#1275) North Star:
north-star.md§8 / §20 Role: V2 の Run を記述する語彙を 4 つの直交軸に固定する。Legacy ai-loop の語彙とは境界を分け、V2 namespace では混在を禁止する。
Legacy ai-loop では AUTO_APPROVED / HUMAN_ESCALATED / BLOCKED が「裁定結果」「Run の終端」「停止理由」を兼ね、no_progress や budget_exhausted が state と decision の両方に現れた(#894 の termination.decision enum、#1025 の status enum、#869 の内側ループ成果)。1 つの enum に「今どこにいるか」「どう終わったか」「なぜ止まったか」「Policy が何と言ったか」を詰めると、Agent ごとに解釈が分かれ、RunEvidence の比較が成立しない。
V2 では次の 4 軸を別フィールドで持つ。
| 軸 | 問い | 値域の性質 |
|---|---|---|
| Lifecycle State | Run は今どこにいるか | 非終端。遷移する |
| Terminal Outcome | Run はどう終わったか | 終端。1 Run に高々 1 つ |
| Stop Reason | なぜ継続できなかったか | Outcome の根拠。複数可 |
| Policy Verdict | Policy Gate は何と判定したか | Gate の出力。Outcome ではない |
本 taxonomy は Delivery Run の語彙として定義する。North Star §4「Delivery と Evolution は同じ state / gate / success condition で表現しない」に従い、4 軸のうち Evolution Loop に転用するものを次に限定する。
| 軸 | Evolution Loop(Candidate 評価)への適用 |
|---|---|
| Lifecycle State | 適用しない。Candidate 評価 Run の進行表現は Delivery の State 値域を流用しない(Phase 1 で確定) |
| Terminal Outcome | 適用しない。MERGE_READY は Delivery 契約であり、Candidate の採否は Terminal Outcome ではなく Promotion Decision(PASS / FAIL / INCONCLUSIVE)で表す(Phase 1 で確定) |
| Stop Reason | 語彙のみ共用。Candidate 評価が成立しない理由を記録する語として使ってよいが、Delivery Outcome の根拠としては使わない |
| Policy Verdict | 適用する。Policy Gate は Delivery / Evolution の双方に働く単一の Gate であり、Evaluation Trust Boundary の交差判定も同じ Gate の出力(DENIED / HUMAN_REQUIRED)で表す(evaluation-trust-boundary.md §1 / §7)。Verdict は「成功条件」ではなく「禁止・要 Human の宣言」であり、Delivery と Evolution で success condition を共有することにはならない |
phase0-migration.md §8 の「Candidate 評価 Run(Evolution Loop)の進行・終端表現」)。Phase 0.1 時点では未定義であり、暫定的に Delivery の値域を当てはめない。INCONCLUSIVE は Promotion Decision の値であって Terminal Outcome ではない。HUMAN_REQUIRED に State WAITING_HUMAN / Human 否認時の Outcome HUMAN_ESCALATED + Stop Reason HUMAN_REJECTED という写像を内蔵している。一方、本表は Evolution に State / Outcome を適用しない。Evolution 側は HUMAN_REQUIRED を実際に使う(evaluation-trust-boundary.md §1 の fail-closed)ため、その後の待ち状態と終端を表す語が Evolution に存在しない。Phase 0.1 ではこの欠落を disclosed な未決として扱い、phase0-migration.md §8 で確定する。Delivery の WAITING_HUMAN / HUMAN_ESCALATED を Evolution へ暫定流用しない(Stop Reason は「語彙のみ共用」の範囲で HUMAN_REJECTED を記録語として使ってよい)。| State | 意味 |
|---|---|
PLANNING |
Plan / LoopContract を作成中 |
PLAN_VERIFYING |
Initial Plan Verification(Requirements / Design / Technical / Research evidence)を実行中 |
EXECUTING |
Builder が artifact を作成中 |
VERIFYING |
Verifier pipeline を実行中 |
DIAGNOSING |
Verify FAIL の観測を FailureRecord に正規化中 |
REPAIRING |
Plan は有効。artifact を修正中 |
REPLANNING |
Plan が無効。Plan を作り直し中(完了後は PLAN_VERIFYING へ戻る) |
PR_CONVERGING |
PR 作成後の CI / review / conflict 収束中 |
WAITING_HUMAN |
Human action(C-3 / 判断 / 承認)待ち |
WAITING_EXTERNAL |
外部(CI / provision / API)待ち |
原則:
NO_PROGRESS / BLOCKED / MERGE_READY を State にしない。WAITING_* は停止ではなく待機。再開条件は RunState の pending_action が持つ。WAITING_FOR_CHECKS / CHECKS_FAILED / REVIEW_REPAIR / CONFLICT / MERGE_READY_CANDIDATE)は PR_CONVERGING の内部詳細として再利用してよいが、V2 の Lifecycle State 値域には昇格させない。| Outcome | 意味 |
|---|---|
MERGE_READY |
Delivery 契約を満たし、C-4 / merge(Human-owned)待ちで停止 |
HUMAN_ESCALATED |
AI では継続できず、Human の判断へ返した |
BLOCKED |
外部条件・権限・境界により この Run は終了。Run 内で解消する見込みが無い。条件解除後の再開は WAITING_EXTERNAL からの復帰ではなく 新 Run(resumed_from_run_id で連結) |
原則:
AUTO_APPROVED は Outcome にならない。HUMAN_ESCALATED / BLOCKED は必ず 1 つ以上の Stop Reason を伴う。MERGE_READY は Stop Reason を伴わない(正常終端)。WAITING_EXTERNAL、解消見込みが無いものは Outcome BLOCKED。Legacy #1025 の status: BLOCKED(再開可能な status)とは意味が異なる(§7)。WAITING_HUMAN は Run 内の Human action(C-3 / 判断)のみを指し、C-4 待ちは MERGE_READY 終端後であって State を持たない。| Reason | 意味 | 検出主体 |
|---|---|---|
NO_PROGRESS |
iteration 間で evidence delta / blocker delta / artifact delta が無い | Decision Engine |
REPEATED_FAILURE |
同一 failure fingerprint が閾値回反復 | Decision Engine |
OSCILLATION |
resolved → reintroduced → resolved の往復、または修正 A/B の反復 | Decision Engine |
BUDGET_EXHAUSTED |
iteration / time / token / cost / repair round の上限到達 | Decision Engine |
POLICY_DENIED |
Policy Verdict が DENIED |
Policy Gate |
VERIFIER_UNAVAILABLE |
必須 Verifier が実行不能・判定不能(fail-open しない) | Verifier pipeline |
REQUIREMENT_CONFLICT |
受入基準同士、または Plan と受入基準が矛盾 | Plan Verification / Diagnoser |
STATE_CONFLICT |
RunState の revision CAS 失敗(並行 resume 等) | RunState store |
HUMAN_REJECTED |
Policy Verdict HUMAN_REQUIRED の後、Human が継続を否認した |
Human(WAITING_HUMAN からの復帰時) |
原則:
BUDGET_EXHAUSTED + REPEATED_FAILURE)。| Verdict | 意味 |
|---|---|
AUTO_APPROVED |
Policy profile の範囲内で Human 承認なしに次段へ進んでよい |
HUMAN_REQUIRED |
Human の判断が必要(→ State WAITING_HUMAN。Human が否認すれば Outcome HUMAN_ESCALATED + Stop Reason HUMAN_REJECTED) |
DENIED |
Policy が禁止(→ Stop Reason POLICY_DENIED) |
原則:
Loop Execution != Auto Approval)。AUTO_APPROVED は C-3’ 等の optional autonomy / policy profile の語彙。V2 Core の Delivery 成立条件にしない。state: WAITING_HUMAN # 進行中
policy_verdict: HUMAN_REQUIRED
outcome: HUMAN_ESCALATED
stop_reasons: [NO_PROGRESS]
policy_verdict: HUMAN_REQUIRED
outcome: BLOCKED
stop_reasons: [VERIFIER_UNAVAILABLE]
outcome: MERGE_READY
stop_reasons: []
policy_verdict: AUTO_APPROVED # profile が許す場合のみ。無くても MERGE_READY は成立する
state: NO_PROGRESS # Stop Reason を State にしている
outcome: AUTO_APPROVED # Policy Verdict を Outcome にしている
state: MERGE_READY # Outcome を State にしている
policy_verdict: MERGE_READY # Outcome を Verdict にしている
outcome: HUMAN_ESCALATED # Reason が無い
stop_reasons: []
| Legacy の用法 | V2 での読み替え |
|---|---|
C-3’ arbiter の AUTO_APPROVED / HUMAN_ESCALATED / BLOCKED(scripts/ai-loop/arbiter.py、docs/workflows/ai-loop/**) |
AUTO_APPROVED → Policy Verdict。HUMAN_ESCALATED / BLOCKED → Terminal Outcome。V2 taxonomy を Legacy 実装へ逆輸入しない(語彙・state 機械の書き換えをしない)。phase0-migration.md §2 の freeze 例外(security fix 等)を禁じる意味ではない |
#1025 の status: RUNNING / WAITING_HUMAN / WAITING_EXTERNAL / BLOCKED / COMPLETED |
RUNNING → Lifecycle State 群、WAITING_* → State、BLOCKED → Outcome(終端。Legacy の「再開可能な BLOCKED」は V2 では WAITING_EXTERNAL)、COMPLETED → Outcome(MERGE_READY 等)へ分解 |
#894 termination.decision: continue \| success \| blocked \| human_escalated \| budget_exhausted \| no_progress \| repeated_failure \| policy_denied |
continue → Decision Engine の継続判断(Outcome ではない)、success → MERGE_READY、blocked / human_escalated → Outcome、残り → Stop Reason |
Legacy RunEvidence schema terminal_state(docs/schemas/run-evidence.schema.json) |
値域は V2 Terminal Outcome と一致。名称は V2 では outcome。Legacy schema は変更しない |
docs/workflows/ai-loop/delivery-state-machine.md の PR サブステート |
PR_CONVERGING の内部詳細(reusable pattern)。V2 Lifecycle State に昇格しない |
Legacy 文書・Issue の履歴は書き換えない。V2 namespace(docs/ai/ai-loop-v2/** と V2 として起票・rebaseline された Issue)で本 taxonomy 以外の語彙を canon として使うことを禁止する。Legacy を参照する場合は evidence / reusable pattern と明示する。
V2 namespace に対して次を検査する。いずれも 0 件が期待値。
git grep --full-name -nP '^\s*state:\s*(NO_PROGRESS|REPEATED_FAILURE|OSCILLATION|BUDGET_EXHAUSTED|POLICY_DENIED|VERIFIER_UNAVAILABLE|REQUIREMENT_CONFLICT|STATE_CONFLICT|MERGE_READY|HUMAN_ESCALATED|BLOCKED)\b' -- :/docs/ai/ai-loop-v2 | grep -vE '(^|:)docs/ai/ai-loop-v2/taxonomy\.md:.*# .*(にしている|が無い)'
git grep --full-name -nP '^\s*outcome:\s*(AUTO_APPROVED|HUMAN_REQUIRED|DENIED)\b' -- :/docs/ai/ai-loop-v2 | grep -vE '(^|:)docs/ai/ai-loop-v2/taxonomy\.md:.*# .*(にしている|が無い)'
git grep --full-name -nP '^\s*policy_verdict:\s*(MERGE_READY|HUMAN_ESCALATED|BLOCKED)\b' -- :/docs/ai/ai-loop-v2 | grep -vE '(^|:)docs/ai/ai-loop-v2/taxonomy\.md:.*# .*(にしている|が無い)'
出力側と入力側の両方を repo root 基準に固定している。片方だけでは検査が沈黙する。
--full-name(出力側)はリポジトリ root 以外から実行した場合の相対パス出力を防ぐ。:/(入力側)は、pathspec docs/ai/ai-loop-v2 が cwd 相対に解決されることを防ぐ。:/ を付けないと、例えば docs/ から実行した場合の対象は docs/docs/ai/ai-loop-v2(存在しない)になり、positive control ですら 0 件 / exit=1 になる(レビューで実測)。「0 件」が検査の成功ではなく沈黙を意味する状態になる。(^|:) にするのは、git grep <rev> … 形式では出力が <rev>:docs/… になり、行頭アンカー ^docs/ では除外が空振りして「0 件」が偽になるため(レビューで実測)。positive control: 上記コマンドから | grep -vE '(^|:)docs/ai/ai-loop-v2/taxonomy\.md:.*# .*(にしている|が無い)' を外して taxonomy.md 自身に当て、§6 の禁止例が検出されること(state: 2 行 / outcome: 1 行 / policy_verdict: 1 行 = 計 4 行)を先に確認する。検出されない場合は検査が空振りしており「0 件」を証拠にしてはならない。-E(POSIX ERE)では \s / \b が効かず常時 0 件になる(レビューで実測)。positive control は repo root だけでなく、サブディレクトリ(例 docs/)からも実走して 4 行が出ることを確認する(pathspec の cwd 相対解決による沈黙は root からの実行では現れない)。
grep で検査できない禁止例(1 件): §6 の禁止例は 5 件だが、上記 3 本が検出できるのは 4 行のみ。残る 1 件 —
outcome: HUMAN_ESCALATED
stop_reasons: []
— は §3 の中核規則「HUMAN_ESCALATED / BLOCKED は必ず 1 つ以上の Stop Reason を伴う」の違反であり、2 行の関係(同一 Run 内の outcome と stop_reasons の組み合わせ)を見ないと判定できないため、行単位の grep では原理的に検査できない。この 1 件は Phase 1 の fixture 化で検査対象にする(phase0-migration.md §8)。Phase 0.1 時点では 未検査であり、上記 3 本の「0 件」を §6 全体の充足根拠にしてはならない。
Phase 1 で tests/extras/ に fixture 化し、本節の禁止例を negative control として固定する(phase0-migration.md §8)。