021 逆向き倉庫 — 検証記録（2026-10-02 UTC）
実装・機能検証済み。人による面白さ確認は未実施。

純粋モデル／30件の自動テスト PASS
・人とペア2箱を、旧状態から一括検査して確定。相棒だけ／押す箱だけが壁の場合に全状態を不変のまま拒否。
・同一行先、箱同士の交換／通り抜け、他箱への連鎖押し拒否。番号付き目標を交換しても成功にはしない。
・全合法押しで箱の座標和が不変。全到達状態に独立の座標／占有集合オラクルを適用。
・拒否は同一Stateオブジェクト、同一Timelineを返し、手数・履歴を変えない。
・成功からのundo、全解の逆順undo、undo後の別行動、無効入力、範囲外、hash再現を確認。
・人の旧／新セルへの箱侵入を明示的に拒否。通常の1組逆向き移動では有効な初期状態から旧人セルへ入る幾何は生じないが、規則として隠さず実装。

全到達グラフ探索 PASS（深さ打切りなし）
A: 1,122状態、最短 R、1押し。B: 1,024状態、DRULUR、2押し。C: 390状態、UUURRRRRDD、2押し。
終端で止めるUIとは分離し、探索は成功座標からも物理的に歩ける状態を列挙。手数・押し数をキーから外す。
逆向き移動を使わない箱1操作のみの探索ではCの解なし。Bは縦方向の押しを禁止すると解なし。
同方向の連打のみはAの右だけ成功し、B/Cは全方向で成功しない。Aの1押しは意図した導入。
前向きの操作だけでは解へ戻れない状態もある（A660/B640/C306状態）。これは自動敗北ではなく、Zで履歴から戻す対象。
solver_results.jsonに全探索の件数、拒否理由、最初の行動、成功列とhashを保存。

入力／表示のモック試験 PASS
・Start/Next/Pauseと矢印の同時到着、および次フレームに矢印が遅れて到着し長押しされるパターン。
・遷移後は全対象キーを離すまで持越し入力を消費する。固定時間ロックを置かない。
・1フレームの解放を挟む速い意図的入力は即座に受け付ける。
・複数矢印の同時押し無効、通常プレイの矢印リピート、停止中の操作無効、reset/menu、全表示状態。
・全描画文の日本語グリフ存在と384×420内の文字幅を検査。

可搬性 PASS（模擬と実機を区別）
・全テキストI/OでUTF-8を明示。cp932が既定のio.openを模擬してJSON読込・タイトル描画を確認。
・日本語と空白を含む別フォルダへ複製、cwd=/tmpから起動。
・BATはASCIIのみ、%~dp0等のパスを引用、失敗時pause。独立setup/playを同梱。
・Windows実機SDL GUI、macOSは未検証。シミュレーションをWindows合格とは表記しない。

実Pyxel描画／動画 PASS
Pyxel 2.9.9のheadless実描画からPNG/GIFを保存。Bの両方停止、3室の成功、比較の2画面を目視。
MP4: 719フレーム、30fps、23.966667秒、音声ストリームなし。
GIFは30ms単位のdelayを持つが、そのdelayを動画尺へ転用しない。
Pillowで全719ソースフレームを順にRGBへ展開し、ffmpegの入力30fpsとして各1回渡す。
media/timing_validation.jsonに各元フレームhashとffprobe出力。media/replay.jsonのapp/model hashは納品ソースと一致。
自動入力の実レンダーであり、人のプレイ動画／壁時計での画面録画とは称しない。

ネイティブLinux実キーQA PASS（2026-10-02 18:51–18:55 UTC）
クラウドLinuxの実ゲーム窓をCUAで操作。人による面白さ試遊ではなくエージェントによる技術QA。
・500msのSpace+RightでAを開始。押し0／歩き0のまま。新しいRight150msでA成功。
・500msのN+DownでBへ。押し0／歩き0のまま。
・BでRight150ms: 箱2の行先の壁で人と両箱が動かず、手数0のまま。原因文と赤い行先×を確認。
・P+Down500msで停止。停止中Down150msも無効。P+Down500msで再開しても手数0のまま。
・BをDown Right Up Left Up Rightの各150msで解く。2押し／4歩き。Z150msで両箱と人が成功直前へ戻る。
・新Rightで再成功、NでC。Up Up Up Right Right Right Right Right Down Downの各150msでC成功（2押し／8歩き）。
・R+Up500msでC初期化、手数0のまま。続くUp80msとDown80msが両方受理され、歩き2。
・M+Space500msで部屋選択へ戻り、勝手に再開始しない。
・ESCで終了。新しいウィンドウ一覧でゲーム窓不在を確認し共有GUIを解放。
ネイティブの和音は500msの保持を観察。厳密な1フレーム時間差入力は別の決定的モック試験で確認し、ネイティブでミリ秒位置を測ったとは主張しない。
media/gui_events.jsonとnative_A_success/native_B_blocked/native_B_success/native_C_success.pngを保存。

一変更比較 PASS
同じB初期状態・目標・入力で相棒の変位のみを0と逆方向1に変更。
単独基準も逆向き版も可解（12手4押し vs 6手2押し）。不可能な基準との見せかけの改善比較ではない。
制御した反実仮想であり、過去に実在した失敗版ではない。面白さの改善率は測っていない。

未確認と次の観察
人の初見理解、迷い、納得、再挑戦したさ、Windows実機、macOSは未確認。
音を実装していないため音質確認は対象外。クラウドの音声デバイス警告は記録されるが無音設計と独立。
人には「どちらの箱が止めた？」「先に縦へ押した理由は？」「触れない箱をどう運んだ？」を聞く。

最終の限定修正: ネイティブQA後に、単独比較基準の押し成功文だけを「押した箱だけ、動いた。」へ修正。通常版の表示・モデル・入力は不変。比較PNGと自動映像を最終ソースから再生成しました。ネイティブGUIの記録hashは書き換えず、media/native_app_source.txtに一致する当時のソースとnative_to_final_caption.diffを保存しています。
