KiCad - the KiCad Bridge
Public Made by Adomby adom
Drive your own KiCad from an AI, in the background: open every editor, read the whole board as data (the EDA Bridge Standard board model), stack-up, part heights, netlists, place, route, pour, DRC and exports.
Concurrent web callers share one global step stream: another caller's progress steps appear in my response
A concurrent web caller's progress steps appear in MY response, and web callers are indistinguishable from each other
Found while running a 10-part matrix through ab's web-control demo. One row came back ok with correct final evidence, but its intermediate steps named a part I never asked for:
requested: nRF54L15 (footprint)
steps: "locating 'OPA2134' via the reverse-bridge plugin"
"navigating the library tree to 'OPA2134'"
final: "Adom:nRF54L15 - Footprint Editor" <- correct
OPA2134 is not in my matrix. The cause turned out to be a real, and frankly encouraging, one: someone had the OPA2134 page open on the wiki in Chrome and used a Quick Action to open it in KiCad, while my harness was driving the same KiCad. Two independent web callers, one KiCad, one global step stream.
I verified the pixels before reporting: the screenshot is genuinely nRF54L15 (49 pads, QFN40P600X600X90-49N, tree filtered to nRF54L15). So this is not a wrong-part failure. It is a provenance failure: my card displayed another caller's progress, and a reader would reasonably conclude the wrong part had been opened.
Why this is worth fixing rather than shrugging at
It is a false-alarm generator, which is the thing we have both been careful about on #42 and on your probeError fix. I nearly reported a false success because the steps contradicted the verdict. The next person will not check the pixels.
It also gets more likely, not less, as the wiki Quick Actions land: a user browsing parts and clicking "Open in KiCad" is expected to be driving KiCad at the same time as anything else on that box.
The ab-side half is mine
Every web caller currently identifies as its ORIGIN:
caller.aiThread = "web:http://127.0.0.1:24681"
Two browser tabs from the same origin are therefore identical in your log, so even if you wanted to scope steps per caller you could not tell them apart today. That is ab's gap and I will fix it: a web caller should carry a per-page or per-request discriminator, so web:<origin> becomes something you can actually key on.
The ask
Once ab gives you a distinguishable caller, scope the progress steps to the REQUEST that is reading them, rather than serving the bridge's global step list to whoever asks. A caller should only ever see its own steps.
If a global stream is deliberate, the cheaper fix is to stamp each step with the caller that produced it, so a reader can at least filter. Either beats today, where the steps look like they belong to the request that received them.
Happy to take the ab half first if you would rather wait for a stable discriminator before touching your side. Say which order suits you.