← Commit history
README.md+4−4
@@ -11,7 +11,7 @@ adom-aiflow --version  ## The final video -The evidence of a run is its video: one segment per step, both engines side by side, the per-step numbers between segments, narration fitted to each segment. This is the piece people will share.+The evidence of a run is its video, two minutes at most: only the moments something moved, every step in order, the AI's own current density and temperature rise drawings fullscreen, the run and step clocks in the corner, the words cut to the picture. Both engines side by side in 0.2. This is the piece people will share.  <video width="100%" controls poster="/blob/app/adom-aiflow/docs/videos/aiflow-esc-fable-vs-codex-poster.jpg">   <source src="/blob/app/adom-aiflow/docs/videos/aiflow-esc-fable-vs-codex.mp4" type="video/mp4"></video>@@ -108,8 +108,8 @@ Declaring a step stops the previous step's clip and starts this step's own windo | placement | the parts landing as undo steps, one batch per decision | <video width="100%" controls><source src="/blob/app/adom-aiflow/docs/videos/step-placement.mp4" type="video/mp4"></video> | | routing | the routing landing net by net, then the vias; the one viewers speed up | <video width="100%" controls><source src="/blob/app/adom-aiflow/docs/videos/step-routing.mp4" type="video/mp4"></video> | | pours | the pours filling in and the copper readback; the DRC refusals stay in, they are the story | <video width="100%" controls><source src="/blob/app/adom-aiflow/docs/videos/step-pours.mp4" type="video/mp4"></video> |-| current | the analysis table on the board | <video width="100%" controls><source src="/blob/app/adom-aiflow/docs/videos/step-current.mp4" type="video/mp4"></video> |-| thermal | the hot tabs and their copper; when it fails, the return is the clip worth keeping | <video width="100%" controls><source src="/blob/app/adom-aiflow/docs/videos/step-thermal.mp4" type="video/mp4"></video> |+| current | the analysis table, the AI's current density drawing fullscreen, then each pour net lit and framed | <video width="100%" controls><source src="/blob/app/adom-aiflow/docs/videos/step-current.mp4" type="video/mp4"></video> |+| thermal | the hot tabs and their copper, the AI's heat map fullscreen, then the pours lit; when it fails, the return is the clip worth keeping | <video width="100%" controls><source src="/blob/app/adom-aiflow/docs/videos/step-thermal.mp4" type="video/mp4"></video> | | rework | the return to placement, filmed | <video width="100%" controls><source src="/blob/app/adom-aiflow/docs/videos/step-placement-2-rework.mp4" type="video/mp4"></video> | | finish | the finish line passing, then the delivery | <video width="100%" controls><source src="/blob/app/adom-aiflow/docs/videos/step-finish.mp4" type="video/mp4"></video> | @@ -225,7 +225,7 @@ Everything below is what John has asked for, in the order it is likely to land.  **The video (0.2)** - The step's own code frames the shot: zoom to fit before a landing, the part on screen when a move lands.-- The composer at `deliver`: one segment per step from the 10x clips and the analysis cards, about two minutes, the words for each segment written by the AI, adom-tts for the voice, the audio measured against the segment and the words rewritten until it fits, gang-takes for the assembly and the charts.+- Done in 0.1.14: `compose` cuts the final video from the motion of every step visit and the AI's drawings, two minutes at most, the picture leading and the adom-tts words cut to it. Left for 0.2: the AI writing its own words per segment, gang-takes for the charts. - The split screen for two engines, and the grid for five (Fable, Astra, Antigravity, Grok, Kimi), cut from the same step tags. - A clip for each step on this page, and the final video at the top of it. 
SKILL.md+5−1
@@ -28,7 +28,11 @@ The flow is a file, `flows/board.json`: the steps in order (intake, models, plac  One clip per step. `capture open` puts the board on the test box; from then on every `step <name>` stops the previous step's clip and starts this step's own window recording, tagged with the step, and its hint says what that clip should show (the flow file's `record` line: the parts landing for placement, the nets landing for routing, the pours filling for pours, the return to an earlier step when an analysis fails). `deliver` lists the clips. The final video is cut from them, one segment per step, so two engines' videos line up step for step, and the page can show a little clip beside every step's numbers. -Per-step clips stay RAW: the recording, its 10x cut and its motion-only action cut carry no captions, because the final video (and a side-by-side of two runs) draws its own overlays from the ledger. `compose` builds the final 1920x1080 video: each step visit's 10x cut, decimated to motion, with the step chip, the engine and board, and the run and step timers as small hr / min / sec tables in the lower right (Adom faces), narrated by adom-tts from the ledger. No recording may outlive an hour (a hard cap on every recording), `finish` and `deliver` stop the running clip, and every command stops a clip that has run past twice its step's budget: a recorder left running is a mistake, not evidence.+Per-step clips stay RAW: the recording, its 10x cut and its motion-only action cut carry no captions, because the final video (and a side-by-side of two runs) draws its own overlays from the ledger. `compose` builds the final 1920x1080 video, two minutes at most (`--max-seconds 120`): each step visit's motion only, in order, with the step chip, the engine and board, and the run and step timers as small hr / min / sec tables in the lower right (Adom faces); the AI's analysis drawings fullscreen for five seconds each; adom-tts narration cut to fit each segment (the picture leads, the words are shortened or said faster, never the other way round); when the motion adds up to more than the budget every frame plays faster, evenly. No title pages, no held frames. A visit with under a second of motion stays on the page and out of the video. The page carries each cut under a new name (`final-<time>.mp4`) so a cached one never shows.++After `analyze current` and `analyze thermal`, do the analysis yourself and draw it: a current density map on the copper (a DC conduction solve on the board's filled polygons between each loaded net's terminals) and a temperature rise map (the tab watts and the Joule loss, spread by the copper, lost to the air), each a 1920x1080 PNG, then `artifact --kind analysis-image --file <png> --caption "..."` (it goes fullscreen into the video and onto the page under the step), then `tour nets --nets <the pour nets the hint lists>` under the same step so the clip ends on the copper the analysis judged, lit net by net.++No recording may outlive an hour (a hard cap on every recording), `finish` and `deliver` stop the running clip, and every command stops a clip that has run past twice its step's budget: a recorder left running is a mistake, not evidence.  `capture open` puts the board on screen the same way for every engine (foreground OpenGL on a test box we own, maximised, zoom to fit). `capture start` records the PCB editor window itself through Adom Bridge's window recorder (Windows Graphics Capture, background-capturable: whatever another thread or an updater puts in front of KiCad on a shared box does not reach the take, and nobody at the box is disturbed; the monitor is recorded only when no editor is open), every stage command writes a marker with its timestamp into the manifest, `capture mark <label>` adds yours, `capture stop` pulls the MP4 into the run. The split-screen comparison (gang-takes split mode) aligns the two engines on those markers. 
bin/adom-aiflow
⋯ 1 unchanged line ⋯
docs/video.md+9−5
@@ -7,11 +7,15 @@ The evidence of a run is its video, and the video is built from the steps, not r 3. **The binary cuts the sped-up clip and the action cut itself, both RAW.** The action cut keeps only the frames that changed (near-duplicate frames dropped, each kept frame held a quarter second), with no captions: overlays belong to the final video, so a side-by-side of two runs never paints overlays over overlays. `compose` draws the step chip, the engine and board, and the run and step timers (hr / min / sec tables, lower right, Adom faces) from the ledger onto each segment, and narrates it. 3b. **The sped-up clip.** When a clip stops it is pulled into the run and a 10x version is cut next to it (a 51 s routing landing becomes a 5.1 s clip). Both go into the ledger as artifacts of that step, with their seconds: `{"event":"artifact","step":"routing","kind":"clip","seconds":51.0,"file":...}` and `kind:"clip10x"`. 4. **Every step records what it made.** The routed board, the pours plan, the zone state, the analysis tables, the per-step table: all artifacts in the ledger, so the final cut knows what exists without anyone remembering.-5. **The final video is composed, not edited.** At `deliver` the binary (0.2) reads the artifacts, picks one segment per step (the 10x clips, the analysis cards, the finish line), targets about two minutes, and writes the composition: segment order, each segment's seconds, and the words for that segment.-6. **The voiceover fits the picture.** For each segment the composer writes the narration, asks adom-tts for the audio, measures the audio against the segment's seconds, and if they do not match it re-composes the words (shorter or longer) and asks again, iterating until the audio fits the clip. Then gang-takes assembles the segments, the audio and the comparison charts.-7. **Two engines, one cut.** Because both runs carry the same steps, the same clip tags and the same artifacts, the split-screen comparison is the same composition run twice, side by side, with the per-step numbers from both ledgers on the charts.--0.1 does steps 1, 3 and 4. Steps 2, 5, 6 and 7 are 0.2: the composer, the adom-tts loop, the gang-takes split mode.+5. **The final video is composed, not edited.** `compose` reads the ledger and builds the video from the pieces in the order they happened: every step visit's motion (the action cut of its raw clip, so only the frames where something moved), and every drawing the AI registered with `artifact` during a step, fullscreen. Nothing else: no title pages, no held frames, no cards.+6. **The video leads; the words are cut to it.** A segment is exactly as long as its motion. The narration for it (the step, why the AI came back, the real minutes) is asked of adom-tts in three lengths, fullest first, and the first that fits the segment is used; if even the shortest runs long it is said faster and cut at the picture. The picture is never held for the words.+7. **Two minutes at most.** `compose --max-seconds` (120 by default) is the cap: when the run's motion adds up to more than the budget, every kept frame plays faster, evenly across the run (4 frames per second is the pace of one step's clip; the video says its pace in the ledger). A visit with under a second of motion stays on the page and out of the video. Each drawing takes `--still-seconds` (5) of the budget.+8. **The AI's drawings are in the video.** After `analyze current` and `analyze thermal` the hint asks the AI to do the analysis itself and draw it (a current density map on the copper, a temperature rise map), then `artifact --kind analysis-image --file <png> --caption "..."`. The drawing is a fullscreen shot in the video at that point of the step, with the overlays, and a figure on the run page under the step. This is the one place the video leaves the EDA window.+9. **The pours are walked after every step that judged them.** The same hints ask for `tour nets --nets <the pour nets>` under the analysis step: each net lit as a whole, pours and traces together, framed, so the clip of the current step and of the thermal step ends on the copper the analysis was about.+10. **Two engines, one cut.** Because both runs carry the same steps, the same clip tags and the same artifacts, the split-screen comparison is the same composition run twice, side by side, with the per-step numbers from both ledgers on the charts (0.2).+11. **A new name for every cut.** The run page carries the video as `final-<time of the cut>.mp4`, so a browser that cached the last cut shows this one.++0.1 does 1, 3, 4, 5, 6, 7, 8, 9 and 11; 2 and 10 are 0.2.  ## Disk 
flows/board.json+10−6
@@ -55,20 +55,24 @@     {       "name": "current",       "who": "binary",-      "does": "IPC-2221 on every loaded net, pour and via capacity, the same-layer rule",+      "does": "IPC-2221 on every loaded net, pour and via capacity, the same-layer rule; then the AI's own current density drawing and a walkthrough of the pours it judged",       "binary": [-        "analyze current"+        "analyze current",+        "artifact --kind analysis-image",+        "tour nets --nets <the pour nets>"       ],-      "record": "no screen action: the clip is the analysis table on the board (the page shows the numbers); keep it short"+      "record": "the analysis table on the board, then the AI's current density drawing (fullscreen in the video, the one place it leaves the editor), then each pour net lit and framed"     },     {       "name": "thermal",       "who": "binary",-      "does": "copper and vias at every hot tab against the rise budget",+      "does": "copper and vias at every hot tab against the rise budget; then the AI's own temperature rise drawing and a walkthrough of the pours it judged",       "binary": [-        "analyze thermal"+        "analyze thermal",+        "artifact --kind analysis-image",+        "tour nets --nets <the pour nets>"       ],-      "record": "same: the hot tabs and their copper; when it fails, the return to pours or placement is the clip worth keeping"+      "record": "the hot tabs and their copper, the AI's heat map fullscreen, then each pour net lit and framed; when it fails, the return to pours or placement is the clip worth keeping"     },     {       "name": "nets",
package.json+1−1
@@ -1,7 +1,7 @@ {   "slug": "adom-aiflow",   "type": "app",-  "version": "0.1.13",+  "version": "0.1.14",   "title": "AI Flow",   "description": "Adom's AI Flow: a tool to help the AI follow all of the steps it takes to build a board. One Rust binary with a crate per step (placement helpers, a grid router with Kelvin taps, pours with keepouts, KiCad's DRC gate, live landing through the KiCad Bridge, copper measurement, current and thermal analysis) and a finish line that refuses an unfinished board. Every command answers with hints for the AI; every turn, its thinking time and every rework loop go into run.jsonl, so Claude, Codex and any other engine are compared on the same flow. KiCad today; Altium, Fusion and Adom's own web apps next.",   "summary": "Adom's AI Flow: a tool to help the AI follow all of the steps it takes to build a board. The AI thinks its way from placement through routing, pours, current and thermal analysis to a delivered video; the binary does the fast, deterministic parts of every step, hands back hints, and keeps a ledger of every turn, every return to an earlier step, and the clock from the prompt to done.",
page.json+1−1
@@ -1,7 +1,7 @@ {   "slug": "adom-aiflow",   "type": "app",-  "version": "0.1.13",+  "version": "0.1.14",   "title": "AI Flow",   "description": "Adom's AI Flow: a tool to help the AI follow all of the steps it takes to build a board. One Rust binary with a crate per step (placement helpers, a grid router with Kelvin taps, pours with keepouts, KiCad's DRC gate, live landing through the KiCad Bridge, copper measurement, current and thermal analysis) and a finish line that refuses an unfinished board. Every command answers with hints for the AI; every turn, its thinking time and every rework loop go into run.jsonl, so Claude, Codex and any other engine are compared on the same flow. KiCad today; Altium, Fusion and Adom's own web apps next.",   "summary": "Adom's AI Flow: a tool to help the AI follow all of the steps it takes to build a board. The AI thinks its way from placement through routing, pours, current and thermal analysis to a delivered video; the binary does the fast, deterministic parts of every step, hands back hints, and keeps a ledger of every turn, every return to an earlier step, and the clock from the prompt to done.",
skills/adom-aiflow/SKILL.md+5−1
@@ -28,7 +28,11 @@ The flow is a file, `flows/board.json`: the steps in order (intake, models, plac  One clip per step. `capture open` puts the board on the test box; from then on every `step <name>` stops the previous step's clip and starts this step's own window recording, tagged with the step, and its hint says what that clip should show (the flow file's `record` line: the parts landing for placement, the nets landing for routing, the pours filling for pours, the return to an earlier step when an analysis fails). `deliver` lists the clips. The final video is cut from them, one segment per step, so two engines' videos line up step for step, and the page can show a little clip beside every step's numbers. -Per-step clips stay RAW: the recording, its 10x cut and its motion-only action cut carry no captions, because the final video (and a side-by-side of two runs) draws its own overlays from the ledger. `compose` builds the final 1920x1080 video: each step visit's 10x cut, decimated to motion, with the step chip, the engine and board, and the run and step timers as small hr / min / sec tables in the lower right (Adom faces), narrated by adom-tts from the ledger. No recording may outlive an hour (a hard cap on every recording), `finish` and `deliver` stop the running clip, and every command stops a clip that has run past twice its step's budget: a recorder left running is a mistake, not evidence.+Per-step clips stay RAW: the recording, its 10x cut and its motion-only action cut carry no captions, because the final video (and a side-by-side of two runs) draws its own overlays from the ledger. `compose` builds the final 1920x1080 video, two minutes at most (`--max-seconds 120`): each step visit's motion only, in order, with the step chip, the engine and board, and the run and step timers as small hr / min / sec tables in the lower right (Adom faces); the AI's analysis drawings fullscreen for five seconds each; adom-tts narration cut to fit each segment (the picture leads, the words are shortened or said faster, never the other way round); when the motion adds up to more than the budget every frame plays faster, evenly. No title pages, no held frames. A visit with under a second of motion stays on the page and out of the video. The page carries each cut under a new name (`final-<time>.mp4`) so a cached one never shows.++After `analyze current` and `analyze thermal`, do the analysis yourself and draw it: a current density map on the copper (a DC conduction solve on the board's filled polygons between each loaded net's terminals) and a temperature rise map (the tab watts and the Joule loss, spread by the copper, lost to the air), each a 1920x1080 PNG, then `artifact --kind analysis-image --file <png> --caption "..."` (it goes fullscreen into the video and onto the page under the step), then `tour nets --nets <the pour nets the hint lists>` under the same step so the clip ends on the copper the analysis judged, lit net by net.++No recording may outlive an hour (a hard cap on every recording), `finish` and `deliver` stop the running clip, and every command stops a clip that has run past twice its step's budget: a recorder left running is a mistake, not evidence.  `capture open` puts the board on screen the same way for every engine (foreground OpenGL on a test box we own, maximised, zoom to fit). `capture start` records the PCB editor window itself through Adom Bridge's window recorder (Windows Graphics Capture, background-capturable: whatever another thread or an updater puts in front of KiCad on a shared box does not reach the take, and nobody at the box is disturbed; the monitor is recorded only when no editor is open), every stage command writes a marker with its timestamp into the manifest, `capture mark <label>` adds yours, `capture stop` pulls the MP4 into the run. The split-screen comparison (gang-takes split mode) aligns the two engines on those markers.