app
AI Flow
Public Made by Adomby adom
Adom's AI Flow: a tool to help the AI follow all of the steps it takes to build a board.
← Commit history
AI Flow 0.2.72: offer a skill or flow app of their own
Co-Authored-By: Claude Opus 5.5 <[email protected]>
8 files changed
+38−14
Cargo.lock+10−10@@ -4,7 +4,7 @@ version = 4 [[package]] name = "adom-aiflow"-version = "0.2.71"+version = "0.2.72" dependencies = [ "aiflow-analyze", "aiflow-board",@@ -25,7 +25,7 @@ dependencies = [ [[package]] name = "aiflow-analyze"-version = "0.2.71"+version = "0.2.72" dependencies = [ "aiflow-board", "serde",@@ -35,7 +35,7 @@ dependencies = [ [[package]] name = "aiflow-board"-version = "0.2.71"+version = "0.2.72" dependencies = [ "roxmltree", "serde",@@ -44,7 +44,7 @@ dependencies = [ [[package]] name = "aiflow-bridge"-version = "0.2.71"+version = "0.2.72" dependencies = [ "aiflow-board", "serde",@@ -53,7 +53,7 @@ dependencies = [ [[package]] name = "aiflow-copper"-version = "0.2.71"+version = "0.2.72" dependencies = [ "aiflow-board", "aiflow-grid",@@ -63,7 +63,7 @@ dependencies = [ [[package]] name = "aiflow-grid"-version = "0.2.71"+version = "0.2.72" dependencies = [ "aiflow-board", "serde",@@ -72,7 +72,7 @@ dependencies = [ [[package]] name = "aiflow-place"-version = "0.2.71"+version = "0.2.72" dependencies = [ "aiflow-board", "serde",@@ -81,7 +81,7 @@ dependencies = [ [[package]] name = "aiflow-pours"-version = "0.2.71"+version = "0.2.72" dependencies = [ "aiflow-board", "aiflow-copper",@@ -91,7 +91,7 @@ dependencies = [ [[package]] name = "aiflow-router"-version = "0.2.71"+version = "0.2.72" dependencies = [ "aiflow-board", "aiflow-grid",@@ -101,7 +101,7 @@ dependencies = [ [[package]] name = "aiflow-run"-version = "0.2.71"+version = "0.2.72" dependencies = [ "serde", "serde_json",
Cargo.toml+1−1@@ -14,7 +14,7 @@ members = [ ] [workspace.package]-version = "0.2.71"+version = "0.2.72" edition = "2021" license = "MIT" repository = "https://wiki.adom.inc/adom/adom-aiflow"
bin/adom-aiflow⋯ 1 unchanged line ⋯
crates/adom-aiflow/src/main.rs+7−1@@ -2819,6 +2819,12 @@ fn page_results_cmd(r: &mut Run, dir: &Path, page: &str, out: Option<&str>, page } /// The give-back hint: what the AI learned belongs to every Adom user.+/// Colby (2026-11-11): at the end of a run, offer the human a tailored experience: their own skill or flow app,+/// published on the wiki, that makes AI Flow work their way. An offer, once; never instead of giving a fix back.+fn tailor_hint() -> String {+ "Offer the human, once: if they want AI Flow to work their way (their fab's rules, their own checks, their naming and layout habits, a stage AI Flow does not have), you can build them their own skill (a SKILL.md with their preferences, skill adom-wiki-skillpack) or their own flow app (copy template/flow-app from adom/adom-aiflow: a dynamic skill with its own steps and checks; skills building-adom-apps and app-creator) and publish it on the wiki, private or for their team, so every run uses it. It runs beside AI Flow and needs no change to it. When AI Flow itself was wrong, give that back instead (the line above). An offer, not a step: a no is fine.".to_string()+}+ fn give_back_hint() -> String { "Give it back: if the binary was wrong, rigid or missing a step, or you wrote code that did a step better, file it on the page (`adom-wiki issue create adom/adom-aiflow --title \"...\" --body \"...\"`) or open a PR against its repo with the crate change. adom-aiflow is the token cache of every Adom user's flow: what your run figured out makes the next run cheaper for everyone.".to_string() }@@ -7804,7 +7810,7 @@ fn main() { report_note.push_str(&format!(" Run page: {url} ({})", notes.join("; "))); } let verified_text = verified::message(&checked);- ok(&format!("delivered: {} from the prompt to \"done, here is your video\", {:.1} min (finish was at {:.1} min)\n{}\n{verified_text}{}", r.data["engine"], r.delivered_minutes().unwrap_or(0.0), r.elapsed_minutes(), step_table(&r), clipwatch::no_recorder_note(&r.data).map(|n| format!("\n{n}")).unwrap_or_default()), &["Your message to the human must state the verified list as it stands; no \"ready to fabricate\" unless every item is yes, and still advise a human review.".into(), "This is the number on the chart. The per-step table is the run's shape: thinking is the AI, binary is the tool, returns are the reworks.".into(), report_note, molecule_publish_hint(&r).unwrap_or_default(), give_back_hint()]);+ ok(&format!("delivered: {} from the prompt to \"done, here is your video\", {:.1} min (finish was at {:.1} min)\n{}\n{verified_text}{}", r.data["engine"], r.delivered_minutes().unwrap_or(0.0), r.elapsed_minutes(), step_table(&r), clipwatch::no_recorder_note(&r.data).map(|n| format!("\n{n}")).unwrap_or_default()), &["Your message to the human must state the verified list as it stands; no \"ready to fabricate\" unless every item is yes, and still advise a human review.".into(), "This is the number on the chart. The per-step table is the run's shape: thinking is the AI, binary is the tool, returns are the reworks.".into(), report_note, molecule_publish_hint(&r).unwrap_or_default(), give_back_hint(), tailor_hint()]); } } }
docs/release-0.2.72.mdadded+8@@ -0,0 +1,8 @@+# AI Flow 0.2.72++- **Make it theirs.** At the end of a run, `deliver` reminds the AI, once, to offer the human a tailored+ experience: their own skill (their preferences and steps) or their own flow app (from `template/flow-app`)+ published on the wiki, private or for their team, so every run works their way. The main skill has the+ section "Make it theirs: a skill or flow app of their own": offer it when the human states a standing+ preference, corrects the flow the same way twice, or asks for something AI Flow does not do. An offer, never+ a step, and never instead of giving a fix back to AI Flow when AI Flow is wrong.
package.json+1−1@@ -1,7 +1,7 @@ { "slug": "adom-aiflow", "type": "app",- "version": "0.2.71",+ "version": "0.2.72", "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, Fusion 360 and Altium Designer today (the same steps and gates through each tool's bridge); 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.2.71",+ "version": "0.2.72", "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, Fusion 360 and Altium Designer today (the same steps and gates through each tool's bridge); 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+10@@ -454,6 +454,16 @@ The live clips page is the binary's too: `clips --page <owner/slug>` rebuilds `d adom-aiflow is the token cache of every Adom user's flow. When the binary was wrong, rigid or missing a step (an RF board that needs length-matched differential pairs and impedance checks, say), or your own code did a step better, file it: `adom-wiki issue create adom/adom-aiflow ...` or a PR against the repo, then `adom-aiflow giveback <url>` so the run counts it. Adom processes PRs within minutes during business hours (a non-stop PR intake), and `deliver` reports how many issues and PRs the run's AI gave back. ++## Make it theirs: a skill or flow app of their own++Some people want AI Flow to work their way: their fab's own rules, checks their company requires, how they name nets and place parts, a stage AI Flow does not have (their test fixture, their enclosure, their ERP). Offer to build that with them, as their own wiki package, so every later run picks it up:++- **A skill** (a SKILL.md with their preferences and steps, skill adom-wiki-skillpack): the lightest way; "always use our 0.15 mm silkscreen and JLC's 4-layer stackup", "our boards get a QR code on the back".+- **A flow app** (copy `template/flow-app` from adom/adom-aiflow; skills building-adom-apps and app-creator): a dynamic skill of their own with steps, checks and hints, beside AI Flow, like adom-aiflow-jlcpcb.++Publish it on the wiki, private or for their team (`adom-wiki pkg publish`). Offer it when the human states a standing preference, corrects the flow the same way twice, or asks for something AI Flow does not do; `deliver` reminds you once at the end of a run. It is an offer, never a step, and it is not a way around AI Flow: when AI Flow itself is wrong, give the fix back to AI Flow (above), so every user gets it.+ ## The code checks what you filmed Every clip stop runs a blank check (eight frames sampled in one decode pass; a clip whose frames are one flat colour filmed an unpainted or covered window; a flagged clip gets no cuts, and a clip over 1 GB is checked and cut later by `recut` or `compose`, never inside the step) and writes a contact sheet, `<clip>-sheet.png`, nine frames on one image. The stop prints the sheet's path: LOOK AT IT before the next step, the way a camera operator checks the take. A clip of 64 MB or more (`AIFLOW_MEDIA_BACKGROUND_MB`: a size, 0 for every clip, `off` for none) goes to the background media worker instead (issue #170): the step goes on at once, and your next adom-aiflow command prints what the worker found (a blank or truncated clip, the contact sheet, the cuts). `finish` says how many clips are still in the worker; `compose`, `recut` and `deliver` wait for it (`AIFLOW_MEDIA_WAIT_MIN`, default 30) and do any clip still queued themselves. Media time is its own column in the step table, inside tool time; a hands-on wait for the human is the hold column, a pause. The blank check samples the centre 60 % of each frame; a frame with two or more rows or columns of board content (a long thin strip at zoom-to-fit) is painted, not flat. A step's clip on a KiCad editor prints the editor's title ("filming KiCad's ..."), and the camera only ever films the PCB editor whose title names this run's board, never another project's. A clip that filmed another project or anything private: `capture reject <step>-<visit> --reason "..." --off-page` deletes it, its cuts, sheet and screenshots, and leaves it off the page. A flagged clip is marked `suspect` in the manifest, shown on the run page with the reason, left out of the composed video, and `deliver` names every unresolved one in a note and delivers anyway (`--accept-suspect` says you looked). Every stop checks that the clip reached the run (a non-empty local file) and pulls up to three times; a clip that still is not there is flagged `pullFailed` with its desktop path and a WARNING, and `recut`, `finish` and `deliver` pull it again first. Run `recut` promptly: the desktop cleans its recordings folder. `tour 3d` shows the viewer once and waits for a painted canvas before it records, because a viewer opened in the background never draws its GL canvas.