← Commit history
Cargo.lock+10−10
@@ -4,7 +4,7 @@ version = 4  [[package]] name = "adom-aiflow"-version = "0.2.21"+version = "0.2.22" dependencies = [  "aiflow-analyze",  "aiflow-board",@@ -25,7 +25,7 @@ dependencies = [  [[package]] name = "aiflow-analyze"-version = "0.2.21"+version = "0.2.22" dependencies = [  "aiflow-board",  "serde",@@ -35,7 +35,7 @@ dependencies = [  [[package]] name = "aiflow-board"-version = "0.2.21"+version = "0.2.22" dependencies = [  "roxmltree",  "serde",@@ -44,7 +44,7 @@ dependencies = [  [[package]] name = "aiflow-bridge"-version = "0.2.21"+version = "0.2.22" dependencies = [  "aiflow-board",  "serde",@@ -53,7 +53,7 @@ dependencies = [  [[package]] name = "aiflow-copper"-version = "0.2.21"+version = "0.2.22" dependencies = [  "aiflow-board",  "aiflow-grid",@@ -63,7 +63,7 @@ dependencies = [  [[package]] name = "aiflow-grid"-version = "0.2.21"+version = "0.2.22" dependencies = [  "aiflow-board",  "serde",@@ -72,7 +72,7 @@ dependencies = [  [[package]] name = "aiflow-place"-version = "0.2.21"+version = "0.2.22" dependencies = [  "aiflow-board",  "serde",@@ -81,7 +81,7 @@ dependencies = [  [[package]] name = "aiflow-pours"-version = "0.2.21"+version = "0.2.22" dependencies = [  "aiflow-board",  "aiflow-copper",@@ -91,7 +91,7 @@ dependencies = [  [[package]] name = "aiflow-router"-version = "0.2.21"+version = "0.2.22" dependencies = [  "aiflow-board",  "aiflow-grid",@@ -101,7 +101,7 @@ dependencies = [  [[package]] name = "aiflow-run"-version = "0.2.21"+version = "0.2.22" dependencies = [  "serde",  "serde_json",
Cargo.toml+1−1
@@ -14,7 +14,7 @@ members = [ ]  [workspace.package]-version = "0.2.21"+version = "0.2.22" edition = "2021" license = "MIT" repository = "https://wiki.adom.inc/adom/adom-aiflow"
bin/adom-aiflow
⋯ 1 unchanged line ⋯
crates/adom-aiflow/src/mechanical.rs+20−2
@@ -341,9 +341,16 @@ pub fn check(b: &Board, board_path: &str, model_box: &dyn Fn(&str) -> Option<(f6 pub fn gate_clear(gate: &Value) -> bool { gate["courtyardsOk"] != false && gate["bodiesOk"] != false }  /// False for a Fusion (EAGLE) board: its KiCad rendering carries no footprint courtyard or fab-/// graphics, so these checks cannot run on it and the stage says so instead of passing.+/// graphics, so these checks cannot run on it and the stage says so instead of passing. That holds+/// for the run's own rendering too (`start --board B.brd` converts it to board-0.kicad_pcb, marked+/// generator "adom-aiflow-fusion"): judged as a KiCad board, every Fusion run was refused at the+/// gate for courtyards it can never carry (fusion-lane, 2026-10-27). pub fn applies(board_path: &str) -> bool {-    std::fs::read_to_string(board_path).map(|t| !aiflow_board::eagle::is_eagle(&t)).unwrap_or(false)+    std::fs::read_to_string(board_path).map(|t| !aiflow_board::eagle::is_eagle(&t) && !is_fusion_rendering(&t)).unwrap_or(false)+}++fn is_fusion_rendering(text: &str) -> bool {+    text.chars().take(400).collect::<String>().contains("(generator \"adom-aiflow-fusion\")") }  /// `check` with the 3D model fallback read from the model files that resolve here (their STEP@@ -422,6 +429,17 @@ pub fn declared_bodies(b: &Board, spec: &Value) -> (Vec<String>, Vec<String>) {  #[cfg(test)] pub(crate) mod tests {+    #[test]+    fn fusion_renderings_skip_the_courtyard_checks() {+        let dir = std::env::temp_dir().join(format!("aiflow-mech-{}", std::process::id()));+        std::fs::create_dir_all(&dir).unwrap();+        let fusion = dir.join("board-0.kicad_pcb");+        std::fs::write(&fusion, "(kicad_pcb (version 20241229) (generator \"adom-aiflow-fusion\") (generator_version \"1\")\n)").unwrap();+        let kicad = dir.join("k.kicad_pcb");+        std::fs::write(&kicad, "(kicad_pcb (version 20241229) (generator \"pcbnew\")\n)").unwrap();+        assert!(!super::applies(&fusion.display().to_string()));+        assert!(super::applies(&kicad.display().to_string()));+    }     use super::*;      /// A footprint at (x, y) with a body of w x h on F.Fab and, when `crt` is set, a courtyard grown by `crt`.
package.json+1−1
@@ -1,7 +1,7 @@ {   "slug": "adom-aiflow",   "type": "app",-  "version": "0.2.21",+  "version": "0.2.22",   "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.21",+  "version": "0.2.22",   "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.",