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 captioned 3x Fusion routing showcase and Windows playback evidence
9 files changed
+369
demo/routing/README.md+14demo/routing/evidence/showcase-delivery.json+12demo/routing/evidence/showcase-player-open.json+9demo/routing/evidence/showcase-player-verification.json+26demo/routing/evidence/showcase-video-validation.json+188demo/routing/render_showcase.py+58demo/routing/videos/fusion-routing-showcase-3x.ass+24demo/routing/videos/fusion-routing-showcase-3x.edit.json+38demo/routing/videos/fusion-routing-showcase-3x.mp4demo/routing/README.md+14@@ -126,3 +126,17 @@ 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`.++## Captioned showcase++`python3 demo/routing/render_showcase.py` creates+`videos/fusion-routing-showcase-3x.mp4` from the preserved final raw take.+It keeps the full sequence, plays routing at a labeled 3x speed, and adds a+five-second final hold. No idle intervals are removed from this already short+take. ASS captions identify Codex Astra in Adom Hydrogen, explicit planned+waypoints, the Fusion verbs and this board's measured DRC result.++The adjacent `.ass` and `.edit.json` preserve captions and edit provenance.+The renderer checks the output dimensions and duration and fully decodes it;+results are in `evidence/showcase-video-validation.json`. Delivery target:+`C:/Users/john/Documents/Adom Routing Demos/fusion-routing-showcase-3x.mp4`.
demo/routing/evidence/showcase-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/Adom Routing Demos · exact paths are in destinationPaths[]. VERIFY: adom-bridge list_dir '{\"path\":\"C:/Users/john/Documents/Adom Routing Demos\"}' READ ONE BACK: adom-bridge pull_file '{\"path\":\"C:/Users/john/Documents/Adom Routing Demos/fusion-routing-showcase-3x.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/Adom Routing Demos/fusion-routing-showcase-3x.mp4"+ ],+ "durationMs": 12,+ "error": null,+ "filesReceived": 1,+ "savedToDir": "C:/Users/john/Documents/Adom Routing Demos",+ "status": "ok",+ "success": true+}
demo/routing/evidence/showcase-player-open.jsonadded+9@@ -0,0 +1,9 @@+{+ "durationMs": 571,+ "exitCode": 0,+ "status": "ok",+ "stderr": "",+ "stdout": "",+ "success": true,+ "timeoutSeconds": 120+}
demo/routing/evidence/showcase-player-verification.jsonadded+26@@ -0,0 +1,26 @@+{+ "window": {+ "className": "ApplicationFrameWindow",+ "enabled": true,+ "hung": false,+ "hwnd": 12396508,+ "image": "ApplicationFrameHost.exe",+ "kind": "normal",+ "maximized": false,+ "minimized": false,+ "owner": 0,+ "pid": 15016,+ "rect": {+ "bottom": 1434,+ "height": 1338,+ "left": 118,+ "right": 2241,+ "top": 96,+ "width": 2123+ },+ "title": "Media Player",+ "z": 0+ },+ "success": true,+ "localSafePath": "/home/adom/project/screenshots/adom-bridge/window/2026-09-05T21-25-24.647-12396508.safe.png"+}
demo/routing/evidence/showcase-video-validation.jsonadded+188@@ -0,0 +1,188 @@+{+ "fullDecodePassed": true,+ "source": {+ "streams": [+ {+ "index": 0,+ "codec_name": "h264",+ "codec_long_name": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10",+ "profile": "Constrained Baseline",+ "codec_type": "video",+ "codec_tag_string": "avc1",+ "codec_tag": "0x31637661",+ "width": 2564,+ "height": 1540,+ "coded_width": 2564,+ "coded_height": 1540,+ "closed_captions": 0,+ "film_grain": 0,+ "has_b_frames": 0,+ "sample_aspect_ratio": "1:1",+ "display_aspect_ratio": "641:385",+ "pix_fmt": "yuv420p",+ "level": 51,+ "chroma_location": "left",+ "field_order": "progressive",+ "refs": 1,+ "is_avc": "true",+ "nal_length_size": "4",+ "id": "0x1",+ "r_frame_rate": "30/1",+ "avg_frame_rate": "30/1",+ "time_base": "1/30000",+ "start_pts": 0,+ "start_time": "0.000000",+ "duration_ts": 805999,+ "duration": "26.866633",+ "bit_rate": "11402879",+ "bits_per_raw_sample": "8",+ "nb_frames": "806",+ "extradata_size": 56,+ "disposition": {+ "default": 1,+ "dub": 0,+ "original": 0,+ "comment": 0,+ "lyrics": 0,+ "karaoke": 0,+ "forced": 0,+ "hearing_impaired": 0,+ "visual_impaired": 0,+ "clean_effects": 0,+ "attached_pic": 0,+ "timed_thumbnails": 0,+ "non_diegetic": 0,+ "captions": 0,+ "descriptions": 0,+ "metadata": 0,+ "dependent": 0,+ "still_image": 0+ },+ "tags": {+ "creation_time": "2026-09-05T20:52:12.000000Z",+ "language": "und",+ "handler_name": "VideoHandler",+ "vendor_id": "[0][0][0][0]",+ "encoder": "AVC Coding"+ }+ }+ ],+ "format": {+ "filename": "/home/adom/project/fusion-trace-routing/demo/routing/videos/window-8916576-20260905-205212.mp4",+ "nb_streams": 1,+ "nb_programs": 0,+ "format_name": "mov,mp4,m4a,3gp,3g2,mj2",+ "format_long_name": "QuickTime / MOV",+ "start_time": "0.000000",+ "duration": "26.866633",+ "size": "38298670",+ "bit_rate": "11404084",+ "probe_score": 100,+ "tags": {+ "major_brand": "mp42",+ "minor_version": "0",+ "compatible_brands": "mp41isom",+ "creation_time": "2026-09-05T20:52:12.000000Z"+ }+ }+ },+ "output": {+ "streams": [+ {+ "index": 0,+ "codec_name": "h264",+ "codec_long_name": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10",+ "profile": "High",+ "codec_type": "video",+ "codec_tag_string": "avc1",+ "codec_tag": "0x31637661",+ "width": 1920,+ "height": 1080,+ "coded_width": 1920,+ "coded_height": 1080,+ "closed_captions": 0,+ "film_grain": 0,+ "has_b_frames": 2,+ "sample_aspect_ratio": "25591:25588",+ "display_aspect_ratio": "102364:57573",+ "pix_fmt": "yuv420p",+ "level": 40,+ "chroma_location": "left",+ "field_order": "progressive",+ "refs": 1,+ "is_avc": "true",+ "nal_length_size": "4",+ "id": "0x1",+ "r_frame_rate": "30/1",+ "avg_frame_rate": "30/1",+ "time_base": "1/15360",+ "start_pts": 0,+ "start_time": "0.000000",+ "duration_ts": 214528,+ "duration": "13.966667",+ "bit_rate": "182889",+ "bits_per_raw_sample": "8",+ "nb_frames": "419",+ "extradata_size": 48,+ "disposition": {+ "default": 1,+ "dub": 0,+ "original": 0,+ "comment": 0,+ "lyrics": 0,+ "karaoke": 0,+ "forced": 0,+ "hearing_impaired": 0,+ "visual_impaired": 0,+ "clean_effects": 0,+ "attached_pic": 0,+ "timed_thumbnails": 0,+ "non_diegetic": 0,+ "captions": 0,+ "descriptions": 0,+ "metadata": 0,+ "dependent": 0,+ "still_image": 0+ },+ "tags": {+ "language": "und",+ "handler_name": "VideoHandler",+ "vendor_id": "[0][0][0][0]",+ "encoder": "Lavc60.31.102 libx264"+ }+ }+ ],+ "format": {+ "filename": "/home/adom/project/fusion-trace-routing/demo/routing/videos/fusion-routing-showcase-3x.mp4",+ "nb_streams": 1,+ "nb_programs": 0,+ "format_name": "mov,mp4,m4a,3gp,3g2,mj2",+ "format_long_name": "QuickTime / MOV",+ "start_time": "0.000000",+ "duration": "13.966667",+ "size": "325196",+ "bit_rate": "186269",+ "probe_score": 100,+ "tags": {+ "major_brand": "isom",+ "minor_version": "512",+ "compatible_brands": "isomiso2avc1mp41",+ "encoder": "Lavf60.16.100"+ }+ }+ },+ "visualReview": {+ "sequentialSamplesSeconds": [+ 1,+ 3,+ 5,+ 7,+ 9,+ 11,+ 13+ ],+ "finalFrameReviewed": true,+ "captionsReadable": true,+ "finalCopperAndNativeErrorsZeroVisible": true+ }+}
demo/routing/render_showcase.pyadded+58@@ -0,0 +1,58 @@+"""Render the preserved live Fusion take with captions and explicit edit provenance."""+import hashlib+import json+from pathlib import Path+import shutil+import subprocess++ROOT = Path(__file__).resolve().parent+SOURCE = ROOT / 'videos/window-8916576-20260905-205212.mp4'+OUT = ROOT / 'videos/fusion-routing-showcase-3x.mp4'+ASS = OUT.with_suffix('.ass')+SPEED, HOLD = 3, 5+FFMPEG = shutil.which('ffmpeg')+probe = json.loads(subprocess.check_output(['ffprobe', '-v', 'error', '-show_streams', '-show_format', '-of', 'json', str(SOURCE)]))+duration = float(probe['format']['duration'])+action = duration / SPEED+end = action + HOLD+header = '''[Script Info]+ScriptType: v4.00++PlayResX: 1920+PlayResY: 1080+WrapStyle: 2+[V4+ Styles]+Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding+Style: Main,Liberation Sans,34,&H00FFFFFF,&H00FFFFFF,&H00130F0A,&H00130F0A,0,0,0,0,100,100,0,0,1,1,0,2,30,30,22,1+[Events]+Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text+'''+def stamp(t):+ cs=round(t*100)+ return f'{cs//360000}:{cs//6000%60:02d}:{cs//100%60:02d}.{cs%100:02d}'+events=[]+def text(a,b,s):+ events.append(f'Dialogue: 0,{stamp(a)},{stamp(b)},Main,,0,0,0,,{s}')+text(0,end,r'{\an7\pos(34,16)\fs38\b1\c&H00E5CF65&}CODEX ASTRA IN ADOM HYDROGEN'+r'{\c&H00FFFFFF&} / FUSION ROUTING')+text(0,end,r'{\an7\pos(1490,125)\fs48\b1\c&H00E5CF65&}3x PLAYBACK')+text(0,end,r'{\an7\pos(1490,197)\fs27}Native Fusion capture\NFull sequence retained')+side=[(315,'THE BOARD',r'6 nets / 13 pads\N21 trace segments\N2 through vias'),(500,'THE PATHS',r'Explicit planned waypoints\NKiCad reference fixture\NTop + bottom copper'),(690,'THE CHECKS',r'Board identity + revision\NLive copper read-back\NNative Autodesk DRC')]+for y,title,body in side:+ text(0,end,fr'{{\an7\pos(1490,{y})\fs32\b1\c&H00E5CF65&}}'+title)+ text(0,end,fr'{{\an7\pos(1490,{y+46})\fs27}}'+body)+cues=[(0,3,'fusion_routing_state reads pad coordinates, nets and the board revision.'),(3,6,'fusion_route_net creates each trace and via through Adom Bridge.'),(6,action,'Each edit checks expectedRevision and verifies the resulting native copper.'),(action,end,r'fusion_routing_drc: 6 nets connected.\N0 errors / 0 warnings / 0 airwires.')]+for a,b,s in cues:+ text(a,b,r'{\an2\pos(960,1058)\fs34}'+s)+text(action,end,r'{\an7\pos(1490,895)\fs25\c&H00B9B9B9&}Final frame held for 5 seconds')+ASS.write_text(header+'\n'.join(events)+'\n')+# Timestamp-based speed adjustment preserves the actual source timeline, including VFR.+# Apply the hold BEFORE captions so the result caption remains correct throughout it.+vf=f'setpts=(PTS-STARTPTS)/{SPEED},fps=30,scale=1440:900:force_original_aspect_ratio=decrease,pad=1440:900:(ow-iw)/2:(oh-ih)/2:color=0x0a0f13,pad=1920:1080:0:70:color=0x0a0f13,tpad=stop_mode=clone:stop_duration={HOLD},ass={ASS}'+subprocess.run([FFMPEG,'-hide_banner','-loglevel','warning','-i',str(SOURCE),'-vf',vf,'-an','-c:v','libx264','-preset','fast','-crf','20','-pix_fmt','yuv420p','-movflags','+faststart','-y',str(OUT)],check=True)+manifest={'source':str(SOURCE),'sourceSha256':hashlib.sha256(SOURCE.read_bytes()).hexdigest(),'keptSourceRanges':[[0,duration]],'idleIntervalsRemoved':False,'speed':SPEED,'holdSeconds':HOLD,'expectedDurationSeconds':end,'captions':cues,'geometry':'Explicit waypoint plan adapted from KiCad reference fixture; not general autorouting','validationEvidence':'../evidence/final-take/result.json'}+OUT.with_suffix('.edit.json').write_text(json.dumps(manifest,indent=2)+'\n')+subprocess.run([FFMPEG,'-v','error','-i',str(OUT),'-f','null','-'],check=True)+result=json.loads(subprocess.check_output(['ffprobe','-v','error','-show_streams','-show_format','-of','json',str(OUT)]))+assert abs(float(result['format']['duration'])-end)<.1+assert result['streams'][0]['width']==1920 and result['streams'][0]['height']==1080+(ROOT/'evidence/showcase-video-validation.json').write_text(json.dumps({'fullDecodePassed':True,'source':probe,'output':result},indent=2)+'\n')+print(OUT)
demo/routing/videos/fusion-routing-showcase-3x.assadded+24@@ -0,0 +1,24 @@+[Script Info]+ScriptType: v4.00++PlayResX: 1920+PlayResY: 1080+WrapStyle: 2+[V4+ Styles]+Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding+Style: Main,Liberation Sans,34,&H00FFFFFF,&H00FFFFFF,&H00130F0A,&H00130F0A,0,0,0,0,100,100,0,0,1,1,0,2,30,30,22,1+[Events]+Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text+Dialogue: 0,0:00:00.00,0:00:13.96,Main,,0,0,0,,{\an7\pos(34,16)\fs38\b1\c&H00E5CF65&}CODEX ASTRA IN ADOM HYDROGEN{\c&H00FFFFFF&} / FUSION ROUTING+Dialogue: 0,0:00:00.00,0:00:13.96,Main,,0,0,0,,{\an7\pos(1490,125)\fs48\b1\c&H00E5CF65&}3x PLAYBACK+Dialogue: 0,0:00:00.00,0:00:13.96,Main,,0,0,0,,{\an7\pos(1490,197)\fs27}Native Fusion capture\NFull sequence retained+Dialogue: 0,0:00:00.00,0:00:13.96,Main,,0,0,0,,{\an7\pos(1490,315)\fs32\b1\c&H00E5CF65&}THE BOARD+Dialogue: 0,0:00:00.00,0:00:13.96,Main,,0,0,0,,{\an7\pos(1490,361)\fs27}6 nets / 13 pads\N21 trace segments\N2 through vias+Dialogue: 0,0:00:00.00,0:00:13.96,Main,,0,0,0,,{\an7\pos(1490,500)\fs32\b1\c&H00E5CF65&}THE PATHS+Dialogue: 0,0:00:00.00,0:00:13.96,Main,,0,0,0,,{\an7\pos(1490,546)\fs27}Explicit planned waypoints\NKiCad reference fixture\NTop + bottom copper+Dialogue: 0,0:00:00.00,0:00:13.96,Main,,0,0,0,,{\an7\pos(1490,690)\fs32\b1\c&H00E5CF65&}THE CHECKS+Dialogue: 0,0:00:00.00,0:00:13.96,Main,,0,0,0,,{\an7\pos(1490,736)\fs27}Board identity + revision\NLive copper read-back\NNative Autodesk DRC+Dialogue: 0,0:00:00.00,0:00:03.00,Main,,0,0,0,,{\an2\pos(960,1058)\fs34}fusion_routing_state reads pad coordinates, nets and the board revision.+Dialogue: 0,0:00:03.00,0:00:06.00,Main,,0,0,0,,{\an2\pos(960,1058)\fs34}fusion_route_net creates each trace and via through Adom Bridge.+Dialogue: 0,0:00:06.00,0:00:08.96,Main,,0,0,0,,{\an2\pos(960,1058)\fs34}Each edit checks expectedRevision and verifies the resulting native copper.+Dialogue: 0,0:00:08.96,0:00:13.96,Main,,0,0,0,,{\an2\pos(960,1058)\fs34}fusion_routing_drc: 6 nets connected.\N0 errors / 0 warnings / 0 airwires.+Dialogue: 0,0:00:08.96,0:00:13.96,Main,,0,0,0,,{\an7\pos(1490,895)\fs25\c&H00B9B9B9&}Final frame held for 5 seconds
demo/routing/videos/fusion-routing-showcase-3x.edit.jsonadded+38@@ -0,0 +1,38 @@+{+ "source": "/home/adom/project/fusion-trace-routing/demo/routing/videos/window-8916576-20260905-205212.mp4",+ "sourceSha256": "faa027fb7379df46b8fe1233474b50e154a68b486e11de2af884e0571de25234",+ "keptSourceRanges": [+ [+ 0,+ 26.866633+ ]+ ],+ "idleIntervalsRemoved": false,+ "speed": 3,+ "holdSeconds": 5,+ "expectedDurationSeconds": 13.955544333333334,+ "captions": [+ [+ 0,+ 3,+ "fusion_routing_state reads pad coordinates, nets and the board revision."+ ],+ [+ 3,+ 6,+ "fusion_route_net creates each trace and via through Adom Bridge."+ ],+ [+ 6,+ 8.955544333333334,+ "Each edit checks expectedRevision and verifies the resulting native copper."+ ],+ [+ 8.955544333333334,+ 13.955544333333334,+ "fusion_routing_drc: 6 nets connected.\\N0 errors / 0 warnings / 0 airwires."+ ]+ ],+ "geometry": "Explicit waypoint plan adapted from KiCad reference fixture; not general autorouting",+ "validationEvidence": "../evidence/final-take/result.json"+}
demo/routing/videos/fusion-routing-showcase-3x.mp4added⋯ 1 unchanged line ⋯