fullseye

Fullseye Studio — HDevelop 忠実化スペック(北極星)

目的 = Fullseye Studio(studio.py)を MVTec HDevelop に忠実な画像処理 IDE にする。 原則 = 「IDE の画面はシンプルかつ多機能」「情報密度が高い」(ユーザー 2026-08-15、[[feedback_ide_design_simple_multifunctional]])。 本ドキュメントは複数セッション横断の実装スペック。各セッションはここを読んで続きを実装する。

一次情報(必ずこれで裏取り)

HDevelop のモデル(Perplexity 調査要約・公式で要確認)

ウィンドウ(それぞれが「一つの完結したソフト」として機能・ボタンはアイコンでコンパクト・右クリックでコンテキストメニュー)

iconic の与え方・確認

制御フロー / スクリプト構文(HALCON Script)

メニュー(HDevelop)

現状 Studio → HDevelop ギャップ & ロードマップ

線形 a/b パイプライン(op,a,b の列)→ 変数 + 制御文 + 型付き引数の HDevelop 型へ段階進化。

実装規律

次セッション最優先(2026-08-15 実 GUI レビューで判明)

  1. ★自律 UI 操作デバッグ・ハーネス: QTest で実マウス click/press/move/release を全ボタン/ドラッグへ注入し、操作系のクラッシュ・不具合をユーザーに触らせず自動検出。手順: build_window(offscreen)→全 QPushButton/QAction を QTest.mouseClick→dock ドラッグ→各段でスクショ+状態 assert。ハンドラ直呼びでは実イベント固有のバグ(旧 GroupedDragging segfault 等)を見逃す。
  2. カレント画像表示窓モデル(HDevelop): 画像表示窓は最低1つ常駐(最後は閉じられない)=「カレント窓」。変数/オブジェクトのダブルクリック表示はカレント窓へ行う(現状は new window/main が分離)。new_graphics_window/display_variable を current-window 概念で統一。
  3. 修正済(本セッション): ステップ実行が表示更新しないバグ(step_to 自己修復化)。既定レイアウト HDevelop 型。ボタンアイコン+ラベル。crash ログ常設。
  4. 検証規律: ユーザーに手動テストさせる前にサンドボックス(QTest+スクショ)で私が e2e 検証する(ユーザー明示指摘)。
    • 補足(HDevelop): 各 Graphics 窓にハンドル番号(open_window/dev_open_window の WindowHandle)。dev_* 系オペレータ(dev_display/dev_set_color/dev_set_draw/dev_clear_window 等)はカレント窓へ描画。dev_set_window(Handle) でカレント切替。→ Studio 実装: 各 graphics 窓に handle 番号 + カレント窓ポインタ + 変数ダブルクリック=カレント窓へ描画 + カレント切替 UI(窓クリック or ハンドル指定)。

実装記録: v18.8(2026-08-15, Opus5[1m]/ultracode)= 自律 UI 操作デバッグ・ハーネス + クラッシュ級バグ 3 件修正

★自律 UI 操作ハーネスを実装(tools/studio_ui_harness.py)。offscreen subprocess で Studio を起動し、実マウスイベント(QMouseEvent 直送=drag は buttons=LeftButton 保持)を全 QPushButton / 全 QAction / 全 dock ドラッグ / 変数リスト / 右クリックコンテキストメニューへ注入(P0–P9 の 183 ステップ)。設計:

★ハーネスが実イベント注入でしか出ない 3 クラッシュを自動検出→修正(全て studio.py、regression テスト付き tests/test_studio.py):

  1. [高] 3D surface ボタンで access violation(segfault)show_3d_surface(旧 737 行)の Q3DSurface() は OpenGL コンテキスト不在(offscreen / Remote Desktop / ソフトウェア GL)で native segfault、try/except は import 失敗しか捕捉せず。→ _opengl_available()(QOffscreenSurface+QOpenGLContext プローブ、offscreen は即 False)でゲート、open_3d は None 時に「3-D surface needs OpenGL」を flash。GL があれば動く / 無ければ無害に degrade / 決してクラッシュしない
  2. [高] update_actions が削除済みウィジェットで RuntimeErrorb_save(Save result)は image_panel(=プライマリ Graphics 窓)内にあり、窓破棄で削除されるが queued currentRowChangedupdate_actionssetEnabledRuntimeError: Internal C++ object already deleted。→ _enable(cond, *widgets) ヘルパで削除済みを skip(状態同期は生存分を継続)。
  3. [高] プライマリ Graphics 窓が閉じられ、常駐 view + グローバル操作ボタンが破棄(=下記 Codex #2「最後の窓は閉じられない常駐モデル欠如」の実クラッシュ)。MDI サブ窓の close(閉じるボタン / システムメニュー「Close」/ Ctrl+W)で image_panel ごと view/b_save が破棄。→ プライマリ サブ窓に close 拒否 event filter(_ResidentCloseGuard)+ detach_graphics はプライマリ(objectName == "graphics_primary")の detach を拒否。常駐カレント窓モデルの第一歩

検証 = ハーネス再走で 183 steps 全 OK・slot 例外 0・crash 0、プライマリ窓は全 10 フェーズで alive+in-MDI 維持(修正前は P2 の MDI「Close」で in-MDI=False→P9 で削除→クラッシュ)。studio テスト 69→72(detach テストを常駐仕様へ更新 + resident/update_actions/3D の 3 回帰追加)。dock ドラッグ(GroupedDragging 疑い)は全 25 パターンで crash せず(自動プロキシは通過。実 windowing-system の native drag とは差があるため実機確認は別途)。

操作方法の仕様・審議(2026-08-15, 外部 AI = Codex read-only、ユーザー指示「用途を考えながら批判をさせて」)

用途 = 「画像処理アルゴリズムを対話的に組み・パラメータを詰め・holdout 検証する」設計作業(HDevelop 経験者が同等の操作感を期待)。Codex に studio.py + 本 doc を読ませ、操作フローに限定して 12 件の code-backed 批判を取得(各件を私が一次コード検証。規律=鵜呑み禁止 [[feedback_external_ai_verify]])。採用した論点(★=次の実装対象):

次の実装順(deliberated): (P4-current)カレント窓モデル ← 常駐化済で土台あり・最大クラスタ(Codex #1–5)を一括で筋通し → (P2b’)op 別引数 UI → (step 連動)→(Program dirty 追跡)。Undo / holdout 経路はスコープ大ゆえユーザー確認後。

追記: カレント Graphics 窓モデル(P4-current)実装済(v18.8 本セッション)

追記: op 別引数 UI(P2b’、Codex #6)実装済

追記: 既定レイアウトを画像優先へ(ユーザー指針 2026-08-15)

ユーザー指針=「画像を一番大きく / 次にスクリプトコード / op選択・変数窓は縦小さめ・ほとんどドッキングせず必要時のみ表示」。

追記: 残 Codex 指摘の実装(ユーザー選択=4項目全部, 2026-08-15)