← Commit history

Publish 1.9.42

John Lauer ·b2d603a845 ·1mo ago ·parent 5d0bce4
62 files changed +5963−384
CHANGELOG_ARCHIVE.md+3−3CLAUDE.md+7−7CONTRIBUTING.md+13−13CREATING_BASIC_PARTS_LIBRARIES.md+1−1MAKING_LIBRARIES.md+10−10PUBLISHING.md+11−11README_VERBS.md+12−12SKILL.md+262−82VERBS.md+48−48dashboard/Cargo.lock+142docs/3d-viewer-and-export.md+3−3docs/aps-cloud-search.md+5−5docs/board-layout-2d.md+10−10docs/electronics-libraries.md+6−6docs/fusion-mcp-server.md+1−1docs/fusion-preferences.md+4−4docs/mechanical-bom.md+6−6docs/schematics.md+5−5docs/sign-in-and-updates.md+8−8examples/ADS8588SIPM.fusion.lbr+70−70package.json+1−1page.json+7−10screenshots/lib2-12part-library.pngscreenshots/lib2-atsamd-chip.pngscreenshots/lib2-component.pngscreenshots/lib2-esp32-chip.pngscreenshots/lib2-esp32-footprint.pngscreenshots/lib2-footprint-editor.pngscreenshots/lib2-symbol.pngscreenshots/lib3-138-overview.pngscreenshots/lib3-cap-3d.pngscreenshots/lib3-resistor-3d.pngskills/fusion-aps-search/SKILL.md+1−1skills/fusion-aps-signin/SKILL.md+7−7skills/fusion-build-parts-library/SKILL.md+1−1skills/fusion-driving/SKILL.md+1−1skills/fusion-eagle-commands/SKILL.md+4−4skills/fusion-electronics/SKILL.md+3−3skills/fusion-file-search/SKILL.md+7−7skills/fusion-libraries/LIBRARY_FINDINGS.md+3−3skills/fusion-libraries/MAKING_LIBRARIES.md+15−15skills/fusion-mcp-and-preferences/SKILL.md+18−17skills/fusion-multipart-libraries/CREATING_BASIC_PARTS_LIBRARIES.md+1−1skills/fusion-multipart-libraries/SKILL.md+1−1skills/fusion-multiprofile-signin/SKILL.md+3−3skills/fusion-onboarding/SKILL.md+1−1skills/fusion-web-export/SKILL.md+3−3tests/reports/verb-test-2026-08-14_1150.json+395tests/reports/verb-test-2026-08-14_1157.json+395tests/reports/verb-test-2026-08-14_1209.json+395tests/reports/verb-test-2026-08-14_1210.json+21tests/reports/verb-test-2026-08-14_1849.json+834tests/reports/verb-test-2026-08-14_1915.json+772tests/reports/verb-test-2026-08-14_1920.json+37tests/reports/verb-test-2026-08-14_1921.json+69tests/reports/verb-test-2026-08-14_1943.json+56tests/reports/verb-test-2026-08-14_1950.json+77tests/reports/verb-test-2026-08-14_1959.json+78tests/reports/verb-test-2026-08-14_2016.json+772tests/reports/verb-test-2026-08-14_2028.json+547tests/reports/verb-test-2026-08-15_0201.json+773tests/reports/verb-test-2026-08-15_0204.json+38
CHANGELOG_ARCHIVE.md+3−3
@@ -1,7 +1,7 @@ # Changelog archive (1.6.37 and earlier) -Older history for the Adom Desktop Fusion 360 bridge. Recent versions are in the main-[CHANGELOG.md](https://wiki.adom.inc/adom/adom-desktop-fusion-bridge). Newest-first.+Older history for the Adom Bridge Fusion 360 bridge. Recent versions are in the main+[CHANGELOG.md](https://wiki.adom.inc/adom/fusion-bridge). Newest-first. ## 1.6.37 - 2026-07-06  - **`fusion_readiness` no longer lies `ready:true` for a stuck/dead Fusion** (John caught it). It only@@ -504,7 +504,7 @@ Older history for the Adom Desktop Fusion 360 bridge. Recent versions are in the  ## 1.5.8 - 2026-06-28 -- `bridge.json`: added `updateManifestUrl` (+ `healthEndpoint`) so Adom Desktop auto-update works (it+- `bridge.json`: added `updateManifestUrl` (+ `healthEndpoint`) so Adom Bridge auto-update works (it   was null, which broke auto-update - discussion #31).  ## 1.5.7 and earlier
CLAUDE.md+7−7
@@ -1,20 +1,20 @@-# CLAUDE.md - adom-desktop-fusion-bridge (READ THIS, it is YOUR project)+# CLAUDE.md - fusion-bridge (READ THIS, it is YOUR project) -This repo is **the Adom Desktop Fusion 360 bridge**. If you are an Adom AI touching anything+This repo is **the Adom Bridge Fusion 360 bridge**. If you are an Adom AI touching anything Fusion, **you own and maintain this code.** You write it, version it, publish it, and reinstall it. Stop treating bridge problems as someone else's. (This file exists because an AI repeatedly forgot all of this and filed its own bridge bugs as "adom-desktop" requests. Don't.) -## You vs adom-desktop (AD) core - the boundary+## You vs adom-bridge (AD) core - the boundary -- **AD core owns:** the `adom-desktop` CLI, the relay / command passthrough, bridge lifecycle+- **AD core owns:** the `adom-bridge` CLI, the relay / command passthrough, bridge lifecycle   (`bridge_install` / streaming the bridge from the wiki into `…\bridges-cache\fusion360`), and the   core `desktop_*` verbs. That's it. AD just **hosts and loads** this bridge. - **YOU (this bridge) own:** every `fusion_*` verb and its response `_hint`s, the **APS** integration   (auth/config/quota - see below), the **Fusion add-in** code AND **deploying it into Fusion**, the   `SKILL.md` + bundled `skills/`, and the edit → publish → reinstall loop. - So: a `fusion_*` verb behaves wrong, a hint is missing, APS misbehaves, the add-in is stale → it's-  **your code**, fix it here and republish. It is NOT an adom-desktop request.+  **your code**, fix it here and republish. It is NOT an adom-bridge request.  ## Map of what you manage @@ -67,7 +67,7 @@ fusion_start); runOnStartup does the rest. The exact, watched-it-happen release      handled by AD; NEVER bootstrap/download your own Python. Check runtime state anytime with AD's      `runtimes` verb (`state ∈ absent|installing|ready|failed`). But a bare `python` you invoke      yourself via `shell_execute` still won't resolve, so the file-copy deploy below remains the way.)-     `cmd /c copy` and `robocopy` also fight you on the spaces in `Adom Desktop` / `Autodesk+     `cmd /c copy` and `robocopy` also fight you on the spaces in `Adom Bridge` / `Autodesk      Fusion 360` (robocopy exit 16). **The reliable deploy that needs NO shell + NO python:** copy the      changed add-in file(s) with the BRIDGE's own file verbs - `read_file {path:<cache>/addin/AdomBridge/      commands/<f>.py}` then `write_file {path:<Roaming>/.../AddIns/AdomBridge/commands/<f>.py, content}`@@ -92,7 +92,7 @@ Memorize:  See `skills/fusion-bridge-dev/SKILL.md` for the full ritual. Short form: edit here → bump `BRIDGE_VERSION` + `bridge.json` together → `git commit` → **push GitHub backup** + **publish to the-wiki** (`wiki.adom.inc/adom/adom-desktop-fusion-bridge`, the canonical repo) → `bridge_install` on the+wiki** (`wiki.adom.inc/adom/fusion-bridge`, the canonical repo) → `bridge_install` on the box → reap the old bridge instance + restart so the new code (and synced add-in) loads → anon-verify. Wiki = canonical, GitHub = backup, keep in lockstep. 
CONTRIBUTING.md+13−13
@@ -1,6 +1,6 @@ # Contributing -This bridge is part of the [Adom Desktop](https://github.com/adom-inc/adom-desktop) bridge ecosystem. It lives in its own repo (split from the main monorepo in 2026-05) specifically so the community can fork and improve it without coordinating with Adom Desktop's release cycle.+This bridge is part of the [Adom Bridge](https://github.com/adom-inc/adom-desktop) bridge ecosystem. It lives in its own repo (split from the main monorepo in 2026-05) specifically so the community can fork and improve it without coordinating with Adom Bridge's release cycle.  ## Two-way street @@ -9,10 +9,10 @@ This bridge is part of the [Adom Desktop](https://github.com/adom-inc/adom-deskt  ## How shipping works -1. **Develop locally.** Clone this repo, edit, test. The bridge runs alongside an installed [Adom Desktop](https://github.com/adom-inc/adom-desktop); use `adom-desktop bridge_install` with a local `file://` manifest URL to test your changes against a real GUI.+1. **Develop locally.** Clone this repo, edit, test. The bridge runs alongside an installed [Adom Bridge](https://github.com/adom-inc/adom-desktop); use `adom-bridge bridge_install` with a local `file://` manifest URL to test your changes against a real GUI. 2. **Open a PR** against `main`. The CI in `.github/workflows/validate.yml` checks that `bridge.json` is valid + verb prefixes look right + the BRIDGE_VERSION was bumped vs. main. 3. **Maintainer reviews + merges.** No squash-merge — we preserve your authored commits.-4. **Maintainer ships.** A maintainer bumps `BRIDGE_VERSION` + `bridge.json` together, builds the release zip, and publishes it to the canonical page, [wiki.adom.inc/adom/adom-desktop-fusion-bridge](https://wiki.adom.inc/adom/adom-desktop-fusion-bridge): repo files (manifest, `bridge.json`, `BRIDGE_VERSION`, sources) via the page files API, and the binary zip via `adom-wiki release upload adom/adom-desktop-fusion-bridge <ver> <zip>`. See PUBLISHING.md for the exact ritual. Anyone running Adom Desktop v1.7.19+ picks it up within 4 hours or on the next `adom-desktop refresh_bridges`.+4. **Maintainer ships.** A maintainer bumps `BRIDGE_VERSION` + `bridge.json` together, builds the release zip, and publishes it to the canonical page, [wiki.adom.inc/adom/fusion-bridge](https://wiki.adom.inc/adom/fusion-bridge): repo files (manifest, `bridge.json`, `BRIDGE_VERSION`, sources) via the page files API, and the binary zip via `adom-wiki release upload adom/fusion-bridge <ver> <zip>`. See PUBLISHING.md for the exact ritual. Anyone running Adom Bridge v1.7.19+ picks it up within 4 hours or on the next `adom-bridge refresh_bridges`.  We DON'T auto-ship from GitHub Actions today. Reason: publishing needs an Adom Wiki API token, and we keep that secret on maintainer machines rather than in GH Actions secrets. The community trust model around auto-publishing community PRs to a shared wiki space is part of a separate effort ("Chunk D" in adom-desktop's TODO.md) — comment on an issue if you want to help design that. @@ -23,15 +23,15 @@ See [the SDK guide on the Adom Wiki](https://wiki.adom.inc/adom/adom-desktop-bri - `manifest_version: 1` - `name` — must match the directory name in adom-desktop's `plugins/` (when bundled) - `version` — semver, bumped on every PR that ships-- `spawn.port: 0` — **always use 0** as of Adom Desktop v1.8.31+. Adom Desktop picks an OS-assigned ephemeral port and passes it via `--port <N>` to your bridge process. Don't hardcode.-- `spawn.healthEndpoint: "/status"` — path-only (recommended). Adom Desktop builds the URL using the runtime port.+- `spawn.port: 0` — **always use 0** as of Adom Bridge v1.8.31+. Adom Bridge picks an OS-assigned ephemeral port and passes it via `--port <N>` to your bridge process. Don't hardcode.+- `spawn.healthEndpoint: "/status"` — path-only (recommended). Adom Bridge builds the URL using the runtime port. - `verbPrefixes: ["<name>_"]` — the CLI verb prefixes this bridge owns.  ## Versioning  - **Patch** (`0.8.3 → 0.8.4`): bug fixes, hardening, no schema or behavior changes. - **Minor** (`0.8 → 0.9`): new verbs, new optional manifest fields, backward-compatible behavior changes.-- **Major** (`0.x → 1.0`, `1.x → 2.0`): breaking changes to verb shapes or removal of verbs. Coordinate with adom-desktop maintainers before submitting — we may need to wait for a desktop-app release that handles both versions.+- **Major** (`0.x → 1.0`, `1.x → 2.0`): breaking changes to verb shapes or removal of verbs. Coordinate with adom-bridge maintainers before submitting — we may need to wait for a desktop-app release that handles both versions.  Bump `BRIDGE_VERSION` AND `bridge.json`'s `"version"` field in the same commit — they must match. @@ -43,28 +43,28 @@ git clone https://github.com/adom-inc/adom-bridge-<NAME>.git cd adom-bridge-<NAME>  # 2. Install adom-desktop, then point it at this local manifest:-adom-desktop bridge_install '{"manifestUrl":"file:///path/to/adom-bridge-<NAME>/bridge.json"}'+adom-bridge bridge_install '{"manifestUrl":"file:///path/to/adom-bridge-<NAME>/bridge.json"}'  # Note: file:// works only when manifestUrl is parsed by adom-desktop's CLI on the # same machine that owns the bridge files. For Docker callers, push to a wiki staging # area and use the wiki URL.  # 3. Run any verb the bridge defines:-adom-desktop <name>_<verb> '{"...":"..."}'+adom-bridge <name>_<verb> '{"...":"..."}'  # 4. Run the SDK demo to verify install/list/invoke/uninstall lifecycle:-bash scripts/demo-thirdparty-bridge.sh  # in adom-desktop repo+bash scripts/demo-thirdparty-bridge.sh  # in adom-bridge repo ```  ## Why this bridge lives in its own repo -When adom-desktop was a monorepo, all bridges shipped on adom-desktop's NSIS release cycle — meaning a community contributor couldn't release a KiCad fix without waiting for an adom-desktop maintainer to cut a new desktop installer. As of 2026-05 the bridges live in independent repos so:+When adom-bridge was a monorepo, all bridges shipped on adom-desktop's NSIS release cycle — meaning a community contributor couldn't release a KiCad fix without waiting for an adom-bridge maintainer to cut a new desktop installer. As of 2026-05 the bridges live in independent repos so:  - Community can release at their own cadence-- Adom Desktop's installer ships a "known-good" snapshot but auto-updates from the wiki for newer versions-- A maintainer outside Adom Industries can take over a bridge (e.g. a KiCad 11 expert maintains the KiCad bridge) without commit access to adom-desktop itself+- Adom Bridge's installer ships a "known-good" snapshot but auto-updates from the wiki for newer versions+- A maintainer outside Adom Industries can take over a bridge (e.g. a KiCad 11 expert maintains the KiCad bridge) without commit access to adom-bridge itself -See [adom-desktop TODO.md → Chunks C/D](https://github.com/adom-inc/adom-desktop/blob/main/TODO.md) for the broader design.+See [adom-bridge TODO.md → Chunks C/D](https://github.com/adom-inc/adom-desktop/blob/main/TODO.md) for the broader design.  ## Code of conduct 
CREATING_BASIC_PARTS_LIBRARIES.md+1−1
@@ -59,7 +59,7 @@ symbol body.** Not optional. A symbol that is just pins-and-a-box is a FAIL. | **adom-symbol** | builds + renders the schematic symbol AND the **3D-outline SVG** that becomes the symbol-art | `adom-symbol serve` (live app) + `adom-symbol ui ...` to drive it; `render` / `embed` | | **adom-footprint** | builds + renders the footprint (`.kicad_mod`) with layer / paste-dot views | `adom-footprint serve` + `ui`; `embed` | | **adom-lbr** | assembles the EAGLE `.lbr` (symbol + footprint + deviceset), embeds the symbol-art, writes the 3D sidecar | `adom-lbr generate ...`; `adom-lbr serve --file X.lbr` (symbol \| footprint \| 3D + pin-map viewer) |-| **adom-desktop-fusion-bridge** (this repo) | opens the `.lbr` in Fusion and attaches the 3D | `fusion_open_lbr`, `fusion_attach_3d_package` |+| **fusion-bridge** (this repo) | opens the `.lbr` in Fusion and attaches the 3D | `fusion_open_lbr`, `fusion_attach_3d_package` | | **the Adom Basic Parts wiki** (`adom/basic-parts-library`) | the canonical catalog: 79 resistors, 40 MLCCs, 6 inductors, 11 LEDs, ferrite beads | open the page in a pup tab (it has a fun interactive viewer) |  ## Build recipe (per part)
MAKING_LIBRARIES.md+10−10
@@ -14,9 +14,9 @@ source view (symbol, the 4-sided footprint, and the 3D), the library opens in Fu the cloud and reopened so the 3D binds onto the deviceset - a complete library: symbol, footprint, 3D, and deviceset. Live screen capture (WGC + the adom-lbr pup viewer), not stitched stills. -<video controls width="100%" src="https://wiki.adom.inc/api/v1/pages/adom-desktop-fusion-bridge/files/library-3d-demo.mp4"></video>+<video controls width="100%" src="https://wiki.adom.inc/api/v1/pages/fusion-bridge/files/library-3d-demo.mp4"></video> -[Watch / download the demo video](https://wiki.adom.inc/api/v1/pages/adom-desktop-fusion-bridge/files/library-3d-demo.mp4)+[Watch / download the demo video](https://wiki.adom.inc/api/v1/pages/fusion-bridge/files/library-3d-demo.mp4)  ## The pipeline @@ -47,10 +47,10 @@ push verb**, so stage the file first, then open the Windows path. # serve from the container cd <dir-with-lbr> && python3 -m http.server 8931 # download onto Windows (build the JSON in Python; Windows paths need \\ )-adom-desktop shell_execute '{"command":"powershell -NoProfile -Command \"Invoke-WebRequest -Uri https://<workspace>.adom.cloud/proxy/8931/NAME.lbr -OutFile C:\\Users\\<user>\\adom-lib\\NAME.lbr\""}'+adom-bridge shell_execute '{"command":"powershell -NoProfile -Command \"Invoke-WebRequest -Uri https://<workspace>.adom.cloud/proxy/8931/NAME.lbr -OutFile C:\\Users\\<user>\\adom-lib\\NAME.lbr\""}' # open it-adom-desktop fusion_open_lbr '{"filePath":"C:/Users/<user>/adom-lib/NAME.lbr","verify":true}'-adom-desktop fusion_get_app_state '{}'   # expect activeWorkspace "Electronics Library", isElectronics true+adom-bridge fusion_open_lbr '{"filePath":"C:/Users/<user>/adom-lib/NAME.lbr","verify":true}'+adom-bridge fusion_get_app_state '{}'   # expect activeWorkspace "Electronics Library", isElectronics true ```  The library loads with symbol + footprint + deviceset. The 3D package is a **placeholder** (the Content@@ -65,10 +65,10 @@ Fusion does NOT embed the STEP in the `.lbr`. A package references its 3D model first. Stage the STEP to Windows (same as step 1), then upload it:  ```bash-adom-desktop fusion_aps_browse '{}'                                   # find hub + project-adom-desktop fusion_aps_browse '{"projectId":"<proj>"}'               # find the root folder-adom-desktop fusion_aps_create_folder '{"projectId":"<proj>","parentFolderId":"<root>","name":"Electronics 3D"}'-adom-desktop fusion_aps_upload '{"projectId":"<proj>","folderId":"<folder>","localPath":"C:/Users/<user>/adom-lib/NAME.step","fileName":"NAME-3D.step"}'+adom-bridge fusion_aps_browse '{}'                                   # find hub + project+adom-bridge fusion_aps_browse '{"projectId":"<proj>"}'               # find the root folder+adom-bridge fusion_aps_create_folder '{"projectId":"<proj>","parentFolderId":"<root>","name":"Electronics 3D"}'+adom-bridge fusion_aps_upload '{"projectId":"<proj>","folderId":"<folder>","localPath":"C:/Users/<user>/adom-lib/NAME.step","fileName":"NAME-3D.step"}' # -> { "itemUrn": "urn:adsk.wipprod:dm.lineage:...", "bytes": ... } ``` @@ -81,7 +81,7 @@ and returned a real URN. (`Electron.getCloudPathFromUrn` confirms the 3D package Fusion exposes a scriptable entry point:  ```bash-adom-desktop fusion_execute_text_command '{"command":"Electron.Create3DPackage C:/Users/<user>/adom-lib/NAME.lbr"}'+adom-bridge fusion_execute_text_command '{"command":"Electron.Create3DPackage C:/Users/<user>/adom-lib/NAME.lbr"}' ```  This opens the **3D PACKAGE Generator**: a Design-workspace authoring document with the footprint
PUBLISHING.md+11−11
@@ -1,17 +1,17 @@ # Building, publishing + forking this bridge -How to build the Adom Desktop Fusion 360 bridge, publish a new version, and (for the community)-fork it, test your fork in Adom Desktop, and open a pull request back. Written from the real+How to build the Adom Bridge Fusion 360 bridge, publish a new version, and (for the community)+fork it, test your fork in Adom Bridge, and open a pull request back. Written from the real publish flow - every pitfall here was hit live, so you don't have to re-learn them.  ## The big picture  This bridge is open source. You can't publish to the canonical wiki page-(`wiki.adom.inc/adom/adom-desktop-fusion-bridge`) - it's owned by `adom`. The community flow is:+(`wiki.adom.inc/adom/fusion-bridge`) - it's owned by `adom`. The community flow is:  ``` fork the page  ->  edit code  ->  bump version  ->  build zip  ->  publish (RELEASE)  ->-  bridge_install YOUR manifest into Adom Desktop  ->  test live  ->  open a PR back to adom+  bridge_install YOUR manifest into Adom Bridge  ->  test live  ->  open a PR back to adom ```  ## The wiki has TWO storage layers - put each artifact in the right one@@ -100,10 +100,10 @@ adom-wiki repo push <org>/<slug> --files adom-bridge-fusion-manifest.json BRIDGE > **PITFALL #2: `sha256`/`size` MUST match the served asset**, or `bridge_install` rejects it. > Use the values from the `release upload` JSON, and re-download the URL to confirm before installing. -## Step 5 - install into Adom Desktop + test+## Step 5 - install into Adom Bridge + test  ```bash-adom-desktop bridge_install '{"manifestUrl":"https://wiki.adom.inc/api/v1/pages/<slug>/files/adom-bridge-fusion-manifest.json","force":true}'+adom-bridge bridge_install '{"manifestUrl":"https://wiki.adom.inc/api/v1/pages/<slug>/files/adom-bridge-fusion-manifest.json","force":true}' ```  - **Server-only change** (`server.py` / `describe.py` / `handlers/`): that's it. AD reaps + respawns@@ -118,17 +118,17 @@ adom-desktop bridge_install '{"manifestUrl":"https://wiki.adom.inc/api/v1/pages/ > **PITFALL #3:** bumping `BRIDGE_VERSION` does NOT mean the running add-in changed - the version marker > moves independently of the Roaming sync. Always hash-verify add-in files. -After install, the Adom Desktop **BRIDGES** panel shows the bridge with the new version + `CACHED`+After install, the Adom Bridge **BRIDGES** panel shows the bridge with the new version + `CACHED` (here `v1.5.7`). That card is your confirmation the install landed: -![Adom Desktop BRIDGES panel showing the Fusion 360 Bridge, CACHED, PYTHON, v1.5.7](pub-bridge-list.png)+![Adom Bridge BRIDGES panel showing the Fusion 360 Bridge, CACHED, PYTHON, v1.5.7](pub-bridge-list.png)  ## Forking + pull request (community)  ```bash adom-wiki repo fork <org>/<slug>            # fork the page under your own owner # ...edit, bump version, build zip, release upload to YOUR fork, point the manifest at YOUR release...-adom-desktop bridge_install '{"manifestUrl":".../<your-fork-slug>/.../manifest.json","force":true}'   # test your fork live+adom-bridge bridge_install '{"manifestUrl":".../<your-fork-slug>/.../manifest.json","force":true}'   # test your fork live adom-wiki pr create <org>/<slug> ...        # PR your changes back to the canonical page ``` @@ -155,10 +155,10 @@ card read like a README (done it, got told off): Correct `description` for any bridge is ~2 sentences, no feature list:  > "Installs this bridge's skills into your container so your AI knows how to drive the bridge. The-> bridge runtime itself is loaded by Adom Desktop from the release zip."+> bridge runtime itself is loaded by Adom Bridge from the release zip."  That sentence also does real work: it tells users the package is **not** the bridge. See-adom/adom-desktop issues #20 and #21 for the SDK-wide asks (state the pkg-vs-runtime split on every+adom/adom-bridge issues #20 and #21 for the SDK-wide asks (state the pkg-vs-runtime split on every bridge page; lint release/pkg payloads for media bloat).  ## Pitfall checklist (the short version)
README_VERBS.md+12−12
@@ -1,6 +1,6 @@ # Fusion Bridge - Verb Reference -Every verb the Adom Desktop Fusion 360 Bridge exposes, by category, with what it does, its arguments, and an example call. Invoke any verb as `adom-desktop <verb> '<json-args>'` (Adom Desktop proxies the `fusion_*` prefix to the bridge).+Every verb the Adom Bridge Fusion 360 Bridge exposes, by category, with what it does, its arguments, and an example call. Invoke any verb as `adom-bridge <verb> '<json-args>'` (Adom Bridge proxies the `fusion_*` prefix to the bridge).  Back to the [main README](README.md). @@ -66,7 +66,7 @@ First-class Fusion 360 startup. Discovers Fusion360.exe via glob (so version-ind **Args:** `dismissBlockingDialogs` (optional bool (default true) - auto-clear the 'What do you want to design?' picker, error ), `timeoutSeconds` (optional int (default 120) - total wait for add-in + dialog dismissal)  ```-adom-desktop fusion_start '{}'+adom-bridge fusion_start '{}' -> { "addinReady": true, "status": "ok" } ``` @@ -185,7 +185,7 @@ Get structured board data: components, nets, traces, DRC violations _Prerequisite: Board open in PCB Editor_  ```-adom-desktop fusion_board_info '{}'+adom-bridge fusion_board_info '{}' -> { "rawXml": "<pcb>... copper / arcs / lines geometry ...</pcb>" } ``` @@ -260,7 +260,7 @@ Open .lbr library in Electronics Library editor **Args:** `filePath` (required)  ```-adom-desktop fusion_open_lbr '{"filePath":"C:/.../nRF52840-CKAA.lbr"}'+adom-bridge fusion_open_lbr '{"filePath":"C:/.../nRF52840-CKAA.lbr"}' -> { "success": true, "postOpenScreenshot": { "savedTo": "C:/tmp/...png" } } // library opens in the Electronics library editor ``` @@ -277,7 +277,7 @@ Open .sch in Schematic Editor Switch back to 2D board layout from 3D view  ```-adom-desktop fusion_show_2d_board '{}'+adom-bridge fusion_show_2d_board '{}' -> { "activeWorkspace": "Electronics Design" } ``` @@ -289,7 +289,7 @@ Switch to 3D PCB view (board needs outline on layer 20) _Prerequisite: Board must be open in PCB Editor_  ```-adom-desktop fusion_show_3d_board '{}'+adom-bridge fusion_show_3d_board '{}' -> { "activeWorkspace": "3D PCB", "screenshots": [ { "savedTo": "C:/tmp/...png" } ] } ``` @@ -389,7 +389,7 @@ Export active design as STEP _Prerequisite: Active 3D design (not Electronics)_  ```-adom-desktop fusion_export_step '{"outputPath":"C:/tmp/board.step"}'+adom-bridge fusion_export_step '{"outputPath":"C:/tmp/board.step"}' -> { "format": "step", "fileSizeKB": 8890 } // requires the 3D view active (fusion_show_3d_board) ``` @@ -469,7 +469,7 @@ Export Bill of Materials as CSV (grouped by value+package) **Args:** `grouped` (optional bool (default: true) - false for one row per component), `outputPath` (optional (default: C:/tmp/adom-bom.csv))  ```-adom-desktop fusion_export_bom '{"outputPath":"C:/tmp/bom.csv"}'+adom-bridge fusion_export_bom '{"outputPath":"C:/tmp/bom.csv"}' -> { "componentCount": 13, "grouped": true } // CSV: Comment,Designator,Footprint,Quantity,Library ``` @@ -481,7 +481,7 @@ Export Component Placement List (pick-and-place) as CSV **Args:** `outputPath` (optional (default: C:/tmp/adom-cpl.csv)), `side` (optional: all (default) | top | bottom)  ```-adom-desktop fusion_export_cpl '{"outputPath":"C:/tmp/cpl.csv"}'+adom-bridge fusion_export_cpl '{"outputPath":"C:/tmp/cpl.csv"}' -> { "topCount": 12, "bottomCount": 1 } // CSV: Designator,Mid X,Mid Y,Layer,Rotation ``` @@ -493,7 +493,7 @@ Export Gerber RS-274X + Excellon drill files as ZIP (auto-detects layers, select **Args:** `boardName` (optional (default: from active doc name)), `layers` (optional: auto | 2 | 4), `outputDir` (optional (default: C:/tmp/adom-gerbers/))  ```-adom-desktop fusion_export_gerbers '{}'+adom-bridge fusion_export_gerbers '{}' -> { "boardName": "LEDStrip_WS2812B-BT_v12", "fileCount": 11, "files": [ {"name":"...GTL","size":24922}, {"name":"...GBL"}, ... {"name":"...XLN"}, {"name":"gerber_job.gbrjob"} ] } ``` @@ -505,7 +505,7 @@ Apply Adom/JLCPCB design rules (.edru files) - auto-detects 2/4 layer **Args:** `action` (optional: apply (default) | export | show), `layers` (optional: auto (default) | 2 | 4), `outputPath` (optional, for export action)  ```-adom-desktop fusion_set_design_rules '{"action":"apply","layers":"2"}'+adom-bridge fusion_set_design_rules '{"action":"apply","layers":"2"}' -> { "activeWorkspace": "PCB Editor", "description": "board thickness 1.6mm, 1oz copper, ... (JLCPCB profile)" } ``` @@ -564,4 +564,4 @@ Move crash recovery files to ~/.adom/recovery/fusion/ (call before launch to pre  --- -_68 verbs. Generated from the live Adom Desktop verb catalog; headline verbs show real captured output._+_68 verbs. Generated from the live Adom Bridge verb catalog; headline verbs show real captured output._
SKILL.md+262−82
@@ -1,117 +1,297 @@ ----name: fusion-mcp-and-preferences-description: >--  Use Autodesk's Fusion MCP server (the Autodesk + Anthropic text-to-CAD connector) from an Adom-  cloud AI, and change ANY Fusion preference including ones the Python API does not expose. The MCP-  server binds loopback on the user's machine so a cloud container cannot reach it; the fusion-  bridge proxies it. Covers turning it on for the user (no API exists for the toggle, so the bridge-  drives the Preferences dialog), the MCP session handshake, the four Autodesk tools, and when to-  prefer a native fusion_* verb instead. Trigger words - fusion mcp, fusion mcp server, autodesk-  mcp, claude connector for fusion, text to cad, 127.0.0.1:27182, enable fusion mcp, fusion-  preferences, change a fusion setting, fusion prefs dialog, api preferences, developer tools-  fusion, fusion setting not in the api.+name: adom-desktop-fusion+public: true+description: "Launch and drive Fusion 360 on the user's laptop from this container via the adom-bridge CLI. Includes FAST cloud-file search via APS (Autodesk Platform Services) — search/browse/open the team's Fusion cloud designs in seconds (set up once per company, each user signs in once, never charged). Plus open .f3d/.f3z designs, open cloud files, close documents, dismiss recovery dialogs, capture Fusion window screenshots, send keys + click, run the add-in (STEP/GLB/.lbr import-export, BOM/parameters). Trigger words: fusion, Fusion 360, fast cloud search, fusion_aps_search, search fusion files, find a design, browse cloud files, fusion_aps_open, aps, open fusion, launch fusion, open design, f3d, f3z, import STEP, export STEP, export GLB, export lbr, Fusion electronics, Fusion PCB, BOM from Fusion, Fusion parameters, Fusion API, dismiss recovery, Fusion screenshot, fusion_click, fusion_send_key, fusion bridge, close fusion." --- -# Fusion MCP server + preferences+# adom-bridge — Fusion 360 bridge -Two capabilities that turned out to be the same trick: Fusion exposes far less to its Python API-than to its UI, and the UI is drivable.+All commands dispatch to the Fusion Python bridge. From this container: -## The MCP server+```bash+adom-bridge fusion_<action> '<json_args>'+``` -Autodesk + Anthropic ship a **local** MCP server at `http://127.0.0.1:27182/mcp` exposing Fusion's-own text-to-CAD surface.+The leading `fusion_` routes to the Fusion plugin; `<action>` is the plugin-side name. -**It binds loopback on the user's machine.** An Adom AI runs in a cloud container and cannot reach-it. The fusion bridge runs on that machine, so it proxies:+## FIRST-TIME / COLD-START — read before you panic -```bash-adom-desktop fusion_mcp_status '{}'          # up? serverInfo + live tool list-adom-desktop fusion_mcp_enable '{}'          # turn it ON for the user-adom-desktop fusion_mcp_tools  '{}'          # tools WITH input schemas-adom-desktop fusion_mcp_call   '{"tool":"fusion_mcp_electronics_read",-                                 "arguments":{"entity_type":"electronics.Element"}}'-adom-desktop fusion_mcp_resources '{}'       # electronics entity schemas+A fresh laptop may not have Fusion running (or may run a stale add-in). That is EXPECTED, not defeat.+Branch on the stable `errorCode`, never the prose:++| response (`errorCode`) | what it means | what you do |+|---|---|---|+| `ready:true` (fusion_readiness) | Fusion up + add-in current | drive |+| `running:false` / `fusion_not_running` | installed, not launched | `fusion_start` (returns when the add-in is ready, or `stillLaunching` on a slow first launch) |+| `stillLaunching:true` (fusion_start) | first launch, add-in not up yet (can take 2-4 min) | do NOT re-call `fusion_start`; POLL `fusion_readiness` every ~10s until `ready:true` |+| `installed:false` / `host_app_not_installed` (AD >=1.9.79, + a `hostApp` field) | no Fusion host app | OFFER to install, then **`fusion_install_fusion`** (no shell approval; elevation-aware, streams the free trial) -> poll `fusion_readiness` (`installing:true`) until `installed:true` -> `fusion_start`. Details: [fusion-onboarding](skills/fusion-onboarding/SKILL.md) |+| `needsSignin:true` (`fusion_start` **and** `fusion_readiness`) | Fusion is running but stuck at the first-run Autodesk sign-in (main UI blocked, add-in can't serve, so `ready:false`) | AUTOMATE it (proven sequence, see [fusion-onboarding](skills/fusion-onboarding/SKILL.md)): (1) clear STALE `signin.autodesk.com` tabs (a dead tab = expired code = "Sign-in request expired"); (2) `desktop_ui_click` "Retry browser sign-in" / "Sign In" for ONE fresh request; (3) click "Open Product" with **`desktop_click` (SendInput=isTrusted)** — `desktop_ui_click` (UIA) does NOT fire the protocol; (4) on the in-page "open Autodesk Identity Manager?" overlay (NOT an owned popup) tick "Always allow" + "Open" via `desktop_click`, FAST; (5) poll `fusion_readiness`. `nbrowser` (CDP) can do 3-4 headlessly if it's on the SAME browser window. NEVER auto-enter password/2FA. To ask the user, `notify_user` works directly (AD ≥1.9.84); add a cross-AD `target` if you're on a VM |+| `addinStale:true` / `addin_stale` | Fusion runs an OLD add-in that never re-synced (silent-failure risk) | `fusion_stop` then `fusion_start` — the bridge re-syncs the add-in from cache on start (Fusion must be CLOSED) |+| `bridge_restarting` + `stillRunning:true` (AD ≥1.9.77) | the bridge is respawning after a `bridge_install` | NEVER a not-installed/fatal signal: poll `fusion_readiness` until `ready:true`, then retry. Read-only verbs (`fusion_readiness`/`fusion_describe`/`fusion_get_app_state`) forward straight through even mid-respawn — no sleep-and-recheck hacks needed |+| `blockingDialogs:[…]` | a modal is blocking the add-in | dismiss in the BACKGROUND, then the op auto-resumes |++**Runtime note:** AD **provisions Python itself** (a portable no-UAC 3.12.13 runtime if none is on PATH — the bridge never bootstraps its own; check AD's `runtimes` verb). You never install Python.++## The 8 conventions (from the Bridge SDK)++1. **Poll readiness, don't launch blindly.** `fusion_readiness` (or AD's `bridge_readiness`) is read-only — it reports `installed`/`running`/`ready`/`addinStale` WITHOUT launching anything. Loop: readiness → act on the row above → drive.+2. **`fusion_readiness` is the standardized cold-start probe.** (Fusion is a detected HOST APP with no heavy download, so there's no `prewarm` step — readiness is the whole gate.)+3. **Core verbs live in the table below; `fusion_describe '{}'` is the full machine-readable catalog.** Read the table to act fast; hit `describe` for completeness — don't guess a verb.+4. **Background by default — automate first, NOTIFY only at a true wall.** This bridge drives the AI's workspace, not the user's screen: dismiss dialogs in the BACKGROUND (`fusion_close_window`, never `fusion_send_key`/Escape, which steals focus). AUTOMATE sign-in / dialogs yourself (see the proven sign-in sequence in [fusion-onboarding](skills/fusion-onboarding/SKILL.md)); reserve an AD **`notify_user`** for something only the user can do — a **UAC/elevation** prompt, a license accept, a **2FA/password** step you must not auto-fill, or a licensing **DECISION** that risks their other machine. **`notify_user` works directly over the bridge's direct API (AD ≥1.9.84) — call it, don't relay a payload for the AI to send.** When this bridge runs UNATTENDED (e.g. on a VM) and the user is elsewhere, add a cross-AD **`target`** (a peer clientName from the `targets` verb, or `"all"`) so the toast lands where they are. Only foreground Fusion to SHOW the user something. See [fusion-driving](skills/fusion-driving/SKILL.md) and [fusion-onboarding](skills/fusion-onboarding/SKILL.md).+5. **`ok:true` is not enough — verify.** A long op that "times out" at ~60s is usually STILL RUNNING server-side (the relay caps the request, not the work). Verify by artifacts (the saved file / a screenshot / `fusion_get_app_state`), don't blindly retry.+6. **Reuse the running Fusion — and when a restart IS needed, YOU do it, never the user.** Fusion is a singleton: `fusion_readiness` before `fusion_start`; if `ready`, just drive. But a stale/missing add-in or a wedged session needs a restart, and that is YOUR job — `fusion_stop` then `fusion_start`. Restarting Fusion and enabling the add-in are the bridge's job, not something to hand back to the user — doing it for them is the entire point of this bridge. (Add-in installs land in ALL Fusion add-in dirs — 2025+ Fusion scans `%APPDATA%\Autodesk\FusionAddins`, older builds use `...\Autodesk Fusion[ 360]\API\AddIns` — so a restart always picks it up.)+7. **Surface `_hint` verbatim + branch on `errorCode`.** Every verb returns an actionable `_hint`; relay it to the user unchanged and key your logic off the stable `errorCode`, not the prose.+8. **Never write files to a shared cloud ROOT.** Uploads default to an `Adom AI Workspace` folder; see [fusion-cloud-hygiene](skills/fusion-cloud-hygiene/SKILL.md).++## [!] Electronics PCBs: ALWAYS open the PROJECT file (never the schematic / board / 3D)++A Fusion electronics design is NOT one file. It is a parent/child chain of FOUR files, each a+different `productType`:++```+PROJECT        EcadDesignProductType     <-- OPEN THIS ONE, ALWAYS+  |- schematic   SchematicProductType+  |- board/.brd  BoardProductType+  |- 3D PCB      DesignProductType        (generated from the .brd - the LEAF; opening it gives NO editable board) ``` -### Do not ask the user to enable it+- **Open the PROJECT** (`EcadDesignProductType`) with `fusion_open_cloud_file` / `fusion_open_by_urn`.+  Fusion then brings up its schematic + board as children; move between them with the schematic view,+  `fusion_show_2d_board`, and `fusion_show_3d_board`.+- **NEVER open the schematic, the .brd, or the 3D file directly** to "get the board." You get an+  isolated/empty view and waste time trying to derive a 2D board from the 3D. The 3D is the LEAF,+  generated FROM the .brd - it is not the board, and you cannot pull a board out of it.+- Same-named copies in OTHER projects (e.g. a drone assembly) are usually 3D-model derivatives+  (`DesignProductType`), NOT the project. Don't open those.+- `fusion_open_cloud_file` / `fusion_open_by_urn` REPRIMAND you in the response `_hint` when you open+  a child file instead of the project - read it and re-open the `EcadDesignProductType` project. -It is OFF by default and there is **no API for the toggle**. `fusion_mcp_enable` does it for them:-opens Preferences, expands General, selects API, ticks the box, Apply, OK, then verifies the port-is listening. Tell them it is handled. Only fall back to instructions if the verb reports failure.+## ⚡ Fast cloud search (APS) — READ THIS FIRST for any "find/search/open a cloud design" task -### The trap that costs a debugging cycle+To search the team's Fusion cloud files, use **`fusion_aps_search`**, NOT the legacy+`fusion_search_cloud_files` (which walks folders one-by-one and takes 30+ MINUTES). APS hits+Autodesk's **server-side index** → results in **seconds**, and works with Fusion closed. -**The setting is discarded unless Apply is clicked.** Restart or kill Fusion with the dialog open-and it reverts, while the checkbox looked correct. If the port is closed but the user says they-enabled it, this is almost certainly why. Re-run `fusion_mcp_enable`.+| Verb | Does |+|---|---|+| `fusion_aps_search {query, projectId?, limit?}` | Fast name search across the whole team hub; newest-first; shows each file's project. |+| `fusion_aps_browse {} / {projectId} / {projectId,folderId}` | Browse hubs→projects→folders→files (cloud explorer, no Fusion). |+| `fusion_aps_open {query}` | Search + open the best match in Fusion (opens by exact URN — works for nested files). Returns immediately; the open finishes in the background — poll `fusion_get_app_state` (or pass `{wait:true}`). |+| `fusion_aps_recent {limit?}` | Most-recently-modified designs across the hub, newest-first. |+| `fusion_aps_file_info {query}` | Version history for a file — count, who/when last modified, size. |+| `fusion_aps_status {}` | configured? signedIn? token live? + never-charge usage meter. **Call this first** — its `_hint` tells you the next step. |+| `fusion_aps_signin {}` | One-time per user: opens Autodesk consent, captures the token. |+| `fusion_aps_set_client_id {clientId}` | Set the org's APS Client ID. | -### The handshake is handled+**Auth model (important): set up ONCE per company, each user signs in once.** An admin registers a free APS app for the org one time (the AI drives the whole setup — see the `fusion-aps-signin` skill) → a **Client ID** (a public PKCE id, no secret, safe to share within the org). Then every teammate just runs `fusion_aps_signin` once with their own Autodesk login — **no plan, no card, no setup** for them. It's **per-organization** (each company runs its own setup; don't ship one global Client ID). **Nobody is ever charged** — the card is identity-verification only, and the bridge is free-endpoint-only + usage-capped. -Streamable-HTTP: a bare POST returns `400 Missing MCP-Session-Id`. You must `initialize`, capture-the `MCP-Session-Id` **response header**, send `notifications/initialized`, then pass that header.-The bridge does this and re-establishes dropped sessions, so `fusion_mcp_call` just works.+If `fusion_aps_status` says not configured/signed in, follow its `_hint`. Full why + step-by-step setup: the bundled **`fusion-aps-search`** and **`fusion-aps-signin`** skills. -### Autodesk's four tools+## ⛔ "Expired subscription — Read Only" / trial / personal Fusion — what it does NOT block -| tool | for | the depth is in the params |-|---|---|---|-| `fusion_mcp_read` | read/search/see/introspect | `queryType`: `projects`, `document` (search/open/recent = **file search**), `apiDocumentation` (search Fusion's API docs), `screenshot` (any view-cube direction), `activeCommand` (read the live dialog) |-| `fusion_mcp_execute` | run scripts + document lifecycle | `featureType`: `script` (**arbitrary Python** = text-to-CAD), `document` (open/close/save) |-| `fusion_mcp_update` | undo / redo only | `featureType`: `undo`, `redo` |-| `fusion_mcp_electronics_read` | read the EAGLE object model | `entity_type`: **49 classes** across schematic/board/library + ERC/DRC `Error`, with `object.fields` / `object.filters` / `object.pagination` |+**An expired / "Read Only" / personal-use Fusion can OPEN, VIEW, and BROWSE files just fine.**+Autodesk keeps the account in **Basic Access for 365 days** after a subscription lapses. So in+read-only Fusion you CAN: **open cloud designs, view/inspect them, browse the Data Panel, and run+APS search** — everything this bridge does for *reading* works.++Read-only ONLY blocks **save, export, modify, and creating new designs** (the Save/Export buttons+are dimmed). So:++- ⛔ **Do not attribute an `open` / `view` / `search` failure to "the Fusion subscription+  is expired / read-only."** That is FALSE and confuses users (it's been said wrongly many times).+  If `fusion_aps_open` / `fusion_open_cloud_file` hangs or fails, it is a **code / approach+  problem in the open path** (URN resolution, the Electronics design picker, a slow assembly+  download, a stuck main thread) — debug/fix THAT, not the license. Try harder; don't blame the+  subscription.+- ✅ The ONLY place read-only is a legitimate explanation is **save / export** — e.g.+  `fusion_export_*` may be blocked (Save/Export dimmed). There, "renew the subscription" is valid.++(Source: Autodesk — "Term has Expired or Usage Limits Exceeded"; data stays in Basic Access ~365 days.)++## Commands (core bridge)++| CLI form | Action | Purpose | Key args |+|---|---|---|---|+| `fusion_start` / `fusion_launch` | `start` / `launch` | Launch Fusion 360 (handles webdeploy glob, waits for bridge, dismisses startup picker) | — |+| `fusion_open_design` | `open_design` | Open a local `.f3d` / `.f3z` design file | `path` |+| `fusion_open_cloud_file` | `open_cloud_file` | Open a design from the user's Fusion cloud | `project`, `path` |+| `fusion_close_document` | `close_document` | Close the active document | — |+| `fusion_close_window` | `close_window` | Close a specific Fusion window by HWND | `hwnd` |+| `fusion_close` | `close` | Close Fusion 360 entirely | — |+| `fusion_dismiss_recovery` | `dismiss_recovery` | Dismiss the "recover unsaved work" dialog | — |+| `fusion_relocate_recovery` | `relocate_recovery` | Move recovery dialog offscreen (for recording) | — |+| `fusion_window_info` | `window_info` | Enumerate Fusion windows (HWND, title, bounds) | — |+| `fusion_screenshot_fusion` | `screenshot_fusion` | Screenshot the main Fusion window | — |+| `fusion_screenshot_all` | `screenshot_all` | Screenshot every Fusion window | — |+| `fusion_click_fusion` | `click_fusion` | Click at (x, y) in the Fusion main window | `x`, `y` |+| `fusion_send_key` | `send_key` | Send a keyboard shortcut to Fusion | `hwnd`, `key` |+| `fusion_addin_status` | `addin_status` | Report whether the in-process Adom add-in is loaded + healthy | — |+| `fusion_generate_package` | `generate_package` | Generate an IPC package via Fusion's built-in EPG (~50 families) + raised-WHITE marking (longest-axis, measured 10% margin, multi-line MPN+variant) + colored STEP + sidecar manifest - in ONE call | `type`, `params` (mm), `etch`, `etchStyle`, `outputStep` |+| `fusion_set_preference` | `set_preference` | Set appearance/navigation prefs LIVE (no restart): `theme` (light/darkblue/darkgray/classic/device/dark), `invertScrollZoom`, `orbitScheme` (fusion360/alias/inventor/solidworks/tinkercad/powermill), `modelingOrientation` (yup/zup), `gestureNav`, `cameraPivot`, `lengthUnit` (mm/cm/m/in/ft). Per-key result in `applied`; some themes aren't in every build (falls back) | any of the keys |+| `fusion_get_preferences` | `get_preferences` | Read current appearance/navigation prefs as the friendly values `set_preference` accepts | — |++## Extended commands via the in-process add-in++If the Adom add-in is installed (`cd ~/project/adom-desktop/plugins/fusion360 && python install_addin.py` on the laptop), Fusion 360 exposes an additional API over its own ports. Typical extra commands proxied through the bridge:++- `fusion_import_step` — import a STEP file into the active document+- `fusion_export_step` — export active body/occurrence to STEP+- `fusion_export_glb` — export to GLB (used by the 3D viewer)+- `fusion_export_lbr` — export an Eagle library (used by the Eagle workflow)+- `fusion_open_lbr` / `fusion_open_symbol` — open symbol libraries+- `fusion_command` — generic `{"command": "<fusion_api_name>", "args": {...}}` pass-through for any Fusion API call+- `fusion_list_cloud_projects`, `fusion_list_cloud_files`, `fusion_walk_cloud_tree`, `fusion_search_cloud_files`, `fusion_open_cloud_file`, `fusion_export_cloud_file` — Autodesk cloud Data API operations++**Opening multi-design electronics files — pass `fileExtension`.** A Fusion electronics data file that links to multiple designs (common for boards with variants) makes `fusion_open_cloud_file` pop Fusion's native **"Select Electronics Design File" picker** — a CEF/Chromium modal whose list is **not keyboard- or Win32-navigable** (and screen-coord clicks are unreliable on multi-monitor/HiDPI), so it **can't be resolved headlessly**. Avoid it by opening the specific file directly: `fusion_open_cloud_file {"fileName":"<name>","fileExtension":"fbrd", ...}` (the `.fbrd` board lands straight in PCB Editor — live-confirmed). Opening the bare name or the `.fprj` project triggers the picker. If a picker still appears, `_diagnose_addin_timeout`/`blockingDialogs` will classify it (see below).++### Blocking-dialog awareness++Several Fusion modals (the multi-link "Select Electronics Design File" picker, "Fusion needs to update", Document Recovery, "Save changes?") block the add-in's main thread. The bridge now **classifies them by title** and, on a blocked command, returns `blockingDialogs: [{hwnd, title, category, resolution}]` with the precise cause + fix — instead of a misleading "add-in not responding / may have crashed". So a blocked open tells you *which* modal is up and how to clear it.++Resolution notes:+- **Multi-link picker** is a **CEF/web modal whose list is NOT keyboard- or Win32-navigable** (SendInput reaches only the native Cancel/OK; screen-coord clicks are unreliable on multi-monitor/HiDPI). It currently **must be resolved on the desktop**. *Headless fix tracked separately:* have the add-in open the specific linked design via the Fusion API, avoiding the picker entirely.+- **Update nag** is reported, not auto-dismissed (auto-confirming could start an update mid-run) — clear it on the desktop; doing so also commonly resolves recurring add-in crashes (host/add-in version drift).+- **Recovery** prompts: `fusion_dismiss_recovery` / `fusion_relocate_recovery`.++Check `fusion_addin_status` first — if the add-in isn't loaded, these will fail with a `_hint` pointing at the install script. -`fusion_mcp_resources` returns 50 resources: `electronics_entity_types` plus one-`electronics_schema_<class>` per class (properties, types, filter operators). Read the schema-before filtering. Electronics is READ-ONLY; author boards with the native `fusion_electron_run`.-Full write-up: docs/fusion-mcp-server.md.+## Cloud search — defensive contract (add-in v1.0.2+) -MCP acts on the **active document**. Open one first (`fusion_aps_open`).+`fusion_search_cloud_files` is the most-used long-running verb. Its v1.0.2 behavior is engineered specifically so the AI never misreports a failed search as "file not found": -### MCP vs native verbs+| You read in the response | Mean |+|---|---|+| `searchComplete: true` + `totalFound: 0` | **Confirmed negative.** No match in the searched scope. |+| `searchComplete: true` + `totalFound: N` | All matches returned. |+| `searchComplete: false` (any reason) | **Search stopped early.** May or may not be more matches. Do NOT say "not found" to the user. Re-run with broader caps OR narrower `folderPath`. | -**Prefer a native `fusion_*` verb when one exists.** They are tested, they return hints that teach-the next step, they handle the awkward parts (kit-aware BOM counting, the 2-minute sign-in clock,-GLB optimization), and they work without a Fusion subscription or MCP enabled.+`searchComplete` is `true` ONLY when every one of these is clean: not `folderLimitReached`, not result-`truncated`, not `searchTimedOut`, `foldersSkipped == 0`, `filesSkipped == 0`. Five conditions, all five must pass. -**Reach for MCP** for Autodesk's text-to-CAD surface and the structured Electronics object model,-which is richer for querying a board than anything hand-rolled.+### Performance + the slow-search etiquette -Requirements: Fusion subscription, Fusion running, loopback only.+`fusion_search_cloud_files` runs at ~1 folder/sec because Autodesk's free Fusion 360 Python API has no indexed search endpoint — it walks the cloud Data API one folder at a time (30+ min on a real hub). **⚠️ Prefer `fusion_aps_search` instead** (see the APS section at the top) — it uses Autodesk Platform Services' server-side index and returns in **seconds**. This legacy walk verb remains only as a fallback for when APS isn't set up; if a user is hitting slow searches, set up APS (`fusion_aps_status` → its `_hint`) rather than tuning the walk. -## Any preference, via the UI+**Before firing a broad search**, ask the user which subfolder is likely. Naming a folder like "Molecules" cuts 5-40 min searches down to ~10s. The verb's response includes a `costAnalysis` block (`foldersPerSecond`, `estimatedSecondsPer100Folders`) so the AI can budget realistically. -The API exposes a thin slice (`generalPreferences`: theme/orbit/units; `apiPreferences`:-`debuggingPort`, `isDeveloperToolsEnabled`). Everything else is UI-only.+### Streaming progress++For interactive sessions, wrap long searches in `watch` so the AI gets one JSON-line progress event per `interval` seconds:  ```bash-adom-desktop fusion_prefs_open  '{"section":"api"}'   # opens + navigates + screenshots-# look at the screenshot, then click what you see:-adom-desktop desktop_click '{"space":"image","shotId":"<from response>","x":690,"y":476,"hwnd":<hwnd>}'-adom-desktop fusion_prefs_close '{"save":true}'       # Apply + OK+adom-bridge watch '{+  "command": "fusion_search_cloud_files",+  "args": {+    "query": "cosmiic",+    "projectName": "Main",+    "folderPath": "Molecules",+    "recursive": true,+    "maxFolders": 300,+    "maxDepth": 10,+    "searchTimeout": 340,+    "timeout": 400+  },+  "interval": 3+}'+```++Output:+```+{"event":"started", ...}+{"event":"progress", "foldersVisited": 12, "filesFound": 1, "elapsedSeconds": 15.1, "currentFolder": "Molecules/COSMIIC", ...}+{"event":"progress", "foldersVisited": 173, "filesFound": 3, "elapsedSeconds": 168.3, ...}+{"event":"complete", "result": {... full response with searchComplete:true ...}} ``` -Sections: `general`, `api`, `design`, `manufacture`, `electronics`, `render`, `drawing`,-`material`, `graphics`, `network`, `preview features`.+The `watch` wrapper composes with the `Monitor` tool — each stdout line becomes a notification.++### Args (no hard upper caps in v1.0.2+)++| Arg | Default | Notes |+|---|---|---|+| `query` | (required) | Substring of file name. **Case-insensitive both directions.** |+| `projectName` | active | Cloud project name. |+| `folderPath` | project root | Starting subfolder. **NARROW HERE — biggest perf lever.** |+| `recursive` | `false` | Descend into subfolders. |+| `maxDepth` | 2 | Recursion depth cap. |+| `maxFolders` | 10 | Folder-visit cap. |+| `maxResults` | 20 | Result cap. |+| `folderTimeout` | 30s | Per-folder cloud-API timeout. Bridge skips slow folders. |+| `searchTimeout` | 120s | Overall wall-clock timeout. Set 300+ for big walks. |+| `timeout` | 620s | HTTP envelope timeout (CLI+direct API). Bump if `searchTimeout` > 180. |++Real-world live test: `Main/Molecules` recursive depth-10 cosmiic search hit 173 folders in 168s with `searchComplete:true, totalFound:3, foldersSkipped:0, filesSkipped:0`. Fusion stayed `main_thread: responsive` throughout.++## Quick examples++```bash+# Launch Fusion+adom-bridge fusion_start '{}'++# Open a local design+adom-bridge fusion_open_design '{"path":"C:/designs/board.f3d"}'++# Screenshot all Fusion windows+adom-bridge fusion_screenshot_all '{}'++# Run a Fusion API command (add-in required)+adom-bridge fusion_command '{+  "command":"export_step",+  "args":{"occurrence":"body1","output":"C:/tmp/part.step"}+}'++# Check add-in health+adom-bridge fusion_addin_status '{}'+```++## Error shape++Every failing response includes a `_hint` field. Surface it verbatim when a Fusion command fails.++## Bridge architecture (v1.8.31+) — dynamic ports++Earlier versions used hardcoded port `8773` for the bridge and `8774` for the in-process add-in. **v1.8.31 made the bridge use OS-assigned ephemeral ports.** The add-in port is still 8774 (it's inside Fusion's process and the manifest pins it), but that's an internal detail.++- The CLI (`adom-bridge fusion_*`) routes through adom-desktop's direct API → the bridge's runtime port. No callers need port numbers.+- The add-in v1.0.2 ships a stale-lock watchdog in `http_server.py`: if a command holds the main-thread lock longer than `per_command_timeout + 30s` (e.g. Fusion's native cloud SDK wedges on a slow API call), the watchdog force-releases so subsequent commands work without restarting Fusion. The wedged command is orphaned but no longer blocks everything else.+- The `searchComplete` contract (see above) prevents false-negative reporting on capped/skipped searches. Always check `data.searchComplete` before telling the user "file not found".++## How this bridge is packaged + delivered (3 artifacts)++This bridge is ONE wiki page (`wiki.adom.inc/adom/fusion-bridge`) that ships **three things**:++1. **The page git repo** — the ONE source of truth (all source, `skills/`, the docs, `page.json`, and the+   bridge manifest). Edit + push here.+2. **The Release zip + the bridge manifest** (`adom-bridge-fusion-manifest.json`) — what **adom-desktop**+   consumes on `bridge_install`: the manifest tells adom-bridge who this bridge is (name, version, the+   Release-zip URL, sha256, size, verb prefixes, health), and it streams that zip into its bridge cache.+3. **The adom-wiki skills pkg** (`adom-wiki pkg install adom/fusion-bridge`) — **skills only**.+   It deploys these skills into a container's `~/.claude/skills/` so the AI knows how to drive this bridge+   and Fusion.++**Install handshake:** when an AI has adom-bridge install this bridge, adom-bridge installs the Release+AND tells the AI to `adom-wiki pkg install` this pkg — so the container gets all these skills. An AI can+also install the pkg itself; then the skills **auto-update** via the pkg mechanism (the goal). Full detail++ the publish ritual + the hero-relink reminder: the **`fusion-bridge-dev`** skill. -### Why it returns an image instead of control names+## Related -`Commands.Start PreferencesCommand` opens the dialog, and the **top-level** section tree IS in the-UIA tree. But the children under General (API, Design, Manufacture, Electronics, Render, Drawing,-Simulation) are rendered **lazily by Qt** and never appear there, even after `desktop_ui_expand`-reports success. So child navigation is an image-space click, which takes the foreground and is-announced with a caption.+- **Building component libraries (symbol + footprint + RENDERING 3D):** **`fusion-libraries`** (one part) and **`fusion-multipart-libraries`** (many parts in one `.lbr`, each with real 3D) — the latter's SOLVED recipe is `fusion_make_3d_package` (STEP → orient → f3d → upload → `wip_urn`, hand-written into the library, **no GUI dialogs**). Full tutorial: the **`fusion-multipart-libraries`** skill's `CREATING_BASIC_PARTS_LIBRARIES.md`. Operate Fusion safely with **`fusion-driving`** + **`fusion-cloud-save`**.+- **`fusion-aps-search`** + **`fusion-aps-signin`** — APS fast-search reasoning + the AI-driven one-time setup (bundled in this repo's `skills/`).+- `adom-desktop-kicad` — sibling bridge for KiCad.+- `adom-desktop-direct-api` — the direct API contract that callers route through.+- **Canonical repo:** the wiki page `https://wiki.adom.inc/adom/fusion-bridge` (+ GitHub backup `adom-inc/fusion-bridge`). The old `adom-inc/adom-desktop/plugins/fusion360/` is a stale seed. -### Rules+## Quick demo on first install (sample library included) -1. **Always** finish with `fusion_prefs_close {save:true}`. Nothing persists otherwise.-2. **Verify the effect**, do not trust the click. For MCP, probe the port. For a render setting,-   observe the change.-3. Prefer `fusion_set_preference` for anything in the API-exposed slice; it is background and does-   not touch the user's screen.-4. Never leave the dialog open. A modal Preferences window blocks other Fusion verbs.+The repo ships a ready sample so you can prove the bridge end to end right after installing:+`examples/ADS8588SIPM.fusion.lbr` (a real 4-sided LQFP-64 library) + `examples/ADS8588SIPM.step` (its 3D). -## Full write-ups+1. Download both from this page's Files tab (or `adom-wiki repo clone`), then stage them onto Windows+   (serve + `Invoke-WebRequest`, since there is no container->Windows push verb).+2. **Import demo:** `fusion_open_lbr {"filePath":"C:/.../ADS8588SIPM.fusion.lbr","verify":true}` -> the+   symbol + 4-sided footprint render in the Electronics Library editor.+3. **3D-attach demo:** `fusion_attach_3d_package {"filePath":"C:/.../ADS8588SIPM.fusion.lbr",+   "modelPath":"C:/.../ADS8588SIPM.step","packageName":"ADS8588SIPM"}` -> click the Save dialog per the+   returned hint -> the real chip binds onto the footprint (Content Manager shows the 3D under the package). -- [docs/fusion-mcp-server.md](../../docs/fusion-mcp-server.md)-- [docs/fusion-preferences.md](../../docs/fusion-preferences.md) (with screenshots of all three steps)+See the **`fusion-libraries`** skill's `MAKING_LIBRARIES.md` for the full walkthrough + screenshots.
VERBS.md+48−48
@@ -4,7 +4,7 @@ Every `fusion_*` verb this bridge exposes, generated from the bridge's own self- (`describe.py` / `fusion_describe`) so it never drifts. Call as:  ```-adom-desktop fusion_<verb> '<input json>'+adom-bridge fusion_<verb> '<input json>' ```  `input` / `output` below are the SCHEMA (field -> type/notes); `example` is a real input.@@ -33,7 +33,7 @@ Launch Fusion 360 (if needed) and wait for the AdomBridge add-in to be ready. **Example call:**  ```-adom-desktop fusion_start '{}'+adom-bridge fusion_start '{}' ```  **Output** (shape):@@ -63,7 +63,7 @@ Gracefully STOP Fusion 360: close docs cleanly + WM_CLOSE, then wait. NO force-k **Example call:**  ```-adom-desktop fusion_stop '{}'+adom-bridge fusion_stop '{}' ```  **Output** (shape):@@ -92,7 +92,7 @@ Force-KILL Fusion 360 (taskkill /F) - the desperate path for when fusion_stop ca **Example call:**  ```-adom-desktop fusion_kill '{}'+adom-bridge fusion_kill '{}' ```  **Output** (shape):@@ -121,7 +121,7 @@ Close the active Fusion document/window. **Example call:**  ```-adom-desktop fusion_close_window '{}'+adom-bridge fusion_close_window '{}' ```  **Output** (shape):@@ -143,7 +143,7 @@ Current app state: running, active document, workspace, isElectronics. The poll/ **Example call:**  ```-adom-desktop fusion_get_app_state '{}'+adom-bridge fusion_get_app_state '{}' ```  **Output** (shape):@@ -169,7 +169,7 @@ APS state: configured, signed in, token live, never-charge meter. **Example call:**  ```-adom-desktop fusion_aps_status '{}'+adom-bridge fusion_aps_status '{}' ```  **Output** (shape):@@ -199,7 +199,7 @@ Set the org's APS (PKCE) client id used for cloud search. **Example call:**  ```-adom-desktop fusion_aps_set_client_id '{"clientId": "D5nn...EPAq"}'+adom-bridge fusion_aps_set_client_id '{"clientId": "D5nn...EPAq"}' ```  **Output** (shape):@@ -221,7 +221,7 @@ Open the Autodesk sign-in in the browser; a background listener captures the tok **Example call:**  ```-adom-desktop fusion_aps_signin '{}'+adom-bridge fusion_aps_signin '{}' ```  **Output** (shape):@@ -253,7 +253,7 @@ Server-indexed search across the whole team hub (seconds, not a 30-min folder wa **Example call:**  ```-adom-desktop fusion_aps_search '{"query": "Molecule", "limit": 10}'+adom-bridge fusion_aps_search '{"query": "Molecule", "limit": 10}' ```  **Output** (shape):@@ -283,7 +283,7 @@ Find a cloud design by name and open it in Fusion (any folder depth). Fire-and-p **Example call:**  ```-adom-desktop fusion_aps_open '{"query": "BME690 Molecule"}'+adom-bridge fusion_aps_open '{"query": "BME690 Molecule"}' ```  **Output** (shape):@@ -313,7 +313,7 @@ Open a cloud ELECTRONICS DESIGN by URN. PCB/ELECTRONICS NAV RULE: a board is NOT **Example call:**  ```-adom-desktop fusion_open_by_urn '{"urn": "urn:adsk.wipprod:fs.file:vf.xxxx?version=1"}'+adom-bridge fusion_open_by_urn '{"urn": "urn:adsk.wipprod:fs.file:vf.xxxx?version=1"}' ```  **Output** (shape):@@ -344,7 +344,7 @@ Browse hubs/projects/folders without launching Fusion. **Example call:**  ```-adom-desktop fusion_aps_browse '{}'+adom-bridge fusion_aps_browse '{}' ```  **Output** (shape):@@ -372,7 +372,7 @@ Most-recently-modified designs across the team hub, newest first. **Example call:**  ```-adom-desktop fusion_aps_recent '{"limit": 25}'+adom-bridge fusion_aps_recent '{"limit": 25}' ```  **Output** (shape):@@ -401,7 +401,7 @@ Version history + who/when/size for a file (tip + recent versions). **Example call:**  ```-adom-desktop fusion_aps_file_info '{"query": "BME690 Molecule"}'+adom-bridge fusion_aps_file_info '{"query": "BME690 Molecule"}' ```  **Output** (shape):@@ -431,7 +431,7 @@ Full (uncapped) version history of a file. **Example call:**  ```-adom-desktop fusion_aps_versions '{"query": "BME690 Molecule"}'+adom-bridge fusion_aps_versions '{"query": "BME690 Molecule"}' ```  **Output** (shape):@@ -462,7 +462,7 @@ Download a cloud file to the local machine (no Fusion needed). **Example call:**  ```-adom-desktop fusion_aps_download '{"query": "BME690 Molecule"}'+adom-bridge fusion_aps_download '{"query": "BME690 Molecule"}' ```  **Output** (shape):@@ -494,7 +494,7 @@ Upload a local file as a NEW cloud file (free Data Management; needs data:write **Example call:**  ```-adom-desktop fusion_aps_upload '{"projectId": "a.YnVz...", "folderId": "urn:...", "localPath": "C:/x.f3d"}'+adom-bridge fusion_aps_upload '{"projectId": "a.YnVz...", "folderId": "urn:...", "localPath": "C:/x.f3d"}' ```  **Output** (shape):@@ -525,7 +525,7 @@ Create a subfolder in a project (free; needs data:create scope). **Example call:**  ```-adom-desktop fusion_aps_create_folder '{"projectId": "a.YnVz...", "parentFolderId": "urn:...", "name": "new-folder"}'+adom-bridge fusion_aps_create_folder '{"projectId": "a.YnVz...", "parentFolderId": "urn:...", "name": "new-folder"}' ```  **Output** (shape):@@ -553,7 +553,7 @@ Raw authenticated GET against a free APS path (dev/verify helper). **Example call:**  ```-adom-desktop fusion_aps_get '{"path": "/project/v1/hubs"}'+adom-bridge fusion_aps_get '{"path": "/project/v1/hubs"}' ```  **Output** (shape):@@ -576,7 +576,7 @@ DO NOT USE: slow in-app add-in walk (30+ min) that CAN CRASH Fusion (WinError 10 **Example call:**  ```-adom-desktop fusion_walk_cloud_tree '{}'+adom-bridge fusion_walk_cloud_tree '{}' ```  **Output** (shape):@@ -604,7 +604,7 @@ DO NOT USE: slow in-app add-in search (30+ min) that CAN CRASH Fusion (WinError **Example call:**  ```-adom-desktop fusion_search_cloud_files '{"query": "Molecule"}'+adom-bridge fusion_search_cloud_files '{"query": "Molecule"}' ```  **Output** (shape):@@ -628,7 +628,7 @@ Switch the OPEN electronics design to its SCHEMATIC view (the symmetric partner **Example call:**  ```-adom-desktop fusion_show_schematic '{}'+adom-bridge fusion_show_schematic '{}' ```  **Output** (shape):@@ -652,7 +652,7 @@ Switch the OPEN electronics design to its 2D PCB Editor (board layout) view. Thi **Example call:**  ```-adom-desktop fusion_show_2d_board '{}'+adom-bridge fusion_show_2d_board '{}' ```  **Output** (shape):@@ -674,7 +674,7 @@ Switch the OPEN electronics design to its 3D PCB view (populated board). A VIEW **Example call:**  ```-adom-desktop fusion_show_3d_board '{}'+adom-bridge fusion_show_3d_board '{}' ```  **Output** (shape):@@ -697,7 +697,7 @@ Raw board geometry XML (copper/arcs/lines) for the open board. **Example call:**  ```-adom-desktop fusion_board_info '{}'+adom-bridge fusion_board_info '{}' ```  **Output** (shape):@@ -727,7 +727,7 @@ Import an EAGLE .lbr library into Fusion's Electronics library editor. **Example call:**  ```-adom-desktop fusion_open_lbr '{"filePath": "C:/libs/nRF52840-CKAA.lbr"}'+adom-bridge fusion_open_lbr '{"filePath": "C:/libs/nRF52840-CKAA.lbr"}' ```  **Output** (shape):@@ -756,7 +756,7 @@ Run an adsk.fusion modeling script in the live session (sketches/extrudes/params **Example call:**  ```-adom-desktop fusion_run_modeling_script '{"script": "import adsk.fusion\n# ...build geometry..."}'+adom-bridge fusion_run_modeling_script '{"script": "import adsk.fusion\n# ...build geometry..."}' ```  **Output** (shape):@@ -787,7 +787,7 @@ Export the active design to STEP (needs the 3D view). **Example call:**  ```-adom-desktop fusion_export_step '{"outputPath": "C:/out/board.step"}'+adom-bridge fusion_export_step '{"outputPath": "C:/out/board.step"}' ```  **Output** (shape):@@ -816,7 +816,7 @@ Export to IGES. **Example call:**  ```-adom-desktop fusion_export_iges '{"outputPath": "C:/out/board.iges"}'+adom-bridge fusion_export_iges '{"outputPath": "C:/out/board.iges"}' ```  **Output** (shape):@@ -844,7 +844,7 @@ Export to STL mesh. **Example call:**  ```-adom-desktop fusion_export_stl '{"outputPath": "C:/out/part.stl"}'+adom-bridge fusion_export_stl '{"outputPath": "C:/out/part.stl"}' ```  **Output** (shape):@@ -872,7 +872,7 @@ Export to 3MF mesh. **Example call:**  ```-adom-desktop fusion_export_3mf '{"outputPath": "C:/out/part.3mf"}'+adom-bridge fusion_export_3mf '{"outputPath": "C:/out/part.3mf"}' ```  **Output** (shape):@@ -900,7 +900,7 @@ Export to USDZ (AR / Hydrogen 3D). **Example call:**  ```-adom-desktop fusion_export_usdz '{"outputPath": "C:/out/part.usdz"}'+adom-bridge fusion_export_usdz '{"outputPath": "C:/out/part.usdz"}' ```  **Output** (shape):@@ -928,7 +928,7 @@ Export to OBJ mesh. **Example call:**  ```-adom-desktop fusion_export_obj '{"outputPath": "C:/out/part.obj"}'+adom-bridge fusion_export_obj '{"outputPath": "C:/out/part.obj"}' ```  **Output** (shape):@@ -956,7 +956,7 @@ Export 2D DXF. **Example call:**  ```-adom-desktop fusion_export_dxf '{"outputPath": "C:/out/sketch.dxf"}'+adom-bridge fusion_export_dxf '{"outputPath": "C:/out/sketch.dxf"}' ```  **Output** (shape):@@ -984,7 +984,7 @@ Export 2D DWG. **Example call:**  ```-adom-desktop fusion_export_dwg '{"outputPath": "C:/out/sketch.dwg"}'+adom-bridge fusion_export_dwg '{"outputPath": "C:/out/sketch.dwg"}' ```  **Output** (shape):@@ -1014,7 +1014,7 @@ Run the bundled JLCPCB CAM job (auto 2/4-layer) to produce the gerber + drill ZI **Example call:**  ```-adom-desktop fusion_export_gerbers '{"outputDir": "C:/tmp/jlc"}'+adom-bridge fusion_export_gerbers '{"outputDir": "C:/tmp/jlc"}' ```  **Output** (shape):@@ -1045,7 +1045,7 @@ Export a Bill of Materials CSV (grouped by value+package) from the open board. **Example call:**  ```-adom-desktop fusion_export_bom '{"outputPath": "C:/tmp/bom.csv"}'+adom-bridge fusion_export_bom '{"outputPath": "C:/tmp/bom.csv"}' ```  **Output** (shape):@@ -1075,7 +1075,7 @@ Export the Component Placement List (pick-and-place) CSV. **Example call:**  ```-adom-desktop fusion_export_cpl '{"outputPath": "C:/tmp/cpl.csv"}'+adom-bridge fusion_export_cpl '{"outputPath": "C:/tmp/cpl.csv"}' ```  **Output** (shape):@@ -1105,7 +1105,7 @@ Load manufacturing-grade DRC into the open board (JLCPCB 2/4-layer profiles). **Example call:**  ```-adom-desktop fusion_set_design_rules '{"action": "apply", "layers": "2"}'+adom-bridge fusion_set_design_rules '{"action": "apply", "layers": "2"}' ```  **Output** (shape):@@ -1134,7 +1134,7 @@ Load a bundled .edru design-rule set into the board. **Example call:**  ```-adom-desktop fusion_load_design_rules '{}'+adom-bridge fusion_load_design_rules '{}' ```  **Output** (shape):@@ -1156,7 +1156,7 @@ Detect 2-layer vs 4-layer board (ULP + CAM comparison). **Example call:**  ```-adom-desktop fusion_detect_layers '{}'+adom-bridge fusion_detect_layers '{}' ```  **Output** (shape):@@ -1179,7 +1179,7 @@ Detect + classify (and optionally dismiss) blocking Fusion dialogs. **Example call:**  ```-adom-desktop fusion_dismiss_blocking_dialogs '{}'+adom-bridge fusion_dismiss_blocking_dialogs '{}' ```  **Output** (shape):@@ -1207,7 +1207,7 @@ Run an EAGLE/Electron command in the open board (the generic extension point, e. **Example call:**  ```-adom-desktop fusion_electron_run '{"command": "set confirm yes;RUN 'C:/tmp/jlcpcb_smta_exporter.ulp' 'C:/tmp/jlc'"}'+adom-bridge fusion_electron_run '{"command": "set confirm yes;RUN 'C:/tmp/jlcpcb_smta_exporter.ulp' 'C:/tmp/jlc'"}' ```  **Output** (shape):@@ -1239,7 +1239,7 @@ Smoothly ZOOM the schematic/2D board for a recording (the whole motion is one ca **Example call:**  ```-adom-desktop fusion_electron_zoom '{"factor": 3, "steps": 20}'+adom-bridge fusion_electron_zoom '{"factor": 3, "steps": 20}' ```  **Output** (shape):@@ -1273,7 +1273,7 @@ Smoothly PAN + zoom the view to frame a board-coordinate box (mm; get part posit **Example call:**  ```-adom-desktop fusion_electron_pan '{"x1": 0, "y1": 0, "x2": 10, "y2": 8}'+adom-bridge fusion_electron_pan '{"x1": 0, "y1": 0, "x2": 10, "y2": 8}' ```  **Output** (shape):@@ -1306,7 +1306,7 @@ SELECT a part (by reference designator, or x/y board mm) and surface its propert **Example call:**  ```-adom-desktop fusion_electron_select '{"name": "U1"}'+adom-bridge fusion_electron_select '{"name": "U1"}' ```  **Output** (shape):@@ -1332,7 +1332,7 @@ Self-describe every verb the bridge exposes (this list) for AD's Verbs tab + run **Example call:**  ```-adom-desktop fusion_describe '{}'+adom-bridge fusion_describe '{}' ```  **Output** (shape):
dashboard/Cargo.lockadded+142
@@ -0,0 +1,142 @@+# This file is automatically @generated by Cargo.+# It is not intended for manual editing.+version = 4++[[package]]+name = "ascii"+version = "1.1.0"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16"++[[package]]+name = "chunked_transfer"+version = "1.5.0"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "6e4de3bc4ea267985becf712dc6d9eed8b04c953b3fcfb339ebc87acd9804901"++[[package]]+name = "fusion-dashboard"+version = "1.9.42"+dependencies = [+ "serde_json",+ "tiny_http",+]++[[package]]+name = "httpdate"+version = "1.0.3"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"++[[package]]+name = "itoa"+version = "1.0.18"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"++[[package]]+name = "log"+version = "0.4.33"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad"++[[package]]+name = "memchr"+version = "2.8.3"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98"++[[package]]+name = "proc-macro2"+version = "1.0.107"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9"+dependencies = [+ "unicode-ident",+]++[[package]]+name = "quote"+version = "1.0.47"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001"+dependencies = [+ "proc-macro2",+]++[[package]]+name = "serde"+version = "1.0.229"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba"+dependencies = [+ "serde_core",+]++[[package]]+name = "serde_core"+version = "1.0.229"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48"+dependencies = [+ "serde_derive",+]++[[package]]+name = "serde_derive"+version = "1.0.229"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348"+dependencies = [+ "proc-macro2",+ "quote",+ "syn",+]++[[package]]+name = "serde_json"+version = "1.0.151"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14"+dependencies = [+ "itoa",+ "memchr",+ "serde",+ "serde_core",+ "zmij",+]++[[package]]+name = "syn"+version = "3.0.3"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3"+dependencies = [+ "proc-macro2",+ "quote",+ "unicode-ident",+]++[[package]]+name = "tiny_http"+version = "0.12.0"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "389915df6413a2e74fb181895f933386023c71110878cd0825588928e64cdc82"+dependencies = [+ "ascii",+ "chunked_transfer",+ "httpdate",+ "log",+]++[[package]]+name = "unicode-ident"+version = "1.0.24"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"++[[package]]+name = "zmij"+version = "1.0.23"+source = "registry+https://github.com/rust-lang/crates.io-index"+checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b"
docs/3d-viewer-and-export.md+3−3
@@ -6,7 +6,7 @@ STEP so a machine reads as a machine instead of a grey blob. ## The 3D PCB view  ```bash-adom-desktop fusion_show_3d_board '{}'+adom-bridge fusion_show_3d_board '{}' ```  The 3D PCB is **generated from the `.brd`** and is a leaf in the electronics chain. You cannot pull@@ -45,8 +45,8 @@ Result: about **465 KB and ~31 draw calls**. That is the difference between a pa one that hangs.  ```bash-adom-desktop fusion_export_optimized_glb '{"outputPath":"C:/tmp/board.glb","silkscreen":true}'-adom-desktop fusion_fetch_optimized_glb  '{"jobId":"..."}'   # finish a big board+adom-bridge fusion_export_optimized_glb '{"outputPath":"C:/tmp/board.glb","silkscreen":true}'+adom-bridge fusion_fetch_optimized_glb  '{"jobId":"..."}'   # finish a big board ```  It bounded-waits (`wait`, default 90s). Small boards return `complete`; big boards return
docs/aps-cloud-search.md+5−5
@@ -41,9 +41,9 @@ A card on file at Autodesk is only ever for identity verification. `fusion_aps_s ## Setup, once per company plus once per user  ```bash-adom-desktop fusion_aps_status '{}'                                  # configured? signed in?-adom-desktop fusion_aps_set_client_id '{"clientId":"..."}'           # once per company-adom-desktop fusion_aps_signin '{"profile":"chrome:[email protected]"}'   # once per user+adom-bridge fusion_aps_status '{}'                                  # configured? signed in?+adom-bridge fusion_aps_set_client_id '{"clientId":"..."}'           # once per company+adom-bridge fusion_aps_signin '{"profile":"chrome:[email protected]"}'   # once per user ```  Register a Desktop/PKCE app at [aps.autodesk.com](https://aps.autodesk.com) with the Data@@ -62,8 +62,8 @@ automation (the assistant can click Approve for you); it is never a prerequisite ## Searching  ```bash-adom-desktop fusion_aps_search '{"query":"charger","limit":10}'-adom-desktop fusion_aps_open   '{"query":"BQ25792"}'      # search then open the best match+adom-bridge fusion_aps_search '{"query":"charger","limit":10}'+adom-bridge fusion_aps_open   '{"query":"BQ25792"}'      # search then open the best match ```  `fusion_aps_search` returns name, project, hub and URN. `fusion_aps_open` resolves a name straight
docs/board-layout-2d.md+10−10
@@ -6,9 +6,9 @@ artifact a fab or assembler needs. ## Getting to the board  ```bash-adom-desktop fusion_aps_open   '{"query":"BQ25792"}'   # open the PROJECT (not the .brd)-adom-desktop fusion_show_2d_board '{}'                 # PCB editor-adom-desktop fusion_board_info '{}'                    # size, layer count, component count+adom-bridge fusion_aps_open   '{"query":"BQ25792"}'   # open the PROJECT (not the .brd)+adom-bridge fusion_show_2d_board '{}'                 # PCB editor+adom-bridge fusion_board_info '{}'                    # size, layer count, component count ```  Opening the `.brd` child directly gives an isolated view. See [schematics](schematics.md) for why.@@ -16,8 +16,8 @@ Opening the `.brd` child directly gives an isolated view. See [schematics](schem ## Design rules  ```bash-adom-desktop fusion_load_design_rules '{}'                       # what is loaded now-adom-desktop fusion_set_design_rules  '{"preset":"adom"}'        # apply Adom's DRU+adom-bridge fusion_load_design_rules '{}'                       # what is loaded now+adom-bridge fusion_set_design_rules  '{"preset":"adom"}'        # apply Adom's DRU ```  Adom's DRU rules ship with the bridge under `resources/`. Applying a house ruleset before routing is@@ -44,8 +44,8 @@ which is where `fusion_electron_run` commands act. Fusion Electronics is EAGLE underneath, so routing is driven with EAGLE commands:  ```bash-adom-desktop fusion_electron_run '{"command":"RATSNEST;"}'-adom-desktop fusion_electron_run '{"command":"AUTO ;"}'      # autoroute+adom-bridge fusion_electron_run '{"command":"RATSNEST;"}'+adom-bridge fusion_electron_run '{"command":"AUTO ;"}'      # autoroute ```  `fusion_execute_text_command` is **space-delimited**. Note the space in `AUTO ;`.@@ -63,9 +63,9 @@ JLCPCB CAM jobs ship with the bridge in `resources/`, so gerbers come out in the rather than a generic set you have to fix.  ```bash-adom-desktop fusion_export_gerbers '{"outputPath":"C:/tmp/fab"}'-adom-desktop fusion_export_bom     '{"outputPath":"C:/tmp/bom.csv"}'-adom-desktop fusion_export_cpl     '{"outputPath":"C:/tmp/cpl.csv"}'+adom-bridge fusion_export_gerbers '{"outputPath":"C:/tmp/fab"}'+adom-bridge fusion_export_bom     '{"outputPath":"C:/tmp/bom.csv"}'+adom-bridge fusion_export_cpl     '{"outputPath":"C:/tmp/cpl.csv"}' ```  ### `fusion_export_bom` is electronics-only
docs/electronics-libraries.md+6−6
@@ -34,7 +34,7 @@ reaches a board: ## Opening and inspecting  ```bash-adom-desktop fusion_open_lbr '{"lbrPath":"C:/tmp/AdomBasicParts.lbr"}'+adom-bridge fusion_open_lbr '{"lbrPath":"C:/tmp/AdomBasicParts.lbr"}' ```  `.lbr` is the EAGLE library format Fusion Electronics uses.@@ -42,7 +42,7 @@ adom-desktop fusion_open_lbr '{"lbrPath":"C:/tmp/AdomBasicParts.lbr"}' ## Generating packages  ```bash-adom-desktop fusion_generate_package '{"package":"R_4k7", ...}'+adom-bridge fusion_generate_package '{"package":"R_4k7", ...}' ```  `fusion_generate_package` builds a parametric IPC package, including laser-etched markings, rather@@ -52,13 +52,13 @@ library. ## 3D packages  ```bash-adom-desktop fusion_make_3d_package   '{...}'      # build one-adom-desktop fusion_attach_3d_package '{...}'      # bind it to a footprint-adom-desktop fusion_build_library_3d  '{"lbrPath":"C:/tmp/newlib/AdomBasicParts2.lbr",+adom-bridge fusion_make_3d_package   '{...}'      # build one+adom-bridge fusion_attach_3d_package '{...}'      # bind it to a footprint+adom-bridge fusion_build_library_3d  '{"lbrPath":"C:/tmp/newlib/AdomBasicParts2.lbr",                                         "parts":[{"package":"R_4k7",                                                   "lbrPath":"C:/tmp/newlib/R_4k7.lbr",                                                   "modelPath":"C:/tmp/newlib/R_4k7.step"}]}'-adom-desktop fusion_capture_library_views '{...}'  # render views for a wiki page+adom-bridge fusion_capture_library_views '{...}'  # render views for a wiki page ```  `fusion_build_library_3d` is the batch path: hand it a list of parts with their STEP models and it
docs/fusion-mcp-server.md+1−1
@@ -80,7 +80,7 @@ Off by default, and there is **no API for the toggle** (verified by enumerating The bridge turns it on by driving the Preferences UI:  ```bash-adom-desktop fusion_mcp_enable '{}'+adom-bridge fusion_mcp_enable '{}' ```  which opens Preferences, expands General, selects API, ticks
docs/fusion-preferences.md+4−4
@@ -60,10 +60,10 @@ appear. None of these are in the UIA tree. ## Using it  ```bash-adom-bridge-cli fusion_prefs_open  '{"section":"api"}'   # opens + navigates + screenshots+adom-bridge fusion_prefs_open  '{"section":"api"}'   # opens + navigates + screenshots # LOOK at the returned screenshot, then click any control:-adom-bridge-cli desktop_click '{"space":"image","shotId":"<from response>","x":690,"y":476,"hwnd":<hwnd>}'-adom-bridge-cli fusion_prefs_close '{"save":true}'       # Apply + OK+adom-bridge desktop_click '{"space":"image","shotId":"<from response>","x":690,"y":476,"hwnd":<hwnd>}'+adom-bridge fusion_prefs_close '{"save":true}'       # Apply + OK ```  `fusion_prefs_open` returns `shotId`, `imageWidth`, `imageHeight`, `screenshot` and `knownSections`.@@ -84,7 +84,7 @@ correct. Always finish with `fusion_prefs_close {"save":true}`. That whole flow is wrapped as one verb, and it is the model for automating any other preference:  ```bash-adom-bridge-cli fusion_mcp_enable '{}'+adom-bridge fusion_mcp_enable '{}' ```  which opens Preferences, expands General, selects API, ticks the box, clicks Apply then OK, and
docs/mechanical-bom.md+6−6
@@ -42,8 +42,8 @@ Structured, kit-aware BOM for the active assembly. Recurses organizational subas stops at a physical part or a purchased kit.  ```bash-adom-desktop fusion_assembly_bom '{}'-adom-desktop fusion_assembly_bom '{"treatAsUnit":["with fasteners","bearing unit"],+adom-bridge fusion_assembly_bom '{}'+adom-bridge fusion_assembly_bom '{"treatAsUnit":["with fasteners","bearing unit"],                                    "outputPath":"C:/tmp/bom.csv"}' ``` @@ -67,8 +67,8 @@ Per-component volume, mass, density, area and center of mass, read directly rath modeling script.  ```bash-adom-desktop fusion_physical_properties '{}'-adom-desktop fusion_physical_properties '{"names":["Bracket A","Idler"],"accuracy":"high"}'+adom-bridge fusion_physical_properties '{}'+adom-bridge fusion_physical_properties '{"names":["Bracket A","Idler"],"accuracy":"high"}' ```  | arg | meaning |@@ -95,10 +95,10 @@ the work is still running on the bridge; poll rather than treating it as failure  ```bash # 1. structured parts list, CSV for purchasing-adom-desktop fusion_assembly_bom '{"outputPath":"C:/tmp/bom.csv"}'+adom-bridge fusion_assembly_bom '{"outputPath":"C:/tmp/bom.csv"}'  # 2. volumes only for the printed parts, to price filament-adom-desktop fusion_physical_properties '{"names":["Spool Holder","Guide Block"]}'+adom-bridge fusion_physical_properties '{"names":["Spool Holder","Guide Block"]}' ```  That is the shape BOM Forge uses: the BOM for quantities, targeted physical properties for the
docs/schematics.md+5−5
@@ -20,8 +20,8 @@ derivatives (`DesignProductType`), not the project. The open verbs reprimand you `_hint` when the file you opened is not an `EcadDesignProductType`.  ```bash-adom-desktop fusion_aps_open '{"query":"BQ25792"}'    # resolves + opens the project-adom-desktop fusion_show_schematic '{}'               # switch to the schematic editor+adom-bridge fusion_aps_open '{"query":"BQ25792"}'    # resolves + opens the project+adom-bridge fusion_show_schematic '{}'               # switch to the schematic editor ```  Below is a real Adom board's schematic, the BME690 environmental-sensor Molecule, open in the Fusion@@ -54,7 +54,7 @@ So this verb fires Fusion's own `ImportSCHAndBRDCmd` and drives both native Open then the `.brd`) **in the background** with UIA by accessible name, no foreground steal.  ```bash-adom-desktop fusion_new_electronics_from_eagle '{+adom-bridge fusion_new_electronics_from_eagle '{   "schPath":"C:/Users/me/adom-lib/MyBoard.sch",   "brdPath":"C:/Users/me/adom-lib/MyBoard.brd" }'@@ -71,8 +71,8 @@ no-op as success. Fusion Electronics is EAGLE underneath, so it takes EAGLE commands:  ```bash-adom-desktop fusion_electron_run '{"command":"GRID MM 1;"}'-adom-desktop fusion_execute_text_command '{"command":"Commands.Start ..."}'+adom-bridge fusion_electron_run '{"command":"GRID MM 1;"}'+adom-bridge fusion_execute_text_command '{"command":"Commands.Start ..."}' ```  `fusion_execute_text_command` is **space-delimited**, which trips people up.
docs/sign-in-and-updates.md+8−8
@@ -6,10 +6,10 @@ without interrupting the person using the machine. ## Lifecycle  ```bash-adom-desktop fusion_readiness '{}'   # installed? running? ready? (never launches)-adom-desktop fusion_start '{}'       # launch + wait for the add-in-adom-desktop fusion_stop  '{}'       # graceful close-adom-desktop fusion_kill  '{}'       # force-kill a wedged session+adom-bridge fusion_readiness '{}'   # installed? running? ready? (never launches)+adom-bridge fusion_start '{}'       # launch + wait for the add-in+adom-bridge fusion_stop  '{}'       # graceful close+adom-bridge fusion_kill  '{}'       # force-kill a wedged session ```  `fusion_readiness` is the verb to poll. It live-detects on **every** call rather than trusting a@@ -25,7 +25,7 @@ Fusion fires its OAuth at the **OS-default browser**. If your Autodesk seat live Chrome profile (work vs personal), Fusion signs into the wrong account or stalls.  ```bash-adom-desktop fusion_signin '{"profile":"chrome:[email protected]"}'+adom-bridge fusion_signin '{"profile":"chrome:[email protected]"}' ```  What it does: reads the full authorize URL (client_id, PKCE, state, request_id) out of the browser's@@ -60,7 +60,7 @@ If Autodesk demands a password with no saved credential, that is a genuine wall. way to proceed. For an emailed 6-digit code:  ```bash-adom-desktop fusion_signin_2fa '{"code":"123456"}'+adom-bridge fusion_signin_2fa '{"code":"123456"}' ```  which types it via background UIA. If `adom-google` is available, read the code out of Gmail and@@ -95,8 +95,8 @@ The bridge clicks it **for you, in the background**, so you never see it. Fusion to the new build on the next launch.  ```bash-adom-desktop fusion_set_auto_update '{}'                  # read current setting-adom-desktop fusion_set_auto_update '{"enabled":false}'   # opt out, STICKY+adom-bridge fusion_set_auto_update '{}'                  # read current setting+adom-bridge fusion_set_auto_update '{"enabled":false}'   # opt out, STICKY ```  On by default for everyone. Opting out persists to `~/.adom/fusion-bridge/prefs.json` and is
examples/ADS8588SIPM.fusion.lbr+70−70
@@ -135,76 +135,76 @@ </packages3d> <symbols> <symbol name="ADS8588SIPM">-  <wire x1="2.54" y1="22.86" x2="53.34" y2="22.86" width="0.254" layer="94"/>-  <wire x1="53.34" y1="22.86" x2="53.34" y2="-63.5" width="0.254" layer="94"/>-  <wire x1="53.34" y1="-63.5" x2="2.54" y2="-63.5" width="0.254" layer="94"/>-  <wire x1="2.54" y1="-63.5" x2="2.54" y2="22.86" width="0.254" layer="94"/>-  <text x="0" y="25.4" size="1.27" layer="95" align="bottom-center">&gt;NAME</text>-  <text x="0" y="-66.04" size="1.27" layer="96" align="top-center">&gt;VALUE</text>-  <pin name="AVDD_1" x="0" y="0" length="middle" direction="io"/>-  <pin name="AGND_1" x="0" y="-2.54" length="middle" direction="io"/>-  <pin name="OS0" x="0" y="-5.08" length="middle" direction="io"/>-  <pin name="OS1" x="0" y="-7.62" length="middle" direction="io"/>-  <pin name="OS2" x="0" y="-10.16" length="middle" direction="io"/>-  <pin name="!PAR!/SER/BYTE_SEL" x="0" y="-12.7" length="middle" direction="io"/>-  <pin name="!STBY" x="0" y="-15.24" length="middle" direction="io"/>-  <pin name="RANGE" x="0" y="-17.78" length="middle" direction="io"/>-  <pin name="CONVSTA" x="0" y="-20.32" length="middle" direction="io"/>-  <pin name="CONVSTB" x="0" y="-22.86" length="middle" direction="io"/>-  <pin name="RESET" x="0" y="-25.4" length="middle" direction="io"/>-  <pin name="!RD!/SCLK" x="0" y="-27.94" length="middle" direction="io"/>-  <pin name="!CS" x="0" y="-30.48" length="middle" direction="io"/>-  <pin name="BUSY" x="0" y="-33.02" length="middle" direction="io"/>-  <pin name="FRSTDATA" x="0" y="-35.56" length="middle" direction="io"/>-  <pin name="DB0" x="0" y="-38.1" length="middle" direction="io"/>-  <pin name="DB1" x="7.62" y="-60.96" length="middle" direction="io" rot="R90"/>-  <pin name="DB2" x="10.16" y="-60.96" length="middle" direction="io" rot="R90"/>-  <pin name="DB3" x="12.7" y="-60.96" length="middle" direction="io" rot="R90"/>-  <pin name="DB4" x="15.24" y="-60.96" length="middle" direction="io" rot="R90"/>-  <pin name="DB5" x="17.78" y="-60.96" length="middle" direction="io" rot="R90"/>-  <pin name="DB6" x="20.32" y="-60.96" length="middle" direction="io" rot="R90"/>-  <pin name="DVDD" x="22.86" y="-60.96" length="middle" direction="io" rot="R90"/>-  <pin name="DB7/DOUTA" x="25.4" y="-60.96" length="middle" direction="io" rot="R90"/>-  <pin name="DB8/DOUTB" x="27.94" y="-60.96" length="middle" direction="io" rot="R90"/>-  <pin name="AGND_2" x="30.48" y="-60.96" length="middle" direction="io" rot="R90"/>-  <pin name="DB9" x="33.02" y="-60.96" length="middle" direction="io" rot="R90"/>-  <pin name="DB10" x="35.56" y="-60.96" length="middle" direction="io" rot="R90"/>-  <pin name="DB11" x="38.1" y="-60.96" length="middle" direction="io" rot="R90"/>-  <pin name="DB12" x="40.64" y="-60.96" length="middle" direction="io" rot="R90"/>-  <pin name="DB13" x="43.18" y="-60.96" length="middle" direction="io" rot="R90"/>-  <pin name="DB14/HBEN" x="45.72" y="-60.96" length="middle" direction="io" rot="R90"/>-  <pin name="AVDD_4" x="55.88" y="0" length="middle" direction="io" rot="R180"/>-  <pin name="AGND_6" x="55.88" y="-2.54" length="middle" direction="io" rot="R180"/>-  <pin name="REFGND_2" x="55.88" y="-5.08" length="middle" direction="io" rot="R180"/>-  <pin name="REFCAPB" x="55.88" y="-7.62" length="middle" direction="io" rot="R180"/>-  <pin name="REFCAPA" x="55.88" y="-10.16" length="middle" direction="io" rot="R180"/>-  <pin name="REFGND_1" x="55.88" y="-12.7" length="middle" direction="io" rot="R180"/>-  <pin name="REFIN/REFOUT" x="55.88" y="-15.24" length="middle" direction="io" rot="R180"/>-  <pin name="AGND_5" x="55.88" y="-17.78" length="middle" direction="io" rot="R180"/>-  <pin name="AGND_4" x="55.88" y="-20.32" length="middle" direction="io" rot="R180"/>-  <pin name="REGCAP2" x="55.88" y="-22.86" length="middle" direction="io" rot="R180"/>-  <pin name="AVDD_3" x="55.88" y="-25.4" length="middle" direction="io" rot="R180"/>-  <pin name="AVDD_2" x="55.88" y="-27.94" length="middle" direction="io" rot="R180"/>-  <pin name="REGCAP1" x="55.88" y="-30.48" length="middle" direction="io" rot="R180"/>-  <pin name="AGND_3" x="55.88" y="-33.02" length="middle" direction="io" rot="R180"/>-  <pin name="REFSEL" x="55.88" y="-35.56" length="middle" direction="io" rot="R180"/>-  <pin name="DB15/BYTE_SEL" x="55.88" y="-38.1" length="middle" direction="io" rot="R180"/>-  <pin name="AIN_8GND" x="7.62" y="20.32" length="middle" direction="io" rot="R270"/>-  <pin name="AIN_8P" x="10.16" y="20.32" length="middle" direction="io" rot="R270"/>-  <pin name="AIN_7GND" x="12.7" y="20.32" length="middle" direction="io" rot="R270"/>-  <pin name="AIN_7P" x="15.24" y="20.32" length="middle" direction="io" rot="R270"/>-  <pin name="AIN_6GND" x="17.78" y="20.32" length="middle" direction="io" rot="R270"/>-  <pin name="AIN_6P" x="20.32" y="20.32" length="middle" direction="io" rot="R270"/>-  <pin name="AIN_5GND" x="22.86" y="20.32" length="middle" direction="io" rot="R270"/>-  <pin name="AIN_5P" x="25.4" y="20.32" length="middle" direction="io" rot="R270"/>-  <pin name="AIN_4GND" x="27.94" y="20.32" length="middle" direction="io" rot="R270"/>-  <pin name="AIN_4P" x="30.48" y="20.32" length="middle" direction="io" rot="R270"/>-  <pin name="AIN_3GND" x="33.02" y="20.32" length="middle" direction="io" rot="R270"/>-  <pin name="AIN_3P" x="35.56" y="20.32" length="middle" direction="io" rot="R270"/>-  <pin name="AIN_2GND" x="38.1" y="20.32" length="middle" direction="io" rot="R270"/>-  <pin name="AIN_2P" x="40.64" y="20.32" length="middle" direction="io" rot="R270"/>-  <pin name="AIN_1GND" x="43.18" y="20.32" length="middle" direction="io" rot="R270"/>-  <pin name="AIN_1P" x="45.72" y="20.32" length="middle" direction="io" rot="R270"/>+<wire x1="-25.4" y1="2.54" x2="25.4" y2="2.54" width="0.254" layer="94"/>+<wire x1="25.4" y1="2.54" x2="25.4" y2="-104.14" width="0.254" layer="94"/>+<wire x1="25.4" y1="-104.14" x2="-25.4" y2="-104.14" width="0.254" layer="94"/>+<wire x1="-25.4" y1="-104.14" x2="-25.4" y2="2.54" width="0.254" layer="94"/>+<text x="-25.4" y="3.81" size="1.778" layer="95">&gt;NAME</text>+<text x="-25.4" y="-107.188" size="1.778" layer="96">&gt;VALUE</text>+<pin name="AIN_1P" x="-30.48" y="0.0" length="middle" direction="io"/>+<pin name="AIN_1GND" x="-30.48" y="-2.54" length="middle" direction="io"/>+<pin name="AIN_2P" x="-30.48" y="-5.08" length="middle" direction="io"/>+<pin name="AIN_2GND" x="-30.48" y="-7.62" length="middle" direction="io"/>+<pin name="AIN_3P" x="-30.48" y="-10.16" length="middle" direction="io"/>+<pin name="AIN_3GND" x="-30.48" y="-12.7" length="middle" direction="io"/>+<pin name="AIN_4P" x="-30.48" y="-15.24" length="middle" direction="io"/>+<pin name="AIN_4GND" x="-30.48" y="-17.78" length="middle" direction="io"/>+<pin name="AIN_5P" x="-30.48" y="-20.32" length="middle" direction="io"/>+<pin name="AIN_5GND" x="-30.48" y="-22.86" length="middle" direction="io"/>+<pin name="AIN_6P" x="-30.48" y="-25.4" length="middle" direction="io"/>+<pin name="AIN_6GND" x="-30.48" y="-27.94" length="middle" direction="io"/>+<pin name="AIN_7P" x="-30.48" y="-30.48" length="middle" direction="io"/>+<pin name="AIN_7GND" x="-30.48" y="-33.02" length="middle" direction="io"/>+<pin name="AIN_8P" x="-30.48" y="-35.56" length="middle" direction="io"/>+<pin name="AIN_8GND" x="-30.48" y="-38.1" length="middle" direction="io"/>+<pin name="REFIN/REFOUT" x="-30.48" y="-43.18" length="middle" direction="io"/>+<pin name="REFCAPA" x="-30.48" y="-45.72" length="middle" direction="io"/>+<pin name="REFCAPB" x="-30.48" y="-48.26" length="middle" direction="io"/>+<pin name="REFGND_1" x="-30.48" y="-50.8" length="middle" direction="io"/>+<pin name="REFGND_2" x="-30.48" y="-53.34" length="middle" direction="io"/>+<pin name="REFSEL" x="-30.48" y="-55.88" length="middle" direction="io"/>+<pin name="OS0" x="-30.48" y="-60.96" length="middle" direction="io"/>+<pin name="OS1" x="-30.48" y="-63.5" length="middle" direction="io"/>+<pin name="OS2" x="-30.48" y="-66.04" length="middle" direction="io"/>+<pin name="RANGE" x="-30.48" y="-68.58" length="middle" direction="io"/>+<pin name="AVDD_1" x="-30.48" y="-73.66" length="middle" direction="io"/>+<pin name="AVDD_2" x="-30.48" y="-76.2" length="middle" direction="io"/>+<pin name="AVDD_3" x="-30.48" y="-78.74" length="middle" direction="io"/>+<pin name="AVDD_4" x="-30.48" y="-81.28" length="middle" direction="io"/>+<pin name="AGND_1" x="-30.48" y="-83.82000000000001" length="middle" direction="io"/>+<pin name="AGND_2" x="-30.48" y="-86.36" length="middle" direction="io"/>+<pin name="AGND_3" x="-30.48" y="-88.9" length="middle" direction="io"/>+<pin name="AGND_4" x="-30.48" y="-91.44" length="middle" direction="io"/>+<pin name="AGND_5" x="-30.48" y="-93.98" length="middle" direction="io"/>+<pin name="AGND_6" x="-30.48" y="-96.52" length="middle" direction="io"/>+<pin name="REGCAP1" x="-30.48" y="-99.06" length="middle" direction="io"/>+<pin name="REGCAP2" x="-30.48" y="-101.6" length="middle" direction="io"/>+<pin name="DB0" x="30.48" y="0.0" length="middle" direction="io" rot="R180"/>+<pin name="DB1" x="30.48" y="-2.54" length="middle" direction="io" rot="R180"/>+<pin name="DB2" x="30.48" y="-5.08" length="middle" direction="io" rot="R180"/>+<pin name="DB3" x="30.48" y="-7.62" length="middle" direction="io" rot="R180"/>+<pin name="DB4" x="30.48" y="-10.16" length="middle" direction="io" rot="R180"/>+<pin name="DB5" x="30.48" y="-12.7" length="middle" direction="io" rot="R180"/>+<pin name="DB6" x="30.48" y="-15.24" length="middle" direction="io" rot="R180"/>+<pin name="DB7/DOUTA" x="30.48" y="-17.78" length="middle" direction="io" rot="R180"/>+<pin name="DB8/DOUTB" x="30.48" y="-20.32" length="middle" direction="io" rot="R180"/>+<pin name="DB9" x="30.48" y="-22.86" length="middle" direction="io" rot="R180"/>+<pin name="DB10" x="30.48" y="-25.4" length="middle" direction="io" rot="R180"/>+<pin name="DB11" x="30.48" y="-27.94" length="middle" direction="io" rot="R180"/>+<pin name="DB12" x="30.48" y="-30.48" length="middle" direction="io" rot="R180"/>+<pin name="DB13" x="30.48" y="-33.02" length="middle" direction="io" rot="R180"/>+<pin name="DB14/HBEN" x="30.48" y="-35.56" length="middle" direction="io" rot="R180"/>+<pin name="DB15/BYTE_SEL" x="30.48" y="-38.1" length="middle" direction="io" rot="R180"/>+<pin name="!PAR!/SER/BYTE_SEL" x="30.48" y="-43.18" length="middle" direction="io" rot="R180"/>+<pin name="!STBY" x="30.48" y="-45.72" length="middle" direction="io" rot="R180"/>+<pin name="CONVSTA" x="30.48" y="-48.26" length="middle" direction="io" rot="R180"/>+<pin name="CONVSTB" x="30.48" y="-50.8" length="middle" direction="io" rot="R180"/>+<pin name="RESET" x="30.48" y="-53.34" length="middle" direction="io" rot="R180"/>+<pin name="!RD!/SCLK" x="30.48" y="-55.88" length="middle" direction="io" rot="R180"/>+<pin name="!CS" x="30.48" y="-58.42" length="middle" direction="io" rot="R180"/>+<pin name="BUSY" x="30.48" y="-60.96" length="middle" direction="io" rot="R180"/>+<pin name="FRSTDATA" x="30.48" y="-63.5" length="middle" direction="io" rot="R180"/>+<pin name="DVDD" x="30.48" y="-68.58" length="middle" direction="io" rot="R180"/> </symbol> </symbols> <devicesets>
package.json+1−1
@@ -1,5 +1,5 @@ {-  "slug": "adom-desktop-fusion-bridge",+  "slug": "fusion-bridge",   "version": "1.9.42",   "type": "app",   "description": "This package installs the bridge's SKILLS into your container so your AI knows how to drive it; Adom Bridge loads the bridge runtime itself from the release zip.",
page.json+7−10
@@ -4,17 +4,13 @@   "type": "app",   "description": "This package installs the bridge's SKILLS into your container so your AI knows how to drive it; Adom Bridge loads the bridge runtime itself from the release zip.",   "dependencies": {-    "adom/adom-desktop": "^1.9.0"+    "adom/adom-desktop": "*"   },   "scripts": {     "install": "./install.sh",     "uninstall": "./uninstall.sh"   },   "tags": [-    "ab",-    "bridge",-    "fusion",-    "desktop-app",     "fusion360",     "autodesk",     "cad",@@ -74,10 +70,7 @@     "build a basic parts library",     "add a 3d model to a component",     "make a fusion 360 library with 3d",-    "set up the fusion bridge",-    "fusion dashboard",-    "fusion status page",-    "open the fusion launch page"+    "set up the fusion bridge"   ],   "discovery_pitch": "Use the Adom Bridge Fusion 360 bridge when the user wants to DRIVE Autodesk Fusion 360 from the cloud: open/search their team's Fusion cloud designs, lay out a PCB or do electronics, export STEP/IGES/STL/Gerbers/BOM, or build a component library with real rendering 3D. It runs Fusion on the user's own machine via Adom Bridge. NOT for web/browser/login/form-filling (that's the native-browser extension) and NOT for KiCad (that's the kicad bridge).",   "brief": "Drive Autodesk Fusion 360 from the cloud via Adom Bridge: component libraries, IPC package generation, board layout, exports (STEP/Gerbers/BOM/CPL), fast APS cloud search, and parametric modeling.",@@ -106,5 +99,9 @@       "label": "Part volume",       "prompt": "How much material does each printed part in this assembly use?"     }-  ]+  ],+  "author": {+    "name": "John Lauer",+    "email": "[email protected]"+  } }\ No newline at end of file
screenshots/lib2-12part-library.pngadded
⋯ 1 unchanged line ⋯
screenshots/lib2-atsamd-chip.pngadded
⋯ 1 unchanged line ⋯
screenshots/lib2-component.pngadded
⋯ 1 unchanged line ⋯
screenshots/lib2-esp32-chip.pngadded
⋯ 1 unchanged line ⋯
screenshots/lib2-esp32-footprint.pngadded
⋯ 1 unchanged line ⋯
screenshots/lib2-footprint-editor.pngadded
⋯ 1 unchanged line ⋯
screenshots/lib2-symbol.pngadded
⋯ 1 unchanged line ⋯
screenshots/lib3-138-overview.pngadded
⋯ 1 unchanged line ⋯
screenshots/lib3-cap-3d.pngadded
⋯ 1 unchanged line ⋯
screenshots/lib3-resistor-3d.pngadded
⋯ 1 unchanged line ⋯
skills/fusion-aps-search/SKILL.md+1−1
@@ -105,7 +105,7 @@ for cloud search, ever — no matter how blocked you feel.  **Auto-recover APS (do this instead of giving up):** 1. **Not configured?** The org Client ID is a **public PKCE identifier** (no secret) — pull it from a-   peer that already has it: `adom-desktop status` lists connected desktops; read+   peer that already has it: `adom-bridge status` lists connected desktops; read    `~/.adom/fusion-aps/config.json` (key `client_id`) off one via `shell_execute`/`pull_file`, then    `fusion_aps_set_client_id {clientId}`. 2. **Sign in:** `fusion_aps_signin` → open the returned `authUrl` in the user's REAL browser with a warm
skills/fusion-aps-signin/SKILL.md+7−7
@@ -11,7 +11,7 @@ part is Autodesk's **email OTP**, which **expires fast** — the user may walk a cup of coffee"), so you must **monitor** the flow and turn the code around in seconds.  All browser steps use the native-browser extension verbs (`nbrowser_*`) against the-AD-connected laptop: `adom-desktop --target <laptop> nbrowser_* '{...}'`.+AD-connected laptop: `adom-bridge --target <laptop> nbrowser_* '{...}'`.  ## Working principles (non-negotiable) @@ -50,9 +50,9 @@ AD-connected laptop: `adom-desktop --target <laptop> nbrowser_* '{...}'`.  ### 1. Open + foreground a dedicated window at the APS portal ```-adom-desktop --target <laptop> nbrowser_open_window '{"url":"https://aps.autodesk.com/myapps/"}'+adom-bridge --target <laptop> nbrowser_open_window '{"url":"https://aps.autodesk.com/myapps/"}' # capture sessionId (e.g. s29) from the result; use it in EVERY later call-adom-desktop --target <laptop> desktop_bring_to_front '{...the browser window...}'   # so the user sees it+adom-bridge --target <laptop> desktop_bring_to_front '{...the browser window...}'   # so the user sees it ``` Read state (always pass the sessionId): ```@@ -191,10 +191,10 @@ Create App → enable **Data Management API** → **Callback URL = EXACTLY) → create → copy the **Client ID** (PKCE = public client; the secret is unused). Then: ```-adom-desktop --target <laptop> fusion_aps_set_client_id '{"clientId":"<CLIENT_ID>"}'-adom-desktop --target <laptop> fusion_aps_signin '{}'      # opens browser; bg listener on :8917 stores the token+adom-bridge --target <laptop> fusion_aps_set_client_id '{"clientId":"<CLIENT_ID>"}'+adom-bridge --target <laptop> fusion_aps_signin '{}'      # opens browser; bg listener on :8917 stores the token # poll fusion_aps_status until {"data":{"signedIn":true,"tokenLive":true}}-adom-desktop --target <laptop> fusion_aps_search '{"query":"<part name>"}'+adom-bridge --target <laptop> fusion_aps_search '{"query":"<part name>"}' ```  ## LIVE-VERIFIED end-to-end run (2026-06-26, Adom org) — the exact sequence@@ -279,7 +279,7 @@ OWN browser that is ALREADY logged into Autodesk. That is what ABE (adom-browser for: it exposes `nbrowser_*` verbs that open a URL in the user's real Chrome/Edge profile.  **Recommend ABE first, and hand-hold the install if it's missing:**-1. Check: does `adom-desktop --target <laptop> nbrowser_readiness '{}'` succeed? If not, ABE isn't+1. Check: does `adom-bridge --target <laptop> nbrowser_readiness '{}'` succeed? If not, ABE isn't    installed. 2. Tell the user (honestly): "The smoothest Autodesk sign-in drives your own Chrome/Edge that's    already logged in, no password typing, no OTP races. That needs the Adom Browser Extension
skills/fusion-build-parts-library/SKILL.md+1−1
@@ -91,7 +91,7 @@ exports STEP in ONE call. Params are datasheet **mm** (auto-converted). markings are separate `Marking` bodies (white in Fusion and in the colored STEP).  ```bash-adom-desktop fusion_generate_package '{"type":"soic","params":{"DPins":8,"D":4.9,"E":6.0,"E1":3.9,"e":1.27,"A":1.6,"A1":0.1,"b":0.41,"L":0.84},"etch":"LM358","outputStep":"C:/tmp/ADOM-LM358-SOIC8.step"}'+adom-bridge fusion_generate_package '{"type":"soic","params":{"DPins":8,"D":4.9,"E":6.0,"E1":3.9,"e":1.27,"A":1.6,"A1":0.1,"b":0.41,"L":0.84},"etch":"LM358","outputStep":"C:/tmp/ADOM-LM358-SOIC8.step"}' ```  Read the verb's `_hint` on every call - it carries the band/margin/contrast rules and the per-family
skills/fusion-driving/SKILL.md+1−1
@@ -69,7 +69,7 @@ delete bodies out of it (a real near-miss, issue #289). So across a multi-step m **`expectDocument`** with the name you expect to be active:  ```bash-adom-bridge-cli fusion_run_modeling_script '{"script":"...","expectDocument":"Monitor arms v1"}'+adom-bridge fusion_run_modeling_script '{"script":"...","expectDocument":"Monitor arms v1"}' ```  If the active document is not that, the bridge refuses **before executing** and returns
skills/fusion-eagle-commands/SKILL.md+4−4
@@ -1,13 +1,13 @@ --- name: fusion-eagle-commands-description: EAGLE command reference for Fusion 360 Electronics via fusion_electron_run. Use when driving the Fusion Electronics / PCB workspace through the Adom Desktop Fusion 360 bridge — the EAGLE-syntax commands (DRC, ROUTE, RATSNEST, DISPLAY, GRID, etc.) you pass to fusion_electron_run, and which ones BLOCK (ADD/SHOW/MOVE/WRITE/EDIT) vs are safe. Trigger words - eagle command, fusion_electron_run, electron run, DRC, ERC, RATSNEST, RIPUP, DISPLAY layers, WINDOW FIT, eagle layers, blocking command, WRITE blocks, export eagle source, eagle script.+description: EAGLE command reference for Fusion 360 Electronics via fusion_electron_run. Use when driving the Fusion Electronics / PCB workspace through the Adom Bridge Fusion 360 bridge — the EAGLE-syntax commands (DRC, ROUTE, RATSNEST, DISPLAY, GRID, etc.) you pass to fusion_electron_run, and which ones BLOCK (ADD/SHOW/MOVE/WRITE/EDIT) vs are safe. Trigger words - eagle command, fusion_electron_run, electron run, DRC, ERC, RATSNEST, RIPUP, DISPLAY layers, WINDOW FIT, eagle layers, blocking command, WRITE blocks, export eagle source, eagle script. ---  # EAGLE Commands for `fusion_electron_run` -> **Owned by the `adom-desktop-fusion-bridge` skill package.** This reference is Fusion-Electronics-> specific, so it ships here (you get it via `adom-wiki pkg install adom/adom-desktop-fusion-bridge`),-> not the adom-desktop core package. Companion skill: `fusion-electronics` (driving the editor).+> **Owned by the `fusion-bridge` skill package.** This reference is Fusion-Electronics+> specific, so it ships here (you get it via `adom-wiki pkg install adom/fusion-bridge`),+> not the adom-bridge core package. Companion skill: `fusion-electronics` (driving the editor).  Fusion's Electronics workspace is built on EAGLE. `fusion_electron_run` sends a text command through the same interface EAGLE's command line uses. 
skills/fusion-electronics/SKILL.md+3−3
@@ -45,19 +45,19 @@ one call = one smooth move, a repaint per frame (the 2D analogue of `vp.refresh(  ### Zoom (schematic / 2D board) `fusion_electron_zoom {factor, steps?, frameDelayMs?}` - `factor>1` zooms in, `<1` out; or `{fit:true}`.-  e.g. `adom-desktop fusion_electron_zoom '{"factor":3,"steps":20}'` (smooth zoom in over 20 frames).+  e.g. `adom-bridge fusion_electron_zoom '{"factor":3,"steps":20}'` (smooth zoom in over 20 frames).  ### Pan + frame a region (or a part) `fusion_electron_pan {x1,y1,x2,y2, steps?, frameDelayMs?}` - glide+zoom to a board-coordinate box (mm). Animates from where the view last was. Get part coordinates from `fusion_board_info` or the CPL export (`fusion_export_cpl` gives every part's Mid X / Mid Y) - frame a small box around a part to "go to" it.-  e.g. `adom-desktop fusion_electron_pan '{"x1":10,"y1":15,"x2":22,"y2":38,"steps":16}'`.+  e.g. `adom-bridge fusion_electron_pan '{"x1":10,"y1":15,"x2":22,"y2":38,"steps":16}'`.  ### Select a part + surface its properties `fusion_electron_select {name}` (reference designator) or `{x,y}` (board mm) - selects the part the way clicking it reveals the properties panel, and returns its device info. (Select highlights; pair with `fusion_electron_pan` to also center on it - the "select chip -> zoom to it" tour.)-  e.g. `adom-desktop fusion_electron_select '{"name":"U1"}'`.+  e.g. `adom-bridge fusion_electron_select '{"name":"U1"}'`.  ### Orbit / zoom the 3D PCB (Fusion camera) `fusion_show_3d_board`, then `fusion_run_modeling_script` with a camera loop: `app.activeViewport.camera`,
skills/fusion-file-search/SKILL.md+7−7
@@ -71,7 +71,7 @@ Passing `{"filePath": "Molecules/XRP/Power/BQ25792.fprj"}` fails with an unhelpf arguments come from the add-in's `handle_open_cloud_file`:  ```bash-adom-bridge-cli fusion_open_cloud_file '{+adom-bridge fusion_open_cloud_file '{   "fileName":    "BQ25792",            # required   "projectName": "Main",               # optional, defaults to the active project   "folderPath":  "Molecules/XRP/Power" # optional, defaults to the project root@@ -103,7 +103,7 @@ that route rather than guessing at names. **Use when:** you have a keyword (a name or an MPN) and no idea where the file lives.  ```bash-adom-bridge-cli fusion_aps_search '{"query":"BQ25792","limit":10}'+adom-bridge fusion_aps_search '{"query":"BQ25792","limit":10}' # Response: { "count": 9, "results": [{name, id, projectName, lastModified}, ...] } ``` @@ -135,7 +135,7 @@ adom-bridge-cli fusion_aps_search '{"query":"BQ25792","limit":10}' server query, not a local cache, and it has no time window: `limit` (default 25) is what bounds it.  ```bash-adom-bridge-cli fusion_aps_recent '{"limit":25}'+adom-bridge fusion_aps_recent '{"limit":25}' # Response: { "count": 25, "results": [{name, id, projectName, lastModified}, ...] } ``` @@ -160,11 +160,11 @@ adom-bridge-cli fusion_aps_recent '{"limit":25}'  ```bash # Browse root (hubs)-adom-bridge-cli fusion_aps_browse '{}'+adom-bridge fusion_aps_browse '{}' # Response: { "items": [{name, type:"hub"|"project"|"folder"|"file", id}, ...] }  # Browse a folder-adom-bridge-cli fusion_aps_browse '{"folderId":"urn:adsk.wipprod:fs.folder:..."}'+adom-bridge fusion_aps_browse '{"folderId":"urn:adsk.wipprod:fs.folder:..."}' # Response: same structure ``` @@ -198,7 +198,7 @@ adom-bridge-cli fusion_aps_browse '{"folderId":"urn:adsk.wipprod:fs.folder:..."}  ```bash # Query Fusion's document cache-adom-bridge-cli fusion_mcp_call '{"tool":"fusion_mcp_read", "arguments":{"queryType":"document"}}'+adom-bridge fusion_mcp_call '{"tool":"fusion_mcp_read", "arguments":{"queryType":"document"}}' # Response: { "result": { "documents": [{name, type, ...}, ...] } } ``` @@ -231,7 +231,7 @@ adom-bridge-cli fusion_mcp_call '{"tool":"fusion_mcp_read", "arguments":{"queryT **Use when:** You already have a file's URN (from a prior APS call or a saved link).  ```bash-adom-bridge-cli fusion_open_by_urn '{"urn":"urn:adsk.wipprod:fs.file:vf.DqSW..."}'+adom-bridge fusion_open_by_urn '{"urn":"urn:adsk.wipprod:fs.file:vf.DqSW..."}' # Response: { "success": true, "output": "Opened: BQ25792" } ``` 
skills/fusion-libraries/LIBRARY_FINDINGS.md+3−3
@@ -22,7 +22,7 @@ the thin 245KB `manufacturer.step`. That gave a footprint/3D size mismatch. Swit `.fusion.kicad_mod` + `-named.step` is the fix. (Convention confirmed in `chip-fetcher/src/thumbnails.rs`: it builds the lbr with `--name <mpn>.fusion` from the `.fusion` files.) -![adom-lbr's viewer: symbol | the curated 4-sided LQFP-64 footprint | the embossed 3D | pin->pad map - inspect this before touching Fusion](https://wiki.adom.inc/adom/adom-desktop-fusion-bridge/files/lib-06-adomlbr-viewer.png)+![adom-lbr's viewer: symbol | the curated 4-sided LQFP-64 footprint | the embossed 3D | pin->pad map - inspect this before touching Fusion](https://wiki.adom.inc/adom/fusion-bridge/files/lib-06-adomlbr-viewer.png)  ## 2. adom-lbr is the right tool; pass it the .fusion files @@ -131,9 +131,9 @@ package under the deviceset, the Packages panel's `Package` column flips from `P name, and the 3D preview becomes the real chip. **This is the first time the full Fusion electronics 3D attach has been automated through the bridge.** -![The real ADS8588SIPM chip imported + auto-oriented onto the matched 4-sided footprint in the Package3D environment](https://wiki.adom.inc/adom/adom-desktop-fusion-bridge/files/lib-10-ads-chip-on-footprint.png)+![The real ADS8588SIPM chip imported + auto-oriented onto the matched 4-sided footprint in the Package3D environment](https://wiki.adom.inc/adom/fusion-bridge/files/lib-10-ads-chip-on-footprint.png) -![Bound: the Content Manager shows the 3D under the package under the deviceset, and the Packages `Package` column reads the part name (not Placeholder) with the real 3D preview](https://wiki.adom.inc/adom/adom-desktop-fusion-bridge/files/lib-09-3d-bound-moneyshot.png)+![Bound: the Content Manager shows the 3D under the package under the deviceset, and the Packages `Package` column reads the part name (not Placeholder) with the real 3D preview](https://wiki.adom.inc/adom/fusion-bridge/files/lib-09-3d-bound-moneyshot.png)  The repeatable sequence (all via existing verbs): 1. Build the `.lbr` from the chip-fetcher **`.fusion`** variant (`adom-lbr generate`); footprint must be a
skills/fusion-libraries/MAKING_LIBRARIES.md+15−15
@@ -4,7 +4,7 @@ How an Adom component library is built and gets into Fusion 360 Electronics as a captured end to end on a real part (Nordic **nRF54L15**). It covers the parts that work today and the one hard step that is still being automated: attaching the real 3D chip via a Fusion cloud URN. -> Companion skill: `skills/fusion-libraries/SKILL.md`. Verb reference: [VERBS.md](https://wiki.adom.inc/adom/adom-desktop-fusion-bridge/files/VERBS.md).+> Companion skill: `skills/fusion-libraries/SKILL.md`. Verb reference: [VERBS.md](https://wiki.adom.inc/adom/fusion-bridge/files/VERBS.md).  ## Demo video @@ -14,9 +14,9 @@ source view (symbol, the 4-sided footprint, and the 3D), the library opens in Fu the cloud and reopened so the 3D binds onto the deviceset - a complete library: symbol, footprint, 3D, and deviceset. Live screen capture (WGC + the adom-lbr pup viewer), not stitched stills. -<video controls width="100%" src="https://wiki.adom.inc/api/v1/pages/adom-desktop-fusion-bridge/files/library-3d-demo.mp4"></video>+<video controls width="100%" src="https://wiki.adom.inc/api/v1/pages/fusion-bridge/files/library-3d-demo.mp4"></video> -[Watch / download the demo video](https://wiki.adom.inc/api/v1/pages/adom-desktop-fusion-bridge/files/library-3d-demo.mp4)+[Watch / download the demo video](https://wiki.adom.inc/api/v1/pages/fusion-bridge/files/library-3d-demo.mp4)  ## The pipeline @@ -47,16 +47,16 @@ push verb**, so stage the file first, then open the Windows path. # serve from the container cd <dir-with-lbr> && python3 -m http.server 8931 # download onto Windows (build the JSON in Python; Windows paths need \\ )-adom-desktop shell_execute '{"command":"powershell -NoProfile -Command \"Invoke-WebRequest -Uri https://<workspace>.adom.cloud/proxy/8931/NAME.lbr -OutFile C:\\Users\\<user>\\adom-lib\\NAME.lbr\""}'+adom-bridge shell_execute '{"command":"powershell -NoProfile -Command \"Invoke-WebRequest -Uri https://<workspace>.adom.cloud/proxy/8931/NAME.lbr -OutFile C:\\Users\\<user>\\adom-lib\\NAME.lbr\""}' # open it-adom-desktop fusion_open_lbr '{"filePath":"C:/Users/<user>/adom-lib/NAME.lbr","verify":true}'-adom-desktop fusion_get_app_state '{}'   # expect activeWorkspace "Electronics Library", isElectronics true+adom-bridge fusion_open_lbr '{"filePath":"C:/Users/<user>/adom-lib/NAME.lbr","verify":true}'+adom-bridge fusion_get_app_state '{}'   # expect activeWorkspace "Electronics Library", isElectronics true ```  The library loads with symbol + footprint + deviceset. The 3D package is a **placeholder** (the Content Manager 3D tab is empty). This is correct, and is the gap the rest of this guide closes. -![Library open in the Electronics Library editor; symbol + footprint mapped, 3D still a placeholder](https://wiki.adom.inc/adom/adom-desktop-fusion-bridge/files/lib-01-open.png)+![Library open in the Electronics Library editor; symbol + footprint mapped, 3D still a placeholder](https://wiki.adom.inc/adom/fusion-bridge/files/lib-01-open.png)  ## Step 2 - put the 3D model in the Fusion cloud (get a URN) @@ -65,10 +65,10 @@ Fusion does NOT embed the STEP in the `.lbr`. A package references its 3D model first. Stage the STEP to Windows (same as step 1), then upload it:  ```bash-adom-desktop fusion_aps_browse '{}'                                   # find hub + project-adom-desktop fusion_aps_browse '{"projectId":"<proj>"}'               # find the root folder-adom-desktop fusion_aps_create_folder '{"projectId":"<proj>","parentFolderId":"<root>","name":"Electronics 3D"}'-adom-desktop fusion_aps_upload '{"projectId":"<proj>","folderId":"<folder>","localPath":"C:/Users/<user>/adom-lib/NAME.step","fileName":"NAME-3D.step"}'+adom-bridge fusion_aps_browse '{}'                                   # find hub + project+adom-bridge fusion_aps_browse '{"projectId":"<proj>"}'               # find the root folder+adom-bridge fusion_aps_create_folder '{"projectId":"<proj>","parentFolderId":"<root>","name":"Electronics 3D"}'+adom-bridge fusion_aps_upload '{"projectId":"<proj>","folderId":"<folder>","localPath":"C:/Users/<user>/adom-lib/NAME.step","fileName":"NAME-3D.step"}' # -> { "itemUrn": "urn:adsk.wipprod:dm.lineage:...", "bytes": ... } ``` @@ -81,13 +81,13 @@ and returned a real URN. (`Electron.getCloudPathFromUrn` confirms the 3D package Fusion exposes a scriptable entry point:  ```bash-adom-desktop fusion_execute_text_command '{"command":"Electron.Create3DPackage C:/Users/<user>/adom-lib/NAME.lbr"}'+adom-bridge fusion_execute_text_command '{"command":"Electron.Create3DPackage C:/Users/<user>/adom-lib/NAME.lbr"}' ```  This opens the **3D PACKAGE Generator**: a Design-workspace authoring document with the footprint loaded (the green courtyard + `>NAME` / `>VALUE`), and a PACKAGE / SELECT / FINISH ribbon. -![The 3D Package Generator with the nRF54L15 footprint loaded, ready for a model](https://wiki.adom.inc/adom/adom-desktop-fusion-bridge/files/lib-02-generator.png)+![The 3D Package Generator with the nRF54L15 footprint loaded, ready for a model](https://wiki.adom.inc/adom/fusion-bridge/files/lib-02-generator.png)  The generator is itself an `adsk::fusion::Design` in the **`Package3DEnvironment`** workspace, with three command definitions: `Package3DCmd`, `Package3DCreateCmd`, `Package3DStop` (Stop = FINISH).@@ -107,7 +107,7 @@ ui.commandDefinitions.itemById("Package3DStop").execute()                 # FINI This **works**: the real chip imports at correct scale, orients flat, centered on the footprint, and FINISH saves a 3D package to the cloud (the Save dialog Name/Location are confirmed via `desktop_ui_click`). -![The ADS8588SIPM chip seated on its matched 4-sided LQFP-64 footprint in the Package3D viewer](https://wiki.adom.inc/adom/adom-desktop-fusion-bridge/files/lib-10-ads-chip-on-footprint.png)+![The ADS8588SIPM chip seated on its matched 4-sided LQFP-64 footprint in the Package3D viewer](https://wiki.adom.inc/adom/fusion-bridge/files/lib-10-ads-chip-on-footprint.png)  ### SOLVED - the 3D binds, end to end @@ -117,7 +117,7 @@ Launched from the **open library**, `Electron.Create3DPackage` -> import the mod Packages panel's `Package` column flips from `Placeholder` to the part name, and the 3D preview becomes the real chip. First time the full Fusion electronics 3D attach is automated via the bridge. -![3D bound: Content Manager shows the real chip under the package, Package column = part name](https://wiki.adom.inc/adom/adom-desktop-fusion-bridge/files/lib-09-3d-bound-moneyshot.png)+![3D bound: Content Manager shows the real chip under the package, Package column = part name](https://wiki.adom.inc/adom/fusion-bridge/files/lib-09-3d-bound-moneyshot.png)  GOTCHA: the right-panel preview LAGS after FINISH (still shows the gray placeholder for a moment) - the Content Manager tree / `Package` column is the source of truth; re-grab the window after a beat.
skills/fusion-mcp-and-preferences/SKILL.md+18−17
@@ -26,12 +26,12 @@ own text-to-CAD surface. it. The fusion bridge runs on that machine, so it proxies:  ```bash-adom-desktop fusion_mcp_status '{}'          # up? serverInfo + live tool list-adom-desktop fusion_mcp_enable '{}'          # turn it ON for the user-adom-desktop fusion_mcp_tools  '{}'          # tools WITH input schemas-adom-desktop fusion_mcp_call   '{"tool":"fusion_mcp_electronics_read",+adom-bridge fusion_mcp_status '{}'          # up? serverInfo + live tool list+adom-bridge fusion_mcp_enable '{}'          # turn it ON for the user+adom-bridge fusion_mcp_tools  '{}'          # tools WITH input schemas+adom-bridge fusion_mcp_call   '{"tool":"fusion_mcp_electronics_read",                                  "arguments":{"entity_type":"electronics.Element"}}'-adom-desktop fusion_mcp_resources '{}'       # electronics entity schemas+adom-bridge fusion_mcp_resources '{}'       # electronics entity schemas ```  ### Do not ask the user to enable it@@ -54,16 +54,17 @@ The bridge does this and re-establishes dropped sessions, so `fusion_mcp_call` j  ### Autodesk's four tools -| tool | for |-|---|---|-| `fusion_mcp_read` | geometric properties / data from the active model |-| `fusion_mcp_update` | update the active model |-| `fusion_mcp_execute` | execute operations |-| `fusion_mcp_electronics_read` | Electronics design data by `entity_type` |+| tool | for | the depth is in the params |+|---|---|---|+| `fusion_mcp_read` | read/search/see/introspect | `queryType`: `projects`, `document` (search/open/recent = **file search**), `apiDocumentation` (search Fusion's API docs), `screenshot` (any view-cube direction), `activeCommand` (read the live dialog) |+| `fusion_mcp_execute` | run scripts + document lifecycle | `featureType`: `script` (**arbitrary Python** = text-to-CAD), `document` (open/close/save) |+| `fusion_mcp_update` | undo / redo only | `featureType`: `undo`, `redo` |+| `fusion_mcp_electronics_read` | read the EAGLE object model | `entity_type`: **49 classes** across schematic/board/library + ERC/DRC `Error`, with `object.fields` / `object.filters` / `object.pagination` | -`entity_type` covers the EAGLE object model: `electronics.Board`, `.Element`, `.Contact`,-`.ContactRef`, `.Device`, `.DeviceSet`, `.Gate`, `.Bus`, `.Error` (ERC/DRC), `.Frame`, `.Grid`,-`.Attribute`. `fusion_mcp_resources` returns the schemas.+`fusion_mcp_resources` returns 50 resources: `electronics_entity_types` plus one+`electronics_schema_<class>` per class (properties, types, filter operators). Read the schema+before filtering. Electronics is READ-ONLY; author boards with the native `fusion_electron_run`.+Full write-up: docs/fusion-mcp-server.md.  MCP acts on the **active document**. Open one first (`fusion_aps_open`). @@ -84,10 +85,10 @@ The API exposes a thin slice (`generalPreferences`: theme/orbit/units; `apiPrefe `debuggingPort`, `isDeveloperToolsEnabled`). Everything else is UI-only.  ```bash-adom-desktop fusion_prefs_open  '{"section":"api"}'   # opens + navigates + screenshots+adom-bridge fusion_prefs_open  '{"section":"api"}'   # opens + navigates + screenshots # look at the screenshot, then click what you see:-adom-desktop desktop_click '{"space":"image","shotId":"<from response>","x":690,"y":476,"hwnd":<hwnd>}'-adom-desktop fusion_prefs_close '{"save":true}'       # Apply + OK+adom-bridge desktop_click '{"space":"image","shotId":"<from response>","x":690,"y":476,"hwnd":<hwnd>}'+adom-bridge fusion_prefs_close '{"save":true}'       # Apply + OK ```  Sections: `general`, `api`, `design`, `manufacture`, `electronics`, `render`, `drawing`,
skills/fusion-multipart-libraries/CREATING_BASIC_PARTS_LIBRARIES.md+1−1
@@ -59,7 +59,7 @@ symbol body.** Not optional. A symbol that is just pins-and-a-box is a FAIL. | **adom-symbol** | builds + renders the schematic symbol AND the **3D-outline SVG** that becomes the symbol-art | `adom-symbol serve` (live app) + `adom-symbol ui ...` to drive it; `render` / `embed` | | **adom-footprint** | builds + renders the footprint (`.kicad_mod`) with layer / paste-dot views | `adom-footprint serve` + `ui`; `embed` | | **adom-lbr** | assembles the EAGLE `.lbr` (symbol + footprint + deviceset), embeds the symbol-art, writes the 3D sidecar | `adom-lbr generate ...`; `adom-lbr serve --file X.lbr` (symbol \| footprint \| 3D + pin-map viewer) |-| **adom-desktop-fusion-bridge** (this repo) | opens the `.lbr` in Fusion and attaches the 3D | `fusion_open_lbr`, `fusion_attach_3d_package` |+| **fusion-bridge** (this repo) | opens the `.lbr` in Fusion and attaches the 3D | `fusion_open_lbr`, `fusion_attach_3d_package` | | **the Adom Basic Parts wiki** (`adom/basic-parts-library`) | the canonical catalog: 79 resistors, 40 MLCCs, 6 inductors, 11 LEDs, ferrite beads | open the page in a pup tab (it has a fun interactive viewer) |  ## Build recipe (per part)
skills/fusion-multipart-libraries/SKILL.md+1−1
@@ -45,7 +45,7 @@ fusion_build_library_3d {  ### ⚠️ Relay timeout - a many-part run "times out" but KEEPS GOING (don't panic) -The `adom-desktop` relay times out the *request* at ~60s, but `fusion_build_library_3d` for a dozen+The `adom-bridge` relay times out the *request* at ~60s, but `fusion_build_library_3d` for a dozen parts takes minutes. So you will often get **`status: timeout / Request timed out` while the build is still running server-side and finishes fine.** Do NOT treat that as failure. Instead: 
skills/fusion-multiprofile-signin/SKILL.md+3−3
@@ -27,9 +27,9 @@ Autodesk login is `[email protected]` in his work profile.  ```bash # BEST - one server-side call does the whole chain, beats the ~2-min clock:-adom-desktop fusion_signin '{"auto":true,"profile":"chrome:[email protected]"}'-adom-desktop fusion_signin '{"profile":"chrome:[email protected]"}'   # staged/manual: fix + REMEMBER profile-adom-desktop fusion_signin '{}'                                  # staged: probe/remember/ask+adom-bridge fusion_signin '{"auto":true,"profile":"chrome:[email protected]"}'+adom-bridge fusion_signin '{"profile":"chrome:[email protected]"}'   # staged/manual: fix + REMEMBER profile+adom-bridge fusion_signin '{}'                                  # staged: probe/remember/ask ```  ### `auto:true` - the reliable path (do this)
skills/fusion-onboarding/SKILL.md+1−1
@@ -10,7 +10,7 @@ hands-off, AI-driven setup. The AI installs Fusion, signs them in, and wires up `fusion_*` commands work. **The free/trial tier is plenty** for viewing files and a lot of real work — nobody has to pay to get value. -All laptop steps run via `adom-desktop --target <laptop> shell_execute` / `run_script` /+All laptop steps run via `adom-bridge --target <laptop> shell_execute` / `run_script` / `send_files`. Drive the user's own machine; don't ask them to do steps you can do.  ## Step 0 — Check readiness (fast, never launches Fusion)
skills/fusion-web-export/SKILL.md+3−3
@@ -34,11 +34,11 @@ This reuses `aps.py`'s `_valid_access_token()` + `_http()` helpers; it is roughl - **Electronics/PCB designs are SCHEMATICS on the web - they export SCH/BRD only, NO STEP.** The 12-format dropdowns are present in the DOM but hidden templates; do not be fooled. STEP comes from the board's **3D** design (often a separate "3D Assets" design, or the board pushed to 3D).  ### Prereqs-`adom-desktop ping` connected + the pup (`browser_*`) bridge, a persistent pup profile logged into Autodesk (one-time), email access to the account that gets the export link (use **`adom-google`** - portable in any container; the claude.ai Gmail MCP connector also works if attached but is not guaranteed), and `step2glb` for the GLB.+`adom-bridge ping` connected + the pup (`browser_*`) bridge, a persistent pup profile logged into Autodesk (one-time), email access to the account that gets the export link (use **`adom-google`** - portable in any container; the claude.ai Gmail MCP connector also works if attached but is not guaranteed), and `step2glb` for the GLB.  ### Steps 1. **Open Fusion Team** in a logged-in pup session at `https://<hub>.autodesk360.com` (NOT `drive.autodesk.com` - it errors; NOT `fusion.online.autodesk.com` - that is the AppStream streamed editor, pure canvas, un-automatable).-   `adom-desktop browser_open_window '{"sessionId":"fusion-web","profile":"autodesk","url":"https://<hub>.autodesk360.com"}'`+   `adom-bridge browser_open_window '{"sessionId":"fusion-web","profile":"autodesk","url":"https://<hub>.autodesk360.com"}'`    Folder rows respond to a plain JS `.click()` via `browser_eval`; opening a design's detail page needs a TRUSTED click (`browser_input_dispatch`). 2. **Screenshot loop that works** (pup `browser_screenshot` errors os-13 on some hosts): `desktop_screenshot_window {hwnd}` (hwnd from `desktop_list_windows`, title "Google Chrome for Testing") -> read `safePathHost` from the JSON -> `pull_file {filePaths:[safePathHost], saveTo}` -> Read the PNG. Screenshot after every click. 3. **Open the 3D design**, then click the top-right download-arrow toggle by **VIEWPORT coords** from `getBoundingClientRect` (NOT screen coords; a `.trigger` selector click fails "not clickable"):@@ -69,5 +69,5 @@ step2glb convert /tmp/<Design>.stp -o /tmp/<Design>.glb  ## Related - [[fusion-aps-search]] / [[fusion-aps-signin]] - the APS OAuth + Data Management layer Path A builds on (`aps.py`).-- `adom-desktop-fusion-bridge` `fusion_export_step` - the DESKTOP path (needs Fusion open); use when Fusion is installed and running.+- `fusion-bridge` `fusion_export_step` - the DESKTOP path (needs Fusion open); use when Fusion is installed and running. - `step2glb` - STEP -> GLB.
tests/reports/verb-test-2026-08-14_1150.jsonadded+395
@@ -0,0 +1,395 @@+{+ "date": "2026-08-14_1150",+ "target": "AdomLapper",+ "tier": "daily",+ "pass": 30,+ "fail": 6,+ "results": [+  {+   "verb": "fusion_readiness",+   "status": "FAIL",+   "why": "expected success, got error=Request timed out code=None; missing field 'bridgeVersion'",+   "sec": 60.0+  },+  {+   "verb": "fusion_describe",+   "status": "PASS",+   "why": "",+   "sec": 0.2+  },+  {+   "verb": "fusion_get_app_state",+   "status": "PASS",+   "why": "",+   "sec": 0.9+  },+  {+   "verb": "fusion_search_cloud_files",+   "status": "PASS",+   "why": "",+   "sec": 0.1+  },+  {+   "verb": "fusion_walk_cloud_tree",+   "status": "PASS",+   "why": "",+   "sec": 0.1+  },+  {+   "verb": "fusion_aps_status",+   "status": "PASS",+   "why": "",+   "sec": 0.1+  },+  {+   "verb": "fusion_aps_get_browser",+   "status": "PASS",+   "why": "",+   "sec": 0.2+  },+  {+   "verb": "fusion_aps_search",+   "status": "PASS",+   "why": "",+   "sec": 39.3+  },+  {+   "verb": "fusion_aps_recent",+   "status": "PASS",+   "why": "",+   "sec": 19.6+  },+  {+   "verb": "fusion_aps_browse",+   "status": "PASS",+   "why": "",+   "sec": 3.2+  },+  {+   "verb": "fusion_aps_file_info",+   "status": "PASS",+   "why": "",+   "sec": 42.2+  },+  {+   "verb": "fusion_aps_get",+   "status": "PASS",+   "why": "",+   "sec": 0.6+  },+  {+   "verb": "fusion_uninstall",+   "status": "PASS",+   "why": "",+   "sec": 0.7+  },+  {+   "verb": "fusion_aps_create_folder",+   "status": "MANUAL",+   "why": "needs projectId/parentFolderId of the test workspace"+  },+  {+   "verb": "fusion_aps_upload",+   "status": "MANUAL",+   "why": "cloud write; exercised via build flows weekly"+  },+  {+   "verb": "fusion_aps_set_client_id",+   "status": "MANUAL",+   "why": "would clobber org auth config"+  },+  {+   "verb": "fusion_aps_set_browser",+   "status": "MANUAL",+   "why": ""+  },+  {+   "verb": "fusion_aps_forget_browser",+   "status": "MANUAL",+   "why": ""+  },+  {+   "verb": "fusion_aps_signin",+   "status": "MANUAL",+   "why": "opens a browser on the user's machine"+  },+  {+   "verb": "fusion_start",+   "status": "PASS",+   "why": "",+   "sec": 1.6+  },+  {+   "verb": "fusion_get_preferences",+   "status": "PASS",+   "why": "",+   "sec": 0.1+  },+  {+   "verb": "fusion_set_preference",+   "status": "PASS",+   "why": "",+   "sec": 0.1+  },+  {+   "verb": "fusion_mcp_status",+   "status": "PASS",+   "why": "",+   "sec": 0.1+  },+  {+   "verb": "fusion_mcp_enable",+   "status": "MANUAL",+   "why": "drives the prefs UI, takes foreground"+  },+  {+   "verb": "fusion_prefs_open",+   "status": "MANUAL",+   "why": "opens a dialog on the user's screen"+  },+  {+   "verb": "fusion_prefs_close",+   "status": "MANUAL",+   "why": ""+  },+  {+   "verb": "fusion_set_auto_update",+   "status": "PASS",+   "why": "",+   "sec": 0.1+  },+  {+   "verb": "fusion_dismiss_blocking_dialogs",+   "status": "PASS",+   "why": "",+   "sec": 0.8+  },+  {+   "verb": "fusion_load_design_rules",+   "status": "MANUAL",+   "why": "mutates the board's DRC rules"+  },+  {+   "verb": "fusion_open_cloud_file",+   "status": "PASS",+   "why": "",+   "sec": 15.1+  },+  {+   "verb": "fusion_show_schematic",+   "status": "PASS",+   "why": "",+   "sec": 12.1+  },+  {+   "verb": "fusion_show_2d_board",+   "status": "PASS",+   "why": "",+   "sec": 8.2+  },+  {+   "verb": "fusion_board_info",+   "status": "PASS",+   "why": "",+   "sec": 1.5+  },+  {+   "verb": "fusion_show_3d_board",+   "status": "PASS",+   "why": "",+   "sec": 12.8+  },+  {+   "verb": "fusion_inspect_bodies",+   "status": "PASS",+   "why": "",+   "sec": 0.1+  },+  {+   "verb": "fusion_assembly_bom",+   "status": "FAIL",+   "why": "expected success, got error=Request timed out code=None; missing field 'parts'; missing field 'collapsedUnits'; missing field 'possibleUnderCollapse'",+   "sec": 60.0+  },+  {+   "verb": "fusion_physical_properties",+   "status": "FAIL",+   "why": "expected success, got error=Fusion 360 is running but AdomBridge add-in not responding. code=fusion_addin_not_responding",+   "sec": 27.2+  },+  {+   "verb": "fusion_get_design_info",+   "status": "FAIL",+   "why": "expected success, got error=Fusion 360 is running but AdomBridge add-in not responding. code=fusion_addin_not_responding",+   "sec": 26.2+  },+  {+   "verb": "fusion_get_parameters",+   "status": "FAIL",+   "why": "expected success, got error=Fusion main thread busy \u2014 get_app_state running for 1.0s (from another bridge/se code=main_thread_busy",+   "sec": 0.8+  },+  {+   "verb": "fusion_document_info",+   "status": "PASS",+   "why": "",+   "sec": 0.9+  },+  {+   "verb": "fusion_run_modeling_script#guard",+   "status": "PASS",+   "why": "",+   "sec": 0.1+  },+  {+   "verb": "fusion_assembly_bom#guard",+   "status": "PASS",+   "why": "",+   "sec": 0.1+  },+  {+   "verb": "fusion_run_modeling_script",+   "status": "PASS",+   "why": "",+   "sec": 1.5+  },+  {+   "verb": "fusion_execute_text_command",+   "status": "FAIL",+   "why": "expected success, got error=Text command failed: 3 : No active asset adapter. code=None",+   "sec": 1.3+  },+  {+   "verb": "fusion_electron_select",+   "status": "MANUAL",+   "why": "selection state is user-visible"+  },+  {+   "verb": "fusion_open_design",+   "status": "MANUAL",+   "why": "local-file open; superseded by cloud flows"+  },+  {+   "verb": "fusion_close_window#noargs",+   "status": "PASS",+   "why": "",+   "sec": 0.0+  },+  {+   "verb": "fusion_close_document",+   "status": "MANUAL",+   "why": ""+  },+  {+   "verb": "fusion_close_all_documents",+   "status": "MANUAL",+   "why": "would close the user's own tabs"+  },+  {+   "verb": "fusion_export_fbx",+   "status": "MANUAL",+   "why": "format needs specific doc types; verify quarterly"+  },+  {+   "verb": "fusion_export_usdz",+   "status": "MANUAL",+   "why": "format needs specific doc types; verify quarterly"+  },+  {+   "verb": "fusion_export_dxf",+   "status": "MANUAL",+   "why": "format needs specific doc types; verify quarterly"+  },+  {+   "verb": "fusion_export_dwg",+   "status": "MANUAL",+   "why": "format needs specific doc types; verify quarterly"+  },+  {+   "verb": "fusion_export_skp",+   "status": "MANUAL",+   "why": "format needs specific doc types; verify quarterly"+  },+  {+   "verb": "fusion_set_design_rules",+   "status": "MANUAL",+   "why": "mutates the board's DRC rules"+  },+  {+   "verb": "fusion_web_export",+   "status": "MANUAL",+   "why": ""+  },+  {+   "verb": "fusion_attach_3d_package",+   "status": "MANUAL",+   "why": "modal Save dialog needs a human eye"+  },+  {+   "verb": "fusion_make_3d_package",+   "status": "MANUAL",+   "why": "cloud upload; run in release rehearsals"+  },+  {+   "verb": "fusion_build_library_3d",+   "status": "MANUAL",+   "why": "long multi-part build; release rehearsals"+  },+  {+   "verb": "fusion_new_electronics_from_eagle",+   "status": "MANUAL",+   "why": "drives native dialogs"+  },+  {+   "verb": "fusion_update_libraries",+   "status": "MANUAL",+   "why": ""+  },+  {+   "verb": "fusion_stop",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier"+  },+  {+   "verb": "fusion_kill",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier"+  },+  {+   "verb": "fusion_signin",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier"+  },+  {+   "verb": "fusion_signin_2fa",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier"+  },+  {+   "verb": "fusion_demo",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier"+  },+  {+   "verb": "fusion_install_fusion",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier"+  },+  {+   "verb": "fusion_notify_owner",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier"+  },+  {+   "verb": "fusion_open_by_urn_note",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier"+  },+  {+   "verb": "focus_invariance",+   "status": "PASS",+   "why": ""+  }+ ],+ "durationSec": 337.8+}\ No newline at end of file
tests/reports/verb-test-2026-08-14_1157.jsonadded+395
@@ -0,0 +1,395 @@+{+ "date": "2026-08-14_1157",+ "target": "AdomLapper",+ "tier": "daily",+ "pass": 35,+ "fail": 1,+ "results": [+  {+   "verb": "fusion_readiness",+   "status": "PASS",+   "why": "",+   "sec": 34.5+  },+  {+   "verb": "fusion_describe",+   "status": "PASS",+   "why": "",+   "sec": 0.1+  },+  {+   "verb": "fusion_get_app_state",+   "status": "PASS",+   "why": "",+   "sec": 1.1+  },+  {+   "verb": "fusion_search_cloud_files",+   "status": "PASS",+   "why": "",+   "sec": 0.2+  },+  {+   "verb": "fusion_walk_cloud_tree",+   "status": "PASS",+   "why": "",+   "sec": 0.1+  },+  {+   "verb": "fusion_aps_status",+   "status": "PASS",+   "why": "",+   "sec": 0.1+  },+  {+   "verb": "fusion_aps_get_browser",+   "status": "PASS",+   "why": "",+   "sec": 0.1+  },+  {+   "verb": "fusion_aps_search",+   "status": "PASS",+   "why": "",+   "sec": 36.1+  },+  {+   "verb": "fusion_aps_recent",+   "status": "PASS",+   "why": "",+   "sec": 13.0+  },+  {+   "verb": "fusion_aps_browse",+   "status": "PASS",+   "why": "",+   "sec": 2.3+  },+  {+   "verb": "fusion_aps_file_info",+   "status": "PASS",+   "why": "",+   "sec": 30.5+  },+  {+   "verb": "fusion_aps_get",+   "status": "PASS",+   "why": "",+   "sec": 0.6+  },+  {+   "verb": "fusion_uninstall",+   "status": "PASS",+   "why": "",+   "sec": 0.5+  },+  {+   "verb": "fusion_aps_create_folder",+   "status": "MANUAL",+   "why": "needs projectId/parentFolderId of the test workspace"+  },+  {+   "verb": "fusion_aps_upload",+   "status": "MANUAL",+   "why": "cloud write; exercised via build flows weekly"+  },+  {+   "verb": "fusion_aps_set_client_id",+   "status": "MANUAL",+   "why": "would clobber org auth config"+  },+  {+   "verb": "fusion_aps_set_browser",+   "status": "MANUAL",+   "why": ""+  },+  {+   "verb": "fusion_aps_forget_browser",+   "status": "MANUAL",+   "why": ""+  },+  {+   "verb": "fusion_aps_signin",+   "status": "MANUAL",+   "why": "opens a browser on the user's machine"+  },+  {+   "verb": "fusion_start",+   "status": "PASS",+   "why": "",+   "sec": 1.5+  },+  {+   "verb": "fusion_get_preferences",+   "status": "PASS",+   "why": "",+   "sec": 0.1+  },+  {+   "verb": "fusion_set_preference",+   "status": "PASS",+   "why": "",+   "sec": 0.1+  },+  {+   "verb": "fusion_mcp_status",+   "status": "PASS",+   "why": "",+   "sec": 0.1+  },+  {+   "verb": "fusion_mcp_enable",+   "status": "MANUAL",+   "why": "drives the prefs UI, takes foreground"+  },+  {+   "verb": "fusion_prefs_open",+   "status": "MANUAL",+   "why": "opens a dialog on the user's screen"+  },+  {+   "verb": "fusion_prefs_close",+   "status": "MANUAL",+   "why": ""+  },+  {+   "verb": "fusion_set_auto_update",+   "status": "PASS",+   "why": "",+   "sec": 0.1+  },+  {+   "verb": "fusion_assembly_bom",+   "status": "FAIL",+   "why": "expected success, got error=Request timed out code=None; missing field 'parts'; missing field 'collapsedUnits'; missing field 'possibleUnderCollapse'",+   "sec": 60.0+  },+  {+   "verb": "fusion_dismiss_blocking_dialogs",+   "status": "PASS",+   "why": "",+   "sec": 11.0+  },+  {+   "verb": "fusion_load_design_rules",+   "status": "MANUAL",+   "why": "mutates the board's DRC rules"+  },+  {+   "verb": "fusion_open_cloud_file",+   "status": "PASS",+   "why": "",+   "sec": 78.9+  },+  {+   "verb": "fusion_show_schematic",+   "status": "PASS",+   "why": "",+   "sec": 9.6+  },+  {+   "verb": "fusion_show_2d_board",+   "status": "PASS",+   "why": "",+   "sec": 9.3+  },+  {+   "verb": "fusion_board_info",+   "status": "PASS",+   "why": "",+   "sec": 1.4+  },+  {+   "verb": "fusion_execute_text_command",+   "status": "PASS",+   "why": "",+   "sec": 1.6+  },+  {+   "verb": "fusion_show_3d_board",+   "status": "PASS",+   "why": "",+   "sec": 17.4+  },+  {+   "verb": "fusion_inspect_bodies",+   "status": "PASS",+   "why": "",+   "sec": 0.1+  },+  {+   "verb": "fusion_physical_properties",+   "status": "PASS",+   "why": "",+   "sec": 4.4+  },+  {+   "verb": "fusion_get_design_info",+   "status": "PASS",+   "why": "",+   "sec": 5.0+  },+  {+   "verb": "fusion_get_parameters",+   "status": "PASS",+   "why": "",+   "sec": 0.8+  },+  {+   "verb": "fusion_document_info",+   "status": "PASS",+   "why": "",+   "sec": 0.9+  },+  {+   "verb": "fusion_run_modeling_script#guard",+   "status": "PASS",+   "why": "",+   "sec": 0.2+  },+  {+   "verb": "fusion_assembly_bom#guard",+   "status": "PASS",+   "why": "",+   "sec": 0.2+  },+  {+   "verb": "fusion_run_modeling_script",+   "status": "PASS",+   "why": "",+   "sec": 1.6+  },+  {+   "verb": "fusion_electron_select",+   "status": "MANUAL",+   "why": "selection state is user-visible"+  },+  {+   "verb": "fusion_open_design",+   "status": "MANUAL",+   "why": "local-file open; superseded by cloud flows"+  },+  {+   "verb": "fusion_close_window#noargs",+   "status": "PASS",+   "why": "",+   "sec": 0.0+  },+  {+   "verb": "fusion_close_document",+   "status": "MANUAL",+   "why": ""+  },+  {+   "verb": "fusion_close_all_documents",+   "status": "MANUAL",+   "why": "would close the user's own tabs"+  },+  {+   "verb": "fusion_export_fbx",+   "status": "MANUAL",+   "why": "format needs specific doc types; verify quarterly"+  },+  {+   "verb": "fusion_export_usdz",+   "status": "MANUAL",+   "why": "format needs specific doc types; verify quarterly"+  },+  {+   "verb": "fusion_export_dxf",+   "status": "MANUAL",+   "why": "format needs specific doc types; verify quarterly"+  },+  {+   "verb": "fusion_export_dwg",+   "status": "MANUAL",+   "why": "format needs specific doc types; verify quarterly"+  },+  {+   "verb": "fusion_export_skp",+   "status": "MANUAL",+   "why": "format needs specific doc types; verify quarterly"+  },+  {+   "verb": "fusion_set_design_rules",+   "status": "MANUAL",+   "why": "mutates the board's DRC rules"+  },+  {+   "verb": "fusion_web_export",+   "status": "MANUAL",+   "why": ""+  },+  {+   "verb": "fusion_attach_3d_package",+   "status": "MANUAL",+   "why": "modal Save dialog needs a human eye"+  },+  {+   "verb": "fusion_make_3d_package",+   "status": "MANUAL",+   "why": "cloud upload; run in release rehearsals"+  },+  {+   "verb": "fusion_build_library_3d",+   "status": "MANUAL",+   "why": "long multi-part build; release rehearsals"+  },+  {+   "verb": "fusion_new_electronics_from_eagle",+   "status": "MANUAL",+   "why": "drives native dialogs"+  },+  {+   "verb": "fusion_update_libraries",+   "status": "MANUAL",+   "why": ""+  },+  {+   "verb": "fusion_stop",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier"+  },+  {+   "verb": "fusion_kill",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier"+  },+  {+   "verb": "fusion_signin",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier"+  },+  {+   "verb": "fusion_signin_2fa",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier"+  },+  {+   "verb": "fusion_demo",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier"+  },+  {+   "verb": "fusion_install_fusion",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier"+  },+  {+   "verb": "fusion_notify_owner",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier"+  },+  {+   "verb": "fusion_open_by_urn_note",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier"+  },+  {+   "verb": "focus_invariance",+   "status": "PASS",+   "why": ""+  }+ ],+ "durationSec": 323.4+}\ No newline at end of file
tests/reports/verb-test-2026-08-14_1209.jsonadded+395
@@ -0,0 +1,395 @@+{+ "date": "2026-08-14_1209",+ "target": "AdomLapper",+ "tier": "daily",+ "pass": 34,+ "fail": 2,+ "results": [+  {+   "verb": "fusion_readiness",+   "status": "PASS",+   "why": "",+   "sec": 2.2+  },+  {+   "verb": "fusion_describe",+   "status": "PASS",+   "why": "",+   "sec": 0.1+  },+  {+   "verb": "fusion_get_app_state",+   "status": "FAIL",+   "why": "expected success, got error=Fusion 360 is installed but not running. code=fusion_not_running",+   "sec": 0.5+  },+  {+   "verb": "fusion_search_cloud_files",+   "status": "PASS",+   "why": "",+   "sec": 0.9+  },+  {+   "verb": "fusion_walk_cloud_tree",+   "status": "PASS",+   "why": "",+   "sec": 0.9+  },+  {+   "verb": "fusion_aps_status",+   "status": "PASS",+   "why": "",+   "sec": 0.0+  },+  {+   "verb": "fusion_aps_get_browser",+   "status": "PASS",+   "why": "",+   "sec": 0.0+  },+  {+   "verb": "fusion_aps_search",+   "status": "PASS",+   "why": "",+   "sec": 36.9+  },+  {+   "verb": "fusion_aps_recent",+   "status": "PASS",+   "why": "",+   "sec": 13.0+  },+  {+   "verb": "fusion_aps_browse",+   "status": "PASS",+   "why": "",+   "sec": 2.4+  },+  {+   "verb": "fusion_aps_file_info",+   "status": "FAIL",+   "why": "expected success, got error=Request timed out code=None; missing field 'versionCount'",+   "sec": 60.0+  },+  {+   "verb": "fusion_aps_get",+   "status": "PASS",+   "why": "",+   "sec": 1.3+  },+  {+   "verb": "fusion_uninstall",+   "status": "PASS",+   "why": "",+   "sec": 0.5+  },+  {+   "verb": "fusion_aps_create_folder",+   "status": "MANUAL",+   "why": "needs projectId/parentFolderId of the test workspace"+  },+  {+   "verb": "fusion_aps_upload",+   "status": "MANUAL",+   "why": "cloud write; exercised via build flows weekly"+  },+  {+   "verb": "fusion_aps_set_client_id",+   "status": "MANUAL",+   "why": "would clobber org auth config"+  },+  {+   "verb": "fusion_aps_set_browser",+   "status": "MANUAL",+   "why": ""+  },+  {+   "verb": "fusion_aps_forget_browser",+   "status": "MANUAL",+   "why": ""+  },+  {+   "verb": "fusion_aps_signin",+   "status": "MANUAL",+   "why": "opens a browser on the user's machine"+  },+  {+   "verb": "fusion_start",+   "status": "PASS",+   "why": "",+   "sec": 77.3+  },+  {+   "verb": "fusion_get_preferences",+   "status": "PASS",+   "why": "",+   "sec": 8.5+  },+  {+   "verb": "fusion_set_preference",+   "status": "PASS",+   "why": "",+   "sec": 0.9+  },+  {+   "verb": "fusion_mcp_status",+   "status": "PASS",+   "why": "",+   "sec": 0.1+  },+  {+   "verb": "fusion_mcp_enable",+   "status": "MANUAL",+   "why": "drives the prefs UI, takes foreground"+  },+  {+   "verb": "fusion_prefs_open",+   "status": "MANUAL",+   "why": "opens a dialog on the user's screen"+  },+  {+   "verb": "fusion_prefs_close",+   "status": "MANUAL",+   "why": ""+  },+  {+   "verb": "fusion_set_auto_update",+   "status": "PASS",+   "why": "",+   "sec": 0.1+  },+  {+   "verb": "fusion_assembly_bom",+   "status": "PASS",+   "why": "",+   "sec": 3.8+  },+  {+   "verb": "fusion_dismiss_blocking_dialogs",+   "status": "PASS",+   "why": "",+   "sec": 2.0+  },+  {+   "verb": "fusion_load_design_rules",+   "status": "MANUAL",+   "why": "mutates the board's DRC rules"+  },+  {+   "verb": "fusion_open_cloud_file",+   "status": "PASS",+   "why": "",+   "sec": 41.0+  },+  {+   "verb": "fusion_show_schematic",+   "status": "PASS",+   "why": "",+   "sec": 14.3+  },+  {+   "verb": "fusion_show_2d_board",+   "status": "PASS",+   "why": "",+   "sec": 16.6+  },+  {+   "verb": "fusion_board_info",+   "status": "PASS",+   "why": "",+   "sec": 1.6+  },+  {+   "verb": "fusion_execute_text_command",+   "status": "PASS",+   "why": "",+   "sec": 2.2+  },+  {+   "verb": "fusion_show_3d_board",+   "status": "PASS",+   "why": "",+   "sec": 17.4+  },+  {+   "verb": "fusion_inspect_bodies",+   "status": "PASS",+   "why": "",+   "sec": 0.1+  },+  {+   "verb": "fusion_physical_properties",+   "status": "PASS",+   "why": "",+   "sec": 2.3+  },+  {+   "verb": "fusion_get_design_info",+   "status": "PASS",+   "why": "",+   "sec": 4.0+  },+  {+   "verb": "fusion_get_parameters",+   "status": "PASS",+   "why": "",+   "sec": 0.5+  },+  {+   "verb": "fusion_document_info",+   "status": "PASS",+   "why": "",+   "sec": 0.6+  },+  {+   "verb": "fusion_run_modeling_script#guard",+   "status": "PASS",+   "why": "",+   "sec": 0.1+  },+  {+   "verb": "fusion_assembly_bom#guard",+   "status": "PASS",+   "why": "",+   "sec": 0.1+  },+  {+   "verb": "fusion_run_modeling_script",+   "status": "PASS",+   "why": "",+   "sec": 1.2+  },+  {+   "verb": "fusion_electron_select",+   "status": "MANUAL",+   "why": "selection state is user-visible"+  },+  {+   "verb": "fusion_open_design",+   "status": "MANUAL",+   "why": "local-file open; superseded by cloud flows"+  },+  {+   "verb": "fusion_close_window#noargs",+   "status": "PASS",+   "why": "",+   "sec": 0.0+  },+  {+   "verb": "fusion_close_document",+   "status": "MANUAL",+   "why": ""+  },+  {+   "verb": "fusion_close_all_documents",+   "status": "MANUAL",+   "why": "would close the user's own tabs"+  },+  {+   "verb": "fusion_export_fbx",+   "status": "MANUAL",+   "why": "format needs specific doc types; verify quarterly"+  },+  {+   "verb": "fusion_export_usdz",+   "status": "MANUAL",+   "why": "format needs specific doc types; verify quarterly"+  },+  {+   "verb": "fusion_export_dxf",+   "status": "MANUAL",+   "why": "format needs specific doc types; verify quarterly"+  },+  {+   "verb": "fusion_export_dwg",+   "status": "MANUAL",+   "why": "format needs specific doc types; verify quarterly"+  },+  {+   "verb": "fusion_export_skp",+   "status": "MANUAL",+   "why": "format needs specific doc types; verify quarterly"+  },+  {+   "verb": "fusion_set_design_rules",+   "status": "MANUAL",+   "why": "mutates the board's DRC rules"+  },+  {+   "verb": "fusion_web_export",+   "status": "MANUAL",+   "why": ""+  },+  {+   "verb": "fusion_attach_3d_package",+   "status": "MANUAL",+   "why": "modal Save dialog needs a human eye"+  },+  {+   "verb": "fusion_make_3d_package",+   "status": "MANUAL",+   "why": "cloud upload; run in release rehearsals"+  },+  {+   "verb": "fusion_build_library_3d",+   "status": "MANUAL",+   "why": "long multi-part build; release rehearsals"+  },+  {+   "verb": "fusion_new_electronics_from_eagle",+   "status": "MANUAL",+   "why": "drives native dialogs"+  },+  {+   "verb": "fusion_update_libraries",+   "status": "MANUAL",+   "why": ""+  },+  {+   "verb": "fusion_stop",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier"+  },+  {+   "verb": "fusion_kill",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier"+  },+  {+   "verb": "fusion_signin",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier"+  },+  {+   "verb": "fusion_signin_2fa",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier"+  },+  {+   "verb": "fusion_demo",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier"+  },+  {+   "verb": "fusion_install_fusion",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier"+  },+  {+   "verb": "fusion_notify_owner",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier"+  },+  {+   "verb": "fusion_open_by_urn_note",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier"+  },+  {+   "verb": "focus_invariance",+   "status": "PASS",+   "why": ""+  }+ ],+ "durationSec": 313.6+}\ No newline at end of file
tests/reports/verb-test-2026-08-14_1210.jsonadded+21
@@ -0,0 +1,21 @@+{+ "date": "2026-08-14_1210",+ "target": "AdomLapper",+ "tier": "daily",+ "pass": 2,+ "fail": 0,+ "results": [+  {+   "verb": "fusion_aps_file_info",+   "status": "PASS",+   "why": "",+   "sec": 33.4+  },+  {+   "verb": "focus_invariance",+   "status": "PASS",+   "why": ""+  }+ ],+ "durationSec": 33.4+}\ No newline at end of file
tests/reports/verb-test-2026-08-14_1849.jsonadded+834
@@ -0,0 +1,834 @@+{+ "date": "2026-08-14_1849",+ "target": "AdomLapper",+ "tier": "weekly",+ "pass": 54,+ "fail": 30,+ "sections": {+  "gui-driving": {+   "PASS": 14,+   "FAIL": 7,+   "MANUAL": 14,+   "SKIP": 0+  },+  "cad-3d-bom": {+   "PASS": 8,+   "FAIL": 4,+   "MANUAL": 0,+   "SKIP": 0+  },+  "python-addin": {+   "PASS": 3,+   "FAIL": 4,+   "MANUAL": 1,+   "SKIP": 0+  },+  "bridge-lifecycle": {+   "PASS": 11,+   "FAIL": 5,+   "MANUAL": 9,+   "SKIP": 0+  },+  "aps": {+   "PASS": 12,+   "FAIL": 3,+   "MANUAL": 4,+   "SKIP": 0+  },+  "exports": {+   "PASS": 1,+   "FAIL": 6,+   "MANUAL": 3,+   "SKIP": 0+  },+  "auth-tokens": {+   "PASS": 2,+   "FAIL": 0,+   "MANUAL": 2,+   "SKIP": 0+  },+  "mcp-server": {+   "PASS": 3,+   "FAIL": 1,+   "MANUAL": 1,+   "SKIP": 0+  }+ },+ "results": [+  {+   "verb": "fusion_close_all_documents",+   "status": "FAIL",+   "why": "in the test plan but MISSING from describe.py - undescribed verbs are invisible to callers",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_close_document",+   "status": "FAIL",+   "why": "in the test plan but MISSING from describe.py - undescribed verbs are invisible to callers",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_document_info",+   "status": "FAIL",+   "why": "in the test plan but MISSING from describe.py - undescribed verbs are invisible to callers",+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_execute_text_command",+   "status": "FAIL",+   "why": "in the test plan but MISSING from describe.py - undescribed verbs are invisible to callers",+   "section": "python-addin"+  },+  {+   "verb": "fusion_export_f3d",+   "status": "FAIL",+   "why": "in the test plan but MISSING from describe.py - undescribed verbs are invisible to callers",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_fbx",+   "status": "FAIL",+   "why": "in the test plan but MISSING from describe.py - undescribed verbs are invisible to callers",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_sat",+   "status": "FAIL",+   "why": "in the test plan but MISSING from describe.py - undescribed verbs are invisible to callers",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_skp",+   "status": "FAIL",+   "why": "in the test plan but MISSING from describe.py - undescribed verbs are invisible to callers",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_get_design_info",+   "status": "FAIL",+   "why": "in the test plan but MISSING from describe.py - undescribed verbs are invisible to callers",+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_get_parameters",+   "status": "FAIL",+   "why": "in the test plan but MISSING from describe.py - undescribed verbs are invisible to callers",+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_list_cloud_files",+   "status": "FAIL",+   "why": "in the test plan but MISSING from describe.py - undescribed verbs are invisible to callers",+   "section": "aps"+  },+  {+   "verb": "fusion_list_cloud_projects",+   "status": "FAIL",+   "why": "in the test plan but MISSING from describe.py - undescribed verbs are invisible to callers",+   "section": "aps"+  },+  {+   "verb": "fusion_open_cloud_file",+   "status": "FAIL",+   "why": "in the test plan but MISSING from describe.py - undescribed verbs are invisible to callers",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_open_design",+   "status": "FAIL",+   "why": "in the test plan but MISSING from describe.py - undescribed verbs are invisible to callers",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_update_libraries",+   "status": "FAIL",+   "why": "in the test plan but MISSING from describe.py - undescribed verbs are invisible to callers",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_web_export",+   "status": "FAIL",+   "why": "in the test plan but MISSING from describe.py - undescribed verbs are invisible to callers",+   "section": "exports"+  },+  {+   "verb": "fusion_readiness",+   "status": "PASS",+   "why": "",+   "sec": 32.9,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_describe",+   "status": "PASS",+   "why": "",+   "sec": 0.1,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_get_app_state",+   "status": "PASS",+   "why": "",+   "sec": 0.6,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_search_cloud_files",+   "status": "PASS",+   "why": "",+   "sec": 0.0,+   "section": "aps"+  },+  {+   "verb": "fusion_walk_cloud_tree",+   "status": "PASS",+   "why": "",+   "sec": 0.0,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_status",+   "status": "PASS",+   "why": "",+   "sec": 0.0,+   "section": "auth-tokens"+  },+  {+   "verb": "fusion_aps_get_browser",+   "status": "PASS",+   "why": "",+   "sec": 0.0,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_search",+   "status": "PASS",+   "why": "",+   "sec": 55.3,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_recent",+   "status": "PASS",+   "why": "",+   "sec": 12.6,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_browse",+   "status": "PASS",+   "why": "",+   "sec": 2.1,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_file_info",+   "status": "PASS",+   "why": "",+   "sec": 29.7,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_versions",+   "status": "PASS",+   "why": "",+   "sec": 28.9,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_download",+   "status": "PASS",+   "why": "",+   "sec": 34.0,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_get",+   "status": "PASS",+   "why": "",+   "sec": 0.9,+   "section": "auth-tokens"+  },+  {+   "verb": "fusion_uninstall",+   "status": "PASS",+   "why": "",+   "sec": 0.5,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_aps_create_folder",+   "status": "MANUAL",+   "why": "needs projectId/parentFolderId of the test workspace",+   "section": "aps"+  },+  {+   "verb": "fusion_aps_upload",+   "status": "MANUAL",+   "why": "cloud write; exercised via build flows weekly",+   "section": "aps"+  },+  {+   "verb": "fusion_aps_set_client_id",+   "status": "MANUAL",+   "why": "would clobber org auth config",+   "section": "auth-tokens"+  },+  {+   "verb": "fusion_aps_set_browser",+   "status": "MANUAL",+   "why": "",+   "section": "aps"+  },+  {+   "verb": "fusion_aps_forget_browser",+   "status": "MANUAL",+   "why": "",+   "section": "aps"+  },+  {+   "verb": "fusion_aps_signin",+   "status": "MANUAL",+   "why": "opens a browser on the user's machine",+   "section": "auth-tokens"+  },+  {+   "verb": "fusion_start",+   "status": "PASS",+   "why": "",+   "sec": 1.1,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_get_preferences",+   "status": "PASS",+   "why": "",+   "sec": 0.1,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_set_preference",+   "status": "PASS",+   "why": "",+   "sec": 0.0,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_mcp_status",+   "status": "PASS",+   "why": "",+   "sec": 0.1,+   "section": "mcp-server"+  },+  {+   "verb": "fusion_mcp_tools",+   "status": "PASS",+   "why": "",+   "sec": 0.0,+   "section": "mcp-server"+  },+  {+   "verb": "fusion_mcp_call",+   "status": "FAIL",+   "why": "expected success, got error= code=None",+   "sec": 0.0,+   "section": "mcp-server"+  },+  {+   "verb": "fusion_mcp_resources",+   "status": "PASS",+   "why": "",+   "sec": 0.0,+   "section": "mcp-server"+  },+  {+   "verb": "fusion_mcp_enable",+   "status": "MANUAL",+   "why": "drives the prefs UI, takes foreground",+   "section": "mcp-server"+  },+  {+   "verb": "fusion_prefs_open",+   "status": "MANUAL",+   "why": "opens a dialog on the user's screen",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_prefs_close",+   "status": "MANUAL",+   "why": "",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_set_auto_update",+   "status": "PASS",+   "why": "",+   "sec": 0.0,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_assembly_bom",+   "status": "PASS",+   "why": "",+   "sec": 0.6,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_dismiss_blocking_dialogs",+   "status": "PASS",+   "why": "",+   "sec": 0.6,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_detect_layers",+   "status": "FAIL",+   "why": "expected success, got error=Not in Board Layout (current: Design). Open a .brd file first. code=None",+   "sec": 0.6,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_fetch_optimized_glb",+   "status": "FAIL",+   "why": "expected success, got error=No jobId. code=None",+   "sec": 0.0,+   "section": "exports"+  },+  {+   "verb": "fusion_load_design_rules",+   "status": "MANUAL",+   "why": "mutates the board's DRC rules",+   "section": "exports"+  },+  {+   "verb": "fusion_open_cloud_file",+   "status": "PASS",+   "why": "",+   "sec": 42.4,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_show_schematic",+   "status": "PASS",+   "why": "",+   "sec": 20.0,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_show_2d_board",+   "status": "PASS",+   "why": "",+   "sec": 21.2,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_board_info",+   "status": "PASS",+   "why": "",+   "sec": 1.1,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_execute_text_command",+   "status": "PASS",+   "why": "",+   "sec": 1.7,+   "section": "python-addin"+  },+  {+   "verb": "fusion_show_3d_board",+   "status": "PASS",+   "why": "",+   "sec": 11.7,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_inspect_bodies",+   "status": "PASS",+   "why": "",+   "sec": 0.1,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_assembly_bom#realboard",+   "status": "PASS",+   "why": "",+   "sec": 21.0,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_physical_properties",+   "status": "PASS",+   "why": "",+   "sec": 1.0,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_get_design_info",+   "status": "PASS",+   "why": "",+   "sec": 2.2,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_get_parameters",+   "status": "PASS",+   "why": "",+   "sec": 0.5,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_document_info",+   "status": "PASS",+   "why": "",+   "sec": 0.5,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_list_cloud_projects",+   "status": "PASS",+   "why": "",+   "sec": 0.8,+   "section": "aps"+  },+  {+   "verb": "fusion_list_cloud_files",+   "status": "PASS",+   "why": "",+   "sec": 1.8,+   "section": "aps"+  },+  {+   "verb": "fusion_run_modeling_script#guard",+   "status": "PASS",+   "why": "",+   "sec": 0.0,+   "section": "python-addin"+  },+  {+   "verb": "fusion_assembly_bom#guard",+   "status": "PASS",+   "why": "",+   "sec": 0.0,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_run_modeling_script",+   "status": "PASS",+   "why": "",+   "sec": 1.5,+   "section": "python-addin"+  },+  {+   "verb": "fusion_electron_run",+   "status": "FAIL",+   "why": "expected success, got error=Not in Electronics editor (current: 3D PCB). Open a schematic or board in Fusion code=None",+   "sec": 1.2,+   "section": "python-addin"+  },+  {+   "verb": "fusion_electron_zoom",+   "status": "FAIL",+   "why": "expected success, got error=Command error: 3 : Not an Electron document\nTraceback (most recent call last):\n  code=None",+   "sec": 0.6,+   "section": "python-addin"+  },+  {+   "verb": "fusion_electron_pan",+   "status": "FAIL",+   "why": "expected success, got error=Need x1,y1,x2,y2 (board mm). Get part positions from fusion_board_info. code=None",+   "sec": 0.6,+   "section": "python-addin"+  },+  {+   "verb": "fusion_electron_select",+   "status": "MANUAL",+   "why": "selection state is user-visible",+   "section": "python-addin"+  },+  {+   "verb": "fusion_open_by_urn",+   "status": "PASS",+   "why": "",+   "sec": 9.5,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_aps_open",+   "status": "PASS",+   "why": "",+   "sec": 28.7,+   "section": "aps"+  },+  {+   "verb": "fusion_open_design",+   "status": "MANUAL",+   "why": "local-file open; superseded by cloud flows",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_close_window#noargs",+   "status": "PASS",+   "why": "",+   "sec": 0.0,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_close_document",+   "status": "MANUAL",+   "why": "",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_close_all_documents",+   "status": "MANUAL",+   "why": "would close the user's own tabs",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_export_step",+   "status": "PASS",+   "why": "",+   "sec": 24.0,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_stl",+   "status": "PASS",+   "why": "",+   "sec": 5.6,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_3mf",+   "status": "PASS",+   "why": "",+   "sec": 120.8,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_f3d",+   "status": "PASS",+   "why": "",+   "sec": 1.8,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_iges",+   "status": "PASS",+   "why": "",+   "sec": 9.6,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_obj",+   "status": "FAIL",+   "why": "expected success, got error=OBJ export failed or not available in this Fusion 360 build. code=None",+   "sec": 0.5,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_sat",+   "status": "PASS",+   "why": "",+   "sec": 12.7,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_fbx",+   "status": "MANUAL",+   "why": "format needs specific doc types; verify quarterly",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_usdz",+   "status": "MANUAL",+   "why": "format needs specific doc types; verify quarterly",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_dxf",+   "status": "MANUAL",+   "why": "format needs specific doc types; verify quarterly",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_dwg",+   "status": "MANUAL",+   "why": "format needs specific doc types; verify quarterly",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_skp",+   "status": "MANUAL",+   "why": "format needs specific doc types; verify quarterly",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_gerbers",+   "status": "FAIL",+   "why": "expected success, got error=Manufacturing export failed: 3 : Not an Electron document code=None",+   "sec": 0.5,+   "section": "exports"+  },+  {+   "verb": "fusion_export_bom",+   "status": "FAIL",+   "why": "expected success, got error=No board open (current workspace: 3D PCB). Open a .brd file first with fusion_op code=None",+   "sec": 0.5,+   "section": "exports"+  },+  {+   "verb": "fusion_export_cpl",+   "status": "FAIL",+   "why": "expected success, got error=No board open (current workspace: 3D PCB). Open a .brd file first with fusion_op code=None",+   "sec": 0.5,+   "section": "exports"+  },+  {+   "verb": "fusion_export_optimized_glb",+   "status": "PASS",+   "why": "",+   "sec": 51.6,+   "section": "exports"+  },+  {+   "verb": "fusion_set_design_rules",+   "status": "MANUAL",+   "why": "mutates the board's DRC rules",+   "section": "exports"+  },+  {+   "verb": "fusion_import_step",+   "status": "FAIL",+   "why": "fixture staging failed: write_file: runner: [Errno 7] Argument list too long: 'adom-bridge'",+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_web_export",+   "status": "MANUAL",+   "why": "",+   "section": "exports"+  },+  {+   "verb": "fusion_open_lbr",+   "status": "PASS",+   "why": "",+   "sec": 12.3,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_capture_library_views",+   "status": "FAIL",+   "why": "expected success, got error=packages: [<deviceset name>] (or package: <name>) required. code=None",+   "sec": 0.5,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_generate_package",+   "status": "PASS",+   "why": "",+   "sec": 6.9,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_attach_3d_package",+   "status": "MANUAL",+   "why": "modal Save dialog needs a human eye",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_make_3d_package",+   "status": "MANUAL",+   "why": "cloud upload; run in release rehearsals",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_build_library_3d",+   "status": "MANUAL",+   "why": "long multi-part build; release rehearsals",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_cleanup_cloud_files",+   "status": "FAIL",+   "why": "expected success, got error=fileIds [lineage urns] required. code=None",+   "sec": 0.5,+   "section": "aps"+  },+  {+   "verb": "fusion_board_stackup",+   "status": "FAIL",+   "why": "expected success, got error=could not export .brd for stackup: No .brd file found inside .fbrd ZIP container code=None",+   "sec": 1.0,+   "section": "exports"+  },+  {+   "verb": "fusion_new_electronics_from_eagle",+   "status": "MANUAL",+   "why": "drives native dialogs",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_update_libraries",+   "status": "MANUAL",+   "why": "",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_stop",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_kill",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_signin",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_signin_2fa",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_demo",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_install_fusion",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_notify_owner",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_open_by_urn_note",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "focus_invariance",+   "status": "PASS",+   "why": "",+   "section": "gui-driving"+  }+ ],+ "durationSec": 649.9+}\ No newline at end of file
tests/reports/verb-test-2026-08-14_1915.jsonadded+772
@@ -0,0 +1,772 @@+{+ "date": "2026-08-14_1915",+ "target": "AdomLapper",+ "tier": "weekly",+ "pass": 68,+ "fail": 4,+ "sections": {+  "bridge-lifecycle": {+   "PASS": 14,+   "FAIL": 1,+   "MANUAL": 11,+   "SKIP": 0+  },+  "gui-driving": {+   "PASS": 17,+   "FAIL": 0,+   "MANUAL": 13,+   "SKIP": 0+  },+  "aps": {+   "PASS": 13,+   "FAIL": 0,+   "MANUAL": 5,+   "SKIP": 0+  },+  "auth-tokens": {+   "PASS": 2,+   "FAIL": 0,+   "MANUAL": 2,+   "SKIP": 0+  },+  "mcp-server": {+   "PASS": 3,+   "FAIL": 1,+   "MANUAL": 1,+   "SKIP": 0+  },+  "cad-3d-bom": {+   "PASS": 9,+   "FAIL": 0,+   "MANUAL": 0,+   "SKIP": 0+  },+  "exports": {+   "PASS": 4,+   "FAIL": 2,+   "MANUAL": 2,+   "SKIP": 0+  },+  "python-addin": {+   "PASS": 6,+   "FAIL": 0,+   "MANUAL": 1,+   "SKIP": 0+  }+ },+ "results": [+  {+   "verb": "fusion_readiness",+   "status": "PASS",+   "why": "",+   "sec": 31.3,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_describe",+   "status": "PASS",+   "why": "",+   "sec": 0.1,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_get_app_state",+   "status": "PASS",+   "why": "",+   "sec": 0.5,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_search_cloud_files",+   "status": "PASS",+   "why": "",+   "sec": 0.0,+   "section": "aps"+  },+  {+   "verb": "fusion_walk_cloud_tree",+   "status": "PASS",+   "why": "",+   "sec": 0.0,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_status",+   "status": "PASS",+   "why": "",+   "sec": 0.0,+   "section": "auth-tokens"+  },+  {+   "verb": "fusion_aps_get_browser",+   "status": "PASS",+   "why": "",+   "sec": 0.0,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_search",+   "status": "PASS",+   "why": "",+   "sec": 40.7,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_recent",+   "status": "PASS",+   "why": "",+   "sec": 12.5,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_browse",+   "status": "PASS",+   "why": "",+   "sec": 1.4,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_file_info",+   "status": "PASS",+   "why": "",+   "sec": 29.1,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_versions",+   "status": "PASS",+   "why": "",+   "sec": 36.1,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_download",+   "status": "PASS",+   "why": "",+   "sec": 31.2,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_get",+   "status": "PASS",+   "why": "",+   "sec": 0.6,+   "section": "auth-tokens"+  },+  {+   "verb": "fusion_uninstall",+   "status": "PASS",+   "why": "",+   "sec": 0.4,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_aps_create_folder",+   "status": "MANUAL",+   "why": "needs projectId/parentFolderId of the test workspace",+   "section": "aps"+  },+  {+   "verb": "fusion_aps_upload",+   "status": "MANUAL",+   "why": "cloud write; exercised via build flows weekly",+   "section": "aps"+  },+  {+   "verb": "fusion_aps_set_client_id",+   "status": "MANUAL",+   "why": "would clobber org auth config",+   "section": "auth-tokens"+  },+  {+   "verb": "fusion_aps_set_browser",+   "status": "MANUAL",+   "why": "",+   "section": "aps"+  },+  {+   "verb": "fusion_aps_forget_browser",+   "status": "MANUAL",+   "why": "",+   "section": "aps"+  },+  {+   "verb": "fusion_aps_signin",+   "status": "MANUAL",+   "why": "opens a browser on the user's machine",+   "section": "auth-tokens"+  },+  {+   "verb": "fusion_start",+   "status": "PASS",+   "why": "",+   "sec": 1.1,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_get_preferences",+   "status": "PASS",+   "why": "",+   "sec": 0.2,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_set_preference",+   "status": "PASS",+   "why": "",+   "sec": 0.1,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_mcp_status",+   "status": "PASS",+   "why": "",+   "sec": 0.1,+   "section": "mcp-server"+  },+  {+   "verb": "fusion_mcp_tools",+   "status": "PASS",+   "why": "",+   "sec": 0.0,+   "section": "mcp-server"+  },+  {+   "verb": "fusion_mcp_call",+   "status": "FAIL",+   "why": "expected success, got error= code=None",+   "sec": 0.0,+   "section": "mcp-server"+  },+  {+   "verb": "fusion_mcp_resources",+   "status": "PASS",+   "why": "",+   "sec": 0.0,+   "section": "mcp-server"+  },+  {+   "verb": "fusion_mcp_enable",+   "status": "MANUAL",+   "why": "drives the prefs UI, takes foreground",+   "section": "mcp-server"+  },+  {+   "verb": "fusion_prefs_open",+   "status": "MANUAL",+   "why": "opens a dialog on the user's screen",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_prefs_close",+   "status": "MANUAL",+   "why": "",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_set_auto_update",+   "status": "PASS",+   "why": "",+   "sec": 0.0,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_assembly_bom",+   "status": "PASS",+   "why": "",+   "sec": 0.6,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_dismiss_blocking_dialogs",+   "status": "PASS",+   "why": "",+   "sec": 0.6,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_load_design_rules",+   "status": "MANUAL",+   "why": "mutates the board's DRC rules",+   "section": "exports"+  },+  {+   "verb": "fusion_open_cloud_file",+   "status": "PASS",+   "why": "",+   "sec": 29.8,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_show_schematic",+   "status": "PASS",+   "why": "",+   "sec": 15.0,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_show_2d_board",+   "status": "PASS",+   "why": "",+   "sec": 9.8,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_board_info",+   "status": "PASS",+   "why": "",+   "sec": 1.2,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_execute_text_command",+   "status": "PASS",+   "why": "",+   "sec": 1.7,+   "section": "python-addin"+  },+  {+   "verb": "fusion_electron_run",+   "status": "PASS",+   "why": "",+   "sec": 3.7,+   "section": "python-addin"+  },+  {+   "verb": "fusion_electron_zoom",+   "status": "PASS",+   "why": "",+   "sec": 4.9,+   "section": "python-addin"+  },+  {+   "verb": "fusion_electron_pan",+   "status": "PASS",+   "why": "",+   "sec": 0.6,+   "section": "python-addin"+  },+  {+   "verb": "fusion_detect_layers",+   "status": "PASS",+   "why": "",+   "sec": 0.7,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_export_gerbers",+   "status": "PASS",+   "why": "",+   "sec": 2.2,+   "section": "exports"+  },+  {+   "verb": "fusion_export_bom",+   "status": "PASS",+   "why": "",+   "sec": 1.8,+   "section": "exports"+  },+  {+   "verb": "fusion_export_cpl",+   "status": "PASS",+   "why": "",+   "sec": 0.9,+   "section": "exports"+  },+  {+   "verb": "fusion_board_stackup",+   "status": "PASS",+   "why": "",+   "sec": 12.1,+   "section": "exports"+  },+  {+   "verb": "fusion_show_3d_board",+   "status": "PASS",+   "why": "",+   "sec": 5.8,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_inspect_bodies",+   "status": "PASS",+   "why": "",+   "sec": 0.1,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_assembly_bom#realboard",+   "status": "PASS",+   "why": "",+   "sec": 20.8,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_physical_properties",+   "status": "PASS",+   "why": "",+   "sec": 1.9,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_get_design_info",+   "status": "PASS",+   "why": "",+   "sec": 8.5,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_get_parameters",+   "status": "PASS",+   "why": "",+   "sec": 0.8,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_document_info",+   "status": "PASS",+   "why": "",+   "sec": 0.5,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_list_cloud_projects",+   "status": "PASS",+   "why": "",+   "sec": 1.0,+   "section": "aps"+  },+  {+   "verb": "fusion_list_cloud_files",+   "status": "PASS",+   "why": "",+   "sec": 1.8,+   "section": "aps"+  },+  {+   "verb": "fusion_run_modeling_script#guard",+   "status": "PASS",+   "why": "",+   "sec": 0.1,+   "section": "python-addin"+  },+  {+   "verb": "fusion_assembly_bom#guard",+   "status": "PASS",+   "why": "",+   "sec": 0.1,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_run_modeling_script",+   "status": "PASS",+   "why": "",+   "sec": 1.3,+   "section": "python-addin"+  },+  {+   "verb": "fusion_electron_select",+   "status": "MANUAL",+   "why": "selection state is user-visible",+   "section": "python-addin"+  },+  {+   "verb": "fusion_open_by_urn",+   "status": "PASS",+   "why": "",+   "sec": 3.3,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_aps_open",+   "status": "PASS",+   "why": "",+   "sec": 29.6,+   "section": "aps"+  },+  {+   "verb": "fusion_open_design",+   "status": "MANUAL",+   "why": "local-file open; superseded by cloud flows",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_close_window#noargs",+   "status": "PASS",+   "why": "",+   "sec": 0.0,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_close_document",+   "status": "MANUAL",+   "why": "",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_close_all_documents",+   "status": "MANUAL",+   "why": "would close the user's own tabs",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_export_step",+   "status": "PASS",+   "why": "",+   "sec": 41.3,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_stl",+   "status": "PASS",+   "why": "",+   "sec": 13.9,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_3mf",+   "status": "PASS",+   "why": "",+   "sec": 125.0,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_f3d",+   "status": "PASS",+   "why": "",+   "sec": 4.7,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_iges",+   "status": "PASS",+   "why": "",+   "sec": 17.5,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_sat",+   "status": "PASS",+   "why": "",+   "sec": 17.3,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_obj",+   "status": "MANUAL",+   "why": "build/doc-type dependent (OBJ refused on the 2026-08-14 box); verify quarterly",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_fbx",+   "status": "MANUAL",+   "why": "build/doc-type dependent (OBJ refused on the 2026-08-14 box); verify quarterly",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_usdz",+   "status": "MANUAL",+   "why": "build/doc-type dependent (OBJ refused on the 2026-08-14 box); verify quarterly",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_dxf",+   "status": "MANUAL",+   "why": "build/doc-type dependent (OBJ refused on the 2026-08-14 box); verify quarterly",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_dwg",+   "status": "MANUAL",+   "why": "build/doc-type dependent (OBJ refused on the 2026-08-14 box); verify quarterly",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_skp",+   "status": "MANUAL",+   "why": "build/doc-type dependent (OBJ refused on the 2026-08-14 box); verify quarterly",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_optimized_glb",+   "status": "FAIL",+   "why": "expected success, got error=Request timed out code=None",+   "sec": 60.0,+   "section": "exports"+  },+  {+   "verb": "fusion_fetch_optimized_glb",+   "status": "FAIL",+   "why": "fixture staging failed: export_optimized_glb produced neither jobId nor glbPath",+   "section": "exports"+  },+  {+   "verb": "fusion_set_design_rules",+   "status": "MANUAL",+   "why": "mutates the board's DRC rules",+   "section": "exports"+  },+  {+   "verb": "fusion_open_lbr",+   "status": "PASS",+   "why": "",+   "sec": 37.8,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_capture_library_views",+   "status": "PASS",+   "why": "",+   "sec": 30.1,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_show_symbol",+   "status": "PASS",+   "why": "",+   "sec": 10.0,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_show_footprint",+   "status": "PASS",+   "why": "",+   "sec": 10.1,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_show_symbol#wrap",+   "status": "PASS",+   "why": "",+   "sec": 20.6,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_generate_package",+   "status": "PASS",+   "why": "",+   "sec": 17.0,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_show_3d_package",+   "status": "MANUAL",+   "why": "enters Package3DEnvironment (exit needs Package3DStop + dialog); tour covers it; attach path in release rehearsals",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_attach_3d_package",+   "status": "MANUAL",+   "why": "modal Save dialog needs a human eye",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_make_3d_package",+   "status": "MANUAL",+   "why": "cloud upload; run in release rehearsals",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_build_library_3d",+   "status": "MANUAL",+   "why": "long multi-part build; release rehearsals",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_cleanup_cloud_files#guard",+   "status": "PASS",+   "why": "",+   "sec": 0.6,+   "section": "aps"+  },+  {+   "verb": "fusion_cleanup_cloud_files",+   "status": "MANUAL",+   "why": "real cleanup takes explicit lineage urns; used by weekly build rehearsals",+   "section": "aps"+  },+  {+   "verb": "fusion_new_electronics_from_eagle",+   "status": "MANUAL",+   "why": "drives native dialogs",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_import_step",+   "status": "PASS",+   "why": "",+   "sec": 4.1,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_demo#tour",+   "status": "PASS",+   "why": "",+   "sec": 101.2,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_demo_progress#unknown",+   "status": "FAIL",+   "why": "expected a refusal, got success",+   "sec": 0.0,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_stop",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_kill",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_signin",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_signin_2fa",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_demo",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_install_fusion",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_notify_owner",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_open_by_urn_note",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "focus_invariance",+   "status": "PASS",+   "why": "",+   "section": "gui-driving"+  }+ ],+ "durationSec": 887.5+}\ No newline at end of file
tests/reports/verb-test-2026-08-14_1920.jsonadded+37
@@ -0,0 +1,37 @@+{+ "date": "2026-08-14_1920",+ "target": "AdomLapper",+ "tier": "daily",+ "pass": 2,+ "fail": 0,+ "sections": {+  "bridge-lifecycle": {+   "PASS": 1,+   "FAIL": 0,+   "MANUAL": 0,+   "SKIP": 0+  },+  "gui-driving": {+   "PASS": 1,+   "FAIL": 0,+   "MANUAL": 0,+   "SKIP": 0+  }+ },+ "results": [+  {+   "verb": "fusion_demo_progress#unknown",+   "status": "PASS",+   "why": "",+   "sec": 0.2,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "focus_invariance",+   "status": "PASS",+   "why": "",+   "section": "gui-driving"+  }+ ],+ "durationSec": 0.5+}\ No newline at end of file
tests/reports/verb-test-2026-08-14_1921.jsonadded+69
@@ -0,0 +1,69 @@+{+ "date": "2026-08-14_1921",+ "target": "AdomLapper",+ "tier": "daily",+ "pass": 2,+ "fail": 3,+ "sections": {+  "mcp-server": {+   "PASS": 0,+   "FAIL": 1,+   "MANUAL": 0,+   "SKIP": 0+  },+  "exports": {+   "PASS": 0,+   "FAIL": 2,+   "MANUAL": 0,+   "SKIP": 0+  },+  "bridge-lifecycle": {+   "PASS": 1,+   "FAIL": 0,+   "MANUAL": 0,+   "SKIP": 0+  },+  "gui-driving": {+   "PASS": 1,+   "FAIL": 0,+   "MANUAL": 0,+   "SKIP": 0+  }+ },+ "results": [+  {+   "verb": "fusion_mcp_call",+   "status": "FAIL",+   "why": "expected success, got error=Request timed out code=None",+   "sec": 60.0,+   "section": "mcp-server"+  },+  {+   "verb": "fusion_export_optimized_glb",+   "status": "FAIL",+   "why": "expected success, got error=Fusion main thread busy \u2014 export_step running for 8.9s (from another bridge/sess code=main_thread_busy; missing field 'exportId'",+   "sec": 0.7,+   "section": "exports"+  },+  {+   "verb": "fusion_fetch_optimized_glb",+   "status": "FAIL",+   "why": "fixture staging failed: export_optimized_glb returned no exportId (async start failed)",+   "section": "exports"+  },+  {+   "verb": "fusion_demo_progress#unknown",+   "status": "PASS",+   "why": "",+   "sec": 0.1,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "focus_invariance",+   "status": "PASS",+   "why": "",+   "section": "gui-driving"+  }+ ],+ "durationSec": 61.0+}\ No newline at end of file
tests/reports/verb-test-2026-08-14_1943.jsonadded+56
@@ -0,0 +1,56 @@+{+ "date": "2026-08-14_1943",+ "target": "AdomLapper",+ "tier": "daily",+ "pass": 2,+ "fail": 2,+ "sections": {+  "exports": {+   "PASS": 0,+   "FAIL": 2,+   "MANUAL": 0,+   "SKIP": 0+  },+  "bridge-lifecycle": {+   "PASS": 1,+   "FAIL": 0,+   "MANUAL": 0,+   "SKIP": 0+  },+  "gui-driving": {+   "PASS": 1,+   "FAIL": 0,+   "MANUAL": 0,+   "SKIP": 0+  }+ },+ "results": [+  {+   "verb": "fusion_export_optimized_glb",+   "status": "FAIL",+   "why": "expected success, got error=Fusion main thread busy \u2014 get_app_state running for 6.5s (from another bridge/se code=main_thread_busy; missing field 'exportId'",+   "sec": 0.7,+   "section": "exports"+  },+  {+   "verb": "fusion_fetch_optimized_glb",+   "status": "FAIL",+   "why": "fixture staging failed: export_optimized_glb returned no exportId (async start failed)",+   "section": "exports"+  },+  {+   "verb": "fusion_demo_progress#unknown",+   "status": "PASS",+   "why": "",+   "sec": 0.1,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "focus_invariance",+   "status": "PASS",+   "why": "",+   "section": "gui-driving"+  }+ ],+ "durationSec": 0.9+}\ No newline at end of file
tests/reports/verb-test-2026-08-14_1950.jsonadded+77
@@ -0,0 +1,77 @@+{+ "date": "2026-08-14_1950",+ "target": "AdomLapper",+ "tier": "daily",+ "pass": 3,+ "fail": 4,+ "sections": {+  "gui-driving": {+   "PASS": 3,+   "FAIL": 1,+   "MANUAL": 0,+   "SKIP": 0+  },+  "mcp-server": {+   "PASS": 0,+   "FAIL": 1,+   "MANUAL": 0,+   "SKIP": 0+  },+  "exports": {+   "PASS": 0,+   "FAIL": 2,+   "MANUAL": 0,+   "SKIP": 0+  }+ },+ "results": [+  {+   "verb": "fusion_open_cloud_file",+   "status": "PASS",+   "why": "",+   "sec": 41.5,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_show_2d_board",+   "status": "PASS",+   "why": "",+   "sec": 15.7,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_show_3d_board",+   "status": "FAIL",+   "why": "expected success, got error=Request timed out code=None",+   "sec": 60.0,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_mcp_call",+   "status": "FAIL",+   "why": "expected success, got error=target_not_found code=None",+   "sec": 0.0,+   "section": "mcp-server"+  },+  {+   "verb": "fusion_export_optimized_glb",+   "status": "FAIL",+   "why": "expected success, got error=target_not_found code=None; missing field 'exportId'",+   "sec": 0.0,+   "section": "exports"+  },+  {+   "verb": "fusion_fetch_optimized_glb",+   "status": "FAIL",+   "why": "fixture staging failed: export_optimized_glb returned no exportId (async start failed)",+   "section": "exports"+  },+  {+   "verb": "focus_invariance",+   "status": "PASS",+   "why": "",+   "section": "gui-driving"+  }+ ],+ "durationSec": 117.3+}\ No newline at end of file
tests/reports/verb-test-2026-08-14_1959.jsonadded+78
@@ -0,0 +1,78 @@+{+ "date": "2026-08-14_1959",+ "target": "AdomLapper",+ "tier": "daily",+ "pass": 7,+ "fail": 0,+ "sections": {+  "gui-driving": {+   "PASS": 4,+   "FAIL": 0,+   "MANUAL": 0,+   "SKIP": 0+  },+  "mcp-server": {+   "PASS": 1,+   "FAIL": 0,+   "MANUAL": 0,+   "SKIP": 0+  },+  "exports": {+   "PASS": 2,+   "FAIL": 0,+   "MANUAL": 0,+   "SKIP": 0+  }+ },+ "results": [+  {+   "verb": "fusion_open_cloud_file",+   "status": "PASS",+   "why": "",+   "sec": 10.7,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_show_2d_board",+   "status": "PASS",+   "why": "",+   "sec": 8.9,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_show_3d_board",+   "status": "PASS",+   "why": "",+   "sec": 9.8,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_mcp_call",+   "status": "PASS",+   "why": "",+   "sec": 0.2,+   "section": "mcp-server"+  },+  {+   "verb": "fusion_export_optimized_glb",+   "status": "PASS",+   "why": "",+   "sec": 0.8,+   "section": "exports"+  },+  {+   "verb": "fusion_fetch_optimized_glb",+   "status": "PASS",+   "why": "",+   "sec": 0.1,+   "section": "exports"+  },+  {+   "verb": "focus_invariance",+   "status": "PASS",+   "why": "",+   "section": "gui-driving"+  }+ ],+ "durationSec": 157.1+}\ No newline at end of file
tests/reports/verb-test-2026-08-14_2016.jsonadded+772
@@ -0,0 +1,772 @@+{+ "date": "2026-08-14_2016",+ "target": "AdomLapper",+ "tier": "weekly",+ "pass": 48,+ "fail": 24,+ "sections": {+  "bridge-lifecycle": {+   "PASS": 10,+   "FAIL": 5,+   "MANUAL": 11,+   "SKIP": 0+  },+  "gui-driving": {+   "PASS": 13,+   "FAIL": 4,+   "MANUAL": 13,+   "SKIP": 0+  },+  "aps": {+   "PASS": 4,+   "FAIL": 9,+   "MANUAL": 5,+   "SKIP": 0+  },+  "auth-tokens": {+   "PASS": 0,+   "FAIL": 2,+   "MANUAL": 2,+   "SKIP": 0+  },+  "mcp-server": {+   "PASS": 1,+   "FAIL": 3,+   "MANUAL": 1,+   "SKIP": 0+  },+  "cad-3d-bom": {+   "PASS": 8,+   "FAIL": 1,+   "MANUAL": 0,+   "SKIP": 0+  },+  "exports": {+   "PASS": 6,+   "FAIL": 0,+   "MANUAL": 2,+   "SKIP": 0+  },+  "python-addin": {+   "PASS": 6,+   "FAIL": 0,+   "MANUAL": 1,+   "SKIP": 0+  }+ },+ "results": [+  {+   "verb": "fusion_readiness",+   "status": "FAIL",+   "why": "expected success, got error=target_not_found code=None; missing field 'bridgeVersion'",+   "sec": 0.0,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_describe",+   "status": "FAIL",+   "why": "expected success, got error=target_not_found code=None",+   "sec": 0.0,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_get_app_state",+   "status": "FAIL",+   "why": "expected success, got error=target_not_found code=None",+   "sec": 0.0,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_search_cloud_files",+   "status": "FAIL",+   "why": "deprecated verb did NOT refuse",+   "sec": 0.0,+   "section": "aps"+  },+  {+   "verb": "fusion_walk_cloud_tree",+   "status": "FAIL",+   "why": "deprecated verb did NOT refuse",+   "sec": 0.0,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_status",+   "status": "FAIL",+   "why": "expected success, got error=target_not_found code=None",+   "sec": 0.0,+   "section": "auth-tokens"+  },+  {+   "verb": "fusion_aps_get_browser",+   "status": "FAIL",+   "why": "expected success, got error=target_not_found code=None",+   "sec": 0.0,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_search",+   "status": "FAIL",+   "why": "expected success, got error=target_not_found code=None; expected >0 results",+   "sec": 0.0,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_recent",+   "status": "FAIL",+   "why": "expected success, got error=target_not_found code=None; expected >0 results",+   "sec": 0.0,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_browse",+   "status": "FAIL",+   "why": "expected success, got error=target_not_found code=None; missing field 'hubs'",+   "sec": 0.0,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_file_info",+   "status": "FAIL",+   "why": "expected success, got error=target_not_found code=None; missing field 'versionCount'",+   "sec": 0.0,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_versions",+   "status": "FAIL",+   "why": "expected success, got error=target_not_found code=None; missing field 'versionCount'",+   "sec": 0.0,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_download",+   "status": "FAIL",+   "why": "expected success, got error=target_not_found code=None",+   "sec": 0.0,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_get",+   "status": "FAIL",+   "why": "expected success, got error=target_not_found code=None",+   "sec": 0.0,+   "section": "auth-tokens"+  },+  {+   "verb": "fusion_uninstall",+   "status": "FAIL",+   "why": "expected success, got error=target_not_found code=None; missing field 'removed'; missing field 'skipped'; missing field 'dryRun'",+   "sec": 0.0,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_aps_create_folder",+   "status": "MANUAL",+   "why": "needs projectId/parentFolderId of the test workspace",+   "section": "aps"+  },+  {+   "verb": "fusion_aps_upload",+   "status": "MANUAL",+   "why": "cloud write; exercised via build flows weekly",+   "section": "aps"+  },+  {+   "verb": "fusion_aps_set_client_id",+   "status": "MANUAL",+   "why": "would clobber org auth config",+   "section": "auth-tokens"+  },+  {+   "verb": "fusion_aps_set_browser",+   "status": "MANUAL",+   "why": "",+   "section": "aps"+  },+  {+   "verb": "fusion_aps_forget_browser",+   "status": "MANUAL",+   "why": "",+   "section": "aps"+  },+  {+   "verb": "fusion_aps_signin",+   "status": "MANUAL",+   "why": "opens a browser on the user's machine",+   "section": "auth-tokens"+  },+  {+   "verb": "fusion_start",+   "status": "FAIL",+   "why": "expected success, got error=target_not_found code=None",+   "sec": 0.0,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_get_preferences",+   "status": "FAIL",+   "why": "expected success, got error=target_not_found code=None; missing field 'current'",+   "sec": 0.0,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_set_preference",+   "status": "FAIL",+   "why": "expected success, got error=target_not_found code=None",+   "sec": 0.0,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_mcp_status",+   "status": "FAIL",+   "why": "expected success, got error=target_not_found code=None; missing field 'enabled'",+   "sec": 0.0,+   "section": "mcp-server"+  },+  {+   "verb": "fusion_mcp_tools",+   "status": "FAIL",+   "why": "expected success, got error=target_not_found code=None",+   "sec": 0.0,+   "section": "mcp-server"+  },+  {+   "verb": "fusion_mcp_resources",+   "status": "FAIL",+   "why": "expected success, got error=target_not_found code=None",+   "sec": 0.0,+   "section": "mcp-server"+  },+  {+   "verb": "fusion_mcp_enable",+   "status": "MANUAL",+   "why": "drives the prefs UI, takes foreground",+   "section": "mcp-server"+  },+  {+   "verb": "fusion_prefs_open",+   "status": "MANUAL",+   "why": "opens a dialog on the user's screen",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_prefs_close",+   "status": "MANUAL",+   "why": "",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_set_auto_update",+   "status": "FAIL",+   "why": "expected success, got error=target_not_found code=None",+   "sec": 0.0,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_assembly_bom",+   "status": "FAIL",+   "why": "expected a BOM or the budget refusal, got error=target_not_found code=None",+   "sec": 0.0,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_dismiss_blocking_dialogs",+   "status": "PASS",+   "why": "",+   "sec": 0.4,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_load_design_rules",+   "status": "MANUAL",+   "why": "mutates the board's DRC rules",+   "section": "exports"+  },+  {+   "verb": "fusion_open_cloud_file",+   "status": "PASS",+   "why": "",+   "sec": 158.2,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_show_schematic",+   "status": "PASS",+   "why": "",+   "sec": 14.9,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_show_2d_board",+   "status": "PASS",+   "why": "",+   "sec": 23.7,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_board_info",+   "status": "PASS",+   "why": "",+   "sec": 2.2,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_execute_text_command",+   "status": "PASS",+   "why": "",+   "sec": 1.6,+   "section": "python-addin"+  },+  {+   "verb": "fusion_electron_run",+   "status": "PASS",+   "why": "",+   "sec": 3.8,+   "section": "python-addin"+  },+  {+   "verb": "fusion_electron_zoom",+   "status": "PASS",+   "why": "",+   "sec": 2.9,+   "section": "python-addin"+  },+  {+   "verb": "fusion_electron_pan",+   "status": "PASS",+   "why": "",+   "sec": 0.8,+   "section": "python-addin"+  },+  {+   "verb": "fusion_detect_layers",+   "status": "PASS",+   "why": "",+   "sec": 0.9,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_export_gerbers",+   "status": "PASS",+   "why": "",+   "sec": 1.7,+   "section": "exports"+  },+  {+   "verb": "fusion_export_bom",+   "status": "PASS",+   "why": "",+   "sec": 2.0,+   "section": "exports"+  },+  {+   "verb": "fusion_export_cpl",+   "status": "PASS",+   "why": "",+   "sec": 1.2,+   "section": "exports"+  },+  {+   "verb": "fusion_board_stackup",+   "status": "PASS",+   "why": "",+   "sec": 7.1,+   "section": "exports"+  },+  {+   "verb": "fusion_show_3d_board",+   "status": "PASS",+   "why": "",+   "sec": 4.0,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_inspect_bodies",+   "status": "PASS",+   "why": "",+   "sec": 0.2,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_mcp_call",+   "status": "PASS",+   "why": "",+   "sec": 0.2,+   "section": "mcp-server"+  },+  {+   "verb": "fusion_assembly_bom#realboard",+   "status": "PASS",+   "why": "",+   "sec": 22.3,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_physical_properties",+   "status": "PASS",+   "why": "",+   "sec": 5.3,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_get_design_info",+   "status": "PASS",+   "why": "",+   "sec": 4.1,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_get_parameters",+   "status": "PASS",+   "why": "",+   "sec": 0.9,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_document_info",+   "status": "PASS",+   "why": "",+   "sec": 0.9,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_list_cloud_projects",+   "status": "PASS",+   "why": "",+   "sec": 1.4,+   "section": "aps"+  },+  {+   "verb": "fusion_list_cloud_files",+   "status": "PASS",+   "why": "",+   "sec": 2.5,+   "section": "aps"+  },+  {+   "verb": "fusion_run_modeling_script#guard",+   "status": "PASS",+   "why": "",+   "sec": 0.1,+   "section": "python-addin"+  },+  {+   "verb": "fusion_assembly_bom#guard",+   "status": "PASS",+   "why": "",+   "sec": 0.2,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_run_modeling_script",+   "status": "PASS",+   "why": "",+   "sec": 1.3,+   "section": "python-addin"+  },+  {+   "verb": "fusion_electron_select",+   "status": "MANUAL",+   "why": "selection state is user-visible",+   "section": "python-addin"+  },+  {+   "verb": "fusion_open_by_urn",+   "status": "FAIL",+   "why": "fixture staging failed: no URN in aps_search results",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_aps_open",+   "status": "PASS",+   "why": "",+   "sec": 49.4,+   "section": "aps"+  },+  {+   "verb": "fusion_open_design",+   "status": "MANUAL",+   "why": "local-file open; superseded by cloud flows",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_close_window#noargs",+   "status": "PASS",+   "why": "",+   "sec": 0.0,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_close_document",+   "status": "MANUAL",+   "why": "",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_close_all_documents",+   "status": "MANUAL",+   "why": "would close the user's own tabs",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_export_step",+   "status": "PASS",+   "why": "",+   "sec": 31.7,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_stl",+   "status": "PASS",+   "why": "",+   "sec": 8.4,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_3mf",+   "status": "PASS",+   "why": "",+   "sec": 179.5,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_f3d",+   "status": "PASS",+   "why": "",+   "sec": 3.0,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_iges",+   "status": "PASS",+   "why": "",+   "sec": 15.6,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_sat",+   "status": "PASS",+   "why": "",+   "sec": 18.9,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_obj",+   "status": "MANUAL",+   "why": "build/doc-type dependent (OBJ refused on the 2026-08-14 box); verify quarterly",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_fbx",+   "status": "MANUAL",+   "why": "build/doc-type dependent (OBJ refused on the 2026-08-14 box); verify quarterly",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_usdz",+   "status": "MANUAL",+   "why": "build/doc-type dependent (OBJ refused on the 2026-08-14 box); verify quarterly",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_dxf",+   "status": "MANUAL",+   "why": "build/doc-type dependent (OBJ refused on the 2026-08-14 box); verify quarterly",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_dwg",+   "status": "MANUAL",+   "why": "build/doc-type dependent (OBJ refused on the 2026-08-14 box); verify quarterly",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_skp",+   "status": "MANUAL",+   "why": "build/doc-type dependent (OBJ refused on the 2026-08-14 box); verify quarterly",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_optimized_glb",+   "status": "PASS",+   "why": "",+   "sec": 0.7,+   "section": "exports"+  },+  {+   "verb": "fusion_fetch_optimized_glb",+   "status": "PASS",+   "why": "",+   "sec": 0.1,+   "section": "exports"+  },+  {+   "verb": "fusion_set_design_rules",+   "status": "MANUAL",+   "why": "mutates the board's DRC rules",+   "section": "exports"+  },+  {+   "verb": "fusion_open_lbr",+   "status": "PASS",+   "why": "",+   "sec": 13.5,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_capture_library_views",+   "status": "PASS",+   "why": "",+   "sec": 28.2,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_show_symbol",+   "status": "PASS",+   "why": "",+   "sec": 9.5,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_show_footprint",+   "status": "PASS",+   "why": "",+   "sec": 9.3,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_show_symbol#wrap",+   "status": "PASS",+   "why": "",+   "sec": 14.4,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_generate_package",+   "status": "PASS",+   "why": "",+   "sec": 6.5,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_show_3d_package",+   "status": "MANUAL",+   "why": "enters Package3DEnvironment (exit needs Package3DStop + dialog); tour covers it; attach path in release rehearsals",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_attach_3d_package",+   "status": "MANUAL",+   "why": "modal Save dialog needs a human eye",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_make_3d_package",+   "status": "MANUAL",+   "why": "cloud upload; run in release rehearsals",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_build_library_3d",+   "status": "MANUAL",+   "why": "long multi-part build; release rehearsals",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_cleanup_cloud_files#guard",+   "status": "PASS",+   "why": "",+   "sec": 0.6,+   "section": "aps"+  },+  {+   "verb": "fusion_cleanup_cloud_files",+   "status": "MANUAL",+   "why": "real cleanup takes explicit lineage urns; used by weekly build rehearsals",+   "section": "aps"+  },+  {+   "verb": "fusion_new_electronics_from_eagle",+   "status": "MANUAL",+   "why": "drives native dialogs",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_import_step",+   "status": "PASS",+   "why": "",+   "sec": 2.5,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_demo#tour",+   "status": "PASS",+   "why": "",+   "sec": 41.3,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_demo_progress#unknown",+   "status": "PASS",+   "why": "",+   "sec": 0.1,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_stop",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_kill",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_signin",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_signin_2fa",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_demo",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_install_fusion",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_notify_owner",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_open_by_urn_note",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "focus_invariance",+   "status": "PASS",+   "why": "",+   "section": "gui-driving"+  }+ ],+ "durationSec": 857.9+}\ No newline at end of file
tests/reports/verb-test-2026-08-14_2028.jsonadded+547
@@ -0,0 +1,547 @@+{+ "date": "2026-08-14_2028",+ "target": "AdomLapper",+ "tier": "weekly",+ "pass": 51,+ "fail": 7,+ "sections": {+  "bridge-lifecycle": {+   "PASS": 4,+   "FAIL": 5,+   "MANUAL": 0,+   "SKIP": 0+  },+  "gui-driving": {+   "PASS": 13,+   "FAIL": 0,+   "MANUAL": 5,+   "SKIP": 0+  },+  "aps": {+   "PASS": 10,+   "FAIL": 2,+   "MANUAL": 4,+   "SKIP": 0+  },+  "auth-tokens": {+   "PASS": 2,+   "FAIL": 0,+   "MANUAL": 2,+   "SKIP": 0+  },+  "mcp-server": {+   "PASS": 4,+   "FAIL": 0,+   "MANUAL": 1,+   "SKIP": 0+  },+  "cad-3d-bom": {+   "PASS": 8,+   "FAIL": 0,+   "MANUAL": 0,+   "SKIP": 0+  },+  "exports": {+   "PASS": 4,+   "FAIL": 0,+   "MANUAL": 1,+   "SKIP": 0+  },+  "python-addin": {+   "PASS": 6,+   "FAIL": 0,+   "MANUAL": 1,+   "SKIP": 0+  }+ },+ "results": [+  {+   "verb": "fusion_readiness",+   "status": "PASS",+   "why": "",+   "sec": 5.3,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_describe",+   "status": "PASS",+   "why": "",+   "sec": 3.1,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_get_app_state",+   "status": "PASS",+   "why": "",+   "sec": 0.8,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_search_cloud_files",+   "status": "PASS",+   "why": "",+   "sec": 0.2,+   "section": "aps"+  },+  {+   "verb": "fusion_walk_cloud_tree",+   "status": "PASS",+   "why": "",+   "sec": 0.3,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_status",+   "status": "PASS",+   "why": "",+   "sec": 0.5,+   "section": "auth-tokens"+  },+  {+   "verb": "fusion_aps_get_browser",+   "status": "PASS",+   "why": "",+   "sec": 0.2,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_search",+   "status": "FAIL",+   "why": "expected success, got error=Request timed out code=None; expected >0 results",+   "sec": 60.0,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_recent",+   "status": "PASS",+   "why": "",+   "sec": 17.9,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_browse",+   "status": "PASS",+   "why": "",+   "sec": 2.5,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_file_info",+   "status": "PASS",+   "why": "",+   "sec": 40.2,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_versions",+   "status": "PASS",+   "why": "",+   "sec": 39.1,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_download",+   "status": "PASS",+   "why": "",+   "sec": 45.3,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_get",+   "status": "PASS",+   "why": "",+   "sec": 0.7,+   "section": "auth-tokens"+  },+  {+   "verb": "fusion_uninstall",+   "status": "PASS",+   "why": "",+   "sec": 0.6,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_aps_create_folder",+   "status": "MANUAL",+   "why": "needs projectId/parentFolderId of the test workspace",+   "section": "aps"+  },+  {+   "verb": "fusion_aps_upload",+   "status": "MANUAL",+   "why": "cloud write; exercised via build flows weekly",+   "section": "aps"+  },+  {+   "verb": "fusion_aps_set_client_id",+   "status": "MANUAL",+   "why": "would clobber org auth config",+   "section": "auth-tokens"+  },+  {+   "verb": "fusion_aps_set_browser",+   "status": "MANUAL",+   "why": "",+   "section": "aps"+  },+  {+   "verb": "fusion_aps_forget_browser",+   "status": "MANUAL",+   "why": "",+   "section": "aps"+  },+  {+   "verb": "fusion_aps_signin",+   "status": "MANUAL",+   "why": "opens a browser on the user's machine",+   "section": "auth-tokens"+  },+  {+   "verb": "fusion_start",+   "status": "PASS",+   "why": "",+   "sec": 1.9,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_get_preferences",+   "status": "PASS",+   "why": "",+   "sec": 0.2,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_set_preference",+   "status": "PASS",+   "why": "",+   "sec": 0.1,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_mcp_status",+   "status": "PASS",+   "why": "",+   "sec": 0.2,+   "section": "mcp-server"+  },+  {+   "verb": "fusion_mcp_tools",+   "status": "PASS",+   "why": "",+   "sec": 0.1,+   "section": "mcp-server"+  },+  {+   "verb": "fusion_mcp_resources",+   "status": "PASS",+   "why": "",+   "sec": 0.1,+   "section": "mcp-server"+  },+  {+   "verb": "fusion_mcp_enable",+   "status": "MANUAL",+   "why": "drives the prefs UI, takes foreground",+   "section": "mcp-server"+  },+  {+   "verb": "fusion_prefs_open",+   "status": "MANUAL",+   "why": "opens a dialog on the user's screen",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_prefs_close",+   "status": "MANUAL",+   "why": "",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_set_auto_update",+   "status": "PASS",+   "why": "",+   "sec": 0.1,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_assembly_bom",+   "status": "PASS",+   "why": "",+   "sec": 0.8,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_dismiss_blocking_dialogs",+   "status": "PASS",+   "why": "",+   "sec": 0.9,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_load_design_rules",+   "status": "MANUAL",+   "why": "mutates the board's DRC rules",+   "section": "exports"+  },+  {+   "verb": "fusion_open_cloud_file",+   "status": "PASS",+   "why": "",+   "sec": 14.4,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_show_schematic",+   "status": "PASS",+   "why": "",+   "sec": 11.1,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_show_2d_board",+   "status": "PASS",+   "why": "",+   "sec": 11.5,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_board_info",+   "status": "PASS",+   "why": "",+   "sec": 2.3,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_execute_text_command",+   "status": "PASS",+   "why": "",+   "sec": 1.5,+   "section": "python-addin"+  },+  {+   "verb": "fusion_electron_run",+   "status": "PASS",+   "why": "",+   "sec": 3.7,+   "section": "python-addin"+  },+  {+   "verb": "fusion_electron_zoom",+   "status": "PASS",+   "why": "",+   "sec": 4.2,+   "section": "python-addin"+  },+  {+   "verb": "fusion_electron_pan",+   "status": "PASS",+   "why": "",+   "sec": 3.5,+   "section": "python-addin"+  },+  {+   "verb": "fusion_detect_layers",+   "status": "PASS",+   "why": "",+   "sec": 0.8,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_export_gerbers",+   "status": "PASS",+   "why": "",+   "sec": 2.0,+   "section": "exports"+  },+  {+   "verb": "fusion_export_bom",+   "status": "PASS",+   "why": "",+   "sec": 2.0,+   "section": "exports"+  },+  {+   "verb": "fusion_export_cpl",+   "status": "PASS",+   "why": "",+   "sec": 1.2,+   "section": "exports"+  },+  {+   "verb": "fusion_board_stackup",+   "status": "PASS",+   "why": "",+   "sec": 8.9,+   "section": "exports"+  },+  {+   "verb": "fusion_show_3d_board",+   "status": "PASS",+   "why": "",+   "sec": 4.6,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_inspect_bodies",+   "status": "PASS",+   "why": "",+   "sec": 0.1,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_mcp_call",+   "status": "PASS",+   "why": "",+   "sec": 0.1,+   "section": "mcp-server"+  },+  {+   "verb": "fusion_assembly_bom#realboard",+   "status": "PASS",+   "why": "",+   "sec": 20.8,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_physical_properties",+   "status": "PASS",+   "why": "",+   "sec": 0.7,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_get_design_info",+   "status": "PASS",+   "why": "",+   "sec": 1.8,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_get_parameters",+   "status": "PASS",+   "why": "",+   "sec": 0.6,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_document_info",+   "status": "PASS",+   "why": "",+   "sec": 0.6,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_list_cloud_projects",+   "status": "PASS",+   "why": "",+   "sec": 1.1,+   "section": "aps"+  },+  {+   "verb": "fusion_list_cloud_files",+   "status": "PASS",+   "why": "",+   "sec": 2.6,+   "section": "aps"+  },+  {+   "verb": "fusion_run_modeling_script#guard",+   "status": "PASS",+   "why": "",+   "sec": 0.1,+   "section": "python-addin"+  },+  {+   "verb": "fusion_assembly_bom#guard",+   "status": "PASS",+   "why": "",+   "sec": 0.1,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_run_modeling_script",+   "status": "PASS",+   "why": "",+   "sec": 1.3,+   "section": "python-addin"+  },+  {+   "verb": "fusion_electron_select",+   "status": "MANUAL",+   "why": "selection state is user-visible",+   "section": "python-addin"+  },+  {+   "verb": "fusion_open_by_urn",+   "status": "FAIL",+   "why": "fixture staging failed: no URN in aps_search results",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_aps_open",+   "status": "FAIL",+   "why": "expected success, got error=target_not_found code=None",+   "sec": 0.0,+   "section": "aps"+  },+  {+   "verb": "fusion_open_design",+   "status": "MANUAL",+   "why": "local-file open; superseded by cloud flows",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_close_window#noargs",+   "status": "PASS",+   "why": "",+   "sec": 0.0,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_close_document",+   "status": "MANUAL",+   "why": "",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_close_all_documents",+   "status": "MANUAL",+   "why": "would close the user's own tabs",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_export_step",+   "status": "FAIL",+   "why": "expected success, got error=target_not_found code=None",+   "sec": 0.0,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_stl",+   "status": "FAIL",+   "why": "expected success, got error=target_not_found code=None",+   "sec": 0.0,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_3mf",+   "status": "FAIL",+   "why": "expected success, got error=target_not_found code=None",+   "sec": 0.0,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_f3d",+   "status": "FAIL",+   "why": "relay lost the target (run aborted; not a verb failure)",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "focus_invariance",+   "status": "PASS",+   "why": "",+   "section": "gui-driving"+  }+ ],+ "durationSec": 382.8+}\ No newline at end of file
tests/reports/verb-test-2026-08-15_0201.jsonadded+773
@@ -0,0 +1,773 @@+{+ "date": "2026-08-15_0201",+ "target": "AdomLapper",+ "tier": "weekly",+ "pass": 70,+ "fail": 2,+ "sections": {+  "bridge-lifecycle": {+   "PASS": 15,+   "FAIL": 0,+   "MANUAL": 11,+   "SKIP": 0+  },+  "gui-driving": {+   "PASS": 15,+   "FAIL": 2,+   "MANUAL": 13,+   "SKIP": 0+  },+  "aps": {+   "PASS": 13,+   "FAIL": 0,+   "MANUAL": 5,+   "SKIP": 0+  },+  "auth-tokens": {+   "PASS": 2,+   "FAIL": 0,+   "MANUAL": 2,+   "SKIP": 0+  },+  "mcp-server": {+   "PASS": 4,+   "FAIL": 0,+   "MANUAL": 1,+   "SKIP": 0+  },+  "cad-3d-bom": {+   "PASS": 9,+   "FAIL": 0,+   "MANUAL": 0,+   "SKIP": 0+  },+  "exports": {+   "PASS": 6,+   "FAIL": 0,+   "MANUAL": 2,+   "SKIP": 0+  },+  "python-addin": {+   "PASS": 6,+   "FAIL": 0,+   "MANUAL": 1,+   "SKIP": 0+  }+ },+ "results": [+  {+   "verb": "fusion_readiness",+   "status": "PASS",+   "why": "",+   "sec": 4.9,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_describe",+   "status": "PASS",+   "why": "",+   "sec": 0.1,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_get_app_state",+   "status": "PASS",+   "why": "",+   "sec": 1.1,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_search_cloud_files",+   "status": "PASS",+   "why": "",+   "sec": 0.1,+   "section": "aps"+  },+  {+   "verb": "fusion_walk_cloud_tree",+   "status": "PASS",+   "why": "",+   "sec": 0.1,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_status",+   "status": "PASS",+   "why": "",+   "sec": 0.1,+   "section": "auth-tokens"+  },+  {+   "verb": "fusion_aps_get_browser",+   "status": "PASS",+   "why": "",+   "sec": 0.1,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_search",+   "status": "PASS",+   "why": "",+   "sec": 52.8,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_recent",+   "status": "PASS",+   "why": "",+   "sec": 12.3,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_browse",+   "status": "PASS",+   "why": "",+   "sec": 1.4,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_file_info",+   "status": "PASS",+   "why": "",+   "sec": 34.9,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_versions",+   "status": "PASS",+   "why": "",+   "sec": 32.6,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_download",+   "status": "PASS",+   "why": "",+   "sec": 31.2,+   "section": "aps"+  },+  {+   "verb": "fusion_aps_get",+   "status": "PASS",+   "why": "",+   "sec": 1.4,+   "section": "auth-tokens"+  },+  {+   "verb": "fusion_uninstall",+   "status": "PASS",+   "why": "",+   "sec": 0.8,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_aps_create_folder",+   "status": "MANUAL",+   "why": "needs projectId/parentFolderId of the test workspace",+   "section": "aps"+  },+  {+   "verb": "fusion_aps_upload",+   "status": "MANUAL",+   "why": "cloud write; exercised via build flows weekly",+   "section": "aps"+  },+  {+   "verb": "fusion_aps_set_client_id",+   "status": "MANUAL",+   "why": "would clobber org auth config",+   "section": "auth-tokens"+  },+  {+   "verb": "fusion_aps_set_browser",+   "status": "MANUAL",+   "why": "",+   "section": "aps"+  },+  {+   "verb": "fusion_aps_forget_browser",+   "status": "MANUAL",+   "why": "",+   "section": "aps"+  },+  {+   "verb": "fusion_aps_signin",+   "status": "MANUAL",+   "why": "opens a browser on the user's machine",+   "section": "auth-tokens"+  },+  {+   "verb": "fusion_start",+   "status": "PASS",+   "why": "",+   "sec": 3.3,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_get_preferences",+   "status": "PASS",+   "why": "",+   "sec": 0.4,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_set_preference",+   "status": "PASS",+   "why": "",+   "sec": 0.3,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_mcp_status",+   "status": "PASS",+   "why": "",+   "sec": 0.4,+   "section": "mcp-server"+  },+  {+   "verb": "fusion_mcp_tools",+   "status": "PASS",+   "why": "",+   "sec": 0.2,+   "section": "mcp-server"+  },+  {+   "verb": "fusion_mcp_resources",+   "status": "PASS",+   "why": "",+   "sec": 0.3,+   "section": "mcp-server"+  },+  {+   "verb": "fusion_mcp_enable",+   "status": "MANUAL",+   "why": "drives the prefs UI, takes foreground",+   "section": "mcp-server"+  },+  {+   "verb": "fusion_prefs_open",+   "status": "MANUAL",+   "why": "opens a dialog on the user's screen",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_prefs_close",+   "status": "MANUAL",+   "why": "",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_set_auto_update",+   "status": "PASS",+   "why": "",+   "sec": 0.2,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_assembly_bom",+   "status": "PASS",+   "why": "",+   "sec": 21.8,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_dismiss_blocking_dialogs",+   "status": "PASS",+   "why": "",+   "sec": 2.1,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_load_design_rules",+   "status": "MANUAL",+   "why": "mutates the board's DRC rules",+   "section": "exports"+  },+  {+   "verb": "fusion_open_cloud_file",+   "status": "PASS",+   "why": "",+   "sec": 23.3,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_show_schematic",+   "status": "FAIL",+   "why": "expected success, got error=Fusion main thread busy \u2014 get_app_state running for 7.2s. code=main_thread_busy",+   "sec": 59.0,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_show_2d_board",+   "status": "FAIL",+   "why": "expected success, got error=addin_command_timeout code=None",+   "sec": 59.4,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_board_info",+   "status": "PASS",+   "why": "",+   "sec": 1.5,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_execute_text_command",+   "status": "PASS",+   "why": "",+   "sec": 1.4,+   "section": "python-addin"+  },+  {+   "verb": "fusion_electron_run",+   "status": "PASS",+   "why": "",+   "sec": 3.5,+   "section": "python-addin"+  },+  {+   "verb": "fusion_electron_zoom",+   "status": "PASS",+   "why": "",+   "sec": 3.8,+   "section": "python-addin"+  },+  {+   "verb": "fusion_electron_pan",+   "status": "PASS",+   "why": "",+   "sec": 3.5,+   "section": "python-addin"+  },+  {+   "verb": "fusion_detect_layers",+   "status": "PASS",+   "why": "",+   "sec": 0.8,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_export_gerbers",+   "status": "PASS",+   "why": "",+   "sec": 2.0,+   "section": "exports"+  },+  {+   "verb": "fusion_export_bom",+   "status": "PASS",+   "why": "",+   "sec": 1.7,+   "section": "exports"+  },+  {+   "verb": "fusion_export_cpl",+   "status": "PASS",+   "why": "",+   "sec": 0.9,+   "section": "exports"+  },+  {+   "verb": "fusion_board_stackup",+   "status": "PASS",+   "why": "",+   "sec": 8.0,+   "section": "exports"+  },+  {+   "verb": "fusion_show_3d_board",+   "status": "PASS",+   "why": "",+   "sec": 4.7,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_inspect_bodies",+   "status": "PASS",+   "why": "",+   "sec": 0.1,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_mcp_call",+   "status": "PASS",+   "why": "",+   "sec": 0.1,+   "section": "mcp-server"+  },+  {+   "verb": "fusion_assembly_bom#realboard",+   "status": "PASS",+   "why": "",+   "sec": 21.2,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_physical_properties",+   "status": "PASS",+   "why": "",+   "sec": 0.8,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_get_design_info",+   "status": "PASS",+   "why": "",+   "sec": 2.0,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_get_parameters",+   "status": "PASS",+   "why": "",+   "sec": 0.6,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_document_info",+   "status": "PASS",+   "why": "",+   "sec": 0.6,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_list_cloud_projects",+   "status": "PASS",+   "why": "",+   "sec": 1.6,+   "section": "aps"+  },+  {+   "verb": "fusion_list_cloud_files",+   "status": "PASS",+   "why": "",+   "sec": 1.7,+   "section": "aps"+  },+  {+   "verb": "fusion_run_modeling_script#guard",+   "status": "PASS",+   "why": "",+   "sec": 0.1,+   "section": "python-addin"+  },+  {+   "verb": "fusion_assembly_bom#guard",+   "status": "PASS",+   "why": "",+   "sec": 0.0,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_run_modeling_script",+   "status": "PASS",+   "why": "",+   "sec": 1.2,+   "section": "python-addin"+  },+  {+   "verb": "fusion_electron_select",+   "status": "MANUAL",+   "why": "selection state is user-visible",+   "section": "python-addin"+  },+  {+   "verb": "fusion_open_by_urn",+   "status": "PASS",+   "why": "",+   "sec": 6.3,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_aps_open",+   "status": "PASS",+   "why": "",+   "sec": 29.4,+   "section": "aps"+  },+  {+   "verb": "fusion_open_design",+   "status": "MANUAL",+   "why": "local-file open; superseded by cloud flows",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_close_window#noargs",+   "status": "PASS",+   "why": "",+   "sec": 0.0,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_close_document",+   "status": "MANUAL",+   "why": "",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_close_all_documents",+   "status": "MANUAL",+   "why": "would close the user's own tabs",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_export_step",+   "status": "PASS",+   "why": "",+   "sec": 25.0,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_stl",+   "status": "PASS",+   "why": "",+   "sec": 7.8,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_3mf",+   "status": "PASS",+   "why": "",+   "sec": 110.2,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_f3d",+   "status": "PASS",+   "why": "",+   "sec": 3.1,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_iges",+   "status": "PASS",+   "why": "",+   "sec": 14.3,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_sat",+   "status": "PASS",+   "why": "",+   "sec": 14.9,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_obj",+   "status": "MANUAL",+   "why": "build/doc-type dependent (OBJ refused on the 2026-08-14 box); verify quarterly",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_fbx",+   "status": "MANUAL",+   "why": "build/doc-type dependent (OBJ refused on the 2026-08-14 box); verify quarterly",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_usdz",+   "status": "MANUAL",+   "why": "build/doc-type dependent (OBJ refused on the 2026-08-14 box); verify quarterly",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_dxf",+   "status": "MANUAL",+   "why": "build/doc-type dependent (OBJ refused on the 2026-08-14 box); verify quarterly",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_dwg",+   "status": "MANUAL",+   "why": "build/doc-type dependent (OBJ refused on the 2026-08-14 box); verify quarterly",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_skp",+   "status": "MANUAL",+   "why": "build/doc-type dependent (OBJ refused on the 2026-08-14 box); verify quarterly",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_export_optimized_glb",+   "status": "PASS",+   "why": "",+   "sec": 0.7,+   "section": "exports"+  },+  {+   "verb": "fusion_fetch_optimized_glb",+   "status": "PASS",+   "why": "",+   "sec": 0.0,+   "section": "exports"+  },+  {+   "verb": "fusion_set_design_rules",+   "status": "MANUAL",+   "why": "mutates the board's DRC rules",+   "section": "exports"+  },+  {+   "verb": "fusion_open_lbr",+   "status": "PASS",+   "why": "",+   "sec": 11.3,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_capture_library_views",+   "status": "PASS",+   "why": "",+   "sec": 28.2,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_show_symbol",+   "status": "PASS",+   "why": "",+   "sec": 9.3,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_show_footprint",+   "status": "PASS",+   "why": "",+   "sec": 9.1,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_show_symbol#wrap",+   "status": "PASS",+   "why": "",+   "sec": 14.3,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_generate_package",+   "status": "PASS",+   "why": "",+   "sec": 6.5,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_show_3d_package",+   "status": "MANUAL",+   "why": "enters Package3DEnvironment (exit needs Package3DStop + dialog); tour covers it; attach path in release rehearsals",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_attach_3d_package",+   "status": "MANUAL",+   "why": "modal Save dialog needs a human eye",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_make_3d_package",+   "status": "MANUAL",+   "why": "cloud upload; run in release rehearsals",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_build_library_3d",+   "status": "MANUAL",+   "why": "long multi-part build; release rehearsals",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_cleanup_cloud_files#guard",+   "status": "PASS",+   "why": "",+   "sec": 0.6,+   "section": "aps"+  },+  {+   "verb": "fusion_cleanup_cloud_files",+   "status": "MANUAL",+   "why": "real cleanup takes explicit lineage urns; used by weekly build rehearsals",+   "section": "aps"+  },+  {+   "verb": "fusion_new_electronics_from_eagle",+   "status": "MANUAL",+   "why": "drives native dialogs",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_import_step",+   "status": "PASS",+   "why": "",+   "sec": 2.7,+   "section": "cad-3d-bom"+  },+  {+   "verb": "fusion_demo#tour",+   "status": "PASS",+   "why": "",+   "sec": 45.4,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_demo_progress#unknown",+   "status": "PASS",+   "why": "",+   "sec": 0.0,+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_stop",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_kill",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_signin",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_signin_2fa",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_demo",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier",+   "section": "gui-driving"+  },+  {+   "verb": "fusion_install_fusion",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_notify_owner",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "fusion_open_by_urn_note",+   "status": "MANUAL",+   "why": "lifecycle/human-wall verbs; manual tier",+   "section": "bridge-lifecycle"+  },+  {+   "verb": "focus_invariance",+   "status": "PASS",+   "why": "",+   "section": "gui-driving"+  }+ ],+ "durationSec": 842.5+}\ No newline at end of file
tests/reports/verb-test-2026-08-15_0204.jsonadded+38
@@ -0,0 +1,38 @@+{+ "date": "2026-08-15_0204",+ "target": "AdomLapper",+ "tier": "daily",+ "pass": 0,+ "fail": 3,+ "sections": {+  "gui-driving": {+   "PASS": 0,+   "FAIL": 3,+   "MANUAL": 0,+   "SKIP": 0+  }+ },+ "results": [+  {+   "verb": "fusion_show_schematic",+   "status": "FAIL",+   "why": "expected success, got error=Switch to schematic failed: 3 : Please open or create an electronics design to c code=None",+   "sec": 1.0,+   "section": "gui-driving"+  },+  {+   "verb": "fusion_show_2d_board",+   "status": "FAIL",+   "why": "expected success, got error=Switch to 2D board failed: 3 : Please open or create an electronics design to co code=None",+   "sec": 0.8,+   "section": "gui-driving"+  },+  {+   "verb": "focus_invariance",+   "status": "FAIL",+   "why": "foreground is 'Fusion360' after the run",+   "section": "gui-driving"+  }+ ],+ "durationSec": 2.0+}\ No newline at end of file