072 ひとつの温室・教材QA / 2026-10-05 UTC

対象: 独立した5本の教材。最終範囲は原作A/baseの通常規則。
環境: クラウドLinux / Python 3.12.14 / 実Pyxel 2.9.9。
共通要件はPython 3.11以上。Python 3.11実インタプリター自体は未確認。

教材テスト: 24件成功（qa/test_results.txt）。
同じ24件を原作のない日本語/空白パスの単独配布で再実行し成功。
さらにPath.read_textの省略時文字コードをCP932へ置き換えた24件も成功。
同じ24種類を異なる条件で実行しており、72種類と数えません。
実コントローラーApp.controlへキー集合を渡し、無入力、長押し、同時押し、
全離しゲート、選択、候補取消、Spaceの候補不使用、Enter、Undo、終了、Rを検査。
原作40テストと原作の自動デモは本教材の件数・描画検査に混ぜていません。

直接比較（qa/direct_comparison.txt、qa/original_A_fixture.json）:
・原作model.pyのA/baseを-Bで読み取り。最初の状態を含む全87,381接頭状態、
  87,380遷移、65,536完走操作列を、待つ/左/中/右の順に深さ優先で照合。
・03はt/T/H/窓、04/05はgとoutcomeも一致。04/05の成功列は49,078。
・05のforecastは全接頭状態×4操作=349,524候補を比較。終了後のNoneも含む。
・原作の完全TickReportログは投影から除外。B/C、比較版、記録保存、原作UI全体は対象外。
・到達列とは別に2,304の時刻/窓/境界寄りT/H/操作を原作04/05と比較。
・0〜13の3要素ベクトル2,744組で原作diffusionと03/04/05を比較。
・原作Controllerと05の共通キー部分も75回のfeedで状態・cursor・pendingを照合。
  タイトルを閉じたA/baseから開始し、選択/候補/確定/待つ/Undo/終了/リセット、
  同時押し/長押し/一部解放/全解放を対象。原作の全キー・全入力列の網羅ではありません。
・原作フォルダ内50ファイルを比較前後にSHA-256照合し変更なし。
  qa/original_sha256.jsonに基準を保存。原作にはファイルもbytecodeも書いていません。

標準のtest_stages.pyは原作フォルダを参照しません。
qa/original_A_fixture.jsonの具体的な3操作列と、全接頭状態のSHA-256が基準です。
04/05をそれぞれ再列挙して照合します。03の全列照合は任意の原作直接比較側で実施。
符号対称除算、同時更新の例(12,0,8)→(9,5,6)、拡散単体の合計保存/鏡映、
日差し切替、窓の持続、最大2/行き過ぎなし、clampを最後に行う順序、
快適範囲の全境界、休むとき成長不減、8刻停止、上限8、予告非破壊、Undoを検査。

実Pyxel自動描画（qa/render_results.json）:
全5段階の初期画面と意味のあるチェックポイント、10プロセス成功。
すべて実updateからApp.controlへ合成入力し、終了直前の状態JSONを照合。
10枚の最終PNGを画像として閲覧し、文字/バー/窓/植物/予告/操作案内を確認。
詳細はqa/visual_review.txt。PNGは480×360、通常ウィンドウは2倍表示です。
01: Space3回、T10/7/6・H10/6/11。
02: 左を開いて待つ、T5/7/6・H5/6/10。
03: 中央を開いて2回待つ、T8/5/6・H7/6/8。
04: 最初2刻待つ→中央開閉→5刻待つ、両鉢8で成功。
05: 同じ3刻目中央候補を実行→Undo→候補を置き直す。次の正確な値を表示。
これはOSキー入力でも人のプレイでもありません。

単体隔離（qa/isolation_results.json）:
各.pyだけを日本語・空白入りフォルダへコピーし、無関係なcwdからCLIで起動。
全5本が実Pyxelでチェックポイントに到達、5PNGと状態を保存。フォルダ内は1本だけ。
既存のPyxel環境は利用。標準テストの配布隔離では必要fixtureと説明も同梱。
本体.pyは外部の素材やデータを読みません。すべてのテキストI/OでUTF-8を明示。

権利・素材:
LICENSEは原作LICENSE.txtと同一。各.pyの先頭に元のMIT全文コメントを保持。
原作のNoto字形例外は原文どおり残し、教材には字形データを含めません。
新しい権利者やライセンスは作っていません。Pyxel自体も配布せず依存指定のみ。
qa/provenance.jsonに範囲・由来・最終ソースハッシュ、diffs/に隣接段階の変更を記録。

未確認:
人による初見理解・面白さ、OSのウィンドウ/キーボード操作、Windows/macOS GUI、
ブラウザ実行、音の実聴。音は実装していません。dummy audioは実聴検査ではありません。
CP932模擬成功をWindows実機成功とは扱いません。

再実行:
python -B -m unittest discover -v -p test_stages.py
python -B run_qa.py
原作を持つ場合だけ: python -B qa/compare_original.py "原作フォルダ"
FROZEN_SHA256.jsonは検査後に自分自身を除く全配布ファイルを記録。
検査再実行でログやPNGを更新するとハッシュが変わるため、再確認してから凍結し直してください。
