OPUS_D2_SCOPE_CLARIFICATION（P28-02-DIAG。base 8c06c3b44235a52f35898b1f6263e8ee064af256 の SPEC §3.1・§3.3、D2 の「live の全状態」の境界を確定する。原本の条件、SPEC、TASK_INSTRUCTIONS、baseline は変更しない。TASK_INSTRUCTIONS の全指示は従来どおり守る）

この確定の位置づけ
- 「全状態」を、製品が保存する状態（S 層）と、それに関わる、名前を挙げた有限の内部状態（K 層・C 層）の和として定める。対象を独自に除外することも、無差別な走査を足すこともしない。比較は、tick の外の各計測（snapshot の変換、scratch の restore・save・load・validator）の前と後で行う。
- 製品の値や仕様の変更の承認ではない。診断の観測の副作用が無いことを確かめるための、比較の範囲の具体化である。

S 層: 製品が保存する状態（必須）
- SimulationRuntime.create_snapshot() が返す Dictionary の全体を、var_to_bytes で完全一致させる（SimulationDigest だけでは不可）。
- 差がある場合は、RESTART の修正8で確定した typed の正規表現（文字順の key、衝突は拒否、typeof・配列の順序・値を保つ）で path を特定して報告する。dict の列挙の順序だけの差も、path つきで記録する。

K 層: kernel の、保存されない内部状態（名前を挙げたものだけ。get() で受動的に読む）
- GameClock: absolute_minute、speed、paused、snapshot_version、_accumulator（f64 の hex）、_skip_next_process、_pause_request_serial、_abort_current_tick_requested、_last_tick_advanced。
- _phase_handlers: phase ごとの handler ID の集合を、文字で並べた一覧として比べる。Callable の同一性は比べない。
- performance_budget: _sample_counts、_totals、_samples（metric ごとの配列）。tick の外の計測でこれらが変われば、失敗にする。
- 前後で完全一致を要求する。

C 層: Runtime の内部キャッシュ（create_snapshot が書き換えうるもの。autoload/simulation_runtime.gd:134-136、:11183-11200）
- _mvp_manifest_cache_generation、_mvp_manifest_cache_catalog の同一性（get_instance_id）、_mvp_manifest_cache の var_to_bytes。
- 規則:
  - (a) 計測の前に cache が満たされていること（generation が現在の catalog の get_manifest_generation() と一致）を記録する。満たされていなければ、計測の外で create_snapshot() を1回呼んで満たし、その事実を記録する（cache が埋まったのは、計測より前の準備としてである）。
  - (b) 計測の区間の中で cache miss（generation か catalog の変化、または cache の bytes の変化）が起きたら、その計測の標本に cache_miss_in_sample=true を付けて記録する。値は捨てず、cache の再構築を含む inclusive の値として扱う。黙って除外したり、平均に混ぜて隠したりしない。
  - (c) 計測の後の C 層が、計測の前と完全一致すること。(b) の miss があった場合は、その後の cache が、現在の catalog から作った manifest と一致することを確かめる。古い値や他の値が残っていれば失敗にする。
- これは、P28-02-OPT の E4（キャッシュの古さ）と E5（所有権）の診断側の前提である。create_snapshot() が cache の deep copy を返すことも記録する（:11185-11199）。

observer の副作用の検査（有限）
- 診断が接続する signal（tick_started、tick_phase_started、tick_completed、path_query_measured）について、接続の前と、切断した後で、各 signal の get_connections() の件数と、接続先の object と method の一覧が一致すること（診断の分は除く）。
- 診断で DomainEventStream に subscribe した場合は、unsubscribe の後に、subscriber の一覧が元に戻っていること。

scratch の参照の漏れの検査
- scratch に渡すのは、live の snapshot の deep copy だけ。scratch の操作の後で、S 層・K 層・C 層が完全一致すること。scratch の Runtime や関連の object を解放した後に、それらの instance ID が is_instance_id_valid で無効になっていること。scratch の path は private user:// の下に限る。

起動の構成（未指定だった点の確定）
- 代表入力 R は、collector の SPEC §4.3 と同じ順序で既定の autoload に復元し、main を追加する（headless）。こうすることで、同期の受け手（state_updated などに接続する main 側の処理）が、実際のゲームと同じように I11 の inclusive の区間に入る。保存の policy による autosave が区間の中で起きたら、事実として記録する。

対象の外（理由つき）
- Object の参照や循環の無差別な走査、engine・描画・OS の状態、node の木の全体: 製品の永続状態でも、P28-02 の計測で変わりうる内部状態でもないため対象外とする。上の K 層・C 層・observer・scratch の検査で、診断の副作用は検出できる。

報告
- 各計測の前後の S/K/C 層の SHA と一致の結果、cache の状態、observer の接続の件数、scratch の解放を、report に記録する。測れない項目は、理由つきの未測定にする（0 で補わない）。上記で決めきれない不足は、具体的な箇所を示した場合に限り blocked にする。
