← Commit history

docs: 0.6.0 — launch LIVE-PROVEN attributable (shellExecute); sign-in wait is not a stall; identity at birth; Install/launch/sign-in guide; rows 2/39 updated

Drew Owens ·0934878847 ·1mo ago ·parent db13dd5
3 files changed +142−2
README.md+78
@@ -267,6 +267,84 @@ bytes on disk, and then asserts SOLIDWORKS is left with **exactly** the documents it started with. It never opens, saves or closes a document it did not create, and it never launches or stops SOLIDWORKS. +## Install, launch, sign-in++This install is **SOLIDWORKS Connected / Makers (3DEXPERIENCE)**, and the first+fact about it governs everything else: COM cannot launch it. `swx_status` reports+`canLaunchProgrammatically:false`. COM can attach to a session that is already+running, and that is all it can do — a property of the edition, not a limitation+of the bridge, so no argument or retry changes it.++What can start it is the shortcut the 3DEXPERIENCE Platform installed. `swx_start`+invokes that `.lnk`, which starts `CATSTART.exe`, which starts+`SWXDesktopLauncher.exe`, which starts `sldworks.exe`. The launcher chain exits+once `sldworks.exe` is up, so by the time SOLIDWORKS is usable there is no+launcher process left — nothing to notify on the way out, and nothing to reap.++**Attribution, measured on Drew's machine 2026-09-11.** The `shellExecute` route+invokes through `ShellExecuteExW` with `SEE_MASK_NOCLOSEPROCESS`, and the live run+got a real process handle back — CATSTART **pid 131272**, creation time+**1789148101** — and that chain reached the launcher's **`Run Begin`**. That handle+is the point. The bridge's law is **no handle, no kill**: it may only clean up a+chain the invoke itself handed back. On this machine that world is confirmed — the+route that launches is also the route that can be cleaned up.++### The 3DEXPERIENCE ID sign-in++A cold launch can stop at a 3DEXPERIENCE ID sign-in window. It is a **native+WebView2 window** — window class `DSYSysLoginPanelWebView2Class`, title+"Login | 3DEXPERIENCE ID | Dassault Systemes", owned by `SWXDesktopLauncher.exe`+in the bridge's own chain. UIA sees **no controls inside it**, so no automation can+read or fill it. That includes this bridge.++As of **0.6.0** the bridge recognises that window, reports stage `helperSignIn`,+**pauses every launch deadline** while it is on screen (a human deciding to type is+not a stalled launcher, and killing the chain under them would be wrong), never+kills or escalates the chain, and sends the user a toast saying sign-in is needed.+You type the password; the bridge never asks for, stores or transmits one. Tick+**Remember me** the first time so later launches do not stop here. How long this+stage lasts depends on when someone answers the window, not on any timer the bridge+owns.++### The launch stages++`swx_status.launch.stage` — and `swx_start`'s own `launch` block — reports exactly+one of these:++| `stage` | What to do |+|---|---|+| `invoked` | The route was just invoked. Poll `swx_status`. |+| `launcherStarted` | The chain is running but has not reached `Run Begin`. This is the stage that stalls; the bridge cleans up and tries the next route itself. Do not invoke the shortcut any other way. |+| `runBegin` | The chain is really building. Keep polling; `sldworks.exe` appears within seconds. |+| `helperSignIn` | The sign-in window is up. Only you can clear it — sign in on the desktop. |+| `sldworksUp` | The application exists; the COM server is not answering yet. Keep polling. |+| `attaching` | Polling for the COM server. Keep polling; do not launch again. |+| `attached` | COM is usable. The only success. |+| `stalled` | That route stalled and its chain was cleaned up. The bridge is trying the next route. Nothing to retry by hand. |+| `exhausted` | Every route was tried and none attached. Start SOLIDWORKS from the Start Menu or the Platform; an interactive launch works when this one does not. |++Three of those are the milestones that matter operationally: **`runBegin`** (the+chain is really building), **`sldworksUp`** (the application exists) and+**`attached`** (COM is usable — the only success). `stalled` and `exhausted` are the+two terminal failures.++`stillLaunching:true` means a launch this bridge started is still in flight.+Calling `swx_start` again does **not** start a second chain; it attaches to the one+already running. That is deliberate: four launcher chains once ended up on a user's+desktop because a caller retried.++### Quitting, and why it is close to a one-way door++`swx_stop` quits only a session with **zero documents open**, and `force` does not+waive that — `force` waives the unsaved question only. If documents are open, close+them, or drain leaked import conversion temporaries with `swx_close_import_temps`+first.++The reason the count is not negotiable is on the other side of the quit: on this+edition, relaunching takes 1-3 minutes and can stop at the sign-in window again,+which only a person at the keyboard can answer. Quitting is cheap; getting back is+not.+ ## Roadmap  - v0.5.9 (this): **the write gate's own unanswerable question.** The destination
SKILL.md+62
@@ -14,6 +14,68 @@ adom-bridge --ai-thread "<your thread>" swx_status '{}' adom-bridge --ai-thread "<your thread>" swx_bom '{"path":"C:\\designs\\gearbox.sldasm","format":"csv"}' ``` +## Install, launch, sign-in++- **This edition cannot be launched by COM, so do not try.** The install here is+  SOLIDWORKS Connected / Makers (3DEXPERIENCE), and `swx_status` reports+  `canLaunchProgrammatically:false`. COM can ATTACH to a session that is already+  running; it cannot create one. That is a property of the edition, not a+  limitation of the bridge, so there is no argument or retry that changes it.+- **The launch that works is the Platform's own shortcut.** `swx_start` invokes+  the 3DEXPERIENCE Platform `.lnk`, which starts `CATSTART.exe`, which starts+  `SWXDesktopLauncher.exe`, which starts `sldworks.exe`. The launcher chain then+  exits — once `sldworks.exe` is up there is no launcher process left to poll or+  to reap.+- **The `shellExecute` route hands back a real handle, proven live 2026-09-11.**+  It invokes through `ShellExecuteExW` with `SEE_MASK_NOCLOSEPROCESS`; the live+  run got a process handle back (CATSTART pid 131272, creation time 1789148101)+  and that chain reached the launcher's `Run Begin`. This matters because the+  bridge's law is **no handle, no kill**: it may only clean up a chain the invoke+  itself handed back. On this machine that world is confirmed.+- **`stage:"helperSignIn"` means a human has to type a password — you cannot.**+  A cold launch can stop at the 3DEXPERIENCE ID window: a NATIVE WebView2 window,+  class `DSYSysLoginPanelWebView2Class`, title+  "Login | 3DEXPERIENCE ID | Dassault Systemes", owned by `SWXDesktopLauncher.exe`+  in the bridge's own chain. UIA sees NO controls inside it, so nothing can read+  or fill it — this bridge included. As of 0.6.0 the bridge recognises the window,+  reports `helperSignIn`, PAUSES every launch deadline while it is on screen (a+  waiting human is not a stall), never kills or escalates the chain, and toasts+  the user that sign-in is needed. Your move is to keep polling and, if the user+  asks what to do, tell them to sign in and to tick **Remember me** once so later+  launches do not stop here. The bridge never asks for, stores or transmits a+  password.+- **How long `helperSignIn` lasts depends on the user answering the window**, not+  on any timer the bridge owns. Do not convert it into a failure.+- **Read `launch.stage` and act on it**, from `swx_status` or from `swx_start`:++  | `stage` | What to do |+  |---|---|+  | `invoked` | The route was just invoked. Poll `swx_status`. |+  | `launcherStarted` | Chain running, `Run Begin` not reached. This is the stage that stalls; the bridge cleans up and tries the next route itself. Do not invoke the shortcut any other way. |+  | `runBegin` | The chain is really building. Keep polling; `sldworks.exe` appears within seconds. |+  | `helperSignIn` | Only the user can clear it. Poll; tell them to look at their screen. |+  | `sldworksUp` | The application exists, COM does not answer yet. Keep polling. |+  | `attaching` | Polling for the COM server. Keep polling; do not launch again. |+  | `attached` | COM is usable. This is the only success — carry on. |+  | `stalled` | That route stalled and its chain was cleaned up. The bridge is trying the next route. Nothing for you to retry. |+  | `exhausted` | Every route was tried and none attached. ASK THE USER to start SOLIDWORKS from the Start Menu or the Platform. |++  The three milestones that matter operationally are **`runBegin`** (the chain is+  really building), **`sldworksUp`** (the application exists) and **`attached`**+  (COM is usable, and the only success).+- **`stillLaunching:true` means a launch this bridge started is still in flight.**+  Calling `swx_start` again does NOT start a second chain — it attaches to the one+  in flight. That is deliberate: four launcher chains once ended up on a user's+  desktop because a caller retried. Polling with `swx_start` is therefore safe,+  and a second invocation by any other route is not.+- **`swx_stop` quits ONLY a session with zero documents open, and `force` does not+  waive that** (`force` waives the UNSAVED question only). If documents are open,+  close them first, or drain leaked conversion temporaries with+  `swx_close_import_temps`.+- **Treat a quit as close to a one-way door.** On this edition relaunching after a+  quit takes 1-3 minutes and can stop at the sign-in window again, which only the+  user can answer. Do not quit to tidy up.+ ## Is it ready?  - `bridge_readiness` (ab-level, never spawns anything) answers "is SOLIDWORKS
docs/ECOSYSTEM-TABLE.md+2−2
@@ -67,7 +67,7 @@ templates**, alisamsam **22**. | # | Capability | Fusion bridge | **swx v0.3** | SolidPilot **(AGPL-3.0!)** | vespo92 (MIT) | bartels (MIT) | Schildkraut (MIT) | alisamsam (MIT) | |---:|---|---|---|---|---|---|---|---| | 1 | Session lifecycle — attach, stop, kill | ✓ | **✓ live** attach · stop: **unproven** — the one observed `ExitApp` "decline" had a dirty Part1 open (save-prompt stall, not a decline); no stop event at 0 docs is in the ledger. v1 also holds a COM ref while checking and gates on unsaved-count not open-count (docs/QUIT-INVESTIGATION.md); graceful-quit ladder = 0.5.0 work · kill: never (policy) | ✓ attach | ? | ✓ attach | ? | ✓ attach |-| 2 | Launch the CAD application (and install it) | ✓ launch + silent install | **✓ sanctioned 3DEXPERIENCE chain shipped 0.4.x** — attributable routes, Run-Begin stall detector, in-flight idempotence; **live gate pending** (bridge-context stall measured 6/7 on the old cmd route) | ✓ claims COM launch (refused on Connected) | ✗ | ✗ needs SW already open | ? | ✗ needs running instance |+| 2 | Launch the CAD application (and install it) | ✓ launch + silent install | **✓ LIVE-PROVEN 2026-09-11 — attributable.** `shellExecute` (ShellExecuteExW + SEE_MASK_NOCLOSEPROCESS) handed back a real handle for the Platform .lnk (CATSTART pid 131272) and that chain reached `Run Begin`; the old cmd-route stall is gone. Same run found the bridge killing its OWN chain while the user was at the 3DEXPERIENCE ID sign-in — a native WebView2 window with no UIA controls — because the sldworks deadline fired on a wait that was not a stall. **Fixed 0.6.0**: the sign-in window is recognised by class and owner pid, every deadline PAUSES while it is up, nothing is killed or escalated, the user is toasted, and a session that attaches after the sign-in is re-attributed (`attachedAfterSignIn`) instead of being recorded as somebody else's | ✓ claims COM launch (refused on Connected) | ✗ | ✗ needs SW already open | ? | ✗ needs running instance | | 3 | Requires an in-app add-in | yes (3 verbs to manage it) | **no — out-of-process COM** | no (C# COM server) | no | no | no | no | | 4 | Open a local file · disk discovery | ✓ open · ✗ discovery (cloud-native) | **✓ live** open · **✓** `find_files` | ✓ open · ✗ | ✓ (untested) | ✓ | ✓ | ✓ open · ✗ | | 5 | Create a new document | ✗ (docs arrive from cloud/import) | **✓ live** | ✓ part + assembly | ✓ (untested) | ✓ | ✓ | ✓ part + assembly |@@ -104,7 +104,7 @@ templates**, alisamsam **22**. | 36 | **Ownership persists across bridge/host restarts** (bridge-created docs stay closable without opt-in) | ✗ (no ownership model) | **✓ live 2026-09-08** — `owned-docs.json` keyed to the SOLIDWORKS process; proven create → host kill → close in default posture | ✗ | ✗ | ✗ | ✗ | ✗ | | 37 | **Honest UNKNOWN instead of a fabricated empty/zero** (doc list, counts, dialogs, interference) | **✓ LIVE 2026-09-09** — on a real 2144-document session `swx_docs` answers in 3.4 s with `count:2144, truncated:true`, a 10-doc sample (8 import temps) — after 0.5.4 wedged 30 s on the same session (fixed 0.5.5: bounded GetFirstDocument/GetNext walk, never GetDocuments above the cap; simulator now charges per-doc latency) | **⚠ 0.4.x-0.5.5, mock-proven; the ENUMERATION half FAILED LIVE** — `docs_enumeration_failed`, `Option` counts, `unsaved_unknown`, `count:null` semantics in hints; 29 adversary tests. **Live 2026-09-09: `swx_docs` still timed out at 30s and the com host was killed on a 2144-document session** — the degrade path called `GetDocuments` (one call, every handle) and then `GetPathName` on all 2144. `GetDocumentCount` answered in 0.7s. The mock's enumeration was instant, so this row was mock-proven and false live. **Fixed in 0.5.5** (walk `GetFirstDocument`/`GetNext` for the sample only, time-boxed; the drain walks a bounded window too) with the live session held in the suite via a per-document latency model — **re-proof on the live 2144-doc session pending** | ✗ | ✗ | ✗ | ✗ | ✗ | | 38 | **Hung / exhausted host detection, and BUSY vs DEAD** (Not Responding + real COM timeout; NewDocument-returns-nothing; CPU/memory delta over a sample) | ✗ | **✓ 0.5.1** evidence-based `host_app_hung` / `host_app_exhausted` + `verdict:"busy"\|"dead"\|"unknown"` from `cpuActiveSeconds`/`memoryDeltaMB` — measured live: 17.9 GB not-responding for ~5 min at ~70% of a core and it RECOVERED, so "not responding" now advises WAIT, not "end the task". One reading never says dead | ✗ | ✗ | ✗ | ✗ | ✗ |-| 39 | **Stalled-launcher recovery with attribution law** (kill only a chain proven ours by handle; never daemons, never sldworks) | ✗ | **✓ shipped 0.4.4**, 4 adversary rounds, **live gate pending** | ✗ | ✗ | ✗ | ✗ | ✗ |+| 39 | **Stalled-launcher recovery with attribution law** (kill only a chain proven ours by handle; never daemons, never sldworks) | ✗ | **✓ shipped 0.4.4**, 4 adversary rounds, **live-proven 2026-09-11** — the handle world is confirmed on this machine, and the one live defect was the opposite of an over-eager kill law: it killed a chain that was correctly WAITING (sign-in), fixed in 0.6.0. No daemon and no sldworks.exe has ever been touched | ✗ | ✗ | ✗ | ✗ | ✗ | | 40 | **Crash-reporter recovery** (click "Restart SOLIDWORKS Design" once, structured match, ledgered) | ✗ | **shipped, DISABLED by default** until the real control-tree reply is captured | ✗ | ✗ | ✗ | ✗ | ✗ | | 41 | **COM retry-on-reject** (busy host: RPC_E_CALL_REJECTED / RETRYLATER backoff on every call) | ? | **✓ live 0.3.3** — 50-read smoke gate, 0 under-reporting, 11 rejects absorbed | ✗ | ✗ | ✗ | ✗ | ✗ | | 42 | **Real-work proof** (multi-assembly build + BOM exported from the assembly, verified against a packet) | ✓ (electronics) | **✓ live** — NSF crate: 5 assemblies, 383 placements, 32-row BOM, 28/28 part numbers match | ✗ | ✗ | ✗ | ✗ | ✗ |