033 ねずみ会議 / Python + Pyxel
実装・機能検証済み。面白さと初見理解は人による確認待ち。

遊ぶには
Windows: Python 3.10以降を用意し、setup.bat、次にplay.batを開く。
macOS/Linux: sh setup.sh、sh play.sh。ゲームのフォルダだけで独立起動。
実行時依存はrequirements.txtのPyxelだけ。無音です。
assets/glyphs.jsonは同梱済み。フォント作成にPillowが必要だが、遊ぶ時は不要。
Windows実機は未検証。cp932既定の疑似環境、日本語/空白パス、別cwdを検査。

目的
三匹はチーズ・りんご・木の実を一種類ずつ運んだ。各目撃者は、公開された苦手な品だけを「チーズ→りんご→木の実→チーズ」の次の品として証言する。
自分以外の二匹を見た。嘘・気まぐれ・追加の秘密ルールはない。
質問券で証言を得て、今の証拠と矛盾しないチーズ係を全員選んで提出。
A/Bは一匹、Cは二匹以下に絞れば成功。Cは二匹を残すことが正解。
真相を偶然当てても、別候補を証拠で排除できなければ成功しない。

操作（押下時のみ。長押し反復なし）
表紙: 1/2/3 会議を選択、Space 開始。
質問中: 上下 目撃者、左右 荷物の持ち主、Z 質問。
Space 結論画面。結論中は左右で名前、Zで選択を切替、Spaceで提出。
X 直前のモデル操作を戻し、質問画面へ。券も戻る。結論成功もundo可。
R 同じ会議を再開。1/2/3 別会議。P 停止/説明。M 表紙。Esc 終了。
H 候補名支援の有無。B 逆向きの可能性補助の有無。どちらもルール不変。
F12 media/native_runtime.png と操作ログを保存（フォルダは自動作成）。
画面移行キーは全操作キーを一度離すまで再受付しない。同時選択は拒否。
結論に移るだけではモデルを変えない。Xは直前の質問/成功提出そのものを戻す。
時間・誤答ペナルティはなく、質問重複/自分への質問で券を失わない。

処理順と情報境界
Levelに真相・公開苦手・目撃関係を置く。観測生成時だけ対象一匹の品を渡し、Observation(witness,target,item)から一定の証言を作る。
問を検証→既存カード/残券を検証→固定観測の証言を追加→六つの全割当を濾過。
結論はその証拠が残す係の集合と厳密一致し、目標数以内でのみ成功。
候補支援は質問を選ばない。AIに現在の結論や残券で発言を変える処理はない。
bounded_oracleは真相を読まず情報集合を返答ごとに分岐する有限minimax。
上限は公開の質問券2、質問候補6、仮説6。予算0で打ち切り、不可能はNone。
実真相に対する最短再生列と、未知の真相への最悪時保証は別に記録。

三つの迷い（ネタバレ）
A: 初期A→Cが木の実なのでCが確定。B→AまたはC→AでAへ絞れる。
B: B→AのりんごはA/Bを分けない。C→AならAはりんごでBがチーズ。
   実真相は追加1問で分かるが、初期情報からの最悪時保証は2問。
C: A→Cが木の実ならA/Bが残る。全質問でもチーズとりんごの入替を区別できない。
   Aを真の係だからと単独提出しても拒否。ABの正しい保留を受け入れる。

再現・検証
python -m unittest test_model test_ui -v
python solver.py
python tools/test_portability.py
python app.py --headless --demo   （実Pyxelで約25秒の無音自動再生）
python tools/export_video.py      （Pillowとffmpeg/ffprobeが必要）
python tools/capture_comparison.py
python tools/validate_artifacts.py （media付き配布で実施）
--baseline で補助表示なしを遊べる。公開規則や候補支援は隠さない。
EXPERIMENT.txtが比較仕様。NOTE/X_POSTSは未投稿原稿。
