fullseye

配布物の CLI で、help が別の入口を案内し、3 つのサブコマンドが使えなかった

症状

GenSpark 第 6・7 報(0.2.0 を pip install した Linux で fullseye を叩いた実測)。

コマンド 起きたこと
fullseye --help 実行例が全部 py -3.11 imgevolve.py …(checkout 専用の綴り。K2 の CLI 側)
fullseye parity error: unrecognized arguments: parity(rc 2)—— help には載っている
fullseye coverage FileNotFoundError: …/site-packages/data/halcon_operators.json(rc 1)
fullseye samples the following arguments are required: action(rc 2)
Studio 起動 QMainWindow::saveState(): 'objectName' not set for QToolBar / import のたびに pywt … Level value of 2 is too high

加えてこの木で数えると: python -W error::UserWarning -c "import ops" で REGISTRY が 931 → 929。xwt_visushrink / xwt_firm_denoise が黙って消え、FAILED_BACKENDS にも残らない。import 時にも unclosed file の ResourceWarning が 3 本(backends_auto.py:1761)。

なぜ門が通したか

CLI のテストは全部 checkout の imgevolve.py で走る。console_script fullseye として呼ばれる経路(argv[0] が違う、data/ が無い)を通る門が無かった([[feedback_gate_must_stand_where_the_accident_happens]] の CLI 版。wheel の門 tools/ci_wheel_check.py は中身の有無を数え、サブコマンドが走るかは見ない)。

直し

  1. imgevolve._prog() —— argv[0] が fullseye… なら help の実行例を fullseye <cmd> に、checkout なら従来の綴りに。epilog に両方を書く。
  2. cmd_parity —— sys.argv = ["parity.py"] に差し替えてから委譲(accel / bench と同じ)。
  3. samples —— action を省略可(既定 list)。
  4. honest_summary.main —— JSON が無ければ「何が要るか・数字の在処(docs/HALCON_PARITY.md)・出荷しているのは名前だけ」を印字して rc 1。クラッシュしない。
  5. backends_color._real_ops —— halcon_names_data.HALCON_NAMES を先に読む(JSON と 2,313 名で完全一致、色 op 12 本は全部実在名)。
  6. backends_r3._gate —— 探針を 32 px に、探針の中の警告は catch_warnings で無視。-W error でも REGISTRY は 931 のまま(門 = サブプロセス 2 本で数を突き合わせる)。
  7. backends_auto の JSON 読みを with open、Studio の主ツールバーに setObjectName("main_tools")。
  8. 第 12 報の追加(N19 / N25 / N26): fullseye --version が rc 2 で usage しか出なかった → --version を足す。algo run / apply の実行時メッセージも _prog() で呼ばれ方に合わせる。has <typo> の「not in the HALCON reference」は綴りの間違いまで HALCON の話に見えるので、「op 名でも HALCON 別名でもリファレンスの operator でもない」+ 探し方に。同報の N20(範囲外入力の出力が [0,1] を出る)= extra_checks の設計、N21(a=1e9 の丸め)= 記録 + once-per-op 警告、N22 / N23 = 第 1・3 陣で直し済み、N24(警告は初回のみ)= 文書化済みの設計(fullseye.fallbacks() / FULLSEYE_ON_ERROR=raise)。 CI(Linux)では os.path.basename が \ を区切りと見ないので Windows 形の argv[0] が丸ごと 1 要素になり、この判定が手元だけ緑だった —— 区切りは [\/] の両方で切る。
  9. 第 13 報「ネイティブクラッシュ 3 件」の正体: sample_photo / sample_photo_raw / sample_photo_rgb に未登録名を渡すと realdata が SystemExit(1) を投げていた(PoC 用に理由を印字して落ちる作り)。公開 API なので呼び手のプロセスごと終わり、第三者のスモークでは「ワーカーが消滅」と観測された。realdata.RealDataError(RuntimeError) に替え、fail-closed は例外で守る。

GenSpark 第 6・7 報で設計として残したもの: device="cuda" が GPU 無しでも返る(N7)—— 台帳に source="gpu" で記録され、op ごとに 1 度警告する(この木で実測: AssertionError: Torch not compiled with CUDA enabled が残る)。「無警告」に見えたのは同じ op が先に別の理由で fallback していたか、警告の once-per-op。非 ASCII のウィンドウ名が xwininfo で化ける(N11)は X クライアント側のロケール変換で、Qt は _NET_WM_NAME を UTF-8 で正しく立てている。