← Commit history
demo/placement/fable/fable-stats.json+9
@@ -46,5 +46,14 @@   "planUsdPerMonth": 200,   "threadPercent": 33.2,   "withAgentsPercent": 50.2+ },+ "promptToDone": {+  "start": "2026-09-12T18:41:42Z",+  "startNote": "John: 'ok, that esc is fine'",+  "end": "2026-09-12T20:41:10Z",+  "endNote": "placed board handed over; Astra placement prompt delivered",+  "wallSeconds": 7168,+  "wallMinutes": 119.5,+  "definition": "wall clock from the human prompt to the delivered result; the headline number on the chart"  } }\ No newline at end of file
demo/routing/esc/routing-stats.json+25−2
@@ -22,7 +22,12 @@   "unconnected": 7,   "usd": 0,   "agents": 0,-  "note": "one call; the DSN writer's rule mapping caused the track_width errors (issue #93)"+  "note": "one call; the DSN writer's rule mapping caused the track_width errors (issue #93)",+  "promptToDone": {+   "wallSeconds": 229.51,+   "wallMinutes": 3.8,+   "definition": "one kicad_autoroute job inside Fable's session, job start to copper landed"+  }  },  "fable": {   "engine": "Claude Fable 5.1 (own grid router)",@@ -108,6 +113,24 @@   "usdThread": 26.62,   "usdWithAgents": 258.71,   "planShareWithAgentsPercent": 129.4,-  "priceBasis": "claude.com/pricing 2026-09-12"+  "priceBasis": "claude.com/pricing 2026-09-12",+  "promptToDone": {+   "start": "2026-09-12T20:41:10Z",+   "startNote": "placement handed over, routing started",+   "astraPromptDelivered": "2026-09-12T23:34:21Z",+   "liveTakeDone": "2026-09-12T23:48:47Z",+   "end": "2026-09-13T00:29:15Z",+   "endNote": "routing results and video published to the demo page",+   "wallSeconds": 13685,+   "wallMinutes": 228.1,+   "definition": "wall clock from the human prompt to the delivered result; the headline number on the chart"+  }+ },+ "astra": {+  "engine": "GPT-6 Astra in Codex",+  "status": "pending",+  "promptToDone": {+   "definition": "from the moment John pasted the routing prompt to the moment the show-and-tell issue was filed"+  }  } }\ No newline at end of file
docs/esc-demo.md+14−11
@@ -1,6 +1,6 @@ # The ESC G431 demo: placement and routing by three engines -A real Adom board, placed and routed from scratch by AI through the KiCad Bridge, on camera, with the numbers that matter next to each engine: real time, result quality, tokens, dollars, agents.+A real Adom board, placed and routed from scratch by AI through the KiCad Bridge, on camera, with the numbers that matter next to each engine: the wall clock from the prompt to the finished result (the time the human waited, the headline number on every chart), the time on the board, result quality, tokens, dollars, agents.  The board is [ESC G431](https://wiki.adom.inc/adom/esc-g431), Caleb's single-motor drone ESC: STM32G431, DRV8300 gate driver, six BSC016N06NS MOSFETs in a 3-phase bridge, TPSM365 buck, INA181 current sense, 64 x 74 mm, 4 layers, 149 parts, 365 pads, 59 routable nets. It is public with its KiCad sources, which is why it was chosen over the private boards. @@ -16,6 +16,7 @@ Done 2026-09-12 on arav-rog (KiCad 10.0.3, bridge 1.0.3). The board is an Adom m  | Measure | Claude Fable 5.1 | |---|---|+| From John's prompt to done | 1 h 59 min (119.5 min): from "ok, that esc is fine" at 18:41:42 UTC to the placed board handed over and the Astra prompt delivered at 20:41:10 UTC. This is what the human waited, and it includes everything below | | Planning | one thread; the planner was written, run and corrected between 18:36 and 20:34 UTC, in a window that also carried the bridge fixes below | | Placement on the board | 122 parts in 21 commits, 33.8 s wall, every commit verified by the read-back courtyard | | Result | 0 courtyard overlaps, 0 outside the outline, 0 parked, ratsnest 1678 mm (the human layout measures 1645 mm on the same MST metric) |@@ -36,6 +37,7 @@ Done 2026-09-12 on arav-rog from [the prompt on this page](esc-placement-astra-p  | Measure | GPT-6 Astra in Codex | |---|---|+| From John's prompt to done | 16 min (15.9 min): the prompt was handed to John at 20:41:10 UTC, Astra's first bridge call was at 20:43:04, its issue was filed at 20:57:02 UTC | | Planning, first placement_state to first move (a dry run of the whole plan) | 4.9 min, one thread, zero sub-agents | | Placement on the board | 122 parts in 16 commits, 19.2 s wall, every commit verified | | Result | 0 courtyard overlaps, 0 outside, 0 parked, ratsnest 1529 mm (better than the human layout's 1645 mm on the MST metric) |@@ -44,16 +46,16 @@ Done 2026-09-12 on arav-rog from [the prompt on this page](esc-placement-astra-p | Dollars at API list price | $14.15 (GPT-6 Astra: $10 uncached input, $1 cached input, $50 output per MTok, OpenAI model page 2026-09-12), 7% of a $200/month plan | | Video | [astra-placement-esc-g431.mp4](https://wiki.adom.inc/api/pages/adom/codex/files/docs/videos/astra-placement-esc-g431.mp4) on the adom/codex page, 38 s raw | -Astra's wall clock was about 30 minutes from prompt to filed issue against Fable's five hours. The difference is not the placement: Astra used the placement verbs, the fixture tool and the recording recipe that Fable's five hours built, debugged and shipped (three bridge bugs and the etiquette work included). On the placement itself Astra was faster to plan (4.9 min against 45) and produced the better ratsnest (1529 mm against 1678); both landed the board with zero overlaps.+Astra's wall clock was 16 minutes from prompt to filed issue against Fable's two hours (the timestamps: 20:41:10 to 20:57:02 UTC against 18:41:42 to 20:41:10 UTC). The difference is not the placement: Astra used the placement verbs, the fixture tool and the recording recipe that Fable's two hours built, debugged and shipped (three bridge bugs and the etiquette work included). On the placement itself Astra was faster to plan (4.9 min against 45) and produced the better ratsnest (1529 mm against 1678); both landed the board with zero overlaps.  ### The placement video -Both takes cut to the action in real time, narrated to the measured length, the chart at the end.+Both takes cut to the action in real time, narrated to the measured length, the chart at the end shows the wall clock from the prompt to the placed board. -<video width="100%" controls poster="/blob/app/kicad-bridge/docs/videos/esc-placement-poster.jpg?v=1">-  <source src="/blob/app/kicad-bridge/docs/videos/esc-placement.mp4?v=1" type="video/mp4"></video>+<video width="100%" controls poster="/blob/app/kicad-bridge/docs/videos/esc-placement-poster.jpg?v=2">+  <source src="/blob/app/kicad-bridge/docs/videos/esc-placement.mp4?v=2" type="video/mp4"></video> -[Watch the placement video](https://wiki.adom.inc/api/pages/adom/kicad-bridge/files/docs/videos/esc-placement.mp4?v=1) (65 s)+[Watch the placement video](https://wiki.adom.inc/api/pages/adom/kicad-bridge/files/docs/videos/esc-placement.mp4?v=2) (66 s)  ## Round 2: routing @@ -69,7 +71,8 @@ Fable wrote its own router for the board: [ai_router.py](https://wiki.adom.inc/a  | Measure | Freerouting | Claude Fable 5.1 | |---|---|---|-| Real time on the board | 229.5 s, one call, 18 passes | 518.5 s, 105 commits |+| From the prompt to done | 3.8 min: one call inside Fable's session, from the autoroute job start to the copper landed | 3 h 48 min (228 min): from moving on to routing at 20:41:10 UTC to the routing results and this video published at 00:29:15 UTC. The Astra routing prompt was handed over at 23:34:21 and the live take finished at 23:48:47 |+| Time on the board | 229.5 s, one call, 18 passes | 518.5 s, 105 commits | | Nets routed | 59 of 59 by its own count | 55 of 59 | | New DRC errors | 189 | 0 | | Unconnected after zone fill | 7 | 7 |@@ -85,12 +88,12 @@ PENDING. The prompt Astra runs is [esc-routing-astra-prompt.md](https://wiki.ado  ### The routing video -Freerouting and Fable, cut to the action in real time, narrated to the measured length, the chart at the end. Astra's take is added when its issue lands.+Freerouting and Fable, cut to the action in real time, narrated to the measured length, the chart at the end shows the wall clock from the prompt to the routed board. Astra's take is added when its issue lands. -<video width="100%" controls poster="/blob/app/kicad-bridge/docs/videos/esc-routing-poster.jpg?v=1">-  <source src="/blob/app/kicad-bridge/docs/videos/esc-routing.mp4?v=1" type="video/mp4"></video>+<video width="100%" controls poster="/blob/app/kicad-bridge/docs/videos/esc-routing-poster.jpg?v=2">+  <source src="/blob/app/kicad-bridge/docs/videos/esc-routing.mp4?v=2" type="video/mp4"></video> -[Watch the routing video](https://wiki.adom.inc/api/pages/adom/kicad-bridge/files/docs/videos/esc-routing.mp4?v=1) (71 s)+[Watch the routing video](https://wiki.adom.inc/api/pages/adom/kicad-bridge/files/docs/videos/esc-routing.mp4?v=2) (73 s)  ## How the recording is made without disturbing anyone 
docs/esc-placement-astra-prompt.md+1−1
@@ -21,7 +21,7 @@ Rules that are not optional: 5. Record before the first move: on arav-rog `desktop_record_start {"monitor": 0, "audio": false, "fps": 30, "reason": "Astra placing the ESC G431", "maxDurationMs": 1200000}` (foreground OpenGL path); on a user's box `desktop_record_window_start {"hwnd": H, ...}` with the fallback canvas. Then land the plan with `kicad_move_footprint` in batches (six to twelve parts per call is a good rhythm for a viewer; one undo step per call), passing the previous reply's revision as `expectedRevision`. Pause about a second between batches. Do not speed anything up; the video is cut to the action later.  6. Finish with `kicad_placement_validate`; report its ratsnest length, overlap count, outside count and placement DRC. Then `desktop_record_stop`, `pull_file` the MP4, check frames at the start, middle and end, transcode to 1920 wide H.264 (`ffmpeg -i in.mp4 -vf scale=1920:-2 -c:v libx264 -crf 22 -pix_fmt yuv420p -movflags +faststart -an out.mp4`), make a poster, and push both to the adom/codex page under docs/videos/ (`adom-wiki repo push adom/codex --files ...`), confirming the MP4 URL returns 200.-7. The numbers, all of them, in the issue, because they go on a chart next to Claude Fable 5.1's: (a) planning time, from your first `kicad_placement_state` to your first `kicad_move_footprint`, wall clock; (b) placement time, first commit to last commit, wall clock, and the number of commits and parts moved; (c) the validate result: ratsnest mm, courtyard overlaps, parts outside the outline, parts still parked, placement DRC errors; (d) your session's token usage for this task from Codex's own accounting (input, cached input, output) and the model name; (e) the dollar cost of those tokens at OpenAI's published per-token API price for that model (state the price you used and where it is published) and that cost as a percentage of a $200 per month plan; (f) how many sub-agents or worker threads you spawned for this task (zero is a fine answer); (g) the list of bridge calls with timestamps; (h) what you rejected or retried, including any take you discarded. Claude's numbers for comparison are in https://wiki.adom.inc/api/pages/adom/kicad-bridge/files/demo/placement/fable/fable-stats.json: report yours in the same shape.+7. The numbers, all of them, in the issue. First and most important: (a0) the wall clock from the moment John pasted this prompt to the moment the issue is filed, in minutes. Note the paste time in UTC as your very first action and put both timestamps in the issue; this is the number that goes on the chart, because it is what the human waited. Then, because they go on a chart next to Claude Fable 5.1's: (a) planning time, from your first `kicad_placement_state` to your first `kicad_move_footprint`, wall clock; (b) placement time, first commit to last commit, wall clock, and the number of commits and parts moved; (c) the validate result: ratsnest mm, courtyard overlaps, parts outside the outline, parts still parked, placement DRC errors; (d) your session's token usage for this task from Codex's own accounting (input, cached input, output) and the model name; (e) the dollar cost of those tokens at OpenAI's published per-token API price for that model (state the price you used and where it is published) and that cost as a percentage of a $200 per month plan; (f) how many sub-agents or worker threads you spawned for this task (zero is a fine answer); (g) the list of bridge calls with timestamps; (h) what you rejected or retried, including any take you discarded. Claude's numbers for comparison are in https://wiki.adom.inc/api/pages/adom/kicad-bridge/files/demo/placement/fable/fable-stats.json: report yours in the same shape. 8. File the issue: `adom-wiki issue create adom/kicad-bridge --category show-and-tell --title "Astra placement video: ESC G431, 149 parts through kicad_move_footprint" --body "<video URL, poster URL, the numbers in 7, the exact commands>"`. No em dashes. 9. Close KiCad with `kicad_close {"discardChanges": true}` and tell John the issue URL and the video URL. 
docs/esc-routing-astra-prompt.md+1−1
@@ -18,7 +18,7 @@ Rules that are not optional: 4. Read `kicad_routing_state` and plan the routing yourself. Rules of the board: track 0.25 mm and clearance 0.2 mm by default (read the file's setup and netclass blocks and use them), via 0.8 mm with a 0.4 mm drill; signal traces on F.Cu and B.Cu with vias between them; the three phase nets (/DRV_SHA, /DRV_SHB, /DRV_SHC), +VBAT and the MOSFET drain and source connections want 1.0 mm tracks where the space allows and at least 0.5 mm; GND and +3V3 pads are NOT routed as traces: each such SMD pad gets a short stub and a via to its plane (In1.Cu for GND, In2.Cu for +3V3), thru-hole pads already reach the planes. Keep the current sense path (shunt to INA) short and paired. Route the short nets first. A `drc_rejected` means your plan crossed something: change the plan, do not force it. Write your own router or plan by hand; do not copy Claude's plan (it is on the page). 5. Record before the first commit: `desktop_record_start {"monitor": 0, "audio": false, "fps": 30, "reason": "Astra routing the ESC G431", "maxDurationMs": 1800000}`. Then land the plan with `kicad_route_net`, one net per call, passing the previous reply's revision as `expectedRevision`, about a second between calls so a viewer can follow. Do not speed anything up. 6. Finish with `kicad_routing_validate`: it must report the errors and unconnected count truthfully; the goal is 0 errors and 0 unconnected (the 13 inherited library errors on this board, six malformed MOSFET courtyards and seven U2 pad clearances, are known and do not count). If something stays unconnected, say which nets and why. Then `desktop_record_stop`, `pull_file` the MP4, check frames at the start, middle and end, transcode to 1920 wide H.264 (`ffmpeg -i in.mp4 -vf scale=1920:-2 -c:v libx264 -crf 22 -pix_fmt yuv420p -movflags +faststart -an out.mp4`), make a poster, push both to the adom/codex page under docs/videos/ (`adom-wiki repo push adom/codex --files ...`), and confirm the MP4 URL returns 200.-7. The numbers, all of them, in the issue, in the shape of https://wiki.adom.inc/api/pages/adom/kicad-bridge/files/demo/placement/fable/fable-stats.json: (a) planning time, first `kicad_routing_state` to first `kicad_route_net`, wall clock; (b) routing time, first commit to last, wall clock, and the number of commits, nets routed, segments, vias and total copper length in mm; (c) the validate result: errors, unconnected, violation types; (d) your session's token usage for this task (input, cached input, output) and the model name; (e) the dollar cost at OpenAI's published per-token price for the model (state the price and where it is published) and that cost as a percentage of a $200 per month plan; (f) sub-agents or worker threads spawned (zero is fine); (g) the bridge calls with timestamps; (h) what you rejected or retried, including any take you discarded.+7. The numbers, all of them, in the issue. First and most important: (a0) the wall clock from the moment John pasted this prompt to the moment the issue is filed, in minutes. Note the paste time in UTC as your very first action and put both timestamps in the issue; this is the number that goes on the chart, because it is what the human waited. Then, in the shape of https://wiki.adom.inc/api/pages/adom/kicad-bridge/files/demo/placement/fable/fable-stats.json: (a) planning time, first `kicad_routing_state` to first `kicad_route_net`, wall clock; (b) routing time, first commit to last, wall clock, and the number of commits, nets routed, segments, vias and total copper length in mm; (c) the validate result: errors, unconnected, violation types; (d) your session's token usage for this task (input, cached input, output) and the model name; (e) the dollar cost at OpenAI's published per-token price for the model (state the price and where it is published) and that cost as a percentage of a $200 per month plan; (f) sub-agents or worker threads spawned (zero is fine); (g) the bridge calls with timestamps; (h) what you rejected or retried, including any take you discarded. 8. File the issue: `adom-wiki issue create adom/kicad-bridge --category show-and-tell --title "Astra routing video: ESC G431 through kicad_route_net" --body "<video URL, poster URL, the numbers in 7, the exact commands>"`. No em dashes. 9. Close KiCad with `kicad_close {"discardChanges": true}` and tell John the issue URL and the video URL. 
docs/rust-port-plan.md+2
@@ -301,3 +301,5 @@ Total: roughly 18 to 21 weeks of one AI thread's time with human test time on th - 2026-09-12 (evening, continued): the gate on ConfRoomROG kept flagging kicad_open_board as a foreground steal after the decision-order fix. Measured cause: a Z-order push (HWND_BOTTOM) does not hold while the editor still owns the activation, and the bridge process's own SetForegroundWindow on the user's window reports success without taking effect (no foreground rights), whereas ab's desktop_bring_to_front sticks. Fix: the bridge now has a Z-order top query (what actually covers the user), spawn verbs wait for the editor's load dialog to go away and then run the restore twice, and the restore hands the activation back to the user's window through ab with its window state preserved; the etiquette loop remembers the user's last non-KiCad foreground and restores it on every bounce. Gate on ConfRoomROG: 88 pass, 0 fail, 16 declared skips, zero steals. 1.0.3 published to insiders with the placement verbs.  - 2026-09-13: ESC routing round recorded on ConfRoomROG. Freerouting 229.5 s, 59 nets, 189 new DRC errors, 7 unconnected (DSN rule mapping, issue #93). Claude Fable 5.1 with its own grid router: 105 commits, 518.5 s, 0 new DRC errors, 7 unconnected. Job-mode autoroute verified live. Noted: ab's monitor recorder on ConfRoomROG delivers frames only when the screen changes (a 519 s take became 125 s of video), so real time is stated on screen from the logs.++- 2026-09-13: John's correction: the headline time on every chart and table is the wall clock from his prompt to the delivered result, not the seconds on the board. Placement: Fable 119.5 min (18:41:42 to 20:41:10 UTC), Astra 15.9 min (20:41:10 to issue filed 20:57:02). Routing: Freerouting 3.8 min (one call), Fable 228 min (20:41:10 to 00:29:15 UTC). Both videos rebuilt with the new charts (?v=2); both Astra prompts now ask for the paste-to-issue wall clock as item (a0).
docs/videos/esc-placement-poster.jpg
⋯ 1 unchanged line ⋯
docs/videos/esc-placement.mp4
⋯ 1 unchanged line ⋯
docs/videos/esc-routing-poster.jpg
⋯ 1 unchanged line ⋯
docs/videos/esc-routing.mp4
⋯ 1 unchanged line ⋯