069 沈黙の証人 — 五段階の単独Pyxel教材

これは架空のルールに従って情報を整理するパズルです。
現実の証人、記憶の信頼性、法律上の聞き取り・尋問を説明する教材ではありません。
沈黙、表情、応答速度から嘘を判定しません。

最短起動
1. Python 3.10以上を用意します。
2. この教材フォルダで python -m pip install -r requirements.txt
3. python -B 01_projections.py
4. 番号順に05まで進みます。詳しい読み順、練習、期待結果はLESSON.md。
Pyxelは2.9.9固定。QA環境はPython 3.12.14 / Linuxです。

各0*.pyはその一枚だけを別フォルダへコピーして起動できます。
画像・音・フォント・他の.pyを実行時に読むことはありません。
配布するときはLICENSEとassets/NOTO-LICENSE.txtも一緒に渡してください。
各.pyにも原作のMIT全文と通知を残しています。Noto字形そのものは不使用です。
画面はASCII、日本語の説明・候補・判定データはソースと本文にあります。

基本操作
↑↓資料、←→候補、02以降Z提示。01のSpaceは細部/大分類プレビュー。
04以降Spaceは残す/外す、A補助、Enter報告。05のXはUndo。
Rは確認なしで同じ事件を最初から、Escは終了です。
同時押しは拒否し、操作キーを全部離してから次を受け付けます。

重要なルール
最初に受理した資料だけ細部。あとは大分類。各資料は一回だけ。
時計を先にすると全資料後もH1/H2。写真を先にすると一枚でH2。
少なくとも一枚聞き、回答と両立する候補を全部残すことが成功条件。
H1/H2を両方残す報告も正式な成功です。真相H2だけを当てるゲームではありません。

検証
python -B -S -m unittest -v test_stages.py
  標準ライブラリだけで実行。原作不在の通常実行は48件中47件成功・任意比較1件skip。
WITNESS_ORIGINALに原作フォルダを設定すると任意のライブ比較も実行できます。
python -B tools/verify_original.py /path/to/original/069_silent_witness
python -B tools/render_qa.py
  実Pyxelのヘッドレス描画、全段階の独立コピー、CLI拒否を確認します。
python -B tools/check_freeze.py
  凍結時の教材ファイルと記録のハッシュを照合します。

自動チェックポイントの例
python -B 05_undo.py --headless-replay DDZAE --screenshot report.png --report report.json
キー列: U上 D下 L左 T右 Sスペース Z提示 A補助 E報告 X戻す Rリセット。
相対出力先は実行時の作業フォルダを基準にします。JSONは明示的UTF-8。
--reportや--screenshotだけ、未知キー、1000文字超はPyxel読込み前に拒否。
replay関数の512件上限と、このQA用の1000キー上限を混同しないでください。

原作との差
Aだけ収録。原作B/C、全細部比較、表紙、P停止、S記録、動画は省略。
教材は同時押しを拒否する一方、原作は決定入力を優先順位で一つ受理します。
05の原版Aの投影・照合・遷移・Undo・決定的記録は原作から採ったfixtureと照合。
LESSON.md末尾とlesson_meta.jsonに次に戻って読む関数を記載しています。

qa/のPNGは実Pyxelヘッドレスの合成入力による無音画像です。
人の試遊、ネイティブOS入力、音の評価、ブラウザ、Windows/macOS実機検証ではありません。
QA.txtに実行結果と制約、FROZEN_SHA256.jsonに凍結時のファイル一覧があります。
