030 ひと箱の天気：水をなくさない5段階

LESSON.mdから始めてください。本文は日本語、画面はASCIIです。
原作C「水門に一滴を残す」のモデルを04/05で再現します。
架空の整数の水模型で、実際の気象・流体を再現しません。

必要: Python 3.10以上 + pyxel==2.9.9。モデル/テストは標準ライブラリのみ。
検証: Python 3.12.14 / Pyxel 2.9.9 / Linux headless。

準備（教材フォルダ内）
Windows:
  py -m venv .venv
  .venv\Scripts\python -m pip install -r requirements.txt
  .venv\Scripts\python -B 01_ownership.py
macOS/Linux:
  python3 -m venv .venv
  .venv/bin/python -m pip install -r requirements.txt
  .venv/bin/python -B 01_ownership.py

段階
01_ownership.py: 上下でSと雲の所有を1滴交換。左右なし。
02_visibility.py: 左右で列、1/2/3で原作途中の観察状態。上下はS列だけ。
03_flow.py: 1/2/3で実験、Xで1刻み。旧Kと合流を観察。
04_puzzle.py: 左右=雲、上=日差し、下=雨。原作Cの全モデル。
05_undo.py: 04にZで一手戻す機能を追加。成功後にも使える。
共通: R初期化、Esc終了。毎回全操作キーを離す。Rを含む同時押しも拒否。
解の例: 上3回、右2回、下1回、右2回、下2回。F 2 / K 1で成功。

それぞれ.pyを1本だけコピーしても起動可能。画像/字形データ不要。
例: python -B "/path/日本語 空白/05_undo.py"
全ファイルはUTF-8。JSON/本文もencoding='utf-8'で扱います。

追試
python -B test_stages.py
python -B tools/run_examples.py
python -B 05_undo.py --headless-replay UUURRDRRDDZ --screenshot undo.png --report undo.json
python -B tools/run_qa.py
python -B tools/verify_frozen.py
画面のないLinuxではSDL_AUDIODRIVER=dummyを指定。
再生L/R/U/D=矢印、Q=初期化、X/Z/1/2/3=同名キー。
最低12フレーム、長い再生は2×入力数+2。各キー間に全解放1フレーム。
--headless-smokeと--headless-replayは併用不可。出力指定はheadless専用。

困ったとき
Pyxelがない: 起動する同じPythonで-m pip install -r requirements.txt。
画面エラー: 通常起動は画面のあるデスクトップが必要。headlessで描画だけ検証可能。
反応なし: 全操作キーを離す。段階ごとの操作範囲を確認。
出力エラー: 保存先親フォルダを作成し書込み権限を確認。
文字化け: UTF-8対応エディタで開く。

原作との違い
Cだけ。01〜03は観察実験。03合流例だけ総量4、通常Cは3。
04/05は一手を即時解決し、中間traceを記録。移送の時間差表示は省略。
タイトル、面選択、P/M/N、F12なし。原作controllerの全互換ではありません。
同梱fixtureで通常Cの85状態/340遷移と中間traceを照合。
全履歴・任意レベル・OS入力・ブラウザーの網羅証明ではありません。
Windows/macOS実機、ブラウザー、ネイティブOS入力、人の試遊、音は未検証。
各.pyの原作MIT全文、原文LICENSE、参照するNoto OFL文書を保持。
字形データは不使用。詳しい検証記録と限界はQA.txt。
