☰
v0.9.176: implements #32 - measured progress on every slow verb, rolling per-machine history (p50/p90, cold vs warm), h…
v0.9.175: STOP FIGHTING KiCad's geometry - after 3 rounds concede the position and just keep the window behind and unfo…
v0.9.174: the footprint tier waited 6s for a window that needs 10-30s on a cold pcbnew, so it declared failure while th…
v0.9.173: a click is a GOAL - the footprint/3D-chip surfaces now bind the plugin themselves (open a board in the backgr…
v0.9.172: THE IDLE RULE - never bounce a KiCad foreground when no verb or guard is running, so a taskbar click always w…
v0.9.171: the live menu-id resolver only understood frames[].menus[], but get_menu_ids returns a FLAT list on 10.0.5 pc…
v0.9.170: defer the plugin start - KiCad scans its plugin dir before sys.path is complete (inline import died on 'No mo…
v0.9.169: the install gate compared only EXISTENCE of generated loaders, so 0.9.168's rewritten loader never shipped to…
v0.9.168: the plugin-dir loader guarded with an ENV VAR, which children inherit - so after one KiCad process ran it, ev…
v0.9.167: the already-current short-circuit skipped 0.9.166's new plugin-dir loader entirely; the up-to-date check now…
v0.9.166: #31 - load the reverse bridge from KiCad's scripting/plugins dir, the hook that still fires on 10.0.5 (verifi…
v0.9.165 HOTFIX: boot maintenance ran BEFORE the port bind and SetWindowLongPtr blocks forever against a hung KiCad, so…
v0.9.164: heal window usability by INSPECTION - a window suppressed by an earlier bridge process was unknown to the new…
v0.9.163: deploy the plugin loader to the interpreter's REAL user-site too (10.0.5 reports the default %APPDATA%/Python…
v0.9.162: ROOT CAUSE + fix for the 10.0.5 plugin bind regression (#31) - KiCad 10.0.5 GUI processes no longer run site.…
v0.9.161: THE 'weird' root cause - the park baseline excluded bridge-created windows, so an already-open KiCad got re-p…
v0.9.160: THE taskbar-icon root cause - WS_EX_NOACTIVATE removes a window from the taskbar by design, so backgrounded w…
v0.9.159: every verb response now carries bridgeVersion (it only ever reached /health, so no caller could ask which bri…
v0.9.158: start the parking sweep at boot - the 60s session-sanitize retry (and parked-window defense) armed only on th…
v0.9.157: session sanitize - bridge projects are scrubbed from KiCad restore-on-launch (kicad.json system.open_projects…
v0.9.156: geometry-poison prevention (unpark before close verbs, atexit unpark, boot heal of off-screen-stranded window…
v0.9.155 EMERGENCY: ownership ledger - the bridge only parks/bounces/badges windows from process trees it spawned; user…
v0.9.154: overlay badges via AD desktop_taskbar (in-process ITaskbarList3 is a no-op cross-process, pup/fusion lesson);…
v0.9.153: overlay badges survive bridge restarts (rebadge ALL live KiCad windows at boot + on setting flip, not just _b…
v0.9.152: Adom overlay badges on bridge-driven KiCad taskbar buttons (ITaskbarList3, pup pattern) + kicad_get_settings/…
v0.9.151: taskbar icon repair - minimize-parking froze windows into the taskbar before KiCad assigned their icon (blank…
v0.9.150: park = minimize-no-activate from first sighting (hwnd churn during eeschema load reset the fight threshold an…
v0.9.149: fight escalation - a window reasserting its geometry (eeschema mid-load) gets minimized-no-activate after 4 r…
v0.9.148: guardian arms without an hwnd (the vestigial not-hwnd early-return silently disabled ALL post-verb guards whe…
v0.9.147: guardian arms for EVERY spawn verb (was gated on a captured user foreground that can be None) - closes the un…
v0.9.146: parking instrumentation (attempts, last error, sweep ticks, bridge-window count in focusDebug)
v0.9.145: bridge-created windows stay bridge-created across verbs (rebaselining adopted the previous verb's window as t…
v0.9.144: focusDebug introspection in kicad_state (sweep/hook/sentinel liveness, inflight/guard counters, parked/baseli…
v0.9.143: SetWindowPlacement-based parking - SetWindowPos cannot move a MAXIMIZED window (the silent no-op); park demot…
v0.9.142: re-park - KiCad applies saved geometry late in init and moved itself back on-screen after the early park; the…
v0.9.141: 50ms parking sweep (deterministic) - baselines existing windows at verb start, parks anything newer off-scree…
v0.9.140: hook diagnostics (armed + per-event stderr) + SetWinEventHook restype
v0.9.139: parking engages DURING handlers - windows are created before guards arm, so the dispatcher now marks GUI-verb…
v0.9.138: off-screen parking (John's design) - the SHOW hook teleports new KiCad windows to -32000,-32000 before first…
v0.9.137: event-driven focus enforcement (SetWinEventHook on SHOW/FOREGROUND) - during bridge work a KiCad window is su…
v0.9.136: kicad_state.userIdleSeconds - the presence gate for automation (John was actively working when a window-spawn…
v0.9.135: board3d beat waits for the PCB editor to be findable before invoking the 3D viewer (mid-transition race made…
v0.9.134: menu ids resolved LIVE via the plugin's get_menu_ids (10.0.5 renumbered eeschema 20390->20391); demo warm lau…
v0.9.133: #31 root cause - stale discovery files at scale poisoned plugin resolution; dead-pid files are now skipped AN…
v0.9.132: every window-spawning response now declares openedInBackground:true + _foregroundHint (how to foreground: for…
v0.9.131: John's foreground contract - NO foreground without foregroundReason (refused otherwise), every sanctioned for…
v0.9.130: demo beats reordered (design file-opens first, plugin-dependent part beats after) - KiCad starts each process…
v0.9.129: PM plugin bind-wait 15s -> 45s (KiCad starts the PM's embedded Python lazily; a fresh 10.0.5 PM takes 30-45s…
v0.9.128: tier 1 falls through on NO-WINDOW, not just on post-failure - a stale eeschema menu id posts 'successfully' w…
v0.9.127: symbol-editor tier 1 waits up to 15s for the plugin to bind on a fresh PM - on 10.0.5 the in-process plugin p…