025 折りたたみ駅 / 教材QA

最終範囲: 原作B（LEVELS[1]）、4駅、Q-R線路1本、V/Hの2折り。
段階01〜04の意図的省略はLESSON.mdとlesson_meta.jsonに記載。
Python 3.11以上、pyxel==2.9.9。実行環境の版はqa/render_runs.json。

検証結果
- 39件の標準ライブラリunittest: qa/model_tests.txt。
  全5段階のデータ/投影/規則/練習、実Controller、長押し、選択解除、入力境界、無効行動、同時押しの完全解放ゲート、Rを含む和音拒否、Undo、reset、成功後を含む。
- 原作Bの直接比較: qa/canonical_comparison.json、qa/canonical_recheck.txt。
  16論理状態、48候補辺（受理42）、64投影ケース、2,304構成遷移、34トレース/1,627行動を一致確認。原作全ファイルのSHA256は前後一致。
- オフライン比較用固定データ: qa/canonical_reference.json。
  原作の隣接配置を要求しない。通常テストはこの同梱fixtureを読む。
- 実Pyxel headless: 20チェックポイント、各PNG/JSON/log、qa/render_runs.json。
  初期5画面、参照・反射・乗換・運休・運行再開・折れたG・成功・Undo・終端・resetを確認。
  実際のPyxelのupdate/drawを使い、入力はController.tickへ合成した押下/解放を渡す。
- 5本を1本ずつ日本語/空白パスへコピーし、無関係な日本語/空白CWDから起動。プログラム側はその.pyだけ。
  PYTHONUTF8=0、PYTHONIOENCODING=cp932でも明示UTF-8のJSONと相対PNGを生成。qa/isolation_runs.json。
- 教材だけを別フォルダーにコピーし、-B -Sで39テスト成功。原作もsite-packagesも不要。qa/standalone_tests.txt/json。
- 引数誤り15ケースはexit 2。qa/cli_invalid.json。
- 20枚のPNGを5枚のコンタクトシートでも目視確認。qa/visual_review.json。新しいインストールなし。
- 全5本に原作MIT全文、LICENSEとNoto/DejaVuの参照権利文書は原文一致。qa/rights_packaging.json。
- 隣接4差分は実ファイルから生成し、テストでも完全一致を確認。

原作確認を別扱いにする
qa/original_evidenceは親タスクが実施した原作26テストと自動無音デモの記録のコピー。
教材の39テストや20描画に合算しない。原作デモの音声デバイス警告をそのまま保存し、音声の検証成功とは扱わない。

未検証
人間の試遊、OSキーボード入力、Windows/macOS GUI、ブラウザ、音声。
GUI手動入力を試した、Webゲームを動かした、公開したという主張はない。

再現
python -B -m unittest -v test_stages.py
python -B tools/render_qa.py
python -B tools/verify_original.py "/元ゲームの場所/025_folding_station" （任意、読取専用）
python -B tools/check_freeze.py
最初の3つは結果を確認/更新する検証。render_qa.pyはQA記録を再生成するので、その後のfreeze差異は正常。

フリーズ
qa/freeze_manifest.jsonに配布ファイルのSHA256と除外リスト。
qa/freeze_verification.txtに最終照合結果。フリーズ後に実行ファイルや教材を修正していない。
