← Commit history

v0.9.187: #34 - the loader started an RPC server inside the bridge's OWN short-lived python probes (exeName python, alive:false, fighting one port). GUI processes only now; dead discovery files pruned by default

John Lauer ·8808fb02d3 ·1mo ago ·parent fb92572
6 files changed +24−8
BRIDGE_VERSION+1−1
@@ -1 +1 @@-0.9.186+0.9.187
adom-bridge-kicad-manifest.json+5−5
@@ -1,15 +1,15 @@ {   "manifest_version": 1,   "name": "kicad",-  "version": "0.9.186",-  "url": "https://wiki.adom.inc/download/adom/kicad-bridge/0.9.186/adom-bridge-kicad-v0.9.186.zip",-  "sha256": "2abae3be4fa6ae7695bb2a7db1aa6f9d2e6a34559f8e4ac40cdf578889f0b25f",-  "size": 454911,+  "version": "0.9.187",+  "url": "https://wiki.adom.inc/download/adom/kicad-bridge/0.9.187/adom-bridge-kicad-v0.9.187.zip",+  "sha256": "279aec2125f3cb52f91bbd8ddfd24cf1a0c8b485824b0e597246caf2484af510",+  "size": 455506,   "verbPrefixes": [     "kicad_"   ],   "healthEndpoint": "/status",-  "released_at": "2026-08-19T19:06:45Z",+  "released_at": "2026-08-19T20:32:19Z",   "hero": "https://wiki.adom.inc/blob/app/kicad-bridge/kicad-hero.png",   "languages": [     "Python",
adom-bridge-kicad-v0.9.187.zipadded
⋯ 1 unchanged line ⋯
bridge.json+1−1
@@ -2,7 +2,7 @@   "manifest_version": 1,   "name": "kicad",   "displayName": "KiCad EDA",-  "version": "0.9.186",+  "version": "0.9.187",   "description": "Reverse bridge for KiCad \u2014 board/schematic introspection, lint via kicad-cli, plugin install, multi-instance probe, in-process DRC.",   "homepage": "https://wiki.adom.inc/adom/adom-bridge",   "author": "Adom Inc.",
handlers/bridge_client.py+6−1
@@ -156,7 +156,12 @@ def handle_bridge_status(kicad_info: dict, args: dict) -> dict:     """     filter_exe = args.get("exeName")     filter_pid = args.get("pid")-    prune_stale = bool(args.get("pruneStale"))+    # WIKI ISSUE #34 (Colby Knox): his status read "alive: 0 of 2" with both+    # entries belonging to processes that had long since exited, which reads as+    # "the plugin keeps dying" when the truth is "these files outlived their+    # processes". A discovery file whose PID is gone is garbage, not a data+    # point - drop it by default rather than only on an explicit cleanup run.+    prune_stale = bool(args.get("pruneStale", True))      probe_port = _make_port_prober()  # unique-port cache + wall-clock budget     plugins = []
plugin_payload/usercustomize.py+11
@@ -54,6 +54,17 @@ try:         pass      # -- Step 2: start the reverse bridge (Phase 2 MVP) --+    # GUI PROCESSES ONLY (wiki issue #34, Colby Knox, 2026-08-19). This file is+    # importable by ANY Python that has KiCad's user-site on its path, which+    # includes the short-lived `python.exe -c ...` probes the bridge itself+    # spawns. Those started an RPC server, registered a discovery file, and then+    # exited a moment later - so kicad_bridge_status showed instances with+    # exeName "python" that were all alive:false, several fighting over the same+    # port, and every plugin tier reported plugin_not_running while looking at a+    # graveyard. Only a real KiCad GUI process should ever host the bridge.+    _GUI = ("kicad", "eeschema", "pcbnew", "gerbview", "pl_editor", "bitmap2component")+    if not any(_EXE_NAME.startswith(_n) for _n in _GUI):+        raise SystemExit     try:         import adom_bridge  # type: ignore[import-not-found]         port = adom_bridge.start()