From 498e92ee358aafd8e5254ccd49a3c86a5574caf8 Mon Sep 17 00:00:00 2001 From: Tommaso Bianchi Date: Sun, 6 Sep 2026 12:22:02 +0200 Subject: [PATCH] The gate covers the rounded rectangle, and stops tripping over the plug-in modal MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two harness fixes, both paid for by hours of chasing product bugs that were not there. ROUNDED RECTANGLE. It is the shape the user reported and the gate could not reach it: the rectangle family binds R to CornerRect and leaves the other modes in the toolbar flyout, so the three-step Width -> Height -> Radius chain was never exercised. rung_rounded_rect() arms it over MCP the way the offer menu does. The verb id is the OFFER id `sk_rect_rounded` — `design_rect_rounded` is the ACTION name, run_verb throws on it, and the tool silently stays Select; a run that misses that draws nothing and still reaches its assertions, so the rung arms AND verifies. THE NETWORK PLUGIN MODAL. GUI_App::post_init() re-raises "Bambu Network Plug-in Required" from an IDLE event, after any startup sweep has closed it, and ShowModal() runs a nested event loop: the app is alive, its window is on screen, and the MCP socket answers nothing. That is indistinguishable from a hang and was investigated as one, with gdb, twice — the attached stack finally read ShowModal <- show_network_plugin_download_dialog <- post_init. Seeding `installed_networking` false stops the whole networking path, so the dialog never exists to be swept. Also: check() returns its verdict, so a rung can abandon itself when a precondition fails instead of asserting into a dead end. 38 checks hold on behemoth against e5659e0f0f. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_011FbJKJAJxxkhDTs9XdZzKA --- scripts/CAD/check-gui-click-edit.py | 39 +++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/scripts/CAD/check-gui-click-edit.py b/scripts/CAD/check-gui-click-edit.py index be70dfa0d8..9f66d3c8bc 100755 --- a/scripts/CAD/check-gui-click-edit.py +++ b/scripts/CAD/check-gui-click-edit.py @@ -147,6 +147,14 @@ def seed_datadir(datadir): # ~90% case expects. A ladder whose result depends on the developer's own preferences is not # a gate. app["auto_close_sketch_loops"] = True + # SILENCE THE NETWORK PLUGIN PROMPT. Without this, GUI_App::post_init() re-raises "Bambu + # Network Plug-in Required" from an IDLE event — after any modal sweep this driver does at + # startup — and ShowModal() then runs a nested event loop. The app is alive, its window is + # there, and the MCP socket answers nothing: indistinguishable from a hang, and it was + # investigated as one, with gdb, twice. `installed_networking` false stops the whole + # networking-plugin path, so m_networking_need_update is never set and the dialog never + # exists to be swept. + app["installed_networking"] = False with open(conf, "w") as f: json.dump(data, f, indent=1) for sub in ("user", "system", "presets", "vendor"): @@ -368,6 +376,7 @@ def parse(line): # ---------------------------------------------------------------- grading def check(cond, what): + """Returns the verdict so a caller can abandon a rung whose precondition failed.""" global _fail, _checks _checks += 1 if cond: @@ -375,6 +384,7 @@ def check(cond, what): else: print(f" FAIL {what}", file=sys.stderr) _fail += 1 + return bool(cond) def type_into_open_field(value, mark): @@ -548,6 +558,34 @@ def rung_tool(k, name, clicks, values): mark = type_into_open_field(v, mark) +def rung_rounded_rect(): + """The shape the user actually reported: a ROUNDED rectangle, Width -> Height -> Radius. + + It has no keyboard shortcut — the rectangle family binds R to CornerRect and leaves the other + modes in the toolbar flyout — so TOOLS above cannot reach it and the whole three-step chain + went untested. `run_verb` arms it the way the offer menu does. + + NOTE the id: the OFFER verb is `sk_rect_rounded`; `design_rect_rounded` is the ACTION name and + run_verb throws on it, leaving the tool as Select. A run that misses that draws nothing and + still reaches its assertions, so arm-and-verify rather than arm-and-hope. + """ + print(" Rounded rectangle") + key("Escape", 0.6) + tool = None + for _ in range(8): + try_call("run_verb", verb="sk_rect_rounded") + time.sleep(0.8) + tool = (try_call("sketch_describe") or {}).get("tool") + if tool == "rect_rounded": + break + if not check(tool == "rect_rounded", f"the rounded-rectangle tool armed (tool={tool!r})"): + return + mark = trace_mark() + click(1030, 540); click(1330, 700); click(1300, 660) # corners, then the radius point + for v in (63, 41, 7): + mark = type_into_open_field(v, mark) + + def rung_label_click(): """The user's own report: click an existing dimension label and type a new value into it. @@ -600,6 +638,7 @@ def main(): enter_sketch() for (k, name, clicks, values) in TOOLS: rung_tool(k, name, clicks, values) + rung_rounded_rect() rung_label_click() print() if _fail: