020 すれすれ衛星
低く観て、上へ抜ける。Python + Pyxel 2.9.9 / 日本語 / 音なし

遊び方
惑星の周りを飛ぶ小さな衛星で、輪郭と目盛の付いた観測窓を記録する。
窓の上、半径26～52にいると自動で記録が増える。半径34以下なら速い。
ただし半径36より内側の薄い大気は速度を奪い、次の周回が低くなる。
観測後は安全な帰還軌道へ移し、噴射を止めて半径42以上を3秒保つ。
数字はすべて惑星中心からの半径。惑星22、衛星半径2、接触半径24。
この作品はゲーム近似。実航法・現実の大気や長期安定性を保証しない。

操作
選択画面：左右でA/B/C、Spaceで出発。
飛行中：右=周回と同じ接線方向、左=逆の接線方向へ噴射。
上=惑星から外向き、下=内向き。斜めは推力を正規化する。
接線方向は角運動量の符号で決める。白い実速度矢印とは別。
P=停止/再開。Z=前回の観測窓入口へ戻る。入口前なら初期状態。
R=同じ便を初期状態から。M=便を選択。成功後N=次の便。Esc=終了。
遷移キーを押しっぱなしにすると、離すまで噴射を受け付けない。
F12=media/manual_runtime.pngへ実画面保存（検査用）。

3つの便
A 高い一周：窓1つ、目標8。無入力4.008秒で成功する短い導入。
  待つことを正解に含め、入力技能や奥深さの証拠には数えない。
B 二つの窓：対向する窓2つ、各40。無入力33.342秒の安全策を認める。
  機械制御の低空観測→帰還は22.425秒、燃料9.733消費。
  操作して時間を縮める課題は任意。制限時間や燃料漏れはない。
C 下がり始めた軌道：上下の窓2つ、各32。初速17.5、半径36。
  無入力は20.800秒で接触。両窓を記録しただけでは成功しない。
  短い2回の順行噴射でも帰還できる（下の例）。

解き方の例（見たくない場合は飛ばせます）
Cで最初に右を0.20秒、飛行時計7.50秒で右を約0.167秒、それ以外は無噴射。
30Hzの記録では14.375秒で帰還、燃料1.467消費。
これは自動入力の実測で、人の操作精度や楽しさを実証したものではない。
最初の噴射6～12フレーム、2回目の開始4～8秒（0.5秒刻み）、
長さ2～6フレームの315候補を検査し、251候補が60秒以内に成功した。
1フレームしか通らない解ではないが、全域が同じ速さ/容易さとも言わない。

予測と帰還の違い
黄色の点線は「今から噴射しない4秒先」の軌道。4秒より後の墜落を除外しない。
帰還は別判定：束縛軌道、計算上の近点半径36.2以上、遠点86以下を候補にし、
同じ積分器で無噴射の一周全体を確認する。大気圏外に残ることを確認する保守的条件。
噴射すれば確認を無効化し、止めた後で改めて確認。噴射中の毎刻み予測は行わない。
燃料0でも直ちに失敗しない。外縁半径88以上に2秒いると離脱失敗。
外縁全体が可視範囲に収まり、半径78から警告する。

起動（単独フォルダ）
Windows：Python3.10以降を用意（制作検査は3.12）→setup.bat→play.bat。
BATはASCIIのみ、引用符付きパス、異常終了時pause。Windows実機GUIは未検証。
Linux/macOS：bash setup.sh → bash play.sh。macOS実機は未検証。
setupはこのフォルダの.venvへPyxelを入れる。実行依存はPyxelと標準ライブラリのみ。
launch.shは制作環境の共有venv用。配布時はplay.sh/play.batを使用。

検査/再生成（フォルダ内で、Pyxel導入済みPython）
python -m unittest discover -p "test_*.py"
python tools/build_replays.py
python tools/check_timing_band.py
python tools/test_portability.py
python app.py --headless --demo
python tools/encode_media.py
python app.py --headless --comparison --baseline
python app.py --headless --comparison
--baseline は抵抗係数だけ0にする比較用。観測/燃料/帰還条件は変わらない。
フォント/動画の制作ツールだけはPillowとffmpeg/ffprobeも必要。通常起動には不要。

同梱資料
model.py：Pyxel非依存のKDK模型。app.py：日本語UIと入力。
replays/：22本の正確な30Hz入力列、各初期条件と最終hash。
policy_results.json：時間/燃料/成否の別軸比較。
experiments/：抵抗だけを変えた一変更実験。
media/low_satellite_automatic_silent.mp4：25.966667秒、実Pyxel、自動入力、音なし。
映像はA0～5秒、B7～15秒、C8～21秒の正当な再生抜粋。画面に抜粋と表示。
観測報酬やモデル状態を映像用に改変していない。全入力列を別添。
media/frames/：再生成可能な作業用の分解画像です。元GIFの全779枚を作業場に保持していますが、統合配布ZIPには含めません。主MP4と選抜PNGを利用してください。MP4は779フレーム、30Hz。
QA.txt：確認済み/未確認。NOTE.txtとX_POSTS.txt：未公開の日本語原稿。

ライセンス
オリジナルコード/図形はMIT。Noto由来日本語字形はSIL OFL1.1。
assets/NOTO-LICENSE.txtを同梱。画像はPyxel実描画で生成画像ではない。

状態
実装・モデル確認・クラウドLinux GUI実操作済み。
人の試遊、面白さ、Windows/macOS実機、音の聴取は未確認。
