← Commit history

AI Flow 0.2.78: bottom fill under any number; bridge 1.13.87 note

Colby Knox ·212acc2cdd · ·parent 42efa01
Co-Authored-By: Claude Opus 5.5 <[email protected]>
8 files changed +28−15
Cargo.lock+10−10
@@ -4,7 +4,7 @@ version = 4  [[package]] name = "adom-aiflow"-version = "0.2.77"+version = "0.2.78" dependencies = [  "aiflow-analyze",  "aiflow-board",@@ -25,7 +25,7 @@ dependencies = [  [[package]] name = "aiflow-analyze"-version = "0.2.77"+version = "0.2.78" dependencies = [  "aiflow-board",  "serde",@@ -35,7 +35,7 @@ dependencies = [  [[package]] name = "aiflow-board"-version = "0.2.77"+version = "0.2.78" dependencies = [  "roxmltree",  "serde",@@ -44,7 +44,7 @@ dependencies = [  [[package]] name = "aiflow-bridge"-version = "0.2.77"+version = "0.2.78" dependencies = [  "aiflow-board",  "serde",@@ -53,7 +53,7 @@ dependencies = [  [[package]] name = "aiflow-copper"-version = "0.2.77"+version = "0.2.78" dependencies = [  "aiflow-board",  "aiflow-grid",@@ -63,7 +63,7 @@ dependencies = [  [[package]] name = "aiflow-grid"-version = "0.2.77"+version = "0.2.78" dependencies = [  "aiflow-board",  "serde",@@ -72,7 +72,7 @@ dependencies = [  [[package]] name = "aiflow-place"-version = "0.2.77"+version = "0.2.78" dependencies = [  "aiflow-board",  "serde",@@ -81,7 +81,7 @@ dependencies = [  [[package]] name = "aiflow-pours"-version = "0.2.77"+version = "0.2.78" dependencies = [  "aiflow-board",  "aiflow-copper",@@ -91,7 +91,7 @@ dependencies = [  [[package]] name = "aiflow-router"-version = "0.2.77"+version = "0.2.78" dependencies = [  "aiflow-board",  "aiflow-grid",@@ -101,7 +101,7 @@ dependencies = [  [[package]] name = "aiflow-run"-version = "0.2.77"+version = "0.2.78" dependencies = [  "serde",  "serde_json",
Cargo.toml+1−1
@@ -14,7 +14,7 @@ members = [ ]  [workspace.package]-version = "0.2.77"+version = "0.2.78" edition = "2021" license = "MIT" repository = "https://wiki.adom.inc/adom/adom-aiflow"
bin/adom-aiflow
⋯ 1 unchanged line ⋯
crates/aiflow-bridge/src/fusion.rs+7−1
@@ -266,7 +266,9 @@ pub fn translate(verb: &str, args: &Value, doc: &str, call: &dyn Fn(&str, &Value             // every copper layer's fill, inner ones by the standard's name; top and bottom always reported             let mut filled = serde_json::Map::new();             filled.insert("F.Cu".into(), json!(by["1"].as_f64().unwrap_or(0.0)));-            filled.insert("B.Cu".into(), json!(by[bottom().to_string()].as_f64().or(by["16"].as_f64()).unwrap_or(0.0)));+            // the bottom under whichever number the reply keys it (the board's own, 16, or Fusion's raw 304; fusion-bridge 1.13.87 reports 16)+            let bot: f64 = { let mut keys = vec![bottom().to_string(), "16".to_string(), "304".to_string()]; keys.dedup(); keys.iter().filter_map(|k| by[k.as_str()].as_f64()).sum() };+            filled.insert("B.Cu".into(), json!(bot));             for (k, v) in by.as_object().into_iter().flatten() {                 if let Ok(n) = k.parse::<i64>() { if n != 1 && !is_bottom(n) { filled.insert(layer_label(n, &names), json!(v.as_f64().unwrap_or(0.0))); } }             }@@ -624,6 +626,10 @@ mod tests {         assert_eq!(layer_label(2, &HashMap::new()), "In1.Cu");         set_bottom(16);         assert_eq!(layer_arg(&json!("B.Cu")), Some(json!(16)));+        // fusion-bridge 1.13.87 reports the bottom as 16 even on a 304 board; a reply keyed 304 still counts as B.Cu+        let r = translate("kicad_zone_state", &json!({}), "d", &|v, _| if v == "fusion_pour_state" { json!({"success": true, "filledAreaByLayerMm2": {"1": 10.0, "304": 25.0}, "pours": []}) } else { json!({"source": "<eagle/>"}) });+        assert_eq!(r["filledAreaByLayerMm2"]["B.Cu"], 25.0, "{r}");+        assert!(r["filledAreaByLayerMm2"].get("In303.Cu").is_none(), "{r}");     }  }
docs/release-0.2.78.mdadded+7
@@ -0,0 +1,7 @@+# AI Flow 0.2.78++- **Fusion's newer board format, with Fusion bridge 1.13.87** (#203, adom/fusion-bridge#148). The bridge now+  reports a 304-bottom board as F.Cu/B.Cu (bottom as 16, `fusionBottomLayer: 304`), accepts B.Cu, 16 or 304 for+  the bottom and lands on 304 with 1-64 vias. AI Flow's side already used the board's own bottom (0.2.77); the+  bottom pour fill is now read under whichever number a reply keys it (the board's, 16 or 304), so it never reads+  as 0. The skill says 1.13.87 is needed for these boards (every board Fusion 2706 creates natively).
package.json+1−1
@@ -1,7 +1,7 @@ {   "slug": "adom-aiflow",   "type": "app",-  "version": "0.2.77",+  "version": "0.2.78",   "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.77",+  "version": "0.2.78",   "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+1−1
@@ -195,7 +195,7 @@ While a plan, check-in or human step is open, `finish-guard` answers `waiting-fo  When the human asks for a board in Fusion ("a 12 V to 5 V buck converter using the TPS54202, in Fusion"), the whole flow below is yours: they should never have to spell out a step. Read `docs/fusion-lane.md`-once; the Fusion bridge must be 1.11.33 or later. Hydrogen stays full screen behind Fusion; keep Fusion+once; the Fusion bridge must be 1.11.33 or later, and 1.13.87 or later for a board in Fusion's newer format (every board Fusion 2706 creates: bottom copper is layer 304, named Bottom; AI Flow reads it as B.Cu either way). Hydrogen stays full screen behind Fusion; keep Fusion windowed (about 90 % of the screen), never maximized, so the human sees both and a screen recording catches Fusion's 3D view. Inside Hydrogen, the VS Code tab (the chat) always stays in the left pane with its file explorer closed (`adom-vscode sidebar close`), and every webview (the timeline, the parts pages,