075 ちいさな錬金冷蔵庫 教材QA
実施日: 2026-10-05 UTC
実行環境: クラウドLinux / Python 3.12.14 / Pyxel 2.9.9
配布条件: Python 3.11以上。Python 3.11自体、Windows/macOS実機では実行していない。

1. 純粋モデルと入力の試験
コマンド（ZIPルート）: .venv/bin/python -B -m unittest -v test_stages.py
結果: 29テスト成功。test_results.txt参照。
- 全5本の独立import、凍結State、瓶IDの保存、持つ/置く/交換。
- 各段階1000回の固定乱数操作でも瓶をなくさず、重複させない。
- 冷温境界2/3、縦横の全36組、斜め・配列の列端折返し・無効触媒。
- 八反応の表、予告の非破壊性、共有触媒が消費されないこと。
- 手持ち中の開始拒否、t=0/1/2の境界、編集中以外の配置禁止、結果後の停止。
- 全6枠が同一の変更前tupleを読んで計算し、二刻目に同時確定すること。
- 依頼はresult状態かつ必要数以上、初期配置は失敗、記載の操作列は成功。
- UndoはState全体を復元しカーソルは戻さない。Resetは手と履歴を初期化する。
- 押しっぱなし、同時押し、ずらした重ね押し、Reset直後の保持入力。
- 教材JSONの抜粋が実コードに含まれ、必須項目があり、MIT全文が全5本に残る。

2. 原作の対応部分との照合
reference/canonical_model.pyは原作075のmodel.pyのバイト単位で未変更のコピー。
SHA-256: 0ad23c59beff6a42e0581a21c5468ccd3855baceeaced058cd78d5563ae70ea3
原作ファイルと直接比較して一致を確認。原作フォルダーは変更していない。
- 固定A/crossの120棚配置をすべて列挙。03〜05の予告を原作と比較。
- 04/05のstart/tick/tickによるslots/hand/t/status/productsを照合。
- 05はlevel/mode/reasonも含むasdict全Stateを照合。成功配置は36/120で原作と一致。
- 手に持つ状態を含む到達可能210配置を探索。全配置×六つのpickを照合。
- 空手×空枠でreasonだけが変わる操作を含む履歴、戻す操作も原作のState履歴と一致。
- 八反応の表は別途C/Bを含めて照合。ただしB/Cの依頼はこの教材では遊べない。
- 01/02は機能を省いた導入段階で、原作全体との同値は主張しない。
  03は時計と依頼/Undo、04は依頼判定/Undoをまだ実装しない。
原作の22テストや750フレーム自動デモはこの教材QAでは再実行していない。

3. 明示したstubの範囲
stubはPyxelの代用品で、12回drawした後の保存・終了という配線だけを検証。
stubではPNGを作らず、実描画証拠として数えない。

4. 実Pyxel描画
全5本についてinitialとresultの二場面、計10回をPyxel 2.9.9で起動。
各12フレームの実draw後に保存し、全て終了コード0、PNG 840×580。
実行コマンド・PNGハッシュはrender_results.json、出力ログは*.render.log。
初期検証用runnerが画像寸法取得でPillow未導入に遭遇したが、外部導入せずに
PNGヘッダーを標準ライブラリで読む方法へ修正し、全10回を再実行して成功した。
Pillowは教材・ゲーム・テストの依存に含まれない。

画像は10枚とも実ピクセルを目視確認した:
- 01 initial/result: F1/F2/M1と手、選択枠、六つの棚、交換後のM1位置が見える。
- 02 initial/result: 冷温段、反応予告P1/P3、Mがこの段階では無効という説明が見える。
- 03 initial/result: 八反応の表、縦横のみの説明、M移動によりP1→P0となる予告が見える。
- 04 initial/result: EDIT T0/2からRESULT T2/2へ進み、F二瓶が確定色/P番号になる。
- 05 initial/result: 依頼数0/1からP0/P3とも1/1、REQUEST CLEAR!とUndoキーが見える。
文字や図形の主要な欠け、画面端の切れ、表示の重なりは認めなかった。
01〜03のresultは配置/予告の検証場面で、ゲームの完了状態ではない。
04/05は二刻目の完成。05はその後Undoして再び二刻目を進めた同じ成功状態。
これは短い自動入力であり、人間による操作や楽しさの検証ではない。

5. 文書と独立レビューへの対応
各段階の実行コマンドはREADME.txtにWindows/macOS/LinuxをZIPルート基準で明記。
各.pyは他の教材コードやreferenceをimportせず単独起動可能。
日本語ファイルを読むテストはencoding='utf-8'を明示。
独立レビュー指摘のstep5 expectedを修正し、失敗結果からMを動かす前に
「Xを三回押して配置へ戻り」とLESSON.md/lessons.jsonに明記した。

6. 限界と未実施
- 人間のキーボード操作、楽しさ・難易度、長時間プレイは未検証。
- Windows/macOSの実機起動、ネイティブGUI操作、音声出力は未検証。
- 無音教材。音声デバイス初期化警告は出たが、画面の生成・保存は成功。
  音声出力や実聴が成功したとは主張しない。
- ASCIIのみ。原作のNotoライセンス例外は権利表記の一部として全文保持するが、
  字形データやNoto依存は含まない。
- 外部公開、Sites操作、新しいパッケージ導入、元の完成版の変更は行っていない。
- -Bで実行し、配布フォルダーにも原作ソースにも新しいpycacheを作っていない。

7. 凍結
FINAL_SHA256.jsonに、それ自身を除く配布全ファイルのSHA-256を記録。
変更が必要になった場合は、影響する試験と描画を再実行してハッシュを更新すること。
