CR-NEXUS-022: RunState 完全性・改ざん検知契約定義

(Integrity / Tamper Detection / Trust Boundary Contract)

SRS Traceability

Related SRS: docs/srs/NEXUSCORE_SRS.md

This CR satisfies: FR-1; FR-6; FR-7; NFR-1; NFR-8

1. 概要(Overview)

本 CR は、RunState(CR-020)について 完全性(Integrity)・改ざん検知(Tamper Detection)・信頼境界(Trust Boundary)を 設計契約(Contract)として定義する。

目的:

  • RunState が どこまで信頼できるデータかを明文化する
  • CLI / API / Web / Worker / Storage 間で 「信頼してよい」「検証すべき」境界を固定する
  • 将来の API 公開・SaaS 化・マルチ Runner 環境における RunState 改ざんリスクを設計段階で封じる

本 CR は 契約定義のみであり、

  • 暗号アルゴリズムの確定
  • 署名鍵管理
  • 実装コード変更

は要求しない。

2. 背景(Background)

これまでに以下が成立している。

  • CR-017:RunState は Resume の唯一の SOT
  • CR-019:Status 遷移は Runner 正本
  • CR-020:RunState JSON スキーマ契約
  • CR-021:RunState I/O 契約(外部投影)

この構造では、RunState が以下の経路を通る可能性がある。

  • ファイルシステム保存
  • API 経由取得・更新
  • Web UI 参照
  • 将来の外部連携

つまり、RunState は攻撃・誤操作・不整合の対象になり得る。

よって、

  • 「壊れた RunState をどう扱うか」
  • 「誰が RunState を信頼してよいか」

を契約として固定する必要がある。

3. 基本原則(Integrity Principles)

  • RunState は 不変データではない(更新される)
  • ただし 正当な更新経路は Runner に限定される
  • RunState の完全性検証は Runner の責務
  • Orchestrator は RunState の完全性を検証しない
  • 完全性検証に失敗した RunState は 再開正本にならない

4. Trust Boundary(信頼境界)の定義

4.1 信頼される境界(Trusted)

以下は 信頼境界内とする。

  • Runner プロセス内部
  • Runner が生成・更新した直後の RunState
  • Runner が検証済みと判断した RunState

4.2 非信頼境界(Untrusted)

以下は 信頼できない入力として扱う。

  • 外部ストレージから読み込んだ RunState
  • API 経由で渡された RunState
  • 手動編集された RunState
  • Web UI から送信された RunState データ

→ これらは 必ず検証対象。

5. 完全性検証モデル(Conceptual)

5.1 検証対象

完全性検証の対象は以下。

  • RunState の 構造(schema_version / 必須フィールド)
  • RunState の 内容(status × next_phase 整合など)
  • RunState の 改ざん有無(検知)

5.2 改ざん検知の抽象モデル

本 CR は、以下の 抽象モデルのみを契約とする。

  • RunState に対して 検証可能な完全性指標を付与できる
  • Runner はそれを用いて 検証成功/失敗を判定できる

方式は以下のいずれでもよい(例示)

  • ハッシュ(checksum)
  • HMAC
  • デジタル署名

※ 具体方式・フィールド名は本 CR では固定しない。

6. RunState への影響(Schema との関係)

6.1 スキーマ拡張の扱い

完全性情報は、CR-020 の以下いずれかに格納され得る。

  • metadata 内の拡張フィールド
  • 将来の MINOR schema_version による追加フィールド

本 CR は 必須フィールド追加を要求しない。

6.2 検証失敗時の扱い

完全性検証に失敗した RunState は、以下として扱う。

  • Resume 正本として使用してはならない
  • status を直接更新してはならない
  • Runner は FAILED または ABORTED 相当として扱う判断を行い得る

※ 実際の status 遷移は CR-019 に従う。

7. Explainability との整合(CR-018)

完全性検証失敗は 説明対象の失敗理由になり得る。

失敗分類例(参考)

  • STATE_INVALID
  • STATE_TAMPERED

分類語彙の確定は本 CR の責務外。

8. 禁止事項(Hard Constraints)

  • Orchestrator が RunState の完全性を検証すること
  • 検証されていない RunState を Resume 正本として扱うこと
  • 外部入力 RunState を「信頼済み」と仮定すること
  • 完全性検証を UI / API クライアント側に委ねること

9. 非目標(Explicit Non-Goals)

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

  • 暗号アルゴリズム選定
  • 鍵管理・ローテーション設計
  • 性能最適化
  • 監査ログの形式定義

10. 非機能要件(NFR)

  • 完全性検証は Runner 内で完結すること
  • 検証失敗は 黙って無視されないこと
  • core/orchestrator.py 無変更を前提とする

11. リスク・制約

  • 検証を導入しない実装では改ざん検知は保証されない
  • ただし 契約があることで将来導入が破壊的にならない

12. 完了条件(Done Definition)

  • RunState の信頼境界が明文化されている
  • 完全性・改ざん検知の責務主体(Runner)が固定されている
  • 検証失敗時の扱いが契約として定義されている
  • CR-016〜021 と矛盾しない

13. 備考

本 CR により、NexusCore は

  • 「状態を保存できる」
  • 「状態を再開できる」
  • 「状態を信頼できる/できないを判断できる」

という 商用・API・監査耐性の最終要件を満たす。


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

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

#project: NexusCore

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

Scope:

  • RunState 完全性・改ざん検知・信頼境界の契約定義のみ
  • 実装コードには一切触れない

Rules:

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

SRS Traceability:

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

Constraints:

  • Runner を完全性検証の正本にする
  • Orchestrator に検証責務を持たせない
  • 暗号方式・鍵管理は未確定とする
  • RunState スキーマは CR-NEXUS-020 を前提とする
  • TODO や実装提案を追加しない
  • core/orchestrator.py 無変更前提

Acceptance:

  • Trust Boundary が明文化されている
  • 完全性検証の責務主体が明示されている
  • 検証失敗時の扱いが契約化されている
  • CR-016〜021 と整合している

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