039 見回り犬とパン屋：新教材の検証記録
判定：宣言した原作Cの範囲で合格。公開・インストール・原作編集なし。

対象
  01_scent.py：移動、餌、有限寿命。犬と勝敗なし。
  02_local.py：床距離の匂い場と局所観測。匂いなしでは静止、食事なし。
  03_patrol.py：追跡/巡回。食事・配達・勝敗なし。
  04_delivery.py：原作Cのゲーム規則。Undoなし。
  05_undo.py：Cの全モデル規則とUndo、R初期化。
  それぞれ独立プログラム。別ステージのimportや絶対パスはない。

モデルと入力
  qa/full_tests.txt：44試験、失敗0、スキップ0。
  qa/standalone_tests.txt：移動した教材だけで44試験、失敗0、スキップ0。
  qa/cp932_tests.txt：PYTHONUTF8=0、標準出力cp932で44試験成功。
  これはWindowsのOS/GUI再現ではない。ファイルI/Oは明示的にUTF-8。
  Python実版3.12.14、全5段階をPython3.11の文法設定でも解析。
  実Pyxelは2.9.9。環境詳細はqa/render_results.json。

原作との直接比較
  原作model.pyと実際のapp.pyのApp.updateから読み取り専用でfixtureを採取。
  qa/canonical_reference.json：46モデルケース、1,572遷移、3入力ケース/67フレーム。
  04：Undo/再開込みケースを除く1,550遷移の状態・観測を照合。
  05：全1,572遷移の状態・観測・Intent・履歴長を照合。
  原作App.update由来の67フレームと教材の実App.update/controlを照合。
  モデル状態に人の真の位置を隠し入力として追加しない。policyへ渡すのはObservationのみ。
  匂い寿命8/6、到達半径4、壁迂回、期限切れ、無効手、パン0個のZ、
  セル内ID同点、セル間の現在/上下左右同点、新しい遠い匂い、範囲外の新しい匂い、
  巡回、食事、接触、調査済み、接触/食事の優先、二手もぐもぐ、
  玄関での二度目のZ、三軒の配達、パン不足、終了状態、Undo/再実行/Rを含む。
  固定乱数24列も含む。全状態の網羅証明ではない。
  qa/canonical_comparison.jsonに数値と範囲。qa/original_sha256.jsonに原作ハッシュ。
  qa/source_integrity.jsonで対象原作7ファイルの作業前後の一致を確認。

入力ポリシー
  新規同時行動キーだけでなく、保持した矢印+新規Zも拒否。
  拒否入力の遅延実行なし。押しっぱなし/無入力で手数は増えない。
  R+Z/XはR優先、その後のずらし押しも全解放まで遮断。
  05の新規X+矢印はUndoのみ。保持X+新規矢印は原作通り許可。
  成功後X、再実行、R後のX、壁の無履歴も試験。

実画面
  qa/*_initial.png：5本の初期画面。
  qa/*_checkpoint.png：5本の進行画面。
  qa/01_scent_age_seven.png：寿命残り1。
  qa/04_delivery_shortage.png：不足終了。
  qa/05_undo_restored.png：最終配達をUndoしてPLAYへ戻った画面。
  計13枚の通常描画を実PNGとして目視し、文字クリップと状態表示を確認。
  置いたパンの寿命数字がプレイヤーに隠れていたためタイル左上へ移し、再描画確認済み。
  qa/visual_review.jsonに各画面の観察内容。

隔離
  各.pyだけを「単独 日本語」「パン屋 05_undo」など空白/日本語の場所へコピー。
  他ファイルのないフォルダから、別の「無関係 作業」CWDで起動。
  5本とも実Pyxel headless終了コード0。コピー前後のファイルはその.pyだけ。
  *_isolated.pngと状態JSONは通常checkpointと完全一致。
  13+5=18枚のPNG。詳細はqa/isolation_results.json。
  全必須試験は原作フォルダがなくても動作。任意なのはfixtureの再採取だけ。

既知の限界
  合成キー列を実コントローラに渡した検証。OS/物理キーボードの検証ではない。
  人による試遊・楽しさ、Windows/macOSのGUI、ブラウザ、可聴音は未確認。
  教材/原作ともに無音。Linux headlessの音声デバイス警告はログへ保存し、
  それとは別にPNG・JSON・終了コードを確認した。
  原作27試験と新規自動デモは別の原作QA。新教材44試験やPNGの代用にしていない。

開発途中の記録
  qa/development_initial_tests.txtは文書をまだ生成していない時点のログ。
  メタデータ欠落1件は文書生成で解消し、full_tests/standalone/cp932で全44試験合格。
  最初のQA収集器でPyxelの版属性が存在せず、importlib.metadata.versionへ修正して再実行。
  相対状態JSON出力もPyxel初期化前に絶対化し、無関係CWDでPNG/JSONの一致を再検証。

凍結
  FROZEN_SHA256.jsonは最終検証後の全成果物をハッシュ化。
  自分自身とqa/freeze_check.txtだけを除外。__pycache__も対象外。
  python -B tools/verify_freeze.py で検証。qa/freeze_check.txtに結果。
  tools/run_qa.py、capture_reference.py、build_lessons.py、build_docs.pyを再実行すると
  内容が変わることがある。再検証してからverify_freeze.py --writeで明示的に再凍結する。
