From bc582be820ed8a8d3459cb0753abd8b770a4de4e Mon Sep 17 00:00:00 2001 From: Takeshi Date: Wed, 21 Oct 2026 01:08:32 +0900 Subject: [PATCH] P28-01-RESTART: Track SPEC_CLARIFICATION_01 (spec SHA algorithms, exact X(B, SAVE_LOAD_FAILED)) Frozen SPEC/DRAFT/baseline/contract unchanged; original acceptance RS1-RS8 unchanged. Co-Authored-By: Claude Opus 5.5 --- .../p28-01/restart/SPEC_CLARIFICATION_01.md | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 docs/plans/original-completion-2026-10-02/execution/p28-01/restart/SPEC_CLARIFICATION_01.md diff --git a/docs/plans/original-completion-2026-10-02/execution/p28-01/restart/SPEC_CLARIFICATION_01.md b/docs/plans/original-completion-2026-10-02/execution/p28-01/restart/SPEC_CLARIFICATION_01.md new file mode 100644 index 0000000..d8053ae --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/execution/p28-01/restart/SPEC_CLARIFICATION_01.md @@ -0,0 +1,53 @@ +# SPEC_CLARIFICATION_01(P28-01-RESTART) + +- 対象: base `2132bbe3d39a0f1b69a97c731bb09213bf9d7a91` 上の `SPEC.md` と `DRAFT.md` です。 +- 変えないもの: 元の受入 RS1〜RS8、baseline、contract、spec hash。この文書はそれらを書き換えません。 +- きっかけ: run `e98055fc5fef4fe2986d2451f03a0734` が blocked で終わり、2件の指摘がありました(その失敗は保持します)。この文書はそれに答えるものです。 +- 承認: ユーザーが委任した既存の判断に基づく Root の判断です。新しい人間の発言はありません。 + +## C1. 仕様 SHA の2つの算法 + +| 算法 | 値 | +|---|---| +| `SPEC.md` の生 bytes の SHA256 | `ebfbc279c0c8a1dcc23beaef76c2983ac3c9e718bbf47f31935fe59cbc0fd933` | +| Runner の契約値 `sha256(text.strip())` | `2eeec95c3cc0ee5ebe86fd4c64a8c2299c5704fee7ecca3358e8578eed406168` | + +- どちらも同じ blob で、差は末尾の改行だけです。 +- 照合は `contract.spec_sha256 == sha256(text.strip())` で行います。この差を理由に blocked にしません。hash も gate も変えません。 + +## C2. 改ざんした読込の判定 + +DRAFT §5.1、SPEC §4-6、ROOT_NATIVE_PROCEDURE 手順5 にある「全 snapshot 完全一致」を、次のとおり厳密化します。 + +- **製品の事実**: 読込は失敗した場合でも、`_complete_save_operation` で `SAVE_LOAD_FAILED` を1件発行します(`autoload/simulation_runtime.gd:4223-4253`、`:4683-4733`)。失敗時には復元を確定せず、paused を元の値に戻します(`:4715-4716`)。 +- **要求**: 試行直前の全 snapshot を B とします。DRAFT §3.2 と同じ規則で `X(B, ev_fail)` を作り、試行直後の全 snapshot がそれと typed `var_to_bytes` で完全一致することを要求します。規則は次のとおりです。 + - counter を+1する。 + - `published_ids` に E_fail を sort 挿入する。 + - `recent_events` は末尾に追加する。256件のときは先頭を1件落とし、落とした要素の全内容を記録する。 + - それ以外のパスは、すべて B と同一である。 +- **ev_fail**: type `SAVE_LOAD_FAILED`、source `save_service`、`entity_ids []`。payload は `latest_save_operation_result` と同じです。 +- **signal の result**: 次をすべて満たすことを要求します。 + - `ok=false` + - `code` が OK ではない(実際の値を記録する) + - `preload_pause_restored=true` + - `loaded_clock_paused` が試行前の paused と同じ + - `recovery_report` があれば `restore_committed=false` + - migration を試みた場合は、事実として記録する +- **禁止**: 監査イベントの無視、削除、除外。規則の外の差が1つでもあれば失敗です。 +- `_record_runtime_performance` による診断値は snapshot の外にあるので、比較しません。 + +## C3. その後の正しい読込 + +正しい読込は、P で全体を置き換えます。RS2 c の `X(P, ev_load)` との完全一致は従来どおり要求します。あわせて、直前の失敗イベントが読込後の状態に残っていないことも確かめます。 + +## C4. 追加する拒否試験 + +- 失敗イベントを除外して一致させること +- 2件以上の差 +- counter が+1でない +- E_fail が sort されていない +- 256件のときの先頭の落とし方の違い +- payload と latest の不一致 +- `ok=true` または `code=OK` を失敗として扱うこと +- paused が元に戻っていない +- 成功した読込の後に失敗イベントが残っている