Files
TheTree_mock/docs/plans/original-completion-2026-10-02/RUNTIME_SAVE_AUDIT.md
T
Takeshi b84bade045 Save The Tree implementation and acceptance work in progress
Preserve production code, regression fixtures, audio assets and provenance, test infrastructure, and the original-completion plan and progress ledger. Final game and Windows acceptance remain pending; excluded local artifacts and native experiments are not part of this snapshot.
2026-10-11 15:58:00 +09:00

7.4 KiB

Runtime・UI・保存移行 再監査 2026-10-02

ローカル制作コピーの基準HEAD 285528b7a3b1b46a2a67af5aa90d9085539b42f4 を再監査し、P03の保存事前確認と破損拒否を修正した。P03全体・原本全実装は未完了。機械可読の根拠、SHA、行番号、未受入一覧は runtime_save_audit.json に記録した。

証拠の版と適用範囲

開始時に採用後1396ファイルのSHAを照合して差分0を確認した。155スイート/12,310チェックは旧採用証拠の記録であり、本担当で全回帰を新たに実行した値ではない。今回は本体3ファイルと新保存試験を変更したため、統合全回帰と新しいWindows配布版受入を別途必要とする。

旧 snapshot-opening-restart-2026-09-29 の283パスは、開始時49パス、今回の保存修正後51パスが不一致となる。現版の受入へ直接転用しない。rootの今回の描画付き開業再起動はwriter83/reader20チェック、両プロセスPASS・実行中ソース差分0だったが、その後の保存3ファイルとPathの計4ファイルが変わった。修正後の同一版へ再実行するまでは変更前の基準証拠として扱う。

P03で実装した修正

SaveService.inspect_snapshot() は指定された正式セーブだけを検証し、中断保存の取引を復旧・昇格・削除しない。寸法移行プレビューをこのAPIに接続した。正式セーブが .bak に移された中断状態は SAVE_NOT_FOUND で拒否し、.tmp・.bak・取引マーカーを保全する。通常 load_snapshot() の中断復旧は維持する。

修正前に、プレビューで取引マーカーが削除されることを実行再現した。さらに形式版 true・"1"・1.5 がすべて1として読込成功することを確認した。manifestの版とサイズは有限の整数値のJSON数値だけを許容し、チェックサムはSHA-256文字列を要求する。整数値のfloatはGodotのJSON数値互換のため許容し、文字列・bool・小数の強制変換は拒否する。

一般envelopeにも同じ型方針を適用した。schema、時刻、速度、pause、snapshot_versionが破損したときはclock/stateを復元する前に拒否する。旧版の省略されたpause/versionの既定値と旧x4→x3は保った。SimulationKernel.restore_clock() の直接呼出契約は変更していない。

技術的な資源上限として、worldは圧縮・展開それぞれ256 MiB、manifestは4 MiBとした。ファイル長とバイナリheaderの展開サイズを一括読取・解凍前に検査し、超過は SAVE_SIZE_LIMIT_EXCEEDED を返す。writerにも同じ上限を適用し、読み戻せない候補を正式保存へ昇格させない。これらはゲーム数値の追加仕様ではなく、破損saveの資源保護方針である。

現初期Runtimeの実サイズはraw 61,040 B/圧縮7,511 B。既存PERFの2万セルWorldのみの実サイズはraw 640,488 B/圧縮18,873 Bで、world上限には約419倍の余裕がある。全人物・全サービス・全施設を含む最大Runtimeの受入は未検証。正当な旧セーブでも上限を超える場合は拒否されるリスクが残る。

実行した受入と履歴

最終修正後の7スイートは485チェック、失敗0、実行中ソース差分0。

最終r02試験 チェック 区分
save preflight 128 新規の読取・型・未知版・破損・サイズ・原状保持
save operations 127 世代、復旧、旧形式移行、失敗時保持、symlink
Runtime save lifecycle 96 checkpoint、復旧候補、domain検証とwhitelist修復
S0 kernel/save 73 clock、envelope、保存復元
transport save 29 実役者・EV座席所有、旧attendance、crosslinks
dimension migration UI 12 実メニューのsignal handler、取消、stale-source、backup
supply save migration 20 旧供給状態と復元

証拠は artifacts/original-completion-2026-10-02/p03-save-preflight/。全保存候補と取引artifactのファイルSHAを比較し、拒否時・プレビュー時のバイトと配置を確認した。上限ちょうどの広告サイズは独立したmanifest不一致で解凍前に拒否し、上限超過はsize-limitで先に拒否する境界を試験した。

修正中の失敗履歴を保持した。初期85チェックではmalformed JSONの正しい拒否でもengine ERRORが出たため受入から除外し、JSONの返却エラー処理へ修正した。続く128チェック中1失敗は整数float速度がArrayの型一致で拒否される互換試験で、型検証後のint比較へ修正した。r02を合格根拠とする。寸法batch23・weighted migration63・寮task/rest25・selection autosave75は最終比較修正前の関連PASSとして保持し、最終版485に合算していない。

UI試験は実画面や公開コマンド・signal handlerを用いるが、加速clockと制御fixtureを含む。モデル試験、通常画面のhandler経路、OS pointer入力、Windows実機を別状態として扱う。

保存契約と更新順の現在地

保存はpackage format1、一般envelope schema1、Runtime schema13の三層である。Runtimeは既存1〜13の明示分岐を持ち、v5以上の現在形状ではcanonical key集合を厳格に検証する。会計・維持費・施設状態と人数・マナ・客職員・移動credit・EV・配送・清掃・イベント・防衛・建設・掘削などを保存し、別サービス候補と相互参照の検証後にliveを交換する。未知版・追加key・必須aggregate欠損を無断で補完しない。

順序はコマンド適用→clock前進と日付signal→天候/維持費/営業境界→マナ→建設→物流→施設完了→欲求環境→事件防衛関係イベント→queue→AI→snapshotとcheckpoint。最後にclockのsnapshot_versionと時刻通知が更新される。通常日次autosaveは06:00で保存済みdayキーにより重複を防ぐ。承認済み維持費精算は00:00で別契約。全同時境界の受入は未完了で、D05のEV停止・費用時点・日跨ぎの未確定を補っていない。

残件

  • P03-01: 全原本機能の保存契約、未実装の欲求加算・全人物・章・エンド・図鑑を含む新状態の保存条件。
  • P03-02: 移動中役者、EV乗車、救護搬送、物流、複数同時建設、占有再配置とtask retargetの全移行受入。現行は安全な候補だけを受け、失う位置・経路・task destinationは拒否する。
  • D07: 現5関係値trust/respect/affection/fear/dependenceと原本3値の意味対応、既存routeの扱い。旧値を保全し、推測変換しない。
  • P03-03: 営業途中の現開業基準に加えて、配送・清掃・防衛・人物進行の途中を実プロセス終了/再起動して同じ操作列の財布・台帳・役者・イベントへ比較する受入。旧開業試験は測定時間を含むdomain event streamを明示除外し、他の状態を比較する限定証拠である。
  • P02/P28/P29: 修正後同一版での描画・pointer・Windows実機・最大規模・長期通し受入。

原子分母の固定は別担当のP01台帳へ委ねる。試験件数や保存キー数から総合実装率・受入率を計算しない。