← Commit history

Add live Fusion net routing with verified copper and recorded demo

John Lauer ·04189174ec ·1mo ago ·parent 3e27d7f
95 files changed +27451−9
.gitignore+3BRIDGE_VERSION+1−1bridge.json+4−1contracts/describe.json+70demo/routing/README.md+128demo/routing/call.py+32demo/routing/evidence/boards/fusion-routing-routed.brd+461demo/routing/evidence/boards/fusion-routing-routed.fbrddemo/routing/evidence/dev-bridge.json+8demo/routing/evidence/final-take/001-fusion_routing_state.json+355demo/routing/evidence/final-take/002-fusion_route_net.json+94demo/routing/evidence/final-take/003-fusion_route_net.json+94demo/routing/evidence/final-take/004-fusion_route_net.json+118demo/routing/evidence/final-take/005-fusion_route_net.json+94demo/routing/evidence/final-take/006-fusion_route_net.json+94demo/routing/evidence/final-take/007-fusion_route_net.json+135demo/routing/evidence/final-take/008-fusion_execute_text_command.json+30demo/routing/evidence/final-take/009-desktop_record_window_start.json+39demo/routing/evidence/final-take/010-fusion_route_net.json+412demo/routing/evidence/final-take/011-fusion_route_net.json+426demo/routing/evidence/final-take/012-fusion_route_net.json+428demo/routing/evidence/final-take/013-fusion_routing_drc.json+430demo/routing/evidence/final-take/014-fusion_route_net.json+442demo/routing/evidence/final-take/015-fusion_route_net.json+456demo/routing/evidence/final-take/016-fusion_route_net.json+458demo/routing/evidence/final-take/017-fusion_routing_drc.json+454demo/routing/evidence/final-take/018-fusion_route_net.json+472demo/routing/evidence/final-take/019-fusion_route_net.json+482demo/routing/evidence/final-take/020-fusion_route_net.json+497demo/routing/evidence/final-take/021-fusion_route_net.json+506demo/routing/evidence/final-take/022-fusion_route_net.json+509demo/routing/evidence/final-take/023-fusion_routing_drc.json+499demo/routing/evidence/final-take/024-fusion_route_net.json+523demo/routing/evidence/final-take/025-fusion_route_net.json+537demo/routing/evidence/final-take/026-fusion_route_net.json+539demo/routing/evidence/final-take/027-fusion_routing_drc.json+523demo/routing/evidence/final-take/028-fusion_route_net.json+553demo/routing/evidence/final-take/029-fusion_route_net.json+567demo/routing/evidence/final-take/030-fusion_route_net.json+569demo/routing/evidence/final-take/031-fusion_routing_drc.json+547demo/routing/evidence/final-take/032-fusion_route_net.json+583demo/routing/evidence/final-take/033-fusion_route_net.json+597demo/routing/evidence/final-take/034-fusion_route_net.json+601demo/routing/evidence/final-take/035-fusion_route_net.json+629demo/routing/evidence/final-take/036-fusion_route_net.json+630demo/routing/evidence/final-take/037-fusion_routing_drc.json+595demo/routing/evidence/final-take/038-desktop_record_window_stop.json+35demo/routing/evidence/final-take/result.json+592demo/routing/evidence/final-video-probe.json+18demo/routing/evidence/final-video-recording.json+28demo/routing/evidence/install.json+11demo/routing/evidence/live-rejections.json+99demo/routing/evidence/per-net/001-fusion_routing_state.json+355demo/routing/evidence/per-net/002-fusion_route_net.json+94demo/routing/evidence/per-net/003-fusion_route_net.json+94demo/routing/evidence/per-net/004-fusion_route_net.json+118demo/routing/evidence/per-net/005-fusion_route_net.json+94demo/routing/evidence/per-net/006-fusion_route_net.json+94demo/routing/evidence/per-net/007-fusion_route_net.json+135demo/routing/evidence/per-net/008-fusion_route_net.json+466demo/routing/evidence/per-net/009-fusion_routing_drc.json+430demo/routing/evidence/per-net/010-fusion_route_net.json+496demo/routing/evidence/per-net/011-fusion_routing_drc.json+454demo/routing/evidence/per-net/012-fusion_route_net.json+573demo/routing/evidence/per-net/013-fusion_routing_drc.json+499demo/routing/evidence/per-net/014-fusion_route_net.json+577demo/routing/evidence/per-net/015-fusion_routing_drc.json+523demo/routing/evidence/per-net/016-fusion_route_net.json+607demo/routing/evidence/per-net/017-fusion_routing_drc.json+547demo/routing/evidence/per-net/018-fusion_route_net.json+711demo/routing/evidence/per-net/019-fusion_routing_drc.json+595demo/routing/evidence/per-net/result.json+592demo/routing/evidence/pinned-refresh.json+23demo/routing/evidence/redo-final.json+582demo/routing/evidence/undo-final.json+581demo/routing/evidence/video-delivery.json+12demo/routing/fixture/fusion-routing.brd+175demo/routing/fixture/fusion-routing.sch+190demo/routing/fixture/plan.json+155demo/routing/make_fixture.py+91demo/routing/run_demo.py+68demo/routing/screenshots/end.pngdemo/routing/screenshots/start.pngdemo/routing/videos/fusion-live-trace-routing.mp4describe.py+10package.json+1−1rust/Cargo.lock+5−5rust/Cargo.toml+1−1rust/bridge/src/main.rs+10rust/bridge/src/routing.rs+29rust/bridge/src/routing_script.py+326server.py+7skills/fusion-routing/SKILL.md+31tests/test_routing.py+72tools/install-routing-dev.ps1+21
.gitignore+3
@@ -8,3 +8,6 @@ adom-bridge-fusion-source.tar.gz adom-bridge-fusion.bundle dashboard/target/ rust/target/++# Full window-capture originals stay local; the share copy is versioned.+demo/routing/videos/window-*.mp4
BRIDGE_VERSION+1−1
@@ -1 +1 @@-1.9.366\ No newline at end of file+1.10.0-dev.routing.1\ No newline at end of file
bridge.json+4−1
@@ -2,7 +2,7 @@   "manifest_version": 1,   "name": "fusion360",   "displayName": "Autodesk Fusion 360",-  "version": "1.9.366",+  "version": "1.10.0-dev.routing.1",   "description": "Drive Autodesk Fusion 360 from the cloud: launch Fusion, electronics board layout, design rules, exports (STEP/IGES/STL/3MF/USDZ/OBJ/DXF/DWG/Gerbers/BOM/CPL), fast APS server-indexed cloud search plus browse/recent/file-info/versions, cloud file download/upload and folder creation, and in-app parametric modeling (fusion_run_modeling_script). Never-charge: APS calls are capped to the free tier.",   "homepage": "https://wiki.adom.inc/adom/fusion-bridge",   "author": "Adom Inc.",@@ -68,6 +68,9 @@     "fusion_open_by_urn",     "fusion_open_lbr",     "fusion_readiness",+    "fusion_route_net",+    "fusion_routing_drc",+    "fusion_routing_state",     "fusion_run_modeling_script",     "fusion_search_cloud_files",     "fusion_set_design_rules",
contracts/describe.json+70
@@ -2012,6 +2012,76 @@       "summary": "ASYNC: returns immediately (started:true) and restarts Fusion in the background, SAVING the user's open documents first; poll fusion_readiness until ready with the new addinVersion (a restart takes 60-120s, longer than the relay budget; pass wait:true for the old blocking form). Finish add-in setup by restarting Fusion. Call this when any verb returns errorCode addin_restart_required (the add-in was installed/updated while Fusion was already open, and Fusion only loads add-ins at launch). ASK THE USER FIRST when a human is present - the failing verb's payload carries userMessage plus openDocuments/unsavedDocuments so you can show them what is open. Refuses with unsaved_named_document rather than discarding a never-saved document.",       "timeoutSeconds": 300     },+    {+      "example": {},+      "input": {+        "boardId": "required from routing_state",+        "clearance": "mm lower bound, default .2",+        "dryRun": "optional bool",+        "expectDocument": "required exact board name",+        "expectedRevision": "required from routing_state",+        "layer": "1 or 16, default 1",+        "net": "required exact name",+        "paths": "optional list of paths instead of points",+        "points": "waypoints [x,y] or {pad} or {x,y,layer}",+        "viaDiameter": "mm, default .6",+        "viaDrill": "mm, default .3",+        "width": "mm, default .25"+      },+      "longRunning": false,+      "name": "fusion_route_net",+      "output": {+        "mutated": "bool",+        "plan": "obj",+        "remainingNets": "list",+        "revision": "str",+        "success": "bool",+        "verified": "bool"+      },+      "statusVerb": "fusion_routing_state",+      "summary": "Create explicit net copper in the live Fusion canvas. Conservative clearance preflight, board/revision guards and exact copper readback. One or several trace segments per call; no general autorouting. Use routing_drc for native DRC.",+      "timeoutSeconds": 120+    },+    {+      "example": {},+      "input": {+        "boardId": "required",+        "expectDocument": "required exact board name",+        "expectedRevision": "required"+      },+      "longRunning": false,+      "name": "fusion_routing_drc",+      "output": {+        "drc": "{checked,clean,errorCount,warningCount,airwireCount,errors}",+        "revision": "str"+      },+      "statusVerb": "fusion_routing_state",+      "summary": "Run fresh native Autodesk DRC and read UL_BOARD.errors, including approved errors, warnings and airwires. Does not accept or clear any violation.",+      "timeoutSeconds": 120+    },+    {+      "example": {+        "expectDocument": "fusion-routing"+      },+      "input": {+        "boardId": "optional document creationId guard",+        "expectDocument": "required exact active board name"+      },+      "longRunning": false,+      "name": "fusion_routing_state",+      "output": {+        "boardId": "str",+        "nets": "list",+        "pads": "list",+        "remainingNets": "list",+        "revision": "str",+        "segments": "list",+        "vias": "list"+      },+      "statusVerb": "fusion_routing_state",+      "summary": "Read the live board's identity, geometry revision, pads, copper and per-net airwires from a fresh Fusion export.",+      "timeoutSeconds": 60+    },     {       "example": {         "script": "import adsk.fusion\n# ...build geometry..."
demo/routing/README.mdadded+128
@@ -0,0 +1,128 @@+# Live Fusion trace routing++Development branch `feature/per-net-trace-routing`, based on wiki+`adom/fusion-bridge` commit `3e27d7f04743fef7a864bbc84bc0abc7bbabbe86`+(version 1.9.366). Runtime version: `1.10.0-dev.routing.1`.++This adds three bridge verbs that edit and inspect the **live Fusion board**.+The caller supplies the paths. This is explicit copper creation, not an+obstacle-avoiding autorouter or a production PCB design.++| Verb | Purpose |+| --- | --- |+| `fusion_routing_state` | Fresh export: document creation ID, geometry revision, pad coordinates, net membership, traces, vias and remaining airwires. Requires `expectDocument`. |+| `fusion_route_net` | Validate and add one net's explicit path(s). Requires `expectDocument`, `boardId`, `expectedRevision`, `net`, and `points` or `paths`. Returns verified copper and the new revision. `dryRun:true` does preflight only. |+| `fusion_routing_drc` | Recompute airwires, run Autodesk DRC and read its native error objects through ULP. Reports errors, warnings, approved violations and airwires. Does not clear or approve errors. |++Coordinates and dimensions are millimetres. Layers are `1` (top) and `16`+(bottom). A waypoint is `[x,y]`, `{pad:"J1.1"}` or `{x,y,layer}`. A layer marker+changes the outgoing layer at that point and creates a through via. Defaults:+0.25 mm width, 0.6 mm via diameter, 0.3 mm drill, 0.2 mm clearance lower bound.+Board and net-class minimums can make the required clearance larger.++Each call reads the board on Fusion's main thread, checks identity and revision,+preflights all requested geometry, creates copper with complete EAGLE commands,+recalculates airwires, repaints and exports again to verify the entire copper+delta. Fusion can split an existing wire when a branch attaches to its middle;+comparison uses occupied centerline intervals to tolerate that without accepting+a different route. The test's 20 requested segments therefore become 21 stored+segments when Fusion inserts the branch junction.++The Rust executable embeds `rust/bridge/src/routing_script.py` and sends it+through the already installed add-in's script transport. Developing these verbs+does **not** require restarting Fusion or replacing its loaded Python modules.+The Python server has a compatibility handler for source-based installations.++## Current limits++The conservative geometric preflight supports two-layer boards with rectangular+outlines, straight copper, through vias and embedded pads/SMDs. It refuses+polygons, curved copper, restrict/copper artwork, milling and footprint holes it+cannot model. Pad obstacles use bounding circles, so some legal routes are+conservatively rejected. This is not a complete implementation of Autodesk's+rules; use native DRC to establish the final result. Arbitrary bend preferences+may change the route generated by LINE; exact read-back rejects that result.+The verified demo uses horizontal and vertical segments.++A call is not an atomic transaction. A via and its drill change can occupy two+native Undo steps. On execution failure or read-back mismatch, copper may already+exist; the result reports that and the caller must inspect state before retrying.+There is no blind retry, automatic rollback, file rewrite, fake canvas or+simulated animation. The exported schematic accompanies the board fixture but+the live test opens the local board directly; it does not claim a cloud-linked+schematic/project was created.++## Build and test++```sh+python3 demo/routing/make_fixture.py demo/routing/fixture+python3 -m unittest discover -s tests -p test_routing.py -v+cargo test --manifest-path rust/Cargo.toml -p adom-fusion-bridge routing::tests+cargo build --manifest-path rust/Cargo.toml -p adom-fusion-bridge \+  --target x86_64-pc-windows-gnu --release+```++For development installation, stage the compiled exe on the host, pin+`fusion360` with `bridge_dev_mode`, pause the bridge's routing, stop only its+service, and run `tools/install-routing-dev.ps1 -Cache <cache> -Staged <exe>`.+It requires the pin, backs up the current exe and manifest, preserves unrelated+manifest fields, and verifies the copied executable's hash. Resume the bridge,+wait for it to answer, and verify the actual `bridgeVersion` returned by a new+routing verb. The host application's documents stay open. Keep the pin until the+development build is deliberately retired.++## Reproduce the demo++Stage both fixture files to a fresh host directory. Open `fusion-routing.brd`+with `fusion_open_board` and verify the PCB Editor, three elements and 13 pads.+Do not overwrite an open file. The original source fixture contains no copper.+Resolve the real Fusion HWND with `desktop_list_windows`. Foreground only if the+user asked to watch; window capture also works in the background.++```sh+python3 demo/routing/run_demo.py --target AdomLapper --hwnd <Fusion HWND> \+  --record --output demo/routing/evidence/new-take+```++The script refuses pre-existing copper and preflights the complete plan before+recording. It commits one trace or via per request and runs native DRC after+each net. `--per-net` exercises a whole net per request instead. It captures+**only the Fusion window**, finalizes even on a failure, and stores every call's+arguments, elapsed time and response. There is a deliberate 0.2-second pause+between traces to keep changes readable. Geometry comes from the accompanying+explicit plan, adapted from the KiCad Astra test coupon. It is not a claim that+Astra independently solved a congested board during this take.++## Live acceptance — AdomLapper, 2026-09-05++The recorded per-trace run connected six nets and 13 pads with 21 stored copper+segments and two vias. Native Autodesk DRC returned **zero errors, zero warnings,+zero airwires**. Wrong-net, wrong-board, stale-revision and crossing-clearance+rejections passed without mutation; dry-run left the revision unchanged.+Native Undo removed the last segment and restored one airwire; Redo restored+exactly the final geometry revision.++Whole-net mode also passed with the same final counts and a clean native DRC.++The original MP4 is retained locally in `videos/` (excluded from the branch);+the recorder reported 806 frames at+2564 x 1540. Detailed acceptance is in `evidence/final-take/result.json`;+per-call evidence is in the same directory. The native and EAGLE board exports+are in `evidence/boards/` and on the host under+`C:/Users/john/Documents/fusion-routing-dev/`.++Autodesk's primary references: [LINE](https://help.autodesk.com/cloudhelp/ENU/Fusion-ECAD/files/ECD-CLI-L.htm),+[VIA](https://help.autodesk.com/cloudhelp/ENU/Fusion-ECAD/files/ECD-CLI-V.htm),+[DRC](https://help.autodesk.com/cloudhelp/ENU/Fusion-ECAD/files/ECD-CLI-D.htm),+[UL_ERROR](https://help.autodesk.com/cloudhelp/ENU/Fusion-ECAD/files/ECD-ULP-ERROR.htm).++The final take explicitly repaints the unrouted board before recording. The+share copy `videos/fusion-live-trace-routing.mp4` is resized to 1920 pixels wide+and H.264-compressed with original timestamps; there are no editorial cuts or+playback-speed changes. Raw recorder elapsed time and encoded duration are+reported separately in `evidence/final-video-recording.json` and+`evidence/final-video-probe.json`. The first and final video frames were inspected+and the full share copy decoded successfully.++The shareable video is also saved on AdomLapper at+`C:/Users/john/Documents/fusion-routing-dev/fusion-live-trace-routing.mp4`.
demo/routing/call.pyadded+32
@@ -0,0 +1,32 @@+"""CLI for development probes. --script-transport exercises the embedded source before installing the exe."""+import argparse+import json+from pathlib import Path+import subprocess+ROOT=Path(__file__).resolve().parents[2]++def call(verb,args,target='AdomLapper',script_transport=False):+    if script_transport:+        source=(ROOT/'rust/bridge/src/routing_script.py').read_text()+        script='import json\nexec('+repr(source)+')\nresult=handle(app,json.loads('+repr(json.dumps(args))+'),'+repr(verb.removeprefix('fusion_'))+')\n'+        verb='fusion_run_modeling_script'; args={'script':script,'expectDocument':args.get('expectDocument')}+    cp=subprocess.run(['adom-bridge','--target',target,'--ai-thread','Fusion trace routing',verb,json.dumps(args)],capture_output=True,text=True,timeout=190)+    r=json.loads(cp.stdout)+    if isinstance(r.get('output'),str):+        try:+            inner=json.loads(r['output'])+            if isinstance(inner,dict):+                for k,v in inner.items():+                    if k not in r:r[k]=v+                if isinstance(inner.get('data'),dict):+                    for k,v in inner['data'].items():+                        if k not in r:r[k]=v+        except (ValueError,TypeError):pass+    if script_transport and isinstance(r.get('data',{}).get('result'),dict): return r['data']['result']+    return {k:v for k,v in r.items() if k!='output'}++if __name__=='__main__':+    p=argparse.ArgumentParser();p.add_argument('verb');p.add_argument('args');p.add_argument('--script-transport',action='store_true');p.add_argument('--output')+    a=p.parse_args();r=call(a.verb,json.loads(a.args),script_transport=a.script_transport)+    if a.output: Path(a.output).write_text(json.dumps(r,indent=2)+'\n')+    print(json.dumps(r,indent=2))
demo/routing/evidence/boards/fusion-routing-routed.brdadded+461
@@ -0,0 +1,461 @@+<?xml version="1.0" encoding="utf-8"?>+<!DOCTYPE eagle SYSTEM "eagle.dtd">+<eagle version="9.7.0">+<drawing>+<settings>+<setting alwaysvectorfont="no"/>+<setting verticaltext="up"/>+<setting violationmode="Push"/>+<drillsymbolsettings symboldiameter="650240" symbolwidth="8128">+<drill diameter="64000" />+<drill diameter="80000" />+<drill diameter="96000" />+<drill diameter="112000" />+<drill diameter="128000" />+<drill diameter="144000" />+<drill diameter="160000" />+<drill diameter="176000" />+<drill diameter="192000" />+<drill diameter="208000" />+<drill diameter="224000" />+<drill diameter="240000" />+<drill diameter="256000" />+<drill diameter="272000" />+<drill diameter="288000" />+<drill diameter="320000" />+</drillsymbolsettings>+</settings>+<grid distance="1" unitdist="mm" unit="mm" style="lines" multiple="1" display="no" altdistance="0.1" altunitdist="mm" altunit="mm"/>+<layers>+<layer number="1" name="Top" blackcolor="0xc8ff4164" whitecolor="0xccc90d0c" coloredcolor="0xccc90d0c" blackhighlight="0xccff0000" whitehighlight="0xb4ff0000" coloredhighlight="0xb4ff0000" fill="1" visible="yes" active="yes" locked="no"/>+<layer number="16" name="Bottom" blackcolor="0xc80696d7" whitecolor="0xcc0696d7" coloredcolor="0xcc0696d7" blackhighlight="0xb40000ff" whitehighlight="0xcc8252c2" coloredhighlight="0xcc8252c2" fill="1" visible="yes" active="yes" locked="no"/>+<layer number="17" name="Pads" blackcolor="0xb462d987" whitecolor="0xb462d987" coloredcolor="0xcc0dab76" blackhighlight="0xb400ff00" whitehighlight="0xb400ff00" coloredhighlight="0xb400ff00" fill="1" visible="yes" active="yes" locked="no"/>+<layer number="18" name="Vias" blackcolor="0xb462d987" whitecolor="0xb462d987" coloredcolor="0xccffcd07" blackhighlight="0xb462d987" whitehighlight="0xb462d987" coloredhighlight="0xccffcd07" fill="1" visible="yes" active="yes" locked="no"/>+<layer number="19" name="Unrouted" blackcolor="0xccd9d9d9" whitecolor="0xbbc8c832" coloredcolor="0xbbc8c832" blackhighlight="0xb462d987" whitehighlight="0xb462d987" coloredhighlight="0xccffcd07" fill="1" visible="yes" active="yes" locked="no"/>+<layer number="20" name="Dimension" blackcolor="0xb462d986" whitecolor="0xb462d986" coloredcolor="0xcceec643" blackhighlight="0xb462d986" whitehighlight="0xb462d986" coloredhighlight="0xcceec643" fill="1" visible="yes" active="yes" locked="no"/>+<layer number="21" name="tPlace" blackcolor="0xccc8c8c8" whitecolor="0xbb808080" coloredcolor="0xbb808080" blackhighlight="0xc8ffffff" whitehighlight="0xccafd134" coloredhighlight="0xccafd134" fill="1" visible="yes" active="yes" locked="no"/>+<layer number="22" name="bPlace" blackcolor="0xccc8c8c8" whitecolor="0xbb808080" coloredcolor="0xbb808080" blackhighlight="0xc8ffffff" whitehighlight="0xccafd134" coloredhighlight="0xccafd134" fill="1" visible="yes" active="yes" locked="no"/>+<layer number="23" name="tOrigins" blackcolor="0xc8ffffff" whitecolor="0xccafd134" coloredcolor="0xccafd134" blackhighlight="0xc8ffffff" whitehighlight="0xccafd134" coloredhighlight="0xccafd134" fill="1" visible="yes" active="yes" locked="no"/>+<layer number="24" name="bOrigins" blackcolor="0xc8ffffff" whitecolor="0xccafd134" coloredcolor="0xccafd134" blackhighlight="0xc8ffffff" whitehighlight="0xccafd134" coloredhighlight="0xccafd134" fill="1" visible="yes" active="yes" locked="no"/>+<layer number="25" name="tNames" blackcolor="0xccc8c8c8" whitecolor="0xbb808080" coloredcolor="0xbb808080" blackhighlight="0xc8ffffff" whitehighlight="0xccafd134" coloredhighlight="0xccafd134" fill="1" visible="yes" active="yes" locked="no"/>+<layer number="26" name="bNames" blackcolor="0xccc8c8c8" whitecolor="0xbb808080" coloredcolor="0xbb808080" blackhighlight="0xc8ffffff" whitehighlight="0xccafd134" coloredhighlight="0xccafd134" fill="1" visible="yes" active="yes" locked="no"/>+<layer number="27" name="tValues" blackcolor="0xccc8c8c8" whitecolor="0xbb808080" coloredcolor="0xbb808080" blackhighlight="0xc8ffffff" whitehighlight="0xccafd135" coloredhighlight="0xccafd135" fill="1" visible="yes" active="yes" locked="no"/>+<layer number="28" name="bValues" blackcolor="0xccc8c8c8" whitecolor="0xbb808080" coloredcolor="0xbb808080" blackhighlight="0xc8ffffff" whitehighlight="0xccafd136" coloredhighlight="0xccafd136" fill="1" visible="yes" active="yes" locked="no"/>+<layer number="29" name="tStop" blackcolor="0xccc8c8c8" whitecolor="0xbb808080" coloredcolor="0xbb808080" blackhighlight="0xc8ffffff" whitehighlight="0xccafd137" coloredhighlight="0xccafd137" fill="3" visible="no" active="yes" locked="no"/>+<layer number="30" name="bStop" blackcolor="0xccc8c8c8" whitecolor="0xbb808080" coloredcolor="0xbb808080" blackhighlight="0xc8ffffff" whitehighlight="0xccafd138" coloredhighlight="0xccafd138" fill="6" visible="no" active="yes" locked="no"/>+<layer number="31" name="tCream" blackcolor="0xccc8c8c8" whitecolor="0xbb808080" coloredcolor="0xbb808080" blackhighlight="0xc8ffffff" whitehighlight="0xccafd139" coloredhighlight="0xccafd139" fill="4" visible="no" active="yes" locked="no"/>+<layer number="32" name="bCream" blackcolor="0xccc8c8c8" whitecolor="0xbb808080" coloredcolor="0xbb808080" blackhighlight="0xc8ffffff" whitehighlight="0xccafd140" coloredhighlight="0xccafd140" fill="5" visible="no" active="yes" locked="no"/>+<layer number="33" name="tFinish" blackcolor="0xccd9d9d9" whitecolor="0xbbc8c832" coloredcolor="0xbbc8c832" blackhighlight="0xb462d987" whitehighlight="0xb462d987" coloredhighlight="0xccffcd07" fill="3" visible="no" active="yes" locked="no"/>+<layer number="34" name="bFinish" blackcolor="0xccd9d9d9" whitecolor="0xbbc8c832" coloredcolor="0xbbc8c832" blackhighlight="0xb462d987" whitehighlight="0xb462d987" coloredhighlight="0xccffcd07" fill="6" visible="no" active="yes" locked="no"/>+<layer number="35" name="tGlue" blackcolor="0xccc8c8c8" whitecolor="0xbb808080" coloredcolor="0xbb808080" blackhighlight="0xc8ffffff" whitehighlight="0xccafd140" coloredhighlight="0xccafd140" fill="4" visible="no" active="yes" locked="no"/>+<layer number="36" name="bGlue" blackcolor="0xccc8c8c8" whitecolor="0xbb808080" coloredcolor="0xbb808080" blackhighlight="0xc8ffffff" whitehighlight="0xccafd140" coloredhighlight="0xccafd140" fill="5" visible="no" active="yes" locked="no"/>+<layer number="37" name="tTest" blackcolor="0xccc8c8c8" whitecolor="0xbb808080" coloredcolor="0xbb808080" blackhighlight="0xc8ffffff" whitehighlight="0xccafd140" coloredhighlight="0xccafd140" fill="1" visible="no" active="yes" locked="no"/>+<layer number="38" name="bTest" blackcolor="0xccc8c8c8" whitecolor="0xbb808080" coloredcolor="0xbb808080" blackhighlight="0xc8ffffff" whitehighlight="0xccafd140" coloredhighlight="0xccafd140" fill="1" visible="no" active="yes" locked="no"/>+<layer number="39" name="tKeepout" blackcolor="0xc8ff4164" whitecolor="0xccc90d0c" coloredcolor="0xccc90d0c" blackhighlight="0xccff0000" whitehighlight="0xb4ff0000" coloredhighlight="0xb4ff0000" fill="11" visible="no" active="yes" locked="no"/>+<layer number="40" name="bKeepout" blackcolor="0xc80696d7" whitecolor="0xcc0696d7" coloredcolor="0xcc0696d7" blackhighlight="0xb40000ff" whitehighlight="0xcc8252c2" coloredhighlight="0xcc8252c2" fill="11" visible="no" active="yes" locked="no"/>+<layer number="41" name="RestrictCopper" blackcolor="0xc8ff4164" whitecolor="0xccc90d0c" coloredcolor="0xccc90d0c" blackhighlight="0xccff0000" whitehighlight="0xb4ff0000" coloredhighlight="0xb4ff0000" fill="10" visible="no" active="yes" locked="no"/>+<layer number="42" name="bRestrict" blackcolor="0xc80696d7" whitecolor="0xcc0696d7" coloredcolor="0xcc0696d7" blackhighlight="0xb40000ff" whitehighlight="0xcc8252c2" coloredhighlight="0xcc8252c2" fill="10" visible="no" active="yes" locked="no"/>+<layer number="43" name="vRestrict" blackcolor="0xb462d987" whitecolor="0xb462d987" coloredcolor="0xcc0dab76" blackhighlight="0xb400ff00" whitehighlight="0xb400ff00" coloredhighlight="0xb400ff00" fill="10" visible="no" active="yes" locked="no"/>+<layer number="44" name="Drills" blackcolor="0xccc8c8c8" whitecolor="0xbb808080" coloredcolor="0xbb808080" blackhighlight="0xc8ffffff" whitehighlight="0xccafd140" coloredhighlight="0xccafd140" fill="1" visible="no" active="yes" locked="no"/>+<layer number="45" name="Holes" blackcolor="0xccc8c8c8" whitecolor="0xbb808080" coloredcolor="0xbb808080" blackhighlight="0xc8ffffff" whitehighlight="0xccafd140" coloredhighlight="0xccafd140" fill="1" visible="no" active="yes" locked="no"/>+<layer number="46" name="Milling" blackcolor="0xcc32c8c8" whitecolor="0xb432c8c8" coloredcolor="0xb432c8c8" blackhighlight="0xb400ffff" whitehighlight="0xb400ffff" coloredhighlight="0xb400ffff" fill="1" visible="no" active="yes" locked="no"/>+<layer number="47" name="Measures" blackcolor="0xccc8c8c8" whitecolor="0xbb808080" coloredcolor="0xbb808080" blackhighlight="0xc8ffffff" whitehighlight="0xccafd140" coloredhighlight="0xccafd140" fill="1" visible="no" active="yes" locked="no"/>+<layer number="48" name="Document" blackcolor="0xccc8c8c8" whitecolor="0xbb808080" coloredcolor="0xbb808080" blackhighlight="0xc8ffffff" whitehighlight="0xccafd141" coloredhighlight="0xccafd141" fill="1" visible="yes" active="yes" locked="no"/>+<layer number="49" name="Reference" blackcolor="0xccc8c8c8" whitecolor="0xbb808080" coloredcolor="0xbb808080" blackhighlight="0xc8ffffff" whitehighlight="0xccafd142" coloredhighlight="0xccafd142" fill="1" visible="yes" active="yes" locked="no"/>+<layer number="91" name="Nets" blackcolor="0xdc009292" whitecolor="0xdc009292" coloredcolor="0xc8e3e3e3" blackhighlight="0xdc009292" whitehighlight="0xdc009292" coloredhighlight="0xc8e3e3e3" fill="1" visible="no" active="no" locked="no"/>+<layer number="92" name="Busses" blackcolor="0xdc009292" whitecolor="0xdc009292" coloredcolor="0xc8d62525" blackhighlight="0xdc009292" whitehighlight="0xdc009292" coloredhighlight="0xc8d62525" fill="1" visible="no" active="no" locked="no"/>+<layer number="93" name="Pins" blackcolor="0xdcbbbbbb" whitecolor="0xdcbbbbbb" coloredcolor="0xc839d437" blackhighlight="0xdcbbbbbb" whitehighlight="0xdcbbbbbb" coloredhighlight="0xc839d437" fill="1" visible="no" active="no" locked="no"/>+<layer number="94" name="Symbols" blackcolor="0xdcfac36e" whitecolor="0xdcf57c10" coloredcolor="0xc8e6e600" blackhighlight="0xdcfac36e" whitehighlight="0xdcf57c10" coloredhighlight="0xc8e6e600" fill="1" visible="no" active="no" locked="no"/>+<layer number="95" name="Names" blackcolor="0xf0b2b2b2" whitecolor="0xc8757575" coloredcolor="0xc82c7bce" blackhighlight="0xf0b2b2b2" whitehighlight="0xc8757575" coloredhighlight="0xc82c7bce" fill="1" visible="no" active="no" locked="no"/>+<layer number="96" name="Values" blackcolor="0xf0b2b2b2" whitecolor="0xc8757575" coloredcolor="0xc82c7bce" blackhighlight="0xf0b2b2b2" whitehighlight="0xc8757575" coloredhighlight="0xc82c7bce" fill="1" visible="no" active="no" locked="no"/>+<layer number="97" name="Info" blackcolor="0xf0b2b2b2" whitecolor="0xc8757575" coloredcolor="0xc89526de" blackhighlight="0xf0b2b2b2" whitehighlight="0xc8757575" coloredhighlight="0xc89526de" fill="1" visible="no" active="no" locked="no"/>+<layer number="98" name="Guide" blackcolor="0xf0b2b2b2" whitecolor="0xc8757575" coloredcolor="0xc89526de" blackhighlight="0xf0b2b2b2" whitehighlight="0xc8757575" coloredhighlight="0xc89526de" fill="1" visible="no" active="no" locked="no"/>+</layers>+<board>+<plain>+<wire x1="0" y1="0" x2="54" y2="0" width="0" layer="20"/>+<wire x1="54" y1="0" x2="54" y2="44" width="0" layer="20"/>+<wire x1="54" y1="44" x2="0" y2="44" width="0" layer="20"/>+<wire x1="0" y1="44" x2="0" y2="0" width="0" layer="20"/>+<text x="13" y="40" size="1.5" layer="21">FUSION TRACE ROUTING</text>+</plain>+<namedviews>+</namedviews>+<libraries>+<library name="RoutingFixture">+<packages>+<package name="TESTPOINTS_1" use_placeholder="yes">+<pad name="1" x="0" y="0" drill="1" diameter="2"/>+</package>+<package name="TESTPOINTS_6" use_placeholder="yes">+<pad name="1" x="0" y="0" drill="1" diameter="2"/>+<pad name="2" x="0" y="5" drill="1" diameter="2"/>+<pad name="3" x="0" y="10" drill="1" diameter="2"/>+<pad name="4" x="0" y="15" drill="1" diameter="2"/>+<pad name="5" x="0" y="20" drill="1" diameter="2"/>+<pad name="6" x="0" y="25" drill="1" diameter="2"/>+</package>+</packages>+</library>+</libraries>+<attributes>+</attributes>+<variantdefs>+</variantdefs>+<classes>+<class number="0" name="default" width="0.25" drill="0.3">+</class>+</classes>+<designrules name="RoutingFixture" version="V1">+<rules>+<rulecategory type="Copper Clearance" manualdrc="yes" livedrc="yes"/>+ <rulecategory type="Keepout Clearance" manualdrc="yes" livedrc="yes"/>+ <rulecategory type="Solder-Mask Clearance" manualdrc="yes" livedrc="yes"/>+ <rulecategory type="Dimension Clearance" manualdrc="yes" livedrc="yes"/>+ <rulecategory type="Drill Distance" manualdrc="yes" livedrc="yes"/>+ <rulecategory type="Restrict Clearance" manualdrc="yes" livedrc="yes"/>+ <rulecategory type="Minimum Drill Size" manualdrc="yes" livedrc="yes"/>+ <rulecategory type="Minimum Copper Width" manualdrc="yes" livedrc="yes"/>+ <rulecategory type="Acute Angle" manualdrc="yes" livedrc="yes"/>+ <rulecategory type="Air-Wire" manualdrc="yes" livedrc="yes"/>+ <rulecategory type="Small Gap" manualdrc="yes" livedrc="yes"/>+ <rulecategory type="Wire Stub" manualdrc="yes" livedrc="no"/>+ <rulecategory type="Matched Lengths" manualdrc="yes" livedrc="yes"/>+ <rulecategory type="Via Restrict Clearance" manualdrc="yes" livedrc="yes"/>+ <rulecategory type="Teardrop" manualdrc="no" livedrc="no"/>+ <rule type="Minimum Copper Width" enabled="yes" priority="0" onescope="class=0" value="0.25mm" preferredvalue="0.25mm" check_polywidth="no" name="minimum-copper-width-1"/>+ <rule type="Minimum Copper Width" builtin_ruleid="14" enabled="yes" priority="1" value="0.2mm" preferredvalue="0.2mm" check_polywidth="no" name="minimum-copper-width-2"/>+ <rule type="Teardrop" builtin_ruleid="22" enabled="yes" priority="0" onescope="is_via" lengthratio="0.5" widthratio="0.7" curved_sides="no" auto_generate="no" name="teardrop-1"/>+ <rule type="Teardrop" builtin_ruleid="23" enabled="yes" priority="1" onescope="is_pad" lengthratio="0.5" widthratio="0.7" curved_sides="no" auto_generate="no" name="teardrop-2"/>+ <rule type="Teardrop" builtin_ruleid="24" enabled="yes" priority="2" onescope="is_smd" lengthratio="0.5" widthratio="0.7" curved_sides="no" auto_generate="no" name="teardrop-3"/>+ <rule type="Teardrop" builtin_ruleid="25" enabled="yes" priority="3" onescope="is_wire_polygon" lengthratio="0.5" widthratio="0.9" curved_sides="no" auto_generate="no" name="teardrop-4"/>+ <rule type="Minimum Drill Size" enabled="yes" priority="0" onescope="class=0" value="0.3mm" preferredvalue="0.3mm" name="minimum-drill-size-1"/>+ <rule type="Minimum Drill Size" builtin_ruleid="15" enabled="yes" priority="1" value="0.3mm" preferredvalue="0.3mm" name="minimum-drill-size-2"/>+ <rule type="Acute Angle" builtin_ruleid="16" enabled="no" priority="0" name="acute-angle-1"/>+ <rule type="Wire Stub" builtin_ruleid="17" enabled="yes" priority="0" name="wire-stub-1"/>+ <rule type="Air-Wire" builtin_ruleid="19" enabled="yes" priority="0" name="air-wire-1"/>+ <rule type="Matched Lengths" builtin_ruleid="20" enabled="yes" priority="0" tolerance="10mm" gapfactor="2.5" name="matched-lengths-1"/>+ <rule type="Copper Clearance" builtin_ruleid="0" enabled="yes" priority="0" onescope="is_wire_polygon" otherscope="is_wire_polygon" value="0.2mm" preferredvalue="0.2mm" samesignal="no" name="copper-clearance-1"/>+ <rule type="Copper Clearance" builtin_ruleid="1" enabled="yes" priority="1" onescope="is_wire_polygon" otherscope="is_pad_smd" value="0.2mm" preferredvalue="0.2mm" samesignal="no" name="copper-clearance-2"/>+ <rule type="Copper Clearance" builtin_ruleid="2" enabled="yes" priority="2" onescope="is_wire_polygon" otherscope="is_via" value="0.2mm" preferredvalue="0.2mm" samesignal="no" name="copper-clearance-3"/>+ <rule type="Copper Clearance" builtin_ruleid="3" enabled="yes" priority="3" onescope="is_pad_smd" otherscope="is_pad_smd" value="6mil" preferredvalue="6mil" samesignal="no" name="copper-clearance-4"/>+ <rule type="Copper Clearance" builtin_ruleid="4" enabled="yes" priority="4" onescope="is_pad_smd" otherscope="is_via" value="6mil" preferredvalue="6mil" samesignal="no" name="copper-clearance-5"/>+ <rule type="Copper Clearance" builtin_ruleid="5" enabled="yes" priority="5" onescope="is_via" otherscope="is_via" value="6mil" preferredvalue="6mil" samesignal="no" name="copper-clearance-6"/>+ <rule type="Copper Clearance" builtin_ruleid="6" enabled="yes" priority="6" onescope="is_smd" otherscope="is_pad" value="6mil" preferredvalue="6mil" samesignal="yes" name="copper-clearance-7"/>+ <rule type="Copper Clearance" builtin_ruleid="7" enabled="yes" priority="7" onescope="is_smd" otherscope="is_via" value="6mil" preferredvalue="6mil" samesignal="yes" name="copper-clearance-8"/>+ <rule type="Copper Clearance" builtin_ruleid="8" enabled="yes" priority="8" onescope="is_smd" otherscope="is_smd" value="6mil" preferredvalue="6mil" samesignal="yes" name="copper-clearance-9"/>+ <rule type="Dimension Clearance" builtin_ruleid="9" enabled="yes" priority="0" value="0.5mm" preferredvalue="0.5mm" name="dimension-clearance-1"/>+ <rule type="Via Restrict Clearance" builtin_ruleid="21" enabled="yes" priority="0" value="0mil" preferredvalue="0mil" name="via-restrict-clearance-1"/>+ <rule type="Restrict Clearance" builtin_ruleid="10" enabled="yes" priority="0" value="0mil" preferredvalue="0mil" name="restrict-clearance-1"/>+ <rule type="Small Gap" builtin_ruleid="18" enabled="yes" priority="0" name="small-gap-1"/>+ <rule type="Solder-Mask Clearance" builtin_ruleid="11" enabled="no" priority="0" value="0mil" preferredvalue="0mil" check_name="yes" check_value="no" name="solder-mask-clearance-1"/>+ <rule type="Drill Distance" builtin_ruleid="12" enabled="yes" priority="0" value="6mil" preferredvalue="6mil" name="drill-distance-1"/>+ <rule type="Keepout Clearance" builtin_ruleid="13" enabled="yes" priority="0" value="0mil" preferredvalue="0mil" name="keepout-clearance-1"/>+ </rules>+<param name="mdWireWire" value="0.2mm"/>+<param name="mdWirePad" value="0.2mm"/>+<param name="mdWireVia" value="0.2mm"/>+<param name="mdPadPad" value="6mil"/>+<param name="mdPadVia" value="6mil"/>+<param name="mdViaVia" value="6mil"/>+<param name="mdSmdPad" value="6mil"/>+<param name="mdSmdVia" value="6mil"/>+<param name="mdSmdSmd" value="6mil"/>+<param name="mdCopperDimension" value="0.5mm"/>+<param name="mdDrill" value="6mil"/>+<param name="msWidth" value="0.2mm"/>+<param name="msDrill" value="0.3mm"/>+<param name="dpMaxLengthDifference" value="10mm"/>+<param name="dpGapFactor" value="2.5"/>+<description language="en">&lt;b&gt;Fusion Electronics Design Rules&lt;/b&gt;+&lt;p&gt;+The default Design Rules have been set to cover+a wide range of applications. Your particular design+may have different requirements, so please make the+necessary adjustments and save your customized+design rules under a new name.+</description>+<param name="layerSetup" value="(1*16)"/>+<param name="mtCopper" value="0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm"/>+<param name="mtIsolate" value="1.5mm 0.15mm 0.2mm 0.15mm 0.2mm 0.15mm 0.2mm 0.15mm 0.2mm 0.15mm 0.2mm 0.15mm 0.2mm 0.15mm 0.2mm"/>+<param name="mdViaViaSameLayer" value="6mil"/>+<param name="mnLayersViaInSmd" value="2"/>+<param name="mdSmdStop" value="0mil"/>+<param name="msMicroVia" value="9.99mm"/>+<param name="msBlindViaRatio" value="0.5"/>+<param name="rvPadTop" value="0.25"/>+<param name="rvPadInner" value="0.25"/>+<param name="rvPadBottom" value="0.25"/>+<param name="rvViaOuter" value="0.25"/>+<param name="rvViaInner" value="0.25"/>+<param name="rvMicroViaOuter" value="0.25"/>+<param name="rvMicroViaInner" value="0.25"/>+<param name="rlMinPadTop" value="10mil"/>+<param name="rlMaxPadTop" value="20mil"/>+<param name="rlMinPadInner" value="10mil"/>+<param name="rlMaxPadInner" value="20mil"/>+<param name="rlMinPadBottom" value="10mil"/>+<param name="rlMaxPadBottom" value="20mil"/>+<param name="rlMinViaOuter" value="8mil"/>+<param name="rlMaxViaOuter" value="20mil"/>+<param name="rlMinViaInner" value="8mil"/>+<param name="rlMaxViaInner" value="20mil"/>+<param name="rlMinMicroViaOuter" value="4mil"/>+<param name="rlMaxMicroViaOuter" value="20mil"/>+<param name="rlMinMicroViaInner" value="4mil"/>+<param name="rlMaxMicroViaInner" value="20mil"/>+<param name="psTop" value="-1"/>+<param name="psBottom" value="-1"/>+<param name="psFirst" value="-1"/>+<param name="psElongationLong" value="100"/>+<param name="psElongationOffset" value="100"/>+<param name="mvStopFrame" value="1"/>+<param name="mvCreamFrame" value="0"/>+<param name="mlMinStopFrame" value="4mil"/>+<param name="mlMaxStopFrame" value="4mil"/>+<param name="mlMinCreamFrame" value="0mil"/>+<param name="mlMaxCreamFrame" value="0mil"/>+<param name="mlViaStopLimit" value="9999mil"/>+<param name="srRoundness" value="0"/>+<param name="srMinRoundness" value="0mil"/>+<param name="srMaxRoundness" value="0mil"/>+<param name="slThermalIsolate" value="10mil"/>+<param name="slThermalsForVias" value="0"/>+<param name="checkAngle" value="0"/>+<param name="checkRestrict" value="1"/>+<param name="checkStop" value="0"/>+<param name="checkValues" value="0"/>+<param name="checkNames" value="1"/>+<param name="checkWireStubs" value="1"/>+<param name="checkPolygonWidth" value="0"/>+<param name="useDiameter" value="13"/>+<param name="removeAnnularRing" value="0"/>+<param name="flattenRefDes" value="0"/>+<param name="maxErrors" value="999999"/>+<layerstackup name="Default Layer Stack" type="Standard Stackup" display_unit="mic" roughness_model="0">+ <layerdef type="Signal" id="{7cca71aa-b8c8-46df-97e5-8bf2e33b64c2}" layer="1" name="Top" locally_modified_material="yes">+ <material name="User Defined" thickness="0.035mm" weight="1oz" process="Electro Deposited" source="User"/>+</layerdef>+ <layerdef type="Core" id="{265f5b3f-6de6-4aa3-a2be-5a313a9799e0}" layer="1" name="Dielectric-1" locally_modified_material="yes">+ <material name="User Defined" construction="" thickness="1.5mm" resin="50%" dielectric_constant_1g="4.5" dissipation_factor_1g="0.02" glass_transition_temperature="125degC" source="User"/>+</layerdef>+ <layerdef type="Signal" id="{d30ab2dc-c940-4874-bcf8-133bdc221ce6}" layer="16" name="Bottom" locally_modified_material="yes">+ <material name="User Defined" thickness="0.035mm" weight="1oz" process="Electro Deposited" source="User"/>+</layerdef>+ <viadef name="Thru 1:16" startlayer="1" stoplayer="16" complement="no"/>+ </layerstackup>+ </designrules>+<autorouter>+<pass name="Default">+<param name="RoutingGrid" value="50mil"/>+<param name="AutoGrid" value="1"/>+<param name="Efforts" value="0"/>+<param name="TopRouterVariant" value="1"/>+<param name="tpViaShape" value="round"/>+<param name="PrefDir.1" value="a"/>+<param name="PrefDir.2" value="0"/>+<param name="PrefDir.3" value="0"/>+<param name="PrefDir.4" value="0"/>+<param name="PrefDir.5" value="0"/>+<param name="PrefDir.6" value="0"/>+<param name="PrefDir.7" value="0"/>+<param name="PrefDir.8" value="0"/>+<param name="PrefDir.9" value="0"/>+<param name="PrefDir.10" value="0"/>+<param name="PrefDir.11" value="0"/>+<param name="PrefDir.12" value="0"/>+<param name="PrefDir.13" value="0"/>+<param name="PrefDir.14" value="0"/>+<param name="PrefDir.15" value="0"/>+<param name="PrefDir.16" value="a"/>+<param name="cfVia" value="8"/>+<param name="cfNonPref" value="5"/>+<param name="cfChangeDir" value="2"/>+<param name="cfOrthStep" value="2"/>+<param name="cfDiagStep" value="3"/>+<param name="cfExtdStep" value="0"/>+<param name="cfBonusStep" value="1"/>+<param name="cfMalusStep" value="1"/>+<param name="cfPadImpact" value="4"/>+<param name="cfSmdImpact" value="4"/>+<param name="cfBusImpact" value="0"/>+<param name="cfHugging" value="3"/>+<param name="cfAvoid" value="4"/>+<param name="cfPolygon" value="10"/>+<param name="cfBase.1" value="0"/>+<param name="cfBase.2" value="1"/>+<param name="cfBase.3" value="1"/>+<param name="cfBase.4" value="1"/>+<param name="cfBase.5" value="1"/>+<param name="cfBase.6" value="1"/>+<param name="cfBase.7" value="1"/>+<param name="cfBase.8" value="1"/>+<param name="cfBase.9" value="1"/>+<param name="cfBase.10" value="1"/>+<param name="cfBase.11" value="1"/>+<param name="cfBase.12" value="1"/>+<param name="cfBase.13" value="1"/>+<param name="cfBase.14" value="1"/>+<param name="cfBase.15" value="1"/>+<param name="cfBase.16" value="0"/>+<param name="mnVias" value="20"/>+<param name="mnSegments" value="9999"/>+<param name="mnExtdSteps" value="9999"/>+<param name="mnRipupLevel" value="10"/>+<param name="mnRipupSteps" value="100"/>+<param name="mnRipupTotal" value="100"/>+</pass>+<pass name="Follow-me" refer="Default" active="yes">+</pass>+<pass name="Busses" refer="Default" active="yes">+<param name="cfNonPref" value="4"/>+<param name="cfBusImpact" value="4"/>+<param name="cfHugging" value="0"/>+<param name="mnVias" value="0"/>+</pass>+<pass name="Route" refer="Default" active="yes">+</pass>+<pass name="Optimize1" refer="Default" active="yes">+<param name="cfVia" value="99"/>+<param name="cfExtdStep" value="10"/>+<param name="cfHugging" value="1"/>+<param name="mnExtdSteps" value="1"/>+<param name="mnRipupLevel" value="0"/>+</pass>+<pass name="Optimize2" refer="Optimize1" active="yes">+<param name="cfNonPref" value="0"/>+<param name="cfChangeDir" value="6"/>+<param name="cfExtdStep" value="0"/>+<param name="cfBonusStep" value="2"/>+<param name="cfMalusStep" value="2"/>+<param name="cfPadImpact" value="2"/>+<param name="cfSmdImpact" value="2"/>+<param name="cfHugging" value="0"/>+</pass>+<pass name="Optimize3" refer="Optimize2" active="yes">+<param name="cfChangeDir" value="8"/>+<param name="cfPadImpact" value="0"/>+<param name="cfSmdImpact" value="0"/>+</pass>+<pass name="Optimize4" refer="Optimize3" active="yes">+<param name="cfChangeDir" value="25"/>+</pass>+</autorouter>+<elements>+<element name="J1" library="RoutingFixture" package="TESTPOINTS_6" value="ROUTING_TEST" x="7" y="7" smashed="yes">+<pad name="1">+</pad>+<pad name="2">+</pad>+<pad name="3">+</pad>+<pad name="4">+</pad>+<pad name="5">+</pad>+<pad name="6">+</pad>+</element>+<element name="J2" library="RoutingFixture" package="TESTPOINTS_6" value="ROUTING_TEST" x="47" y="7" smashed="yes">+<pad name="1">+</pad>+<pad name="2">+</pad>+<pad name="3">+</pad>+<pad name="4">+</pad>+<pad name="5">+</pad>+<pad name="6">+</pad>+</element>+<element name="J3" library="RoutingFixture" package="TESTPOINTS_1" value="ROUTING_TEST" x="27" y="38" smashed="yes">+<pad name="1">+</pad>+</element>+</elements>+<signals>+<signal name="NET_1">+<contactref element="J1" pad="1"/>+<contactref element="J2" pad="1"/>+<wire x1="7" y1="7" x2="14" y2="7" width="0.25" layer="1"/>+<wire x1="14" y1="7" x2="40" y2="7" width="0.25" layer="1"/>+<wire x1="40" y1="7" x2="47" y2="7" width="0.25" layer="1"/>+</signal>+<signal name="NET_2">+<contactref element="J1" pad="2"/>+<contactref element="J2" pad="2"/>+<wire x1="7" y1="12" x2="14" y2="12" width="0.25" layer="1"/>+<wire x1="14" y1="12" x2="40" y2="12" width="0.25" layer="1"/>+<wire x1="40" y1="12" x2="47" y2="12" width="0.25" layer="1"/>+</signal>+<signal name="NET_3">+<contactref element="J1" pad="3"/>+<contactref element="J2" pad="3"/>+<wire x1="7" y1="17" x2="14" y2="17" width="0.25" layer="1"/>+<via x="14" y="17" extent="1-16" drill="0.3" diameter="0.6" solderMask="auto">+</via>+<wire x1="14" y1="17" x2="40" y2="17" width="0.25" layer="16"/>+<via x="40" y="17" extent="1-16" drill="0.3" diameter="0.6" solderMask="auto">+</via>+<wire x1="40" y1="17" x2="47" y2="17" width="0.25" layer="1"/>+</signal>+<signal name="NET_4">+<contactref element="J1" pad="4"/>+<contactref element="J2" pad="4"/>+<wire x1="7" y1="22" x2="14" y2="22" width="0.25" layer="1"/>+<wire x1="14" y1="22" x2="40" y2="22" width="0.25" layer="1"/>+<wire x1="40" y1="22" x2="47" y2="22" width="0.25" layer="1"/>+</signal>+<signal name="NET_5">+<contactref element="J1" pad="5"/>+<contactref element="J2" pad="5"/>+<wire x1="7" y1="27" x2="14" y2="27" width="0.25" layer="1"/>+<wire x1="14" y1="27" x2="40" y2="27" width="0.25" layer="1"/>+<wire x1="40" y1="27" x2="47" y2="27" width="0.25" layer="1"/>+</signal>+<signal name="NET_6">+<contactref element="J1" pad="6"/>+<contactref element="J2" pad="6"/>+<contactref element="J3" pad="1"/>+<wire x1="7" y1="32" x2="14" y2="32" width="0.25" layer="1"/>+<wire x1="14" y1="32" x2="27" y2="32" width="0.25" layer="1"/>+<wire x1="27" y1="32" x2="40" y2="32" width="0.25" layer="1"/>+<wire x1="40" y1="32" x2="47" y2="32" width="0.25" layer="1"/>+<wire x1="27" y1="32" x2="27" y2="35" width="0.25" layer="1"/>+<wire x1="27" y1="35" x2="27" y2="38" width="0.25" layer="1"/>+</signal>+</signals>+<mfgpreviewcolors>+<mfgpreviewcolor name="soldermaskcolor" color="0xC8008000"/>+<mfgpreviewcolor name="silkscreencolor" color="0xFFFEFEFE"/>+<mfgpreviewcolor name="backgroundcolor" color="0xFF282828"/>+<mfgpreviewcolor name="coppercolor" color="0xFFFFBF00"/>+<mfgpreviewcolor name="substratecolor" color="0xFF786E46"/>+</mfgpreviewcolors>+</board>+</drawing>+<compatibility>+<note version="9.7" severity="warning">+Since Fusion, design files support named views saved in design. +Named views found in the design will not be understood with this version. +</note>+<note version="9.7" minversion="9.7.0" severity="warning">+Since Version 9.7.0 new layer stackup definition has been added,+which will not be loaded with this version.+</note>+<note version="9.7" minversion="9.7.0" severity="warning">+Since Version 9.7.0 new active CAMJOB file name has been added,+which will not be loaded with this version.+</note>+<note version="9.7" minversion="9.7.0" severity="warning">+Since Version 9.7.0 board construction lines has been added,+which will not be loaded with this version.+</note>+<note version="9.7" minversion="9.7.0" severity="warning">+Since Version 9.7.0 new design rule definitions have been added,+which will not be loaded with this version.+</note>+</compatibility>+</eagle>
demo/routing/evidence/boards/fusion-routing-routed.fbrdadded
⋯ 1 unchanged line ⋯
demo/routing/evidence/dev-bridge.jsonadded+8
@@ -0,0 +1,8 @@+{+  "name": "fusion360",+  "version": "1.10.0-dev.routing.1",+  "devPinned": true,+  "processLive": true,+  "entrypoint": "C:/Users/john/AppData/Local/Adom Bridge/bridges-cache/fusion360/adom-fusion-bridge.exe",+  "port": 61606+}\ No newline at end of file
demo/routing/evidence/final-take/001-fusion_routing_state.jsonadded+355
@@ -0,0 +1,355 @@+{+  "elapsedSeconds": 0.24071818898664787,+  "args": {+    "expectDocument": "fusion-routing"+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 7,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "checked": false,+      "note": "Use fusion_routing_drc for a fresh Autodesk DRC"+    },+    "durationMs": 235,+    "error": "",+    "nets": [+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              7.0+            ],+            "start": [+              7.0,+              7.0+            ]+          }+        ],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              12.0+            ],+            "start": [+              7.0,+              12.0+            ]+          }+        ],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              17.0+            ],+            "start": [+              7.0,+              17.0+            ]+          }+        ],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              22.0+            ],+            "start": [+              7.0,+              22.0+            ]+          }+        ],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              27.0+            ],+            "start": [+              7.0,+              27.0+            ]+          }+        ],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 2,+        "airwires": [+          {+            "end": [+              47.0,+              32.0+            ],+            "start": [+              27.0,+              38.0+            ]+          },+          {+            "end": [+              27.0,+              38.0+            ],+            "start": [+              7.0,+              32.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 0,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "remainingNets": [+      "NET_1",+      "NET_2",+      "NET_3",+      "NET_4",+      "NET_5",+      "NET_6"+    ],+    "revision": "ed9fd520235f10745a6a7115ebee65771516dc1160c5f2ae1f5c7428c41e3c4d",+    "segmentCount": 0,+    "segments": [],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "viaCount": 0,+    "vias": []+  }+}
demo/routing/evidence/final-take/002-fusion_route_net.jsonadded+94
@@ -0,0 +1,94 @@+{+  "elapsedSeconds": 0.22990678600035608,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "ed9fd520235f10745a6a7115ebee65771516dc1160c5f2ae1f5c7428c41e3c4d",+    "net": "NET_1",+    "layer": 1,+    "width": 0.25,+    "paths": [+      [+        {+          "pad": "J1.1"+        },+        [+          14,+          7+        ],+        [+          40,+          7+        ],+        {+          "pad": "J2.1"+        }+      ]+    ],+    "dryRun": true+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "documentName": "fusion-routing",+    "durationMs": 224,+    "error": "",+    "mutated": false,+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            14,+            7+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_1",+          "start": [+            7.0,+            7.0+          ],+          "width": 0.25+        },+        {+          "end": [+            40,+            7+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_1",+          "start": [+            14,+            7+          ],+          "width": 0.25+        },+        {+          "end": [+            47.0,+            7.0+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_1",+          "start": [+            40,+            7+          ],+          "width": 0.25+        }+      ],+      "net": "NET_1",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "revision": "ed9fd520235f10745a6a7115ebee65771516dc1160c5f2ae1f5c7428c41e3c4d",+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60+  }+}
demo/routing/evidence/final-take/003-fusion_route_net.jsonadded+94
@@ -0,0 +1,94 @@+{+  "elapsedSeconds": 0.22275712099508382,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "ed9fd520235f10745a6a7115ebee65771516dc1160c5f2ae1f5c7428c41e3c4d",+    "net": "NET_2",+    "layer": 1,+    "width": 0.25,+    "paths": [+      [+        {+          "pad": "J1.2"+        },+        [+          14,+          12+        ],+        [+          40,+          12+        ],+        {+          "pad": "J2.2"+        }+      ]+    ],+    "dryRun": true+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "documentName": "fusion-routing",+    "durationMs": 218,+    "error": "",+    "mutated": false,+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            14,+            12+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_2",+          "start": [+            7.0,+            12.0+          ],+          "width": 0.25+        },+        {+          "end": [+            40,+            12+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_2",+          "start": [+            14,+            12+          ],+          "width": 0.25+        },+        {+          "end": [+            47.0,+            12.0+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_2",+          "start": [+            40,+            12+          ],+          "width": 0.25+        }+      ],+      "net": "NET_2",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "revision": "ed9fd520235f10745a6a7115ebee65771516dc1160c5f2ae1f5c7428c41e3c4d",+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60+  }+}
demo/routing/evidence/final-take/004-fusion_route_net.jsonadded+118
@@ -0,0 +1,118 @@+{+  "elapsedSeconds": 0.2331601710029645,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "ed9fd520235f10745a6a7115ebee65771516dc1160c5f2ae1f5c7428c41e3c4d",+    "net": "NET_3",+    "layer": 1,+    "width": 0.25,+    "paths": [+      [+        {+          "pad": "J1.3"+        },+        {+          "x": 14,+          "y": 17,+          "layer": 16+        },+        {+          "x": 40,+          "y": 17,+          "layer": 1+        },+        {+          "pad": "J2.3"+        }+      ]+    ],+    "dryRun": true+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "documentName": "fusion-routing",+    "durationMs": 229,+    "error": "",+    "mutated": false,+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            14,+            17+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_3",+          "start": [+            7.0,+            17.0+          ],+          "width": 0.25+        },+        {+          "at": [+            14,+            17+          ],+          "diameter": 0.6,+          "drill": 0.3,+          "extent": "1-16",+          "kind": "via",+          "net": "NET_3"+        },+        {+          "end": [+            40,+            17+          ],+          "kind": "segment",+          "layer": 16,+          "net": "NET_3",+          "start": [+            14,+            17+          ],+          "width": 0.25+        },+        {+          "at": [+            40,+            17+          ],+          "diameter": 0.6,+          "drill": 0.3,+          "extent": "1-16",+          "kind": "via",+          "net": "NET_3"+        },+        {+          "end": [+            47.0,+            17.0+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_3",+          "start": [+            40,+            17+          ],+          "width": 0.25+        }+      ],+      "net": "NET_3",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "revision": "ed9fd520235f10745a6a7115ebee65771516dc1160c5f2ae1f5c7428c41e3c4d",+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60+  }+}
demo/routing/evidence/final-take/005-fusion_route_net.jsonadded+94
@@ -0,0 +1,94 @@+{+  "elapsedSeconds": 0.2160415560065303,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "ed9fd520235f10745a6a7115ebee65771516dc1160c5f2ae1f5c7428c41e3c4d",+    "net": "NET_4",+    "layer": 1,+    "width": 0.25,+    "paths": [+      [+        {+          "pad": "J1.4"+        },+        [+          14,+          22+        ],+        [+          40,+          22+        ],+        {+          "pad": "J2.4"+        }+      ]+    ],+    "dryRun": true+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "documentName": "fusion-routing",+    "durationMs": 211,+    "error": "",+    "mutated": false,+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            14,+            22+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_4",+          "start": [+            7.0,+            22.0+          ],+          "width": 0.25+        },+        {+          "end": [+            40,+            22+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_4",+          "start": [+            14,+            22+          ],+          "width": 0.25+        },+        {+          "end": [+            47.0,+            22.0+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_4",+          "start": [+            40,+            22+          ],+          "width": 0.25+        }+      ],+      "net": "NET_4",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "revision": "ed9fd520235f10745a6a7115ebee65771516dc1160c5f2ae1f5c7428c41e3c4d",+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60+  }+}
demo/routing/evidence/final-take/006-fusion_route_net.jsonadded+94
@@ -0,0 +1,94 @@+{+  "elapsedSeconds": 0.2218289750016993,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "ed9fd520235f10745a6a7115ebee65771516dc1160c5f2ae1f5c7428c41e3c4d",+    "net": "NET_5",+    "layer": 1,+    "width": 0.25,+    "paths": [+      [+        {+          "pad": "J1.5"+        },+        [+          14,+          27+        ],+        [+          40,+          27+        ],+        {+          "pad": "J2.5"+        }+      ]+    ],+    "dryRun": true+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "documentName": "fusion-routing",+    "durationMs": 217,+    "error": "",+    "mutated": false,+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            14,+            27+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_5",+          "start": [+            7.0,+            27.0+          ],+          "width": 0.25+        },+        {+          "end": [+            40,+            27+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_5",+          "start": [+            14,+            27+          ],+          "width": 0.25+        },+        {+          "end": [+            47.0,+            27.0+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_5",+          "start": [+            40,+            27+          ],+          "width": 0.25+        }+      ],+      "net": "NET_5",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "revision": "ed9fd520235f10745a6a7115ebee65771516dc1160c5f2ae1f5c7428c41e3c4d",+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60+  }+}
demo/routing/evidence/final-take/007-fusion_route_net.jsonadded+135
@@ -0,0 +1,135 @@+{+  "elapsedSeconds": 0.22208477699314244,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "ed9fd520235f10745a6a7115ebee65771516dc1160c5f2ae1f5c7428c41e3c4d",+    "net": "NET_6",+    "layer": 1,+    "width": 0.25,+    "paths": [+      [+        {+          "pad": "J1.6"+        },+        [+          14,+          32+        ],+        [+          40,+          32+        ],+        {+          "pad": "J2.6"+        }+      ],+      [+        [+          27,+          32+        ],+        [+          27,+          35+        ],+        {+          "pad": "J3.1"+        }+      ]+    ],+    "dryRun": true+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "documentName": "fusion-routing",+    "durationMs": 218,+    "error": "",+    "mutated": false,+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            14,+            32+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_6",+          "start": [+            7.0,+            32.0+          ],+          "width": 0.25+        },+        {+          "end": [+            40,+            32+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_6",+          "start": [+            14,+            32+          ],+          "width": 0.25+        },+        {+          "end": [+            47.0,+            32.0+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_6",+          "start": [+            40,+            32+          ],+          "width": 0.25+        },+        {+          "end": [+            27,+            35+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_6",+          "start": [+            27,+            32+          ],+          "width": 0.25+        },+        {+          "end": [+            27.0,+            38.0+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_6",+          "start": [+            27,+            35+          ],+          "width": 0.25+        }+      ],+      "net": "NET_6",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "revision": "ed9fd520235f10745a6a7115ebee65771516dc1160c5f2ae1f5c7428c41e3c4d",+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60+  }+}
demo/routing/evidence/final-take/008-fusion_execute_text_command.jsonadded+30
@@ -0,0 +1,30 @@+{+  "elapsedSeconds": 0.7862591550074285,+  "args": {+    "command": "Electron.ImmediateRepaint /full",+    "expectDocument": "fusion-routing"+  },+  "result": {+    "_hint": "Window opened/changed in the BACKGROUND - the user's focus was NOT touched; do NOT foreground anything to compensate. Render results via fusion_state. If the USER asks to watch, re-call with {\"foreground\": true, \"foregroundReason\": \"<why, shown to the user as a 3s caption>\"}.",+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "data": {+      "activeDocument": "fusion-routing",+      "activeWorkspace": "PCB Editor",+      "command": "Electron.ImmediateRepaint /full",+      "result": ""+    },+    "durationMs": 782,+    "error": "",+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "windowEtiquette": "background",+    "message": "Executed: Electron.ImmediateRepaint /full (no output)",+    "activeDocument": "fusion-routing",+    "activeWorkspace": "PCB Editor",+    "command": "Electron.ImmediateRepaint /full",+    "result": ""+  }+}
demo/routing/evidence/final-take/009-desktop_record_window_start.jsonadded+39
@@ -0,0 +1,39 @@+{+  "elapsedSeconds": 0.7974112719966797,+  "args": {+    "hwnd": 8916576,+    "fps": 30,+    "reason": "Record real-time Fusion trace creation for the Adom routing demo"+  },+  "result": {+    "_hint": "Native window recording (WGC): background-capturable, no picker. Stop with desktop_record_stop {recordingId}; pull the MP4 with pull_file.",+    "audio": false,+    "audioNote": null,+    "audioRate": 0,+    "codec": "h264",+    "durationMs": 792,+    "encoder": "NVIDIA H.264 Encoder MFT",+    "error": "",+    "fps": 30,+    "hardwareEncoder": true,+    "height": 1540,+    "hwnd": 8916576,+    "kind": "window",+    "maxDurationMs": 0,+    "path": "C:/Users/john/AppData/Local/Temp/adom-bridge-recordings/window-8916576-20260905-205212.mp4",+    "recordingId": "rec-a01a1df4be85416daee52dd2ebc2a53a",+    "status": "ok",+    "success": true,+    "timeoutSeconds": 15,+    "title": "fusion-routing* (jlauerhub) - Autodesk Fusion (Trial ends in 16 days) ",+    "width": 2564,+    "data": {+      "height": 1540,+      "kind": "window",+      "path": "C:\\Users\\john\\AppData\\Local\\Temp\\adom-bridge-recordings\\window-8916576-20260905-205212.mp4",+      "recordingId": "rec-a01a1df4be85416daee52dd2ebc2a53a",+      "width": 2564+    },+    "message": "Recording window \"fusion-routing* (jlauerhub) - Autodesk Fusion (Trial ends in 16 days) \" -> C:\\Users\\john\\AppData\\Local\\Temp\\adom-bridge-recordings\\window-8916576-20260905-205212.mp4 (2564x1540 @ 30fps h264)"+  }+}
demo/routing/evidence/final-take/010-fusion_route_net.jsonadded+412
@@ -0,0 +1,412 @@+{+  "elapsedSeconds": 0.8648491710046073,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "ed9fd520235f10745a6a7115ebee65771516dc1160c5f2ae1f5c7428c41e3c4d",+    "net": "NET_1",+    "width": 0.25,+    "layer": 1,+    "points": [+      [+        7.0,+        7.0+      ],+      [+        14,+        7+      ]+    ]+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 7,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "commands": [+      "LAYER 1; LINE 'NET_1' 0.250000mm (7.000000mm 7.000000mm) (14.000000mm 7.000000mm);"+    ],+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "checked": false,+      "note": "Use fusion_routing_drc for a fresh Autodesk DRC"+    },+    "durationMs": 859,+    "error": "",+    "errorCode": null,+    "mutated": true,+    "nets": [+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              7.0+            ],+            "start": [+              14.0,+              7.0+            ]+          }+        ],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 1,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              12.0+            ],+            "start": [+              7.0,+              12.0+            ]+          }+        ],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              17.0+            ],+            "start": [+              7.0,+              17.0+            ]+          }+        ],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              22.0+            ],+            "start": [+              7.0,+              22.0+            ]+          }+        ],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              27.0+            ],+            "start": [+              7.0,+              27.0+            ]+          }+        ],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 2,+        "airwires": [+          {+            "end": [+              47.0,+              32.0+            ],+            "start": [+              27.0,+              38.0+            ]+          },+          {+            "end": [+              27.0,+              38.0+            ],+            "start": [+              7.0,+              32.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 0,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            14,+            7+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_1",+          "start": [+            7.0,+            7.0+          ],+          "width": 0.25+        }+      ],+      "net": "NET_1",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "remainingNets": [+      "NET_1",+      "NET_2",+      "NET_3",+      "NET_4",+      "NET_5",+      "NET_6"+    ],+    "revision": "c195c0f2bbe6f40ef6408c15d67c77c98cb7e4d35ab58bb465c29d305c1e2f0d",+    "segmentCount": 1,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "verified": true,+    "viaCount": 0,+    "vias": []+  }+}
demo/routing/evidence/final-take/011-fusion_route_net.jsonadded+426
@@ -0,0 +1,426 @@+{+  "elapsedSeconds": 0.747688636998646,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "c195c0f2bbe6f40ef6408c15d67c77c98cb7e4d35ab58bb465c29d305c1e2f0d",+    "net": "NET_1",+    "width": 0.25,+    "layer": 1,+    "points": [+      [+        14,+        7+      ],+      [+        40,+        7+      ]+    ]+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 7,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "commands": [+      "LAYER 1; LINE 'NET_1' 0.250000mm (14.000000mm 7.000000mm) (40.000000mm 7.000000mm);"+    ],+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "checked": false,+      "note": "Use fusion_routing_drc for a fresh Autodesk DRC"+    },+    "durationMs": 742,+    "error": "",+    "errorCode": null,+    "mutated": true,+    "nets": [+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              7.0+            ],+            "start": [+              40.0,+              7.0+            ]+          }+        ],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 2,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              12.0+            ],+            "start": [+              7.0,+              12.0+            ]+          }+        ],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              17.0+            ],+            "start": [+              7.0,+              17.0+            ]+          }+        ],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              22.0+            ],+            "start": [+              7.0,+              22.0+            ]+          }+        ],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              27.0+            ],+            "start": [+              7.0,+              27.0+            ]+          }+        ],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 2,+        "airwires": [+          {+            "end": [+              47.0,+              32.0+            ],+            "start": [+              27.0,+              38.0+            ]+          },+          {+            "end": [+              27.0,+              38.0+            ],+            "start": [+              7.0,+              32.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 0,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            40,+            7+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_1",+          "start": [+            14,+            7+          ],+          "width": 0.25+        }+      ],+      "net": "NET_1",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "remainingNets": [+      "NET_1",+      "NET_2",+      "NET_3",+      "NET_4",+      "NET_5",+      "NET_6"+    ],+    "revision": "16049fd5a8782b7908e4f19deb0f80deab86af87aa5d0e1d2fe80c21321017d2",+    "segmentCount": 2,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "verified": true,+    "viaCount": 0,+    "vias": []+  }+}
demo/routing/evidence/final-take/012-fusion_route_net.jsonadded+428
@@ -0,0 +1,428 @@+{+  "elapsedSeconds": 0.9071925399912288,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "16049fd5a8782b7908e4f19deb0f80deab86af87aa5d0e1d2fe80c21321017d2",+    "net": "NET_1",+    "width": 0.25,+    "layer": 1,+    "points": [+      [+        40,+        7+      ],+      [+        47.0,+        7.0+      ]+    ]+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 6,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "commands": [+      "LAYER 1; LINE 'NET_1' 0.250000mm (40.000000mm 7.000000mm) (47.000000mm 7.000000mm);"+    ],+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "checked": false,+      "note": "Use fusion_routing_drc for a fresh Autodesk DRC"+    },+    "durationMs": 901,+    "error": "",+    "errorCode": null,+    "mutated": true,+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              12.0+            ],+            "start": [+              7.0,+              12.0+            ]+          }+        ],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              17.0+            ],+            "start": [+              7.0,+              17.0+            ]+          }+        ],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              22.0+            ],+            "start": [+              7.0,+              22.0+            ]+          }+        ],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              27.0+            ],+            "start": [+              7.0,+              27.0+            ]+          }+        ],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 2,+        "airwires": [+          {+            "end": [+              47.0,+              32.0+            ],+            "start": [+              27.0,+              38.0+            ]+          },+          {+            "end": [+              27.0,+              38.0+            ],+            "start": [+              7.0,+              32.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 0,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            47.0,+            7.0+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_1",+          "start": [+            40,+            7+          ],+          "width": 0.25+        }+      ],+      "net": "NET_1",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "remainingNets": [+      "NET_2",+      "NET_3",+      "NET_4",+      "NET_5",+      "NET_6"+    ],+    "revision": "730bf931d6b202ec144d2cefcadc158597c9107dbabdfcd8f1417043938f76f9",+    "segmentCount": 3,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "verified": true,+    "viaCount": 0,+    "vias": []+  }+}
demo/routing/evidence/final-take/013-fusion_routing_drc.jsonadded+430
@@ -0,0 +1,430 @@+{+  "elapsedSeconds": 0.738795653989655,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "730bf931d6b202ec144d2cefcadc158597c9107dbabdfcd8f1417043938f76f9"+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 6,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "airwireCount": 6,+      "checked": true,+      "clean": false,+      "errorCount": 0,+      "errors": [+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        },+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        },+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        },+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        },+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        },+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        }+      ],+      "source": "Autodesk DRC + UL_BOARD.errors",+      "warningCount": 0+    },+    "durationMs": 733,+    "error": "",+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              12.0+            ],+            "start": [+              7.0,+              12.0+            ]+          }+        ],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              17.0+            ],+            "start": [+              7.0,+              17.0+            ]+          }+        ],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              22.0+            ],+            "start": [+              7.0,+              22.0+            ]+          }+        ],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              27.0+            ],+            "start": [+              7.0,+              27.0+            ]+          }+        ],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 2,+        "airwires": [+          {+            "end": [+              47.0,+              32.0+            ],+            "start": [+              27.0,+              38.0+            ]+          },+          {+            "end": [+              27.0,+              38.0+            ],+            "start": [+              7.0,+              32.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 0,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "remainingNets": [+      "NET_2",+      "NET_3",+      "NET_4",+      "NET_5",+      "NET_6"+    ],+    "revision": "730bf931d6b202ec144d2cefcadc158597c9107dbabdfcd8f1417043938f76f9",+    "segmentCount": 3,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "viaCount": 0,+    "vias": []+  }+}
demo/routing/evidence/final-take/014-fusion_route_net.jsonadded+442
@@ -0,0 +1,442 @@+{+  "elapsedSeconds": 0.8588828190113418,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "730bf931d6b202ec144d2cefcadc158597c9107dbabdfcd8f1417043938f76f9",+    "net": "NET_2",+    "width": 0.25,+    "layer": 1,+    "points": [+      [+        7.0,+        12.0+      ],+      [+        14,+        12+      ]+    ]+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 6,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "commands": [+      "LAYER 1; LINE 'NET_2' 0.250000mm (7.000000mm 12.000000mm) (14.000000mm 12.000000mm);"+    ],+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "checked": false,+      "note": "Use fusion_routing_drc for a fresh Autodesk DRC"+    },+    "durationMs": 853,+    "error": "",+    "errorCode": null,+    "mutated": true,+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              12.0+            ],+            "start": [+              14.0,+              12.0+            ]+          }+        ],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 1,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              17.0+            ],+            "start": [+              7.0,+              17.0+            ]+          }+        ],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              22.0+            ],+            "start": [+              7.0,+              22.0+            ]+          }+        ],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              27.0+            ],+            "start": [+              7.0,+              27.0+            ]+          }+        ],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 2,+        "airwires": [+          {+            "end": [+              47.0,+              32.0+            ],+            "start": [+              27.0,+              38.0+            ]+          },+          {+            "end": [+              27.0,+              38.0+            ],+            "start": [+              7.0,+              32.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 0,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            14,+            12+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_2",+          "start": [+            7.0,+            12.0+          ],+          "width": 0.25+        }+      ],+      "net": "NET_2",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "remainingNets": [+      "NET_2",+      "NET_3",+      "NET_4",+      "NET_5",+      "NET_6"+    ],+    "revision": "f7b43edfabfac9c2b7b43930e1a2cfd7f3d500509870c81bdaa0d1a983622adf",+    "segmentCount": 4,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          7.0,+          12.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "verified": true,+    "viaCount": 0,+    "vias": []+  }+}
demo/routing/evidence/final-take/015-fusion_route_net.jsonadded+456
@@ -0,0 +1,456 @@+{+  "elapsedSeconds": 0.9207163100072648,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "f7b43edfabfac9c2b7b43930e1a2cfd7f3d500509870c81bdaa0d1a983622adf",+    "net": "NET_2",+    "width": 0.25,+    "layer": 1,+    "points": [+      [+        14,+        12+      ],+      [+        40,+        12+      ]+    ]+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 6,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "commands": [+      "LAYER 1; LINE 'NET_2' 0.250000mm (14.000000mm 12.000000mm) (40.000000mm 12.000000mm);"+    ],+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "checked": false,+      "note": "Use fusion_routing_drc for a fresh Autodesk DRC"+    },+    "durationMs": 915,+    "error": "",+    "errorCode": null,+    "mutated": true,+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              12.0+            ],+            "start": [+              40.0,+              12.0+            ]+          }+        ],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 2,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              17.0+            ],+            "start": [+              7.0,+              17.0+            ]+          }+        ],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              22.0+            ],+            "start": [+              7.0,+              22.0+            ]+          }+        ],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              27.0+            ],+            "start": [+              7.0,+              27.0+            ]+          }+        ],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 2,+        "airwires": [+          {+            "end": [+              47.0,+              32.0+            ],+            "start": [+              27.0,+              38.0+            ]+          },+          {+            "end": [+              27.0,+              38.0+            ],+            "start": [+              7.0,+              32.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 0,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            40,+            12+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_2",+          "start": [+            14,+            12+          ],+          "width": 0.25+        }+      ],+      "net": "NET_2",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "remainingNets": [+      "NET_2",+      "NET_3",+      "NET_4",+      "NET_5",+      "NET_6"+    ],+    "revision": "7233fb584cd96f4b0bf5608ac4e67eb2ede87743018911e885f56a7cab60ccc2",+    "segmentCount": 5,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          7.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          14.0,+          12.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "verified": true,+    "viaCount": 0,+    "vias": []+  }+}
demo/routing/evidence/final-take/016-fusion_route_net.jsonadded+458
@@ -0,0 +1,458 @@+{+  "elapsedSeconds": 0.980878059999668,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "7233fb584cd96f4b0bf5608ac4e67eb2ede87743018911e885f56a7cab60ccc2",+    "net": "NET_2",+    "width": 0.25,+    "layer": 1,+    "points": [+      [+        40,+        12+      ],+      [+        47.0,+        12.0+      ]+    ]+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 5,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "commands": [+      "LAYER 1; LINE 'NET_2' 0.250000mm (40.000000mm 12.000000mm) (47.000000mm 12.000000mm);"+    ],+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "checked": false,+      "note": "Use fusion_routing_drc for a fresh Autodesk DRC"+    },+    "durationMs": 975,+    "error": "",+    "errorCode": null,+    "mutated": true,+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              17.0+            ],+            "start": [+              7.0,+              17.0+            ]+          }+        ],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              22.0+            ],+            "start": [+              7.0,+              22.0+            ]+          }+        ],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              27.0+            ],+            "start": [+              7.0,+              27.0+            ]+          }+        ],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 2,+        "airwires": [+          {+            "end": [+              47.0,+              32.0+            ],+            "start": [+              27.0,+              38.0+            ]+          },+          {+            "end": [+              27.0,+              38.0+            ],+            "start": [+              7.0,+              32.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 0,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            47.0,+            12.0+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_2",+          "start": [+            40,+            12+          ],+          "width": 0.25+        }+      ],+      "net": "NET_2",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "remainingNets": [+      "NET_3",+      "NET_4",+      "NET_5",+      "NET_6"+    ],+    "revision": "9de8edfe6743cf0ca0155cbfdfe92fefddc973b53e396cac34c626aad7c18263",+    "segmentCount": 6,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          7.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          14.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          40.0,+          12.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "verified": true,+    "viaCount": 0,+    "vias": []+  }+}
demo/routing/evidence/final-take/017-fusion_routing_drc.jsonadded+454
@@ -0,0 +1,454 @@+{+  "elapsedSeconds": 0.579271073002019,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "9de8edfe6743cf0ca0155cbfdfe92fefddc973b53e396cac34c626aad7c18263"+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 5,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "airwireCount": 5,+      "checked": true,+      "clean": false,+      "errorCount": 0,+      "errors": [+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        },+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        },+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        },+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        },+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        }+      ],+      "source": "Autodesk DRC + UL_BOARD.errors",+      "warningCount": 0+    },+    "durationMs": 573,+    "error": "",+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              17.0+            ],+            "start": [+              7.0,+              17.0+            ]+          }+        ],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              22.0+            ],+            "start": [+              7.0,+              22.0+            ]+          }+        ],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              27.0+            ],+            "start": [+              7.0,+              27.0+            ]+          }+        ],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 2,+        "airwires": [+          {+            "end": [+              47.0,+              32.0+            ],+            "start": [+              27.0,+              38.0+            ]+          },+          {+            "end": [+              27.0,+              38.0+            ],+            "start": [+              7.0,+              32.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 0,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "remainingNets": [+      "NET_3",+      "NET_4",+      "NET_5",+      "NET_6"+    ],+    "revision": "9de8edfe6743cf0ca0155cbfdfe92fefddc973b53e396cac34c626aad7c18263",+    "segmentCount": 6,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          7.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          14.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          40.0,+          12.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "viaCount": 0,+    "vias": []+  }+}
demo/routing/evidence/final-take/018-fusion_route_net.jsonadded+472
@@ -0,0 +1,472 @@+{+  "elapsedSeconds": 0.8122331449994817,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "9de8edfe6743cf0ca0155cbfdfe92fefddc973b53e396cac34c626aad7c18263",+    "net": "NET_3",+    "width": 0.25,+    "layer": 1,+    "points": [+      [+        7.0,+        17.0+      ],+      [+        14,+        17+      ]+    ]+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 5,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "commands": [+      "LAYER 1; LINE 'NET_3' 0.250000mm (7.000000mm 17.000000mm) (14.000000mm 17.000000mm);"+    ],+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "checked": false,+      "note": "Use fusion_routing_drc for a fresh Autodesk DRC"+    },+    "durationMs": 806,+    "error": "",+    "errorCode": null,+    "mutated": true,+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              17.0+            ],+            "start": [+              14.0,+              17.0+            ]+          }+        ],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 1,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              22.0+            ],+            "start": [+              7.0,+              22.0+            ]+          }+        ],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              27.0+            ],+            "start": [+              7.0,+              27.0+            ]+          }+        ],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 2,+        "airwires": [+          {+            "end": [+              47.0,+              32.0+            ],+            "start": [+              27.0,+              38.0+            ]+          },+          {+            "end": [+              27.0,+              38.0+            ],+            "start": [+              7.0,+              32.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 0,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            14,+            17+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_3",+          "start": [+            7.0,+            17.0+          ],+          "width": 0.25+        }+      ],+      "net": "NET_3",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "remainingNets": [+      "NET_3",+      "NET_4",+      "NET_5",+      "NET_6"+    ],+    "revision": "d51b51deb7e044fce75ebeecc8e6793dc4899ee90cd19de6d7c28d18eba46335",+    "segmentCount": 7,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          7.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          14.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          40.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          7.0,+          17.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "verified": true,+    "viaCount": 0,+    "vias": []+  }+}
demo/routing/evidence/final-take/019-fusion_route_net.jsonadded+482
@@ -0,0 +1,482 @@+{+  "elapsedSeconds": 0.9965617209963966,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "d51b51deb7e044fce75ebeecc8e6793dc4899ee90cd19de6d7c28d18eba46335",+    "net": "NET_3",+    "layer": 1,+    "viaDiameter": 0.6,+    "viaDrill": 0.3,+    "points": [+      [+        14,+        17+      ],+      {+        "x": 14,+        "y": 17,+        "layer": 16+      }+    ]+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 5,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "commands": [+      "VIA 'NET_3' 0.600000mm ROUND 1-16 (14.000000mm 17.000000mm); CHANGE DRILL 0.300000mm (14.000000mm 17.000000mm);"+    ],+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "checked": false,+      "note": "Use fusion_routing_drc for a fresh Autodesk DRC"+    },+    "durationMs": 990,+    "error": "",+    "errorCode": null,+    "mutated": true,+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              17.0+            ],+            "start": [+              14.0,+              17.0+            ]+          }+        ],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 1,+        "vias": 1+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              22.0+            ],+            "start": [+              7.0,+              22.0+            ]+          }+        ],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              27.0+            ],+            "start": [+              7.0,+              27.0+            ]+          }+        ],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 2,+        "airwires": [+          {+            "end": [+              47.0,+              32.0+            ],+            "start": [+              27.0,+              38.0+            ]+          },+          {+            "end": [+              27.0,+              38.0+            ],+            "start": [+              7.0,+              32.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 0,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "at": [+            14,+            17+          ],+          "diameter": 0.6,+          "drill": 0.3,+          "extent": "1-16",+          "kind": "via",+          "net": "NET_3"+        }+      ],+      "net": "NET_3",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "remainingNets": [+      "NET_3",+      "NET_4",+      "NET_5",+      "NET_6"+    ],+    "revision": "22a43304270d463d8b1540b44a5d232a4347a631c31472513fe07b85a2d57151",+    "segmentCount": 7,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          7.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          14.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          40.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          7.0,+          17.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "verified": true,+    "viaCount": 1,+    "vias": [+      {+        "at": [+          14.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      }+    ]+  }+}
demo/routing/evidence/final-take/020-fusion_route_net.jsonadded+497
@@ -0,0 +1,497 @@+{+  "elapsedSeconds": 0.8616940259962576,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "22a43304270d463d8b1540b44a5d232a4347a631c31472513fe07b85a2d57151",+    "net": "NET_3",+    "width": 0.25,+    "layer": 16,+    "points": [+      [+        14,+        17+      ],+      [+        40,+        17+      ]+    ]+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 5,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "commands": [+      "LAYER 16; LINE 'NET_3' 0.250000mm (14.000000mm 17.000000mm) (40.000000mm 17.000000mm);"+    ],+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "checked": false,+      "note": "Use fusion_routing_drc for a fresh Autodesk DRC"+    },+    "durationMs": 855,+    "error": "",+    "errorCode": null,+    "mutated": true,+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              17.0+            ],+            "start": [+              40.0,+              17.0+            ]+          }+        ],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 2,+        "vias": 1+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              22.0+            ],+            "start": [+              7.0,+              22.0+            ]+          }+        ],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              27.0+            ],+            "start": [+              7.0,+              27.0+            ]+          }+        ],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 2,+        "airwires": [+          {+            "end": [+              47.0,+              32.0+            ],+            "start": [+              27.0,+              38.0+            ]+          },+          {+            "end": [+              27.0,+              38.0+            ],+            "start": [+              7.0,+              32.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 0,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            40,+            17+          ],+          "kind": "segment",+          "layer": 16,+          "net": "NET_3",+          "start": [+            14,+            17+          ],+          "width": 0.25+        }+      ],+      "net": "NET_3",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "remainingNets": [+      "NET_3",+      "NET_4",+      "NET_5",+      "NET_6"+    ],+    "revision": "50e65c1024dde30859d49459b45629536169ed04dc09ed0dc834d12109bd1099",+    "segmentCount": 8,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          7.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          14.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          40.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          7.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          17.0+        ],+        "layer": 16,+        "net": "NET_3",+        "start": [+          14.0,+          17.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "verified": true,+    "viaCount": 1,+    "vias": [+      {+        "at": [+          14.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      }+    ]+  }+}
demo/routing/evidence/final-take/021-fusion_route_net.jsonadded+506
@@ -0,0 +1,506 @@+{+  "elapsedSeconds": 0.8889578950038413,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "50e65c1024dde30859d49459b45629536169ed04dc09ed0dc834d12109bd1099",+    "net": "NET_3",+    "layer": 1,+    "viaDiameter": 0.6,+    "viaDrill": 0.3,+    "points": [+      [+        40,+        17+      ],+      {+        "x": 40,+        "y": 17,+        "layer": 16+      }+    ]+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 5,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "commands": [+      "VIA 'NET_3' 0.600000mm ROUND 1-16 (40.000000mm 17.000000mm); CHANGE DRILL 0.300000mm (40.000000mm 17.000000mm);"+    ],+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "checked": false,+      "note": "Use fusion_routing_drc for a fresh Autodesk DRC"+    },+    "durationMs": 883,+    "error": "",+    "errorCode": null,+    "mutated": true,+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              17.0+            ],+            "start": [+              40.0,+              17.0+            ]+          }+        ],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 2,+        "vias": 2+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              22.0+            ],+            "start": [+              7.0,+              22.0+            ]+          }+        ],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              27.0+            ],+            "start": [+              7.0,+              27.0+            ]+          }+        ],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 2,+        "airwires": [+          {+            "end": [+              47.0,+              32.0+            ],+            "start": [+              27.0,+              38.0+            ]+          },+          {+            "end": [+              27.0,+              38.0+            ],+            "start": [+              7.0,+              32.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 0,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "at": [+            40,+            17+          ],+          "diameter": 0.6,+          "drill": 0.3,+          "extent": "1-16",+          "kind": "via",+          "net": "NET_3"+        }+      ],+      "net": "NET_3",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "remainingNets": [+      "NET_3",+      "NET_4",+      "NET_5",+      "NET_6"+    ],+    "revision": "f2cc4e89195c5107a9a33e4fe52bb4a50cb2c70f167b2f60445afc0996b87731",+    "segmentCount": 8,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          7.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          14.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          40.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          7.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          17.0+        ],+        "layer": 16,+        "net": "NET_3",+        "start": [+          14.0,+          17.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "verified": true,+    "viaCount": 2,+    "vias": [+      {+        "at": [+          14.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      },+      {+        "at": [+          40.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      }+    ]+  }+}
demo/routing/evidence/final-take/022-fusion_route_net.jsonadded+509
@@ -0,0 +1,509 @@+{+  "elapsedSeconds": 0.7189565159933409,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "f2cc4e89195c5107a9a33e4fe52bb4a50cb2c70f167b2f60445afc0996b87731",+    "net": "NET_3",+    "width": 0.25,+    "layer": 1,+    "points": [+      [+        40,+        17+      ],+      [+        47.0,+        17.0+      ]+    ]+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 4,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "commands": [+      "LAYER 1; LINE 'NET_3' 0.250000mm (40.000000mm 17.000000mm) (47.000000mm 17.000000mm);"+    ],+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "checked": false,+      "note": "Use fusion_routing_drc for a fresh Autodesk DRC"+    },+    "durationMs": 713,+    "error": "",+    "errorCode": null,+    "mutated": true,+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 3,+        "vias": 2+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              22.0+            ],+            "start": [+              7.0,+              22.0+            ]+          }+        ],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              27.0+            ],+            "start": [+              7.0,+              27.0+            ]+          }+        ],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 2,+        "airwires": [+          {+            "end": [+              47.0,+              32.0+            ],+            "start": [+              27.0,+              38.0+            ]+          },+          {+            "end": [+              27.0,+              38.0+            ],+            "start": [+              7.0,+              32.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 0,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            47.0,+            17.0+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_3",+          "start": [+            40,+            17+          ],+          "width": 0.25+        }+      ],+      "net": "NET_3",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "remainingNets": [+      "NET_4",+      "NET_5",+      "NET_6"+    ],+    "revision": "75a02b7d8ace0d30ecea581eaa90d5e751d2bc88c0fcffec622af4992d2483a0",+    "segmentCount": 9,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          7.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          14.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          40.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          7.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          17.0+        ],+        "layer": 16,+        "net": "NET_3",+        "start": [+          14.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          40.0,+          17.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "verified": true,+    "viaCount": 2,+    "vias": [+      {+        "at": [+          14.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      },+      {+        "at": [+          40.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      }+    ]+  }+}
demo/routing/evidence/final-take/023-fusion_routing_drc.jsonadded+499
@@ -0,0 +1,499 @@+{+  "elapsedSeconds": 0.602464305004105,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "75a02b7d8ace0d30ecea581eaa90d5e751d2bc88c0fcffec622af4992d2483a0"+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 4,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "airwireCount": 4,+      "checked": true,+      "clean": false,+      "errorCount": 0,+      "errors": [+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        },+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        },+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        },+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        }+      ],+      "source": "Autodesk DRC + UL_BOARD.errors",+      "warningCount": 0+    },+    "durationMs": 597,+    "error": "",+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 3,+        "vias": 2+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              22.0+            ],+            "start": [+              7.0,+              22.0+            ]+          }+        ],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              27.0+            ],+            "start": [+              7.0,+              27.0+            ]+          }+        ],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 2,+        "airwires": [+          {+            "end": [+              47.0,+              32.0+            ],+            "start": [+              27.0,+              38.0+            ]+          },+          {+            "end": [+              27.0,+              38.0+            ],+            "start": [+              7.0,+              32.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 0,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "remainingNets": [+      "NET_4",+      "NET_5",+      "NET_6"+    ],+    "revision": "75a02b7d8ace0d30ecea581eaa90d5e751d2bc88c0fcffec622af4992d2483a0",+    "segmentCount": 9,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          7.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          14.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          40.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          7.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          17.0+        ],+        "layer": 16,+        "net": "NET_3",+        "start": [+          14.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          40.0,+          17.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "viaCount": 2,+    "vias": [+      {+        "at": [+          14.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      },+      {+        "at": [+          40.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      }+    ]+  }+}
demo/routing/evidence/final-take/024-fusion_route_net.jsonadded+523
@@ -0,0 +1,523 @@+{+  "elapsedSeconds": 0.803696104005212,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "75a02b7d8ace0d30ecea581eaa90d5e751d2bc88c0fcffec622af4992d2483a0",+    "net": "NET_4",+    "width": 0.25,+    "layer": 1,+    "points": [+      [+        7.0,+        22.0+      ],+      [+        14,+        22+      ]+    ]+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 4,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "commands": [+      "LAYER 1; LINE 'NET_4' 0.250000mm (7.000000mm 22.000000mm) (14.000000mm 22.000000mm);"+    ],+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "checked": false,+      "note": "Use fusion_routing_drc for a fresh Autodesk DRC"+    },+    "durationMs": 798,+    "error": "",+    "errorCode": null,+    "mutated": true,+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 3,+        "vias": 2+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              22.0+            ],+            "start": [+              14.0,+              22.0+            ]+          }+        ],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 1,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              27.0+            ],+            "start": [+              7.0,+              27.0+            ]+          }+        ],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 2,+        "airwires": [+          {+            "end": [+              47.0,+              32.0+            ],+            "start": [+              27.0,+              38.0+            ]+          },+          {+            "end": [+              27.0,+              38.0+            ],+            "start": [+              7.0,+              32.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 0,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            14,+            22+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_4",+          "start": [+            7.0,+            22.0+          ],+          "width": 0.25+        }+      ],+      "net": "NET_4",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "remainingNets": [+      "NET_4",+      "NET_5",+      "NET_6"+    ],+    "revision": "31758f7661fde0a29af61eebdc4c57963e66f2d120784d5ce744301bd095ab34",+    "segmentCount": 10,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          7.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          14.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          40.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          7.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          17.0+        ],+        "layer": 16,+        "net": "NET_3",+        "start": [+          14.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          40.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          7.0,+          22.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "verified": true,+    "viaCount": 2,+    "vias": [+      {+        "at": [+          14.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      },+      {+        "at": [+          40.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      }+    ]+  }+}
demo/routing/evidence/final-take/025-fusion_route_net.jsonadded+537
@@ -0,0 +1,537 @@+{+  "elapsedSeconds": 0.7900986840104451,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "31758f7661fde0a29af61eebdc4c57963e66f2d120784d5ce744301bd095ab34",+    "net": "NET_4",+    "width": 0.25,+    "layer": 1,+    "points": [+      [+        14,+        22+      ],+      [+        40,+        22+      ]+    ]+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 4,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "commands": [+      "LAYER 1; LINE 'NET_4' 0.250000mm (14.000000mm 22.000000mm) (40.000000mm 22.000000mm);"+    ],+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "checked": false,+      "note": "Use fusion_routing_drc for a fresh Autodesk DRC"+    },+    "durationMs": 784,+    "error": "",+    "errorCode": null,+    "mutated": true,+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 3,+        "vias": 2+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              22.0+            ],+            "start": [+              40.0,+              22.0+            ]+          }+        ],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 2,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              27.0+            ],+            "start": [+              7.0,+              27.0+            ]+          }+        ],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 2,+        "airwires": [+          {+            "end": [+              47.0,+              32.0+            ],+            "start": [+              27.0,+              38.0+            ]+          },+          {+            "end": [+              27.0,+              38.0+            ],+            "start": [+              7.0,+              32.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 0,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            40,+            22+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_4",+          "start": [+            14,+            22+          ],+          "width": 0.25+        }+      ],+      "net": "NET_4",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "remainingNets": [+      "NET_4",+      "NET_5",+      "NET_6"+    ],+    "revision": "19c2c3919e51af4c904d169fb513c10dee8c253b73c5c5d8f6d7ff6ec638f511",+    "segmentCount": 11,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          7.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          14.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          40.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          7.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          17.0+        ],+        "layer": 16,+        "net": "NET_3",+        "start": [+          14.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          40.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          7.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          14.0,+          22.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "verified": true,+    "viaCount": 2,+    "vias": [+      {+        "at": [+          14.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      },+      {+        "at": [+          40.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      }+    ]+  }+}
demo/routing/evidence/final-take/026-fusion_route_net.jsonadded+539
@@ -0,0 +1,539 @@+{+  "elapsedSeconds": 0.7976463100058027,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "19c2c3919e51af4c904d169fb513c10dee8c253b73c5c5d8f6d7ff6ec638f511",+    "net": "NET_4",+    "width": 0.25,+    "layer": 1,+    "points": [+      [+        40,+        22+      ],+      [+        47.0,+        22.0+      ]+    ]+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 3,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "commands": [+      "LAYER 1; LINE 'NET_4' 0.250000mm (40.000000mm 22.000000mm) (47.000000mm 22.000000mm);"+    ],+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "checked": false,+      "note": "Use fusion_routing_drc for a fresh Autodesk DRC"+    },+    "durationMs": 793,+    "error": "",+    "errorCode": null,+    "mutated": true,+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 3,+        "vias": 2+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              27.0+            ],+            "start": [+              7.0,+              27.0+            ]+          }+        ],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 2,+        "airwires": [+          {+            "end": [+              47.0,+              32.0+            ],+            "start": [+              27.0,+              38.0+            ]+          },+          {+            "end": [+              27.0,+              38.0+            ],+            "start": [+              7.0,+              32.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 0,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            47.0,+            22.0+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_4",+          "start": [+            40,+            22+          ],+          "width": 0.25+        }+      ],+      "net": "NET_4",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "remainingNets": [+      "NET_5",+      "NET_6"+    ],+    "revision": "32dd9ae2ecfb2964596a10c324b92416e3a19e8898de5eae98da59fdd46bb30f",+    "segmentCount": 12,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          7.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          14.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          40.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          7.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          17.0+        ],+        "layer": 16,+        "net": "NET_3",+        "start": [+          14.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          40.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          7.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          14.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          40.0,+          22.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "verified": true,+    "viaCount": 2,+    "vias": [+      {+        "at": [+          14.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      },+      {+        "at": [+          40.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      }+    ]+  }+}
demo/routing/evidence/final-take/027-fusion_routing_drc.jsonadded+523
@@ -0,0 +1,523 @@+{+  "elapsedSeconds": 0.5468900270061567,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "32dd9ae2ecfb2964596a10c324b92416e3a19e8898de5eae98da59fdd46bb30f"+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 3,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "airwireCount": 3,+      "checked": true,+      "clean": false,+      "errorCount": 0,+      "errors": [+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        },+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        },+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        }+      ],+      "source": "Autodesk DRC + UL_BOARD.errors",+      "warningCount": 0+    },+    "durationMs": 541,+    "error": "",+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 3,+        "vias": 2+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              27.0+            ],+            "start": [+              7.0,+              27.0+            ]+          }+        ],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 2,+        "airwires": [+          {+            "end": [+              47.0,+              32.0+            ],+            "start": [+              27.0,+              38.0+            ]+          },+          {+            "end": [+              27.0,+              38.0+            ],+            "start": [+              7.0,+              32.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 0,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "remainingNets": [+      "NET_5",+      "NET_6"+    ],+    "revision": "32dd9ae2ecfb2964596a10c324b92416e3a19e8898de5eae98da59fdd46bb30f",+    "segmentCount": 12,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          7.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          14.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          40.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          7.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          17.0+        ],+        "layer": 16,+        "net": "NET_3",+        "start": [+          14.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          40.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          7.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          14.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          40.0,+          22.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "viaCount": 2,+    "vias": [+      {+        "at": [+          14.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      },+      {+        "at": [+          40.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      }+    ]+  }+}
demo/routing/evidence/final-take/028-fusion_route_net.jsonadded+553
@@ -0,0 +1,553 @@+{+  "elapsedSeconds": 0.8602733589941636,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "32dd9ae2ecfb2964596a10c324b92416e3a19e8898de5eae98da59fdd46bb30f",+    "net": "NET_5",+    "width": 0.25,+    "layer": 1,+    "points": [+      [+        7.0,+        27.0+      ],+      [+        14,+        27+      ]+    ]+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 3,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "commands": [+      "LAYER 1; LINE 'NET_5' 0.250000mm (7.000000mm 27.000000mm) (14.000000mm 27.000000mm);"+    ],+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "checked": false,+      "note": "Use fusion_routing_drc for a fresh Autodesk DRC"+    },+    "durationMs": 855,+    "error": "",+    "errorCode": null,+    "mutated": true,+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 3,+        "vias": 2+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              27.0+            ],+            "start": [+              14.0,+              27.0+            ]+          }+        ],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 1,+        "vias": 0+      },+      {+        "airwireCount": 2,+        "airwires": [+          {+            "end": [+              47.0,+              32.0+            ],+            "start": [+              27.0,+              38.0+            ]+          },+          {+            "end": [+              27.0,+              38.0+            ],+            "start": [+              7.0,+              32.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 0,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            14,+            27+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_5",+          "start": [+            7.0,+            27.0+          ],+          "width": 0.25+        }+      ],+      "net": "NET_5",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "remainingNets": [+      "NET_5",+      "NET_6"+    ],+    "revision": "3675f5b8874930ce02cf208972e17edbb19c746bfec1db4b80d59d43fef3fe5d",+    "segmentCount": 13,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          7.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          14.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          40.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          7.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          17.0+        ],+        "layer": 16,+        "net": "NET_3",+        "start": [+          14.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          40.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          7.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          14.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          40.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          7.0,+          27.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "verified": true,+    "viaCount": 2,+    "vias": [+      {+        "at": [+          14.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      },+      {+        "at": [+          40.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      }+    ]+  }+}
demo/routing/evidence/final-take/029-fusion_route_net.jsonadded+567
@@ -0,0 +1,567 @@+{+  "elapsedSeconds": 0.8164946939941728,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "3675f5b8874930ce02cf208972e17edbb19c746bfec1db4b80d59d43fef3fe5d",+    "net": "NET_5",+    "width": 0.25,+    "layer": 1,+    "points": [+      [+        14,+        27+      ],+      [+        40,+        27+      ]+    ]+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 3,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "commands": [+      "LAYER 1; LINE 'NET_5' 0.250000mm (14.000000mm 27.000000mm) (40.000000mm 27.000000mm);"+    ],+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "checked": false,+      "note": "Use fusion_routing_drc for a fresh Autodesk DRC"+    },+    "durationMs": 811,+    "error": "",+    "errorCode": null,+    "mutated": true,+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 3,+        "vias": 2+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              27.0+            ],+            "start": [+              40.0,+              27.0+            ]+          }+        ],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 2,+        "vias": 0+      },+      {+        "airwireCount": 2,+        "airwires": [+          {+            "end": [+              47.0,+              32.0+            ],+            "start": [+              27.0,+              38.0+            ]+          },+          {+            "end": [+              27.0,+              38.0+            ],+            "start": [+              7.0,+              32.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 0,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            40,+            27+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_5",+          "start": [+            14,+            27+          ],+          "width": 0.25+        }+      ],+      "net": "NET_5",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "remainingNets": [+      "NET_5",+      "NET_6"+    ],+    "revision": "d8fade9ab466022ca5fefe886e216d662d45f2e13cc4a0644ea1ccf7d1355688",+    "segmentCount": 14,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          7.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          14.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          40.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          7.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          17.0+        ],+        "layer": 16,+        "net": "NET_3",+        "start": [+          14.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          40.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          7.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          14.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          40.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          7.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          14.0,+          27.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "verified": true,+    "viaCount": 2,+    "vias": [+      {+        "at": [+          14.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      },+      {+        "at": [+          40.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      }+    ]+  }+}
demo/routing/evidence/final-take/030-fusion_route_net.jsonadded+569
@@ -0,0 +1,569 @@+{+  "elapsedSeconds": 0.7458777749998262,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "d8fade9ab466022ca5fefe886e216d662d45f2e13cc4a0644ea1ccf7d1355688",+    "net": "NET_5",+    "width": 0.25,+    "layer": 1,+    "points": [+      [+        40,+        27+      ],+      [+        47.0,+        27.0+      ]+    ]+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 2,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "commands": [+      "LAYER 1; LINE 'NET_5' 0.250000mm (40.000000mm 27.000000mm) (47.000000mm 27.000000mm);"+    ],+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "checked": false,+      "note": "Use fusion_routing_drc for a fresh Autodesk DRC"+    },+    "durationMs": 741,+    "error": "",+    "errorCode": null,+    "mutated": true,+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 3,+        "vias": 2+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 2,+        "airwires": [+          {+            "end": [+              47.0,+              32.0+            ],+            "start": [+              27.0,+              38.0+            ]+          },+          {+            "end": [+              27.0,+              38.0+            ],+            "start": [+              7.0,+              32.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 0,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            47.0,+            27.0+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_5",+          "start": [+            40,+            27+          ],+          "width": 0.25+        }+      ],+      "net": "NET_5",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "remainingNets": [+      "NET_6"+    ],+    "revision": "9ce30b995180357ba60bf02f3443336c588017228e3626a7bd5a66ae3df80718",+    "segmentCount": 15,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          7.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          14.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          40.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          7.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          17.0+        ],+        "layer": 16,+        "net": "NET_3",+        "start": [+          14.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          40.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          7.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          14.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          40.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          7.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          14.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          40.0,+          27.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "verified": true,+    "viaCount": 2,+    "vias": [+      {+        "at": [+          14.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      },+      {+        "at": [+          40.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      }+    ]+  }+}
demo/routing/evidence/final-take/031-fusion_routing_drc.jsonadded+547
@@ -0,0 +1,547 @@+{+  "elapsedSeconds": 0.5182242870068876,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "9ce30b995180357ba60bf02f3443336c588017228e3626a7bd5a66ae3df80718"+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 2,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "airwireCount": 2,+      "checked": true,+      "clean": false,+      "errorCount": 0,+      "errors": [+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        },+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        }+      ],+      "source": "Autodesk DRC + UL_BOARD.errors",+      "warningCount": 0+    },+    "durationMs": 513,+    "error": "",+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 3,+        "vias": 2+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 2,+        "airwires": [+          {+            "end": [+              47.0,+              32.0+            ],+            "start": [+              27.0,+              38.0+            ]+          },+          {+            "end": [+              27.0,+              38.0+            ],+            "start": [+              7.0,+              32.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 0,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "remainingNets": [+      "NET_6"+    ],+    "revision": "9ce30b995180357ba60bf02f3443336c588017228e3626a7bd5a66ae3df80718",+    "segmentCount": 15,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          7.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          14.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          40.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          7.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          17.0+        ],+        "layer": 16,+        "net": "NET_3",+        "start": [+          14.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          40.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          7.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          14.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          40.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          7.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          14.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          40.0,+          27.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "viaCount": 2,+    "vias": [+      {+        "at": [+          14.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      },+      {+        "at": [+          40.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      }+    ]+  }+}
demo/routing/evidence/final-take/032-fusion_route_net.jsonadded+583
@@ -0,0 +1,583 @@+{+  "elapsedSeconds": 0.7408678119973047,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "9ce30b995180357ba60bf02f3443336c588017228e3626a7bd5a66ae3df80718",+    "net": "NET_6",+    "width": 0.25,+    "layer": 1,+    "points": [+      [+        7.0,+        32.0+      ],+      [+        14,+        32+      ]+    ]+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 2,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "commands": [+      "LAYER 1; LINE 'NET_6' 0.250000mm (7.000000mm 32.000000mm) (14.000000mm 32.000000mm);"+    ],+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "checked": false,+      "note": "Use fusion_routing_drc for a fresh Autodesk DRC"+    },+    "durationMs": 736,+    "error": "",+    "errorCode": null,+    "mutated": true,+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 3,+        "vias": 2+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 2,+        "airwires": [+          {+            "end": [+              47.0,+              32.0+            ],+            "start": [+              27.0,+              38.0+            ]+          },+          {+            "end": [+              27.0,+              38.0+            ],+            "start": [+              14.0,+              32.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 1,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            14,+            32+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_6",+          "start": [+            7.0,+            32.0+          ],+          "width": 0.25+        }+      ],+      "net": "NET_6",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "remainingNets": [+      "NET_6"+    ],+    "revision": "4c2c470e4fd5d7367dc1b5dfd15160a62e5d0b1825dfecf04ccba230a96f742d",+    "segmentCount": 16,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          7.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          14.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          40.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          7.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          17.0+        ],+        "layer": 16,+        "net": "NET_3",+        "start": [+          14.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          40.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          7.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          14.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          40.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          7.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          14.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          40.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          32.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          7.0,+          32.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "verified": true,+    "viaCount": 2,+    "vias": [+      {+        "at": [+          14.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      },+      {+        "at": [+          40.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      }+    ]+  }+}
demo/routing/evidence/final-take/033-fusion_route_net.jsonadded+597
@@ -0,0 +1,597 @@+{+  "elapsedSeconds": 0.781098175997613,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "4c2c470e4fd5d7367dc1b5dfd15160a62e5d0b1825dfecf04ccba230a96f742d",+    "net": "NET_6",+    "width": 0.25,+    "layer": 1,+    "points": [+      [+        14,+        32+      ],+      [+        40,+        32+      ]+    ]+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 2,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "commands": [+      "LAYER 1; LINE 'NET_6' 0.250000mm (14.000000mm 32.000000mm) (40.000000mm 32.000000mm);"+    ],+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "checked": false,+      "note": "Use fusion_routing_drc for a fresh Autodesk DRC"+    },+    "durationMs": 775,+    "error": "",+    "errorCode": null,+    "mutated": true,+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 3,+        "vias": 2+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 2,+        "airwires": [+          {+            "end": [+              40.0,+              32.0+            ],+            "start": [+              27.0,+              38.0+            ]+          },+          {+            "end": [+              47.0,+              32.0+            ],+            "start": [+              40.0,+              32.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 2,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            40,+            32+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_6",+          "start": [+            14,+            32+          ],+          "width": 0.25+        }+      ],+      "net": "NET_6",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "remainingNets": [+      "NET_6"+    ],+    "revision": "8527fda71eb7e2237beb0547654bb0488174535f86cfce220446cca378e77c96",+    "segmentCount": 17,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          7.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          14.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          40.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          7.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          17.0+        ],+        "layer": 16,+        "net": "NET_3",+        "start": [+          14.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          40.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          7.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          14.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          40.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          7.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          14.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          40.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          32.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          7.0,+          32.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          32.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          14.0,+          32.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "verified": true,+    "viaCount": 2,+    "vias": [+      {+        "at": [+          14.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      },+      {+        "at": [+          40.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      }+    ]+  }+}
demo/routing/evidence/final-take/034-fusion_route_net.jsonadded+601
@@ -0,0 +1,601 @@+{+  "elapsedSeconds": 0.7074997679883381,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "8527fda71eb7e2237beb0547654bb0488174535f86cfce220446cca378e77c96",+    "net": "NET_6",+    "width": 0.25,+    "layer": 1,+    "points": [+      [+        40,+        32+      ],+      [+        47.0,+        32.0+      ]+    ]+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 1,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "commands": [+      "LAYER 1; LINE 'NET_6' 0.250000mm (40.000000mm 32.000000mm) (47.000000mm 32.000000mm);"+    ],+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "checked": false,+      "note": "Use fusion_routing_drc for a fresh Autodesk DRC"+    },+    "durationMs": 702,+    "error": "",+    "errorCode": null,+    "mutated": true,+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 3,+        "vias": 2+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              27.0,+              38.0+            ],+            "start": [+              7.0,+              32.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 3,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            47.0,+            32.0+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_6",+          "start": [+            40,+            32+          ],+          "width": 0.25+        }+      ],+      "net": "NET_6",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "remainingNets": [+      "NET_6"+    ],+    "revision": "7025c27042baa4d5f7e7914113cec68df5ecdec13d67078511f69dd0043154b4",+    "segmentCount": 18,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          7.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          14.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          40.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          7.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          17.0+        ],+        "layer": 16,+        "net": "NET_3",+        "start": [+          14.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          40.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          7.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          14.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          40.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          7.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          14.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          40.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          32.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          7.0,+          32.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          32.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          14.0,+          32.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          32.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          40.0,+          32.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "verified": true,+    "viaCount": 2,+    "vias": [+      {+        "at": [+          14.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      },+      {+        "at": [+          40.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      }+    ]+  }+}
demo/routing/evidence/final-take/035-fusion_route_net.jsonadded+629
@@ -0,0 +1,629 @@+{+  "elapsedSeconds": 0.690331438992871,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "7025c27042baa4d5f7e7914113cec68df5ecdec13d67078511f69dd0043154b4",+    "net": "NET_6",+    "width": 0.25,+    "layer": 1,+    "points": [+      [+        27,+        32+      ],+      [+        27,+        35+      ]+    ]+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 1,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "commands": [+      "LAYER 1; LINE 'NET_6' 0.250000mm (27.000000mm 32.000000mm) (27.000000mm 35.000000mm);"+    ],+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "checked": false,+      "note": "Use fusion_routing_drc for a fresh Autodesk DRC"+    },+    "durationMs": 686,+    "error": "",+    "errorCode": null,+    "mutated": true,+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 3,+        "vias": 2+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              27.0,+              38.0+            ],+            "start": [+              27.0,+              35.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 5,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            27,+            35+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_6",+          "start": [+            27,+            32+          ],+          "width": 0.25+        }+      ],+      "net": "NET_6",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "remainingNets": [+      "NET_6"+    ],+    "revision": "f6476879b6e247e529363c62da80d0552e262c09902519bef2da1901df055f87",+    "segmentCount": 20,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          7.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          14.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          40.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          7.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          17.0+        ],+        "layer": 16,+        "net": "NET_3",+        "start": [+          14.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          40.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          7.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          14.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          40.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          7.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          14.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          40.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          32.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          7.0,+          32.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          27.0,+          32.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          14.0,+          32.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          32.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          27.0,+          32.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          32.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          40.0,+          32.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          27.0,+          35.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          27.0,+          32.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "verified": true,+    "viaCount": 2,+    "vias": [+      {+        "at": [+          14.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      },+      {+        "at": [+          40.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      }+    ]+  }+}
demo/routing/evidence/final-take/036-fusion_route_net.jsonadded+630
@@ -0,0 +1,630 @@+{+  "elapsedSeconds": 0.686237047004397,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "f6476879b6e247e529363c62da80d0552e262c09902519bef2da1901df055f87",+    "net": "NET_6",+    "width": 0.25,+    "layer": 1,+    "points": [+      [+        27,+        35+      ],+      [+        27.0,+        38.0+      ]+    ]+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 0,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "commands": [+      "LAYER 1; LINE 'NET_6' 0.250000mm (27.000000mm 35.000000mm) (27.000000mm 38.000000mm);"+    ],+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "checked": false,+      "note": "Use fusion_routing_drc for a fresh Autodesk DRC"+    },+    "durationMs": 682,+    "error": "",+    "errorCode": null,+    "mutated": true,+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 3,+        "vias": 2+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 6,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            27.0,+            38.0+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_6",+          "start": [+            27,+            35+          ],+          "width": 0.25+        }+      ],+      "net": "NET_6",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "remainingNets": [],+    "revision": "06da12392114e027b37d6de7de7a604883b549df4cae50a441081413a686f2a7",+    "segmentCount": 21,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          7.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          14.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          40.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          7.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          17.0+        ],+        "layer": 16,+        "net": "NET_3",+        "start": [+          14.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          40.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          7.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          14.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          40.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          7.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          14.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          40.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          32.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          7.0,+          32.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          27.0,+          32.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          14.0,+          32.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          32.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          27.0,+          32.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          32.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          40.0,+          32.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          27.0,+          35.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          27.0,+          32.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          27.0,+          38.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          27.0,+          35.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "verified": true,+    "viaCount": 2,+    "vias": [+      {+        "at": [+          14.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      },+      {+        "at": [+          40.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      }+    ]+  }+}
demo/routing/evidence/final-take/037-fusion_routing_drc.jsonadded+595
@@ -0,0 +1,595 @@+{+  "elapsedSeconds": 0.5714456249988871,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "06da12392114e027b37d6de7de7a604883b549df4cae50a441081413a686f2a7"+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 0,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "airwireCount": 0,+      "checked": true,+      "clean": true,+      "errorCount": 0,+      "errors": [],+      "source": "Autodesk DRC + UL_BOARD.errors",+      "warningCount": 0+    },+    "durationMs": 565,+    "error": "",+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 3,+        "vias": 2+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 6,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "remainingNets": [],+    "revision": "06da12392114e027b37d6de7de7a604883b549df4cae50a441081413a686f2a7",+    "segmentCount": 21,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          7.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          14.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          40.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          7.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          17.0+        ],+        "layer": 16,+        "net": "NET_3",+        "start": [+          14.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          40.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          7.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          14.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          40.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          7.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          14.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          40.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          32.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          7.0,+          32.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          27.0,+          32.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          14.0,+          32.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          32.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          27.0,+          32.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          32.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          40.0,+          32.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          27.0,+          35.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          27.0,+          32.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          27.0,+          38.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          27.0,+          35.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "viaCount": 2,+    "vias": [+      {+        "at": [+          14.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      },+      {+        "at": [+          40.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      }+    ]+  }+}
demo/routing/evidence/final-take/038-desktop_record_window_stop.jsonadded+35
@@ -0,0 +1,35 @@+{+  "elapsedSeconds": 0.4764978299936047,+  "args": {+    "recordingId": "rec-a01a1df4be85416daee52dd2ebc2a53a",+    "reason": "Finalize the Fusion routing demo take"+  },+  "result": {+    "_hint": "The MP4 is finalized (moov written). pull_file {path} brings it to the caller; the janitor prunes the recordings dir by age/size, so pull it promptly.",+    "audio": false,+    "audioFrames": 0,+    "autoStopped": false,+    "bytes": 38298670,+    "durationMs": 471,+    "elapsedMs": 28984,+    "error": "",+    "fileExists": true,+    "frames": 806,+    "height": 1540,+    "kind": "window",+    "path": "C:/Users/john/AppData/Local/Temp/adom-bridge-recordings/window-8916576-20260905-205212.mp4",+    "recordingId": "rec-a01a1df4be85416daee52dd2ebc2a53a",+    "status": "ok",+    "success": true,+    "timeoutSeconds": 30,+    "width": 2564,+    "data": {+      "bytes": 38298670,+      "elapsedMs": 28984,+      "frames": 806,+      "path": "C:\\Users\\john\\AppData\\Local\\Temp\\adom-bridge-recordings\\window-8916576-20260905-205212.mp4",+      "recordingId": "rec-a01a1df4be85416daee52dd2ebc2a53a"+    },+    "message": "Stopped recording rec-a01a1df4be85416daee52dd2ebc2a53a: 806 frames, 28984 ms, 38298670 bytes -> C:\\Users\\john\\AppData\\Local\\Temp\\adom-bridge-recordings\\window-8916576-20260905-205212.mp4"+  }+}
demo/routing/evidence/final-take/result.jsonadded+592
@@ -0,0 +1,592 @@+{+  "success": true,+  "elapsedSeconds": 27.773209854000015,+  "mode": "per-trace",+  "final": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 0,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "airwireCount": 0,+      "checked": true,+      "clean": true,+      "errorCount": 0,+      "errors": [],+      "source": "Autodesk DRC + UL_BOARD.errors",+      "warningCount": 0+    },+    "durationMs": 565,+    "error": "",+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 3,+        "vias": 2+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 6,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "remainingNets": [],+    "revision": "06da12392114e027b37d6de7de7a604883b549df4cae50a441081413a686f2a7",+    "segmentCount": 21,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          7.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          14.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          40.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          7.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          17.0+        ],+        "layer": 16,+        "net": "NET_3",+        "start": [+          14.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          40.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          7.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          14.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          40.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          7.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          14.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          40.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          32.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          7.0,+          32.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          27.0,+          32.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          14.0,+          32.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          32.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          27.0,+          32.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          32.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          40.0,+          32.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          27.0,+          35.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          27.0,+          32.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          27.0,+          38.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          27.0,+          35.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "viaCount": 2,+    "vias": [+      {+        "at": [+          14.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      },+      {+        "at": [+          40.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      }+    ]+  }+}
demo/routing/evidence/final-video-probe.jsonadded+18
@@ -0,0 +1,18 @@+{+    "programs": [++    ],+    "streams": [+        {+            "width": 1920,+            "height": 1154,+            "r_frame_rate": "30/1",+            "duration": "26.866667",+            "nb_frames": "806"+        }+    ],+    "format": {+        "duration": "26.866667",+        "size": "526268"+    }+}
demo/routing/evidence/final-video-recording.jsonadded+28
@@ -0,0 +1,28 @@+{+  "_hint": "The MP4 is finalized (moov written). pull_file {path} brings it to the caller; the janitor prunes the recordings dir by age/size, so pull it promptly.",+  "audio": false,+  "audioFrames": 0,+  "autoStopped": false,+  "bytes": 38298670,+  "durationMs": 471,+  "elapsedMs": 28984,+  "error": "",+  "fileExists": true,+  "frames": 806,+  "height": 1540,+  "kind": "window",+  "path": "C:/Users/john/AppData/Local/Temp/adom-bridge-recordings/window-8916576-20260905-205212.mp4",+  "recordingId": "rec-a01a1df4be85416daee52dd2ebc2a53a",+  "status": "ok",+  "success": true,+  "timeoutSeconds": 30,+  "width": 2564,+  "data": {+    "bytes": 38298670,+    "elapsedMs": 28984,+    "frames": 806,+    "path": "C:\\Users\\john\\AppData\\Local\\Temp\\adom-bridge-recordings\\window-8916576-20260905-205212.mp4",+    "recordingId": "rec-a01a1df4be85416daee52dd2ebc2a53a"+  },+  "message": "Stopped recording rec-a01a1df4be85416daee52dd2ebc2a53a: 806 frames, 28984 ms, 38298670 bytes -> C:\\Users\\john\\AppData\\Local\\Temp\\adom-bridge-recordings\\window-8916576-20260905-205212.mp4"+}\ No newline at end of file
demo/routing/evidence/install.jsonadded+11
@@ -0,0 +1,11 @@+{+  "durationMs": 975,+  "exitCode": 0,+  "ok": true,+  "status": "ok",+  "stderr": "",+  "stdout": "{\r\n  \"sha256\": \"A9ADB75528E7006D868CFACA4B63EF2F8509A52890895DDC697829CABBA7BB99\",\r\n  \"backup\": \"C:/Users/john/AppData/Local/Adom Bridge/bridges-cache/fusion360/routing-backup-20260905\",\r\n  \"version\": \"1.10.0-dev.routing.1\"\r\n}\r\n",+  "success": true,+  "timedOut": false,+  "timeoutSeconds": 75+}
demo/routing/evidence/live-rejections.jsonadded+99
@@ -0,0 +1,99 @@+{+  "wrong-net": {+    "_hint": "Read fusion_routing_state before retrying. No automatic replay or blind Undo is performed.",+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "completedCommands": [],+    "durationMs": 326,+    "error": "Pad J1.1 does not belong to NET_4",+    "errorCode": "net_mismatch",+    "mutationAttempted": false,+    "shell": "rust",+    "status": "error",+    "statusVerb": "fusion_get_app_state",+    "success": false,+    "timeoutSeconds": 60+  },+  "stale": {+    "_hint": "Read fusion_routing_state before retrying. No automatic replay or blind Undo is performed.",+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "completedCommands": [],+    "durationMs": 218,+    "error": "expectedRevision must match the current live board",+    "errorCode": "stale_board",+    "mutationAttempted": false,+    "shell": "rust",+    "status": "error",+    "statusVerb": "fusion_get_app_state",+    "success": false,+    "timeoutSeconds": 60+  },+  "wrong-board": {+    "_hint": "Read fusion_routing_state before retrying. No automatic replay or blind Undo is performed.",+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "completedCommands": [],+    "durationMs": 171,+    "error": "boardId does not identify the active Fusion document",+    "errorCode": "board_mismatch",+    "mutationAttempted": false,+    "shell": "rust",+    "status": "error",+    "statusVerb": "fusion_get_app_state",+    "success": false,+    "timeoutSeconds": 60+  },+  "clearance": {+    "_hint": "Read fusion_routing_state before retrying. No automatic replay or blind Undo is performed.",+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "completedCommands": [],+    "durationMs": 219,+    "error": "Candidate copper approaches another net or hole closer than 0.200 mm",+    "errorCode": "clearance_violation",+    "mutationAttempted": false,+    "shell": "rust",+    "status": "error",+    "statusVerb": "fusion_get_app_state",+    "success": false,+    "timeoutSeconds": 60+  },+  "dryRun": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "documentName": "fusion-routing",+    "durationMs": 239,+    "error": "",+    "mutated": false,+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            14,+            22+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_4",+          "start": [+            7,+            22+          ],+          "width": 0.25+        }+      ],+      "net": "NET_4",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "revision": "942ff732fb601016f042960f4c45187743f68054cf5945efdd97c12b2dd28668",+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60+  },+  "unchangedRevision": "942ff732fb601016f042960f4c45187743f68054cf5945efdd97c12b2dd28668"+}\ No newline at end of file
demo/routing/evidence/per-net/001-fusion_routing_state.jsonadded+355
@@ -0,0 +1,355 @@+{+  "elapsedSeconds": 0.19825193099677563,+  "args": {+    "expectDocument": "fusion-routing"+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 7,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "checked": false,+      "note": "Use fusion_routing_drc for a fresh Autodesk DRC"+    },+    "durationMs": 194,+    "error": "",+    "nets": [+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              7.0+            ],+            "start": [+              7.0,+              7.0+            ]+          }+        ],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              12.0+            ],+            "start": [+              7.0,+              12.0+            ]+          }+        ],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              17.0+            ],+            "start": [+              7.0,+              17.0+            ]+          }+        ],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              22.0+            ],+            "start": [+              7.0,+              22.0+            ]+          }+        ],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              27.0+            ],+            "start": [+              7.0,+              27.0+            ]+          }+        ],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 2,+        "airwires": [+          {+            "end": [+              47.0,+              32.0+            ],+            "start": [+              27.0,+              38.0+            ]+          },+          {+            "end": [+              27.0,+              38.0+            ],+            "start": [+              7.0,+              32.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 0,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "remainingNets": [+      "NET_1",+      "NET_2",+      "NET_3",+      "NET_4",+      "NET_5",+      "NET_6"+    ],+    "revision": "ed9fd520235f10745a6a7115ebee65771516dc1160c5f2ae1f5c7428c41e3c4d",+    "segmentCount": 0,+    "segments": [],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "viaCount": 0,+    "vias": []+  }+}
demo/routing/evidence/per-net/002-fusion_route_net.jsonadded+94
@@ -0,0 +1,94 @@+{+  "elapsedSeconds": 0.21663730399450287,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "ed9fd520235f10745a6a7115ebee65771516dc1160c5f2ae1f5c7428c41e3c4d",+    "net": "NET_1",+    "layer": 1,+    "width": 0.25,+    "paths": [+      [+        {+          "pad": "J1.1"+        },+        [+          14,+          7+        ],+        [+          40,+          7+        ],+        {+          "pad": "J2.1"+        }+      ]+    ],+    "dryRun": true+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "documentName": "fusion-routing",+    "durationMs": 211,+    "error": "",+    "mutated": false,+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            14,+            7+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_1",+          "start": [+            7.0,+            7.0+          ],+          "width": 0.25+        },+        {+          "end": [+            40,+            7+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_1",+          "start": [+            14,+            7+          ],+          "width": 0.25+        },+        {+          "end": [+            47.0,+            7.0+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_1",+          "start": [+            40,+            7+          ],+          "width": 0.25+        }+      ],+      "net": "NET_1",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "revision": "ed9fd520235f10745a6a7115ebee65771516dc1160c5f2ae1f5c7428c41e3c4d",+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60+  }+}
demo/routing/evidence/per-net/003-fusion_route_net.jsonadded+94
@@ -0,0 +1,94 @@+{+  "elapsedSeconds": 0.20296116400277242,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "ed9fd520235f10745a6a7115ebee65771516dc1160c5f2ae1f5c7428c41e3c4d",+    "net": "NET_2",+    "layer": 1,+    "width": 0.25,+    "paths": [+      [+        {+          "pad": "J1.2"+        },+        [+          14,+          12+        ],+        [+          40,+          12+        ],+        {+          "pad": "J2.2"+        }+      ]+    ],+    "dryRun": true+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "documentName": "fusion-routing",+    "durationMs": 197,+    "error": "",+    "mutated": false,+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            14,+            12+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_2",+          "start": [+            7.0,+            12.0+          ],+          "width": 0.25+        },+        {+          "end": [+            40,+            12+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_2",+          "start": [+            14,+            12+          ],+          "width": 0.25+        },+        {+          "end": [+            47.0,+            12.0+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_2",+          "start": [+            40,+            12+          ],+          "width": 0.25+        }+      ],+      "net": "NET_2",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "revision": "ed9fd520235f10745a6a7115ebee65771516dc1160c5f2ae1f5c7428c41e3c4d",+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60+  }+}
demo/routing/evidence/per-net/004-fusion_route_net.jsonadded+118
@@ -0,0 +1,118 @@+{+  "elapsedSeconds": 0.21887768399028573,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "ed9fd520235f10745a6a7115ebee65771516dc1160c5f2ae1f5c7428c41e3c4d",+    "net": "NET_3",+    "layer": 1,+    "width": 0.25,+    "paths": [+      [+        {+          "pad": "J1.3"+        },+        {+          "x": 14,+          "y": 17,+          "layer": 16+        },+        {+          "x": 40,+          "y": 17,+          "layer": 1+        },+        {+          "pad": "J2.3"+        }+      ]+    ],+    "dryRun": true+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "documentName": "fusion-routing",+    "durationMs": 214,+    "error": "",+    "mutated": false,+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            14,+            17+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_3",+          "start": [+            7.0,+            17.0+          ],+          "width": 0.25+        },+        {+          "at": [+            14,+            17+          ],+          "diameter": 0.6,+          "drill": 0.3,+          "extent": "1-16",+          "kind": "via",+          "net": "NET_3"+        },+        {+          "end": [+            40,+            17+          ],+          "kind": "segment",+          "layer": 16,+          "net": "NET_3",+          "start": [+            14,+            17+          ],+          "width": 0.25+        },+        {+          "at": [+            40,+            17+          ],+          "diameter": 0.6,+          "drill": 0.3,+          "extent": "1-16",+          "kind": "via",+          "net": "NET_3"+        },+        {+          "end": [+            47.0,+            17.0+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_3",+          "start": [+            40,+            17+          ],+          "width": 0.25+        }+      ],+      "net": "NET_3",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "revision": "ed9fd520235f10745a6a7115ebee65771516dc1160c5f2ae1f5c7428c41e3c4d",+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60+  }+}
demo/routing/evidence/per-net/005-fusion_route_net.jsonadded+94
@@ -0,0 +1,94 @@+{+  "elapsedSeconds": 0.21679039699665736,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "ed9fd520235f10745a6a7115ebee65771516dc1160c5f2ae1f5c7428c41e3c4d",+    "net": "NET_4",+    "layer": 1,+    "width": 0.25,+    "paths": [+      [+        {+          "pad": "J1.4"+        },+        [+          14,+          22+        ],+        [+          40,+          22+        ],+        {+          "pad": "J2.4"+        }+      ]+    ],+    "dryRun": true+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "documentName": "fusion-routing",+    "durationMs": 212,+    "error": "",+    "mutated": false,+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            14,+            22+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_4",+          "start": [+            7.0,+            22.0+          ],+          "width": 0.25+        },+        {+          "end": [+            40,+            22+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_4",+          "start": [+            14,+            22+          ],+          "width": 0.25+        },+        {+          "end": [+            47.0,+            22.0+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_4",+          "start": [+            40,+            22+          ],+          "width": 0.25+        }+      ],+      "net": "NET_4",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "revision": "ed9fd520235f10745a6a7115ebee65771516dc1160c5f2ae1f5c7428c41e3c4d",+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60+  }+}
demo/routing/evidence/per-net/006-fusion_route_net.jsonadded+94
@@ -0,0 +1,94 @@+{+  "elapsedSeconds": 0.21003619699331466,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "ed9fd520235f10745a6a7115ebee65771516dc1160c5f2ae1f5c7428c41e3c4d",+    "net": "NET_5",+    "layer": 1,+    "width": 0.25,+    "paths": [+      [+        {+          "pad": "J1.5"+        },+        [+          14,+          27+        ],+        [+          40,+          27+        ],+        {+          "pad": "J2.5"+        }+      ]+    ],+    "dryRun": true+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "documentName": "fusion-routing",+    "durationMs": 205,+    "error": "",+    "mutated": false,+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            14,+            27+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_5",+          "start": [+            7.0,+            27.0+          ],+          "width": 0.25+        },+        {+          "end": [+            40,+            27+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_5",+          "start": [+            14,+            27+          ],+          "width": 0.25+        },+        {+          "end": [+            47.0,+            27.0+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_5",+          "start": [+            40,+            27+          ],+          "width": 0.25+        }+      ],+      "net": "NET_5",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "revision": "ed9fd520235f10745a6a7115ebee65771516dc1160c5f2ae1f5c7428c41e3c4d",+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60+  }+}
demo/routing/evidence/per-net/007-fusion_route_net.jsonadded+135
@@ -0,0 +1,135 @@+{+  "elapsedSeconds": 0.22090016400034074,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "ed9fd520235f10745a6a7115ebee65771516dc1160c5f2ae1f5c7428c41e3c4d",+    "net": "NET_6",+    "layer": 1,+    "width": 0.25,+    "paths": [+      [+        {+          "pad": "J1.6"+        },+        [+          14,+          32+        ],+        [+          40,+          32+        ],+        {+          "pad": "J2.6"+        }+      ],+      [+        [+          27,+          32+        ],+        [+          27,+          35+        ],+        {+          "pad": "J3.1"+        }+      ]+    ],+    "dryRun": true+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "documentName": "fusion-routing",+    "durationMs": 216,+    "error": "",+    "mutated": false,+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            14,+            32+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_6",+          "start": [+            7.0,+            32.0+          ],+          "width": 0.25+        },+        {+          "end": [+            40,+            32+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_6",+          "start": [+            14,+            32+          ],+          "width": 0.25+        },+        {+          "end": [+            47.0,+            32.0+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_6",+          "start": [+            40,+            32+          ],+          "width": 0.25+        },+        {+          "end": [+            27,+            35+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_6",+          "start": [+            27,+            32+          ],+          "width": 0.25+        },+        {+          "end": [+            27.0,+            38.0+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_6",+          "start": [+            27,+            35+          ],+          "width": 0.25+        }+      ],+      "net": "NET_6",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "revision": "ed9fd520235f10745a6a7115ebee65771516dc1160c5f2ae1f5c7428c41e3c4d",+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60+  }+}
demo/routing/evidence/per-net/008-fusion_route_net.jsonadded+466
@@ -0,0 +1,466 @@+{+  "elapsedSeconds": 1.2124903299991274,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "ed9fd520235f10745a6a7115ebee65771516dc1160c5f2ae1f5c7428c41e3c4d",+    "net": "NET_1",+    "layer": 1,+    "width": 0.25,+    "paths": [+      [+        {+          "pad": "J1.1"+        },+        [+          14,+          7+        ],+        [+          40,+          7+        ],+        {+          "pad": "J2.1"+        }+      ]+    ]+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 6,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "commands": [+      "LAYER 1; LINE 'NET_1' 0.250000mm (7.000000mm 7.000000mm) (14.000000mm 7.000000mm);",+      "LAYER 1; LINE 'NET_1' 0.250000mm (14.000000mm 7.000000mm) (40.000000mm 7.000000mm);",+      "LAYER 1; LINE 'NET_1' 0.250000mm (40.000000mm 7.000000mm) (47.000000mm 7.000000mm);"+    ],+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "checked": false,+      "note": "Use fusion_routing_drc for a fresh Autodesk DRC"+    },+    "durationMs": 1207,+    "error": "",+    "errorCode": null,+    "mutated": true,+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              12.0+            ],+            "start": [+              7.0,+              12.0+            ]+          }+        ],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              17.0+            ],+            "start": [+              7.0,+              17.0+            ]+          }+        ],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              22.0+            ],+            "start": [+              7.0,+              22.0+            ]+          }+        ],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              27.0+            ],+            "start": [+              7.0,+              27.0+            ]+          }+        ],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 2,+        "airwires": [+          {+            "end": [+              47.0,+              32.0+            ],+            "start": [+              27.0,+              38.0+            ]+          },+          {+            "end": [+              27.0,+              38.0+            ],+            "start": [+              7.0,+              32.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 0,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            14,+            7+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_1",+          "start": [+            7.0,+            7.0+          ],+          "width": 0.25+        },+        {+          "end": [+            40,+            7+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_1",+          "start": [+            14,+            7+          ],+          "width": 0.25+        },+        {+          "end": [+            47.0,+            7.0+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_1",+          "start": [+            40,+            7+          ],+          "width": 0.25+        }+      ],+      "net": "NET_1",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "remainingNets": [+      "NET_2",+      "NET_3",+      "NET_4",+      "NET_5",+      "NET_6"+    ],+    "revision": "730bf931d6b202ec144d2cefcadc158597c9107dbabdfcd8f1417043938f76f9",+    "segmentCount": 3,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "verified": true,+    "viaCount": 0,+    "vias": []+  }+}
demo/routing/evidence/per-net/009-fusion_routing_drc.jsonadded+430
@@ -0,0 +1,430 @@+{+  "elapsedSeconds": 0.544211529995664,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "730bf931d6b202ec144d2cefcadc158597c9107dbabdfcd8f1417043938f76f9"+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 6,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "airwireCount": 6,+      "checked": true,+      "clean": false,+      "errorCount": 0,+      "errors": [+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        },+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        },+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        },+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        },+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        },+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        }+      ],+      "source": "Autodesk DRC + UL_BOARD.errors",+      "warningCount": 0+    },+    "durationMs": 538,+    "error": "",+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              12.0+            ],+            "start": [+              7.0,+              12.0+            ]+          }+        ],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              17.0+            ],+            "start": [+              7.0,+              17.0+            ]+          }+        ],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              22.0+            ],+            "start": [+              7.0,+              22.0+            ]+          }+        ],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              27.0+            ],+            "start": [+              7.0,+              27.0+            ]+          }+        ],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 2,+        "airwires": [+          {+            "end": [+              47.0,+              32.0+            ],+            "start": [+              27.0,+              38.0+            ]+          },+          {+            "end": [+              27.0,+              38.0+            ],+            "start": [+              7.0,+              32.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 0,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "remainingNets": [+      "NET_2",+      "NET_3",+      "NET_4",+      "NET_5",+      "NET_6"+    ],+    "revision": "730bf931d6b202ec144d2cefcadc158597c9107dbabdfcd8f1417043938f76f9",+    "segmentCount": 3,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "viaCount": 0,+    "vias": []+  }+}
demo/routing/evidence/per-net/010-fusion_route_net.jsonadded+496
@@ -0,0 +1,496 @@+{+  "elapsedSeconds": 1.1946676849911455,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "730bf931d6b202ec144d2cefcadc158597c9107dbabdfcd8f1417043938f76f9",+    "net": "NET_2",+    "layer": 1,+    "width": 0.25,+    "paths": [+      [+        {+          "pad": "J1.2"+        },+        [+          14,+          12+        ],+        [+          40,+          12+        ],+        {+          "pad": "J2.2"+        }+      ]+    ]+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 5,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "commands": [+      "LAYER 1; LINE 'NET_2' 0.250000mm (7.000000mm 12.000000mm) (14.000000mm 12.000000mm);",+      "LAYER 1; LINE 'NET_2' 0.250000mm (14.000000mm 12.000000mm) (40.000000mm 12.000000mm);",+      "LAYER 1; LINE 'NET_2' 0.250000mm (40.000000mm 12.000000mm) (47.000000mm 12.000000mm);"+    ],+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "checked": false,+      "note": "Use fusion_routing_drc for a fresh Autodesk DRC"+    },+    "durationMs": 1189,+    "error": "",+    "errorCode": null,+    "mutated": true,+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              17.0+            ],+            "start": [+              7.0,+              17.0+            ]+          }+        ],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              22.0+            ],+            "start": [+              7.0,+              22.0+            ]+          }+        ],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              27.0+            ],+            "start": [+              7.0,+              27.0+            ]+          }+        ],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 2,+        "airwires": [+          {+            "end": [+              47.0,+              32.0+            ],+            "start": [+              27.0,+              38.0+            ]+          },+          {+            "end": [+              27.0,+              38.0+            ],+            "start": [+              7.0,+              32.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 0,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            14,+            12+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_2",+          "start": [+            7.0,+            12.0+          ],+          "width": 0.25+        },+        {+          "end": [+            40,+            12+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_2",+          "start": [+            14,+            12+          ],+          "width": 0.25+        },+        {+          "end": [+            47.0,+            12.0+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_2",+          "start": [+            40,+            12+          ],+          "width": 0.25+        }+      ],+      "net": "NET_2",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "remainingNets": [+      "NET_3",+      "NET_4",+      "NET_5",+      "NET_6"+    ],+    "revision": "9de8edfe6743cf0ca0155cbfdfe92fefddc973b53e396cac34c626aad7c18263",+    "segmentCount": 6,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          7.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          14.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          40.0,+          12.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "verified": true,+    "viaCount": 0,+    "vias": []+  }+}
demo/routing/evidence/per-net/011-fusion_routing_drc.jsonadded+454
@@ -0,0 +1,454 @@+{+  "elapsedSeconds": 0.4894283820030978,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "9de8edfe6743cf0ca0155cbfdfe92fefddc973b53e396cac34c626aad7c18263"+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 5,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "airwireCount": 5,+      "checked": true,+      "clean": false,+      "errorCount": 0,+      "errors": [+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        },+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        },+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        },+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        },+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        }+      ],+      "source": "Autodesk DRC + UL_BOARD.errors",+      "warningCount": 0+    },+    "durationMs": 483,+    "error": "",+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              17.0+            ],+            "start": [+              7.0,+              17.0+            ]+          }+        ],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              22.0+            ],+            "start": [+              7.0,+              22.0+            ]+          }+        ],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              27.0+            ],+            "start": [+              7.0,+              27.0+            ]+          }+        ],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 2,+        "airwires": [+          {+            "end": [+              47.0,+              32.0+            ],+            "start": [+              27.0,+              38.0+            ]+          },+          {+            "end": [+              27.0,+              38.0+            ],+            "start": [+              7.0,+              32.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 0,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "remainingNets": [+      "NET_3",+      "NET_4",+      "NET_5",+      "NET_6"+    ],+    "revision": "9de8edfe6743cf0ca0155cbfdfe92fefddc973b53e396cac34c626aad7c18263",+    "segmentCount": 6,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          7.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          14.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          40.0,+          12.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "viaCount": 0,+    "vias": []+  }+}
demo/routing/evidence/per-net/012-fusion_route_net.jsonadded+573
@@ -0,0 +1,573 @@+{+  "elapsedSeconds": 2.0540095590113197,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "9de8edfe6743cf0ca0155cbfdfe92fefddc973b53e396cac34c626aad7c18263",+    "net": "NET_3",+    "layer": 1,+    "width": 0.25,+    "paths": [+      [+        {+          "pad": "J1.3"+        },+        {+          "x": 14,+          "y": 17,+          "layer": 16+        },+        {+          "x": 40,+          "y": 17,+          "layer": 1+        },+        {+          "pad": "J2.3"+        }+      ]+    ]+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 4,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "commands": [+      "LAYER 1; LINE 'NET_3' 0.250000mm (7.000000mm 17.000000mm) (14.000000mm 17.000000mm);",+      "VIA 'NET_3' 0.600000mm ROUND 1-16 (14.000000mm 17.000000mm); CHANGE DRILL 0.300000mm (14.000000mm 17.000000mm);",+      "LAYER 16; LINE 'NET_3' 0.250000mm (14.000000mm 17.000000mm) (40.000000mm 17.000000mm);",+      "VIA 'NET_3' 0.600000mm ROUND 1-16 (40.000000mm 17.000000mm); CHANGE DRILL 0.300000mm (40.000000mm 17.000000mm);",+      "LAYER 1; LINE 'NET_3' 0.250000mm (40.000000mm 17.000000mm) (47.000000mm 17.000000mm);"+    ],+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "checked": false,+      "note": "Use fusion_routing_drc for a fresh Autodesk DRC"+    },+    "durationMs": 2048,+    "error": "",+    "errorCode": null,+    "mutated": true,+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 3,+        "vias": 2+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              22.0+            ],+            "start": [+              7.0,+              22.0+            ]+          }+        ],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              27.0+            ],+            "start": [+              7.0,+              27.0+            ]+          }+        ],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 2,+        "airwires": [+          {+            "end": [+              47.0,+              32.0+            ],+            "start": [+              27.0,+              38.0+            ]+          },+          {+            "end": [+              27.0,+              38.0+            ],+            "start": [+              7.0,+              32.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 0,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            14,+            17+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_3",+          "start": [+            7.0,+            17.0+          ],+          "width": 0.25+        },+        {+          "at": [+            14,+            17+          ],+          "diameter": 0.6,+          "drill": 0.3,+          "extent": "1-16",+          "kind": "via",+          "net": "NET_3"+        },+        {+          "end": [+            40,+            17+          ],+          "kind": "segment",+          "layer": 16,+          "net": "NET_3",+          "start": [+            14,+            17+          ],+          "width": 0.25+        },+        {+          "at": [+            40,+            17+          ],+          "diameter": 0.6,+          "drill": 0.3,+          "extent": "1-16",+          "kind": "via",+          "net": "NET_3"+        },+        {+          "end": [+            47.0,+            17.0+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_3",+          "start": [+            40,+            17+          ],+          "width": 0.25+        }+      ],+      "net": "NET_3",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "remainingNets": [+      "NET_4",+      "NET_5",+      "NET_6"+    ],+    "revision": "75a02b7d8ace0d30ecea581eaa90d5e751d2bc88c0fcffec622af4992d2483a0",+    "segmentCount": 9,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          7.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          14.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          40.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          7.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          17.0+        ],+        "layer": 16,+        "net": "NET_3",+        "start": [+          14.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          40.0,+          17.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "verified": true,+    "viaCount": 2,+    "vias": [+      {+        "at": [+          14.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      },+      {+        "at": [+          40.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      }+    ]+  }+}
demo/routing/evidence/per-net/013-fusion_routing_drc.jsonadded+499
@@ -0,0 +1,499 @@+{+  "elapsedSeconds": 0.6680385090003256,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "75a02b7d8ace0d30ecea581eaa90d5e751d2bc88c0fcffec622af4992d2483a0"+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 4,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "airwireCount": 4,+      "checked": true,+      "clean": false,+      "errorCount": 0,+      "errors": [+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        },+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        },+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        },+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        }+      ],+      "source": "Autodesk DRC + UL_BOARD.errors",+      "warningCount": 0+    },+    "durationMs": 662,+    "error": "",+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 3,+        "vias": 2+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              22.0+            ],+            "start": [+              7.0,+              22.0+            ]+          }+        ],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              27.0+            ],+            "start": [+              7.0,+              27.0+            ]+          }+        ],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 2,+        "airwires": [+          {+            "end": [+              47.0,+              32.0+            ],+            "start": [+              27.0,+              38.0+            ]+          },+          {+            "end": [+              27.0,+              38.0+            ],+            "start": [+              7.0,+              32.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 0,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "remainingNets": [+      "NET_4",+      "NET_5",+      "NET_6"+    ],+    "revision": "75a02b7d8ace0d30ecea581eaa90d5e751d2bc88c0fcffec622af4992d2483a0",+    "segmentCount": 9,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          7.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          14.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          40.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          7.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          17.0+        ],+        "layer": 16,+        "net": "NET_3",+        "start": [+          14.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          40.0,+          17.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "viaCount": 2,+    "vias": [+      {+        "at": [+          14.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      },+      {+        "at": [+          40.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      }+    ]+  }+}
demo/routing/evidence/per-net/014-fusion_route_net.jsonadded+577
@@ -0,0 +1,577 @@+{+  "elapsedSeconds": 1.1954302989906864,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "75a02b7d8ace0d30ecea581eaa90d5e751d2bc88c0fcffec622af4992d2483a0",+    "net": "NET_4",+    "layer": 1,+    "width": 0.25,+    "paths": [+      [+        {+          "pad": "J1.4"+        },+        [+          14,+          22+        ],+        [+          40,+          22+        ],+        {+          "pad": "J2.4"+        }+      ]+    ]+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 3,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "commands": [+      "LAYER 1; LINE 'NET_4' 0.250000mm (7.000000mm 22.000000mm) (14.000000mm 22.000000mm);",+      "LAYER 1; LINE 'NET_4' 0.250000mm (14.000000mm 22.000000mm) (40.000000mm 22.000000mm);",+      "LAYER 1; LINE 'NET_4' 0.250000mm (40.000000mm 22.000000mm) (47.000000mm 22.000000mm);"+    ],+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "checked": false,+      "note": "Use fusion_routing_drc for a fresh Autodesk DRC"+    },+    "durationMs": 1183,+    "error": "",+    "errorCode": null,+    "mutated": true,+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 3,+        "vias": 2+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              27.0+            ],+            "start": [+              7.0,+              27.0+            ]+          }+        ],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 2,+        "airwires": [+          {+            "end": [+              47.0,+              32.0+            ],+            "start": [+              27.0,+              38.0+            ]+          },+          {+            "end": [+              27.0,+              38.0+            ],+            "start": [+              7.0,+              32.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 0,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            14,+            22+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_4",+          "start": [+            7.0,+            22.0+          ],+          "width": 0.25+        },+        {+          "end": [+            40,+            22+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_4",+          "start": [+            14,+            22+          ],+          "width": 0.25+        },+        {+          "end": [+            47.0,+            22.0+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_4",+          "start": [+            40,+            22+          ],+          "width": 0.25+        }+      ],+      "net": "NET_4",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "remainingNets": [+      "NET_5",+      "NET_6"+    ],+    "revision": "32dd9ae2ecfb2964596a10c324b92416e3a19e8898de5eae98da59fdd46bb30f",+    "segmentCount": 12,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          7.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          14.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          40.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          7.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          17.0+        ],+        "layer": 16,+        "net": "NET_3",+        "start": [+          14.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          40.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          7.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          14.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          40.0,+          22.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "verified": true,+    "viaCount": 2,+    "vias": [+      {+        "at": [+          14.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      },+      {+        "at": [+          40.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      }+    ]+  }+}
demo/routing/evidence/per-net/015-fusion_routing_drc.jsonadded+523
@@ -0,0 +1,523 @@+{+  "elapsedSeconds": 0.5569890619954094,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "32dd9ae2ecfb2964596a10c324b92416e3a19e8898de5eae98da59fdd46bb30f"+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 3,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "airwireCount": 3,+      "checked": true,+      "clean": false,+      "errorCount": 0,+      "errors": [+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        },+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        },+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        }+      ],+      "source": "Autodesk DRC + UL_BOARD.errors",+      "warningCount": 0+    },+    "durationMs": 551,+    "error": "",+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 3,+        "vias": 2+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 1,+        "airwires": [+          {+            "end": [+              47.0,+              27.0+            ],+            "start": [+              7.0,+              27.0+            ]+          }+        ],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 0,+        "vias": 0+      },+      {+        "airwireCount": 2,+        "airwires": [+          {+            "end": [+              47.0,+              32.0+            ],+            "start": [+              27.0,+              38.0+            ]+          },+          {+            "end": [+              27.0,+              38.0+            ],+            "start": [+              7.0,+              32.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 0,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "remainingNets": [+      "NET_5",+      "NET_6"+    ],+    "revision": "32dd9ae2ecfb2964596a10c324b92416e3a19e8898de5eae98da59fdd46bb30f",+    "segmentCount": 12,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          7.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          14.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          40.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          7.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          17.0+        ],+        "layer": 16,+        "net": "NET_3",+        "start": [+          14.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          40.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          7.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          14.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          40.0,+          22.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "viaCount": 2,+    "vias": [+      {+        "at": [+          14.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      },+      {+        "at": [+          40.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      }+    ]+  }+}
demo/routing/evidence/per-net/016-fusion_route_net.jsonadded+607
@@ -0,0 +1,607 @@+{+  "elapsedSeconds": 1.4687399149988778,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "32dd9ae2ecfb2964596a10c324b92416e3a19e8898de5eae98da59fdd46bb30f",+    "net": "NET_5",+    "layer": 1,+    "width": 0.25,+    "paths": [+      [+        {+          "pad": "J1.5"+        },+        [+          14,+          27+        ],+        [+          40,+          27+        ],+        {+          "pad": "J2.5"+        }+      ]+    ]+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 2,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "commands": [+      "LAYER 1; LINE 'NET_5' 0.250000mm (7.000000mm 27.000000mm) (14.000000mm 27.000000mm);",+      "LAYER 1; LINE 'NET_5' 0.250000mm (14.000000mm 27.000000mm) (40.000000mm 27.000000mm);",+      "LAYER 1; LINE 'NET_5' 0.250000mm (40.000000mm 27.000000mm) (47.000000mm 27.000000mm);"+    ],+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "checked": false,+      "note": "Use fusion_routing_drc for a fresh Autodesk DRC"+    },+    "durationMs": 1462,+    "error": "",+    "errorCode": null,+    "mutated": true,+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 3,+        "vias": 2+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 2,+        "airwires": [+          {+            "end": [+              47.0,+              32.0+            ],+            "start": [+              27.0,+              38.0+            ]+          },+          {+            "end": [+              27.0,+              38.0+            ],+            "start": [+              7.0,+              32.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 0,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            14,+            27+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_5",+          "start": [+            7.0,+            27.0+          ],+          "width": 0.25+        },+        {+          "end": [+            40,+            27+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_5",+          "start": [+            14,+            27+          ],+          "width": 0.25+        },+        {+          "end": [+            47.0,+            27.0+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_5",+          "start": [+            40,+            27+          ],+          "width": 0.25+        }+      ],+      "net": "NET_5",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "remainingNets": [+      "NET_6"+    ],+    "revision": "9ce30b995180357ba60bf02f3443336c588017228e3626a7bd5a66ae3df80718",+    "segmentCount": 15,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          7.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          14.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          40.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          7.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          17.0+        ],+        "layer": 16,+        "net": "NET_3",+        "start": [+          14.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          40.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          7.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          14.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          40.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          7.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          14.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          40.0,+          27.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "verified": true,+    "viaCount": 2,+    "vias": [+      {+        "at": [+          14.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      },+      {+        "at": [+          40.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      }+    ]+  }+}
demo/routing/evidence/per-net/017-fusion_routing_drc.jsonadded+547
@@ -0,0 +1,547 @@+{+  "elapsedSeconds": 0.9371683460049098,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "9ce30b995180357ba60bf02f3443336c588017228e3626a7bd5a66ae3df80718"+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 2,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "airwireCount": 2,+      "checked": true,+      "clean": false,+      "errorCount": 0,+      "errors": [+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        },+        {+          "code": 21,+          "description": "Air Wire",+          "state": 0,+          "type": 4+        }+      ],+      "source": "Autodesk DRC + UL_BOARD.errors",+      "warningCount": 0+    },+    "durationMs": 931,+    "error": "",+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 3,+        "vias": 2+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 2,+        "airwires": [+          {+            "end": [+              47.0,+              32.0+            ],+            "start": [+              27.0,+              38.0+            ]+          },+          {+            "end": [+              27.0,+              38.0+            ],+            "start": [+              7.0,+              32.0+            ]+          }+        ],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 0,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "remainingNets": [+      "NET_6"+    ],+    "revision": "9ce30b995180357ba60bf02f3443336c588017228e3626a7bd5a66ae3df80718",+    "segmentCount": 15,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          7.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          14.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          40.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          7.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          17.0+        ],+        "layer": 16,+        "net": "NET_3",+        "start": [+          14.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          40.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          7.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          14.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          40.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          7.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          14.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          40.0,+          27.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "viaCount": 2,+    "vias": [+      {+        "at": [+          14.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      },+      {+        "at": [+          40.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      }+    ]+  }+}
demo/routing/evidence/per-net/018-fusion_route_net.jsonadded+711
@@ -0,0 +1,711 @@+{+  "elapsedSeconds": 1.6860630279988982,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "9ce30b995180357ba60bf02f3443336c588017228e3626a7bd5a66ae3df80718",+    "net": "NET_6",+    "layer": 1,+    "width": 0.25,+    "paths": [+      [+        {+          "pad": "J1.6"+        },+        [+          14,+          32+        ],+        [+          40,+          32+        ],+        {+          "pad": "J2.6"+        }+      ],+      [+        [+          27,+          32+        ],+        [+          27,+          35+        ],+        {+          "pad": "J3.1"+        }+      ]+    ]+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 0,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "commands": [+      "LAYER 1; LINE 'NET_6' 0.250000mm (7.000000mm 32.000000mm) (14.000000mm 32.000000mm);",+      "LAYER 1; LINE 'NET_6' 0.250000mm (14.000000mm 32.000000mm) (40.000000mm 32.000000mm);",+      "LAYER 1; LINE 'NET_6' 0.250000mm (40.000000mm 32.000000mm) (47.000000mm 32.000000mm);",+      "LAYER 1; LINE 'NET_6' 0.250000mm (27.000000mm 32.000000mm) (27.000000mm 35.000000mm);",+      "LAYER 1; LINE 'NET_6' 0.250000mm (27.000000mm 35.000000mm) (27.000000mm 38.000000mm);"+    ],+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "checked": false,+      "note": "Use fusion_routing_drc for a fresh Autodesk DRC"+    },+    "durationMs": 1680,+    "error": "",+    "errorCode": null,+    "mutated": true,+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 3,+        "vias": 2+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 6,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "plan": {+      "clearance": 0.2,+      "items": [+        {+          "end": [+            14,+            32+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_6",+          "start": [+            7.0,+            32.0+          ],+          "width": 0.25+        },+        {+          "end": [+            40,+            32+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_6",+          "start": [+            14,+            32+          ],+          "width": 0.25+        },+        {+          "end": [+            47.0,+            32.0+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_6",+          "start": [+            40,+            32+          ],+          "width": 0.25+        },+        {+          "end": [+            27,+            35+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_6",+          "start": [+            27,+            32+          ],+          "width": 0.25+        },+        {+          "end": [+            27.0,+            38.0+          ],+          "kind": "segment",+          "layer": 1,+          "net": "NET_6",+          "start": [+            27,+            35+          ],+          "width": 0.25+        }+      ],+      "net": "NET_6",+      "preflight": "Conservative geometry only; run native Autodesk DRC after edits"+    },+    "remainingNets": [],+    "revision": "06da12392114e027b37d6de7de7a604883b549df4cae50a441081413a686f2a7",+    "segmentCount": 21,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          7.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          14.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          40.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          7.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          17.0+        ],+        "layer": 16,+        "net": "NET_3",+        "start": [+          14.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          40.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          7.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          14.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          40.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          7.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          14.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          40.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          32.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          7.0,+          32.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          27.0,+          32.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          14.0,+          32.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          32.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          27.0,+          32.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          32.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          40.0,+          32.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          27.0,+          35.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          27.0,+          32.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          27.0,+          38.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          27.0,+          35.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "verified": true,+    "viaCount": 2,+    "vias": [+      {+        "at": [+          14.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      },+      {+        "at": [+          40.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      }+    ]+  }+}
demo/routing/evidence/per-net/019-fusion_routing_drc.jsonadded+595
@@ -0,0 +1,595 @@+{+  "elapsedSeconds": 0.49388175300555304,+  "args": {+    "expectDocument": "fusion-routing",+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "expectedRevision": "06da12392114e027b37d6de7de7a604883b549df4cae50a441081413a686f2a7"+  },+  "result": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 0,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "airwireCount": 0,+      "checked": true,+      "clean": true,+      "errorCount": 0,+      "errors": [],+      "source": "Autodesk DRC + UL_BOARD.errors",+      "warningCount": 0+    },+    "durationMs": 488,+    "error": "",+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 3,+        "vias": 2+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 6,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "remainingNets": [],+    "revision": "06da12392114e027b37d6de7de7a604883b549df4cae50a441081413a686f2a7",+    "segmentCount": 21,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          7.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          14.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          40.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          7.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          17.0+        ],+        "layer": 16,+        "net": "NET_3",+        "start": [+          14.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          40.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          7.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          14.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          40.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          7.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          14.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          40.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          32.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          7.0,+          32.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          27.0,+          32.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          14.0,+          32.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          32.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          27.0,+          32.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          32.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          40.0,+          32.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          27.0,+          35.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          27.0,+          32.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          27.0,+          38.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          27.0,+          35.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "viaCount": 2,+    "vias": [+      {+        "at": [+          14.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      },+      {+        "at": [+          40.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      }+    ]+  }+}
demo/routing/evidence/per-net/result.jsonadded+592
@@ -0,0 +1,592 @@+{+  "success": true,+  "elapsedSeconds": 12.508742432997678,+  "mode": "per-net",+  "final": {+    "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+    "airwireCount": 0,+    "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+    "bridgeVersion": "1.10.0-dev.routing.1",+    "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+    "documentName": "fusion-routing",+    "drc": {+      "airwireCount": 0,+      "checked": true,+      "clean": true,+      "errorCount": 0,+      "errors": [],+      "source": "Autodesk DRC + UL_BOARD.errors",+      "warningCount": 0+    },+    "durationMs": 488,+    "error": "",+    "nets": [+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_1",+        "pads": [+          "J1.1",+          "J2.1"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_2",+        "pads": [+          "J1.2",+          "J2.2"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_3",+        "pads": [+          "J1.3",+          "J2.3"+        ],+        "segments": 3,+        "vias": 2+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_4",+        "pads": [+          "J1.4",+          "J2.4"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_5",+        "pads": [+          "J1.5",+          "J2.5"+        ],+        "segments": 3,+        "vias": 0+      },+      {+        "airwireCount": 0,+        "airwires": [],+        "name": "NET_6",+        "pads": [+          "J1.6",+          "J2.6",+          "J3.1"+        ],+        "segments": 6,+        "vias": 0+      }+    ],+    "pads": [+      {+        "at": [+          7.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          7.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J1.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          7.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.1",+        "net": "NET_1",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          12.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.2",+        "net": "NET_2",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          17.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.3",+        "net": "NET_3",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          22.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.4",+        "net": "NET_4",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          27.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.5",+        "net": "NET_5",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          47.0,+          32.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J2.6",+        "net": "NET_6",+        "radius": 1.4142135623730951+      },+      {+        "at": [+          27.0,+          38.0+        ],+        "layers": [+          1,+          16+        ],+        "name": "J3.1",+        "net": "NET_6",+        "radius": 1.4142135623730951+      }+    ],+    "remainingNets": [],+    "revision": "06da12392114e027b37d6de7de7a604883b549df4cae50a441081413a686f2a7",+    "segmentCount": 21,+    "segments": [+      {+        "curve": 0.0,+        "end": [+          14.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          7.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          14.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          7.0+        ],+        "layer": 1,+        "net": "NET_1",+        "start": [+          40.0,+          7.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          7.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          14.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          12.0+        ],+        "layer": 1,+        "net": "NET_2",+        "start": [+          40.0,+          12.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          7.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          17.0+        ],+        "layer": 16,+        "net": "NET_3",+        "start": [+          14.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          17.0+        ],+        "layer": 1,+        "net": "NET_3",+        "start": [+          40.0,+          17.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          7.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          14.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          22.0+        ],+        "layer": 1,+        "net": "NET_4",+        "start": [+          40.0,+          22.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          7.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          14.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          27.0+        ],+        "layer": 1,+        "net": "NET_5",+        "start": [+          40.0,+          27.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          14.0,+          32.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          7.0,+          32.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          27.0,+          32.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          14.0,+          32.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          40.0,+          32.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          27.0,+          32.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          47.0,+          32.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          40.0,+          32.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          27.0,+          35.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          27.0,+          32.0+        ],+        "width": 0.25+      },+      {+        "curve": 0.0,+        "end": [+          27.0,+          38.0+        ],+        "layer": 1,+        "net": "NET_6",+        "start": [+          27.0,+          35.0+        ],+        "width": 0.25+      }+    ],+    "shell": "rust",+    "status": "ok",+    "statusVerb": "fusion_get_app_state",+    "success": true,+    "timeoutSeconds": 60,+    "units": "mm",+    "viaCount": 2,+    "vias": [+      {+        "at": [+          14.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      },+      {+        "at": [+          40.0,+          17.0+        ],+        "diameter": 0.6,+        "drill": 0.3,+        "extent": "1-16",+        "net": "NET_3"+      }+    ]+  }+}
demo/routing/evidence/pinned-refresh.jsonadded+23
@@ -0,0 +1,23 @@+{+  "_hint": "Per-bridge sync result. action is one of: current (matched wiki), current_offline (wiki unreachable, kept cache), current_cache_newer (installed cache is newer than wiki — kept cache), current_bundled_newer (installer is newer than wiki — kept bundled), bootstrapped (cache was empty, copied from installer), updated (downloaded newer from wiki). Pass {\"name\":\"<bridge>\"} to update just one; omit for all. v1.9.11+: also busts the hero/meta art cache (artCacheCleared = files dropped) so refreshed wiki heroes re-pull. After 'updated' the bridge process needs to restart to pick up new code: kill python.exe (kicad/fusion) or node.exe (puppeteer). Use bridge_check_updates first to see what's available without downloading; refresh_heroes busts ONLY the art cache.",+  "artCacheCleared": 24,+  "durationMs": 11,+  "error": "",+  "output": "",+  "results": [+    {+      "action": "pinned_dev",+      "available": null,+      "bridge": "fusion360",+      "devPinned": true,+      "from": "1.9.366",+      "ok": true,+      "outcome": "skipped: dev pin (a developer is working in this cache; updates frozen until bridge_dev_mode {on:false} or the .dev-pin file is removed)",+      "tierProbed": null,+      "to": "1.9.366"+    }+  ],+  "status": "ok",+  "success": true,+  "timeoutSeconds": 60+}
demo/routing/evidence/redo-final.jsonadded+582
@@ -0,0 +1,582 @@+{+  "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+  "airwireCount": 0,+  "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+  "bridgeVersion": "1.10.0-dev.routing.1",+  "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+  "documentName": "fusion-routing",+  "drc": {+    "checked": false,+    "note": "Use fusion_routing_drc for a fresh Autodesk DRC"+  },+  "durationMs": 218,+  "error": "",+  "nets": [+    {+      "airwireCount": 0,+      "airwires": [],+      "name": "NET_1",+      "pads": [+        "J1.1",+        "J2.1"+      ],+      "segments": 3,+      "vias": 0+    },+    {+      "airwireCount": 0,+      "airwires": [],+      "name": "NET_2",+      "pads": [+        "J1.2",+        "J2.2"+      ],+      "segments": 3,+      "vias": 0+    },+    {+      "airwireCount": 0,+      "airwires": [],+      "name": "NET_3",+      "pads": [+        "J1.3",+        "J2.3"+      ],+      "segments": 3,+      "vias": 2+    },+    {+      "airwireCount": 0,+      "airwires": [],+      "name": "NET_4",+      "pads": [+        "J1.4",+        "J2.4"+      ],+      "segments": 3,+      "vias": 0+    },+    {+      "airwireCount": 0,+      "airwires": [],+      "name": "NET_5",+      "pads": [+        "J1.5",+        "J2.5"+      ],+      "segments": 3,+      "vias": 0+    },+    {+      "airwireCount": 0,+      "airwires": [],+      "name": "NET_6",+      "pads": [+        "J1.6",+        "J2.6",+        "J3.1"+      ],+      "segments": 6,+      "vias": 0+    }+  ],+  "pads": [+    {+      "at": [+        7.0,+        7.0+      ],+      "layers": [+        1,+        16+      ],+      "name": "J1.1",+      "net": "NET_1",+      "radius": 1.4142135623730951+    },+    {+      "at": [+        7.0,+        12.0+      ],+      "layers": [+        1,+        16+      ],+      "name": "J1.2",+      "net": "NET_2",+      "radius": 1.4142135623730951+    },+    {+      "at": [+        7.0,+        17.0+      ],+      "layers": [+        1,+        16+      ],+      "name": "J1.3",+      "net": "NET_3",+      "radius": 1.4142135623730951+    },+    {+      "at": [+        7.0,+        22.0+      ],+      "layers": [+        1,+        16+      ],+      "name": "J1.4",+      "net": "NET_4",+      "radius": 1.4142135623730951+    },+    {+      "at": [+        7.0,+        27.0+      ],+      "layers": [+        1,+        16+      ],+      "name": "J1.5",+      "net": "NET_5",+      "radius": 1.4142135623730951+    },+    {+      "at": [+        7.0,+        32.0+      ],+      "layers": [+        1,+        16+      ],+      "name": "J1.6",+      "net": "NET_6",+      "radius": 1.4142135623730951+    },+    {+      "at": [+        47.0,+        7.0+      ],+      "layers": [+        1,+        16+      ],+      "name": "J2.1",+      "net": "NET_1",+      "radius": 1.4142135623730951+    },+    {+      "at": [+        47.0,+        12.0+      ],+      "layers": [+        1,+        16+      ],+      "name": "J2.2",+      "net": "NET_2",+      "radius": 1.4142135623730951+    },+    {+      "at": [+        47.0,+        17.0+      ],+      "layers": [+        1,+        16+      ],+      "name": "J2.3",+      "net": "NET_3",+      "radius": 1.4142135623730951+    },+    {+      "at": [+        47.0,+        22.0+      ],+      "layers": [+        1,+        16+      ],+      "name": "J2.4",+      "net": "NET_4",+      "radius": 1.4142135623730951+    },+    {+      "at": [+        47.0,+        27.0+      ],+      "layers": [+        1,+        16+      ],+      "name": "J2.5",+      "net": "NET_5",+      "radius": 1.4142135623730951+    },+    {+      "at": [+        47.0,+        32.0+      ],+      "layers": [+        1,+        16+      ],+      "name": "J2.6",+      "net": "NET_6",+      "radius": 1.4142135623730951+    },+    {+      "at": [+        27.0,+        38.0+      ],+      "layers": [+        1,+        16+      ],+      "name": "J3.1",+      "net": "NET_6",+      "radius": 1.4142135623730951+    }+  ],+  "remainingNets": [],+  "revision": "06da12392114e027b37d6de7de7a604883b549df4cae50a441081413a686f2a7",+  "segmentCount": 21,+  "segments": [+    {+      "curve": 0.0,+      "end": [+        14.0,+        7.0+      ],+      "layer": 1,+      "net": "NET_1",+      "start": [+        7.0,+        7.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        40.0,+        7.0+      ],+      "layer": 1,+      "net": "NET_1",+      "start": [+        14.0,+        7.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        47.0,+        7.0+      ],+      "layer": 1,+      "net": "NET_1",+      "start": [+        40.0,+        7.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        14.0,+        12.0+      ],+      "layer": 1,+      "net": "NET_2",+      "start": [+        7.0,+        12.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        40.0,+        12.0+      ],+      "layer": 1,+      "net": "NET_2",+      "start": [+        14.0,+        12.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        47.0,+        12.0+      ],+      "layer": 1,+      "net": "NET_2",+      "start": [+        40.0,+        12.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        14.0,+        17.0+      ],+      "layer": 1,+      "net": "NET_3",+      "start": [+        7.0,+        17.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        40.0,+        17.0+      ],+      "layer": 16,+      "net": "NET_3",+      "start": [+        14.0,+        17.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        47.0,+        17.0+      ],+      "layer": 1,+      "net": "NET_3",+      "start": [+        40.0,+        17.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        14.0,+        22.0+      ],+      "layer": 1,+      "net": "NET_4",+      "start": [+        7.0,+        22.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        40.0,+        22.0+      ],+      "layer": 1,+      "net": "NET_4",+      "start": [+        14.0,+        22.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        47.0,+        22.0+      ],+      "layer": 1,+      "net": "NET_4",+      "start": [+        40.0,+        22.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        14.0,+        27.0+      ],+      "layer": 1,+      "net": "NET_5",+      "start": [+        7.0,+        27.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        40.0,+        27.0+      ],+      "layer": 1,+      "net": "NET_5",+      "start": [+        14.0,+        27.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        47.0,+        27.0+      ],+      "layer": 1,+      "net": "NET_5",+      "start": [+        40.0,+        27.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        14.0,+        32.0+      ],+      "layer": 1,+      "net": "NET_6",+      "start": [+        7.0,+        32.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        27.0,+        32.0+      ],+      "layer": 1,+      "net": "NET_6",+      "start": [+        14.0,+        32.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        40.0,+        32.0+      ],+      "layer": 1,+      "net": "NET_6",+      "start": [+        27.0,+        32.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        47.0,+        32.0+      ],+      "layer": 1,+      "net": "NET_6",+      "start": [+        40.0,+        32.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        27.0,+        35.0+      ],+      "layer": 1,+      "net": "NET_6",+      "start": [+        27.0,+        32.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        27.0,+        38.0+      ],+      "layer": 1,+      "net": "NET_6",+      "start": [+        27.0,+        35.0+      ],+      "width": 0.25+    }+  ],+  "shell": "rust",+  "status": "ok",+  "statusVerb": "fusion_get_app_state",+  "success": true,+  "timeoutSeconds": 60,+  "units": "mm",+  "viaCount": 2,+  "vias": [+    {+      "at": [+        14.0,+        17.0+      ],+      "diameter": 0.6,+      "drill": 0.3,+      "extent": "1-16",+      "net": "NET_3"+    },+    {+      "at": [+        40.0,+        17.0+      ],+      "diameter": 0.6,+      "drill": 0.3,+      "extent": "1-16",+      "net": "NET_3"+    }+  ]+}
demo/routing/evidence/undo-final.jsonadded+581
@@ -0,0 +1,581 @@+{+  "_timeoutHint": "ab waits up to 60s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \u2014 the work usually keeps running on the bridge. Poll `fusion_get_app_state` until it reports done.",+  "airwireCount": 1,+  "boardId": "ed637c30-5f78-4e1c-967a-fbf4752f0ae4",+  "bridgeVersion": "1.10.0-dev.routing.1",+  "connectivitySource": "Fusion exported airwires; mutation paths recompute RATSNEST",+  "documentName": "fusion-routing",+  "drc": {+    "checked": false,+    "note": "Use fusion_routing_drc for a fresh Autodesk DRC"+  },+  "durationMs": 219,+  "error": "",+  "nets": [+    {+      "airwireCount": 0,+      "airwires": [],+      "name": "NET_1",+      "pads": [+        "J1.1",+        "J2.1"+      ],+      "segments": 3,+      "vias": 0+    },+    {+      "airwireCount": 0,+      "airwires": [],+      "name": "NET_2",+      "pads": [+        "J1.2",+        "J2.2"+      ],+      "segments": 3,+      "vias": 0+    },+    {+      "airwireCount": 0,+      "airwires": [],+      "name": "NET_3",+      "pads": [+        "J1.3",+        "J2.3"+      ],+      "segments": 3,+      "vias": 2+    },+    {+      "airwireCount": 0,+      "airwires": [],+      "name": "NET_4",+      "pads": [+        "J1.4",+        "J2.4"+      ],+      "segments": 3,+      "vias": 0+    },+    {+      "airwireCount": 0,+      "airwires": [],+      "name": "NET_5",+      "pads": [+        "J1.5",+        "J2.5"+      ],+      "segments": 3,+      "vias": 0+    },+    {+      "airwireCount": 1,+      "airwires": [+        {+          "end": [+            27.0,+            38.0+          ],+          "start": [+            27.0,+            35.0+          ]+        }+      ],+      "name": "NET_6",+      "pads": [+        "J1.6",+        "J2.6",+        "J3.1"+      ],+      "segments": 5,+      "vias": 0+    }+  ],+  "pads": [+    {+      "at": [+        7.0,+        7.0+      ],+      "layers": [+        1,+        16+      ],+      "name": "J1.1",+      "net": "NET_1",+      "radius": 1.4142135623730951+    },+    {+      "at": [+        7.0,+        12.0+      ],+      "layers": [+        1,+        16+      ],+      "name": "J1.2",+      "net": "NET_2",+      "radius": 1.4142135623730951+    },+    {+      "at": [+        7.0,+        17.0+      ],+      "layers": [+        1,+        16+      ],+      "name": "J1.3",+      "net": "NET_3",+      "radius": 1.4142135623730951+    },+    {+      "at": [+        7.0,+        22.0+      ],+      "layers": [+        1,+        16+      ],+      "name": "J1.4",+      "net": "NET_4",+      "radius": 1.4142135623730951+    },+    {+      "at": [+        7.0,+        27.0+      ],+      "layers": [+        1,+        16+      ],+      "name": "J1.5",+      "net": "NET_5",+      "radius": 1.4142135623730951+    },+    {+      "at": [+        7.0,+        32.0+      ],+      "layers": [+        1,+        16+      ],+      "name": "J1.6",+      "net": "NET_6",+      "radius": 1.4142135623730951+    },+    {+      "at": [+        47.0,+        7.0+      ],+      "layers": [+        1,+        16+      ],+      "name": "J2.1",+      "net": "NET_1",+      "radius": 1.4142135623730951+    },+    {+      "at": [+        47.0,+        12.0+      ],+      "layers": [+        1,+        16+      ],+      "name": "J2.2",+      "net": "NET_2",+      "radius": 1.4142135623730951+    },+    {+      "at": [+        47.0,+        17.0+      ],+      "layers": [+        1,+        16+      ],+      "name": "J2.3",+      "net": "NET_3",+      "radius": 1.4142135623730951+    },+    {+      "at": [+        47.0,+        22.0+      ],+      "layers": [+        1,+        16+      ],+      "name": "J2.4",+      "net": "NET_4",+      "radius": 1.4142135623730951+    },+    {+      "at": [+        47.0,+        27.0+      ],+      "layers": [+        1,+        16+      ],+      "name": "J2.5",+      "net": "NET_5",+      "radius": 1.4142135623730951+    },+    {+      "at": [+        47.0,+        32.0+      ],+      "layers": [+        1,+        16+      ],+      "name": "J2.6",+      "net": "NET_6",+      "radius": 1.4142135623730951+    },+    {+      "at": [+        27.0,+        38.0+      ],+      "layers": [+        1,+        16+      ],+      "name": "J3.1",+      "net": "NET_6",+      "radius": 1.4142135623730951+    }+  ],+  "remainingNets": [+    "NET_6"+  ],+  "revision": "f6476879b6e247e529363c62da80d0552e262c09902519bef2da1901df055f87",+  "segmentCount": 20,+  "segments": [+    {+      "curve": 0.0,+      "end": [+        14.0,+        7.0+      ],+      "layer": 1,+      "net": "NET_1",+      "start": [+        7.0,+        7.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        40.0,+        7.0+      ],+      "layer": 1,+      "net": "NET_1",+      "start": [+        14.0,+        7.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        47.0,+        7.0+      ],+      "layer": 1,+      "net": "NET_1",+      "start": [+        40.0,+        7.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        14.0,+        12.0+      ],+      "layer": 1,+      "net": "NET_2",+      "start": [+        7.0,+        12.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        40.0,+        12.0+      ],+      "layer": 1,+      "net": "NET_2",+      "start": [+        14.0,+        12.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        47.0,+        12.0+      ],+      "layer": 1,+      "net": "NET_2",+      "start": [+        40.0,+        12.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        14.0,+        17.0+      ],+      "layer": 1,+      "net": "NET_3",+      "start": [+        7.0,+        17.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        40.0,+        17.0+      ],+      "layer": 16,+      "net": "NET_3",+      "start": [+        14.0,+        17.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        47.0,+        17.0+      ],+      "layer": 1,+      "net": "NET_3",+      "start": [+        40.0,+        17.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        14.0,+        22.0+      ],+      "layer": 1,+      "net": "NET_4",+      "start": [+        7.0,+        22.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        40.0,+        22.0+      ],+      "layer": 1,+      "net": "NET_4",+      "start": [+        14.0,+        22.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        47.0,+        22.0+      ],+      "layer": 1,+      "net": "NET_4",+      "start": [+        40.0,+        22.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        14.0,+        27.0+      ],+      "layer": 1,+      "net": "NET_5",+      "start": [+        7.0,+        27.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        40.0,+        27.0+      ],+      "layer": 1,+      "net": "NET_5",+      "start": [+        14.0,+        27.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        47.0,+        27.0+      ],+      "layer": 1,+      "net": "NET_5",+      "start": [+        40.0,+        27.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        14.0,+        32.0+      ],+      "layer": 1,+      "net": "NET_6",+      "start": [+        7.0,+        32.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        27.0,+        32.0+      ],+      "layer": 1,+      "net": "NET_6",+      "start": [+        14.0,+        32.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        40.0,+        32.0+      ],+      "layer": 1,+      "net": "NET_6",+      "start": [+        27.0,+        32.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        47.0,+        32.0+      ],+      "layer": 1,+      "net": "NET_6",+      "start": [+        40.0,+        32.0+      ],+      "width": 0.25+    },+    {+      "curve": 0.0,+      "end": [+        27.0,+        35.0+      ],+      "layer": 1,+      "net": "NET_6",+      "start": [+        27.0,+        32.0+      ],+      "width": 0.25+    }+  ],+  "shell": "rust",+  "status": "ok",+  "statusVerb": "fusion_get_app_state",+  "success": true,+  "timeoutSeconds": 60,+  "units": "mm",+  "viaCount": 2,+  "vias": [+    {+      "at": [+        14.0,+        17.0+      ],+      "diameter": 0.6,+      "drill": 0.3,+      "extent": "1-16",+      "net": "NET_3"+    },+    {+      "at": [+        40.0,+        17.0+      ],+      "diameter": 0.6,+      "drill": 0.3,+      "extent": "1-16",+      "net": "NET_3"+    }+  ]+}
demo/routing/evidence/video-delivery.jsonadded+12
@@ -0,0 +1,12 @@+{+  "_hint": "Wrote 1 file(s) to the LAPTOP (Windows host), NOT to your container/WSL. Folder: C:/Users/john/Documents/fusion-routing-dev  ·  exact paths are in destinationPaths[]. VERIFY: adom-bridge list_dir '{\"path\":\"C:/Users/john/Documents/fusion-routing-dev\"}'   READ ONE BACK: adom-bridge pull_file '{\"path\":\"C:/Users/john/Documents/fusion-routing-dev/fusion-live-trace-routing.mp4\"}'. To control where files land, pass dest:'C:/abs/path' (absolute) or destinationFolder:'subdir' (relative to the laptop Downloads default). NOTE: send_files only COPIES bytes — it does NOT install or register a bridge. To make a bridge appear (capsule in the ab GUI + verbs routable), use bridge_install '{\"manifestUrl\":\"https://wiki.adom.inc/...<bridge>-manifest.json\"}', then confirm with bridge_list.",+  "destinationPaths": [+    "C:/Users/john/Documents/fusion-routing-dev/fusion-live-trace-routing.mp4"+  ],+  "durationMs": 39,+  "error": null,+  "filesReceived": 1,+  "savedToDir": "C:/Users/john/Documents/fusion-routing-dev",+  "status": "ok",+  "success": true+}
demo/routing/fixture/fusion-routing.brdadded+175
@@ -0,0 +1,175 @@+<?xml version="1.0" encoding="utf-8"?>+<!DOCTYPE eagle SYSTEM "eagle.dtd">+<eagle version="9.6.2">+  <drawing>+    <settings />+    <grid distance="0.1" unitdist="mm" unit="mm" style="lines" multiple="1" display="no" altdistance="0.01" altunitdist="mm" altunit="mm" />+    <layers>+      <layer number="1" name="Top" color="4" fill="1" visible="yes" active="yes" />+      <layer number="16" name="Bottom" color="1" fill="1" visible="yes" active="yes" />+      <layer number="17" name="Pads" color="2" fill="1" visible="yes" active="yes" />+      <layer number="18" name="Vias" color="2" fill="1" visible="yes" active="yes" />+      <layer number="19" name="Unrouted" color="6" fill="1" visible="yes" active="yes" />+      <layer number="20" name="Dimension" color="15" fill="1" visible="yes" active="yes" />+      <layer number="21" name="tPlace" color="7" fill="1" visible="yes" active="yes" />+      <layer number="22" name="bPlace" color="7" fill="1" visible="yes" active="yes" />+      <layer number="23" name="tOrigins" color="15" fill="1" visible="yes" active="yes" />+      <layer number="24" name="bOrigins" color="15" fill="1" visible="yes" active="yes" />+      <layer number="25" name="tNames" color="7" fill="1" visible="yes" active="yes" />+      <layer number="26" name="bNames" color="7" fill="1" visible="yes" active="yes" />+      <layer number="27" name="tValues" color="7" fill="1" visible="yes" active="yes" />+      <layer number="28" name="bValues" color="7" fill="1" visible="yes" active="yes" />+      <layer number="29" name="tStop" color="7" fill="3" visible="no" active="yes" />+      <layer number="30" name="bStop" color="7" fill="6" visible="no" active="yes" />+      <layer number="31" name="tCream" color="7" fill="4" visible="no" active="yes" />+      <layer number="32" name="bCream" color="7" fill="5" visible="no" active="yes" />+      <layer number="33" name="tFinish" color="6" fill="3" visible="no" active="yes" />+      <layer number="34" name="bFinish" color="6" fill="6" visible="no" active="yes" />+      <layer number="35" name="tGlue" color="7" fill="4" visible="no" active="yes" />+      <layer number="36" name="bGlue" color="7" fill="5" visible="no" active="yes" />+      <layer number="37" name="tTest" color="7" fill="1" visible="no" active="yes" />+      <layer number="38" name="bTest" color="7" fill="1" visible="no" active="yes" />+      <layer number="39" name="tKeepout" color="4" fill="11" visible="no" active="yes" />+      <layer number="40" name="bKeepout" color="1" fill="11" visible="no" active="yes" />+      <layer number="41" name="tRestrict" color="4" fill="10" visible="no" active="yes" />+      <layer number="42" name="bRestrict" color="1" fill="10" visible="no" active="yes" />+      <layer number="43" name="vRestrict" color="2" fill="10" visible="no" active="yes" />+      <layer number="44" name="Drills" color="7" fill="1" visible="no" active="yes" />+      <layer number="45" name="Holes" color="7" fill="1" visible="no" active="yes" />+      <layer number="46" name="Milling" color="3" fill="1" visible="no" active="yes" />+      <layer number="47" name="Measures" color="7" fill="1" visible="no" active="yes" />+      <layer number="48" name="Document" color="7" fill="1" visible="yes" active="yes" />+      <layer number="49" name="Reference" color="7" fill="1" visible="yes" active="yes" />+      <layer number="91" name="Nets" color="2" fill="1" visible="yes" active="yes" />+      <layer number="92" name="Busses" color="1" fill="1" visible="yes" active="yes" />+      <layer number="93" name="Pins" color="2" fill="1" visible="no" active="yes" />+      <layer number="94" name="Symbols" color="4" fill="1" visible="yes" active="yes" />+      <layer number="95" name="Names" color="7" fill="1" visible="yes" active="yes" />+      <layer number="96" name="Values" color="7" fill="1" visible="yes" active="yes" />+      <layer number="97" name="Info" color="7" fill="1" visible="yes" active="yes" />+      <layer number="98" name="Guide" color="6" fill="1" visible="yes" active="yes" />+    </layers>+    <board>+      <plain>+        <wire x1="0" y1="0" x2="54" y2="0" width="0" layer="20" />+        <wire x1="54" y1="0" x2="54" y2="44" width="0" layer="20" />+        <wire x1="54" y1="44" x2="0" y2="44" width="0" layer="20" />+        <wire x1="0" y1="44" x2="0" y2="0" width="0" layer="20" />+        <text x="13" y="40" size="1.5" layer="21">FUSION TRACE ROUTING</text>+      </plain>+      <libraries>+        <library name="RoutingFixture">+          <packages>+            <package name="TESTPOINTS_1">+              <pad name="1" x="0" y="0" drill="1" diameter="2" shape="round" />+            </package>+            <package name="TESTPOINTS_6">+              <pad name="1" x="0" y="0" drill="1" diameter="2" shape="round" />+              <pad name="2" x="0" y="5" drill="1" diameter="2" shape="round" />+              <pad name="3" x="0" y="10" drill="1" diameter="2" shape="round" />+              <pad name="4" x="0" y="15" drill="1" diameter="2" shape="round" />+              <pad name="5" x="0" y="20" drill="1" diameter="2" shape="round" />+              <pad name="6" x="0" y="25" drill="1" diameter="2" shape="round" />+            </package>+          </packages>+          <symbols>+            <symbol name="TESTPOINTS_1">+              <pin name="1" x="0" y="0" length="short" direction="pas" />+            </symbol>+            <symbol name="TESTPOINTS_6">+              <pin name="1" x="0" y="0" length="short" direction="pas" />+              <pin name="2" x="0" y="5" length="short" direction="pas" />+              <pin name="3" x="0" y="10" length="short" direction="pas" />+              <pin name="4" x="0" y="15" length="short" direction="pas" />+              <pin name="5" x="0" y="20" length="short" direction="pas" />+              <pin name="6" x="0" y="25" length="short" direction="pas" />+            </symbol>+          </symbols>+          <devicesets>+            <deviceset name="TESTPOINTS_1" prefix="J">+              <gates>+                <gate name="G$1" symbol="TESTPOINTS_1" x="0" y="0" />+              </gates>+              <devices>+                <device name="" package="TESTPOINTS_1">+                  <connects>+                    <connect gate="G$1" pin="1" pad="1" />+                  </connects>+                  <technologies>+                    <technology name="" />+                  </technologies>+                </device>+              </devices>+            </deviceset>+            <deviceset name="TESTPOINTS_6" prefix="J">+              <gates>+                <gate name="G$1" symbol="TESTPOINTS_6" x="0" y="0" />+              </gates>+              <devices>+                <device name="" package="TESTPOINTS_6">+                  <connects>+                    <connect gate="G$1" pin="1" pad="1" />+                    <connect gate="G$1" pin="2" pad="2" />+                    <connect gate="G$1" pin="3" pad="3" />+                    <connect gate="G$1" pin="4" pad="4" />+                    <connect gate="G$1" pin="5" pad="5" />+                    <connect gate="G$1" pin="6" pad="6" />+                  </connects>+                  <technologies>+                    <technology name="" />+                  </technologies>+                </device>+              </devices>+            </deviceset>+          </devicesets>+        </library>+      </libraries>+      <attributes />+      <variantdefs />+      <classes>+        <class number="0" name="default" width="0.25" drill="0.3" />+      </classes>+      <designrules name="RoutingFixture">+        <param name="layerSetup" value="(1*16)" />+        <param name="mdWireWire" value="0.2mm" />+        <param name="mdWirePad" value="0.2mm" />+        <param name="mdWireVia" value="0.2mm" />+        <param name="msWidth" value="0.2mm" />+        <param name="msDrill" value="0.3mm" />+        <param name="mdCopperDimension" value="0.5mm" />+      </designrules>+      <elements>+        <element name="J1" library="RoutingFixture" package="TESTPOINTS_6" value="ROUTING_TEST" x="7" y="7" />+        <element name="J2" library="RoutingFixture" package="TESTPOINTS_6" value="ROUTING_TEST" x="47" y="7" />+        <element name="J3" library="RoutingFixture" package="TESTPOINTS_1" value="ROUTING_TEST" x="27" y="38" />+      </elements>+      <signals>+        <signal name="NET_1">+          <contactref element="J1" pad="1" />+          <contactref element="J2" pad="1" />+        </signal>+        <signal name="NET_2">+          <contactref element="J1" pad="2" />+          <contactref element="J2" pad="2" />+        </signal>+        <signal name="NET_3">+          <contactref element="J1" pad="3" />+          <contactref element="J2" pad="3" />+        </signal>+        <signal name="NET_4">+          <contactref element="J1" pad="4" />+          <contactref element="J2" pad="4" />+        </signal>+        <signal name="NET_5">+          <contactref element="J1" pad="5" />+          <contactref element="J2" pad="5" />+        </signal>+        <signal name="NET_6">+          <contactref element="J1" pad="6" />+          <contactref element="J2" pad="6" />+          <contactref element="J3" pad="1" />+        </signal>+      </signals>+    </board>+  </drawing>+</eagle>\ No newline at end of file
demo/routing/fixture/fusion-routing.schadded+190
@@ -0,0 +1,190 @@+<?xml version="1.0" encoding="utf-8"?>+<!DOCTYPE eagle SYSTEM "eagle.dtd">+<eagle version="9.6.2">+  <drawing>+    <settings />+    <grid distance="0.1" unitdist="mm" unit="mm" style="lines" multiple="1" display="no" altdistance="0.01" altunitdist="mm" altunit="mm" />+    <layers>+      <layer number="1" name="Top" color="4" fill="1" visible="yes" active="yes" />+      <layer number="16" name="Bottom" color="1" fill="1" visible="yes" active="yes" />+      <layer number="17" name="Pads" color="2" fill="1" visible="yes" active="yes" />+      <layer number="18" name="Vias" color="2" fill="1" visible="yes" active="yes" />+      <layer number="19" name="Unrouted" color="6" fill="1" visible="yes" active="yes" />+      <layer number="20" name="Dimension" color="15" fill="1" visible="yes" active="yes" />+      <layer number="21" name="tPlace" color="7" fill="1" visible="yes" active="yes" />+      <layer number="22" name="bPlace" color="7" fill="1" visible="yes" active="yes" />+      <layer number="23" name="tOrigins" color="15" fill="1" visible="yes" active="yes" />+      <layer number="24" name="bOrigins" color="15" fill="1" visible="yes" active="yes" />+      <layer number="25" name="tNames" color="7" fill="1" visible="yes" active="yes" />+      <layer number="26" name="bNames" color="7" fill="1" visible="yes" active="yes" />+      <layer number="27" name="tValues" color="7" fill="1" visible="yes" active="yes" />+      <layer number="28" name="bValues" color="7" fill="1" visible="yes" active="yes" />+      <layer number="29" name="tStop" color="7" fill="3" visible="no" active="yes" />+      <layer number="30" name="bStop" color="7" fill="6" visible="no" active="yes" />+      <layer number="31" name="tCream" color="7" fill="4" visible="no" active="yes" />+      <layer number="32" name="bCream" color="7" fill="5" visible="no" active="yes" />+      <layer number="33" name="tFinish" color="6" fill="3" visible="no" active="yes" />+      <layer number="34" name="bFinish" color="6" fill="6" visible="no" active="yes" />+      <layer number="35" name="tGlue" color="7" fill="4" visible="no" active="yes" />+      <layer number="36" name="bGlue" color="7" fill="5" visible="no" active="yes" />+      <layer number="37" name="tTest" color="7" fill="1" visible="no" active="yes" />+      <layer number="38" name="bTest" color="7" fill="1" visible="no" active="yes" />+      <layer number="39" name="tKeepout" color="4" fill="11" visible="no" active="yes" />+      <layer number="40" name="bKeepout" color="1" fill="11" visible="no" active="yes" />+      <layer number="41" name="tRestrict" color="4" fill="10" visible="no" active="yes" />+      <layer number="42" name="bRestrict" color="1" fill="10" visible="no" active="yes" />+      <layer number="43" name="vRestrict" color="2" fill="10" visible="no" active="yes" />+      <layer number="44" name="Drills" color="7" fill="1" visible="no" active="yes" />+      <layer number="45" name="Holes" color="7" fill="1" visible="no" active="yes" />+      <layer number="46" name="Milling" color="3" fill="1" visible="no" active="yes" />+      <layer number="47" name="Measures" color="7" fill="1" visible="no" active="yes" />+      <layer number="48" name="Document" color="7" fill="1" visible="yes" active="yes" />+      <layer number="49" name="Reference" color="7" fill="1" visible="yes" active="yes" />+      <layer number="91" name="Nets" color="2" fill="1" visible="yes" active="yes" />+      <layer number="92" name="Busses" color="1" fill="1" visible="yes" active="yes" />+      <layer number="93" name="Pins" color="2" fill="1" visible="no" active="yes" />+      <layer number="94" name="Symbols" color="4" fill="1" visible="yes" active="yes" />+      <layer number="95" name="Names" color="7" fill="1" visible="yes" active="yes" />+      <layer number="96" name="Values" color="7" fill="1" visible="yes" active="yes" />+      <layer number="97" name="Info" color="7" fill="1" visible="yes" active="yes" />+      <layer number="98" name="Guide" color="6" fill="1" visible="yes" active="yes" />+    </layers>+    <schematic>+      <libraries>+        <library name="RoutingFixture">+          <packages>+            <package name="TESTPOINTS_1">+              <pad name="1" x="0" y="0" drill="1" diameter="2" shape="round" />+            </package>+            <package name="TESTPOINTS_6">+              <pad name="1" x="0" y="0" drill="1" diameter="2" shape="round" />+              <pad name="2" x="0" y="5" drill="1" diameter="2" shape="round" />+              <pad name="3" x="0" y="10" drill="1" diameter="2" shape="round" />+              <pad name="4" x="0" y="15" drill="1" diameter="2" shape="round" />+              <pad name="5" x="0" y="20" drill="1" diameter="2" shape="round" />+              <pad name="6" x="0" y="25" drill="1" diameter="2" shape="round" />+            </package>+          </packages>+          <symbols>+            <symbol name="TESTPOINTS_1">+              <pin name="1" x="0" y="0" length="short" direction="pas" />+            </symbol>+            <symbol name="TESTPOINTS_6">+              <pin name="1" x="0" y="0" length="short" direction="pas" />+              <pin name="2" x="0" y="5" length="short" direction="pas" />+              <pin name="3" x="0" y="10" length="short" direction="pas" />+              <pin name="4" x="0" y="15" length="short" direction="pas" />+              <pin name="5" x="0" y="20" length="short" direction="pas" />+              <pin name="6" x="0" y="25" length="short" direction="pas" />+            </symbol>+          </symbols>+          <devicesets>+            <deviceset name="TESTPOINTS_1" prefix="J">+              <gates>+                <gate name="G$1" symbol="TESTPOINTS_1" x="0" y="0" />+              </gates>+              <devices>+                <device name="" package="TESTPOINTS_1">+                  <connects>+                    <connect gate="G$1" pin="1" pad="1" />+                  </connects>+                  <technologies>+                    <technology name="" />+                  </technologies>+                </device>+              </devices>+            </deviceset>+            <deviceset name="TESTPOINTS_6" prefix="J">+              <gates>+                <gate name="G$1" symbol="TESTPOINTS_6" x="0" y="0" />+              </gates>+              <devices>+                <device name="" package="TESTPOINTS_6">+                  <connects>+                    <connect gate="G$1" pin="1" pad="1" />+                    <connect gate="G$1" pin="2" pad="2" />+                    <connect gate="G$1" pin="3" pad="3" />+                    <connect gate="G$1" pin="4" pad="4" />+                    <connect gate="G$1" pin="5" pad="5" />+                    <connect gate="G$1" pin="6" pad="6" />+                  </connects>+                  <technologies>+                    <technology name="" />+                  </technologies>+                </device>+              </devices>+            </deviceset>+          </devicesets>+        </library>+      </libraries>+      <attributes />+      <variantdefs />+      <classes>+        <class number="0" name="default" width="0.25" drill="0.3" />+      </classes>+      <parts>+        <part name="J1" library="RoutingFixture" deviceset="TESTPOINTS_6" device="" value="ROUTING_TEST" />+        <part name="J2" library="RoutingFixture" deviceset="TESTPOINTS_6" device="" value="ROUTING_TEST" />+        <part name="J3" library="RoutingFixture" deviceset="TESTPOINTS_1" device="" value="ROUTING_TEST" />+      </parts>+      <sheets>+        <sheet>+          <plain />+          <instances>+            <instance part="J1" gate="G$1" x="7" y="7" />+            <instance part="J2" gate="G$1" x="47" y="7" />+            <instance part="J3" gate="G$1" x="27" y="38" />+          </instances>+          <busses />+          <nets>+            <net name="NET_1" class="0">+              <segment>+                <pinref part="J1" gate="G$1" pin="1" />+                <pinref part="J2" gate="G$1" pin="1" />+                <wire x1="7" y1="7" x2="47" y2="7" width="0.1524" layer="91" />+              </segment>+            </net>+            <net name="NET_2" class="0">+              <segment>+                <pinref part="J1" gate="G$1" pin="2" />+                <pinref part="J2" gate="G$1" pin="2" />+                <wire x1="7" y1="12" x2="47" y2="12" width="0.1524" layer="91" />+              </segment>+            </net>+            <net name="NET_3" class="0">+              <segment>+                <pinref part="J1" gate="G$1" pin="3" />+                <pinref part="J2" gate="G$1" pin="3" />+                <wire x1="7" y1="17" x2="47" y2="17" width="0.1524" layer="91" />+              </segment>+            </net>+            <net name="NET_4" class="0">+              <segment>+                <pinref part="J1" gate="G$1" pin="4" />+                <pinref part="J2" gate="G$1" pin="4" />+                <wire x1="7" y1="22" x2="47" y2="22" width="0.1524" layer="91" />+              </segment>+            </net>+            <net name="NET_5" class="0">+              <segment>+                <pinref part="J1" gate="G$1" pin="5" />+                <pinref part="J2" gate="G$1" pin="5" />+                <wire x1="7" y1="27" x2="47" y2="27" width="0.1524" layer="91" />+              </segment>+            </net>+            <net name="NET_6" class="0">+              <segment>+                <pinref part="J1" gate="G$1" pin="6" />+                <pinref part="J2" gate="G$1" pin="6" />+                <wire x1="7" y1="32" x2="47" y2="32" width="0.1524" layer="91" />+                <pinref part="J3" gate="G$1" pin="1" />+                <wire x1="27" y1="32" x2="27" y2="38" width="0.1524" layer="91" />+                <junction x="27" y="32" />+              </segment>+            </net>+          </nets>+        </sheet>+      </sheets>+    </schematic>+  </drawing>+</eagle>\ No newline at end of file
demo/routing/fixture/plan.jsonadded+155
@@ -0,0 +1,155 @@+[+  {+    "net": "NET_1",+    "layer": 1,+    "width": 0.25,+    "paths": [+      [+        {+          "pad": "J1.1"+        },+        [+          14,+          7+        ],+        [+          40,+          7+        ],+        {+          "pad": "J2.1"+        }+      ]+    ]+  },+  {+    "net": "NET_2",+    "layer": 1,+    "width": 0.25,+    "paths": [+      [+        {+          "pad": "J1.2"+        },+        [+          14,+          12+        ],+        [+          40,+          12+        ],+        {+          "pad": "J2.2"+        }+      ]+    ]+  },+  {+    "net": "NET_3",+    "layer": 1,+    "width": 0.25,+    "paths": [+      [+        {+          "pad": "J1.3"+        },+        {+          "x": 14,+          "y": 17,+          "layer": 16+        },+        {+          "x": 40,+          "y": 17,+          "layer": 1+        },+        {+          "pad": "J2.3"+        }+      ]+    ]+  },+  {+    "net": "NET_4",+    "layer": 1,+    "width": 0.25,+    "paths": [+      [+        {+          "pad": "J1.4"+        },+        [+          14,+          22+        ],+        [+          40,+          22+        ],+        {+          "pad": "J2.4"+        }+      ]+    ]+  },+  {+    "net": "NET_5",+    "layer": 1,+    "width": 0.25,+    "paths": [+      [+        {+          "pad": "J1.5"+        },+        [+          14,+          27+        ],+        [+          40,+          27+        ],+        {+          "pad": "J2.5"+        }+      ]+    ]+  },+  {+    "net": "NET_6",+    "layer": 1,+    "width": 0.25,+    "paths": [+      [+        {+          "pad": "J1.6"+        },+        [+          14,+          32+        ],+        [+          40,+          32+        ],+        {+          "pad": "J2.6"+        }+      ],+      [+        [+          27,+          32+        ],+        [+          27,+          35+        ],+        {+          "pad": "J3.1"+        }+      ]+    ]+  }+]
demo/routing/make_fixture.pyadded+91
@@ -0,0 +1,91 @@+"""Author an unrouted EAGLE routing coupon and a matching schematic, offline."""+from pathlib import Path+import copy+import json+import xml.etree.ElementTree as ET+++def make(directory):+    directory = Path(directory)+    directory.mkdir(parents=True, exist_ok=True)+    layers = ET.parse(Path(__file__).resolve().parents[2] / 'examples/ADS8588SIPM.fusion.lbr').find('drawing/layers')+    def new(kind):+        root = ET.Element('eagle', version='9.6.2')+        drawing = ET.SubElement(root, 'drawing')+        ET.SubElement(drawing, 'settings')+        ET.SubElement(drawing, 'grid', distance='0.1', unitdist='mm', unit='mm', style='lines', multiple='1', display='no', altdistance='0.01', altunitdist='mm', altunit='mm')+        drawing.append(copy.deepcopy(layers))+        return root, ET.SubElement(drawing, kind)+    lib = ET.Element('library', name='RoutingFixture')+    packages = ET.SubElement(lib, 'packages')+    symbols = ET.SubElement(lib, 'symbols')+    sets = ET.SubElement(lib, 'devicesets')+    for count in (1, 6):+        name = f'TESTPOINTS_{count}'+        pkg = ET.SubElement(packages, 'package', name=name)+        sym = ET.SubElement(symbols, 'symbol', name=name)+        ds = ET.SubElement(sets, 'deviceset', name=name, prefix='J')+        ET.SubElement(ET.SubElement(ds, 'gates'), 'gate', name='G$1', symbol=name, x='0', y='0')+        device = ET.SubElement(ET.SubElement(ds, 'devices'), 'device', name='', package=name)+        connects = ET.SubElement(device, 'connects')+        for i in range(1, count+1):+            ET.SubElement(pkg, 'pad', name=str(i), x='0', y=str((i-1)*5), drill='1', diameter='2', shape='round')+            ET.SubElement(sym, 'pin', name=str(i), x='0', y=str((i-1)*5), length='short', direction='pas')+            ET.SubElement(connects, 'connect', gate='G$1', pin=str(i), pad=str(i))+        ET.SubElement(ET.SubElement(device, 'technologies'), 'technology', name='')+    br, board = new('board')+    plain = ET.SubElement(board, 'plain')+    for a,b in zip([(0,0),(54,0),(54,44),(0,44)],[(54,0),(54,44),(0,44),(0,0)]):+        ET.SubElement(plain,'wire', x1=str(a[0]),y1=str(a[1]),x2=str(b[0]),y2=str(b[1]),width='0',layer='20')+    ET.SubElement(plain,'text',x='13',y='40',size='1.5',layer='21').text='FUSION TRACE ROUTING'+    ET.SubElement(board,'libraries').append(copy.deepcopy(lib))+    ET.SubElement(board,'attributes'); ET.SubElement(board,'variantdefs')+    ET.SubElement(ET.SubElement(board,'classes'),'class',number='0',name='default',width='0.25',drill='0.3')+    rules = ET.SubElement(board,'designrules',name='RoutingFixture')+    for name,value in {'layerSetup':'(1*16)','mdWireWire':'0.2mm','mdWirePad':'0.2mm','mdWireVia':'0.2mm','msWidth':'0.2mm','msDrill':'0.3mm','mdCopperDimension':'0.5mm'}.items():+        ET.SubElement(rules,'param',name=name,value=value)+    elements=ET.SubElement(board,'elements')+    positions={'J1':(7,7,6),'J2':(47,7,6),'J3':(27,38,1)}+    for ref,(x,y,n) in positions.items():+        ET.SubElement(elements,'element',name=ref,library='RoutingFixture',package=f'TESTPOINTS_{n}',value='ROUTING_TEST',x=str(x),y=str(y))+    signals=ET.SubElement(board,'signals'); plan=[]+    for i in range(1,7):+        s=ET.SubElement(signals,'signal',name=f'NET_{i}')+        for ref in ('J1','J2'): ET.SubElement(s,'contactref',element=ref,pad=str(i))+        if i==6: ET.SubElement(s,'contactref',element='J3',pad='1')+        y=7+(i-1)*5+        pts=[{'pad':f'J1.{i}'},[14,y],[40,y],{'pad':f'J2.{i}'}]+        if i==3: pts=[{'pad':'J1.3'},{'x':14,'y':y,'layer':16},{'x':40,'y':y,'layer':1},{'pad':'J2.3'}]+        paths=[pts]+        if i==6: paths.append([[27,y],[27,35],{'pad':'J3.1'}])+        plan.append({'net':f'NET_{i}','layer':1,'width':0.25,'paths':paths})+    sr,sch=new('schematic')+    ET.SubElement(sch,'libraries').append(copy.deepcopy(lib))+    ET.SubElement(sch,'attributes'); ET.SubElement(sch,'variantdefs')+    ET.SubElement(ET.SubElement(sch,'classes'),'class',number='0',name='default',width='0.25',drill='0.3')+    parts=ET.SubElement(sch,'parts')+    sheet=ET.SubElement(ET.SubElement(sch,'sheets'),'sheet'); ET.SubElement(sheet,'plain')+    instances=ET.SubElement(sheet,'instances')+    for ref,(x,y,n) in positions.items():+        ET.SubElement(parts,'part',name=ref,library='RoutingFixture',deviceset=f'TESTPOINTS_{n}',device='',value='ROUTING_TEST')+        ET.SubElement(instances,'instance',part=ref,gate='G$1',x=str(x),y=str(y))+    ET.SubElement(sheet,'busses'); nets=ET.SubElement(sheet,'nets')+    for i in range(1,7):+        net=ET.SubElement(nets,'net',{'name':f'NET_{i}','class':'0'})+        seg=ET.SubElement(net,'segment'); y=7+(i-1)*5+        for ref in ('J1','J2'): ET.SubElement(seg,'pinref',part=ref,gate='G$1',pin=str(i))+        ET.SubElement(seg,'wire',x1='7',y1=str(y),x2='47',y2=str(y),width='0.1524',layer='91')+        if i==6:+            ET.SubElement(seg,'pinref',part='J3',gate='G$1',pin='1')+            ET.SubElement(seg,'wire',x1='27',y1=str(y),x2='27',y2='38',width='0.1524',layer='91')+            ET.SubElement(seg,'junction',x='27',y=str(y))+    for suffix,root in [('brd',br),('sch',sr)]:+        ET.indent(root)+        (directory/f'fusion-routing.{suffix}').write_text('<?xml version="1.0" encoding="utf-8"?>\n<!DOCTYPE eagle SYSTEM "eagle.dtd">\n'+ET.tostring(root,encoding='unicode'))+    (directory/'plan.json').write_text(json.dumps(plan,indent=2)+'\n')+    return directory+++if __name__ == '__main__':+    import sys+    print(make(sys.argv[1]))
demo/routing/run_demo.pyadded+68
@@ -0,0 +1,68 @@+"""Record real Fusion window pixels while submitting one new copper item per call."""+import argparse+import json+from pathlib import Path+import time+from call import call+++def require(r):+    if not r.get('success',r.get('ok',False)):+        raise RuntimeError(json.dumps(r))+    return r+++def main():+    p=argparse.ArgumentParser()+    p.add_argument('--target',default='AdomLapper');p.add_argument('--document',default='fusion-routing')+    p.add_argument('--hwnd',type=int,required=True);p.add_argument('--output',type=Path,required=True)+    p.add_argument('--plan',type=Path,default=Path(__file__).parent/'fixture/plan.json')+    p.add_argument('--record',action='store_true');p.add_argument('--per-net',action='store_true')+    a=p.parse_args();a.output.mkdir(parents=True,exist_ok=True)+    counter=0+    def invoke(verb,args):+        nonlocal counter+        t=time.monotonic();r=call(verb,args,a.target)+        counter+=1+        (a.output/f'{counter:03d}-{verb}.json').write_text(json.dumps({'elapsedSeconds':time.monotonic()-t,'args':args,'result':r},indent=2)+'\n')+        return require(r)+    s=invoke('fusion_routing_state',{'expectDocument':a.document})+    if s['segmentCount'] or s['viaCount']:raise RuntimeError('Demo requires an unrouted board; existing copper is never erased by this script')+    guard=lambda s:{'expectDocument':a.document,'boardId':s['boardId'],'expectedRevision':s['revision']}+    plans=[]+    for row in json.loads(a.plan.read_text()):+        r=invoke('fusion_route_net',{**guard(s),**row,'dryRun':True})+        plans.append((row,r['plan']))+    invoke('fusion_execute_text_command',{'command':'Electron.ImmediateRepaint /full','expectDocument':a.document})+    recording=None;t0=time.monotonic()+    try:+        if a.record:+            recording=invoke('desktop_record_window_start',{'hwnd':a.hwnd,'fps':30,'reason':'Record real-time Fusion trace creation for the Adom routing demo'})+            time.sleep(1)+        for row,plan in plans:+            if a.per_net:+                s=invoke('fusion_route_net',{**guard(s),**row})+            else:+                for item in plan['items']:+                    if item['kind']=='segment':+                        route={'net':item['net'],'width':item['width'],'layer':item['layer'],'points':[item['start'],item['end']]}+                    else:+                        xy=item['at'];route={'net':item['net'],'layer':1,'viaDiameter':item['diameter'],'viaDrill':item['drill'],+                                           'points':[xy,{'x':xy[0],'y':xy[1],'layer':16}]}+                    s=invoke('fusion_route_net',{**guard(s),**route})+                    print(json.dumps({'net':row['net'],'segments':s['segmentCount'],'vias':s['viaCount'],'remainingNets':len(s['remainingNets'])}),flush=True)+                    # Deliberate readable pacing, included in the real-time take.+                    time.sleep(.2)+            s=invoke('fusion_routing_drc',guard(s))+            if s['drc']['errorCount']:raise RuntimeError('Native DRC found a physical violation')+        final=s+        if final['remainingNets'] or not final['drc']['clean']:raise RuntimeError('The board is not completely connected and DRC clean')+        (a.output/'result.json').write_text(json.dumps({'success':True,'elapsedSeconds':time.monotonic()-t0,'mode':'per-net' if a.per_net else 'per-trace','final':final},indent=2)+'\n')+        time.sleep(2)+    finally:+        if recording:+            rid=recording.get('recordingId') or recording.get('data',{}).get('recordingId')+            if not rid:raise RuntimeError('Recorder response has no ID: '+json.dumps(recording))+            invoke('desktop_record_window_stop',{'recordingId':rid,'reason':'Finalize the Fusion routing demo take'})++if __name__=='__main__':main()
demo/routing/screenshots/end.pngadded
⋯ 1 unchanged line ⋯
demo/routing/screenshots/start.pngadded
⋯ 1 unchanged line ⋯
demo/routing/videos/fusion-live-trace-routing.mp4added
⋯ 1 unchanged line ⋯
describe.py+10
@@ -13,6 +13,16 @@ _STATUS = "fusion_get_app_state"  # Compact source table: name -> (summary, input, output, timeout, statusVerb, longRunning, example) _T = [+    ("fusion_routing_state", "Read the live board's identity, geometry revision, pads, copper and per-net airwires from a fresh Fusion export.",+     {"expectDocument":"required exact active board name","boardId":"optional document creationId guard"},+     {"boardId":"str","revision":"str","nets":"list","pads":"list","segments":"list","vias":"list","remainingNets":"list"},60,"fusion_routing_state",False,{"expectDocument":"fusion-routing"}),+    ("fusion_route_net", "Create explicit net copper in the live Fusion canvas. Conservative clearance preflight, board/revision guards and exact copper readback. One or several trace segments per call; no general autorouting. Use routing_drc for native DRC.",+     {"expectDocument":"required exact board name","boardId":"required from routing_state","expectedRevision":"required from routing_state","net":"required exact name","points":"waypoints [x,y] or {pad} or {x,y,layer}","paths":"optional list of paths instead of points","width":"mm, default .25","layer":"1 or 16, default 1","viaDiameter":"mm, default .6","viaDrill":"mm, default .3","clearance":"mm lower bound, default .2","dryRun":"optional bool"},+     {"success":"bool","mutated":"bool","verified":"bool","revision":"str","plan":"obj","remainingNets":"list"},120,"fusion_routing_state",False,{}),+    ("fusion_routing_drc", "Run fresh native Autodesk DRC and read UL_BOARD.errors, including approved errors, warnings and airwires. Does not accept or clear any violation.",+     {"expectDocument":"required exact board name","boardId":"required","expectedRevision":"required"},+     {"drc":"{checked,clean,errorCount,warningCount,airwireCount,errors}","revision":"str"},120,"fusion_routing_state",False,{}),+     # ── Lifecycle ──────────────────────────────────────────────────────────     ("fusion_preflight_lbr", "PRE-ANALYZE a .lbr: will Fusion open it? Offline and instant - no Fusion needed, nothing launched. Runs the named checks the bridge learned from real Fusion rejections: file-readable, size-sane (truncated-transfer corpse detection), xml-parses, root-is-eagle, packages-nonempty (Fusion's silent 'No Components'), symbols-present, devicesets-present (missing ones make EDIT raise Create-new prompts), connects-resolve (dead wiring renders fine and connects nothing). fusion_open_lbr and fusion_create_library run the same gate automatically; call this directly to gate a batch BEFORE staging.", {"libraryPath": "str (Windows .lbr path)"}, {"success": "bool", "preflight": "{ok, checks[], errors[]}"}, 10, None, True, {"libraryPath": "C:/Temp/PART.lbr"}),     ("fusion_install_library_bundle", "COMPOSITE, the Fusion twin of kicad_install_library_bundle (#68): ONE call takes a staged Cloud Library bundle (zip of <Lib>.lbr + <Part>.step models, or a bare lbrPath with STEPs beside it), unpacks it safely, places it under ~/Documents/Adom Libraries/<name>/, pairs EVERY deviceset with its STEP by name (deviceset, package, normalised, prefix; a one-part library pairs its single model regardless), lints part numbers (partMetadata: MPN, manufacturer, Mouser/DigiKey/LCSC - reported, never blocking), pre-flights Fusion state (fusion{status}), and starts the same bind -> prove chain fusion_create_library runs. ASYNC BY CONTRACT: returns IMMEDIATELY with runId + statusVerb because a STEP bind is 3-15 minutes and cannot fit a relay window; poll fusion_prove_result (measured percent, four streamed proof frames per part, provedParts[], and an addin_restart_required payload the CALLER turns into the ask). PARTIAL SHIPS: a deviceset with no model is a NAMED skip in unbound[], the rest still bind; partsBound < partsTotal is the signal. Each part is minted on its own single-deviceset library (the Package3D generator loads the FIRST package of the open library, so a merged library would put every chip on part one's footprint), with the STEP placed exactly as published (orient:false, origin trusted), then all urns are bound into the merged library, and after prove the bound library is SAVED TO THE CLOUD under <project>/Adom Libraries so it appears in Fusion's Library Manager (cloudLibrary{saved, fileId, duplicatesBefore} in fusion_prove_result). Per-part scaffolding is deleted; the user is left with one library plus its per-package f3d folder. capture:false only places the files and returns. This is the one contract the wiki CLI (`library install --format fusion`) and the Export button both read; the recipe has one owner.", {"zipPath": "str (staged bundle zip on THIS machine) - or", "lbrPath": "str (staged .lbr, STEP models beside it)", "libraryName": "optional str (default: file stem)", "capture": "optional bool (default true: bind + prove; false: place only)"}, {"installed": "bool", "libraryPath": "str", "partsTotal": "int", "partsToBind": "int", "unbound": "[{package, why}]", "partMetadata": "{ok, summary, warnings[]}", "fusion": "{installed, running, addinReady, status, message}", "runId": "str", "statusVerb": "fusion_prove_result"}, 60, "fusion_prove_result", True, {"zipPath": "C:/Temp/MyLib.zip", "libraryName": "MyLib"}),
package.json+1−1
@@ -1,6 +1,6 @@ {   "slug": "fusion-bridge",-  "version": "1.9.366",+  "version": "1.10.0-dev.routing.1",   "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": {
rust/Cargo.lock+5−5
@@ -10,7 +10,7 @@ checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"  [[package]] name = "adom-fusion-bridge"-version = "1.9.366"+version = "1.10.0-dev.routing.1" dependencies = [  "base64",  "chrono",@@ -273,7 +273,7 @@ dependencies = [  [[package]] name = "fusion-core"-version = "1.9.366"+version = "1.10.0-dev.routing.1" dependencies = [  "serde",  "serde_json",@@ -283,7 +283,7 @@ dependencies = [  [[package]] name = "fusion-lbr"-version = "1.9.366"+version = "1.10.0-dev.routing.1" dependencies = [  "regex",  "roxmltree",@@ -295,14 +295,14 @@ dependencies = [  [[package]] name = "fusion-os-mac"-version = "1.9.366"+version = "1.10.0-dev.routing.1" dependencies = [  "fusion-core", ]  [[package]] name = "fusion-os-win"-version = "1.9.366"+version = "1.10.0-dev.routing.1" dependencies = [  "fusion-core",  "windows-sys 0.59.0",
rust/Cargo.toml+1−1
@@ -4,7 +4,7 @@ members = ["core", "lbr", "os-win", "os-mac", "bridge"]  # One version for the whole bridge, in lockstep with BRIDGE_VERSION (tools/release.sh bumps both). [workspace.package]-version = "1.9.366"+version = "1.10.0-dev.routing.1" edition = "2021" license = "MIT" 
rust/bridge/src/main.rs+10
@@ -38,6 +38,7 @@ mod demo; mod addin_install; mod janitor; mod electronics;+mod routing; mod tour; mod palette; use fusion_core::ab::Caller;@@ -381,6 +382,15 @@ fn main() {                     "fusion_create_library" | "create_library" if chains_owner_is_exe(&**h) => chains::create_library(Arc::new(ExeChainHost { sidecar: sidecar.clone(), caller: caller.clone(), state_dir: h.bridge_state_dir() }), parsed["args"].clone()),                     "fusion_install_library_bundle" | "install_library_bundle" if chains_owner_is_exe(&**h) => chains::install_library_bundle(Arc::new(ExeChainHost { sidecar: sidecar.clone(), caller: caller.clone(), state_dir: h.bridge_state_dir() }), parsed["args"].clone()),                     "fusion_prove_result" | "prove_result" if chains_owner_is_exe(&**h) => { let mut r = chains::prove_result(&parsed["args"]); r["shell"] = json!("rust"); r },+                    v if routing::owns(v.strip_prefix("fusion_").unwrap_or(v)) => {+                        let (sc, ca) = (sidecar.clone(), caller.clone());+                        let side = |verb: &str, a: Value, t: u64| proxy_with_timeout(&sc, &json!({"command":verb,"args":a}).to_string(), &ca, t);+                        let dlg = |r: Value| r;+                        let ctx = addin::Ctx { host: &**h, fusion_exe:h.fusion_executable(), short_path:|p|host().short_path(p), state_dir:h.bridge_state_dir(), caller:caller.clone(), pids:h.fusion_processes().iter().map(|p|p.pid).collect(), sidecar:&side, dialogs:&dlg };+                        let cmd=v.strip_prefix("fusion_").unwrap_or(v);+                        let mut r=routing::call(cmd,&parsed["args"],&|v,a|addin::pass_through(v,&a,&ctx));+                        r["bridgeVersion"]=json!(VERSION); r["shell"]=json!("rust"); r+                    },                     v if addin_owner_is_exe(&**h) && addin::owns(v.strip_prefix("fusion_").unwrap_or(v)) => {                         let cmd = v.strip_prefix("fusion_").unwrap_or(v).to_string();                         let (sc, ca) = (sidecar.clone(), caller.clone());
rust/bridge/src/routing.rsadded+29
@@ -0,0 +1,29 @@+//! Routing operations execute together on Fusion's main thread through the existing+//! script transport. Embedding the implementation avoids replacing a loaded add-in.+use serde_json::{json, Value};+const SOURCE: &str = include_str!("routing_script.py");+pub fn owns(cmd: &str) -> bool { matches!(cmd, "routing_state" | "route_net" | "routing_drc") }+pub fn call(cmd: &str, args: &Value, pass: &dyn Fn(&str, Value) -> Value) -> Value {+    let script = format!("import json\nexec({})\nresult=handle(app,json.loads({}),{})\n",+        serde_json::to_string(SOURCE).unwrap(),+        serde_json::to_string(&args.to_string()).unwrap(),+        serde_json::to_string(cmd).unwrap());+    let r = pass("run_modeling_script", json!({"script":script,"expectDocument":args["expectDocument"]}));+    if r["success"].as_bool() == Some(false) { return r; }+    match r["data"]["result"].as_object() {+        Some(_) => r["data"]["result"].clone(),+        None => json!({"success":false,"errorCode":"invalid_routing_response","error":"Fusion did not return a structured routing result", "mutationMayHaveOccurred":cmd=="route_net"}),+    }+}++#[cfg(test)] mod tests {+    use super::*;+    #[test] fn unwraps_semantic_failure() {+        let r=call("route_net",&json!({}),&|_,_|json!({"success":true,"data":{"result":{"success":false,"errorCode":"stale_board"}}}));+        assert_eq!(r["errorCode"],"stale_board");+    }+    #[test] fn transport_failure_is_preserved() {+        let r=call("route_net",&json!({}),&|_,_|json!({"success":false,"errorCode":"timeout"}));+        assert_eq!(r["errorCode"],"timeout");+    }+}
rust/bridge/src/routing_script.pyadded+326
@@ -0,0 +1,326 @@+"""Explicit live Fusion copper edits; embedded by routing.rs, run on Fusion's main thread.++No open-file rewrites, UI clicks, add-in replacement or application restart.+The geometry preflight is deliberately conservative and is NOT Autodesk DRC.+"""+import collections+import hashlib+import json+import math+from pathlib import Path+import re+import tempfile+import xml.etree.ElementTree as ET+import zipfile+++class RoutingError(Exception):+    def __init__(self, code, message):+        super().__init__(message)+        self.code = code+++def fail(code, message):+    raise RoutingError(code, message)+++def number(v, positive=False):+    if isinstance(v, bool) or not isinstance(v, (int, float)) or not math.isfinite(v):+        fail('invalid_geometry', 'Coordinates and dimensions must be finite numbers')+    if abs(v) > 2000 or (positive and v < 0.0001):+        fail('invalid_geometry', 'Geometry is outside supported millimetre bounds')+    return round(v, 6)+++def identifier(v):+    # The command language also interprets wildcards. Fail closed on all metacharacters.+    if not isinstance(v, str) or not re.fullmatch(r'[A-Za-z0-9_+./:$-]{1,128}', v):+        fail('invalid_net', 'Net names must use letters, digits, _ + . / : $ or -')+    return v+++def snapshot(app, args):+    doc = app.activeDocument+    if not doc or app.activeProduct.productType != 'BoardProductType':+        fail('wrong_document', 'Activate a PCB board before reading or routing it')+    if args.get('expectDocument') != doc.name:+        fail('wrong_document', 'expectDocument must match the active board name exactly')+    identity = str(doc.creationId)+    if args.get('boardId') is not None and args['boardId'] != identity:+        fail('board_mismatch', 'boardId does not identify the active Fusion document')+    with tempfile.TemporaryDirectory(prefix='adom-routing-') as d:+        p = Path(d) / 'snapshot.fbrd'+        app.executeTextCommand('Document.CopyToDesktop ' + p.as_posix())+        with zipfile.ZipFile(p) as z:+            entries = [n for n in z.namelist() if n.endswith('.brd')]+            if len(entries) != 1:+                fail('ambiguous_export', 'Expected exactly one board XML in the fresh Fusion export')+            raw = z.read(entries[0])+    root = ET.fromstring(raw)+    board = root.find('drawing/board')+    if board is None:+        fail('invalid_export', 'Fusion did not export an EAGLE board')+    # Exclude formatting/airwire ordering/view preferences from the revision.+    # Include ALL physical geometry, constraints and net membership.+    def canonical(node):+        if node.tag == 'wire' and node.get('layer') == '19':+            return None+        return [node.tag, sorted(node.attrib.items()), (node.text or '').strip(),+                [v for ch in node if (v := canonical(ch)) is not None]]+    relevant = [canonical(n) for n in board if n.tag not in ('errors', 'autorouter')]+    revision = hashlib.sha256(json.dumps(relevant, separators=(',', ':')).encode()).hexdigest()+    return root, board, {'boardId': identity, 'documentName': doc.name, 'revision': revision}+++def objects(board):+    nets = {s.get('name'): s for s in board.findall('signals/signal')}+    contacts = {(c.get('element'), c.get('pad')): name for name, s in nets.items() for c in s.findall('contactref')}+    pads, wires, vias = {}, [], []+    packages = {(l.get('name'), p.get('name')): p for l in board.findall('libraries/library') for p in l.findall('packages/package')}+    for el in board.findall('elements/element'):+        pkg = packages.get((el.get('library'), el.get('package')))+        if pkg is None:+            fail('unsupported_board', 'Missing embedded footprint definition')+        rotation = el.get('rot', 'R0')+        mirrored = 'M' in rotation+        angle = math.radians(float(re.search(r'R(-?[\d.]+)', rotation).group(1)))+        for pad in list(pkg.findall('pad')) + list(pkg.findall('smd')):+            x, y = float(pad.get('x')), float(pad.get('y'))+            x, y = x*math.cos(angle)-y*math.sin(angle), x*math.sin(angle)+y*math.cos(angle)+            if mirrored: x = -x+            x, y = x+float(el.get('x')), y+float(el.get('y'))+            key = el.get('name')+'.'+pad.get('name')+            if pad.tag == 'pad':+                # Outer bounding circle for non-round shapes; conservative for clearance.+                diameter = float(pad.get('diameter', '0'))+                if diameter <= 0: diameter = float(pad.get('drill')) * 2 + 0.6+                radius = diameter * (1 if pad.get('shape') in ('long','offset') else math.sqrt(2)/2)+                layers = [1,16]+            else:+                radius = math.hypot(float(pad.get('dx')), float(pad.get('dy'))) / 2+                layer = int(pad.get('layer'))+                layers = [17-layer if mirrored else layer]+            pads[key] = {'name':key, 'net':contacts.get((el.get('name'),pad.get('name'))),+                         'at':[round(x,6),round(y,6)], 'radius':radius, 'layers':layers}+    for name,s in nets.items():+        for w in s.findall('wire'):+            if int(w.get('layer')) == 19: continue+            wires.append({'net':name, 'start':[float(w.get('x1')),float(w.get('y1'))],+                          'end':[float(w.get('x2')),float(w.get('y2'))], 'width':float(w.get('width')),+                          'layer':int(w.get('layer')), 'curve':float(w.get('curve','0'))})+        for v in s.findall('via'):+            vias.append({'net':name,'at':[float(v.get('x')),float(v.get('y'))],+                         'diameter':float(v.get('diameter','0')), 'drill':float(v.get('drill')),+                         'extent':v.get('extent')})+    return nets,pads,wires,vias+++def state(board, meta):+    nets,pads,wires,vias=objects(board)+    rows=[]+    for name,s in nets.items():+        airwires=[{'start':[float(w.get('x1')),float(w.get('y1'))], 'end':[float(w.get('x2')),float(w.get('y2'))]}+                  for w in s.findall('wire') if w.get('layer')=='19']+        rows.append({'name':name,'pads':[p['name'] for p in pads.values() if p['net']==name],+                     'airwires':airwires,'airwireCount':len(airwires),+                     'segments':sum(w['net']==name for w in wires),'vias':sum(v['net']==name for v in vias)})+    return {**meta,'units':'mm','nets':rows,'pads':list(pads.values()),'segments':wires,'vias':vias,+            'segmentCount':len(wires),'viaCount':len(vias),'airwireCount':sum(n['airwireCount'] for n in rows),+            'remainingNets':[n['name'] for n in rows if n['airwireCount']],+            'connectivitySource':'Fusion exported airwires; mutation paths recompute RATSNEST',+            'drc':{'checked':False,'note':'Use fusion_routing_drc for a fresh Autodesk DRC'}}+++def point_distance(p,a,b):+    dx,dy=b[0]-a[0],b[1]-a[1]+    t=max(0,min(1,((p[0]-a[0])*dx+(p[1]-a[1])*dy)/(dx*dx+dy*dy))) if dx or dy else 0+    return math.hypot(p[0]-a[0]-t*dx,p[1]-a[1]-t*dy)+++def distance(a,b,c,d):+    def cross(p,q,r): return (q[0]-p[0])*(r[1]-p[1])-(q[1]-p[1])*(r[0]-p[0])+    if cross(a,b,c)*cross(a,b,d)<0 and cross(c,d,a)*cross(c,d,b)<0: return 0+    return min(point_distance(a,c,d),point_distance(b,c,d),point_distance(c,a,b),point_distance(d,a,b))+++def plan(board,args):+    nets,pads,wires,vias=objects(board)+    net=identifier(args.get('net'))+    if net not in nets: fail('unknown_net','No exact net named '+net)+    setup=board.find("designrules/param[@name='layerSetup']")+    if setup is None or setup.get('value') != '(1*16)':+        fail('unsupported_board','Initial routing supports two-layer (1*16) boards')+    # Do not silently overlook obstacles this conservative preflight cannot represent.+    if board.findall('.//polygon') or any(w['curve'] for w in wires):+        fail('unsupported_board','Polygons and curved copper require a richer clearance preflight')+    for n in board.findall('plain/*') + board.findall('libraries/library/packages/package/*'):+        if n.tag not in ('pad','smd') and n.get('layer') in ('1','16','41','42','43','46'):+            fail('unsupported_board','Copper, restrict or milling artwork is not supported by this preflight')+    def layer(v):+        if isinstance(v,bool) or v not in (1,16): fail('invalid_layer','Only copper layers 1 and 16 are supported')+        return int(v)+    width=number(args.get('width',0.25),True)+    dia=number(args.get('viaDiameter',0.6),True); drill=number(args.get('viaDrill',0.3),True)+    if drill>=dia: fail('invalid_geometry','Via drill must be smaller than its diameter')+    paths=args.get('paths',[args.get('points')])+    if not isinstance(paths,list) or not 1<=len(paths)<=32: fail('invalid_path','Supply 1..32 paths')+    planned=[]+    for path in paths:+        if not isinstance(path,list) or not 2<=len(path)<=256: fail('invalid_path','Each path needs 2..256 waypoints')+        current=layer(args.get('layer',1)); previous=None+        for spec in path:+            pad=None; outgoing=current+            if isinstance(spec,dict):+                if 'pad' in spec:+                    pad=pads.get(spec['pad'])+                    if pad is None: fail('unknown_pad','Unknown pad '+str(spec['pad']))+                    if pad['net']!=net: fail('net_mismatch','Pad '+pad['name']+' does not belong to '+net)+                    xy=pad['at']+                else: xy=[spec.get('x'),spec.get('y')]+                outgoing=layer(spec.get('layer',current))+            elif isinstance(spec,list) and len(spec)==2: xy=spec+            else: fail('invalid_path','Waypoints are [x,y], {x,y,layer?}, or {pad,layer?}')+            xy=[number(v) for v in xy]+            if pad and current not in pad['layers']: fail('pad_layer_mismatch','Pad has no copper on incoming layer')+            if previous is not None and previous!=xy:+                planned.append({'kind':'segment','net':net,'start':previous,'end':xy,'layer':current,'width':width})+            if outgoing!=current:+                planned.append({'kind':'via','net':net,'at':xy,'diameter':dia,'drill':drill,'extent':'1-16'})+            current=outgoing; previous=xy+    if not planned or len(planned)>512: fail('invalid_path','Need 1..512 nonzero copper items')+    def rule(name,default):+        node=board.find("designrules/param[@name='%s']"%name)+        if node is None: return default+        value=node.get('value',''); m=re.fullmatch(r'([0-9.]+)(mm|mil)',value)+        if not m: fail('unsupported_rules','Cannot interpret '+name+'='+value)+        return float(m[1])*(0.0254 if m[2]=='mil' else 1)+    clearance=max(number(args.get('clearance',0.2),True),*(rule(k,0.2) for k in+                  ('mdWireWire','mdWirePad','mdWireVia','mdPadPad','mdPadVia','mdViaVia')))+    # Honor the requested net class and global minimums; cross-class clearance below.+    classes=board.findall('classes/class')+    selected=next((c for c in classes if c.get('number')==nets[net].get('class','0')),None)+    if selected is not None:+        clearance=max([clearance]+[float(c.get('value')) for c in selected.findall('clearance')])+        if width<float(selected.get('width','0')) or drill<float(selected.get('drill','0')):+            fail('design_rule_violation','Width/drill is below this net class minimum')+    if width<rule('msWidth',0.2) or drill<rule('msDrill',0.3):+        fail('design_rule_violation','Width/drill is below the board minimum')+    boundary=board.findall("plain/wire[@layer='20']")+    if len(boundary)!=4 or any(float(w.get('curve','0')) for w in boundary):+        fail('unsupported_board','Initial preflight requires a rectangular four-line outline')+    edges=[([float(w.get('x1')),float(w.get('y1'))],[float(w.get('x2')),float(w.get('y2'))]) for w in boundary]+    xs=[p[0] for e in edges for p in e]; ys=[p[1] for e in edges for p in e]+    xmin,xmax,ymin,ymax=min(xs),max(xs),min(ys),max(ys)+    expected={tuple(sorted(e)) for e in [((xmin,ymin),(xmax,ymin)),((xmax,ymin),(xmax,ymax)),((xmax,ymax),(xmin,ymax)),((xmin,ymax),(xmin,ymin))]}+    if {tuple(sorted(map(tuple,e))) for e in edges}!=expected: fail('unsupported_board','Outline is not a closed rectangle')+    obstacles=[]+    for p in pads.values(): obstacles.append((p['net'],p['at'],p['at'],p['radius'],p['layers']))+    for w in wires: obstacles.append((w['net'],w['start'],w['end'],w['width']/2,[w['layer']]))+    for v in vias: obstacles.append((v['net'],v['at'],v['at'],max(v['diameter'],v['drill']*2+0.6)/2,[1,16]))+    for h in board.findall('plain/hole'):+        xy=[float(h.get('x')),float(h.get('y'))]; obstacles.append((None,xy,xy,float(h.get('drill'))/2,[1,16]))+    if board.findall('libraries/library/packages/package/hole'):+        fail('unsupported_board','Footprint mounting holes require transformed obstacle support')+    for item in planned:+        via=item['kind']=='via'; a=item['at'] if via else item['start']; b=a if via else item['end']+        radius=item['diameter']/2 if via else item['width']/2; layers=[1,16] if via else [item['layer']]+        margin=rule('mdCopperDimension',0.5)+radius+        if any(not(xmin+margin<=p[0]<=xmax-margin and ymin+margin<=p[1]<=ymax-margin) for p in (a,b)):+            fail('clearance_violation','Candidate copper violates the board-edge margin')+        for other,c,d,r,ls in obstacles:+            if other==net or not set(layers).intersection(ls): continue+            gap=distance(a,b,c,d)-radius-r+            if gap<clearance-1e-6: fail('clearance_violation','Candidate copper approaches another net or hole closer than %.3f mm'%clearance)+    return {'net':net,'items':planned,'clearance':clearance,'preflight':'Conservative geometry only; run native Autodesk DRC after edits'}+++def native_drc(app):+    with tempfile.TemporaryDirectory(prefix='adom-routing-drc-') as d:+        out=Path(d)/'drc.tsv'; ulp=Path(d)/'drc.ulp'+        ulp.write_text('board(B) { output("'+out.as_posix()+'") { printf("CHECKED\\t%d\\n", B.checked); B.errors(E) { printf("ERROR\\t%d\\t%d\\t%d\\t%s\\n", E.code, E.type, E.state, E.description); } } }')+        app.executeTextCommand('Electron.run DRC;')+        app.executeTextCommand("Electron.run RUN '"+ulp.as_posix()+"';")+        lines=out.read_text().splitlines()+    checked=bool(lines and lines[0]=='CHECKED\t1'); errors=[]+    for line in lines[1:]:+        _,code,kind,status,description=line.split('\t',4)+        errors.append({'code':int(code),'type':int(kind),'state':int(status),'description':description})+    return {'checked':checked,'source':'Autodesk DRC + UL_BOARD.errors', 'errors':errors,+            'errorCount':sum(e['code']!=21 and e['type']!=2 for e in errors),+            'warningCount':sum(e['type']==2 for e in errors),+            'airwireCount':sum(e['code']==21 for e in errors),+            'clean':checked and not errors}+++def item_key(item):+    if 'start' in item:+        return ('segment',item['net'],item['layer'],round(item['width'],6),tuple(sorted((tuple(item['start']),tuple(item['end'])))))+    return ('via',item['net'],tuple(item['at']),round(item['drill'],6),round(item['diameter'],6),item['extent'])+++def copper_signature(items):+    """Compare occupied centerline intervals, tolerating Fusion splitting/merging wires."""+    groups=collections.defaultdict(list); vs=[]+    for item in items:+        if 'start' not in item:+            vs.append(item_key(item));continue+        a,b=map(tuple,(item['start'],item['end']))+        if a>b:a,b=b,a+        dx,dy=b[0]-a[0],b[1]-a[1];length=math.hypot(dx,dy)+        if not length:continue+        ux,uy=dx/length,dy/length+        key=(item['net'],item['layer'],round(item['width'],6),round(ux,7),round(uy,7),round(-uy*a[0]+ux*a[1],6))+        groups[key].append((round(ux*a[0]+uy*a[1],6),round(ux*b[0]+uy*b[1],6)))+    result=[]+    for key,spans in sorted(groups.items()):+        merged=[]+        for a,b in sorted(spans):+            if merged and a<=merged[-1][1]+1e-6:merged[-1][1]=max(merged[-1][1],b)+            else:merged.append([a,b])+        result.append((key,merged))+    return result,sorted(vs)+++def handle(app,args,action):+    attempted=False; commands=[]+    try:+        root,board,meta=snapshot(app,args)+        if action=='routing_state': return {'success':True,**state(board,meta)}+        if args.get('boardId')!=meta['boardId']: fail('board_mismatch','Mutations/checks require boardId from fusion_routing_state')+        if args.get('expectedRevision')!=meta['revision']: fail('stale_board','expectedRevision must match the current live board')+        if action=='routing_drc':+            app.executeTextCommand('Electron.run RATSNEST;')+            report=native_drc(app)+            _,board,meta=snapshot(app,args)+            return {'success':report['checked'],**state(board,meta),'drc':report}+        if action!='route_net': fail('unknown_action','Unknown routing action')+        candidate=plan(board,args)+        if 'dryRun' in args and not isinstance(args['dryRun'],bool): fail('invalid_args','dryRun must be boolean')+        if args.get('dryRun') is True: return {'success':True,'mutated':False,**meta,'plan':candidate}+        before=objects(board); before_items=copper_signature(before[2]+before[3])+        # Every emitted edit is complete (no mouse-bound interactive operation).+        # Explicit mm coordinates/width suffixes avoid changing the document grid.+        for item in candidate['items']:+            if item['kind']=='segment':+                a,b=item['start'],item['end']+                command="LAYER %d; LINE '%s' %.6fmm (%.6fmm %.6fmm) (%.6fmm %.6fmm);"%(item['layer'],candidate['net'],item['width'],*a,*b)+            else:+                command="VIA '%s' %.6fmm ROUND 1-16 (%.6fmm %.6fmm); CHANGE DRILL %.6fmm (%.6fmm %.6fmm);"%(candidate['net'],item['diameter'],*item['at'],item['drill'],*item['at'])+            attempted=True+            app.executeTextCommand('Electron.run '+command)+            commands.append(command)+        app.executeTextCommand('Electron.run RATSNEST;')+        app.executeTextCommand('Electron.ImmediateRepaint /full')+        _,after,after_meta=snapshot(app,args)+        after_objs=objects(after); actual=copper_signature(after_objs[2]+after_objs[3])+        expected=copper_signature(before[2]+before[3]+candidate['items'])+        # Compare full copper coverage: a branch may split an existing straight wire.+        verified=actual==expected+        return {'success':verified,'mutated':actual!=before_items,'verified':verified,+                'errorCode':None if verified else 'readback_mismatch',+                'error':None if verified else 'Fusion copper differs from the exact requested delta; inspect current state before continuing',+                'commands':commands,'plan':candidate,**state(after,after_meta)}+    except Exception as exc:+        return {'success':False,'errorCode':getattr(exc,'code','routing_failed'),'error':str(exc),+                'mutationAttempted':attempted,'completedCommands':commands,+                '_hint':'Read fusion_routing_state before retrying. No automatic replay or blind Undo is performed.'}
server.py+7
@@ -15756,6 +15756,13 @@ def _dispatch_command_inner(command: str, args: dict, caller_identity: dict = No         return _orchestrate_board_stackup(args)      # Add-in proxy commands+    if command in ("routing_state", "route_net", "routing_drc"):+        import pathlib+        source = (pathlib.Path(__file__).parent / "rust/bridge/src/routing_script.py").read_text()+        script = "import json\nexec(%r)\nresult=handle(app,json.loads(%r),%r)\n" % (source, json.dumps(args), command)+        reply = _proxy_to_addin("run_modeling_script", {"script":script, "expectDocument":args.get("expectDocument")}, timeout=120)+        return reply.get("data", {}).get("result", reply)+     if command in ADDIN_COMMANDS:         # ⛔ RAW close_document GATE (John caught the modal standing twice, 2026-08-21):         # web control calls this verb directly, bypassing _close_bridge_doc_verified's
skills/fusion-routing/SKILL.mdadded+31
@@ -0,0 +1,31 @@+---+name: fusion-routing+description: Route explicit net paths live in Fusion and record trace creation using fusion_routing_state, fusion_route_net and fusion_routing_drc. Development feature with two-layer geometric preflight and native final DRC.+---++Read `fusion_routing_state {expectDocument}` and keep its `boardId` and `revision`.+Use an isolated test board until this development feature is promoted. Existing+user designs and pinned runtimes must be preserved.++Call `fusion_route_net` with the exact `expectDocument`, `boardId`,+`expectedRevision`, `net`, and `points` or `paths`. Coordinates/widths are mm;+copper layers are 1 and 16. Use `{pad:"J1.1"}` for pad coordinates or+`{x:14,y:17,layer:16}` to change outgoing layer with a through via.++`dryRun:true` checks all geometry without adding copper. Geometric preflight is+conservative and incomplete; it refuses unsupported boards. Every actual call+verifies the copper delta by a new Fusion export. Inspect semantic `success`,+`verified`, and `mutationAttempted`. A timeout or mismatch is not authorization+to replay. Commands are not an atomic Undo group.++For live playback, submit one segment/via per call with the consecutive returned+revision. Capture the actual window with `desktop_record_window_start` and+finalize with `desktop_record_window_stop`, including in error paths. Never+replace live copper with a simulated animation. Foreground is opt-in.++Finish with `fusion_routing_drc` using the same identity/revision guards. It+recomputes RATSNEST, runs native Autodesk DRC, and reads all errors including+approved ones. Require `drc.checked`, `drc.clean`, and no remaining nets before+claiming a connected, DRC-clean result. Save/export the final board separately.++See `demo/routing/README.md` for the tested scope, fixture, recorder and evidence.
tests/test_routing.pyadded+72
@@ -0,0 +1,72 @@+import copy+import importlib.util+from pathlib import Path+import unittest+import xml.etree.ElementTree as ET++ROOT=Path(__file__).resolve().parents[1]+spec=importlib.util.spec_from_file_location('routing',ROOT/'rust/bridge/src/routing_script.py')+r=importlib.util.module_from_spec(spec);spec.loader.exec_module(r)++class RoutingTests(unittest.TestCase):+    def setUp(self):+        self.board=ET.parse(ROOT/'demo/routing/fixture/fusion-routing.brd').find('drawing/board')+        self.args={'net':'NET_1','points':[{'pad':'J1.1'},[14,7],[40,7],{'pad':'J2.1'}]}+    def rejected(self,code):+        with self.assertRaises(r.RoutingError) as e:r.plan(self.board,self.args)+        self.assertEqual(code,e.exception.code)+    def test_six_net_fixture(self):+        import json+        for a in json.loads((ROOT/'demo/routing/fixture/plan.json').read_text()):+            p=r.plan(self.board,a)+            self.assertGreater(len(p['items']),0)+            if a['net']=='NET_3':self.assertEqual(2,sum(x['kind']=='via' for x in p['items']))+            if a['net']=='NET_6':self.assertEqual(5,len(p['items']))+    def test_wrong_net_pad(self):+        self.args['points'][0]={'pad':'J1.2'};self.rejected('net_mismatch')+    def test_injected_command(self):+        self.args['net']="NET_1';RIPUP;";self.rejected('invalid_net')+    def test_wildcards(self):+        self.args['net']='NET_*';self.rejected('invalid_net')+    def test_nan(self):+        self.args['width']=float('nan');self.rejected('invalid_geometry')+    def test_bool(self):+        self.args['width']=True;self.rejected('invalid_geometry')+    def test_invalid_via(self):+        self.args.update(viaDrill=.7,viaDiameter=.6);self.rejected('invalid_geometry')+    def test_wrong_layer(self):+        self.args['layer']=19;self.rejected('invalid_layer')+    def test_crossing_other_pad(self):+        self.args['points']=[[7,7],[7,17]];self.rejected('clearance_violation')+    def test_crossing_other_trace(self):+        s=self.board.find("signals/signal[@name='NET_2']")+        ET.SubElement(s,'wire',x1='20',y1='5',x2='20',y2='10',width='.25',layer='1')+        self.rejected('clearance_violation')+    def test_crossing_opposite_layer(self):+        s=self.board.find("signals/signal[@name='NET_2']")+        ET.SubElement(s,'wire',x1='20',y1='5',x2='20',y2='10',width='.25',layer='16')+        self.assertEqual(3,len(r.plan(self.board,self.args)['items']))+    def test_board_edge(self):+        self.args['points']=[[7,7],[-1,7]];self.rejected('clearance_violation')+    def test_bad_outline(self):+        self.board.find("plain/wire").set('x2','53');self.rejected('unsupported_board')+    def test_rules(self):+        self.args['width']=.1;self.rejected('design_rule_violation')+    def test_polygon_not_silently_ignored(self):+        ET.SubElement(self.board.find('signals/signal'),'polygon',width='.2',layer='1')+        self.rejected('unsupported_board')+    def test_revision_guard_before_mutation(self):+        saved=r.snapshot+        r.snapshot=lambda app,args:(None,self.board,{'boardId':'board','revision':'now'})+        try:+            res=r.handle(None,{'boardId':'board','expectedRevision':'old'},'route_net')+            self.assertEqual('stale_board',res['errorCode']);self.assertFalse(res['mutationAttempted'])+        finally:r.snapshot=saved+    def test_identity_guard(self):+        saved=r.snapshot;r.snapshot=lambda app,args:(None,self.board,{'boardId':'board','revision':'now'})+        try:+            res=r.handle(None,{'boardId':'other','expectedRevision':'now'},'route_net')+            self.assertEqual('board_mismatch',res['errorCode']);self.assertFalse(res['mutationAttempted'])+        finally:r.snapshot=saved++if __name__=='__main__':unittest.main()
tools/install-routing-dev.ps1added+21
@@ -0,0 +1,21 @@+param(+    [Parameter(Mandatory=$true)][string]$Cache,+    [Parameter(Mandatory=$true)][string]$Staged,+    [string]$Version='1.10.0-dev.routing.1'+)+$ErrorActionPreference='Stop'+if (!(Test-Path "$cache/.dev-pin")) { throw 'Fusion bridge is not dev-pinned' }+$backup="$cache/routing-backup-$(Get-Date -Format yyyyMMdd-HHmmss)"+if (Test-Path $backup) { throw 'Backup already exists; inspect before retrying' }+New-Item -ItemType Directory -Path $backup | Out-Null+foreach ($name in @('adom-fusion-bridge.exe','BRIDGE_VERSION','bridge.json')) { Copy-Item "$cache/$name" "$backup/$name" }+Copy-Item $staged "$cache/adom-fusion-bridge.exe" -Force+$manifest=Get-Content "$cache/bridge.json" -Raw | ConvertFrom-Json+$manifest.version=$Version+[IO.File]::WriteAllText("$cache/bridge.json",($manifest | ConvertTo-Json -Depth 30),[Text.UTF8Encoding]::new($false))+[IO.File]::WriteAllText("$cache/BRIDGE_VERSION","$Version`n",[Text.UTF8Encoding]::new($false))+$installed=(Get-FileHash "$cache/adom-fusion-bridge.exe" -Algorithm SHA256).Hash+$expected=(Get-FileHash $staged -Algorithm SHA256).Hash+if ($installed -ne $expected) { throw 'Installed hash mismatch' }+@{backup=$backup;sha256=$installed;version=$manifest.version} | ConvertTo-Json+exit 0