081 交代灯台守 — 五段階のPyxel教材

LESSON.mdを01から読み、lessons.jsonの五行が各段階に対応します。
Python3.10以上を想定。実行した環境はLinux / Python3.12.14 / Pyxel2.9.9。
利用者の初回セットアップ: python -m pip install -r requirements.txt
作者の検査は既存環境で行い、新たなインストールはしていません。
各01〜05の.pyは一ファイルだけ別フォルダへ移動・改名して実行できます。
assetsや元のmodel/controllerは不要。ランタイム依存はPyxelだけです。

起動例
python 01_beam_timing.py
python 05_timeline_undo.py

左右は選択だけ。Z/Enterで一刻確定。Spaceはwait、充電中は不採用。
02以降Tabで階段を直ちに確定、充電中なら中止して上へ。原作の確認画面は省略。
03以降1/2/3で勤務A/B/C。04以降Bは表示だけを比較し、時刻・物理・履歴を変えない。
05のXは状態全体を一刻Undo。Rは読込済みのコードで即初期化。
編集を反映するには保存→Esc終了→同じコマンドで再実行。Rはコード再読込ではない。
すべての入力で一度全キーを離す。同時押しは不採用。

01/02は公開された一便の教材用初期値。03以降は原作A/B/Cの全データと遷移。
03は保存された観察帳のみ、04で原作publicと再通過無線、05でTimeline/Undo/replay。
共通UIには将来の未実行分岐が残り、本文に説明しています。
上階でだけ方向変更。充電完了→次刻→ID順案内。階下では前の灯りを保持。
下階の帳面は古い観察。未確認の初回便の航路を表示しません。再通過無線は公開情報。
比較Bは現在の海を投影するだけで、元の観察帳を書き換えません。
05のモデル定義・全方策・データは原作同一。表紙・確認ダイアログ・日本語字形・S/F12は省略。
各standaloneにMIT全文、LICENSE/LICENSE.txtと原作Noto/Pyxel通知を保持。Noto字形は不使用。

再現検査（教材フォルダを作業ディレクトリにする）
python -B -S test_stages.py
python -B -S qa/cp932_check.py
python -B -S qa/exercise_checks.py
python -B -S exercises/01_due.py
python -B -S exercises/02_amount.py
python -B -S exercises/03_retry.py
python -B -S exercises/04_compare.py
python -B -S exercises/05_undo.py
SDL_AUDIODRIVER=dummy python -B qa/runtime_checks.py /絶対パス/新規runtime
SDL_AUDIODRIVER=dummy python -B qa/render_boundaries.py /絶対パス/新規boundary
python -B qa/reference_check.py /原作/081_lighthouse_shift /絶対パス/新規reference
python -B qa/verify_freeze.py

各出力フォルダは新規パスを指定。環境変数の設定方法は使用シェルに合わせる。
個別描画: python 05_timeline_undo.py --headless-smoke --demo-checkpoint --screenshot new.png --state-json new.json
--demo-checkpointを外すと初期画面。親フォルダは既存、出力PNG/JSONは未存在であること。
不正CLI・既存ファイルはPyxel import前に拒否。相対出力先は起動cwdへ固定してからPyxelを初期化。
通常の状態JSONはpublicだけ。モデル再現用の内部全状態とは区別しています。
本文/JSONはUTF-8を明示。CP932検査は実際の既定open/Path.read_textと日本語プローブを使用。

qa/REVIEW.mdに結果と範囲。実Pyxel Linux headlessの合成キー入力・画像で検証。
物理キーボード、ネイティブOSキー、Windows/macOS実機、ブラウザー、実聴、人の学習効果は未確認。
音声はありません。原作も音を必要とせず遊べます。
有限深さの全合法操作と既知方策の比較で、任意長の全履歴・最適方策の証明ではありません。
原作・他教材・公開Siteの変更、アップロードや公開をしていません。
FROZEN_SHA256.jsonは自身とPythonキャッシュを除く全ファイルの集合とハッシュ。
練習で編集すると凍結検査が失敗するのは正常です。
