KiCad - the KiCad Bridge
Public Made by Adomby adom
Reference implementation of the KiCad bridge: multi-instance Python server, forward path via kicad-cli, reverse path via in-process plugin. Most complex of the three bundled bridges.
Packages 452
Installable versions you add with adom-wiki. Semver and dist-tags resolve which one you get; the latest is pinned on top.
All versions
adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]adom-wiki pkg install adom/[email protected]- Update 4 file(s) (John Lauer)
- Publish 1.0.104 (John Lauer)
- Update 4 file(s) (John Lauer)
- Publish 1.0.103 (John Lauer)
- Update 1 file(s) (John Lauer)
- Update 1 file(s) (John Lauer)
- Update 5 file(s) (John Lauer)
- Publish 1.0.102 (John Lauer)
- Publish 1.0.101 (John Lauer)
- Publish 1.0.100 (John Lauer)
- Publish 1.0.99 (John Lauer)
- Publish 1.0.98 (John Lauer)
- Publish 1.0.97 (John Lauer)
- Publish 1.0.96 (John Lauer)
- Publish 1.0.95 (John Lauer)
- Publish 1.0.94 (John Lauer)
- Publish 1.0.93 (John Lauer)
- Publish 1.0.92 (John Lauer)
- Publish 1.0.91 (John Lauer)
- Publish 1.0.90 (John Lauer)
- Publish 1.0.89 (John Lauer)
- Publish 1.0.88 (John Lauer)
- Publish 1.0.87 (John Lauer)
- Publish 1.0.86 (John Lauer)
- Publish 1.0.85 (John Lauer)
- Publish 1.0.84 (John Lauer)
- Publish 1.0.83 (John Lauer)
- Publish 1.0.82 (John Lauer)
- Publish 1.0.81 (John Lauer)
- Publish 1.0.80 (John Lauer)
- Publish 1.0.79 (John Lauer)
- Publish 1.0.78 (John Lauer)
- Publish 1.0.77 (John Lauer)
- Publish 1.0.76 (John Lauer)
- Publish 1.0.75 (John Lauer)
- Publish 1.0.74 (John Lauer)
- Publish 1.0.73 (John Lauer)
- Publish 1.0.72 (John Lauer)
- Publish 1.0.71 (John Lauer)
- Publish 1.0.70 (John Lauer)
- Publish 1.0.69 (John Lauer)
- Publish 1.0.68 (John Lauer)
- Publish 1.0.67 (John Lauer)
adom-wiki pkg install adom/[email protected]- Publish 1.0.42 (John Lauer)
- Update 5 file(s) (John Lauer)
- Delete dock.json (John Lauer)
- Rename to dockbar.json: the canonical manifest name (hard cutover) (John Lauer)
- Publish 1.0.41 (John Lauer)
adom-wiki pkg install adom/[email protected]- Publish 1.0.42 (John Lauer)
- Update 5 file(s) (John Lauer)
- Delete dock.json (John Lauer)
- Rename to dockbar.json: the canonical manifest name (hard cutover) (John Lauer)
- Publish 1.0.41 (John Lauer)
- Update 3 file(s) (John Lauer)
- Publish 1.0.40 (John Lauer)
- Update 4 file(s) (John Lauer)
- Publish 1.0.39 (John Lauer)
- Update 3 file(s) (John Lauer)
- Publish 1.0.38 (John Lauer)
- Update 3 file(s) (John Lauer)
- Update 3 file(s) (John Lauer)
adom-wiki pkg install adom/[email protected]- Publish 1.0.16 (John Lauer)
adom-wiki pkg install adom/[email protected]Rust port plan phase 0: seeds KiCad's six do_not_show_again nags, api.enable_server, update-check and eeschema prompt suppression at first-run config seeding (bridge-created files only, never a user's own settings); deletes dead launch_editor.ps1, unused handlers/foreground_guard.py and the legacy tour/ orchestrator. Plan and comparison sub-readmes published under docs/. Gate: ConfRoomROG 71 pass / 1 fail (known idle-box foreground grant on kicad_launch) / 15 skip; adom_library_heal verified live.
adom-wiki pkg install adom/[email protected]kicad_model_check and model diagnostics on the 3D show verbs (#88)
adom-wiki pkg install adom/[email protected]kicad_status carries operation state for timeout recovery (#87)
adom-wiki pkg install adom/[email protected]Focus guardian identity survives hwnd reuse; editors spawn without activation (pre-promotion run findings)
adom-wiki pkg install adom/[email protected]kicad_close honours unsaved work (#84); verified footprint rescan (#51)
adom-wiki pkg install adom/[email protected]Footprint loads with two pcbnew processes; list_footprints reads the fp-lib-table (#81)
adom-wiki pkg install adom/[email protected]First-run wizard deadlock: time-boxed dialog clicks and bounded sweeps (#83)
adom-wiki pkg install adom/[email protected]Release-day fixes: stock library path resolution (#80), screenshot_all sizeKB (#81), readiness re-detect (#82), routing DRC completeness (PR 82), verified source pushes (#79), full verb-test coverage (#78)
adom-wiki pkg install adom/[email protected]Live routing verbs through KiCad's IPC API (routing_state, route_net, remove_route, routing_validate), offline copper verbs (board_pads, add_track, add_via, route), kicad_ipc_api, KiCad 10 name-based nets, vendored routing deps
adom-wiki pkg install adom/[email protected]Tour motion: zoom depth per beat (one step for a single part, two plus one for a sheet or board)
adom-wiki pkg install adom/[email protected]Tour: reopen the board when the file on disk is newer than the running pcbnew, so attached 3D bodies actually show
adom-wiki pkg install adom/[email protected]Tour: a 3D model file that is not installed on this box counts as dead too; the MOSFETs then get KiCad's TDSON-8-1 body and the board reloads
adom-wiki pkg install adom/[email protected]Tour: dead 3D model references are removed as balanced blocks (the regex missed the MOSFETs), so KiCad's TDSON-8-1 body attaches and the board reloads
adom-wiki pkg install adom/[email protected]Tour: 3D body attach report lists what it saw for the MOSFET footprints (debug)
adom-wiki pkg install adom/[email protected]Tour: two-part beats (A loads with its own line, B explains and moves once verified), part timestamps on the record, 3D body attach report says where it looked
adom-wiki pkg install adom/[email protected]Tour: every beat in two parts (A loads the window with its own line, B starts once verified with the explaining line and the motion); part timestamps on the record; dead 3D bodies replaced by KiCad standard ones
adom-wiki pkg install adom/[email protected]Footprint open: a hidden Library Tree filter box counts as missing (wx hides the pane, the control survives), so the pane is shown and waited for; tour prep summary (3D bodies attached, cache restart) on the progress record
adom-wiki pkg install adom/[email protected]Footprint open: the plugin-free background loader also shows a hidden Library Tree pane before typing (arav-rog: the pane fix only covered the fallback path); tour reloads the board after attaching 3D bodies; prep summary on the record
adom-wiki pkg install adom/[email protected]Tour: attach KiCad's standard 3D bodies to footprints the board left without one (six MOSFETs get TDSON-8-1); Footprint Editor Library Tree pane is shown once and waited for, never toggled back off
adom-wiki pkg install adom/[email protected]Tour: restart KiCad during prepare when the footprint file is newer than the running KiCad (process start time vs file mtime), not only when it is new; startedAt and narrationAt on each step record
adom-wiki pkg install adom/[email protected]Tour: footprint install leaves an identical file untouched (mtime bump made KiCad's cache look stale on every tour after the first); per-beat startedAt and narrationAt on the record for syncing a recording
adom-wiki pkg install adom/[email protected]Tour: editor and viewer windows at 98 percent of the work area, centered (John)
adom-wiki pkg install adom/[email protected]Tour: all editor and viewer windows at 95 percent of the work area, centered; 2D motion aims at the featured part (position parsed from the board and schematic) and checks the canvas after each gesture; 3D motion re-frames when the board is clipped or tiny
adom-wiki pkg install adom/[email protected]Footprint open: when the Footprint Editor's Library Tree pane is hidden, show it through the frame's own View menu (plugin wm_command) before navigating; arav-rog had it hidden and every load failed
adom-wiki pkg install adom/[email protected]Footprint open: never restart KiCad for a stale cache when the editor never opened (plugin_not_running restarted KiCad twice on arav-rog); tour footprint beat ensures pcbnew is open and its plugin alive; window rows carry minimized/image so 'in front' skips minimized windows
adom-wiki pkg install adom/[email protected]Tour: a brand-new footprint restarts KiCad during prepare (before any window), never mid-beat; the footprint beat waits retryAfterMs on kicad_restarted_retry
adom-wiki pkg install adom/[email protected]Tour: a brand-new footprint restarts KiCad during prepare (before any window), not mid-beat; install_footprint reports existedBefore; the footprint beat waits retryAfterMs on kicad_restarted_retry
adom-wiki pkg install adom/[email protected]Tour: 'in front' ignores shell popups, minimized windows and our own overlays (arav-rog measured RustDesk minimized and PopupHost as the top window); footprint beat retries twice without the plugin wait; 2D motion recenters when a pan or zoom empties the canvas
adom-wiki pkg install adom/[email protected]Tour: leave KiCad's main window as KiCad opens it; footprint beat waits for the project manager plugin and retries (cold KiCad on arav-rog failed both footprint beats)
adom-wiki pkg install adom/[email protected]Tour: read the unwrapped desktop_list_windows payload (verify and foreground worked off a local list with no z-order on arav-rog); beat captions bottom-left clear of the demo panel; small top captions announce each foreground and the acks
adom-wiki pkg install adom/[email protected]Wiki #48: the 20 s idle healer measured window reachability against the primary monitor only and pulled windows on a second monitor back to the primary; it now measures against the monitor the window overlaps
adom-wiki pkg install adom/[email protected]Tour remote: dashboard presses recorded, acked with a caption, and honoured at the next gesture like panel presses
adom-wiki pkg install adom/[email protected]Tour remote: FIFO press queue (no press lost), poll-drained presses recorded, presses on progress
adom-wiki pkg install adom/[email protected]Tour remote: prev/next/pause cut the beat in flight at the next gesture; back goes to the beat before the one on screen; presses and acks recorded
adom-wiki pkg install adom/[email protected]Tour layout: restore a window's bounds before the tour closes it so KiCad's sticky geometry is never corrupted
adom-wiki pkg install adom/[email protected]Tour layout: read the unwrapped desktop_list_monitors payload so windows are placed in their 80 percent slots
adom-wiki pkg install adom/[email protected]kicad_demo layoutProbe diagnostic; layout uses the monitor work area
adom-wiki pkg install adom/[email protected]Fix: demo.py lacked the json import used by the new window-bounds save/restore (0.9.310 would have silently skipped saving bounds).
adom-wiki pkg install adom/[email protected]Tour layout for the recording (John): each beat's window is placed at 80% of the primary screen in its slot (symbol upper-left, footprint nudged, chip 3D upper-right, schematic lower-left nudged, board 2D lower-left, board 3D lower-right) and the KiCad manager is centered at its own size; every bound is saved first and restored at the tour's end, stop, failure, or the next start (leftovers file), so KiCad's sticky sizes end up as the user had them. Every caption's reply is recorded on progress; a press on the remote gets an immediate acknowledgement caption at the top of the screen; the settle check waits up to 8 s for two identical captures instead of sampling once.
adom-wiki pkg install adom/[email protected]Tour 3D beats no longer end with Zoom to Fit: in KiCad's 3D viewer that command also resets the orientation, so the board beat ended top-down on John's laptop; the beat now ends on the isometric it built (zoom in/out net to zero, framed at the opening fit).
adom-wiki pkg install adom/[email protected]Motion gate: GetForegroundWindow can lag AD's z-order right after a raise, which aborted the symbol beat's motion at its first gesture on John's laptop while AD had already measured the window on top; the gate now waits up to 1.5 s for the OS to agree. Panel record keeps the callback URL across stage-advance shows.
adom-wiki pkg install adom/[email protected]Tour verification (John: 'tool your bridge code to definitively know that the correct thing is showing'): every beat now MEASURES, after its raise, that its own window is the top of AD's z-order, that the live title carries the expected document, that the GL canvas is rendered (kicad_ui canvas probe) and that two captures 0.8 s apart are identical (settled). The result rides on the step and on progress as ; motion runs only on a verified window, otherwise the step says exactly which fact failed and which window was actually on top. Zoom discipline: 2D beats start and end on extents with two wheel clicks in and back out; 3D beats zoom one menu step in and out and end on Zoom to Fit while staying isometric.
adom-wiki pkg install adom/[email protected]Tour 3D motion is now deterministic: KiCad's own View menu commands (Rotate X/Z by 10 degrees, Zoom In/Out, Zoom to Fit) resolved from the live menu bar and posted as WM_COMMAND, so the isometric and the orbit are the same on every DPI and need no mouse or foreground; mouse drags remain only as the fallback (they flipped the chip viewer and did nothing in the board viewer on 2026-09-03). Each step in the result now carries the window handle and title it drove.
adom-wiki pkg install adom/[email protected]Tour window targeting (John's laptop: fourteen KiCad windows from days of demos; the 2D beat showed an empty untitled PCB Editor and the 3D beat the old sample cube): every beat now targets the tour's own document titles (esc-g431 schematic and board, the Adom STM32 symbol, the LQFP footprint), reuses an existing window instead of opening a duplicate, and opens each 3D view from that exact editor (open_3d_viewer accepts pcbHwnd/fpHwnd). The clean slate at start also closes old adom-demo documents and an empty untitled PCB Editor.
adom-wiki pkg install adom/[email protected]Tour identity fix (John's dashboard run, 2026-09-03): ab refused the demo panel, every caption, every raise and every window close from the tour thread with 'carries no caller identity' (toast fallback, no captions, nothing in front). Every loopback call the bridge makes now carries identity: the X-Adom-Caller headers of the request being served, or the bridge's own self caller otherwise; the tour thread and ab's callback thread adopt the identity of the request that started the tour. Also: a failed panel show no longer demotes later tours to the toast (per-tour reset, one retry), and every 3D viewer plus the Footprint Editor are closed before the beats so the footprint beat opens a fresh, re-indexed editor.
adom-wiki pkg install adom/[email protected]Tour sync: the verb-side control channel (kicad_demo {control}) is cleared at tour start too, so a pause/next/exit queued against a previous tour never steers a new one; completes the stale-press drain of 0.9.302.
adom-wiki pkg install adom/[email protected]Tour sync fixes (John's run on 0.9.301): stale panel presses from the previous show are drained before a tour starts (his earlier NEXT presses made the new tour jump to step 3 at once); the narration mute is reset from the call's muted flag at thread start and pushed to the panel on the first show; STOP from the remote sets stopping on progress immediately so the dashboard can close its own pill; progress carries stopping.
adom-wiki pkg install adom/[email protected]Taskbar hygiene (John: frozen progress bars on every KiCad window, no Adom badge): the boot sweep that clears leftover bars ran once at +6 s while ab was still restarting and failed silently; it now retries across the first two minutes until a window answers, and a five-minute idle reaper clears progress and badge on every KiCad window whenever the bridge is driving nothing. Filed adom/adom-bridge#138 for a progress TTL on ab's side.
adom-wiki pkg install adom/[email protected]Tour 3D motion recalibrated: the orbit drags totalled about a third of the viewer width and turned the board nearly edge-on (KiCad's trackball is roughly 0.1 degree per pixel). Now ~30 degrees of tilt and ~40 of yaw for the isometric, then three gentle orbits with zoom, slower and smoother for the recording.
adom-wiki pkg install adom/[email protected]Tour board-in-3D fix: KiCad's 3D viewers are unowned top-level windows, so picking 'the viewer owned by the PCB Editor' never matched and the chip's viewer was never closed (0.9.298 test-box run: board3d failed with the viewer actually open). The beats now take the viewer that APPEARS after their open, the chip's viewer is remembered and closed by handle before the board's opens, with the topmost viewer as fallback.
adom-wiki pkg install adom/[email protected]Fix: the 0.9.297 tour job died on a NameError (_EXIT undefined) before its first progress update, so Play the demo showed the dashboard's transport pill and nothing else (John, lost, 2026-09-03). _EXIT is defined and the job's reset sits inside its try so any early failure lands on progress as an error instead of a silent stall.
adom-wiki pkg install adom/[email protected]Tour: motion on every beat for the recording (fit, wheel zoom in/out, middle-drag pans in the 2D editors; Home, an isometric left-drag and three orbits with zoom in the 3D viewers), sent only while the beat's window is confirmed in front and aborted at the next gesture on STOP or when the user switches away. The board-in-3D beat now closes the chip's 3D viewer first and picks the viewer owned by the PCB Editor (the last beat was showing the chip's viewer by title match). STOP from the remote's X now clears the caption and ends the tour within the beat, audio already off. Per-beat motion reports ride on the result.
adom-wiki pkg install adom/[email protected]Tour foreground fix (John: 'why do I not see you foregrounding any kicad window'): the beat raise called SetForegroundWindow from the bridge process and reported true regardless; Windows refuses that from a background process while the user works elsewhere. The bridge now lifts its no-activate mark, asks ab's desktop_bring_to_front to raise the beat's window once, and reports foregrounded only when the z-order afterwards shows that window on top.
adom-wiki pkg install adom/[email protected]The tour now walks a real Adom board, adom/esc-g431 (149 footprints, 227 symbols): its STM32G431 symbol and LQFP-48 footprint are lifted from the wiki files at tour time and installed into the Adom library, then symbol, footprint, chip in 3D, schematic, board 2D, board 3D in that order. Captions were never painting because ab requires reason on desktop_caption; fixed, medium size, one line per beat. Narration re-rendered to match. Wording no longer claims the background: each beat's window is brought to the user once. Dead local 3D model paths in the board are dropped.
adom-wiki pkg install adom/[email protected]Demo panel callback URL fix: the bridge read its bound port from a second copy of the server module and sent no eventCallbackUrl to ab (panel presses reached the tour only via poll). The port now travels through the environment, so every press is POSTed to the bridge the instant it is clicked. Verified on the test box: a press to the loopback route paused within the beat, muted at once, and resumed on play.
adom-wiki pkg install adom/[email protected]kicad_demo progress now reports panel (last show reply, stage, callback URL), muted, muteSource, lastPress and paused; each step in the final result carries foregrounded (whether the beat's window was brought forward once).
adom-wiki pkg install adom/[email protected]Demo panel: reason is sent on every show (ab marks it required on show; a stage-advance show without it was refused live and the remote stayed at 1/7), and every show's reply is recorded on kicad_demo progress (panel: shown, stage, callbackUrl, error) so a refused show is visible instead of silent.
adom-wiki pkg install adom/[email protected]kicad_demo adopts the ab 2.1.17 demo-panel contract: the first show passes eventCallbackUrl (loopback POST /demo/event on the bridge's own port) so a press lands the instant it is clicked; mute/unmute silence or replay the beat's narration at once; pause/stop silence at once and apply at the beat boundary; stage-advance shows send only the stage so a user's pause or mute is never undone; the poll stays as backstop and skips presses already delivered. The tour now foregrounds each beat's window exactly once (John: the user must see which window is being demoed, but keeps full control between beats); no persistent focus guardian during the tour. One short ab caption per beat stays.
adom-wiki pkg install adom/[email protected]kicad_demo drives ab's desktop_demo_panel (Adom Bridge 2.1.0+, wiki adom/adom-bridge#116): the floaty play/pause/next/back/stop remote is shown at stage 0 with the seven stops, polled between beats, stage and state updated per beat, hidden on done/exit/error; the toast transport remains only as the fallback for an older ab. Every beat paints one short ab caption (KiCad tour n/7: ...) for about the beat's length instead of a paragraph for a minute (John, 2026-09-03).
adom-wiki pkg install adom/[email protected]John, 2026-09-03: no caption on a Symbol Editor launch or rescan reopen (the 0.9.285 one was large, shown too long, and wrong on his laptop: it promised 'behind your window' while KiCad raised itself in front while loading). Launch is silent. _foreground now also reports editorInFrontAtEnd, measured from AD's z-order at return time, so a response never claims background about a window the user can see on top. Dev skill records the rule: one early look, no fighting the user for the foreground, captions only on the opt-in allowFocusSteal path and short.
adom-wiki pkg install adom/[email protected]Captions before a KiCad window appears now name the calling AI thread (John saw one on his laptop and could not tell which thread was opening the editor). The Symbol Editor close used by rescan goes through ab's desktop_close_window (ab 2.1.12+, graceful, never forced) with the local WM_CLOSE as fallback for older ab; responses say editorCloseVia. Bridge owns KiCad, AD owns Windows (wiki #74 item 3).
adom-wiki pkg install adom/[email protected]Wiki #71 (Ray, 0.9.286 run): (1) the posted Enter now goes FIRST to the window holding keyboard focus in KiCad's GUI thread (GetGUIThreadInfo), and wxDataView children count as tree candidates regardless of height, so a short Libraries pane no longer yields zero targets; (2) a navigation that ran out of the call budget returns navigation_unconfirmed_within_budget with the trace and _foreground instead of the 'still coming up' contract about an editor that was already driven; (3) an editor the bridge opened after the library file was last written is never judged stale again, so repeated calls stop re-opening it (staleVeto says so); (4) symbol_editor_did_not_open carries pathwaysTried; navigation_failed responses carry errorCode and resolved fields.
adom-wiki pkg install adom/[email protected]Z-order guard fix: the 0.9.285 guard read AD's window list with the wrong envelope shape and always saw nothing (field test reported 'no window was launched' during a real relaunch). Both the Symbol Editor launch guard and handlers/foreground_guard now read z-order through handlers.kicad_windows, the one parser of AD's desktop_list_windows.
adom-wiki pkg install adom/[email protected]Foreground etiquette on the Symbol Editor launch (wiki #71 field test): before opening or auto-rescan-relaunching the editor the bridge captions why a KiCad window is about to appear, remembers the user's front window, and the moment the new frame exists looks ONCE at the z-order; if the frame landed above a non-KiCad user window it slides the frame back behind it with SetWindowPos(NOACTIVATE) and then leaves the z-order alone for good (alt-tab and taskbar clicks stay the user's). show_library responses carry _foreground with what happened. kicad_install_symbol success now includes kicadParser (KiCad's verdict on the written file).
adom-wiki pkg install adom/[email protected]kicad_set_design_rules: response separates fabRuleViolations (DRC items citing one of the fab's rules by name) from otherViolations, and carries drcSummary; the copper layer count is read per layer entry, not per line, so a one-line (layers ...) block no longer infers 1 layer.
adom-wiki pkg install adom/[email protected]Wiki #73: kicad_list_design_rules and kicad_set_design_rules consume adom/pcb-design-rules at call time (fab, layers, process; layers defaults to the board's copper count; stages .kicad_dru with backup; runs DRC with it). Wiki #62: kicad_list_symbols (bridge inventory + kicadParser), and kicad_show_library resolves an MPN/file name to the real symbol name (exact, case-insensitive, unique prefix) reporting aliasedFrom/aliasHow. Navigation trace no longer implies the filter was not applied when wx answers WM_GETTEXT with ''. kicad-bridge-dev skill records the #71 lessons.
adom-wiki pkg install adom/[email protected]Wiki #71 (Ray's remaining case): on a fresh Symbol Editor the filtered tree lists the symbol but nothing is selected, so the posted Enter has nothing to activate and the posted double-click depends on row geometry (DPI). Ray measured select-then-real-Enter loads it. show_library now adds keyboard-only rounds: Down x1..3 posted to the tree candidates, then Enter, title-verified, still PostMessage only (no focus, no foreground). Success responses carry the navigation trace too, so a re-run shows which round landed.
adom-wiki pkg install adom/[email protected]Wiki #71: kicad_show_library failure responses now carry a per-step navigation trace (search Edit found, parent chain, filter text as read back, tree candidates with class and rect, editor title after Down, after posted Enter, after posted double-click). Ray measured on his box that the tree lists the symbol and a real Enter loads it while the bridge's posted Enter and double-click do not; the trace is how the next build finds which hwnd the Enter must reach.
adom-wiki pkg install adom/[email protected]kicad_install_symbol now passes errorCode (kicad_refuses_symbol), kicadParser and _hint through to the caller; 0.9.279 set them inside add_symbol but the verb wrapper dropped them, so the wire response had errorCode null.
adom-wiki pkg install adom/[email protected]Wiki #71 second cause, measured on ConfRoomROG with KiCad's own parser: one malformed symbol makes KiCad refuse a whole .kicad_sym (Symbol Editor lists the library EMPTY) while the bridge's structural reader called it clean. New handlers/kicad_parse_check.py runs kicad-cli sym export svg (read-only) as KiCad's verdict and inventory. kicad_install_symbol and kicad_install_library refuse a file KiCad refuses before writing (kicad_refuses_symbol / kicad_refuses_library); kicad_adom_library_status, kicad_lint_library and the kicad_show_library error carry kicadParser; kicad_adom_library_heal mode:prune drops the symbols KiCad refuses (dryRun names them, original kept as .pruned.bak). Lint's checkmark now says whether KiCad was consulted. Also measured: KiCad's library index is process-wide; a reopened editor frame keeps the old symbol set until kicad.exe fully restarts.
adom-wiki pkg install adom/[email protected]Wiki #72: kicad_install_library handed a single-part .kicad_sym now returns singlePartFile:true plus a hint naming kicad_install_symbol {filePath}, on both the fresh and already-registered success paths; a real multi-symbol library gets no hint. The verb still does what it did (registers the file as its own library); it just stops being silent about the shared Adom library being untouched.
adom-wiki pkg install adom/[email protected]kicad_adom_library_status: orphanedLibrary now means the orphan holds symbols the registered file lacks (unique-name compare; new orphanMissingFromRegistered and orphanMissingSample). A count compare kept flagging John's orphan after the 0.9.276 merge because its 122 lenient count included 28 duplicate copies. build_release.py refuses a non-semver first argument (a stray flag was once stamped in as the version).
adom-wiki pkg install adom/[email protected]heal merge reads a corrupt orphan tolerantly: the orphaned Adom library on a redirected box had 94 symbols inside the library plus 28 duplicate copies appended AFTER the closing paren (the old appender bug's fingerprint), so the strict gate refused the whole file. The heal SOURCE is now read block by block with a quote-aware depth scan, each block balance-checked on its own, duplicates deduped first-copy-wins and reported; the file WRITTEN still goes through the strict gate. Measured on the real file: 94 unique recoverable, 0 unparseable, 28 dupes.
adom-wiki pkg install adom/[email protected]kicad_adom_library_heal (wiki #71 follow-up, John's call: merge): reconcile a split Adom library by merging every symbol from the orphaned bridge-default file into the registered file KiCad reads, one quote-aware add behind the balance gate with a .bak; dryRun previews; repoint mode kept as the other answer. Never runs on its own. Idempotent, refuses an unbalanced source, never edits or deletes the orphan.
adom-wiki pkg install adom/[email protected]Wiki #71 root cause: on a OneDrive-redirected Documents the bridge used %USERPROFILE%/Documents while KiCad resolves the shell Documents folder, so the bridge wrote and reported symbols in a file KiCad never reads. Fix: kicad_detect resolves user_dir like KiCad (handlers/win_paths), the Adom symbol and footprint libraries are ROW-FIRST (install writes to the file sym-/fp-lib-table registers), adom_library_status reports registeredPath/bridgeDefaultPath/split/orphanedLibrary, and the library_cache_stale verdict is built from that measurement instead of a cache story (both prior explanations were disproved by Ray).
adom-wiki pkg install adom/[email protected]Adopt the insiders tier: bridge.json declares insidersManifestUrl, build_release ships to insiders by default and refuses to publish without a changelog, tools/promote.py moves the public manifest only on a human's attestation. Wiki #72 groundwork.
adom-wiki pkg install adom/[email protected]- Update 40 file(s) (John Lauer)
- Update 40 file(s) (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 40 file(s) (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 40 file(s) (John Lauer)
- Update 40 file(s) (John Lauer)
- Publish 1.0.109 (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 40 file(s) (John Lauer)
- Update 40 file(s) (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 40 file(s) (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 40 file(s) (John Lauer)
- Update 40 file(s) (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 40 file(s) (John Lauer)
- Update 40 file(s) (John Lauer)
- Update 3 file(s) (John Lauer)
- Publish 1.0.108 (John Lauer)
- Publish 1.0.107 (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 40 file(s) (John Lauer)
- Update 40 file(s) (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 40 file(s) (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 40 file(s) (John Lauer)
- Update 40 file(s) (John Lauer)
- Update 3 file(s) (John Lauer)
- Publish 1.0.106 (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 40 file(s) (John Lauer)
- Update 40 file(s) (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 3 file(s) (John Lauer)
- Update 40 file(s) (John Lauer)
- Update 40 file(s) (John Lauer)
- Publish 1.0.105 (John Lauer)
- Update 5 file(s) (John Lauer)
adom-wiki pkg install adom/[email protected]The left-open editor's reveal: plugin tree-select when the reverse bridge is alive (4s check), else a plugin-free WM_SETTEXT of the filter to JUST the library name, no Enter, so the loaded symbol stays and the full part list shows. eeschema's embedded Python initializes lazily, so the win32 path is the normal cold-start route.
adom-wiki pkg install adom/[email protected]The plugin installer's PAYLOAD_VERSION now derives from plugin_payload/adom_bridge.py's own version instead of a hardcoded constant: the constant sat at 0.9.1 while the payload shipped 0.9.2, so deploys no-opped as already-current and reveal_library never reached any machine.
adom-wiki pkg install adom/[email protected]The library reveal waits up to 15s for a cold-started eeschema's reverse-bridge plugin to bind before selecting the library node, instead of racing the bind and silently leaving the filter.
adom-wiki pkg install adom/[email protected]The library-reveal step surfaces why it could not run (revealDetail) instead of silently leaving the filter in place.
adom-wiki pkg install adom/[email protected]New plugin method reveal_library (plugin 0.9.2): after the install proof shot, the left-open Symbol Editor clears its tree filter and selects/expands the new library NODE by name, so the full part list shows and a generic library name (UI) can never lose a fuzzy text match to other libraries' parts.
adom-wiki pkg install adom/[email protected]After the proof shot, the left-open Symbol Editor's tree filter loosens to just the library name so the user sees the full part list, not only the photographed symbol.
adom-wiki pkg install adom/[email protected]install_library_bundle capture:true now LEAVES the Symbol Editor open on the installed library, tree filtered to its name and kept behind the user's windows, instead of closing it after the proof shot: the close made a successful install feel unverified. closeEditor:true restores the old behavior. Result carries editorLeftOpen.
adom-wiki pkg install adom/[email protected]kicad_install_library_bundle capture:true: after a successful install (and only when KiCad was not already running), opens the Symbol Editor on the new library in the background, returns the shot frame (thumbnailDataUrl for browser callers), and closes the editor it opened. proofSkipped names why when no frame is possible. The verb joined the focus-guard sets so the proof window can never land on top of the user.
adom-wiki pkg install adom/[email protected]kicad_install_library_bundle: install an Adom wiki Cloud Library bundle zip (symbols, footprints, 3D models with ref rewriting) in one consent-gated verb. Built for the wiki Export button's no-AI bridge lane; reports kicadRunning/restartNeeded instead of ever closing the user's KiCad.
adom-wiki pkg install adom/[email protected]- install_library: footprint installs carry a bundle's 3D models (0.9.251) (Colby Knox)
- macos manifest -> 0.10.5 (stats + library-browser TCC gates) (Kyle Bergstedt)
adom-wiki pkg install adom/[email protected]- Update 3 file(s) (John Lauer)
- Publish 1.0.66 (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 3 file(s) (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 3 file(s) (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 3 file(s) (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 3 file(s) (John Lauer)
- Publish 1.0.65 (John Lauer)
- Publish 1.0.64 (John Lauer)
- Publish 1.0.63 (John Lauer)
- Publish 1.0.62 (John Lauer)
- Publish 1.0.61 (John Lauer)
- Publish 1.0.60 (John Lauer)
- Publish 1.0.59 (John Lauer)
- Publish 1.0.58 (John Lauer)
- Publish 1.0.57 (John Lauer)
- Publish 1.0.56 (John Lauer)
- Publish 1.0.55 (John Lauer)
- Publish 1.0.54 (John Lauer)
- Publish 1.0.53 (John Lauer)
- Publish 1.0.52 (John Lauer)
- Publish 1.0.51 (John Lauer)
- Publish 1.0.50 (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 3 file(s) (John Lauer)
- Publish 1.0.49 (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 3 file(s) (John Lauer)
- Publish 1.0.48 (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 3 file(s) (John Lauer)
- Publish 1.0.47 (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 3 file(s) (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 3 file(s) (John Lauer)
- Publish 1.0.46 (John Lauer)
- Update 3 file(s) (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 3 file(s) (John Lauer)
- Publish 1.0.45 (John Lauer)
- Update 3 file(s) (John Lauer)
- Update 1 file(s) (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 3 file(s) (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 3 file(s) (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 3 file(s) (John Lauer)
- Publish 1.0.44 (John Lauer)
- Update 3 file(s) (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 3 file(s) (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 3 file(s) (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 3 file(s) (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 3 file(s) (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 3 file(s) (John Lauer)
- Publish 1.0.43 (John Lauer)
- Update 5 file(s) (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 3 file(s) (John Lauer)
- Update 1 file(s) (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 3 file(s) (John Lauer)
- add macos-line update manifest (0.10.4); shared windows manifest untouched (Kyle Bergstedt)
adom-wiki pkg install adom/[email protected]- Update 3 file(s) (John Lauer)
- Publish 1.0.37 (John Lauer)
- Update 5 file(s) (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 3 file(s) (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 3 file(s) (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 3 file(s) (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 3 file(s) (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 3 file(s) (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 3 file(s) (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 3 file(s) (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 3 file(s) (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 3 file(s) (John Lauer)
adom-wiki pkg install adom/[email protected]- Update 3 file(s) (John Lauer)
- Update 2 file(s) (John Lauer)
- Publish 1.0.36 (John Lauer)
- Update 2 file(s) (John Lauer)
- Update 2 file(s) (John Lauer)
- Update 1 file(s) (John Lauer)
- Update 5 file(s) (John Lauer)
- Update 1 file(s) (John Lauer)
- Update 4 file(s) (John Lauer)
- Update 4 file(s) (John Lauer)
- Publish 1.0.35 (John Lauer)
- Update 3 file(s) (John Lauer)
- dock.json: declare health, pointed at the /api/status you already serve (John Lauer)
- Update 4 file(s) (John Lauer)
- Update 4 file(s) (John Lauer)
- Update 4 file(s) (John Lauer)
- Update 5 file(s) (John Lauer)
- Update 4 file(s) (John Lauer)
- Publish 1.0.34 (John Lauer)
- Update 4 file(s) (John Lauer)
- Update 1 file(s) (John Lauer)
- Update 1 file(s) (John Lauer)
- Update 6 file(s) (John Lauer)
- Update 4 file(s) (John Lauer)
- Update 4 file(s) (John Lauer)
- Update 4 file(s) (John Lauer)
- Update 7 file(s) (John Lauer)
- Update 4 file(s) (John Lauer)
- Update 4 file(s) (John Lauer)
- Update 4 file(s) (John Lauer)
- Update 4 file(s) (John Lauer)
- Update 4 file(s) (John Lauer)
- Update 4 file(s) (John Lauer)
- Update 5 file(s) (John Lauer)
- Update 5 file(s) (John Lauer)
- Update 4 file(s) (John Lauer)
- Update 5 file(s) (John Lauer)
- Update 4 file(s) (John Lauer)
- Update 7 file(s) (John Lauer)
- Update 5 file(s) (John Lauer)
- Update 6 file(s) (John Lauer)
- Update 6 file(s) (John Lauer)
adom-wiki pkg install adom/[email protected]Adopts the canonical background/foreground RESPONSE contract from SDK issue #38. Where a window went is now the enum windowEtiquette (background | foreground) rather than the boolean openedInBackground, and a bare foreground:true is refused with errorCode foreground_reason_required rather than the underscore-prefixed _foregroundRefused. Both old keys are still emitted during the migration window so a pinned runner does not break. The reasoning is right and generalizes: what a caller has to BRANCH on is a contract and deserves a stable non-underscore key, and a boolean cannot grow when the states are already three. focusEvents keeps its name, blessed as-is.
adom-wiki pkg install adom/[email protected]The real cause of wiki issue #34, found by the new kicad_plugin_diagnose verb, and it was mine rather than anything about the reporter's KiCad. While removing an accidental duplicate import in plugin_install.py, a blanket edit stripped EVERY line reading import sys from that file - including the one inside the generated loader's source TEXT. So from that point on, every fresh plugin deploy wrote an adom_bridge_plugin.py that raised NameError: name 'sys' is not defined the instant KiCad imported it. It failed silently because the loader catches its own exceptions into a log file, so KiCad saw a plugin that did nothing and the bridge saw no live instance - which looked exactly like 'this KiCad does not scan its plugin directory'. It scans it fine; the file we put there was broken. Restored, and the class of break is closed: plugin_install now EXECUTES both generated loaders in a throwaway namespace at import time and raises loudly if either fails or logs an error, because generated code is shipped as text and is otherwise never run on this side.
adom-wiki pkg install adom/[email protected]Adds kicad_plugin_diagnose, a read-only verb that answers 'why is the reverse-bridge plugin not loading' in one call instead of several rounds of file requests. It reports whether the loader is deployed, whether KiCad actually IMPORTED it (a pycache entry beside it is the proof), what the loader logged, which KiCad executables ever ran the bootstrap, whether KiCad's embedded stdlib is complete (a real machine turned out to be missing Lib/urllib entirely, which made every import of the payload fail and which no bridge code can work around), and the live instances - then states a plain verdict: WORKING, NOT DEPLOYED, DEPLOYED BUT NEVER IMPORTED, or IMPORTED BUT DID NOT START. Written for wiki issue #34, where the plugin binds on two of this maintainer's boxes and not on the reporter's, and the distinguishing evidence all lives on his machine.
adom-wiki pkg install adom/[email protected]Closes wiki issue #37 (Colby Knox): kicad_install_symbol reported 'No symbols found in the provided file content' for a valid KiCad 10 symbol file, because the extraction regex required at least one leading whitespace character before (symbol, and in that file the top-level symbol sits at column 0 while its sub-units are tab-indented. So only the sub-units matched, and they were then correctly dropped by the _N_N suffix filter, leaving nothing. His diagnosis and his fix, verbatim. Worth recording that this regex has now failed in BOTH directions - an earlier version keyed on exactly two spaces and missed every tab-indented library - which is the lesson: indentation is not semantic in s-expressions and must not be load-bearing. Both regexes now accept any leading whitespace including none, and the sub-unit suffix filter does the real work. Verified against both shapes: a column-0 top-level symbol with tab-indented sub-units, and the classic fully indented layout.
adom-wiki pkg install adom/[email protected]Follows Colby's 0.9.186 retest on wiki issue #34, where kicad_bridge_status showed two plugin instances with exeName python, both alive:false, both on port 8879. Root cause: usercustomize.py had no process guard, so ANY Python with KiCad's user-site on its path started the reverse-bridge RPC server - including the short-lived python.exe probes the bridge itself spawns, which pass the wx check because KiCad's bundled Python ships wx. Each one registered a discovery file, bound a port, and exited moments later, leaving a graveyard that made every plugin tier report plugin_not_running while looking at dead entries. The loader now starts the server only inside real KiCad GUI processes (kicad, eeschema, pcbnew, gerbview, pl_editor, bitmap2component); the .pth loader already had this guard, usercustomize did not. Separately, kicad_bridge_status now prunes discovery files whose PID no longer exists by default, so the status reflects live instances instead of history.
adom-wiki pkg install adom/[email protected]Closes the second half of wiki issue #34 (Colby Knox): from a genuinely cold start, a user with no board open could not open the Footprint Editor at all. The bridge already opens a board in the background to make KiCad scan its plugin directory (0.9.173), but that assumed a board existed somewhere on the machine. On a fresh box there is none, so the path gave up. It now generates a minimal throwaway board in TEMP purely to trigger the scan, which costs a few kilobytes and makes the cold footprint path work on a machine that has never had a KiCad project.
adom-wiki pkg install adom/[email protected]Two fixes. (1) John, watching a live launch: the KiCad project manager came to the foreground and the bridge never even attempted to put it behind. Cause: the idle rule added in 0.9.172 says that with no verb running, a KiCad window reaching the foreground is the user's doing and must be left alone - correct for a window the user opened, wrong for one the bridge spawned seconds earlier that took its time appearing. The difference is now bounded by time since OUR spawn: for 60 seconds after the bridge starts a KiCad process, a window of ours that appears in front gets the single background action; after that, hands off. Still exactly one action per window. (2) Wiki issue #35 (Colby Knox): kicad_show_symbol cost about 56 seconds on EVERY call, even when the Symbol Editor was already open on that exact symbol, because the verb always ran the cold path and KiCad re-indexes every symbol library when that editor opens. The show verbs now check first: if an editor is already displaying the requested part, they return it immediately instead of relaunching and rescanning. Same for the Footprint Editor.
adom-wiki pkg install adom/[email protected]Removes the machine-wide low-level input hooks that 0.9.182 installed. They were added to detect a taskbar click or alt-tab, and the effect was that every mouse event and keystroke on the user's computer passed through this bridge's callback - which degraded his cursor badly enough to cost him four reboots. They are deleted, not repaired, and the prohibition is written into the source: this bridge never installs a system-wide input hook of any kind, and any future idea that seems to need one gets proposed to the user BEFORE it is written, not shipped and observed. Nothing depended on them anyway: the bridge no longer blocks activation at all (WS_EX_NOACTIVATE is gone as of 0.9.181), so a click or alt-tab simply works the way it does for any other window, and there is nothing to detect. Backgrounding remains one SetWindowPos to the bottom of the z-order, once per window, only if that window took the foreground.
adom-wiki pkg install adom/[email protected]Urgent fix for a regression I introduced in 0.9.182 and John caught within minutes: his cursor was breaking. The user-intent detection added in that release used a WH_MOUSE_LL hook, which is correct in principle, but the callback did real work inline - WindowFromPoint, a cross-process class-name read, a process-image query, and then allow_activation_all() which calls SetWindowLongPtr and therefore SENDS WM_STYLECHANGING cross-process, blocking for as long as the target takes to answer. A low-level hook callback runs inside the system's input path, so every one of those delays the mouse for the entire machine, and Windows silently unhooks a callback that overruns LowLevelHooksTimeout. The callback now does exactly one thing - append a timestamp to a small queue - and returns. A worker thread off the input path does the window classification and the activation release. The lesson, written into the code so it is not repeated: a hook may record a fact and nothing else.
adom-wiki pkg install adom/[email protected]Two things. (1) John's requirement: if the bridge ever blocks activation it MUST know when the human asks for a window, or the whole experience is broken. The old detector polled GetAsyncKeyState every 120ms, so a taskbar click that began and ended between two polls was invisible - which is exactly how a deliberate click got treated as a self-raise. Detection is now low-level hooks (WH_MOUSE_LL and WH_KEYBOARD_LL) armed at bridge boot: Windows delivers every button and keystroke to them synchronously, so there is no sampling gap and nothing to miss. A press anywhere on the shell (taskbar, Start, tray, alt-tab switcher), a press on a KiCad window, or Alt+Tab immediately releases every activation block, and while the user is driving the bridge performs no background action at all. (2) Wiki issue #34 (Colby Knox): the plugin auto-install cached a false no_kicad_installed for the entire bridge boot on a machine with KiCad 10 installed - the explicit kicad_install_plugin found it moments later - so the reverse bridge never came up on its own and every plugin-dependent verb silently degraded. A failed auto-install is no longer cached, and when the boot hands it an empty version list it re-detects from scratch rather than trusting a list that may simply have been populated too late.
adom-wiki pkg install adom/[email protected]The backgrounding algorithm, rewritten to John's rules and reduced to a single call. For a KiCad window that actually takes the foreground, the bridge now performs exactly one action for the entire life of that window: SetWindowPos to HWND_BOTTOM with SWP_NOACTIVATE, SWP_NOMOVE and SWP_NOSIZE. Nothing else, ever. Removed: minimize-bounce, because a minimized window cannot be screenshotted and every screenshot-based verb depends on that; off-screen parking, which moved windows to -32000 and back and never delivered what it promised; WS_EX_NOACTIVATE, because it blocks the USER's own click and a user may want the window in front the very next second - their click must work immediately with no hold-off; and all repetition, including the sweep branch that re-parked quiet windows every 50ms and the guardian that re-demoted on every tick. A window that opens quietly behind the user's work is now left completely untouched. Boot also clears any WS_EX_NOACTIVATE left behind by versions up to 0.9.180, which could persist indefinitely and silently break taskbar clicks.
adom-wiki pkg install adom/[email protected]John, twice, and Colby once: the KiCad window blips - foreground, background, foreground, background. The previous fixes capped how MANY times the bridge did this (3 rounds in 0.9.175 and 0.9.179) which was the wrong shape of fix, because the mechanism itself was visible. Backgrounding used a minimize-bounce (SW_MINIMIZE, then SW_SHOWNOACTIVATE, then z-bottom) and parking moved windows to -32000 and back: a minimize is one visible frame and the restore is another, so every call was a blip by construction and no cap could reach zero. Backgrounding now changes only things the compositor does not animate: WS_EX_NOACTIVATE so Windows refuses the window's own activation attempts, and one SetWindowPos to the bottom of the z-order with SWP_NOACTIVATE|NOMOVE|NOSIZE. No minimize, no restore, no move, no resize, ever. If a window still holds the foreground after that, it is LEFT there - briefly in front beats strobing. Off-screen parking is retired to a shim, unparking no longer touches geometry, and WS_EX_NOACTIVATE is cleared the moment the bridge goes idle so a taskbar click always works.
adom-wiki pkg install adom/[email protected]Fixes wiki issue #33 (Colby Knox): the focus guardian demoted a self-raising KiCad window on every 100ms tick with no debounce, so a freshly-launched wx frame that Raise()es itself while loading produced a ~10x/sec front-and-back flicker and burned CPU until KiCad was closed. His diagnosis was exactly right, and his suggested fix is what shipped: after three rounds the guardian stops re-demoting a given window, holds it once at the bottom of the z-order with activation suppressed, and leaves it there - one demote that sticks is enough. Note this is a SECOND loop with the same failure mode as the one capped in 0.9.175: that release capped the parking sweep, this one caps the guardian, and both now record every round in kicad_state.focusDebug (parkFights, parkGaveUp, guardianDemotes, guardianDemoteLimit, parkFightLog) so the next occurrence is measurable rather than anecdotal.
adom-wiki pkg install adom/[email protected]The progress block is now attached to every instrumented verb rather than only to runs that exceeded three seconds. A warm run finishing in half a second is precisely the fact issue #32 wants surfaced - cold and warm differ by 10-50x and the user used to get one pessimistic sentence covering both - and reporting it also feeds the warm history, which is what lets the next estimate be measured instead of guessed.
adom-wiki pkg install adom/[email protected]Hotfix for 0.9.176: the progress phase map was defined inside the dispatcher AFTER its first use, so Python raised 'cannot access local variable _PHASES where it is not associated with a value' on every verb - the bridge answered nothing but that error. The map is now module-level, defined once at import. My mistake and my apologies; the measured-progress feature itself is unchanged.
adom-wiki pkg install adom/[email protected]Implements the measured-progress contract from issue #32. Every verb with a p50 over ~3s now returns a progress block (namespaced phase, stepLabel, monotonic percent, elapsedSec, estimatedSec, etaSec, confidence, startKind) and its terminal frame carries the actuals plus a measured{} record. Estimates come from a rolling per-machine history persisted in the bridge's own state dir (last 5 samples per phase, split cold vs warm, p50 and p90) - never a hardcoded literal, which is the thing that made 'can take a couple of minutes' useless. Confidence is honest about sample count: 0 samples reports unknown and seeds from a shipped default, 1-2 reports typical, 3 or more reports measured from this machine's own p50. Both amendments I proposed on the issue are implemented: phase ids are namespaced (kicad.cold_start) so a UI can group histories across bridges, and blockedBy names a human-controlled wait (a modal, a UAC prompt) so a bar can say 'waiting for you' instead of animating through something that cannot progress. Cold versus warm is detected per call rather than assumed. kicad_describe now exposes the whole timing history plus the contract version, so a UI can say 'typically Ns cold, Ms warm on THIS machine' before the user clicks. Instrumentation lives in the dispatcher rather than in each handler, so a verb added tomorrow is covered by default.
adom-wiki pkg install adom/[email protected]John: 'why do you blink them like 20 times in a row? if you cannot really control the natural behavior of kicad, you should not fight it as hard as you are - you literally look like you are broken.' He is right, and this concedes the argument. KiCad reasserts its own geometry repeatedly while it loads, and a 50ms parking sweep that re-parks on every reassertion turns into 20-30 visible blinks. The sweep now counts fights per window and after 3 rounds STOPS: it concedes the position and keeps only what actually matters - the window stays behind, unfocused, with its taskbar button. A window that is quiet and slightly visible beats one that is invisible and seizuring. Every round is recorded (kicad_state.focusDebug now carries parkFights, parkGaveUp, parkFightLog and parkFightLimit) plus a stderr line naming the window and the round it conceded on, so this is measurable rather than anecdotal.
adom-wiki pkg install adom/[email protected]The last piece of John's footprint report. With the plugin bound and the correct menu id, the command posts fine and KiCad does open the Footprint Editor - but that frame loads the footprint libraries as it opens and routinely needs 10-30 seconds on a cold pcbnew, while the tier only waited 6. So it declared the background path failed, fell through to paths that could not work, and reported failure while the editor was quietly opening behind it. The wait is now the same 30s ceiling the other tiers use. Verified by firing the same command by hand: the Footprint Editor appears, just later than the old wait allowed.
adom-wiki pkg install adom/[email protected]Applies the Adom automation doctrine to the part surfaces. 0.9.172 made show_footprint fail honestly when its window never appeared, which was correct but useless: the usual reason is that the reverse-bridge plugin is not bound, and on KiCad 10.0.5 the plugin only loads when KiCad scans its plugin directory - which happens when a board editor comes up, not when the project manager alone is running. So the surface now opens a board in the background itself, waits for the bind, and then does what was asked. The user never sees an error they would have fixed by pressing a button the bridge could have pressed.
adom-wiki pkg install adom/[email protected]Two things John hit live. (1) 'When I click the taskbar icon to bring KiCad to the foreground, you don't let me.' Bouncing exists only to stop a window flashing into the user's face WHILE the bridge is working, but the sentinel applied it whenever it could not positively attribute the raise to a click - and a fast taskbar click lands entirely between two 120ms polls, so it was invisible. New idle rule: with no verb in flight and no guard armed, a KiCad window reaching the foreground is the USER, and is left alone unconditionally. Click detection also now uses the pressed-since-last-query bit rather than only down-right-now, and a bounce suppression lasts 3s instead of 10s. (2) 'I asked for a footprint and the evidence was the project window.' A show_* verb could report success while its window never appeared, and the caller then screenshotted whatever was on screen - manufacturing wrong evidence rather than reporting a failure. show_footprint, show_symbol and show_3d_chip now verify their own window is present and fail with surface_window_missing when it is not, and the dashboard refuses to render a different window as proof of the requested surface.
adom-wiki pkg install adom/[email protected]Closes the footprint half of issue #31. The bridge deliberately never trusts hardcoded menu ids across KiCad versions - it asks the live process via the plugin's get_menu_ids RPC - but the parser only understood one response shape (frames[].menus[]). On 10.0.5 pcbnew that RPC returns a FLAT list of {id,label,topMenu}, so the lookup silently found nothing, fell back to the hardcoded 20572, and posted a command that reported success while opening no window. The resolver now walks whatever shape comes back and collects every {id,label} pair; on 10.0.5 it resolves pcbnew's Footprint Editor to 20574 and eeschema's Symbol Editor to 20391.
adom-wiki pkg install adom/[email protected]The loader now starts the payload on a DEFERRED thread. Diagnosis came straight from the log trail added in 0.9.168: 'loading in pcbnew.exe ... import adom_bridge ... ModuleNotFoundError: No module named urllib', raised deep inside http.server importing email.utils out of KiCad's own Lib. KiCad scans its scripting/plugins directory before the embedded interpreter's sys.path is complete, so importing the payload inline could never work in pcbnew; it only worked in kicad.exe because that scan happens later. The plugin now arms a background thread, retries the import every 5 seconds for a minute, starts the bridge as soon as the payload is importable, and logs the outcome. Dashboard in the same release: every LED gains a live busy state (pulsing, with a running label such as 'launching KiCad in the background' or 'waiting for the plugin to bind'), pushed over the live channel the instant work starts, so background activity never reads as a dead indicator.
adom-wiki pkg install adom/[email protected]Third and last gate fix in this chain: the installer's already-current check compared the payload by hash but the GENERATED loaders only by existence. So when 0.9.168 rewrote the plugin-dir loader, every box that already had 0.9.166's copy reported already-current and kept running the broken one. The gate now content-compares every generated artifact (the plugin-dir loader, the boot module and the .pth) against what this release would write.
adom-wiki pkg install adom/[email protected]Fixes the loader shipped in 0.9.166/0.9.167. It guarded against double-starting with an environment variable, and Windows child processes INHERIT the parent environment: once any KiCad process had run the loader, every KiCad it spawned imported the file, compiled a .pyc and then started nothing, which looked exactly like the loader never running. The guard is now a module attribute on sys (per-process, cannot leak to children), the loader calls adom_bridge.start() directly instead of re-importing usercustomize (immune to module-cache subtleties), and it writes a log trail to %TEMP%/adom-kicad-plugin-loader.log so the next diagnosis takes minutes instead of hours.
adom-wiki pkg install adom/[email protected]Follow-up to 0.9.166: the plugin installer's already-current short-circuit compared only the payload and the .pth, so on a box that already had those it returned early and never wrote the new scripting/plugins loader - the whole point of that release. The check now includes every artifact the installer deploys.
adom-wiki pkg install adom/[email protected]Issue #31, the KiCad 10.0.5 plugin-bind regression, gets the loader that actually fires. Chain of evidence: usercustomize.py stopped running in 10.0.5 GUI processes (a 10.0.3 kicad.exe wrote its discovery breadcrumb, the 10.0.5 one never did); a .pth in the user-site did not help either; but a probe planted in KiCad's own scripting/plugins directory DID fire inside kicad.exe on 10.0.5, and reported site.USER_SITE already pointing at the bridge's deploy directory. So KiCad still imports its plugin directory at startup even though it no longer runs the usercustomize step. kicad_install_plugin now writes adom_bridge_plugin.py into %APPDATA%/kicad//scripting/plugins for every installed version; it simply imports the existing loader, so the payload and the discovery protocol are unchanged, and an env guard keeps it from starting twice.
adom-wiki pkg install adom/[email protected]Hotfix for a regression I introduced in 0.9.155-0.9.164 and John hit live: the bridge stopped answering entirely on his laptop. Root cause: the boot path ran ownership-ledger revival, off-screen healing, usability healing, session sanitising and the parking sweep BEFORE binding the server port. Those touch other processes' windows, and SetWindowLongPtr sends WM_STYLECHANGING/WM_STYLECHANGED cross-process - against a hung KiCad that SendMessage never returns, so the bridge deadlocked before it ever listened and every verb timed out (three orphaned bridge processes, no port bound). Two fixes: all desktop-window maintenance now runs on a daemon thread that starts after the server is listening, so the bridge always comes up no matter what state the desktop is in; and style changes first probe the target window with a 150ms SendMessageTimeout, skipping any window whose thread is not pumping messages.
adom-wiki pkg install adom/[email protected]John: 'why is it that when i try to click to see one of your kicad windows it doesn't work? is this cuz you position during launch and then forget to fix the window position afterwards?' Right on the mechanism, and there was a subtler gap than 0.9.160 closed. Suppression (WS_EX_NOACTIVATE, which also hides the taskbar button) is cleared by walking a set held in the bridge PROCESS. Any window suppressed by an earlier bridge - or by one that was killed mid-verb, which happens on every upgrade - is absent from that set in the new process, so nothing ever clears it and the window stays unclickable and taskbar-less no matter how many fixes ship afterwards. The bridge now heals by INSPECTION rather than memory: it reads the style off every KiCad window at boot and every 20 seconds while idle, clearing stale suppression, restoring the taskbar button, re-stamping the icon and pulling any window that is off-screen back to a reachable position. Windows genuinely mid-verb are left alone.
adom-wiki pkg install adom/[email protected]Two things. (1) Plugin bind, continued from 0.9.162: asking KiCad 10.0.5's own interpreter reveals ENABLE_USER_SITE is true but site.USER_SITE is the INTERPRETER DEFAULT (%APPDATA%/Python/Python311/site-packages), not the Documents path KiCad's bundled sitecustomize is supposed to install - so on 10.0.5 every file deployed to the Documents user-site was simply invisible to Python. The payload and the .pth loader now deploy to both locations; a guard keeps the loader inert in any non-KiCad interpreter. (2) The dashboard gains the per-part surface ladder from ab's web-control demo: one real wiki part with eight buttons (symbol, footprint, 3D chip, library, schematic, 2D board, 3D board, project) plus show-every-window. Each button fetches the part's files from its wiki page, installs them into the user's real KiCad, opens just that surface in the background and renders it back into the card. Progress streams over the live channel per card AND paints on the KiCad taskbar button's progress bar, so a long job is legible without watching the page.
adom-wiki pkg install adom/[email protected]The KiCad 10.0.5 plugin-bind regression (issue #31, open since 2026-08-16) is root-caused and fixed. The reverse-bridge plugin was loaded by usercustomize.py, which only runs if the interpreter performs site's execusercustomize() step. KiCad 10.0.5's GUI processes stopped doing that: a 10.0.3 kicad.exe wrote its discovery breadcrumb, the 10.0.5 one never did, so adom_bridge.start() was never called and kicad_bridge_status reported zero live instances while KiCad was plainly running. The loader now also ships as adom_bridge_boot.pth, whose import line is executed by site.addsitedir() - the call KiCad's own sitecustomize.py always makes to expose its 3rdparty packages - so the bridge binds regardless of the usercustomize step. It only starts inside real KiCad GUI processes, and re-importing the shared loader is a no-op thanks to Python's module cache. Dashboard fixes in the same release: the Plugin LED read a top-level alive field that has always lived under summary, so it could never turn green; it now also distinguishes KiCad-closed from KiCad-open-but-not-bound and says which is true. The Daily suite LED is maintainer-only and now hidden unless the dashboard runs with --dev.
adom-wiki pkg install adom/[email protected]John: 'it is really weird how you open kicad in the background'. He was right, and this is the mechanism. Parking exists for one job: stop a brand-new window flashing into the user's face during the second or two it takes to be created. But the park baseline (the set of windows considered pre-existing when a verb starts) subtracted every window the bridge had ever created, so a bridge-launched KiCad was permanently classified as 'new' and got yanked off-screen again on EVERY later verb - a status poll, a screenshot, anything - for the rest of its life. That is the flicker, the disappearing window, and the sliver at the bottom of the screen. The baseline now includes every window that already exists when a verb starts, bridge-created or not; only windows that appear mid-verb are parked, and they unpark as soon as the verb settles. The park clock is also stamped inside the park call itself, so the 12-second park watchdog covers every path rather than just the sweep.
adom-wiki pkg install adom/[email protected]John: 'why do i see no windows taskbar icons after you claim you launched'. Root cause, and it is documented Windows behavior the bridge was ignoring: WS_EX_NOACTIVATE - the style the bridge uses to stop KiCad windows stealing focus - also removes the window from the taskbar unless WS_EX_APPWINDOW is set alongside it. Every suppression now pairs the two, so a backgrounded window keeps a normal clickable taskbar button. Background means BEHIND, never INVISIBLE. Three supporting fixes found in the same investigation: (1) a leaked focus guard kept the parking sweep active indefinitely, leaving a launched window parked off-screen and NOACTIVATE'd for five hours - a guard watchdog now resets guards that overrun their own deadline, and a park watchdog releases any window parked longer than 12 seconds regardless of bridge state; (2) window icon probing used blocking SendMessageW, which hangs on a still-loading KiCad and can freeze the sweep and guard threads - now SendMessageTimeoutW with SMTO_ABORTIFHUNG; (3) unparking could restore a window to a position KiCad had never actually chosen (John got a 406x354 sliver under the taskbar), so unpark now verifies the window is genuinely reachable on screen, re-stamps its icon, and re-applies its Adom badge.
adom-wiki pkg install adom/[email protected]Two things. (1) Every verb response now carries bridgeVersion. It previously only reached /health, so no caller - the dashboard included - could ask which bridge code was actually running, and verifying a deploy meant reading a file on the box. (2) kicad-dashboard 2.0: full parity with fusion-dashboard. Live SSE channel (/events) with state, toast and click events; POST /api/action for launch, close, demo with streamed step screenshots, upgrade, install_plugin, overlay-badge setting and a wiki part tour; ui toast and ui click CLI so an AI can narrate over the page and make the page click its own controls; a _hint on every LED naming the verb that fixes it; a multi-box target picker; console read-back; and a dock.json so the dashboard launches from the Hydrogen dock.
adom-wiki pkg install adom/[email protected]The parking sweep now starts at bridge boot instead of arming on the first GUI verb. Found reviewing 0.9.157: the 60-second session-sanitize retry lives in the sweep's idle branch, so on a quiet boot (bridge up, no verbs yet) the scrub of bridge projects from KiCad's restore-on-launch list never ran, and neither did the between-verb parked-window defense.
adom-wiki pkg install adom/[email protected]Session sanitize, closing the last user-collision John found: KiCad restores system.open_projects at every PM launch, and the bridge left ITS demo project there, so each launch of the users own KiCad auto-opened the bridge demo and hit the project lock warning. Project-creating verbs now record their .kicad_pro in the ownership ledger, and the bridge scrubs owned (plus legacy adom-/in--demo) entries from open_projects at boot and from the sweep whenever no KiCad process is running (KiCad rewrites the file at exit, so edits only stick in that window). file_history is left alone.
adom-wiki pkg install adom/[email protected]Geometry-poison prevention, closing the loop John predicted: a window closed while parked off-screen makes KiCad persist the off-screen position, so the next NORMAL launch opens invisibly. Three defenses: the dispatcher unparks everything before any close verb; atexit unparks on bridge shutdown; and boot heals any KiCad window stranded at parking coordinates (left <= -20000) by moving it to a sane on-screen spot without activation, which repairs even crash-poisoned geometry on windows the user relaunched. The kicad-bridge-background dev skill now documents the full ownership contract, the shell-click intent rule, and the taskbar identity lessons.
adom-wiki pkg install adom/[email protected]Emergency ownership fix, caught live when John launched his own KiCad: the focus sentinel bounced his taskbar launches 8 times (a taskbar click leaves the cursor over the shell, not the raised window, so click-on-window intent detection missed it) and 0.9.154's boot pass badged every enumerated window. New contract: ownership is decided by process - every kicad-family pid the bridge spawns (children included, via parent-chain walk) is recorded in a persisted ledger (%USERPROFILE%/.adom/kicad-bridge-owned.json); the sentinel, event hook, parking sweep, badges, and identity stamps act ONLY on bridge-owned windows. A KiCad the user launches is in no spawned tree and is never parked, bounced, badged, or stamped. Taskbar/Start/desktop clicks now count as user intent for any KiCad raise. Two instances coexist: the bridge drives its own projects in its own processes alongside the user's.
adom-wiki pkg install adom/[email protected]Taskbar identity done right, stealing two paid-for lessons. (1) pup/fusion's: in-bridge ITaskbarList3::SetOverlayIcon is in-process-only, so badges now go through AD-core desktop_taskbar (via the fusion-bridge ad_client, ported verbatim) with fusion's exact 32px badge asset, matched size. (2) New one: eeschema.exe and pcbnew.exe buttons showed blank white documents because the shell's per-exe icon cache was poisoned during the pre-0.9.151 parking era; the bridge now stamps those windows with per-exe AUMIDs (desktop_set_window_identity) whose iconPath is a real .ico extracted from the exe, bypassing the poisoned cache without touching Explorer. Applied on window creation, on setting flips, and 5s after boot for windows that survived a bridge restart.
adom-wiki pkg install adom/[email protected]Overlay badge fix: KiCad windows outlive a bridge restart but the bridge's window-tracking set does not, so the Adom taskbar overlay vanished after every upgrade. The bridge now re-stamps ALL live KiCad windows 5s after boot and on every overlayBadges setting flip (enumeration union tracked set). Also: the container-side dashboard/ directory is no longer shipped in the runtime zip.
adom-wiki pkg install adom/[email protected]Adom overlay badges, John's design after pup's: every bridge-created KiCad window's taskbar button gets the Adom favicon stamped as an overlay (ITaskbarList3::SetOverlayIcon), so the user sees at a glance which windows Adom is driving. Gated by the new overlayBadges setting (default on) in kicad_get_settings/kicad_set_settings, which persist per box and apply live (flipping the setting stamps/clears badges on existing windows). These settings verbs are the backend for the upcoming kicad dashboard (fusion-dashboard parity).
adom-wiki pkg install adom/[email protected]Taskbar icon repair: minimize-first parking freezes a window into the taskbar before KiCad assigns its window icon (wx sets it a beat after frame creation), leaving blank document buttons. The parking path now checks WM_GETICON / class icons and, when absent, stamps the window with its own executable's icon (ExtractIconEx, cached per exe) before minimizing.
adom-wiki pkg install adom/[email protected]Bridge-created windows are now parked by MINIMIZING without activation from their first sighting: positional off-screen parking lost a visible-flicker fight against eeschema's load-phase geometry reassertion (and hwnd churn reset any escalation threshold). Minimized windows are invisible instantly, wx never un-minimizes itself, the taskbar button works with restore-to-maximized preserved, and captures restore off-screen just for the shot. Unparking places non-maximized windows at their true coordinates bottom-z; ex-maximized ones stay in the taskbar.
adom-wiki pkg install adom/[email protected]Park-fight escalation: eeschema reasserts its saved geometry every ~120ms during load, turning positional off-screen parking into visible flicker. A window that fights the park 4 times is now minimized WITHOUT activation (wx never un-minimizes itself; the taskbar button keeps working, with restore-to-maximized preserved). The screenshot path restores park-minimized windows off-screen, captures, and leaves the sweep in charge - so kicad_state and stepShot evidence keep working.
adom-wiki pkg install adom/[email protected]The one-line root of the unguarded gaps: restore_foreground_persistent's hwnd parameter has been vestigial since 0.9.104 (the guardian touches only KiCad windows), but its early-return still required an hwnd - so whenever foreground capture returned None, NO post-verb guard armed at all: no guardian sweeps, parking sweep idle during editor load tails, late windows visible and adopted by rebaselining. The guardian now arms regardless.
adom-wiki pkg install adom/[email protected]The unguarded gap closed: the post-verb focus guardian only armed when a user foreground had been captured, and when capture returned None no guard armed at all - so windows KiCad creates asynchronously after a spawn verb returned appeared in a gap with no guard and no in-flight marker, and the parking rebaseline adopted them as the user's. The guardian (which touches only KiCad windows) now arms unconditionally for every window-spawning verb, keeping the parking sweep continuously active through editor load tails.
adom-wiki pkg install adom/[email protected]Parking instrumentation: focusDebug now carries parkAttempts, parkLastError, sweepTicks and bridgeWindows so a parking no-op is attributable in one read.
adom-wiki pkg install adom/[email protected]Parking model fix: windows the bridge creates are tracked as bridge-created for their lifetime, so per-verb rebaselining can no longer adopt the previous verb's window as the user's (which silently exempted everything from parking). Between verbs the sweep defends parked windows against KiCad's own geometry restores, and after 2 seconds of bridge quiet every parked window is placed at its true coordinates at the bottom of the z-order (ex-maximized ones minimized to the taskbar with restore-to-maximized).
adom-wiki pkg install adom/[email protected]kicad_state.focusDebug: liveness and counters for the parking machinery (sweep/hook/sentinel started, verb-inflight, guard count, parked and baseline counts) so parking failures are diagnosable from one read instead of blind iteration.
adom-wiki pkg install adom/[email protected]Parking works on maximized windows now: SetWindowPos silently cannot move a maximized window, which is why parking no-opped on the demo's maximized editors. Parking now goes through SetWindowPlacement (demote to normal-size at -32000, SW_SHOWNOACTIVATE, remembering the maximized state); unpark restores true coordinates at bottom-z, and ex-maximized windows are handed to the taskbar minimized with WPF_RESTORETOMAXIMIZED so the user's taskbar click restores them exactly like normal.
adom-wiki pkg install adom/[email protected]Parking holds now: KiCad applies its saved window geometry late in initialization, moving itself back on-screen after the early off-screen park. The 50ms sweep re-parks on every visible sighting while bridge work is live (recording the true coordinates only at first sighting), so the window stays off-screen until unpark places it at its real position, bottom-z.
adom-wiki pkg install adom/[email protected]Deterministic off-screen parking: a 50ms sweep, active only while a GUI verb is in flight or a guard is armed, baselines the KiCad windows that existed at verb start (the user's own) and parks anything NEWER off-screen before meaningful paint. Complements the event hook, which arms but receives no events in some sessions. Parked windows return to their true coordinates at bottom-z when bridge work ends.
adom-wiki pkg install adom/[email protected]Focus-hook diagnostics: log hook arming and each KiCad window event to stderr; SetWinEventHook restype declared for 64-bit safety.
adom-wiki pkg install adom/[email protected]Parking timing fix: KiCad windows are created DURING handler execution but guards only arm after the handler returns, so 0.9.138's SHOW-hook parking never engaged. The dispatcher now marks GUI-verb-in-flight around every handler call and the hook parks on either signal (in-flight or guard active).
adom-wiki pkg install adom/[email protected]Off-screen parking, designed by John: NOACTIVATE stops focus theft but a freshly created window still paints near the top of the z-order, visible over the user's work even unfocused. The SHOW event hook now teleports a new KiCad window to (-32000,-32000) before its first visible paint; when bridge work ends every parked window is placed back at its true coordinates at the BOTTOM of the z-order, unfocused. Taskbar buttons work normally, PrintWindow capture works off-screen, and a deliberate foreground (bring_to_user) unparks first. The user sees nothing appear, ever.
adom-wiki pkg install adom/[email protected]Event-driven focus enforcement: SetWinEventHook on EVENT_OBJECT_SHOW and EVENT_SYSTEM_FOREGROUND with a dedicated message-pump thread. During bridge work (guards active, no sanctioned foreground in progress) a KiCad window is NOACTIVATE-suppressed the instant it appears and, if it still grabs the foreground, bounced within milliseconds - replacing the 120-500ms polling reaction that was the visible flash on KiCad 10.0.5. Outside bridge work the click-aware sentinel still owns policy so user clicks into KiCad always work. Hook-bounced events are logged to focusEvents as guarded-steal (hook-bounced, ms).
adom-wiki pkg install adom/[email protected]kicad_state now reports userIdleSeconds (seconds since the last human keyboard/mouse input on the box). This is the PRESENCE GATE for automation: anything that spawns windows must check it first and defer while a human is active (the daily verb suite now requires 600s idle and retries for up to 6h). Born from a live incident: a full suite run foregrounding windows while John worked, on KiCad 10.0.5 where WS_EX_NOACTIVATE no longer prevents first-steals (kicad-bridge#31).
adom-wiki pkg install adom/[email protected]board3d demo beat waits up to 15s for the PCB editor window to be findable before invoking the 3D viewer - the board beat can return while pcbnew is mid-transition and the precheck then missed it.
adom-wiki pkg install adom/[email protected]The last 10.0.5 demo blocker: eeschema's Symbol Editor menu id changed 20390 -> 20391 (found by asking the LIVE process via the plugin's get_menu_ids). All editor-open tiers now resolve menu ids from the live menu bar through the plugin, with the old constants as offline fallbacks. The demo's warm phase also launches the Project Manager so the part beats' in-process plugin route has a bound target by the time they run.
adom-wiki pkg install adom/[email protected]#31's primary root cause found and fixed: it was never a 10.0.5 Python regression - dozens of test runs accumulated dead-pid discovery files (92 on the test box), and plugin resolution probed every one with an HTTP timeout, running past callers' budgets so a perfectly-alive plugin reported plugin_not_running. After pruning, the plugin binds in kicad.exe, standalone eeschema AND pcbnew within 10-12s on 10.0.5. Resolution now skips and DELETES dead-pid files inline (a cheap kernel liveness check, no HTTP), and the bridge sweeps stale files at every boot. Remaining true 10.0.5 items stay open on #31: NOACTIVATE no longer prevents first-steal (sentinel bounce covers it), external WM_COMMAND to a project-loaded PM, and the eeschema 20390 menu id.
adom-wiki pkg install adom/[email protected]Every window-spawning verb response now tells the calling AI explicitly: openedInBackground:true plus a _foregroundHint spelling out the one sanctioned way to show the window to the user (re-call with foreground:true AND foregroundReason; the bridge captions the reason via ab toast for 3 seconds, then brings the window forward; reasonless foreground is refused with _foregroundRefused guidance).
adom-wiki pkg install adom/[email protected]The foreground contract, hardened per John (2026-08-16): (1) any foreground request now REQUIRES foregroundReason - a bare foreground:true is refused with guidance; (2) every sanctioned foreground shows an ab caption carrying the reason for 3 seconds BEFORE the window moves, then hides; (3) after the focus sentinel bounces a self-raising window it holds WS_EX_NOACTIVATE for 10s so 10.0.5's repeat-steal storms are refused silently instead of flickering (on 10.0.5 NOACTIVATE no longer PREVENTS the first steal - evidence on #31). Also: the icon-less taskbar blips users saw are KiCad's own splash/progress windows surfacing during foreground churn; fixing the churn fixes them.
adom-wiki pkg install adom/[email protected]Demo beat order is now a reliability decision: schematic, 2D board and 3D board (plain file-opens, no plugin needed) run first; the part beats (symbol, footprint, part 3D) run after, by which time KiCad's lazily-started embedded Python has had 1-2 minutes to bind the in-process plugin - the only reliable editor-open route on 10.0.5. Narration renumbered to match.
adom-wiki pkg install adom/[email protected]PM plugin bind-wait extended to ~45s: KiCad starts the Project Manager's embedded Python lazily, and on a fresh 10.0.5 PM the reverse-bridge plugin takes 30-45s to come up (15s of retries all hit plugin_not_running while a minutes-old PM answered instantly).
adom-wiki pkg install adom/[email protected]The 10.0.5 demo-beat mystery, root cause at last (verified with in-process menu introspection): the PM menu ids are UNCHANGED (20011/20013 confirmed live via the plugin's get_menu_ids), and the in-process wm_command 20011 opens the Symbol Editor fine even on a project-loaded PM. What broke the chain: tier 1a posts eeschema's menu id 20390, the post lands 'successfully' but opens nothing (stale id), and the tier treated a successful POST as terminal, never trying tier 1b (the working PM route) before falling to the external PostMessage tier, which a project-loaded 10.0.5 PM ignores. Tier 1 now treats the WINDOW APPEARING as the only success signal and always falls through to the PM in-process post (with plugin bind-wait) when no window shows.
adom-wiki pkg install adom/[email protected]KiCad 10.0.5 root cause closed: external cross-process WM_COMMAND to the Project Manager no longer opens editors, and the PM menu is no longer a native Win32 menu, so the in-process plugin post is the only working route from a running PM. That plugin takes a few seconds to bind after PM spawn, and tier 1 gave up after a single probe, which is exactly the race the background demo job hit (its beats run back-to-back). Tier 1 now retries the plugin post for up to 15s. Staged and manual calls always passed because human pacing gave the plugin time to bind.
adom-wiki pkg install adom/[email protected]Hotfix for 0.9.125: find_menu_command returns (cmd_id, label) and the new PM tiers passed the whole tuple into PostMessageW, a ctypes ArgumentError that killed the demo job at beat 1. Proper unpacking in both editors' PM tiers.
adom-wiki pkg install adom/[email protected]KiCad 10.0.5 renumbered the Project Manager menu command ids the bridge had hardcoded (20011 Symbol Editor, 20013 Footprint Editor) - the WM_COMMAND tier fired into nothing and the demo's first three beats died in background mode. Both PM tiers now resolve the command id from the window's REAL menu bar via the win32 menu walk (the 0.9.99 doctrine), with the old ids as last-resort fallback. Numeric menu ids are never to be trusted across KiCad versions.
adom-wiki pkg install adom/[email protected]Cold-start hardening: the project-manager WM_COMMAND route waited only 6s for the Symbol Editor to appear, and a cold KiCad 10.0.5 can take 15s+ when the demo job runs beats back-to-back. The wait is now 30s with a one-time command repost at the 10s mark. This was the root of the demo's beats 1-3 failing in background mode on 10.0.5 (staged mode passed because human-paced calls gave KiCad time).
adom-wiki pkg install adom/[email protected]Failed kicad_demo beats now carry failReason {handlerSuccess, error, output} in result.steps and log the raw step result to stderr. The prior summary discarded the underlying error, which made background-mode beat failures undiagnosable from the outside.
adom-wiki pkg install adom/[email protected]Background demo beats now run the modal-dialog sweep before their retry. Staged demo calls always got the dispatcher's post-verb dialog sweep, but the background job's internal steps did not, and KiCad 10.0.5 introduced a dialog at editor-open that stalled the first three beats (they only recovered in past runs because the caller's progress polls happened to sweep). The blocking dialog is also logged to stderr when hit.
adom-wiki pkg install adom/[email protected]stepShot fix: 0.9.120 keyed the per-step capture off the beat's title field, which is the display label ('1/6 - Schematic symbol'), not a window title, so no frame ever matched a window and zero stepShots streamed. The capture now uses the beat's window field. Caught by the live verification run before the web-control page ever saw a frame.
adom-wiki pkg install adom/[email protected]kicad_demo background jobs now stream per-step screenshot EVIDENCE to the caller: at each beat's completion the bridge captures that beat's own window (it alone knows the moment and the surface) and the next progress poll carries stepShot {step, title, image} (base64 PNG, 640px cap), one per completed step. This implements the web-control contract from #25: the page pins each frame as the step's evidence and stops taking its own racy guess-snaps. The final result.state.shots gallery is unchanged (DURING evidence + AFTER evidence compose).
adom-wiki pkg install adom/[email protected]The major.minor detection string ('10.0') cannot distinguish point releases, and that blindness lived in three places found during the fleet upgrade to KiCad 10.0.5: (1) install ranking, a freshly installed per-user 10.0.5 lost to an old Program Files 10.0.1 because both read '10.0', the bridge now probes kicad-cli version per install (cached) and ranks by full X.Y.Z; (2) check_for_updates compared '10.0' to '10.0.5' and reported an upgrade forever; (3) kicad_upgrade's post-install verification could never see its own success. Also: the update-nudge's cached installed version is invalidated after a successful upgrade.
adom-wiki pkg install adom/[email protected]Copy edit in the update-nudge hint.
adom-wiki pkg install adom/[email protected]Fix for the 0.9.116 update nudge: readiness and bridge_status return through early dispatcher paths and never reached the injection point, so the kicadUpdate field never appeared. The attachment now lives at the HTTP funnel every response passes through.
adom-wiki pkg install adom/[email protected]Proactive KiCad update nudge: the bridge now checks the latest stable KiCad at most once per 24h (async, never delaying a verb) and, when the installed version is behind, attaches kicadUpdate {installed, latest, _hint} to the everyday status verbs (status, readiness, state, bridge_status, window_info). The hint tells the AI to OFFER the user the update, close KiCad, then run kicad_upgrade (official installer, silent, per-user, no UAC), never mid-design-work. Point releases are compared properly now: the installed version comes from kicad-cli version (X.Y.Z), not the major.minor detection string.
adom-wiki pkg install adom/[email protected]Focus sentinel classifier fix: recent keyboard/mouse input anywhere wrongly counted as user intent, so a KiCad self-raise WHILE the user typed in another app (the most disruptive case, caught live on ConfRoomROG over RustDesk) was left in the foreground. A foreground transition now only counts as user-initiated when a mouse click landed with the cursor on that window, or an alt-tab was in progress. Everything else bounces.
adom-wiki pkg install adom/[email protected]Focus sentinel refinement: the bridge's own SANCTIONED foreground paths (foreground:true via bring_to_user, and the allowForeground last resorts which always announce with a toast first) now set expect_foreground(), so the always-on sentinel never bounces a foreground the user explicitly asked for. Sentinel log gains a sanctioned-foreground (allowed) event type.
adom-wiki pkg install adom/[email protected]Always-on focus sentinel: the per-verb guardians prevent foreground steals while a verb runs, but they expire, and KiCad windows self-raise LATE (a 3D render or footprint-library load finishing minutes after the verb). John caught such flashes live. The sentinel watches foreground transitions for the bridge process lifetime: a KiCad window reaching the foreground with NO user input in the preceding 1.2s is a self-raise and gets minimize-bounced back (never touching any user window); one preceded by user input is the human's own click and is left alone. Every transition is logged to kicad_state.focusEvents and stderr (bridge-logs), so background-contract compliance is now provable from the log instead of sampled by callers.
adom-wiki pkg install adom/[email protected]kicad_make_part_project now generates SINGLE-COMPONENT demo projects: just the part on the sheet (stub wires off its pins) and just its footprint centered in tight edge cuts with two copper stubs. The synthetic 330R companion is gone (extra components on a one-part demo board confuse the user). The reference designator now comes from the part's own Reference property, so a diode is D1 and a capacitor is C1. Result gains a 'reference' field.
adom-wiki pkg install adom/[email protected]faulthandler.enable(all_threads=True) at server boot (issue #27): a native ctypes/GDI fault now dumps every thread's Python stack to stderr, and ab 2.0.44+ captures bridge stderr into ~/.adom/bridge-logs/kicad.log, so the next hard crash leaves a usable trace instead of a silent dead port.
adom-wiki pkg install adom/[email protected]Screenshots no longer require PIL: ab 2.0.44+'s managed Python runtime is stdlib-only, and on a fresh box every capture fell back to .bmp, which kicad_state rejects - so a brand-new install had zero working captures. handlers/png_stdlib.py now encodes the GDI BGRA buffer straight to PNG (zlib + struct, nearest-neighbor downscale to 1568px, ~0.3s/frame) whenever PIL is absent. Found running kicad_demo on ConfRoomROG's first-ever bridge boot.
adom-wiki pkg install adom/[email protected]New verb kicad_export_part {partName}: writes one-off single-entry library files for an installed part (a .kicad_sym containing ONLY that symbol, a .pretty containing ONLY that footprint, and the bare 3D model), the reverse of install, proving per-asset round-trip. kicad_make_part_project now generates part-dominant boards (tight edge cuts sized from the footprint) so the part's 3D model is clearly visible in the 3D board view instead of being a speck. kicad_uninstall also removes adom-part-exports and adom-part-staging.
adom-wiki pkg install adom/[email protected]New verb kicad_make_part_project {partName}: generates a small real project (kicad_pro, wired kicad_sch, routed kicad_pcb with edge cuts and the part's 3D model reference) around a part installed in the Adom library, so the project / schematic / 2D board / 3D board surfaces have something true to show for a single component. This is the missing piece for per-part demo buttons: install symbol+footprint+model, make_part_project, then the four show_* file surfaces. Also: install_symbol / install_footprint (and model) now accept filePath as an alternative to base64 fileContent, so large assets (a 214KB step overflows the CLI arg limit as base64) can be staged with ab send_files and installed by path.
adom-wiki pkg install adom/[email protected]kicad_install_footprint now accepts model:{fileName,fileContent} — a base64 3D model (.step/.wrl) installed to Documents/KiCad//3dmodels/Adom/ and wired into the footprint's (model ...) reference (injected when the footprint ships without one). Closes the wiki-component gap: pages ship symbol+footprint+step, and the step used to be dropped so kicad_show_3d_chip rendered an empty viewer. kicad_uninstall now also removes 3dmodels/Adom.
adom-wiki pkg install adom/[email protected]send_key chords no longer need the foreground: wx menu items carry their accelerators ('Save\tCtrl+S'), so a chord is resolved from the window's Win32 menu bar and fired as PostMessage(WM_COMMAND) — background, robust, attributed in the response as method:menu-command. The foreground path survives only for chords with no menu accelerator. Both Alt+3 keystroke fallbacks are deleted (the Win32-menu tier owns 3D-viewer opens).
adom-wiki pkg install adom/[email protected]Forced-foreground courtesy captions: every last-resort allowFocusSteal/allowForeground path now fires a branded ab toast (attributed to the calling AI thread) telling the user WHY their screen is about to be taken, ~1.2s before the grab. Six call sites: Ctrl+Shift+E footprint load, both Alt+3 3D-viewer fallbacks, symbol search typing, send_key chords, real-cursor clicks. Doctrine: a forced foreground without the announce is a bug.
adom-wiki pkg install adom/[email protected]The final background-window design, per John: the bridge only ever manipulates KICAD's own windows. A KiCad window that reaches the foreground is minimize-bounced (Windows itself re-activates the user's previous window — the bridge never locates or raises any user window), shown again unfocused, dropped to the bottom, and NOACTIVATE-suppressed. All user-window capture/restore/adopt machinery is deleted. foreground:true remains the explicit opt-in to bring a window to the user.
adom-wiki pkg install adom/[email protected]Focus restore no longer fights the user: the end-of-verb restore only fires when a KICAD window currently holds the foreground. Previously it blindly re-raised the window captured at verb START — if the user switched windows during a long verb, verb completion yanked them back into the old window (reported live: the browser kept coming to the foreground).
adom-wiki pkg install adom/[email protected]Guardian v2.1: while any guard is active, every visible KiCad window (existing AND newly created, ~0.5s sweep) gets WS_EX_NOACTIVATE up front — the 0.9.101 run showed each fresh window still got one free visible steal before suppression; now the first offense is refused too. Styles cleared at guard end / foreground:true / close as before.
adom-wiki pkg install adom/[email protected]Focus guardian v2 — prevent, don't react: KiCad windows that grab the foreground get WS_EX_NOACTIVATE so Windows refuses their self-activation outright (the reactive yank-back showed as constant flashes + focus churn during test runs). Style cleared when guards end, on foreground:true, and by kicad_close so the user can always click in afterwards. Plus a verb-suite crash fix.
adom-wiki pkg install adom/[email protected]Background-contract audit fixes: the background kicad_demo job now arms a focus guardian for its FULL duration from inside the worker thread (the dispatcher's guard expired 45s in while beats kept opening windows for ~100s — including the board_3d render self-raise); the slow-tier dispatcher guard is 120s so cold show_3d_* flows are covered end-to-end.
adom-wiki pkg install adom/[email protected]#26 3D viewer cold open: new Tier 0 resolves the 3D Viewer command straight from the wxFrame's native Win32 menu bar (GetMenu/GetSubMenu walk) and fires it with PostMessage(WM_COMMAND) — plugin-free, focus-free, works from cold without the late-binding plugin or an opaque toolbar.
adom-wiki pkg install adom/[email protected]Focus-guardian coverage fix: the show_* surface verbs wrap open_* but the dispatcher keys on the command name, so show_* were bypassing the background guardian AND the foreground:true opt-in. Added all eight to _SPAWNS_WINDOW + SPAWNS_WINDOW_FOCUS; show_3d* get the 45s guard tier.
adom-wiki pkg install adom/[email protected]Background-first, enforced (John's principle): (1) the symbol/footprint keystroke+SendKeys fallbacks are now OFF by default — they fired GLOBAL keys against a non-foregrounded window, leaking into whatever the user was typing in; opt-in via allowFocusSteal, which now does a real foreground. (2) foreground:true / showToUser on any window verb is the sanctioned user-choice path — the dispatcher brings that KiCad window TO the user instead of keeping it background. (3) the full principle + an audit rule are in the kicad-bridge-background dev skill.
adom-wiki pkg install adom/[email protected]kicad_show_project completes the surface family: the whole electronics project (KiCad Project Manager, optionally on a .kicad_pro) — the top of the design tree. All eight surfaces (project, schematic, 2d board, 3d board, symbol, footprint, 3d chip, library) now have a clean named verb.
adom-wiki pkg install adom/[email protected]#26: open_3d_viewer's Footprint-Editor path now has the plugin-free UIA-invoke tier the PCB path already had, so show_3d_chip works from cold without waiting on the late-binding plugin. 3D-window detection now polls up to 9s (software-OpenGL renders lag the invoke).
adom-wiki pkg install adom/[email protected]show_3d_board and show_3d_chip now wait for the board/footprint editor window to materialize (open is async) before opening the 3D viewer, fixing a 'PCB Editor is not open' race when called with a filePath from cold.
adom-wiki pkg install adom/[email protected]kicad_show_* family, mirroring the Fusion bridge's fusion_show_*: one clean, named verb per KiCad surface so a caller never hand-assembles a workflow — show_symbol, show_footprint, show_3d_chip, show_schematic, show_2d_board, show_3d_board, show_library. Thin wrappers over the existing open_* handlers (same background-first, verified loads). Plus 0.9.92's library-browse mode.
adom-wiki pkg install adom/[email protected]Library browse: open_symbol_editor/{libraryName} and open_footprint_editor/{library} with NO part name now filter+select the library in the tree and report success as a browse (libraryShown), instead of failing because no part loaded.
adom-wiki pkg install adom/[email protected]Footprint editor cold-open: wait up to 34s for the spawned pcbnew to load the full fp-lib-table before declaring failure (stock-library restore made cold opens slower and the old 8s poll always lost).
adom-wiki pkg install adom/[email protected]Footprint editor cold-start: the PM-menu plugin tier now retries after the project manager launches (it previously only ran before, when nothing existed to answer). With 0.9.89's background load tier this makes footprintName/library work from fully closed.
adom-wiki pkg install adom/[email protected]Footprint editor parity with the symbol editor: plugin-free background load (WM_SETTEXT filter + Down + tree-targeted Enter/dblclick, title-verified) and honest success:false when a requested footprint doesn't load. Clears the last user-visible symptom of #21.
adom-wiki pkg install adom/[email protected]Issue #24: kicad_demo {all:true, background:true} runs the six-beat tour as a background job with structured progress — poll kicad_demo {progress:true} for percent/elapsedSec/estimatedSec/stepLabel (a real progress bar, from the bridge's own timing model), final poll returns the kicad_state payload (every window as base64 PNG) + narration. Staged beat mode unchanged and now carries progress fields too.
adom-wiki pkg install adom/[email protected]Two from live testing: (1) #23 fix — every window finder now requires the window to belong to a real KiCad process, so a browser tab titled 'KiCad ...' can never be mistaken for the app again. (2) #22 — new read-only kicad_state verb: every KiCad-owned window as inline base64 PNG (shots[]) plus logical state (editors inventory, modal dialogs, running flag) so web pages and AIs see the app's true multi-window state in one call.
adom-wiki pkg install adom/[email protected]Background symbol load, final activation step: Enter posted directly to the LIB_TREE control (geometry-located) with a PostMessage double-click fallback on the selected row. Filter + selection were already working; this closes the activate gap.
adom-wiki pkg install adom/[email protected]Background symbol load: the win32 tier now sends Down (select first filtered match) then Enter (activate) through the filter box, matching KiCad's own keyboard flow.
adom-wiki pkg install adom/[email protected]Root-cause fix for Device:R symbol loads (disc #656/#20): early config bootstraps could leave the user's sym/fp-lib-table with NO stock KiCad libraries (empty-table fallback when base_dir was unresolved). The bridge now self-heals at every boot: missing stock-template libraries are merged into the user tables, user rows untouched. Plus 0.9.83's plugin-free background navigate tier.
adom-wiki pkg install adom/[email protected]open_symbol_editor gains a plugin-free background navigate tier: WM_SETTEXT into the LIB_TREE filter + Enter, title-verified, zero focus theft. Loads the requested symbol even while eeschema's embedded Python (and thus the in-process plugin) is still cold — the #21 latency no longer blocks #20.
adom-wiki pkg install adom/[email protected]uninstall/testResidue: rmtree now chmods read-only files and retries (Windows git-object dirs inside the demo project's .history were undeletable).
adom-wiki pkg install adom/[email protected]kicad_uninstall {testResidue:true}: surgical removal of everything the daily verb suite creates (fixture dir, demo project, ADOM_VERBTEST parts inside the Adom libs, AdomVerbTest lib-table row, stale discovery files) without touching the plugin, the libraries themselves, or user data. The suite now runs it as its final phase.
adom-wiki pkg install adom/[email protected]Dialog sweeper fix from the first verb-suite runs: KiCad progress dialogs (Load PCB, plot/render progress) are now classified and left running — both sweep paths were clicking their only button, which is Cancel, silently aborting the load the verb had just started.
adom-wiki pkg install adom/[email protected]ALWAYS-background window contract: focus guardian is now KiCad-aware (only acts on KiCad thieves, adopts the user's own window switches, demotes the offender below the user's window), guard extended to 45s for slow async self-raises (3D render completion), launch verb added to the guarded set. New kicad-bridge-background dev skill encodes the doctrine; the daily verb suite now FAILS any verb that leaves a KiCad window in the foreground.
adom-wiki pkg install adom/[email protected]ab 2.0.35 alignment: docs/skills teach the new adom-bridge CLI name (adom-bridge-cli references swept); kicad_uninstall echoes the cascade flag so ab's bridge_uninstall cascade report shows context. No verb behavior changes.
adom-wiki pkg install adom/[email protected]Fix #20: kicad_open_symbol_editor now actually loads the requested symbol — waits up to 12s for a cold-started eeschema's plugin to bind, uses a library-qualified LIB_TREE filter (libraryName no longer discarded), and verifies the load: an unloaded symbol now returns success:false + editorOpened:true instead of a silent empty editor.
adom-wiki pkg install adom/[email protected]kicad_launch: cold-start the project manager (issue #19; open_editors now teaches that it only inventories). kicad_uninstall: full artifact removal for Adom Bridge's uninstall cascade (issue #18), declared via bridge.json uninstall field. SKILL.md legacy CLI-name sweep.
adom-wiki pkg install adom/[email protected]Naming sweep per adom/definitions: every surviving bare AD/HD abbreviation in hints, docs and skills now says Bridge (ab) / Hydrogen (ah). No functional change.
adom-wiki pkg install adom/[email protected]Plugin payload 0.9.1: select_and_load now orchestrates on the RPC worker thread — hop 1 sets the search filter, a 0.8s worker-side sleep lets KiCad's LIB_TREE debounce fire on the UI thread, hop 2 activates the pre-selected match (fixed the DataViewEvent constructor to the 3-arg overload). Verified live on AdomLapper: the Symbol Editor title goes to 'Adom:AdomDemo_IC' with zero focus/keyboard/cursor theft. open_symbol_editor now tries this plugin path first and falls back to the PowerShell navigate only when no plugin instance is alive.
adom-wiki pkg install adom/[email protected]Plugin payload v0.9.0: select_and_load's default transport is now background_activate — after the filter pre-selects the best match, it takes dvc.GetSelection() (avoiding the v0.6.0 whole-model walk that segfaulted) and activates it via a posted DATAVIEW_ITEM_ACTIVATED event plus a native VK_RETURN PostMessage to the tree's own hwnd. Zero focus theft, zero cursor movement, zero global keyboard input. useSendInput:true remains as the explicit noisy fallback.
adom-wiki pkg install adom/[email protected]Demo hardening from the live AdomLapper run: _prepare deletes stale KiCad .lck lockfiles in the demo project dir (a force-killed KiCad leaves them; the next open then hits a modal File Open Warning and the sheet stays untitled), and warm-up is idempotent (an existing Schematic+PCB editor pair is reused instead of spawning duplicates on every call).
adom-wiki pkg install adom/[email protected]Three bugs caught in the first live end-to-end demo run on a real laptop: (1) kicad_demo and kicad_export_molecule were missing from the dispatcher's window-spawning verb sets, so the background/focus-restore machinery skipped them and demo windows landed on top of the user's work — both now get capture/restore with the long 16s guard; (2) the demo's self-screenshot helper passed an empty kicad_info to screenshot_all and silently captured nothing; (3) the symbol beat now verifies the part actually loaded onto the canvas instead of narrating over a '[no symbol loaded]' editor.
adom-wiki pkg install adom/[email protected]Rename cut-over (Adom Desktop -> Adom Bridge, page adom/adom-desktop-kicad-bridge -> adom/kicad-bridge). bridge.json updateManifestUrl, docs, homepage and hero now point at the new slug, restoring auto-update (the old API manifest path 404s). The Mesa llvmpipe download URL moved to the new release store. User-facing copy and the KiCad-visible Adom library descriptions now say Adom Bridge; Hydrogen replaces HD. No verb, env, port, or protocol changes.
adom-wiki pkg install adom/[email protected]The caller-identity capture read the wrong place. On a relay call AD delivers the caller in args.caller.aiThread (from the --ai-thread flag or an explicit caller), not the X-Adom-Caller-* headers my 0.9.67 code read - so logging and window-labeling never fired. set_from_request() now reads args.caller first and headers as a fallback (headers remain the outbound direct-API format). Verified against the real wire shape from a live 1.9.183 desktop.
adom-wiki pkg install adom/[email protected]Window labeling for caller identity now locates the raised editor window by its title (Symbol/Footprint/PCB/Schematic Editor, 3D Viewer) instead of needing each open handler to return an hwnd, so desktop_set_window_identity fires for every open verb. Still best-effort and non-blocking.
adom-wiki pkg install adom/[email protected]AD 1.9.180/1.9.183 caller identity. The bridge now captures the X-Adom-Caller-* headers on every request and logs the owning thread in each per-verb log line (caller="chip-fetcher tab 3"), so concurrent-agent interference is reconstructable. New caller_identity module: forward_headers() echoes the three headers and adds X-Adom-Caller-Delegate:kicad, and ad_callback() makes an outbound AD call that carries the identity through (self_caller() for the bridge's own polls). Best-effort desktop_set_window_identity labeling of a raised KiCad window with the owning thread, gated on an hwnd being present. Values are self-asserted: logging/UX only, never authorization.
adom-wiki pkg install adom/[email protected]Watcher description no longer sends users to AD's Settings -> KiCad panel, which was removed in AD 1.9.117. Points at the set_project_watch / trigger_project_watch verbs instead; config keys remain honored.
adom-wiki pkg install adom/[email protected]kicad_demo now returns the SAME shape as fusion_demo (stage, done, narrate, screenshots[{label,path}], steps, _hint), so the AI that HD's installer runs speaks one vocabulary for both bridges. The verb now CAPTURES its own screenshots per beat (labels schematic/board_2d/board_3d match Fusion's) instead of asking the caller to hunt window titles. A beat that cannot open no longer fails the demo: it narrates the skip and moves on ('never end a demo on an error screen'). The not-installed path narrates KiCad's honest advantage — free, open source, no trial clock or feature tier — and installs it on acceptance.
adom-wiki pkg install adom/[email protected]The bridge no longer takes over the user's screen. navigate_symbol.ps1 previously did an Alt-key foreground trick, SetForegroundWindow, SetCursorPos (moving the user's physical mouse) and SendKeys typing — so if you were working, it typed on top of you. It now sets the search box via UIA ValuePattern (no focus) with a WM_SETTEXT fallback and commits with PostMessage. kicad_send_key and kicad_click now PostMessage directly to the target window by default: no focus theft, no cursor movement, and keys can never leak into the user's active app. Modifier chords and canvas clicks that genuinely need real input return errorCode foreground_required with a hint to WARN the user (~5s) and opt in via allowForeground. launch_editor.ps1 de-foregrounded (UIA Invoke needs no focus).
adom-wiki pkg install adom/[email protected]kicad_demo: a first-class, narrated six-step showcase (symbol, its footprint, that part in 3D, a schematic, the 2D board, the 3D board). Generates every asset in code (ships no sample files) and borrows KiCad's own bundled 3D models. If KiCad is missing it OFFERS to install it: kicad_demo {installKiCad:true} installs silently then runs the tour. Each step returns say/pointOut/window so the AI can narrate and screenshot.
adom-wiki pkg install adom/[email protected]Runtime zip slimmed 31%: removed skills/ (already shipped by the container pkg), demo/, README/CONTRIBUTING/plugin-prompt docs, hero fonts and all images. Keeps code, certs/cacert.pem, .ps1 UIA scripts, templates/blank-board.kicad_pcb and the runtime SKILL.md. No functional change.
adom-wiki pkg install adom/[email protected]kicad_export_molecule: one-shot desktop half of the Adom molecule pipeline (STEP export + silkscreen top/bottom renders + sibling sch/pro discovery + exact container next-steps for step2glb -> adom-molecule). capabilities.py grounds schematic-IPC as a KiCad 11 feature (kipy get_schematic).
adom-wiki pkg install adom/[email protected]Publishing hygiene (SDK re-audit #84): runtime zip is now a Release /download/ asset (not a /files blob); manifest repointed + updateManifestUrl added. enable_software_opengl now fetches Mesa llvmpipe from the Release /download/ asset instead of a /files blob.
adom-wiki pkg install adom/[email protected]Legacy-footprint placement + robust background FP-editor 3D. (1) place_footprint now accepts legacy (module ...) footprints (KiCad<=5 / EAGLE-imported / most chip-fetcher parts): the wrapper is normalized to (footprint ...) so the part splices into a preview board cleanly. (2) The Footprint Editor's 3D viewer opens through the embedded plugin instead of an Alt+3 keystroke: the FP editor is a frame inside the pcbnew process, so the bridge resolves that frame index and posts the live-resolved '3D Viewer' menu id to it — no focus theft, and it fixes an UnboundLocalError (VK_MENU) that broke the path entirely. (3) kicad_click rejects out-of-range coords when relative=True instead of clicking far off-screen (which could hit another window's controls and crash KiCad).
adom-wiki pkg install adom/[email protected]Full winvm verb battery hardening. (1) open_3d_viewer: the PCB '3D Viewer' menu command id drifts across KiCad builds (20563 on one, 20568 on KiCad 10 as shipped to winvm) — the bridge now resolves it LIVE from the plugin's get_menu_ids by matching the menu text, instead of trusting a hardcoded constant, so it works on any build. (2) export_pdf: KiCad 10's kicad-cli now requires --layers for PDF (it errored with none); we now default a full-board layer set for PDF as well as SVG, and accept the layers arg as either a JSON list or a comma string.
adom-wiki pkg install adom/[email protected]3D viewer background fix. The 3D viewer is an in-process child window pcbnew creates and re-raises repeatedly while it renders the board (several seconds) — unlike a launched editor that self-activates just once, so the 6s restore expired mid-render and the viewer ended up on top. open_3d_viewer and place_footprint now get a 16s persistent focus-restore that covers the render, keeping the user's window on top throughout. Verified via desktop_list_windows z-order.
adom-wiki pkg install adom/[email protected]Real fix for KiCad windows opening in the foreground. Root cause: open_board/schematic/place_footprint launch a fresh pcbnew/eeschema via subprocess.Popen, and a newly-launched GUI process activates its own window ASYNCHRONOUSLY — a beat after the handler returns and after the one-shot focus restore, so KiCad won. Now: (1) launches pass a STARTUPINFO with SW_SHOWNOACTIVATE so the new window opens without activating, and (2) the dispatcher runs a persistent background restore for ~6s that re-puts the user's window on top whenever KiCad steals foreground during its async startup. Applies to every window-spawning verb.
adom-wiki pkg install adom/[email protected]UIA background fallback refinement: the substring control search now prefers a control that actually supports InvokePattern (for invoke) or ValuePattern (for setvalue), instead of the first name match. KiCad exposes both a non-invokable 'Footprint Editor' label and the invokable toolbar button under the same name; the old search grabbed the label and returned not_invokable.
adom-wiki pkg install adom/[email protected]Bridge-side UIA background fallback. New handlers/uia.py shells to PowerShell's System.Windows.Automation to Invoke the 'Footprint Editor' / '3D Viewer' controls by accessible name — programmatic UIA Invoke means no foreground, no focus steal, no cursor movement. Wired as Tier 1.5 in open_footprint_editor/open_3d_viewer, between the embedded-plugin WM_COMMAND path and the now-opt-in disruptive fallbacks. KiCad (wxWidgets) exposes an invokable UIA tree, so this reliably opens editors in the background when the plugin path isn't loaded. It's the bridge's own subprocess, not AD's gated run_script.
adom-wiki pkg install adom/[email protected]Truly background operation — never steal focus or move the cursor mid-verb. The open handlers no longer call SetForegroundWindow/BringWindowToTop: _force_foreground now only makes a window visible without activating it (SW_SHOWNOACTIVATE). The two inherently-disruptive fallbacks are now OPT-IN and off by default: the launcher-icon click (which moved the user's mouse via SetCursorPos) requires allowCursorClick, and the Alt+3 3D-viewer keystroke (which needs pcbnew foregrounded) requires allowFocusSteal. Default is the background plugin/WM_COMMAND path. The dispatcher's focus capture+restore now wraps EVERY GUI verb (clicks and key sends included), not just window-raisers.
adom-wiki pkg install adom/[email protected]Latency fixes for two verbs that could hit the 30s client timeout. open_editors now uses the existing budgeted port-prober (3s wall-clock cap + per-port dedup) instead of probing each stale discovery file at 1s — a pile of dead-process files no longer stalls it for 30s when no KiCad is live. The footprint/symbol editor window-appearance poll loops were trimmed from 10s to 6s per tier (they break the instant the window appears). And the read-only reporters (open_editors, screenshot_all, window_info) were removed from the dialog settle-poll set since they don't spawn windows.
adom-wiki pkg install adom/[email protected]Background-open guarantee: the bridge must never steal the user's focus. The dispatcher now captures the user's foreground window before any window-raising verb (open_board/schematic/symbol/footprint/3d, place/install) and restores it afterward via the AttachThreadInput technique so the cross-process focus hand-back reliably sticks. KiCad windows open behind the user's active work. Documented as a non-negotiable rule in the kicad-bridge-dev skill.
adom-wiki pkg install adom/[email protected]Three reliability fixes. (1) Self-heal detection: if the startup cache is empty but KiCad is actually installed (e.g. installed after the bridge booted, via a kicad_upgrade whose client call timed out), the not-installed pre-check now does a live re-detect and refreshes the cache instead of wrongly reporting 'not installed' until a manual respawn. (2) install_library is idempotent: an already-registered library returns success (no-op), not an error. (3) Footprint Editor 3D viewer opens via the Alt+3 accelerator (universal across KiCad versions) with legacy WM_COMMAND fallbacks — the hardcoded 20500 was a KiCad-9 id that silently failed on KiCad 10.
adom-wiki pkg install adom/[email protected]Dialog coverage settle-poll: KiCad's error/parse dialogs are asynchronous and often transient (they appear a beat after the spawning verb's handler returns and auto-close within seconds), so a single post-verb scan raced them. Window-spawning verbs (opens/place/install/screenshot_all) now poll for up to ~3s, catching a late dialog, screenshotting it, and expiring it.
adom-wiki pkg install adom/[email protected]Hardening for constant dialog coverage: the sweep's window-title reads now use InternalGetWindowText (no cross-thread WM_GETTEXT) and dialog body reads use SendMessageTimeout with SMTO_ABORTIFHUNG, so a modal error dialog blocking KiCad's UI thread can no longer hang the scan that is meant to detect it.
adom-wiki pkg install adom/[email protected]Constant error-dialog coverage. Root cause of silent verb failures: the dialog scan was entirely PID-gated, so a KiCad #32770 error box owned by an untracked pcbnew/eeschema/orphan process (e.g. 'Cannot enumerate ...Templates (Access denied)') was invisible and silently blocked the next verb. Added a global EnumWindows finder for #32770/error-title dialogs merged into the scan, and a dispatcher-level auto-sweep that runs after every GUI-affecting verb: it screenshots each dialog, reads its body, expires it so the next verb is unblocked, and attaches _autoDialogs + a _dialogHint to the response so the AI is always shown what KiCad popped.
adom-wiki pkg install adom/[email protected]Hardened first-run wizard handling. The dialog auto-sweep now loops and re-scans (the wizard's Cancel spawns a Confirmation box that a single pass missed), the dismisser clicks Cancel/Finish/Skip and sends Escape for wizards that have no OK button, and ensure_win_user_config now seeds a minimal kicad_common.json (and resolves APPDATA/USERPROFILE robustly, fixing the same stripped-env issue as LOCALAPPDATA) so a freshly installed KiCad never shows the 'Welcome to KiCad' setup wizard. Seeding also runs right after kicad_upgrade so the first GUI open is clean.
adom-wiki pkg install adom/[email protected]kicad_diagnostics now enumerates running KiCad processes via the ctypes EnumProcesses API in-process, replacing a tasklist subprocess that timed out dumping the full process table on a busy VM.
adom-wiki pkg install adom/[email protected]Added kicad_diagnostics, a read-only self-inspection verb so an agent can debug the bridge without ever calling AD's approval-gated run_script/shell. It reports the environment the BRIDGE process actually sees (a stripped LOCALAPPDATA here explains a per-user KiCad going undetected), a full KiCad-detection breakdown (every base path scanned and the version dirs/kicad.exe found), running KiCad processes, and current config/user dir state; optional probePaths and readFile args stat/list any path or peek a small config/output file. Works even when KiCad is absent (bypasses the not-installed pre-check).
adom-wiki pkg install adom/[email protected]Three fixes surfaced by a full verb test on ADOMBASELINE. (1) install_symbol: the top-level symbol extractor only matched 2-space indentation, so every TAB-indented .kicad_sym (modern KiCad, generator kicad_symbol_editor) yielded 'No symbols found'; it now matches any indentation. (2) export_svg: kicad-cli requires --layers for SVG and errored 'At least one layer must be specified'; a sensible full-board layer set is now the default. (3) open_footprint_editor: added a tier that opens the Footprint Editor from a running pcbnew (menu id 20572), so it works when a board is open without needing the kicad.exe project manager (whose first-run wizard otherwise blocked it).
adom-wiki pkg install adom/[email protected]Two fixes found during a full on-VM verb test. (1) close_windows.py used pathlib.Path without importing it, so the dialog auto-sweep crashed with 'name Path is not defined' — this cascaded: window_info/dismiss_dialogs/screenshot_all failed and blocking dialogs then prevented the symbol/footprint editors and 3D viewer from opening. (2) install_symbol failed 'config/user directory not found' on a never-launched KiCad; the shared adom_library._get_paths now bootstraps the config dir the same way install_footprint does.
adom-wiki pkg install adom/[email protected]Critical fix: a per-user (/currentuser, no-UAC) kicad_upgrade install lands in %LOCALAPPDATA%\Programs\KiCad, but AD provisions the bridge Python with a stripped environment where LOCALAPPDATA is unset — so the bridge could not detect the KiCad it had just installed and every verb failed 'not installed'. Detection now derives the LocalAppData root from LOCALAPPDATA, USERPROFILE, and Path.home().
adom-wiki pkg install adom/[email protected]SDK re-audit follow-ups (issue #64): migrated dev + publish skills to the SKILLPACK layout (real skills//SKILL.md with user-invocable:false and DEVELOPER-only descriptions, retiring the dead dev-skills/ convention). Scoped kicad_send_key to single keys delivered to an exact hwnd (dialog Enter/Escape) and pointed modifier chords at AD's desktop_press_key across the verb catalog and skills.
adom-wiki pkg install adom/[email protected]Adopt the AD v1.9.79 generic bridge contract. Completed the detect block with installVerb (kicad_upgrade) and hostAppOptionalVerbs so AD's readiness probe uses this bridge's declaration. Added a timeouts block declaring real budgets for slow verbs (upgrade 900s, DRC/ERC/STEP 300s, gerber 210s, 3D viewer 300s) so they aren't cut off at the old flat 130s. Set statusVerb to kicad_status and added the alias handler AD polls after a non-terminal timeout. Not-installed responses now use the generic host_app_not_installed errorCode plus a hostApp field (legacy kicad_not_installed retained in errorCodeLegacy).
adom-wiki pkg install adom/[email protected]Auto-dismiss the KiCad first-run Welcome wizard and older-version conversion notice. Full README overhaul with a screenshot per window (schematic, symbol, footprint, 2D board, 3D board) captured on a GPU-less Hyper-V VM via the Mesa software-OpenGL fallback, a control-surfaces SVG diagram, and install/dialog/software-OpenGL sections.
adom-wiki pkg install adom/[email protected]New LAST-RESORT fallback verb kicad_enable_software_opengl: deploys Mesa llvmpipe (CPU software OpenGL) into KiCad's bin so KiCad renders on a GPU-less host (Hyper-V/RDP/headless). Slow; never suggested proactively; for worst-case only.
adom-wiki pkg install adom/[email protected]Skills updated with this session's learnings: kicad-interaction now documents the reliable process-based dialog scan + auto-expire + kicad_dismiss_dialogs + Cairo software-canvas self-heal; SKILL.md documents the NsisMultiUser install scope (/allusers vs /currentuser, no-UAC per-user install), the fresh-machine config bootstrap, and elevation diagnostics.
adom-wiki pkg install adom/[email protected]Dialog detection is now RELIABLE: scans EVERY window owned by a running KiCad process (matched by PID, not title/owner — the old way missed the OpenGL notice), classifies dialogs by #32770 class, auto-expires benign ones, screenshots each expired dialog for the AI, and forces the Cairo software canvas on GPU-less hosts.
adom-wiki pkg install adom/[email protected]When the bridge dismisses the 'could not use OpenGL' notice (proof the host has no usable GPU), it now persists graphics.canvas_type=2 (Cairo software) to kicad_common.json so KiCad renders without OpenGL on VMs/RDP/servers. Reported via forcedSoftwareCanvas; close+reopen editors to apply.
adom-wiki pkg install adom/[email protected]Bridge now DETECTS blocking dialogs, returns hints, AND expires the benign ones programmatically: window_info auto-clicks OK on the OpenGL/software-render notice (the modal that stalls editors on GPU-less VMs/RDP), and a new kicad_dismiss_dialogs verb force-clears benign (or all) dialogs.
adom-wiki pkg install adom/[email protected]install_library/install_footprint now bootstrap %APPDATA%/kicad// + seed lib tables from the install template when KiCad has never been launched (fresh machine), instead of failing 'config directory not found'.
adom-wiki pkg install adom/[email protected]Root-cause fix for silent install: KiCad 10's NsisMultiUser installer requires an explicit scope in silent mode — bare /S exits rc=666660 (invalid command-line parameters). kicad_upgrade now passes /allusers /S when elevated or /currentuser /S otherwise (per-user install: no admin, no UAC), accepts {scope}, and detect paths include %LocalAppData%\Programs\KiCad.
adom-wiki pkg install adom/[email protected]kicad_upgrade now reports elevated=true/false (IsUserAnAdmin) so a failed install distinguishes 'AD not elevated' from other causes.
adom-wiki pkg install adom/[email protected]kicad_upgrade reuses an already-downloaded installer in Temp (valid MZ + size) instead of re-fetching ~1GB; pass reDownload:true to force. Makes retrying after a failed install (e.g. UAC not approved) near-instant.
adom-wiki pkg install adom/[email protected]Correct the kicad dependency (>=10.0 -> >=7.0; the bridge supports 7/8/9/10 per its own description). Add download/install progress logging to kicad_upgrade + raise the read timeout to 300s so a slow/stuck install is diagnosable via bridge_log_read.
adom-wiki pkg install adom/[email protected]Bundle certs/cacert.pem (certifi roots) and load it in the SSL context — fixes CERTIFICATE_VERIFY_FAILED on AD's portable Python where the Windows cert enumeration was insufficient.
adom-wiki pkg install adom/[email protected]kicad_upgrade/check_for_updates now build an SSL context that loads the Windows ROOT/CA trust store, fixing CERTIFICATE_VERIFY_FAILED when AD's provisioned portable Python has no CA bundle. Verification stays on.
adom-wiki pkg install adom/[email protected]Fix: kicad_upgrade (and check_for_updates) were blocked by the kicad-not-installed pre-check, so a fresh machine could never bootstrap KiCad. Also refresh the detection cache after a successful install so subsequent verbs see KiCad without a bridge restart.
adom-wiki pkg install adom/[email protected]kicad_describe entries now carry hint/related/pitfalls; every verb returns a rich _hint (fix_keyboard). Resolves discussion #14.
adom-wiki pkg install adom/[email protected]