084 昨日の自分と配達 / 教材QA

最終範囲
原作A「長く待つ昨日」、hold式。配置、24刻、意味入力、刻開始の扉、同時移動、
今日だけの荷物、記録/ready/再生、05の履歴・再試行・録り直し・直前版を保持。
B/C、latch、時限扉などの省略と01〜04の段階差はLESSON.mdとlesson_meta.json。
ソース5本は独立して起動。素材ファイルなし。全てのテキストファイル操作はUTF-8指定。

実行環境
Python 3.12.14、Pyxel 2.9.9、cloud Linux、SDL_AUDIODRIVER=dummy、-B。
ゲームrequirements.txtはpyxel==2.9.9。モデルテストは標準ライブラリだけ。
実版・platformはqa/render_runs.json。

検証結果
- 48件のunittest成功: qa/model_tests.txt。
  全段階、部分/空/24刻記録、拒否入力も刻を消費、全解放ゲート、長押し、同時押し、
  新規押下、Rの和音、遷移時のキー持越し、扉に乗る/離れる刻、閉じた扉からの退出、
  意味入力の再生位置差、重なり/すれ違い、短いテープ後のwait、荷物、24刻目の配達、
  終了後、Undo、確認中の取消、再試行、未確定記録と確定版、旧版交換、停止を確認。
  日本語本文の実験コマンドと期待出力、ソースの抜粋、差分、MIT全文も自動検査。
- 原作から直接抽出: 420移動ケース、1,200同時移動ケース、38トレース/1,367遷移。
  qa/canonical_reference.jsonは通常テスト用。完全Stateの比較は05/A/hold。
  移動420ケースは全5本、同時移動は04/05を照合。01〜03の省略は原作一致と主張しない。
  qa/provenance.jsonに抽出元全ファイルのSHA256とfixtureハッシュ。
  qa/canonical_comparison.jsonとcanonical_recheck.txtに任意の原作再照合結果。
  原作controller自身も9トレース/217観測でState・履歴・新規押下・ゲート・確認/停止を比較。
  タイトルを閉じた共通操作の範囲で、helpの表現をpauseへ明示変換。
  原作を読み取り前後に全ファイルSHA256で確認し、変更なし。
- 実Pyxel headless: 25チェックポイント、各PNG/JSON/log。
  5初期画面と20状態画面。合計530 update / 530 draw。
  frameは実際のupdateカウンター、drawは実際のdrawコール回数を別々に計測。
  qa/render_runs.json。入力はController.feedへ合成した押下/解放。
- 単一.pyだけを日本語/空白パスへコピーして、無関係な日本語/空白CWDから5本を起動。
  PYTHONUTF8=0、PYTHONIOENCODING=cp932。相対・日本語・空白PNG/JSON名の出力も確認。
  合計102 update / 102 draw。qa/isolation_runs.json。
  初回検証でPyxelのCWD変更に伴う相対出力先の誤りを発見。全5本でPyxel初期化前に
  絶対パスへ解決するよう修正し、描画25件と隔離5本を全て再実行して成功。
  記録はqa/issue_recovery.json。
- 教材のみを別フォルダーへコピーし、-B -Sで48テスト成功。
  原作・Pyxel・site-packagesなし。qa/standalone_tests.txt/json。
- 引数誤り20ケースはすべてexit 2。Pyxelを読めない-SでもCLI検証が先に働く。
  qa/cli_invalid.json。
- 25枚のPNGの実画素を5枚のコンタクトシートで確認。qa/visual_review.json。
  コンタクトシートだけ既存のsystem Pillow 12.3.0を使用。新しいインストールなし。
- 全5本に原作MIT全文を埋め込み、LICENSEとassets/NOTO-LICENSE.txt、PYXEL-LICENSE.txtは
  原文一致。Noto字形データは同梱しない。qa/rights_packaging.json。
- 隣接4差分は実ソースから生成し、テストで完全一致。

原作の検証は別扱い
qa/original_evidenceは親タスクの原作26テスト・実Pyxel自動無音デモの新しい記録のコピー。
原作デモはC面で、frame_0145/0730のPNG、イベントとログを同梱。教材25描画や48テストに
合算しない。警告はログのまま残し、音声の検証成功とは扱わない。

未検証
OSキーボード入力、人間による試遊、Windows/macOS GUI、ブラウザ、音声。
headlessの実Pyxel描画と合成キーを検証したのであって、人の操作や公開を検証したとは言わない。
本フォルダーの作業ではSite/原作を変更していない。

再現
  python -B -S -m unittest -v test_stages.py
  python -B tools/render_qa.py
  python -B tools/verify_original.py "/元ソース/084_yesterday_delivery"
  python -B tools/check_freeze.py
原作比較は任意。通常テストは原作を必要としない。render_qa.pyやverify_original.pyは
QA記録を更新するため、再生成後のfreeze差異は正常。check_freeze.py自体は書込みなし。

フリーズ
qa/freeze_manifest.jsonにファイルごとのSHA256。検証記録自身・manifest・__pycache__だけ除外。
qa/freeze_verification.txtに最終照合結果。
