065 まばたき劇場 教材QA
実施日: 2026-10-05 UTC
実行環境: クラウドLinux / Python 3.12.14 / Pyxel 2.9.9
配布対象: Python 3.11以降（3.11そのものの実行は未検証）

1. 純粋モデル・入力・配布構成の試験
コマンド（ZIPルート）: .venv/bin/python -B -m unittest -v test_stages.py
結果: 32テスト成功。詳細はtest_results.txt。
- 全5段階の独立import、凍結State、視線変更だけでは時間が進まないこと
- 視線対象だけの停止、橋と灯りの位相循環、新しい橋で通行判定
- 予告と本番の一致、予告の非破壊性
- 新位置と新しい光の星判定、停止中の受取、旧位置で誤取得しないこと
- 星なし基本成功、星あり成功、基本5回/星あり7回の最短解探索
- 星を含む全State、選択後の視線、終了後のUndo、空履歴とReset
- キー押しっぱなし、R/XとZの同時入力、教材の再現操作
- lessons.jsonの各抜粋が実際の.pyに含まれること
- 全5本に原作MIT全文権利表記が残ること

2. 原作との照合
reference/canonical_model.pyは原作model.pyのバイト単位で未変更のコピー。
元ファイルと直接比較して一致を確認。元ファイルは変更していない。
SHA-256: f2fb716f33beafb83b2eb77b31cf99392e35f5204f9f48d3de8ccd15640844db
対象: 原作065-B-v1。位置0〜5、橋0〜3、灯り0〜3、視線0〜2、星0/1。
02〜05の各576条件、合計2,304遷移を照合。
02/03は星を除く射影、04/05は全Stateフィールドが一致。
回数は代表値7から更新の一致を確認。無限の整数値を全列挙したものではない。
05ではgaze/blink/undo/resetが混在するTimelineとの一致も確認。
01は橋の通行判定を省略した導入段階であり、原作全体との同値を主張しない。

3. Pyxel stub試験
test_stages.py内の明示したstubは、描画callbackが12回呼ばれることと
その後の保存・終了の配線だけを確認。PNGを生成せず、実描画証拠ではない。

4. 実Pyxel描画
5本全てをPyxel 2.9.9で実行。各12フレーム、終了コード0、PNG 640×480。
実際の実行コマンド・画像ハッシュはrender_results.json、stderrは*.render.log。
各.pyの--headless-smokeでは再現可能な短いキー入力を自動注入する。
01〜04は橋を見守って2回進み、人形を見守って1回待った状態。
05はさらに1回待ってUndoした同じ状態（星あり、履歴3）。
これは解の全操作を実機で遊んだ試験ではない。解の到達は純粋モデルで別途確認。

画像を5枚とも目視確認:
01_gaze.png: 視線カード、連続する足場、橋省略の説明、キー説明が見える。
02_bridge.png: 位相3で2か所の橋が閉じ、人形は位置2。通行条件の説明が見える。
03_forecast.png: NEXT POS/BRIDGE/LIGHTが見え、状態行と重ならない。
04_optional_star.png: 位相1の点灯と取得済み星、任意目標表示が見える。
05_undo.png: 星取得、視線DOLL、BLINKS 3、UNDO 3とX説明が見える。
文字や図形の欠け、画面端の切れ、主要表示の重なりは見られなかった。

5. 制限と未検証
- 人間によるキーボード操作、面白さ/難易度、長時間プレイは未検証。
- Windows/macOS実機およびネイティブGUI起動は未検証。
- 画面はASCIIと図形のみ。日本語字形/Notoフォントの依存はない。
- 教材は無音。環境の音声デバイス初期化警告は発生したが、描画と保存は成功。
  音声出力の成功や実聴を主張しない。
- 新たなパッケージインストール、外部公開、Sites操作は行っていない。
- -Bで実行し、配布フォルダーにも原作ソースにも新しいpycacheを作っていない。

6. 凍結
FINAL_SHA256.jsonに、それ自身を除く配布ファイルのSHA-256を保存。
これ以後に変更した場合は、影響範囲の検証とハッシュを更新すること。
