CR-NEXUS-019: Run / Resume ステータスモデル定義

(State Machine Contract)

SRS Traceability

Related SRS: docs/srs/NEXUSCORE_SRS.md

This CR satisfies: FR-1; FR-4; NFR-1; NFR-5

1. 概要(Overview)

本 CR は、NexusCore の Run / Pause / Resume における 成否ステータス(Status)と状態遷移(State Machine)を「契約」として定義する。

目的は以下。

  • 監査・運用・API化に耐える 共通語彙(ステータス)の確立
  • Resume 失敗時の説明責務(CR-NEXUS-018)と整合した 失敗の表現方式の固定
  • RunState 永続化(CR-NEXUS-015)と整合した 状態遷移の正本の確立

本 CR は 状態モデルの定義のみであり、実装変更・ログ形式・UI 表示の統一は要求しない。

2. 背景(Background)

  • CR-NEXUS-015:Pause / Resume 実装(RunState 永続化)
  • CR-NEXUS-016:UX / 運用契約
  • CR-NEXUS-017:Resume は Orchestrator 再構築(RunState SOT)
  • CR-NEXUS-018:Resume 失敗時の説明責務(Runner 正本)

しかし、現状は以下が暗黙。

  • Run の「成功」「失敗」「中断」「一時停止」の表現が一貫していない
  • Resume 失敗が「例外」なのか「状態」なのか曖昧
  • 後続の API / Worker 管理に必要な状態語彙が未固定

よって、本 CR で 状態の正本(Runner)と状態語彙を固定する。

3. 基本原則(State Machine Principles)

  • 状態(Status)の正本は Runner とする
  • Orchestrator は状態の正本にならない(内部例外は事実だが、状態契約ではない)
  • RunState は状態の永続表現であり、Runner が更新する
  • Resume は「イベント」であり、状態遷移を引き起こす

4. 用語(Terms)

  • Status: Run の外部観測可能な状態(契約語彙)
  • Event: 状態遷移を引き起こす入力(例: pause 요청, resume 요청)
  • RunState: 永続化される状態表現(JSON)
  • Terminal Status: 終端状態(以降の遷移は原則なし)

5. ステータス語彙(Contract Status Set)

本 CR は、Run / Resume の状態を以下に限定する。

5.1 Non-terminal(非終端)

CREATED

run_id が生成され RunState が作成されたが、実行は未開始

RUNNING

実行中

PAUSED

フェーズ境界で停止し、再開可能

RESUMING

Resume 要求を受け、再構築・再開処理中

STOPPED

外部 stop 指示により停止(再開の扱いは別契約:原則再開非保証)

5.2 Terminal(終端)

SUCCEEDED

正常完了

FAILED

失敗して終了(原因分類は CR-NEXUS-018 を参照)

ABORTED

運用判断で破棄(RunState を再利用しない意思決定を含む)

EXPIRED

TTL 超過により再開非保証となり、運用上破棄扱い

6. 状態遷移(State Transitions)

6.1 遷移表(契約)

From Event To Notes
CREATED start_run RUNNING 新規 Run 開始
RUNNING pause_boundary PAUSED フェーズ境界で一時停止
RUNNING stop_requested STOPPED 外部 stop 指示
RUNNING completed SUCCEEDED 正常完了
RUNNING error FAILED 実行失敗
PAUSED resume_requested RESUMING Resume 開始
RESUMING resume_ok RUNNING 再開成功
RESUMING resume_failed FAILED Resume 失敗(説明は CR-018)
PAUSED abort ABORTED 破棄
STOPPED abort ABORTED 破棄
PAUSED ttl_expired EXPIRED 運用上の破棄扱い
EXPIRED (any) (no guarantee) 本 CR では遷移保証しない

6.2 禁止遷移(明示)

  • SUCCEEDED / FAILED / ABORTED / EXPIRED から RUNNING への遷移を正規ルートとして認めない
  • Orchestrator から直接 Status を更新してはならない(正本は Runner)

7. RunState へのマッピング(Persistent Representation)

RunState は最低限以下のフィールドを持つことが望ましい。

  • run_id
  • status(上記 Contract Status Set)
  • authority_level
  • next_phase(PAUSED の場合は必須)
  • updated_at(TTL 判定用)
  • last_error(FAILED の場合は推奨:分類コード+短文)

※ フィールド追加は別 CR で扱う。ここでは契約上の期待値のみを定義する。

8. Explainability(CR-NEXUS-018 との整合)

  • FAILED には必ず「Why(分類)」が紐づくことが望ましい
  • Runner は FAILED 遷移時に What / Why / Next Action を生成可能であることが望ましい
  • ただしログ形式や出力形式は本 CR の責務外

9. 非目標(Explicit Non-Goals)

本 CR は以下を目的としない。

  • 具体的なログスキーマ定義
  • CLI / UI 表示の統一
  • 自動リトライ、自己修復ポリシー
  • 分散実行の整合性プロトコル

10. 非機能要件(NFR)

  • core/orchestrator.py は無変更であること
  • 既存 Pause / Resume 実装(CR-015)と矛盾しないこと
  • 状態遷移が監査可能であること(run_id 単位)

11. リスク・制約

  • STOPPED と ABORTED の境界は運用設計に依存する
  • EXPIRED は現状 docs-only であり、実装は将来 CR に委ねる

12. 完了条件(Done Definition)

  • Run / Resume の Status 語彙が固定されている
  • 状態遷移表が定義されている
  • Runner が正本であることが明文化されている
  • CR-NEXUS-015〜018 と整合している

13. 備考

本 CR は Contract Layer のうち、 Run の状態語彙と監査可能性を固定する。

これにより API 化・Worker 管理・ダッシュボード可視化が 「状態語彙のブレなし」で実装可能になる。


Cursor に対する指示書(CR-NEXUS-019 用)

以下を そのまま Cursor に貼り付けて使用してください。

#project: NexusCore

Task: CR-NEXUS-019_Run_Resume_Status_State_Machine_Contract.md を新規追加する。

Scope:

  • docs-only(設計CR)の追加のみ
  • 実装コードには一切触れない

Rules:

  • docs/spec/ 配下に配置すること
  • CR タイトル・章立て・番号は変更しない
  • 冒頭に以下の SRS Traceability を必ず含める

SRS Traceability:

  • Related SRS: docs/srs/NEXUSCORE_SRS.md
  • This CR satisfies: FR-1; FR-4; NFR-1; NFR-5

Constraints:

  • Runner 正本(status 更新主体)を必ず明記する
  • Orchestrator は status 正本にならないことを明記する
  • TODO や実装提案は追加しない
  • core/orchestrator.py 無変更を前提とする

Acceptance:

  • Status 語彙が列挙されている(Non-terminal / Terminal)
  • 状態遷移表が明確に定義されている
  • CR-NEXUS-015〜018 と整合している

This site uses Just the Docs, a documentation theme for Jekyll.