← Commit history

standard 0.20.3: engine 0.17.3 (width rule minMm); fusion 1.13.13

Colby Knox ·6450c0ba68 ·12d ago ·parent a2a6477
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.",