028 溶ける鍵 — 機能検証と設計レビュー
確認日 2026-10-02 UTC

状態：実装・モデル確認・Linux GUI実操作・実映像・発信用原稿あり。
人による試遊は未実施。Windows/macOS実機未確認。意図的な無音作品、音の実聴評価なし。

モデルの採用判断
設計書の候補を実装後に検査し、全3配置を採用した。Pyxelをimportしない不変Level/Stateとtransition。
状態同値は人物位置×鍵長0..3×開錠bit。手数は経路長なので探索キーから除外。
全到達グラフをBFSで最後まで走査し、深さで打ち切らない。成功状態は入力を受けない終端。
A：上限96、到達12、成功へ戻れない状態0、最短確定7行動。
B：上限192、到達95、成功へ戻れない状態8、最短確定8行動。
C：上限224、到達16、成功へ戻れない状態0、最短確定7行動。
全成功列はモデルで再生し、各段階の鍵長・扉・位置・hashをsolver_results.jsonへ保存。
B燭台なしでも9行動の外周解。大扉を使わない制限でも8行動の正面解。
C物置と物置の扉セルへの入場を禁止しても7行動で成功。物置の開錠禁止では解なし。
Bで全部の扉を開けてから出口へ行く解は最短10確定行動。全部開けは目標にせず、8行動の解も許す。

19件の自動試験（test_results.txt）
・全到達状態の全行動を検査。合法な行動の後にundoすると直前のStateと履歴全体が一致。
・全扉×鍵長0/1/2/3×接する床側からの解錠を網羅。開いた扉、遠い対象、未知ID、鍵0、形違いを拒否。
・開錠／燭台では人物不動・鍵がちょうど1節減る。既開錠通過では不消費。
・拒否は同一StateオブジェクトとTimelineを返し、手数・鍵・扉・履歴を変更しない。
・Bを燭台で1節まで縮めた状態から成功不可、直前のundoで2節へ戻る。
・成功→undo、undo後の別行動、全リセット、無入力、境界、重複配置等を確認。
・同フレーム／次フレームのStart+行動、N+行動、P+行動、R+行動、M+Spaceの解放ゲート。
・ゲーム中のSpace長押しも1回のみ、矢印+Space／複数矢印拒否、対象の向きだけは履歴を増やさない。
・日本語グリフと全REASONS、各面・説明・成功・undo・鍵0..3・形違いの動的文・比較字幕・自動映像字幕の描画幅/高さ。
・自動入力の3面成功、Cの物置不進入を同じ入力処理で確認。
再実行はこのフォルダーで python -m unittest -v test_model test_ui。

最終ソースでのLinux実操作（クラウド側、エージェント操作。人の試遊とは別）
2026-10-02 19:32〜19:34 UTC、共有GUI枠を使用。
実画面の日本語説明→Spaceを650ms長押し→世界0行動のまま開始。
Aを7行動で成功→Zで終端解除→右で再成功。
N+Spaceを650ms保持→B初期状態0行動・3節を維持。右の2節錠は不一致で0行動のまま。
P説明と復帰、上→左で燭台を指定、Spaceを900ms保持→1回だけ溶けて2節。
Zで3節へ→再びSpace→正面経路で8行動成功。
Rで完全初期化→下の大扉を使う外周で9行動成功。上側の小扉は閉じたまま。
N→C。物置の錠を開けて1行動・2節、Zで3節と閉扉へ戻る→再開錠。
物置に入らず右の錠を順に使って7行動成功。キー0節でも出口へ進めた。
M+Spaceを650ms保持してメニューに留まる。ESCで閉じ、ウィンドウの不在を確認した。
同時入力の遅延到着はモック試験でも明示的に実行。全タイミングのネイティブ再現を保証する主張ではない。
実操作ログ media/gui_events.json の59イベントと保存SHAは最終app.py/model.pyに一致。
final_validate.pyで全イベントを独立にモデル再生しhash一致、A/B/C成功、C物置不進入を検査した。
media/native_B_rejected.png、native_B_outer.png、native_C_storage.png はF12による実ウィンドウ内描画保存。
初回の確認で出口に向いた白枠が盤外の説明欄に重なることを発見し修正。修正版を再起動して上記全経路を再確認した。

動画・画像
app.py --demo --headless は実際のPyxel rendererと共通の入力処理を使用。
映像は749元フレームを1回ずつ30fpsでMP4へ渡し、24.966667秒。フレーム削除/重複による時間合わせなし。
ffprobeで749フレーム、30/1fps、音声0ストリーム。全元フレームSHAも再照合。
実映像の自動入力ログ33イベントを再生して全hash一致。Bの不一致拒否・燭台undo・Cの物置不進入を含む。
タイトル、Bの拒否と予告、Cの物置開錠と成功、比較PNGを目視で確認した。
エンコードはH.264の非可逆圧縮であり、MP4画素とPNGの完全一致を意味しない。元フレームの順序と枚数を保持したという意味。
録画環境は音声デバイス初期化警告を出したがゲームは無音設計であり、動作・描画・ファイル生成は正常終了した。

移植回帰
全テキストread_text/write_textはencoding='utf-8'を指定。
cp932既定を模したio.openで、日本語と空白を含むコピー先から、任意cwdでタイトル描画・glyph読込成功。
ASCIIのWindows BAT、引用符付きパス、失敗pauseを静的検査。実WindowsのSDL起動を確認したものではない。

一変更比較・退屈な方策
同じBの燭台効果だけを無効/有効にした比較用基準。27対95到達状態、両方成功可能。
確定9対8行動だが方向合わせを含む実キーは10対10。操作効率の改善率は主張しない。
大きい錠から使う方策はA/Cの本筋で、B外周も正当。これを禁止して難しくはしない。
出口へ直進だけではB/Cの最初の小錠は開かない。いつでも最短まで溶かす方策はBで解を失う。
全扉開けはBで余分な行動が要るが、全部開けても成功できる別解として許す。
短い導入パズルの束であり、長い最短手・多い状態数を楽しさの根拠にしない。
次の人の試遊では「次はどの穴に合う？」「物置に入らない理由は？」「短くし過ぎると何が困る？」を聞く。
不明なら面数や罰を増やさず、鍵の歯・穴・予告の読みやすさを直す。

発信
NOTE.txt は未公開の日本語原稿。X_POSTS.txt は本文94/82/94文字、各140文字以下。
実在しない旧版、改善率、人の感想、Windowsの実機成功、音質評価は書いていない。
