016 教材 新規QA（2026-10-05 UTC）

対象
原作C「待ってから戻る」だけ。04/05は原作Cの物理と保った操作が対象。
01は自由直線＋溜め、02は静止C、03は静止C＋観測/方針の教材用簡略化。
原作全3面、面選択/N/F12/録画/日本語描画までの同値性は主張しない。

今回の結果
- 5本それぞれが他段階/原作/フォントに依存しない実行可能なPython。
- モデルは標準ライブラリだけ。Pyxelはmain内部で遅延import。
- Python3.12.14 / Pyxel2.9.9 / Linux / SDL_AUDIODRIVER=dummy。
- test_stages.py: 50テスト合格。qa/model_tests.txt。
- 配布フォルダーだけを日本語・空白の一時パスへコピーし、無関係CWDで50テスト合格。
  この再実行は-B -Sを使い、site-packagesを無効にしてPyxelなしでもモデル試験が通る。
  qa/standalone_tests.txt。
- 原作から生成した8軌跡計2918物理tickの各hash、420ショット、84境界遷移を04/05両方で比較。
- 原作appをPyxel stubで読み、残した操作626入力frameを05と比較。OS入力試験ではない。
- 03は原作の静止比較と完全hash一致。02はAIを除く幾何の関連項目で一致。
- optional tools/verify_original.pyで現在の原作を再読込し、保存fixtureの全内容が一致。
  qa/live_original_comparison.txt。fixtureはqa/canonical_reference.json。
- 原作フォルダーの全39ファイルが開始時SHAと一致。qa/original_unchanged.json。
- 各段階をsingle.pyという名前の1ファイルだけにして日本語・空白パスへコピー。
  別の無関係CWDから実Pyxel headlessを19回起動。全回終了コード0。
- 初期/飛行/終端を各段階で取得。加えて溜め中、速球失敗、停止、タイトルSPACE保持を取得。
- 実入力frame回数は12/50/60/90/120/121/150を実測。この19回では要求値と実測値が同じ。
  将来の描画と更新回数の一致は保証しない。各reportのactual_framesを証拠として保存。
- 実描画ごとの実測frame数で同じ合成入力をモデルへ再適用し、全snapshotとhashが一致。
- qa/render_runs.jsonはソースSHA、入力、画像、report、ログ、実測frameを対応付ける。
- 全19PNGの実ピクセルをview_imageで確認。画面サイズ630×406。
  値パネル、球/反射軌跡、衝立、遅延観測の輪、方向矢印、ゴール移動、停止/終端の表示を確認。
  qa/image_inspection.jsonに画像と確認箇所を記録。
- 11種類×5ソース=55の不正CLI入力を終了コード2、Tracebackなしで拒否。
  -Sで実行したため、Pyxelのimportより先に検証されることも確認。qa/cli_invalid.json。
- lessons.jsonの全snippetは該当ソースに完全一致。4つのdiffも再生成した正しい差分と一致。
- LICENSEとassets/NOTO-LICENSE.txtは原作バイト一致。各段階冒頭に元MIT全文。
- FROZEN_SHA256.jsonは自身とqa/freeze_verification.txtを除く配布全ファイルのSHA-256。
  tools/check_freeze.pyは不足/追加/改変を検出し、原作なし・読取のみで検証する。

重要な境界
- 新SPACEは力20、次の保持21frameで100。保持したまま自動発射しない。
- 解放frameでは球生成だけ、次の入力frameから4物理tick進める。
- 照準は新押下/発射より先に更新する。左右/上下の同時保持はそれぞれ相殺。
- 場所選択は新押下、照準は保持。選択SPACEは解放しないと溜めに使えない。
- 更新開始x>88のみで観測、x=88はまだ見ない。履歴19個の先頭は18tick前=0.15秒。
- 方針は古い球yと自分のy、前の向きだけ。現在の球y、球速度、未来の入力は読まない。
- 差±2pxは前の向きを保つ。±2pxを超えると反対側へ逃げる。
- ゴール加速度90px/s²なので速度変化は最大0.75px/s/tick。レール端は速度も0。
- 帯外の記憶30tickは減算前の値で判定。31tick目から減速。
- 球半径3、開口半幅12。静止開口の高さ差9は接線接触として失敗。
- 高速線分と丸角の掃引、動く支柱の相対掃引、上下壁の残り時間を保持。
- 衝突と得点が同時なら固体接触優先。720tick目の成功をtimeoutへ上書きしない。
- 接触瞬間のゴール高さへ補間して止める。終端後physicsは状態を変えない。
- 原作Cの下+28度/力20は422tick、1反射でscored。力100は169tickでpost。
- R>P>停止中の順。Pは溜め取消、解除待ち、全時計停止。解除待ちはSPACEだけ。
- 飛行はZより先に処理してreturn。照準/結果のZはSPACEより先。タイトルのR/Pは無効。

未検証
人間の試遊、実OSキーボード、ネイティブGUI操作、Windows/macOS GUI、ブラウザー、音の実聴。
音は未実装。ヘッドレスの合成キー列は人間の遊びやすさやOSのキーイベントを証明しない。
新規OS別のpipインストールは未実行。既存環境の実行確認とREADMEの手順は別。
原作既存の動画/実験/テストはこの教材の新規合格数へ加算していない。
比較は保存した有限ケースであり、全入力/全実数についての形式証明ではない。
