078 夜の花壇設計 教材QA / 2026-10-05 UTC

実環境
クラウドLinux、Python 3.12.14、実Pyxel 2.9.9。
配布要件はPython 3.11以上。Python3.11構文をastで確認。
Python3.11実インタプリター、Windows/macOS実GUI、ブラウザー、音声は未確認。
既存環境だけを利用し、パッケージのインストールや公開は行っていません。

対象
原作B「二つの小道」の部分集合。原作model.py / controller.py / storage.py /
app.py / README.txt / LICENSE.txtを読み、ルールと入出力から教材を作成。
01は昼黄色の配置、02は全色と昼夜、03は連結、04/05はBの配置と依頼判定。
A/C、原作全UI、表示比較、記録動画は対象外。保存schemaは教材専用。
原作自身の29テストや自動デモを教材の検証結果に数えていません。

テスト
qa/full_tests.txt: 35テスト成功。外部原作の直接比較を含む。
qa/standalone_tests.txt: 教材だけの別フォルダーで34成功、任意原作比較1スキップ。
qa/cp932_tests.txt: 既定read_textをCP932にした模擬で34成功、任意比較1スキップ。
CP932模擬はWindows実機検証ではありません。テキストI/OはUTF-8を明示。

配置の不変性、石/範囲/6本制限、同種色巡回/別種植替え、同一配列の昼夜開花、
縦横/斜め/行端/空集合/閉じた花の橋渡し拒否、条件と提出後編集、長押し/同時押し/
全キー解放、カーソル、確認取消、全状態Undo、変化なし履歴、2048上限/復旧、
記載課題、元コードの抜粋、MIT全文、ASCII描画範囲と描画の純粋性を検査。

原作との照合
qa/original_B_fixture.json: 原作を読み取って生成した59の完全な投影状態。
花配列・view・submitted、条件、昼夜render-dataを比較。05はUndoも比較。
原作のlevel='B'は固定なので投影から除き、日本語linesと冗長なvaluesは比較対象外。
04はUndo追加前なので各系列の最初のUndoの手前まで比較。
直接比較では、植えられる10枠の空/D/Nの全3^10通りから6本以下の26,025配置を抽出。
各配置で本数/連結/条件と、昼夜両方の描画用データを一致確認。
さらに固定seed78の全6色を含む1200配列で、04と05それぞれ38操作を照合。
合計91,200遷移で花・view・submittedが一致。7^10の全色配置の網羅は主張しません。
保存形式・原作UI全体・ピクセル形状の同等性ではありません。

原作保存物の保全
qa/original_sha256.json: 読み取り前と生成後の原作全61ファイルhash。
qa/provenance.json: 全検証後にも同じ61ファイルを再照合。
-Bとdont_write_bytecodeで原作importにpycを作成しません。
原作のsaves/media/コード・権利表示は変更していません。

保存
全テストはTemporaryDirectory内。通常のtutorial_saves_078は作成していません。
未達1本の案と達成6本の案を別枠へ保存、読込Undo、再起動相当の新しいAppから
明示読込、上書き取消/確認、既存ファイルの排他的作成拒否、置換失敗時の保全を検査。
破損JSON、不正UTF-8、過大/過剰ネスト、異版、bool/int混同、石、7本以上、
判定改ざん、余剰フィールド、symlinkと不正枠を拒否。
読込失敗はメモリー状態とUndoを保ち、保存失敗は既存ファイルを先に消しません。
同期ソフトとの競合や悪意ある別プロセスとの競争を完全に防ぐ保証はありません。

実Pyxel描画と独立起動
qa/render_results.json: 各段階の初期/意味ある到達点、計10プロセス正常終了。
通常のApp.feedへ合成キー集合を渡し、実update/drawで描画。到達状態も照合。
01は3本配置、02はD2本/N1本の異なる景色、03はD3/N3が各1まとまり、
04/05は6本の依頼達成と提出後の編集可能状態。
qa/persistence_render.json: 実Pyxelで未達1本を1枠へ保存、2本へ編集、1枠読込、
Undoで2本へ戻し、別の2枠へ保存。両ファイルが未達案であることを再読検査。
qa/05_design_files_persistence.pngにSAVED DESIGN 2とREQUEST NOT METが共存。
保存先はこの実描画検査でも一時フォルダーに隔離。
qa/isolation_results.json: 各.pyだけを日本語/空白の別フォルダーにコピー。
無関係cwdから各到達点へ実起動し、全5本正常終了。フォルダーは.py一本のみ。
合計16起動/16PNG。初期/到達/保存の11PNGを実際に開き目視確認。
隔離の5PNGは目視済み到達画像とファイル全体がバイト単位で一致。
配置、D/Nの開閉、選択枠、条件、操作文字、保存メッセージを確認。
qa/visual_review.jsonに結果。OSキーボードや人のプレイの検証ではありません。
SDL_AUDIODRIVER=dummyは音声確認の証拠にしていません。この作品は無音。

途中の検査修正
qa/initial_tests.txtの2失敗は、テストがtapでキーを離した後を「押したまま」と
誤って扱ったことによるもの。押下/解放を区別する検査へ修正しました。
qa/initial_capture_failure.txtはPyxel終了後の標準出力を収集できなかった初回。
終了前にJSONをflushするよう全段階の検査用分岐を修正し、全検証を再実行。
最終結果はfull_tests、render_results、qa_runner、standalone_tests、cp932_tests。

権利と凍結
元のMIT全文をLICENSEと5本の.pyの先頭に保持。
第三者例外の参照先NOTO-LICENSE.txtも同梱。Notoの字形データは使用・同梱しません。
FROZEN_SHA256.jsonはそのファイル自身を除く配布物すべてのSHA-256。
検証後に作成。qa/verify_freeze.pyで照合できます。再生成すると再凍結が必要です。

未確認
人の学習理解、創作の満足、ネイティブOS入力、Windows/macOS GUI、ブラウザー、音声。
他のOS/ファイルシステムでのハードリンクやsymlink権限も実測していません。
