031 静かな足音 教材QA
検証日：2026-10-05 UTC
対象：01_grid.py / 02_sight.py / 03_sound.py / 04_memory.py / 05_undo.py
実行環境：cloud Linux、Python 3.12.14、Pyxel 2.9.9、SDL_AUDIODRIVER=dummy。
対応仕様はPython 3.11以上。Python 3.11そのもの、Windows/macOSの実GUIでは未検証。

1. 純粋モデル・合成Controller：33テスト PASS
コマンド：.venv/bin/python -B -m unittest -v test_stages.py
実際には既存の指定仮想環境を使用。結果全文：qa/model_tests.txt。
・マス移動、壁入力は手数も履歴も増やさない、帳面＋出口、接触優先
・旧見張り位置から1回だけ観測、視覚が今回の音より優先、隠れた位置を判断へ渡さない
・音の棚迂回、到達境界、閉じた棚の不通、布0/板3/金属6、踏み鳴らす+2、金属上の待機も0
・BFSの上/下/左/右の同距離順序、視線の距離・方向・棚角遮蔽
・音源の記憶、新観測の上書き、到着後2ターン回転、巡回完了番号と次巡回先への復帰
・全状態Undo（位置、向き、記憶、音、観測、帳面、手数、終了状態）、初期化で空履歴
・無入力、押しっぱなし、同時押し拒否、R後の全キー解放、WON後のUndo
・各節の到達可能なチェックポイント、実在コード断片、外部モデルをimportしない構成
合成Controller試験はネイティブOSキー入力の試験ではありません。

2. 原作Aとの比較：PASS
参照：原作031 model.py の LEVELS[0]「棚の角」。原作ファイルは編集せず、すべて-Bで読み込み。
原作SHA256：f1b64a5da9c8254a003fce56e5fa6e7427b9002a0f826df33d76a3113143d78f
04と05それぞれで以下を直接比較：
・マップの全項目一致
・44入力列、初期を含む1,718個の全状態一致（1,674手、終端後の不変状態も含む）
・盤面63座標どうし3,969組のpath一致
・63×63座標×4方向＝15,876件のvisible一致
・各座標のfloorと床の音半径一致
結果：qa/canonical_comparison.json。
qa/canonical_reference.jsonに入力と各状態hashを保存し、原作なしでも教材テストが動きます。
01〜03は意図的な縮小規則です。B/Cや元UIまでの同等性は主張しません。
有限の比較試験であり、全可能状態の数学的証明ではありません。

3. 実Pyxelのheadless描画：11シナリオ PASS
qa/render_runs.jsonにコマンドと終了コード。各JSONに合成入力・状態・描画フレーム数。
全5本の初期画面は無入力12フレーム、手数0。各段階の意味ある状態も描画：
01_won.png：帳面を出口へ運ぶ14手、16描画フレーム。
02_eye.png：下下右右右右、発見されても接触前なのでPLAY、12フレーム。
03_ear.png：上右右Z、棚の向こうの音を聞く、12フレーム。
04_look_zero.png：上右右Z下下下右右上右、2回目の探索回転後LOOK 0、12フレーム。
05_undo_memory.png：上右右Z下X、音を聞いた4手目の状態へ完全復帰、12フレーム。
05_won.png：誘導経路17手でWON、19描画フレーム。
全11PNGを実際に開き、ASCII文字の切れ、盤面と情報表示、帳面・出口・見張り・視野・音経路・記憶輪の表示を確認。
音声は設計上ありません。dummy audio driverによる描画であり、聞こえたとの主張ではありません。

4. 1ファイル独立起動：5本すべて PASS
各.pyだけを空の一時フォルダーへコピーし、既存Pyxel環境で12フレーム起動。
相対パス --screenshot relative.png のPNG生成も確認。結果：qa/isolation_runs.json。
初回検証で見つけた保存先パスの問題は、Pyxel初期化前の絶対パス化で修正済み。
記載チェックポイントの1つを実操作列で再確認し、EYEになる6手目で止めるよう教材を修正。

5. 今回していないこと
人による楽しさ・難易度・読みやすさのユーザーテスト、実OSのキーボードイベント、ブラウザ上の操作、
Windows/macOSの実GUI、音声再生、Sites公開、原作変更、パッケージの新規インストール。
既存環境だけを使用。原作26テストと原作デモの既存結果は、この教材の検証数へ合算していません。

6. 配布前の整合性
5段階、LICENSE、固定requirements、README、LESSON、lessons/meta、test_stages、4差分、qa記録を同梱。
READMEは全展開したZIPルートからの.venvコマンド。MIT全文は全段階およびテストに保持。
原作Noto案内は原文を保持していますが、この教材にはNotoデータを同梱しません。
qa/freeze_manifest.jsonに凍結時のファイルSHA256。凍結後の変更は再検証を要します。
