098 技術・設計検証／2026-10-03 UTC
技術:30 unittestケース通過。描画から独立した不変State/Page/step、乱数なし。
検査:札２枚保存/同時交換、舟追従、水底の石を通過、航行中交換の泡復帰、初期石の距離拒否、２セル寄せ、浮く物衝突、短橋の谷拒否/長橋、旗上げ/戻して別絵、橋短縮時陸復帰、風１セル/重い物固定/端停止/降りて達成、風と交換の分離、章戻り/今章のみリセット、保存版/型、undo、開始/説明/演出/確認release gate。
証拠を触らない:テストは一時保存先を使う。実動画・Nativeイベント原本への書込はしない。
設計:三章の公開条件を実装。安全な葉舟だけの三章達成列と、浮く石/長い旗/軽い看板の別絵列を保存。最短性は未主張。
仕様の明確化:第３章の軽い物は空中、重い物は地上/固定セル扱いで通過可能。これによりブリーフの葉舟単独ルートが成立する。重い物は現在セルを保ち、隠れた落下を加えない。
第２章の谷上で橋を短くした場合だけ安全なしおりで最後の陸へ戻す。右陸では戻らない。READMEへ明記。
比較:原因文＋対象の演出／最終状態だけ。表示設定以外の全モデル状態が２種類の共通三章列で一致。比較から楽しさの因果を断言しない。
全章同難度化、交換回数制限、得点罰は追加しない。目的後の好きな絵を合理的な別選択とした。
未確認:人による面白さ、Windows/macOS実機、音の実聴、所要時間。無音設計で音依存目標なし。
実自動収録とNative実入力は分離。元ソースと元イベントを保存し、後のモデル照合はderived_replay_validation.jsonへ別記録。
追加最終検査:日本語/空白パス・別cwd・PYTHONUTF8=0/PYTHONIOENCODING=cp932環境のimport、全UI日本語字形、ASCII引用BAT、X３本140字以下、テスト前後mediaハッシュ不変を通過。
最終自動デモ:media/automatic_20261003T022002_957219/storybook_automatic_silent.mp4。元GIF749フレーム、30ms×749均一。全フレームを順に１回ずつ30fpsへ変換、24.966667秒・音声ストリームなし。最終ソースとNativeソースが一致。
最初の収録はmedia/automatic_20261003T021246_555180に保持。748フレーム（30ms×747、70ms×1）だったため最終動画には使っていない。デモ中のJSON/PNG書込を停止し、終了後にログと元フレームPNGを生成するように改修して再収録。ゲームの物理は変更なし。
旧デモ26イベント、最終デモ26イベント、Native63イベントの全状態/履歴/sha256が現行モデルの再生に一致。旧デモのapp.pyのみ表示記録タイミングが異なることをderived_replay_validation.jsonへ明記。原ソースと原記録を置換していない。
実Native:全３章達成・２種類の旗の完成絵・章保持・章だけ再開/undo・保存読込・説明停止・比較説明・終了を確認。詳細はNATIVE_OBSERVATIONS.txt。
最終元フレームPNGの長い旗の絵と一冊完成画面を目視確認。通常capture_sec=0はNative起動とF12 PNG７枚で確認。
