089 未来からの修理票
実装・機能検証用。面白さは実際の人による確認待ち。

４台の小工場を６刻動かし、止まる理由を観察。一か所だけ変えて同じ未来を再実行する因果パズルです。
目的: Aは品５個、Bは箱４個、Cは完成４個。失敗しても何回でも仮運転できます。

起動
Windows: Python 3.10以上を用意し setup.bat を一度実行、その後 play.bat。
Linux/macOS: sh setup.sh、その後 sh play.sh。初回セットアップにはPyxel取得の通信が必要です。
ゲーム実行時はPyxel＋Python標準ライブラリのみ。外部アカウント・通信不要。
Windows/macOSの実機検証は未実施。Linuxの実Pyxel描画と、別記のネイティブ操作検査を区別しています。

操作
表紙1/2/3: A/B/C。B: 履歴あり／故障票だけの表示比較。Space:開始。
Space:１刻進む。P:毎秒１刻の自動運転／停止。H:説明（自動運転停止）。
まず無介入で６刻まで観察します。矢印で５候補、Zで詳細、Enterで一介入を選び刻０へ。
次にSpace/Pで仮運転。介入は毎回置換され、二つを同時には加えません。
X:１刻戻す。刻０では直前の介入の結果へ戻します。R:確認後無介入へ。
M:表紙、Esc:確認後終了、F12:PNG保存。入力は各操作の後に全キーを一度離してください。
選択・説明・結果では世界を止めます。自動運転を止めてから選ぶので考える時間に罰はありません。

完全な規則
A:初期水２、毎刻ポンプ＋１（上限４）→水２なら消費して品＋１、不足なら消費０。
変更は補給２／容量６／消費１／初期水４の四つ。値だけをそれぞれ一つ変更します。
B:電池４、毎刻＋１（上限５）→奇数Ｂ/偶数Ｃが電力２で部品１→Ｄは刻２/４/６に電力２で最大２部品を箱へ。
Ｄの在庫０は電力不使用。機械を先に判定するのでＤの競合電力はその残りです。
変更はＤ刻３/５/６／充電３／Ｄ消費１／Ｂ開始刻３。公開候補の充電２は全解不成立だったため３へ修正しました。
C:初期待ち２、毎刻供給１→ベルトが最大２を送る→到着２以上は全数戻る、１個なら完成＋１。
戻る品を同じ刻に再投入しません。変更は速度１／初期待ち０／許容２（到着数だけ完成）／偶数刻だけ供給。
異常票は機器ごとの初発だけ。回復可能で永久破損はありません。

確認済みの出力（無介入、変更１、２、３、４の順）
A:4,6,4,6,4。B:2,0,6,3,1。C:0,6,6,8,0。
Bの改修前は2,0,2,3,1で全候補が目標４へ届かず。目標や処理順を変えず「充電増強」の候補値だけ２→３へ変更。
Aで水槽を大きくしても供給は増えません。Cは遅くする方法以外に初期在庫・耐性を変える別解もあります。
Cの出力８を特別な上位クリアにしません。条件を満たす結末は同等です。

比較
履歴あり／故障票だけは表示のみの一変更。初期状態・操作・全６刻・依頼は同じ。
comparison_results.jsonにA介入１/B介入２/C介入１の同一到達例を保存。
履歴が面白さを増すかは人の試遊で未確認。現在値を読む調査も可能です。

ファイル
model.py:純粋な不変Stateと同期段階処理。controller.py:選択・undo・入力解放。
app.py:実Pyxel描画。experiments.py:全15候補を有限検査。
python -m unittest test_model test_ui -v:ファイルを変えないモデル/UI検査。
python experiments.py:解析JSONを再生成。media内の原本は変更しません。
media/automatic_*:自動意味入力による実Pyxel映像とPNG・入力状態・その収録時ソース。
media/native_*:エージェントによるLinuxネイティブ操作原本。人の試遊ではありません。
動画は原GIFの各フレームを順番に一度ずつ30fpsへ。音声トラックなし。約25秒です。
音の生成を行わない設計で、音に依存する情報はありません。音響品質の実聴評価はしていません。

再現と保全
イベントには状況、規則版、介入、意味入力、論理時刻、全状態、SHA256を保存。
各収録は独立フォルダーに当時のソースとイベント原本を保持。修正後の再検証は別ファイルへ保存。
assets/glyphs.jsonは同梱の日本語ビットマップ。Notoのライセンス全文をassets/NOTO-LICENSE.txtへ同梱。
Pyxelのライセンス全文はassets/PYXEL-LICENSE.txt。図形は本作のコードによる自作です。
tools/build_font.pyとtools/export_video.pyは開発時のみPillow/ffmpegを使用。実行時には不要です。
