skill
EDA Bridge Standard: one way for an AI to drive every PCB tool
Public Made by Adomby adom
The standard every Adom EDA bridge follows so one AI can drive Altium, KiCad, Fusion 360 and any future PCB tool the same way: shared verb names in tiers, the board model JSON, reply and refusal conventions, and a coverage table of each bridge against the Altium reference.
← Commit history
standard 0.20.3: engine 0.17.3 (width rule minMm); fusion 1.13.13
9 files changed
+14−10
README.md+2@@ -158,6 +158,8 @@ Decisions so far (proposals from the KiCad and Fusion bridges, 2026-10-27; issue ## Status +Version 0.20.3: the engine (0.17.3) reads a standard width rule's `minMm` when it has no preferred width, so plan_route routes at+Fusion's EAGLE minimum width (fusion-lane). Version 0.20.2: the engine (0.17.2) classes a rule by its own name only when it has no Altium ordinal, so Altium's other rules no longer read as critical ones (0.20.1 read "Routing Topology (Shortest)" as a short-circuit rule). Version 0.20.1: the engine (0.17.1) fixes fusion-lane's findings in `board_report`:
docs/coverage.md+1−1@@ -1,6 +1,6 @@ # Coverage: every standard verb on each bridge -Altium bridge 0.2.81 (the reference), KiCad bridge 1.0.83, Fusion 360 bridge 1.13.12. 56 verbs came from other bridges' proposals (tools/proposed/); they are marked *proposed*.+Altium bridge 0.2.81 (the reference), KiCad bridge 1.0.83, Fusion 360 bridge 1.13.13. 56 verbs came from other bridges' proposals (tools/proposed/); they are marked *proposed*. `exact` is the same job under the same or an equivalent name; `partial` does part of it or does it differently (`verbs/coverage.json` names what in `note`); `unsupported` answers `not_supported` for the whole job and is not counted; blank is missing. Generated by `tools/generate.py` from `verbs/coverage.json`; do not edit by hand.
engine/Cargo.lock+1−1@@ -4,7 +4,7 @@ version = 4 [[package]] name = "adom-eda-checks"-version = "0.17.2"+version = "0.17.3" dependencies = [ "roxmltree", "serde_json",
engine/Cargo.toml+1−1@@ -1,6 +1,6 @@ [package] name = "adom-eda-checks"-version = "0.17.2"+version = "0.17.3" edition = "2021" description = "The EDA Bridge Standard's checks and board-file writers, computed from the board model JSON: no bridge calls, no tool." license = "MIT"
engine/README.md+1−1@@ -112,7 +112,7 @@ adom-eda-checks import_svg --svg logo.svg --args '{"at": [10, 10], "widthMm": 20 Replies keep the standard envelope (`success`, `errorCode`, `error`, `_hint`) and name verbs without a prefix (`apply_pours`, `add_rule`, `place_vias`): a bridge adds its own. Every reply also carries `engine`-(`"adom-eda-checks 0.17.2"`), so a bridge reports the engine it runs without writing the version by hand.+(`"adom-eda-checks 0.17.3"`), so a bridge reports the engine it runs without writing the version by hand. ## Tests
engine/src/features.rs+3−1@@ -194,7 +194,8 @@ pub fn via_style(rules: &[Value]) -> Option<(f64, f64)> { pub fn width_style(rules: &[Value]) -> Option<f64> { if let Some(r) = rules.iter().filter(|r| r["enabled"] != json!(false)) .find(|r| r["kind"].as_str().map(|k| k.eq_ignore_ascii_case("width")).unwrap_or(false)) {- if let Some(v) = r["preferredMm"].as_f64().or_else(|| r["widthMm"].as_f64()) { return Some(v); }+ // its preferred width, else its minimum, as Altium's descriptor is read (Fusion sends EAGLE's msWidth as minMm)+ if let Some(v) = r["preferredMm"].as_f64().or_else(|| r["widthMm"].as_f64()).or_else(|| r["minMm"].as_f64()) { return Some(v); } } let num = |d: &str, key: &str| -> Option<f64> { let i = d.find(&format!("({key}="))? + key.len() + 2;@@ -431,6 +432,7 @@ mod tests { #[test] fn width_style_reads_the_standard_rule_and_altiums_descriptor() { assert_eq!(width_style(&[json!({"kind": "width", "preferredMm": 0.2})]), Some(0.2));+ assert_eq!(width_style(&[json!({"kind": "width", "name": "minimum width (msWidth)", "minMm": 0.15})]), Some(0.15)); let alt = vec![json!({"enabled": true, "scope1": "InNet('VIN')", "priority": 1, "descriptor": "Width Constraint (Min=20mil) (Max=40mil) (Preferred=30mil) (InNet('VIN'))"}), json!({"enabled": true, "scope1": "All", "priority": 2, "descriptor": "Width Constraint (Min=10mil) (Max=10mil) (Preferred=10mil) (All)"})]; assert_eq!(width_style(&alt), Some(0.254), "the board-wide rule, not a net's");
package.json+1−1@@ -1,6 +1,6 @@ { "slug": "eda-bridge-standard",- "version": "0.20.2",+ "version": "0.20.3", "type": "skill", "title": "EDA Bridge Standard: one way for an AI to drive every PCB tool", "description": "The standard every Adom EDA bridge follows so one AI can drive Altium, KiCad, Fusion 360 and any future PCB tool the same way: shared verb names in tiers, the board model JSON, reply and refusal conventions, and a coverage table of each bridge against the Altium reference.",
verbs/coverage.json+2−2@@ -1,5 +1,5 @@ {- "standard": "0.20.2",+ "standard": "0.20.3", "reference": { "bridge": "altium", "version": "0.2.81"@@ -7,7 +7,7 @@ "proposed": 56, "compared": { "kicad": "1.0.83",- "fusion360": "1.13.12"+ "fusion360": "1.13.13" }, "tiers": { "core": "Read and edit the design. Every bridge provides these: they are how an AI sees and changes a board.",
verbs/standard.json+2−2@@ -1,5 +1,5 @@ {- "standard": "0.20.2",+ "standard": "0.20.3", "reference": { "bridge": "altium", "version": "0.2.81"@@ -7,7 +7,7 @@ "proposed": 56, "compared": { "kicad": "1.0.83",- "fusion360": "1.13.12"+ "fusion360": "1.13.13" }, "tiers": { "core": "Read and edit the design. Every bridge provides these: they are how an AI sees and changes a board.",