028 溶ける鍵

鍵が短くなるのは、減るだけでなく形が変わること。
ろうの鍵は錠を開けるたび先端の1節が溶けます。穴と同じ節数でないと開きません。
3つの小部屋で、次に合う形を作りながら出口へ向かう短いパズルです。
全ての扉を開ける必要はありません。時間では溶けず、やり直しに罰はありません。

起動
Windows：Python 3を導入してから setup.bat を実行。完了後 play.bat。
macOS/Linux：bash setup.sh、次に bash play.sh。
Python 3.10以上推奨。依存は requirements.txt のPyxel 2.9.9だけです。
日本語グリフを同梱し、OSの日本語フォントには依存しません。
Windows BATはASCII、パスは引用符付き、失敗時はpauseでエラーを残します。
単独フォルダーの setup/play が標準。launch.sh は開発用の共有環境フォールバックを含みます。
Linux実ウィンドウを確認済み。Windows/macOS実機は未確認です。

操作
タイトル：左右でA/B/Cを選択、SPACEで開始。
矢印：1マス歩く。壁・閉じた扉へは動かず、向きだけ変える。
SPACE：白枠の錠／燭台を使う。開錠そのものでは歩かない。
Z：確定した歩き・開錠・燭台を1つ戻す。鍵・人物・全扉・手数を復元。
R：同じ部屋を初期化。P：説明／一時停止。M：部屋選択。
成功後 N：次の部屋。ESC：終了。F12：技術確認用PNGと操作ログをmediaへ保存。
キーは1つずつ離して押してください。長押しの自動リピートはありません。
方向とSPACEの同時入力は拒否。開始・次面・説明・リセット・メニューの後も全キーの解放を待ちます。
向きだけの変更・拒否は手数とundo履歴に入りません。向きはundo対象の世界状態ではなく対象選択です。

見方
鍵の歯と錠の溝を節数で表示します。数字も併記し、色だけで区別しません。
緑枠は今の鍵に合う未開錠、白枠は向いた先。右欄はSPACE後の鍵の長さの予告です。
開いた扉はその後ずっと床です。通るたび鍵を削ることはありません。
0節は持ち手のみ。新しい錠は開けませんが、Zで戻せます。
燭台で短くし過ぎても自動ゲームオーバーにはしません。ZかRで見直せます。

3部屋と確認した解
A「次の穴に合う」：3節の錠を開けた鍵が、次の2節の穴に合う。
B「ふたつの道」：燭台で2節にして正面へ、または3節の大扉から外周へ。両方が正当な解です。
C「通らない錠の役目」：物置の錠だけ開け、物置には入らず鍵を2節へ。不要な入室フラグはありません。

解のキー列（タイトルで部屋を選びSPACE後。各キーを一度離す）
A：右 SPACE 右 右 SPACE 右 右
B正面：上 左 SPACE 下 右 SPACE 右 右 右 右
B外周：下 下 右 SPACE 右 右 右 上 上 右
C：上 SPACE 右 SPACE 右 右 SPACE 右 右
Bは確定行動8対9ですが、向きだけの入力を含む実キーは両経路とも10回です。
ボタン数が少ないという「近道」の宣伝はしません。

検証と資料
model.py：Pyxelなしの不変Level/Stateと原子的transition。
solver.py：有限状態を打ち切りなしBFS、解列と各状態hashはsolver_results.json。
A/B/Cの到達状態12/95/16、状態上限96/192/224、確定行動の最短7/8/7。
Bの8状態は以降成功できない状態。短くし過ぎると困る理由をモデルで確認しました。
test_model.py/test_ui.py：全到達遷移・全錠と鍵長・undo・拒否・入力境界・文字領域等。
tools/test_portability.py：cp932既定の代替環境、日本語＋空白パス、任意cwd、BAT静的確認。
python -m unittest -v test_model test_ui で再実行できます。開発検証・動画変換にはPillow/ffmpegが別途必要です。

映像・画像
media/melting_key_automatic_silent.mp4：実際のPyxel描画を自動入力で記録した機能確認、無音。
749枚を順番どおり各1回、30fpsで入力し24.966667秒へ変換。GIFの遅延丸めは採用していません。
media/timing_validation.json に元フレームhash、枚数、ffprobeの確認結果。
media/runtime_*.png：同じ実描画からのPNG。
media/native_*.png と media/gui_events.json：エージェントがLinuxネイティブ画面を実操作した機能確認。
実ウィンドウ操作と自動入力映像は別の証拠です。人間の試遊ではありません。

比較・発信
EXPERIMENT.txt と experiment_results.json：Bで燭台の変形機能だけを無効／有効にする比較用の反実仮想。
NOTE.txt と X_POSTS.txt は日本語の未公開原稿です。
実装・機能検証済み。人の初見理解・楽しさ・再挑戦したくなるかは試遊待ちです。
ゲームは意図的に無音。クラウド音声デバイスの実聴はしていません。
コード・絵はMIT。Noto由来グリフはSIL OFL、assets/NOTO-LICENSE.txt参照。
