← Commit history

1.9.199: prove's package3d close routes through the guarded close (the last unguarded lose-changes-modal site, caught live on LM2937)

Colby Knox ·4949f49dee ·1mo ago ·parent f0b3b97
3 files changed +36−13
BRIDGE_VERSION+1−1
@@ -1 +1 @@-1.9.198\ No newline at end of file+1.9.199\ No newline at end of file
CHANGELOG.md+12
@@ -3,6 +3,18 @@ All notable changes to the Adom Bridge Fusion 360 bridge, newest first. Canonical: https://wiki.adom.inc/adom/fusion-bridge ยท GitHub backup: `adom-inc/fusion-bridge` +## 1.9.199 - 2026-08-24 (the prove 3D-frame close joins the guarded path)++- The lose-changes modal had one more way onto the user's screen: prove's package3d frame+  closed its fresh-from-cloud f3d doc through an INLINE hasActiveJobs wait + close, and that+  query can read False while the Hub sync of the just-minted package still runs (caught live+  on an LM2937 run, after 1.9.198 fixed the hygiene path). The frame's close now routes+  through _close_bridge_doc_verified: jobs ask retried, and the modal answered No (upload+  preserved) + close retried if it rises anyway. The inline close stays only as the fallback+  when the active document's name cannot be read.+- Verified live: fresh mint (bind 29.5s, prove 41.3s, proven 4/4) with dialog sampling at 4s+  cadence, zero modal sightings.+ ## 1.9.198 - 2026-08-24 (chain hygiene: no phantom closes, no lose-changes modal)  - **The Untitled sweep recognizes Fusion's resting state.** Fusion always keeps one document
server.py+23−12
@@ -10420,20 +10420,31 @@ def _handle_prove_library(fusion_info: dict, args: dict) -> dict:                 e3["bodiesUnverified"] = True             evidence.append(e3)             # HAND THE APP BACK (deterministic-close rule): the f3d doc is render scratch-            # here; close it verified so stage 4 is not stranded in the wrong workspace.-            # Same upload gate as _close_bridge_doc_verified: closing over an in-flight-            # Hub upload raises the lose-changes modal (John saw it live, 2026-08-21).+            # here. This used an INLINE hasActiveJobs wait + close, which is exactly the+            # gate that lied on a fresh box (the query can read False while the Hub sync+            # of the just-minted package still runs) - the lose-changes modal reached the+            # user's screen from THIS close on an LM2937 run (2026-08-24). Route through+            # _close_bridge_doc_verified, which retries the jobs ask AND answers the+            # modal (No, upload preserved) if it rises anyway.             try:-                _proxy_to_addin("run_modeling_script",-                                {"script": "import adsk.core, time\n"-                                           "app=adsk.core.Application.get()\n"-                                           "for _ in range(24):\n"-                                           "    if not app.hasActiveJobs: break\n"-                                           "    time.sleep(5)\n"-                                           "app.activeDocument.close(False)\nresult={}"},-                                timeout=140)+                _di3 = _proxy_to_addin("document_info", {}, timeout=8)+                _n3 = str(((_di3.get("data") or {}).get("activeDocument")) or "")+                if not _n3:+                    raise Exception("no active doc name")+                _note_bridge_doc(_n3)+                _close_bridge_doc_verified(_n3, timeout_s=30)             except Exception:-                pass+                try:+                    _proxy_to_addin("run_modeling_script",+                                    {"script": "import adsk.core, time\n"+                                               "app=adsk.core.Application.get()\n"+                                               "for _ in range(24):\n"+                                               "    if not app.hasActiveJobs: break\n"+                                               "    time.sleep(5)\n"+                                               "app.activeDocument.close(False)\nresult={}"},+                                    timeout=140)+                except Exception:+                    pass         else:             evidence.append({"step": "package3d", "view": "3d-editor", "ok": False,                              "error": "Could not open the bound f3d (%s): %s" % (