← All Pull Requests

kicad-lane: release script pushes only the KiCad reference to the EDA Bridge Standard (standard-lane owns the page) #23

Merged opened by Colby Knox 2026-10-27

From kicad-lane. adom/eda-bridge-standard now belongs to the standard-lane thread (its pinned issue #3). From here on, a KiCad release pushes only its own reference file there. This change makes the release script and the docs follow that rule.

  • tools/build_native_release.py: refresh_standard now pushes only reference/kicad-<ver>.json. It no longer runs the standard's generate.py or pushes its outputs. After the push it reads the file back from a fresh clone, prints the coverage it expects (worked out in a scratch clone, never pushed), and reminds the releaser to ping standard-lane.
  • skills/kicad-bridge-publish/SKILL.md, skills/kicad-bridge-dev/SKILL.md, rust/README.md: say the same. A job the standard lacks is proposed on an issue there, and the entry is added to the proposals file once standard-lane agrees.

There's no runtime change. It ships with the next release.

🤖 Generated with Claude Code

Diff Skip to comments

--- a/tools/build_native_release.py+++ b/tools/build_native_release.py@@ -1,287 +1,292 @@⋯ 256 unchanged lines ⋯     print("  Boxes pick it up on the 4 h poll, or now with bridge_install {manifestUrl: the insiders version.json, force: true}")  def refresh_standard(ver, zpath):-    """Write reference/kicad-<ver>.json (this release's verbs, aliases included) into a fresh clone of-    adom/eda-bridge-standard, run its tools/generate.py, and push the files that moved. A failure here is-    reported, never fatal: the release has already shipped."""-    import filecmp, tempfile+    """Push reference/kicad-<ver>.json (this release's verbs, aliases included) to adom/eda-bridge-standard, and nothing+    else: standard-lane owns the page and regenerates its coverage (pinned issue #3 there). The coverage KiCad would+    get is computed in a scratch clone and printed, never pushed. A failure here is reported, never fatal: the release+    has already shipped."""+    import tempfile     with zipfile.ZipFile(zpath) as z:         verbs = sorted(set(json.loads(z.read("bridge.json"))["verbs"]))     base = Path(tempfile.mkdtemp(prefix="eda-std-"))-    fresh, pristine = base / "std", base / "pristine"-    for d in (fresh, pristine):-        r = subprocess.run(["adom-wiki", "repo", "clone", "adom/eda-bridge-standard", "--dir", str(d)], capture_output=True, text=True)-        if r.returncode != 0:-            print(f"WARNING: could not clone adom/eda-bridge-standard; refresh its KiCad coverage by hand ({r.stderr[-200:]})")-            return-    (fresh / "reference" / f"kicad-{ver}.json").write_text(json.dumps({"bridge": "kicad", "version": ver, "verbs": verbs}, indent=1) + "\n")-    g = subprocess.run([sys.executable, "tools/generate.py"], cwd=fresh, capture_output=True, text=True)-    if g.returncode != 0:-        print(f"WARNING: the standard's generate.py failed; nothing pushed there: {g.stderr[-300:]}")+    fresh, check = base / "std", base / "check"+    r = subprocess.run(["adom-wiki", "repo", "clone", "adom/eda-bridge-standard", "--dir", str(fresh)], capture_output=True, text=True)+    if r.returncode != 0:+        print(f"WARNING: could not clone adom/eda-bridge-standard; push reference/kicad-{ver}.json by hand ({r.stderr[-200:]})")         return-    moved = [f"reference/kicad-{ver}.json"] + [f for f in ("verbs/coverage.json", "verbs/standard.json", "docs/coverage.md", "README.md")-                                                if not filecmp.cmp(fresh / f, pristine / f, shallow=False)]-    r = subprocess.run(["adom-wiki", "repo", "push", "adom/eda-bridge-standard", "-m", f"KiCad bridge {ver} reference ({g.stdout.strip()})", "--files"] + moved,+    ref = f"reference/kicad-{ver}.json"+    (fresh / ref).write_text(json.dumps({"bridge": "kicad", "version": ver, "verbs": verbs}, indent=1) + "\n")+    r = subprocess.run(["adom-wiki", "repo", "push", "adom/eda-bridge-standard", "-m", f"kicad-lane: KiCad bridge {ver} reference", "--files", ref],                        cwd=fresh, capture_output=True, text=True)     ok = '"ok": true' in r.stdout or "PUSH_UNCHANGED" in r.stdout + r.stderr-    print(f"EDA Bridge Standard: {g.stdout.strip()} -> {'pushed ' + ', '.join(moved) if ok else 'push FAILED: ' + (r.stdout + r.stderr)[-300:]}")+    if not ok:+        print(f"EDA Bridge Standard: push of {ref} FAILED: {(r.stdout + r.stderr)[-300:]}")+        return+    # read it back from a second clone, and work out the coverage standard-lane's regeneration will show+    subprocess.run(["adom-wiki", "repo", "clone", "adom/eda-bridge-standard", "--dir", str(check)], capture_output=True, text=True)+    same = (check / ref).exists() and (check / ref).read_text() == (fresh / ref).read_text()+    g = subprocess.run([sys.executable, "tools/generate.py"], cwd=check, capture_output=True, text=True)+    print(f"EDA Bridge Standard: pushed {ref} ({'read back' if same else 'NOT found on a fresh clone'}); "+          f"expected after regeneration: {g.stdout.strip() or g.stderr[-200:]}. Now ping standard-lane to regenerate: "+          f"a SendMessage to the session named in adom/eda-bridge-standard issue #3, or a 'kicad-lane:' issue there.")   if __name__ == "__main__":     main()+--- a/skills/kicad-bridge-publish/SKILL.md+++ b/skills/kicad-bridge-publish/SKILL.md@@ -1,279 +1,285 @@⋯ 272 unchanged lines ⋯  Before `--publish`: the verb battery passes on the test box (`run_verb_tests.py`, which fails any catalog verb it does not test) and `cargo test --workspace` passes (`every_verb_has_a_standard_decision`, the `bridge.json` check).-`build_native_release.py --publish` then syncs `bridge.json`'s verb list to the catalog and refreshes the standard's-KiCad coverage itself: `reference/kicad-<ver>.json` from the release's verbs, `tools/generate.py`, and a push of the-files that moved to adom/eda-bridge-standard. A verb that does a standard job under another name gets an alias in-`catalog::ALIASES` first, or the coverage table does not count it.+`build_native_release.py --publish` then syncs `bridge.json`'s verb list to the catalog and pushes+`reference/kicad-<ver>.json` (the release's verbs) to adom/eda-bridge-standard, and nothing else there. The page+belongs to the standard-lane thread, which regenerates the coverage: after the push, ping it (its session name is in the+page's pinned issue #3) or open an issue titled `kicad-lane: <what>`. Never run the standard's `generate.py` and push its+outputs; the release script prints the coverage it expects instead. A verb that does a standard job under another+name gets an alias in `catalog::ALIASES` first (or an entry in the kicad section of the standard's+`tools/equivalents.json`), or the coverage table does not count it. A job the standard lacks is proposed on an issue+there, then added to `tools/proposed.json` once standard-lane agrees.++--- a/skills/kicad-bridge-dev/SKILL.md+++ b/skills/kicad-bridge-dev/SKILL.md@@ -1,1039 +1,1040 @@⋯ 148 unchanged lines ⋯ `catalog.rs`'s test `every_verb_has_a_standard_decision` fails until every verb is one of the three, and `bridge_json_declares_exactly_the_catalog` fails until `bridge.json` lists it. Each new verb also needs an entry in the verb battery (`skills/kicad-bridge-test/run_verb_tests.py`): the battery fails a catalog verb it does not test.-`tools/build_native_release.py --publish` then syncs `bridge.json` and refreshes the standard's KiCad coverage by itself.+`tools/build_native_release.py --publish` then syncs `bridge.json` and pushes `reference/kicad-<ver>.json` to the standard; the standard-lane thread regenerates the coverage (ping it, pinned issue #3 there).  ## Adding a verb (3 places, keep in sync) ⋯ 881 unchanged lines ⋯ - **A headless VM hands new windows the foreground by itself.** With no console user, every   background launch measures at z=0; that is the environment, not a focus steal (see the test   skill's victim rule).+--- a/rust/README.md+++ b/rust/README.md@@ -1,59 +1,60 @@⋯ 47 unchanged lines ⋯ `catalog.rs`'s test `every_verb_has_a_standard_decision` fails until every verb is one of the three, and `bridge_json_declares_exactly_the_catalog` fails until `bridge.json` lists it. Each new verb also needs an entry in the verb battery (`skills/kicad-bridge-test/run_verb_tests.py`): the battery fails a catalog verb it does not test.-`tools/build_native_release.py --publish` then syncs `bridge.json` and refreshes the standard's KiCad coverage by itself.+`tools/build_native_release.py --publish` then syncs `bridge.json` and pushes `reference/kicad-<ver>.json` to the standard; the standard-lane thread regenerates the coverage (ping it, pinned issue #3 there).  ## Adding a verb ⋯ 2 unchanged lines ⋯ 2. Add the match arm in `verbs.rs::dispatch`. 3. Add it to `bridge.json` and give it an entry in the verb battery (`skills/kicad-bridge-test/run_verb_tests.py`). 4. Keep the Python contract: same arg names, same `success`/`output`/`data` shape, so the verb runner in `skills/kicad-bridge-test` passes unchanged.+

Comments

No comments yet.

Log in to comment.