app
Fusion - the Fusion 360 Bridge
Public Made by Adomby adom
Drive Autodesk Fusion 360 from the cloud via Adom Bridge: component libraries, IPC package generation, board layout, exports (STEP/Gerbers/BOM/CPL), fast APS cloud search, and parametric modeling.
← Commit history
Add live Fusion net routing with verified copper and recorded demo
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+1.10.0-dev.routing.1
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"><b>Fusion Electronics Design Rules</b>+<p>+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+}
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"+}
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"+}
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>
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>
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