DRP 状態遷移仕様
役割: 審査 run / pipeline session のライフサイクル契約(EDD-004)の正典。状態名・遷移条件・終端の意味は 外から観測可能な契約(polling API の
status/gateProgress、PR 起票の有無)であり、変更は L3(id_conventions.md §3)。旧 README §アーキテクチャ の State 図(mermaid)から移設(strangler-fig Phase 2 / ADR-0117)。 図の集約原則との関係: アーキテクチャビュー層(文書カタログ 第 5 層)は「図はビュー層集約・各層から参照のみ」が原則だが、本 State 図は状態機械そのものが外部契約の正典であるため例外的に本書(第 3 層)が原図を持ち、ビュー層・README からは参照リンクとする(移設先判断の記録は 文書カタログ)。
1. State 図(Pipeline session lifecycle、ADR-0066 実装済)
各 Gate の進捗を session DO で持つ、ADR-0066(実装済)の async polling 構造。状態名・遷移・終端の意味は 実行基盤(Workflows / Queue)に依存せず同一。下図の queued → running 駆動と retry/失敗の機構のみが engine で異なる(§3 注記・ADR-0120)。本番は 2026-06-05 に Workflows へ切替済み。
stateDiagram-v2
[*] --> queued: POST /chat/start ?async=true
queued --> running_triage: pickup (Workflows step.do / Queue consumer)
running_triage --> rejected: needsAdr=false
running_triage --> running_pregate: needsAdr=true
running_pregate --> rejected: 塊の混在/対症療法/行き先なし前提を検出 (ADR-0142)
running_pregate --> running_socratic: PASS / INVALID(評価不能は通す)
running_socratic --> running_body: 盲点注記のみ・差戻しなし (ADR-0071)
running_body --> running_scoring
running_scoring --> rejected: score < threshold
running_scoring --> running_cross_validation
running_cross_validation --> rejected: critical 盲点×Must×undermines (持続却下は reject 温存)
running_cross_validation --> running_consistency
running_cross_validation --> running_finalize: escalate (Part4 bounded rounds)
note right of running_cross_validation
Part4 (ADR-0109): trailing 連続却下で盲点が移動 (goalpost) or
連続却下が round-cap (CROSSVAL_ROUND_CAP 既定3) 到達 →
rejected=false で PR 起票 (slug+numbering+webhook 実行)、
本文に「Known Limitations / Escalated Residual Risks」節
(HITL マーカー) を付与。人間の merge=受理 / close=却下 が終端。
crossValidationEscalated / crossvalStopReason / crossvalRoundCount /
residualRiskTitles を telemetry に記録 (schema v8)
end note
running_consistency --> rejected: CONFLICT 検出
running_consistency --> running_review
running_review --> running_finalize
running_finalize --> complete: numbering + webhook 完了
rejected --> [*]
complete --> [*]
note right of running_review
3 vendor 並列実行
(Promise.all、差戻しなし)
end note
state error_handling <>
running_triage --> error_handling: LLM error
running_socratic --> error_handling: LLM error
running_body --> error_handling: LLM error
error_handling --> retry_gate: step/Queues retry
error_handling --> failed_terminal: 上限到達 / schemaVersion 不一致
retry_gate --> running_triage: gate 別 retry (完了済み step はキャッシュ返却)
failed_terminal --> [*]
凡例:
running_*= Gate 実行中、client polling で gate_progress を取得可能running_pregate= ② 受付プリゲート (Gate 0a / ADR-0142) 実行中。triage 通過後・socratic の前に起案の分析破れ (塊の混在・対症療法・行き先のない前提) を検査し、FAIL はrejectedで差戻し、PASS と INVALID (評価不能) は socratic へ進める。graph 分岐で OFF 可能・本番稼働 2026-06-15rejected= Gate 0 / 受付プリゲート / 4 / Cross-Validation / 2 の差戻し条件 (起案者にフィードバック返却)。Gate 1 は ADR-0071 で情報提供型に変更され差戻ししない- Cross-Validation 却下のうち goalpost ループ (trailing 連続却下・盲点が毎回移動) または round-cap (
CROSSVAL_ROUND_CAP既定3 到達) と判定されたものは Part4 (ADR-0109) でrejected=falseに降ろされ、slug+numbering+webhook を実行して PR として起票される (complete)。本文に「Known Limitations / Escalated Residual Risks」節 (HITL マーカー) が付与され、人間の merge=受理 / close=却下 が最終終端。crossValidationEscalated/crossvalStopReason/crossvalRoundCount/residualRiskTitlesを telemetry に記録。同一盲点の持続却下は round-cap より優先してrejectedを温存 (FN=0 維持)- ⚠️ 旧記述訂正: Part2 単独時は
rejectedのまま escalate フラグを付与する挙動だったが、Part4 で PR 起票 (rejected=false) に変更された。escalate は現在「新しい成果物終端」であるerror_handling/retry_gate/failed_terminal= engine 別の再実行・失敗終端機構(§3 注記)。Workflows(本番 active): step の durable retry — 完了済み step はキャッシュから返り再実行されない(LLM 多重課金が構造的に発生しない)。checkpoint schemaVersion不一致は retry せず即failed終端 + telemetry 記録(ADR-0120 決定 1)。Queue(rollback 先): ADR-0066 の Cloudflare Queues 自動 retry(< 3)+ 3 回失敗で Dead Letter Queue(pipeline-queue-dlq)
2. session status の規範定義(polling API の契約)
GET /chat/status/:sessionId が返す status(API 仕様書 / openapi.yaml の SessionStatus):
| status | 意味 | 遷移元 | 終端? |
|---|---|---|---|
queued | 実行基盤に投入済・未開始(Workflows instance 起動待ち / Queue consumer 未 pickup) | POST /chat/start ?async=true / POST /runs | — |
running | いずれかの Gate 実行中(gateProgress で gate 単位の pending/running/done/failed を露出) | queued | — |
complete | 全ゲート完了(差戻しによる完了を含む。result に最終 state) | running | ✅ |
error | gate 失敗(step/retry 上限超過・schemaVersion 不一致)または watchdog 発火。error.gate / error.message + partialResults(ADR-0089)を露出 | running / queued | ✅ |
cancelled | 協調キャンセル成立(POST /chat/cancel)。engine=workflows は instance terminate + DO cancel-finalize、engine=queue は consumer が gate 境界で中断(ADR-0101 / ADR-0120) | queued / running | ✅ |
- session は TTL 24 時間(
expiresAt)。期限後の polling は 410。 completeであっても審査結果が差戻し(result.rejected=true)の場合がある。HTTP/session の終端と審査判定は別軸。
3. Watchdog(無進捗検知 / ADR-0103 EC-3)
per-session DO alarm が無進捗を検知し status: error(watchdog-timeout)へ強制遷移させる:
| 監視対象 | 閾値 | 定義 |
|---|---|---|
queued のまま放置(Workflows: instance 起動待ち滞留 / Queue: consumer pickup 不全) | 30 分(QUEUED_STUCK_MS) | src/do/session_watchdog.ts |
running のまま更新なし(gate 進行停止) | 20 分(RUNNING_IDLE_MS) | 同上。健全な run は gate ごとに updatedAt 書込 → alarm リセットされるため、単一 gate 所要が閾値未満なら誤発火しない |
検証プローブは POST /debug/watchdog-probe(フラグ有効時のみ)。運用手順は operator_guide §7.10。
Workflows engine 固有の運用(リアルタイムアラート running instance >20・instance status API の週次アサート・本番切替/rollback 手順)は operator_guide §7.13、入口切替 flag は §7.12 を参照。
4. 終端セマンティクス(人間承認との接続)
complete+ PR 起票 = ADR はStatus: Proposed。Accepted/Supersededへの遷移は代表取締役のみ(Branch Protection で強制)。- Cross-Validation escalate 終端(ADR-0109 Part4)= 残余リスク節 + HITL マーカー付き PR。人間の merge=受理 / close=却下が最終終端であり、自動 reject はしない(同一盲点の持続却下のみ reject 温存 = FN を作らない)。
変更履歴
| 日時 | 変更 |
|---|---|
| 2026-06-16 | ② 受付プリゲート(running_pregate / Gate 0a・ADR-0142)を State 図に追加 — running_triage→running_pregate→running_socratic と running_pregate→rejected の遷移・凡例を追記、EDD-004 covers に SR-012 を追加。本番稼働 2026-06-15 を反映 |
| 2026-06-05 | ADR-0120 本番切替(Workflows・2026-06-05)に追従 — State 図と status/watchdog を engine 非依存に明記し、queued→running 駆動・retry/失敗終端(Workflows durable retry + schemaVersion 不一致即 failed / Queue retry+DLQ)・キャンセル機構を engine 別に併記 |
| 2026-06-05 | 初版 — 旧 README §8.1 図 3 State 図 + 凡例(2026-06-05 時点 L167-218)を移設し、session status / watchdog / 終端セマンティクスの規範定義を追加(ADR-0117 Phase 2) |