潮待ちポスト・教材の検証記録
実施日: 2026-10-05 UTC

環境
- Linux cloud execution environment
- Python 3.12.14
- Pyxel 2.9.9（既存の仮想環境を利用。新規インストールなし）
- 動作要件のPython 3.11自体での実行は未実施。使用構文は3.11以降向け。

合格した検査
1. python -B -m unittest -v test_stages.py
   36テスト、全件合格。
   内訳: 31件のルール・履歴・構文・ライセンス・教材コード片の検査、5件の入力/描画呼出スタブ。
   ログ: qa/unittest.txt
   対象: 地図、通れない入力が無料、島だけの潮切替、a/bの通行、Bと細橋、重複配達なし、
   両配達と帰還、21手で解けること、クリア後の停止、配達/潮/手数のundo、リセット、
   キー処理の優先順、1フレーム最大1操作、ESC制御、12フレーム終了呼出。
   スタブはPyxelの本物のキー入力や描画を再現する試験ではない。

2. 原作model.pyとの状態遷移比較
   原作2枚目BOARDS[1]「ふたつの潮」、基本便contract=3と教材05を比較。
   地図内の24通行可能マス x 潮2種 x 配達済み4種 x 入力6種 = 1,152ケース、全件一致。
   手数used=7で比較。x/y/tide/delivered/usedとeventを一致確認。
   クリア停止 → 潮切替 → 入力/海 → 潮橋 → 重荷 → 配達 → 移動/手数 → 帰還クリアの順を保持。
   Cは教材でIと表示するが、基本便では原作もCを配達対象にしないため、比較した規則は一致。
   ログと原作SHA256: qa/original_differential.txt
   この比較は原作を読める作成環境で実施。教材ZIP単独のテストは原作を必要としない。

3. 実Pyxelのheadless起動・画像保存
   01_grid.py / 02_tide.py / 03_delivery.py / 04_return.py / 05_undo.pyの5本をそれぞれ起動。
   全て12フレーム描画をログで確認し、終了コード0。728x500のPNGを保存。
   実行形: python -B 05_undo.py --headless-smoke --screenshot qa/05_undo.png
   01〜04もファイル名を置き換えて同じコマンドを実施。
   画像・標準出力・標準エラー: qa/01_grid.* ～ qa/05_undo.*
   追加で通常のSession.actへ21手の解法を投入した状態を12フレーム描画し、
   qa/05_clear.pngでCLEAR/21手/A:OK/B:OK/LIGHTの表示を確認した。
   この追加画像は自動準備したクリア状態の描画であり、人間の試遊ではない。
   01初期画面、05初期画面、05クリア画面のPNGを目視して、盤面・文字・操作案内の配置を確認。

環境の警告と未検証範囲
- PulseAudio/ALSAの初期化警告と「Failed to initialize audio device」が出た。
  実行は終了コード0で、描画とPNG保存は成功。この教材には音素材・効果音がない。
- 通常のネイティブウィンドウでの人間のキー操作は未実施。
- Windows/macOS実機での起動、キー配列やOpenGL環境の相違は未検証。
- 音の聞こえ方、初学者の理解度、面白さは検証していない。
- headlessと入力スタブの合格を、上の未検証項目の合格として扱わない。

完成範囲
- 独立した5段階。04と05は最後までクリア可能、05はクリア後もundo可能。
- 01〜03の省略規則はREADME.txt/LESSON.md/lessons.jsonに明記。
- 原作の3地図、追加便C、ソルバー表示、自己ベスト、音、アニメーション、字形は省略。
- 原作ソースは変更していない。
