{
  "target": "ConfRoomROG",
  "started": "2026-09-07T18:30:08.798989+00:00",
  "elapsed_s": 401.7,
  "totals": {
    "pass": 74,
    "fail": 1,
    "skip": 15
  },
  "coverage_gap": [],
  "failures": [
    "export_part"
  ],
  "results": {
    "adom_library_heal": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"KiCad already loads this library; nothing to prune.\", \"_timeoutHint\": \"ab waits up to 130s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \\u2014 the work usually keeps running on the bridge. Poll `kicad_status` until it reports done.\", \"_userFocusRestored\": false, \"bridgeVersion\": \"0.9.342\", \"droppe"
    },
    "adom_library_status": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_timeoutHint\": \"ab waits up to 130s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \\u2014 the work usually keeps running on the bridge. Poll `kicad_status` until it reports done.\", \"bridgeDefaultPath\": \"C:/Users/john/Documents/KiCad/10.0/symbols/Adom.kicad_sym\", \"bridgeDefaultSymbols\": 14, \"bridgeVersion\": \""
    },
    "bridge_status": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"If alive=0 but you expect a running KiCad, the adom_bridge.py plugin isn't deployed at its USER_SITE location. Call kicad_install_plugin to force a fresh deploy (auto-install runs once per bridge boot; the explicit verb bypasses the cache). Otherwise the file is stale \\u2014 pass pruneStale:true to clean those up. v1.7.6+ supports multiple instances per exe (one row per PID).\", \"_timeou"
    },
    "check_for_updates": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"Run kicad_upgrade '{}' to install the latest (downloads the OFFICIAL downloads.kicad.org installer + silent /S install \\u2014 NOT winget, which lags). Pass {\\\"version\\\":\\\"X.Y.Z\\\"} to pin a specific build.\", \"_timeoutHint\": \"ab waits up to 130s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \\u2014 th"
    },
    "describe": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"Full verb catalog for the KiCad bridge \\u2014 each entry carries hint/related/pitfalls. Every verb ALSO returns its own rich _hint when called; that's what to read in practice. For host-app readiness use kicad_readiness; for 'what EDA tools do I have' across bridges use Bridge's bridge_readiness.\", \"_timeoutHint\": \"ab waits up to 130s for this verb before the request times out. If it's "
    },
    "diagnostics": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"Read-only bridge self-diagnostics \\u2014 use this INSTEAD of Bridge's approval-gated run_script/shell when debugging the bridge. `environment` shows what env the BRIDGE sees (Bridge strips it \\u2014 a missing LOCALAPPDATA here explains a per-user KiCad going undetected). `kicadSearch.bases` shows every path the detector scans and what it finds. `processes` lists running KiCad exes. Pass"
    },
    "errors": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"KiCad has NO log file and in GUI mode its errors go to DIALOGS, not stderr \\u2014 so this is where a GUI failure reason lives. Read-only: nothing is clicked or raised. THREE channels, use all three: (1) this verb; (2) kicad_log_tail for what bypasses wxLog \\u2014 crashes, asserts, stdio; (3) kicad_screenshot_all when the first two say nothing and the result is still wrong \\u2014 the pix"
    },
    "fix_keyboard": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_timeoutHint\": \"ab waits up to 130s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \\u2014 the work usually keeps running on the bridge. Poll `kicad_status` until it reports done.\", \"_userFocusRestored\": false, \"bridgeVersion\": \"0.9.342\", \"durationMs\": 835, \"error\": \"\", \"kicadVersionUsed\": \"10.0\", \"output\": \""
    },
    "get_settings": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"kicad_set_settings {\\\"overlayBadges\\\": false} to change; changes apply immediately (overlay badges are stamped/cleared on live windows).\", \"_timeoutHint\": \"ab waits up to 130s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \\u2014 the work usually keeps running on the bridge. Poll `kicad_status` unti"
    },
    "ipc_api": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"IPC API server is disabled. Pass enable:true|false to change it (KiCad must then be restarted).\", \"_timeoutHint\": \"ab waits up to 130s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \\u2014 the work usually keeps running on the bridge. Poll `kicad_status` until it reports done.\", \"bridgeVersion\": \"0."
    },
    "list_design_rules": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"Pick a row and call kicad_set_design_rules {\\\"fab\\\": <slug>, \\\"layers\\\": <n>, \\\"boardPath\\\": <.kicad_pcb>}. adom-instapcb is the house baseline. Values come from the wiki page at call time, so do not copy them into code.\", \"_timeoutHint\": \"ab waits up to 130s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as f"
    },
    "list_footprints": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"No library named 'Resistor_SMD' on this machine. Libraries present: none. Install one with kicad_install_footprint, which creates Adom.pretty on first use.\", \"_timeoutHint\": \"ab waits up to 130s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \\u2014 the work usually keeps running on the bridge. Poll "
    },
    "list_symbols": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"Use one of `symbols` as symbolName for kicad_show_library; the file name is often an MPN and not the symbol name (wiki #62).\", \"_timeoutHint\": \"ab waits up to 130s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \\u2014 the work usually keeps running on the bridge. Poll `kicad_status` until it reports"
    },
    "list_versions": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"Pass kicadVersion to any kicad_open_* command to pick a specific version (e.g. {\\\"kicadVersion\\\":\\\"10.0\\\"}). Omit to use the newest (10.0). v1.7.4+: each entry now includes pythonVersion, pluginDir, adomPluginInstalled, ipcApiAvailable, binaries{}, libraryTablePaths{} \\u2014 see the integration plan.\", \"_timeoutHint\": \"ab waits up to 130s for this verb before the request times out. If i"
    },
    "log_tail": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"Carry nextOffset into the next call and you get ONLY what happened since \\u2014 tail, act, tail again, and the second read is your action's consequences. errorsOnly:true filters to error/warning.\", \"_timeoutHint\": \"ab waits up to 130s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \\u2014 the work us"
    },
    "pcm_list": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_timeoutHint\": \"ab waits up to 130s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \\u2014 the work usually keeps running on the bridge. Poll `kicad_status` until it reports done.\", \"_userFocusRestored\": false, \"bridgeVersion\": \"0.9.342\", \"count\": 0, \"durationMs\": 58, \"error\": \"\", \"kicadVersion\": \"10.0\", \"kic"
    },
    "plugin_diagnose": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"One-call answer to 'why is the reverse bridge not loading'. importedByKiCad is the key field: a __pycache__ entry beside the loader is proof KiCad imported it. If deployed but never imported, the plugin-directory scan is not happening in this build. If imported but not alive, loaderLog names the cause. Wiki issue #34.\", \"_timeoutHint\": \"ab waits up to 130s for this verb before the reque"
    },
    "progress": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"Scoped to YOU: `active` holds only the phases this caller started (wiki #46 - another caller's steps used to appear in your response). Pass all:true for every in-flight phase on the box; each frame carries `caller` regardless. Poll this while a long verb runs (1s is fine). `active` holds one progress block per in-flight phase: stepLabel is the human line for a status bar, percent/etaSec"
    },
    "readiness": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"Read-only host-app detection (no install, no plugin load, no subprocess). Bridge won't silently auto-install KiCad as a dependency/prewarm (v1.9.47), but the agent still installs it FOR the user on request \\u2014 never hand the user a manual download. KiCad is installed and ready.\", \"_timeoutHint\": \"ab waits up to 130s for this verb before the request times out. If it's a long operation"
    },
    "status": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"If alive=0 but you expect a running KiCad, the adom_bridge.py plugin isn't deployed at its USER_SITE location. Call kicad_install_plugin to force a fresh deploy (auto-install runs once per bridge boot; the explicit verb bypasses the cache). Otherwise the file is stale \\u2014 pass pruneStale:true to clean those up. v1.7.6+ supports multiple instances per exe (one row per PID).\", \"_timeou"
    },
    "uninstall": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"Bridge-created artifacts only \\u2014 KiCad itself, user projects, and other bridges are untouched. Idempotent: safe to re-run. A running KiCad may hold the plugin's .pyc open; re-run after KiCad exits if anything failed. Bridge removes its own bridges-cache during the cascade.\", \"_timeoutHint\": \"ab waits up to 130s for this verb before the request times out. If it's a long operation (cl"
    },
    "upgrade": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"Read tokenElevationTypeMeaning + uacEnableLUA together: EnableLUA=0 means UAC is disabled machine-wide, so an admin account always runs with a full token and NO UAC prompt ever appears \\u2014 IsUserAnAdmin=True without anyone clicking anything. tokenElevated=1 with an rc=666660 install failure means elevation is NOT the cause (look at SmartScreen/AV or the installer's silent flag instea"
    },
    "verb_times": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"Per-verb count/p50/p90/max/failures from this machine's append-only run log, sorted by p90 descending. Sourced from every dispatch, so the numbers converge just by the bridge being used - no measurement pass. The rolling estimate window is separate; kicad_progress and the progress blocks draw from that.\", \"_timeoutHint\": \"ab waits up to 130s for this verb before the request times out. I"
    },
    "analyze_connections": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"Heuristic overview from the netlist alone. suspectedUnconnected lists nets with a single node \\u2014 usually a missed wire, sometimes an intentional test point or no-connect; kicad_run_erc is the authoritative check and knows about no-connect flags.\", \"_timeoutHint\": \"ab waits up to 130s for this verb before the request times out. If it's a long operation (cloud open / download / export"
    },
    "export_bom_csv": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_timeoutHint\": \"ab waits up to 130s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \\u2014 the work usually keeps running on the bridge. Poll `kicad_status` until it reports done.\", \"bridgeVersion\": \"0.9.342\", \"data\": {\"files\": [\"rp2040-breakout.csv\"], \"output_path\": \"C:/Users/john/Documents/adom-kicad-verbte"
    },
    "export_gerber": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_timeoutHint\": \"ab waits up to 210s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \\u2014 the work usually keeps running on the bridge. Poll `kicad_status` until it reports done.\", \"bridgeVersion\": \"0.9.342\", \"data\": {\"files\": [\"rp2040-breakout-B_Adhesive.gba\", \"rp2040-breakout-B_Courtyard.gbr\", \"rp2040-brea"
    },
    "export_gerbers": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_timeoutHint\": \"ab waits up to 130s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \\u2014 the work usually keeps running on the bridge. Poll `kicad_status` until it reports done.\", \"bridgeVersion\": \"0.9.342\", \"data\": {\"files\": [\"rp2040-breakout-B_Adhesive.gba\", \"rp2040-breakout-B_Courtyard.gbr\", \"rp2040-brea"
    },
    "export_molecule": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_foregroundHint\": \"Window opened in the BACKGROUND - the user's foreground was not touched. To show it to the user: re-call with foreground:true AND foregroundReason:'<why the user needs to see this>'. The bridge captions the reason via an ab toast for 3 seconds, then brings the window forward. Foreground without a reason is refused.\", \"_hint\": \"Desktop half of the molecule pipeline is done. pul"
    },
    "export_pdf": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_timeoutHint\": \"ab waits up to 180s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \\u2014 the work usually keeps running on the bridge. Poll `kicad_status` until it reports done.\", \"bridgeVersion\": \"0.9.342\", \"data\": {\"files\": [\"rp2040-breakout.pdf\"], \"output_path\": \"C:/Users/john/Documents/adom-kicad-verbte"
    },
    "export_step": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_timeoutHint\": \"ab waits up to 300s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \\u2014 the work usually keeps running on the bridge. Poll `kicad_status` until it reports done.\", \"bridgeVersion\": \"0.9.342\", \"data\": {\"files\": [\"rp2040-breakout.step\"], \"output_path\": \"C:/Users/john/Documents/adom-kicad-verbt"
    },
    "export_svg": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_timeoutHint\": \"ab waits up to 180s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \\u2014 the work usually keeps running on the bridge. Poll `kicad_status` until it reports done.\", \"bridgeVersion\": \"0.9.342\", \"data\": {\"files\": [\"rp2040-breakout.svg\"], \"output_path\": \"C:/Users/john/Documents/adom-kicad-verbte"
    },
    "extract_netlist": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"Read-only. For one net use kicad_trace_net; for one component use kicad_find_connections \\u2014 both re-derive from the same export.\", \"_timeoutHint\": \"ab waits up to 130s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \\u2014 the work usually keeps running on the bridge. Poll `kicad_status` until it"
    },
    "find_connections": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"Read-only. Pins absent here are not in any net (check analyze_connections.unconnected).\", \"_timeoutHint\": \"ab waits up to 130s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \\u2014 the work usually keeps running on the bridge. Poll `kicad_status` until it reports done.\", \"_userFocusRestored\": false,"
    },
    "format_upgrade": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"\\u2705 kicad-cli pcb upgrade completed. File(s) rewritten to current KiCad format. Any open KiCad GUI windows with this file loaded should be closed + reopened \\u2014 they have the OLD in-memory state. Re-run kicad_lint_library to confirm the post-upgrade file is clean.\", \"_timeoutHint\": \"ab waits up to 180s for this verb before the request times out. If it's a long operation (cloud ope"
    },
    "lint_board": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"\\u274c 59 DRC error(s) + 9 warning(s). Top error types: clearance, copper_edge_clearance, solder_mask_bridge. DO NOT proceed to fabrication. Open kicad_open_board and resolve these in the PCB Editor, OR fix the underlying schematic if these are schematic-parity errors (e.g. nets connected on the schematic but unrouted on the board). Re-run kicad_lint_board after fixing to confirm clean."
    },
    "lint_library": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"\\u2705 KiCad's own parser loads 14 symbol(s) from 1 file(s) (kicadParser); the bridge's structural check counts 14 symbol(s) + 0 footprint(s), format version(s) [20231120]. Safe to install via kicad_install_library / kicad_install_symbol / kicad_install_footprint.\", \"_timeoutHint\": \"ab waits up to 130s for this verb before the request times out. If it's a long operation (cloud open / do"
    },
    "lint_schematic": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"\\u2705 ERC clean. Safe to open kicad_open_schematic or move on to PCB layout.\", \"_timeoutHint\": \"ab waits up to 130s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \\u2014 the work usually keeps running on the bridge. Poll `kicad_status` until it reports done.\", \"bridgeVersion\": \"0.9.342\", \"data\": {\""
    },
    "run_drc": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_timeoutHint\": \"ab waits up to 300s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \\u2014 the work usually keeps running on the bridge. Poll `kicad_status` until it reports done.\", \"bridgeVersion\": \"0.9.342\", \"data\": {\"source_file\": \"C:/Users/john/Documents/adom-kicad-verbtest/rp2040-breakout.kicad_pcb\", \"su"
    },
    "run_erc": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"ERC passed cleanly \\u2014 safe to open this schematic in eeschema for further editing.\", \"_timeoutHint\": \"ab waits up to 300s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \\u2014 the work usually keeps running on the bridge. Poll `kicad_status` until it reports done.\", \"bridgeVersion\": \"0.9.342\", \""
    },
    "trace_net": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"Read-only trace from the schematic netlist.\", \"_timeoutHint\": \"ab waits up to 130s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \\u2014 the work usually keeps running on the bridge. Poll `kicad_status` until it reports done.\", \"_userFocusRestored\": false, \"bridgeVersion\": \"0.9.342\", \"code\": \"1\", \"d"
    },
    "launch": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_foregroundHint\": \"Window opened in the BACKGROUND - the user's foreground was not touched. To show it to the user: re-call with foreground:true AND foregroundReason:'<why the user needs to see this>'. The bridge captions the reason via an ab toast for 3 seconds, then brings the window forward. Foreground without a reason is refused.\", \"_hint\": \"Idempotent no-op: KiCad was already up. Use kicad_"
    },
    "show_project": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_foregroundHint\": \"Window opened in the BACKGROUND - the user's foreground was not touched. To show it to the user: re-call with foreground:true AND foregroundReason:'<why the user needs to see this>'. The bridge captions the reason via an ab toast for 3 seconds, then brings the window forward. Foreground without a reason is refused.\", \"_hint\": \"Idempotent no-op: KiCad was already up. Use kicad_"
    },
    "open_board": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_foregroundHint\": \"Window opened in the BACKGROUND - the user's foreground was not touched. To show it to the user: re-call with foreground:true AND foregroundReason:'<why the user needs to see this>'. The bridge captions the reason via an ab toast for 3 seconds, then brings the window forward. Foreground without a reason is refused.\", \"_hint\": \"WARNING: KiCad may show modal dialogs (save prompt"
    },
    "open_schematic": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_foregroundHint\": \"Window opened in the BACKGROUND - the user's foreground was not touched. To show it to the user: re-call with foreground:true AND foregroundReason:'<why the user needs to see this>'. The bridge captions the reason via an ab toast for 3 seconds, then brings the window forward. Foreground without a reason is refused.\", \"_hint\": \"WARNING: KiCad may show modal dialogs (save prompt"
    },
    "open_symbol_editor": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_foreground\": {\"editorInFrontAtEnd\": false, \"restored\": false, \"topAfter\": 16188140, \"userTitleBefore\": \"117440516 - RustDesk\", \"userWindowBefore\": 16188140, \"why\": \"the new frame did not come to the top; nothing to restore\"}, \"_foregroundHint\": \"Window opened in the BACKGROUND - the user's foreground was not touched. To show it to the user: re-call with foreground:true AND foregroundReason:'<wh"
    },
    "show_schematic": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_foregroundHint\": \"Window opened in the BACKGROUND - the user's foreground was not touched. To show it to the user: re-call with foreground:true AND foregroundReason:'<why the user needs to see this>'. The bridge captions the reason via an ab toast for 3 seconds, then brings the window forward. Foreground without a reason is refused.\", \"_hint\": \"GUI launched. For unfamiliar files (ones you didn'"
    },
    "show_2d_board": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_autoDialogs\": {\"count\": 1, \"dialogs\": [{\"action\": \"clicked-button\", \"benign\": false, \"body\": \"Schematic 'C:\\\\Users\\\\john\\\\Documents\\\\adom-kicad-verbtest\\\\rp2040-breakout.kicad_sch' is  already open by 'john' at 'CONFROOMROG'.  Interleaved saves may produce very unexpected results.\", \"screenshot\": \"C:/Users/john/AppData/Local/Temp/adom-bridge-shots/window-142712-1788805607873.png\", \"title\": \"Fil"
    },
    "show_symbol": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_foregroundHint\": \"Window opened in the BACKGROUND - the user's foreground was not touched. To show it to the user: re-call with foreground:true AND foregroundReason:'<why the user needs to see this>'. The bridge captions the reason via an ab toast for 3 seconds, then brings the window forward. Foreground without a reason is refused.\", \"_hint\": \"Returned the existing editor instead of running th"
    },
    "show_footprint": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_autoDialogs\": {\"count\": 1, \"dialogs\": [{\"action\": \"clicked-button\", \"benign\": false, \"body\": \"PCB 'rp2040-breakout.kicad_pcb' is already open by 'john' at 'CONFROOMROG'.  Interleaved saves may produce very unexpected results.\", \"screenshot\": \"C:/Users/john/AppData/Local/Temp/adom-bridge-shots/window-339460-1788805619831.png\", \"title\": \"File Open Warning\"}], \"hadError\": true}, \"_dialogHint\": \"\\u"
    },
    "show_3d_chip": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_foregroundHint\": \"Window opened in the BACKGROUND - the user's foreground was not touched. To show it to the user: re-call with foreground:true AND foregroundReason:'<why the user needs to see this>'. The bridge captions the reason via an ab toast for 3 seconds, then brings the window forward. Foreground without a reason is refused.\", \"_timeoutHint\": \"ab waits up to 130s for this verb before th"
    },
    "show_3d_board": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_foregroundHint\": \"Window opened in the BACKGROUND - the user's foreground was not touched. To show it to the user: re-call with foreground:true AND foregroundReason:'<why the user needs to see this>'. The bridge captions the reason via an ab toast for 3 seconds, then brings the window forward. Foreground without a reason is refused.\", \"_timeoutHint\": \"ab waits up to 130s for this verb before th"
    },
    "show_library": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_foregroundHint\": \"Window opened in the BACKGROUND - the user's foreground was not touched. To show it to the user: re-call with foreground:true AND foregroundReason:'<why the user needs to see this>'. The bridge captions the reason via an ab toast for 3 seconds, then brings the window forward. Foreground without a reason is refused.\", \"_hint\": \"Library browse mode: the tree is filtered to the l"
    },
    "state": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"focusEvents is the focus sentinel log: a self-raise (bounced) entry is a PREVENTED foreground steal; user-foregrounded means the human chose it. The full state of the union: every KiCad-owned window is in shots[] as inline base64 PNG (render them all \\u2014 one window is NOT the app). modalDialogs non-empty means something is blocking; editors.list is the plugin's logical inventory (nul"
    },
    "open_footprint_editor": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_foregroundHint\": \"Window opened in the BACKGROUND - the user's foreground was not touched. To show it to the user: re-call with foreground:true AND foregroundReason:'<why the user needs to see this>'. The bridge captions the reason via an ab toast for 3 seconds, then brings the window forward. Foreground without a reason is refused.\", \"_hint\": \"WARNING: KiCad may show modal dialogs (save prompt"
    },
    "open_3d_viewer": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_foregroundHint\": \"Window opened in the BACKGROUND - the user's foreground was not touched. To show it to the user: re-call with foreground:true AND foregroundReason:'<why the user needs to see this>'. The bridge captions the reason via an ab toast for 3 seconds, then brings the window forward. Foreground without a reason is refused.\", \"_hint\": \"WARNING: KiCad may show modal dialogs (save prompt"
    },
    "open_editors": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"Cross-process inventory: each KiCad GUI exe's plugin contributes its own wx top-level frames. If totalEditors=0 but the user has KiCad windows open, the plugins likely haven't deployed yet OR KiCad was running before v1.7.5 plugin install (those instances need a restart to load the bridge). Call kicad_bridge_status to confirm plugins are alive.\", \"_timeoutHint\": \"ab waits up to 130s for"
    },
    "window_info": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"If hasModalDialogs is true: use kicad_screenshot_all to capture all windows (dialogs shown in screenshots). Or desktop_screenshot_window with specific dialog hwnd. Pull screenshots to Docker with pull_file. Read dialog text to decide: force close, dismiss, or retry.\", \"_timeoutHint\": \"ab waits up to 130s for this verb before the request times out. If it's a long operation (cloud open / "
    },
    "screenshot_all": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"Screenshots saved on Windows. Use pull_file to get them to Docker: pull_file '{\\\"filePaths\\\":[...],\\\"saveTo\\\":\\\"/tmp\\\"}'\", \"_timeoutHint\": \"ab waits up to 130s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \\u2014 the work usually keeps running on the bridge. Poll `kicad_status` until it reports don"
    },
    "dismiss_dialogs": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"Expired 0 dialog(s). Now retry your open/screenshot verb. Benign-only by default; pass {\\\"all\\\":true} to clear every dialog. The OpenGL notice on a GPU-less host is auto-expired by window_info too.\", \"_timeoutHint\": \"ab waits up to 130s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \\u2014 the work "
    },
    "send_key": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"Delivered without touching the user's focus. If KiCad ignored it, the control may need real input \\u2014 prefer the plugin WM_COMMAND pathway; only as a last resort warn the user and retry with allowForeground:true.\", \"_timeoutHint\": \"ab waits up to 130s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failur"
    },
    "click": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"Clicked without moving the user's mouse or taking focus. If the canvas ignored it, that control may need real input \\u2014 warn the user you need the screen for ~5s, then retry allowForeground:true.\", \"_timeoutHint\": \"ab waits up to 130s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \\u2014 the work"
    },
    "bridge_call": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_timeoutHint\": \"ab waits up to 130s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \\u2014 the work usually keeps running on the bridge. Poll `kicad_status` until it reports done.\", \"durationMs\": 120, \"error\": \"\", \"exeName\": \"pcbnew\", \"output\": \"\", \"pid\": 12528, \"pluginAutoInstall\": {\"_hint\": \"Plugin already "
    },
    "export_part": {
      "result": "FAIL",
      "elapsed": null,
      "response_head": "{\"_hint\": \"Each file is a standalone single-entry library: the .kicad_sym holds ONLY this symbol (open with kicad_show_symbol after installing, or any KiCad), the .pretty holds ONLY this footprint, the model file is the bare 3D body. The reverse of install \\u2014 proves per-asset round-trip. Pull them with ab pull_file.\", \"_timeoutHint\": \"ab waits up to 130s for this verb before the request times "
    },
    "install_footprint": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_foregroundHint\": \"Window opened in the BACKGROUND - the user's foreground was not touched. To show it to the user: re-call with foreground:true AND foregroundReason:'<why the user needs to see this>'. The bridge captions the reason via an ab toast for 3 seconds, then brings the window forward. Foreground without a reason is refused.\", \"_hint\": \"WARNING: KiCad may show modal dialogs (save prompt"
    },
    "install_library": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"NOTE: this file holds 1 symbol(s) (ADOM_VERBTEST), so KiCad now has a whole library named 'AdomVerbTest' containing only that part, and the shared Adom library was NOT touched. If you meant 'put this part into the Adom library', the verb is kicad_install_symbol '{\\\"filePath\\\":\\\"C:/Users/john/Documents/adom-kicad-verbtest/AdomVerbTest.kicad_sym\\\"}' (then kicad_show_library Adom). Both ar"
    },
    "install_plugin": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"force-reinstall complete. Future kicad_* commands will show this fresh install state in their pluginAutoInstall fields. If KiCad was running during install, ask the user to restart those processes \\u2014 the in-memory Python interpreter still has the OLD plugin loaded until next launch.\", \"_timeoutHint\": \"ab waits up to 130s for this verb before the request times out. If it's a long ope"
    },
    "install_symbol": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_foregroundHint\": \"Window opened in the BACKGROUND - the user's foreground was not touched. To show it to the user: re-call with foreground:true AND foregroundReason:'<why the user needs to see this>'. The bridge captions the reason via an ab toast for 3 seconds, then brings the window forward. Foreground without a reason is refused.\", \"_hint\": \"WARNING: KiCad may show modal dialogs (save prompt"
    },
    "make_part_project": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_hint\": \"Project surfaces now have something real to show: kicad_show_project {filePath: projectFile}, kicad_show_schematic {filePath: schematicFile}, kicad_show_2d_board / kicad_show_3d_board {filePath: boardFile}. The footprint keeps its (model ...) reference, so the 3D board renders the actual part. Regenerating overwrites in place.\", \"_next\": [\"kicad_show_project\", \"kicad_show_schematic\", \"k"
    },
    "place_footprint": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_foregroundHint\": \"Window opened in the BACKGROUND - the user's foreground was not touched. To show it to the user: re-call with foreground:true AND foregroundReason:'<why the user needs to see this>'. The bridge captions the reason via an ab toast for 3 seconds, then brings the window forward. Foreground without a reason is refused.\", \"_timeoutHint\": \"ab waits up to 130s for this verb before th"
    },
    "demo": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_foregroundHint\": \"Window opened in the BACKGROUND - the user's foreground was not touched. To show it to the user: re-call with foreground:true AND foregroundReason:'<why the user needs to see this>'. The bridge captions the reason via an ab toast for 3 seconds, then brings the window forward. Foreground without a reason is refused.\", \"_hint\": \"STAGED + RESUMABLE, same contract as fusion_demo: "
    },
    "close": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_timeoutHint\": \"ab waits up to 130s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \\u2014 the work usually keeps running on the bridge. Poll `kicad_status` until it reports done.\", \"_userFocusRestored\": false, \"bridgeVersion\": \"0.9.342\", \"data\": {\"forceKilled\": [\"eeschema.exe\", \"pcbnew.exe\", \"kicad.exe\"]}, \""
    },
    "close_3d_viewer": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_timeoutHint\": \"ab waits up to 130s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \\u2014 the work usually keeps running on the bridge. Poll `kicad_status` until it reports done.\", \"_userFocusRestored\": false, \"bridgeVersion\": \"0.9.342\", \"durationMs\": 65, \"error\": \"\", \"kicadVersionUsed\": \"10.0\", \"output\": \"3"
    },
    "close_footprint_editor": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_timeoutHint\": \"ab waits up to 130s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \\u2014 the work usually keeps running on the bridge. Poll `kicad_status` until it reports done.\", \"_userFocusRestored\": false, \"bridgeVersion\": \"0.9.342\", \"durationMs\": 59, \"error\": \"\", \"kicadVersionUsed\": \"10.0\", \"output\": \"F"
    },
    "close_symbol_editor": {
      "result": "PASS",
      "elapsed": null,
      "response_head": "{\"_timeoutHint\": \"ab waits up to 130s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \\u2014 the work usually keeps running on the bridge. Poll `kicad_status` until it reports done.\", \"_userFocusRestored\": false, \"bridgeVersion\": \"0.9.342\", \"durationMs\": 58, \"error\": \"\", \"kicadVersionUsed\": \"10.0\", \"output\": \"S"
    },
    "_cleanup": {
      "result": "PASS",
      "response_head": "{\"_hint\": \"Suite residue only \\u2014 plugin, Adom libraries, KiCad and user files untouched. Run after every verb-suite pass; idempotent.\", \"_timeoutHint\": \"ab waits up to 130s for this verb before the request times out. If it's a long operation (cloud open / download / export), DON'T treat a timeout as failure \\u2014 the work usually keeps running on the bridge. Poll `kicad_status` until it repor"
    },
    "routing_state": {
      "result": "SKIP",
      "reason": "Covered by tests/test_routing_ipc.py and demo/routing/run_demo.py; requires a dedicated unrouted IPC board"
    },
    "route_net": {
      "result": "SKIP",
      "reason": "Covered by tests/test_routing_ipc.py and demo/routing/run_demo.py; requires a dedicated unrouted IPC board"
    },
    "remove_route": {
      "result": "SKIP",
      "reason": "Covered by tests/test_routing_ipc.py and demo/routing/run_demo.py; requires a dedicated unrouted IPC board"
    },
    "routing_validate": {
      "result": "SKIP",
      "reason": "Covered by tests/test_routing_ipc.py and demo/routing/run_demo.py; requires a dedicated unrouted IPC board"
    },
    "board_pads": {
      "result": "SKIP",
      "reason": "Covered by tests/test_routing_ipc.py and demo/routing/run_demo.py; requires a dedicated unrouted IPC board"
    },
    "add_track": {
      "result": "SKIP",
      "reason": "Covered by tests/test_routing_ipc.py and demo/routing/run_demo.py; requires a dedicated unrouted IPC board"
    },
    "add_via": {
      "result": "SKIP",
      "reason": "Covered by tests/test_routing_ipc.py and demo/routing/run_demo.py; requires a dedicated unrouted IPC board"
    },
    "route": {
      "result": "SKIP",
      "reason": "Covered by tests/test_routing_ipc.py and demo/routing/run_demo.py; requires a dedicated unrouted IPC board"
    },
    "install_library_bundle": {
      "result": "SKIP",
      "reason": "needs a Cloud Library bundle zip staged on the box; covered by the install_library/install_symbol/install_footprint trio it wraps"
    },
    "pcm_install": {
      "result": "SKIP",
      "reason": "writes into %KICAD_3RD_PARTY% and installed_packages.json (a real PCM package download); run by hand when touching handlers/pcm.py"
    },
    "pcm_uninstall": {
      "result": "SKIP",
      "reason": "pair of pcm_install; same reason"
    },
    "rescan_libraries": {
      "result": "SKIP",
      "reason": "a full KiCad restart (~150 s, #51); exercised implicitly by the install verbs' staleEditorOpen path"
    },
    "set_design_rules": {
      "result": "SKIP",
      "reason": "rewrites the board's design rules from the wiki; run by hand on a copy when touching handlers/design_rules.py"
    },
    "set_settings": {
      "result": "SKIP",
      "reason": "mutates the user's bridge settings (overlay badges); get_settings covers the read side"
    },
    "enable_software_opengl": {
      "result": "SKIP",
      "reason": "mutates the user's KiCad bin/ (mesa deploy) \u2014 only for GPU-less VMs; run manually on ADOMBASELINE when testing that path"
    }
  },
  "foreground_violations": [],
  "foreground_notes": []
}