CR-NEXUS-021: RunState I/O Contract
SRS Traceability
Related SRS: docs/srs/NEXUSCORE_SRS.md
This CR satisfies: FR-1; FR-4; FR-6; NFR-1; NFR-7
1. 概要(Overview)
本 CR は、RunState を中心とした Run / Pause / Resume における 入出力契約(I/O Contract)を定義する。
ここでの I/O とは以下を指す。
- 入力(Input): 外部から与えられる「イベント(Event)」であり、状態遷移を引き起こす。
- 出力(Output): 外部に提示される「RunState の投影(Projection)」であり、監査・運用・UI・API が参照する。
本 CR は 契約の定義のみであり、実装コードの変更・UI 仕様・ログ形式の統一は要求しない。
2. 前提(Dependencies / Alignment)
本 CR は以下の CR を前提とし、整合する。
- CR-NEXUS-019: Status / State Machine Contract(status 語彙と遷移)
- CR-NEXUS-018: Resume Failure Explainability Contract(FAILED の説明責務)
- CR-NEXUS-020: RunState JSON Schema Contract(RunState スキーマ正本)
3. 基本原則(I/O Principles)
- RunState スキーマの正本は CR-NEXUS-020 とする
- Status 語彙は CR-NEXUS-019 に従う
- Explainability は CR-NEXUS-018 に従う
- Orchestrator を I/O の正本にしない
- 入力はイベント、出力は RunState 投影である(I/O の分離)
4. 用語(Terms)
- Event(イベント): 状態遷移を要求する外部入力(例: start, pause, resume, stop, abort)
- Projection(投影): RunState を外部に提示するための表現(CLI 表示/API レスポンス/Web 表示など)
- I/O 正本(Source of Truth): 入出力契約の主体(誰が入力を解釈し、状態を更新し、出力を提示するか)
5. I/O 正本(Source of I/O Contract)
5.1 正本の所在
- I/O 契約の正本は Runner にある。
- Orchestrator は I/O 契約の正本にならない。
- RunState は永続化された事実データであり、I/O の解釈主体ではない。
5.2 役割分担(要点)
- Runner: Event を受け取り解釈し、RunState(CR-020)を更新し、外部へ投影を提供する。
- Orchestrator: Runner から与えられた実行入力に従ってフェーズ処理を実行する(I/O 契約の主体ではない)。
6. 入力(Input Contract): Event
6.1 入力は「イベント」である
RunState の I/O において、外部入力は以下の性質を持つ。
- 直接「状態(status)」を指定するのではなく、イベントを指定する
- イベントが 状態遷移を引き起こす(遷移の契約は CR-019)
6.2 チャネル別入力(CLI / API / Web)
CLI
- CLI はイベントを入力として受け取る(例: start, resume, stop, abort)。
- 入力は「実行要求」または「再開要求」であり、status の直接指定ではない。
API
- API はイベント入力を受け取る(例: resume_requested)。
- API は status の直接書き換え(RUNNING へ強制遷移等)を契約として許容しない。
Web
- Web UI はイベント入力を発行する(例: Pause ボタン→pause_requested)。
- Web UI は status の直接書き換えを契約として許容しない。
7. 出力(Output Contract): RunState Projection
7.1 出力は「RunState 投影」である
- 外部出力は RunState(CR-020)の 投影として表現される。
- 投影は、チャネル(CLI / API / Web)ごとに表示形式は異なり得るが、根拠データは RunState に整合すること。
7.2 チャネル別出力(CLI / API / Web)
CLI
- CLI は RunState の主要フィールド(例: run_id, status, authority_level, next_phase, updated_at)を投影する。
- FAILED の場合、可能な範囲で Explainability(CR-018)の要素(What/Why/Next Action)を投影し得る。
API
- API は RunState(CR-020)と整合した投影を返す。
- status 語彙は CR-019 と一致する。
- FAILED の場合、last_error(CR-020)を含む投影が望ましい(形式は本 CR で固定しない)。
Web
- Web は RunState を投影し、運用者が状態(status)を分類できる表示を提供する。
- FAILED の場合、Explainability(CR-018)に沿う情報を投影し得る。
8. 禁止事項(Prohibited)
- Orchestrator を I/O 正本として扱うこと(入力解釈・status 更新主体・外部投影の正本にしない)
- 外部入力として status を直接指定し、Runner の状態遷移契約(CR-019)をバイパスすること
- RunState スキーマ(CR-020)と矛盾する投影を「正」として扱うこと
- Explainability(CR-018)と矛盾する失敗表現(FAILED の意味・分類の破壊)
- 本 CR に TODO や実装提案を追加すること
- core/orchestrator.py の変更を前提とすること
9. 非目標(Explicit Non-Goals)
- API エンドポイント仕様(パス、認証、レスポンス形式)の確定
- UI 表示の詳細仕様
- ログフォーマットの統一
- 具体的なイベント名の固定(CR-019 の遷移表を超える詳細化)
10. 完了条件(Done Definition)
- CLI / API / Web の入力・出力契約が整理されている
- 禁止事項が明文化されている
- CR-015〜020 と整合している