042 小さな渡し船 / 教材QA / 2026-10-05 UTC

環境
クラウドLinux x86_64、Python 3.12.14、実Pyxel 2.9.9。新しい依存のインストールなし。
教材の共通要件はPython 3.11以上。3.11構文をASTで検査しましたが、3.11実機は未確認です。

モデル・Controller・改造課題
qa/full_tests.txt: 39テスト成功。
qa/standalone_tests.txt: 37テスト成功、任意の原作比較2件skip。
qa/cp932_tests.txt: 同じ37成功・2skip。既定read_textをCP932にした模擬でありWindows実測ではありません。
全段階の所有者・時間0・満員からの降船、未出現/別港、無効な型/引数/添字、
潮の出発時検査、定員との独立、潮0で空船、H-B浅瀬禁止、深水二刻、途中の操作拒否、
同刻の出現→到着後乗船、自動降船の対象、希望時刻ちょうど、遅い全員到着、終端凍結、
各操作の全State Undo、二刻の一括Undo、拒否で履歴不変、予告の不変性を検査。
本番と共通のApp.controlでキー長押し抑制、同時押し、選択循環、成功後Undo、Rを検査。
入力監査で見つかった「左+右を拒否した直後、左を残してZで乗船できる」問題を修正。
5段階すべてでpressed/heldの和集合が複数なら拒否し、全キー解放までロックします。
同じ2入力の再現、部分解放、全解放後のZ、heldだけの複数入力、集合をまたぐ複数入力を検査。
Rの新押しはロック中も最優先で初期化し、再び全解放を要求。X+ZはUndoしません。
qa/input_gate_regression.jsonとテスト4件に仕様・再現・回復を記録しています。
5つの改造課題の期待結果、本文抜粋の一致、MITコメント、ASCII描画枠も検査しています。

原作との直接比較
04/05の対象は原作B・通常規則です。A/Cや比較モードの同等性は主張しません。
各段階につき時刻4以下の全1,686到達Stateから11操作、18,546遷移を比較。
出先は最大時刻6まで含み、全State項目・理由・途中trace各刻と原作invariantが一致。
無限の待機があるので、全時刻の到達状態を探索し尽くした検査ではありません。
qa/canonical_B_fixture.json: 原作から採った5経路・36操作の全状態/理由/trace。
通常深水、軽い浅瀬経路、遅い成功、同刻出現、拒否された浅瀬を含み、単独テストでも利用します。
原作App.updateを読み込み、合成されたキー入力でBの実メニューを操作。
拒否、深水演出終了、全員到着、3回のUndo、再開の状態・履歴を05と比較しました。
原作の表紙/状況選択/停止や全GUI機能までの同等性は主張しません。
原作とのController比較は単独キーの手順です。教材の同時押し方針の同等性は主張しません。

実Pyxel描画
qa/render_results.json: 5段階×初期/到達点の10プロセス、すべて正常終了。
同じApp.controlへ実行中に合成キー集合を渡し、実エンジンで描画しました。
各PNGと状態JSON/ログを保存し、到達StateをControllerの期待値と照合しています。
01は定員3の拒否、02は時刻1でA・pは船内・sが出現、03は深水二刻で3人船内。
04/05は時刻3・全員到着・希望内4/4・便数2。
qa/focus_results.json: 追加3プロセス。浅瀬拒否、深水Undo、時刻8・希望内0/4でも成功。
初期/到達点/追加の13画像を実際に開いて、数字、所有、船、航路、予告、遅着、操作説明を確認。
入力修正後に上記全描画と独立起動を再実行し、18 PNGは確認済み画像とバイト同一でした。
qa/input_gate_results.json: さらに全5段階×拒否/復帰の10プロセスを実Pyxelで実行。
合成pressed/held集合で左+右→左を残したZ→部分解放→全解放→Zを送り、状態JSONで照合。
新規10画像も実際に開き、拒否時は0人・INVALID ACTION、復帰後は1人・BOARDEDを確認。
合計23種類の実ゲーム画像を確認。OSからのキー入力ではありません。
初期確認で船図形と規則行の間隔を広げ、修正後に全描画・テストを再実行しました。
qa/*_review.pngは初期/到達点の確認用の並置。ゲーム画面の再現・作り直しではありません。
qa/visual_review.jsonに画像確認の対象・所見・限界を記録しています。

ファイル単独の独立性
qa/isolation_results.json: 各.pyのみを日本語と空白を含む別フォルダーへ複製。
無関係の作業ディレクトリーから既存Pyxel環境で起動し、5本とも正常終了。
コピー先は.py一つだけのまま。原作・他段階・画像への依存なし。
到達点の状態JSONとPNGは、通常フォルダーの同じ到達点と完全一致しました。
テスト・補助スクリプトのファイルI/OはUTF-8を明示しています。

権利と凍結
原作model/app/README/LICENSEを全体読了。原作36ファイルのハッシュを検証前後で照合し不変。
qa/original_sha256.jsonに原作ハッシュ、qa/provenance.jsonに出所・実行条件・検証範囲。
LICENSEは原作LICENSE.txtのバイト同一コピー。5本先頭も同じ通知のコメント。
原作通知が参照するassets/NOTO-LICENSE.txtを同梱。教材はNoto字形データを使いません。
原作の既存16テストと別の自動実演の証拠は親作業側で別管理し、本教材の検査数へ含めません。
FROZEN_SHA256.jsonが配布内容の最終ハッシュ。後で再検証ログを更新した場合は再凍結が必要です。

未確認
人の面白さ・学習理解、OSからのキー/窓入力、Windows/macOS実GUI、ブラウザー、音声。
このゲームは無音。SDL_AUDIODRIVER=dummyを用いた検証は音声の成功証拠ではありません。
