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

結果
- 独立した5本のPythonファイル。実行時は標準ライブラリと遅延importしたPyxelのみ。
- test_stages.py: 44テスト合格。qa/model_tests.txt。
- 配布フォルダーだけを日本語/空白の一時パスへコピーし、別CWDから同じ44テスト合格。qa/standalone_tests.txt。
- 原作Aから作った11入力列の3344tick、400組合せ状態を04/05の両方と比較。
- 原作app.pyの残した操作に合成入力を与えた649フレームを05 Controllerと比較。
- 原作を直接再読込した任意比較も合格。qa/live_original_comparison.txt。
- 実Pyxel2.9.9 / Python3.12.14のheadless描画18回合格。
- 各ソースを日本語/空白パスへsingle.py一つだけコピー、毎回別CWDから起動。
- 各初期画面12フレーム、進行/終端/停止/保持と解放のチェックポイント12〜300フレーム。
- 04/05は自動入力で世界tick165、人HP3、コアHP0の勝利を確認。
- 初期/全チェックポイント18PNGをview_imageで実ピクセル確認。5枚のcontact sheetも確認。
- 実行ログ/状態/ソースSHA/画像対応はqa/render_runs.json。描画証拠は合成Controller入力。
- 無効CLI 4種類は終了コード2で拒否。qa/cli_invalid.json。
- MIT全文は各段階へ埋込、LICENSEとassets/NOTO-LICENSE.txtは原作バイト一致。
- lessons.jsonの全snippetが該当ソース内に完全一致。diffsも2ファイル間の正しい差分。
- FROZEN_SHA256.jsonは自身とfreeze結果ログを除いた全配布ファイルのSHA-256。

保持した重要ルール
- Zは保持で24tick連射。Xは新押下だけ、12tick輪、36tick再使用、世界90tickで回復。
- 予告のIntentを同じ発射で使う。予告中は攻撃なし。
- 原作READMEの輪半径17は見た目、モデルの実判定は20。教材は可視17/判定20を保持。
- 距離20は反射、20.000001は非反射の境界テスト。
- 全世界の反射を先に処理。弾配列の順序に依存させない。
- 返した弾は閉壁でもコアに1ダメージ。通常弾も通れば1ダメージ。
- 人HPとコアHP同時0は敗北。時間制限は追加しない。
- 05のM>R>P>停止>終了>通常更新を保持。場面変更後は全解放が必要。
- 表紙/停止でもXの解放を最初に記録。原作の1/2/3、N、F12は明示して省略。

試験中に直した検証側の誤り
- 連射テストで「画面に残った弾数」を数えていたが04以降は壁で消える。発射イベント数へ修正。
- 開壁直後tick80にコア損傷済みという誤ったQA期待を除去。到達は後なのでtick106の別検査を追加。
- 原作直接比較のPython tupleとJSON listを同じJSON形へ正規化して比較。
いずれも教材ルールを変えて合格にしたものではありません。修正後の44テストと18描画を再実行。

未検証
人の試遊、実OSキーボード/ネイティブGUI操作、Windows/macOS GUI、ブラウザー、音声。
音は未実装。Pyxel headlessは画面を実際に描画するが人間の操作性を証明しない。
新規のOS別インストール実行はしていない。READMEの起動手順と実機確認は別。
原作既存のテスト/動画/試遊記録は教材の新規合格数に加算していない。
原作全ABCや全UIへの同値性を主張しない。Aモデルと明示した保持UIキーのみが比較対象。
