022 ことばの橋 — 検証記録
2026-10-02 UTC。技術確認と、人の楽しさの確認を分ける。

1. モデル・入力試験
python -m unittest -v：34件成功。test_results.txt参照。
モデルはPyxelをimportしない。不変Level/Stateとtransitionを分離。
不正な文、同じ札2枚、未完成文、無効入力、盤外、水、沈んだ石を拒否。
文交換は陸だけで一括確定。石の途中から文を変えて抜ける技は成立しない。
不合法操作は位置・文・歩数・交換数・履歴を変えない。
全到達状態で人物の足元が安全、札は各1枚、ゴールと成功状態が一致。
成功後の論理遷移は吸収。undoは文・位置・カウンター・終端まで完全復元。
予告取消は実行済みの移動をundoせず、予告だけを閉じる。
予告中の矢印は歩行も札変更もしない。

入力は押下端を1行動へ。上→下→左→右で同時矢印を1つに限定。
開始・予告の出入り・P・R・Q・N・undo・成功後に解除ゲートを置く。
保持キーと隣接フレームで遅れて来るキーの両方が離れるまで行動を遮断。
保持Start/Space、Next＋Space、Pause解除＋Space、R＋Space、Q＋Spaceを
同時／隣接フレームで模擬し、意図せず予告・確定・歩行しないことを確認。
中立1フレームの後の意図的な押下は即受付。不要な秒数待ちは設けない。
全主要drawを実行し、日本語字形のキー欠落がないことも試験。

2. 全探索と別実装の再生
幅優先探索は人物セル・浮く種類・終端をキーとし、表示カウンターを除く。
2×全地形セル数が上限。到達可能グラフを成功終端まで全て列挙。
A：8状態、合法13辺。最短は文変更1回＋6歩。
B：9状態、合法15辺。最短は3歩→文変更→3歩。
C：17状態、合法31辺。最短は4歩→文変更→7歩。
正確な探索記録、成功入力と各状態hash：solver_results.json。
全3面とも文変更0回で到着できない。Cの直線は(3,2)から先の沈む石で止まり、
その位置での全文交換も拒否。島(2,4)から下側の重い橋は出口へ接続。
独立再生はtransition/walkable/rulesを呼ばず、成功列の位置・モードを照合。
解の一意性は要件としない。8/9/17状態は「楽しさの点数」ではない。

3. 設計上の狙いと限界
A/Bは導入。Cは「近い継ぎ目」より「乾いた切替地点」を先に選ぶ発見。
タイマー、収集フラグ、帰岸作業、強制待機などは足していない。
右だけを連打しても全3面は解けない。Cでは下へ向かう意味がある。
一方で3面とも交換は1回で、深い文章プログラミングではない。
2モードの少数ルールで十分な発見になるか、単純に感じるかは人の確認待ち。
世界の掲示板が全石へ作用し、羽／錘の形でも対応を示す。

4. 一変更比較
EXPERIMENT.txt、experiment_results.json、experiment_before/after.png参照。
予告なし／ありの描画だけを変える。同じC、同じ島、同じ文、同じ入力。
両方とも同じ合法規則で全3面可解。旧版という来歴を作っていない。
理解・楽しさの改善率、人の好みは未測定。

5. 実画面と動画
Linux + Pyxel 2.9.9 の実際の描画。runtime_*.pngを目視確認。
A/B/C成功、石上からの交換拒否、undo、Cの近道が止まる場面、島の予告を収録。
media/capture_replay.jsonは自動操作の押下と状態hash。
tools/validate_capture.pyで全入力とhashを再生照合、全3面成功。
GIFの各デコードフレームを1度ずつ取り出し、n/30の時刻を与えてMP4化。
MP4は808枚、30fps、26.933333秒、768×864、音声ストリーム0。
ffprobeのフレーム数・時間を照合し、ffmpegで全フレームの復号にも成功。
MP4_VERIFICATION.jsonに元GIF／動画のSHA256とffprobe結果を保存。
GIFのcentisecond遅延をそのまま再生時間として扱っていない。

6. ネイティブGUI
2026-10-02 18:55〜19:00 UTC、クラウドLinuxのネイティブPyxelをCUA操作。
Application Finderからlaunch.shで起動。日本語タイトル・ルール・操作を目視。
A：開始Space600msを保持しても予告へ入らない。次のSpace600msでも確定せず、
  予告を保持。予告中の右400msで歩かず、再Spaceで1回だけ文変更。
  右500msでも1歩のみ。追加の5回の右で6歩／文変更1回の成功。
B：N＋Space600msで次の面へ進み、予告を開かず0歩の初期状態。
  P中のSpace600msを拒否。P＋Space600msの復帰でも予告を開かず0歩。
  石上で予告・確定すると「陸で文を替えよう」と足元枠、位置と文を保持。
  Zで岸へ戻り3歩で島へ。予告をZで取り消しても3歩と島の位置を保持。
  再予告・確定して右3回、6歩／文変更1回で配達。
C：右4回を試すと3歩目の継ぎ目に留まり、石上の交換も拒否。
  Zで一歩戻し、下2回で島へ。予告の点線と、沈む石の下向き矢印を目視。
  確定後、右4・上2・右1で11歩／文変更1回の成功。
  成功後Zで10歩・未達へ。R＋Space600msで初期化し、予告を開かず0歩。
最後にEscで終了、ウィンドウ一覧から022の不在を確認して共有GUI枠を解放。
media/native_A_success、native_B_rejected、native_B_success、native_C_rejected、
native_C_preview、native_C_success のPNGと状態JSONを保存。
実機のキー組合せは上記の範囲。フレーム単位の隣接到着は自動入力試験で確認し、
ネイティブ入力の内部到着フレームを測定したとは主張しない。
これはエージェントによる操作確認であり、人の試遊ではない。

7. 配布と文字コード
JSON等のテキストI/OはUTF-8を明示。
tools/test_portability.pyでcp932既定を模擬し、日本語／空白パスへコピー、
任意cwdからロードし実際のタイトルdrawを実行。成功。
BATはASCIIのみ、引用符付きcd・Python・ファイルパス、失敗pauseを静的検査。
実Windows/macOSのインストール・SDL・キー入力は未検証。
日本語字形はNoto CJK由来、OFLを同梱。実行時Pillowは不要。

8. 未確認と公開範囲
人による試遊0件。初見理解・面白さ・再挑戦意欲は未確認。
最初の3本へのユーザー感想を022の評価へ転記していない。
音は未実装。音の実聴確認なし。無音でも目的・状態・拒否理由が分かる表示。
NOTEとX原稿は下書きのみ。公開投稿はしていない。
