← Commit history
demo/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 ⋯