CR-NEXUS-020: RunState JSON スキーマ契約定義

(Field / Optionality / Versioning Contract)

SRS Traceability

Related SRS: docs/srs/NEXUSCORE_SRS.md

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

1. 概要(Overview)

本 CR は、Pause / Resume のために永続化される RunState(JSON)について、 フィールド定義(Field)/必須・任意(Optionality)/バージョニング(Versioning)を 「スキーマ契約(Schema Contract)」として定義する。

目的:

  • RunState を API / Worker / CLI / 監査で共有できる 安定した永続契約にする
  • CR-NEXUS-019 の Status 状態機械を RunState に確実にマッピングする
  • CR-NEXUS-017 の再構築モデル(RunState SOT)における 復元可能性の境界を固定する
  • CR-NEXUS-018 の Explainability(失敗説明)に必要な最小情報を保持する

本 CR は スキーマの定義のみであり、 パーサ・バリデータ・マイグレーションの実装は要求しない。

2. 背景(Background)

  • CR-NEXUS-015:RunState 永続化(JSON)
  • CR-NEXUS-016:RunState 運用(TTL 等)
  • CR-NEXUS-017:Resume は再構築(RunState が SOT)
  • CR-NEXUS-018:Resume 失敗説明(Runner 正本)
  • CR-NEXUS-019:Status / State Machine の契約化

現状、RunState は動作しているが、以下が契約として未固定。

  • JSON のフィールド集合
  • 必須/任意
  • 破壊的変更を避けるためのバージョニング規約

これを固定しないまま API 化すると、永続互換性で破綻する。

3. 基本原則(Schema Principles)

  • RunState は 永続契約である(短命キャッシュではない)
  • 正本は Runner(RunState の生成・更新主体)
  • 後方互換性を優先する(既存 run_id を壊さない)
  • フィールド追加は許容するが、削除・意味変更は破壊的変更とみなす
  • Unknown field は無視可能であることが望ましい(Forward compatibility)

4. 用語(Terms)

  • Schema Version: RunState の JSON 構造の版
  • Required: 存在しない場合、RunState は無効と判定され得る
  • Optional: 省略可。存在する場合のみ利用
  • Compatibility: 旧版 RunState を新 Runner が扱える性質

5. RunState JSON:トップレベル契約

5.1 トップレベル必須フィールド(Required)

Field Type Meaning
schema_version string スキーマ版(例: “1.0”)
run_id string 一意・非意味的識別子(CR-016)
status string CR-019 の Status 語彙
authority_level string human / partial / full
next_phase string or null 再開点(PAUSED 時は必須、他は null 可)
updated_at string (ISO 8601) 最終更新時刻(TTL 判定の基準)

必須制約:

  • status == “PAUSED” の場合、next_phase は null ではならない
  • status in {“SUCCEEDED”,”FAILED”,”ABORTED”,”EXPIRED”} の場合、next_phase は null であることが望ましい

5.2 トップレベル任意フィールド(Optional)

Field Type Meaning
created_at string (ISO 8601) 作成時刻
stop_reason string 停止理由(例: AUTHORITY_GATE, EXTERNAL_STOP)
last_error object 失敗説明の最小情報(CR-018)
context_snapshot object 再構築に必要な最小コンテキスト(CR-015/017)
history array 状態遷移の履歴(監査目的、将来用)
metadata object 拡張情報(将来互換用の入れ物)

6. last_error(Explainability Minimal Record)

6.1 目的

FAILED の場合に、Runner が説明(What/Why/Next Action)を生成するための最小情報。

6.2 形(推奨スキーマ)

last_error は以下を推奨する(任意フィールド)。

Field Type Required Meaning
code string yes CR-018 の分類(STATE_INVALID 等)
message string yes 短い説明(機械・人間両方を想定)
phase string no 失敗した phase(わかる場合)
occurred_at string (ISO 8601) no 発生時刻
next_action string no 推奨行動(再試行/破棄/再実行)

制約:

  • status == “FAILED” の場合、last_error.code と last_error.message を 保持することが望ましい(必須化はしない)

7. context_snapshot(Reconstruction Input)

7.1 原則

RunState の SOT を維持するため、Resume に必要な情報は context_snapshot に閉じるのが望ましい。

ただし本 CR は内容の完全標準化を行わず、「入れ物」を契約化する。

7.2 形(最小)

context_snapshot は object とし、Runner が必要に応じて格納する。 内部キーは将来拡張し得るため、unknown key を許容する。

8. history(Audit Trail, Optional)

history は将来の監査・可視化のための任意フィールド。

各要素は以下を推奨。

Field Type Meaning
at string (ISO 8601) 記録時刻
from string 旧 status
event string event 名
to string 新 status
note string 補足

9. バージョニング規約(Versioning)

9.1 方式

schema_version は “MAJOR.MINOR” 形式の文字列とする(例: “1.0”)

9.2 互換性ルール

MINOR 変更(例: 1.0 → 1.1)

  • フィールド追加のみ
  • 既存フィールドの意味変更なし
  • 旧 Runner でも「無視して動く」ことが望ましい

MAJOR 変更(例: 1.x → 2.0)

  • 必須フィールドの追加、削除、意味変更
  • 破壊的変更
  • マイグレーション方針は別 CR とする

9.3 Unknown field の扱い(Forward compatibility)

  • Runner は unknown field を無視できることが望ましい
  • Runner は unknown field を保持したまま更新できることが望ましい(Read-Modify-Write)

10. 非目標(Explicit Non-Goals)

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

  • JSON Schema(Draft)としての完全形式化
  • マイグレーション手順・ツール
  • 署名・暗号化・改ざん検知
  • 具体的な保存パス規約(CR-015 に従う)

11. 非機能要件(NFR)

  • 既存 RunState(CR-015 実装)と整合し得ること
  • RunState は監査・説明に耐える最小情報を保持できること
  • core/orchestrator.py は無変更であること

12. リスク・制約

  • history / context_snapshot は任意であるため、運用・監査の粒度は実装に依存する
  • schema_version 運用を誤ると互換性が破綻する(運用ルールが重要)

13. 完了条件(Done Definition)

  • RunState の必須/任意フィールドが契約化されている
  • status と next_phase の整合制約が明文化されている
  • schema_version の互換ルールが明文化されている
  • CR-NEXUS-015〜019 と矛盾しない

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

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

#project: NexusCore

Task: docs/spec/CR-NEXUS-020_RunState_JSON_Schema_Contract.md を新規追加する(docs-only)。

Scope:

  • スキーマ契約(Field / Optionality / Versioning)の定義のみ
  • 実装コードには一切触れない

Rules:

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

SRS Traceability:

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

Constraints:

  • Runner が RunState の生成・更新主体(正本)であることを明記
  • status 語彙は CR-NEXUS-019 と一致させる
  • Explainability は CR-NEXUS-018 と整合させる
  • Versioning ルール(MAJOR/MINOR)を明記
  • TODO や実装提案は追加しない
  • core/orchestrator.py 無変更を前提とする

Acceptance:

  • 必須/任意フィールドが表で定義されている
  • status と next_phase の整合制約が明文化されている
  • schema_version の互換ルールが明文化されている
  • CR-015〜019 と整合している

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