{
  "checker": {
    "claims": [
      {
        "claim": "create_project initializes a new KiCAD project",
        "command": "node dist/index.js tools/call {\"tool\": \"create_project\", \"arguments\": {\"name\": \"claimcheck\", \"path\": \"<guest-path>\"}}",
        "evidence": "{\"content\": [{\"type\": \"text\", \"text\": \"Python process for KiCAD scripting is not running\"}], \"isError\": true}",
        "expected": "project files created and tool reports success",
        "input": "{\"tool\": \"create_project\", \"arguments\": {\"name\": \"claimcheck\", \"path\": \"<guest-path>\"}}",
        "kind": "claim",
        "outcome": "Real input did not produce the expected result: Created project: claimcheck",
        "source": "`create_project` - Initialize new KiCAD projects",
        "source_checked": true,
        "source_file": "README.md",
        "verdict": "no"
      }
    ],
    "cycle_checks": [
      {
        "claim": "Scheduled or looping main behavior",
        "command": "",
        "evidence": "Entry points inspected: README.md (no cron, schedule, --once, --now, or webhook text), python/kicad_interface.py and src/*.ts (no scheduler or polling loop). The server is a request-driven stdio MCP server that runs only when a client calls a tool, so there is no product cycle to trigger by hand.",
        "expected": "identify the product trigger",
        "input": "source inspection",
        "kind": "cycle",
        "outcome": "Entry points inspected: README.md (no cron, schedule, --once, --now, or webhook text), python/kicad_interface.py and src/*.ts (no scheduler or polling loop). The server is a request-driven stdio MCP server that runs only when a client calls a tool, so there is no product cycle to trigger by hand.",
        "source": "repository entry points",
        "verdict": "yes"
      }
    ],
    "details": {
      "argv": [
        "node",
        "dist/index.js"
      ],
      "blocker": "MCP tool result did not confirm the expected product output",
      "kind": "mcp",
      "serverInfo": {
        "description": "MCP server for KiCAD PCB design operations",
        "name": "kicad-mcp-server",
        "version": "2.8.2"
      },
      "tool_result": {
        "content": [
          {
            "text": "Python process for KiCAD scripting is not running",
            "type": "text"
          }
        ],
        "isError": true
      },
      "tool_schema_bytes": 242810,
      "tools": [
        "list_tool_categories",
        "get_category_tools",
        "search_tools",
        "create_project",
        "open_project",
        "open_board",
        "reload_board",
        "close_project",
        "save_project",
        "save_board",
        "save_as",
        "is_dirty",
        "discard_or_reload",
        "get_project_info",
        "snapshot_project",
        "set_board_size",
        "set_board_origin",
        "get_board_origin",
        "add_layer",
        "set_active_layer",
        "get_board_info",
        "get_layer_list",
        "add_board_outline",
        "clear_board_outline",
        "replace_board_outline",
        "list_graphics",
        "delete_graphic",
        "update_graphic",
        "add_mounting_hole",
        "add_board_text",
        "add_zone",
        "get_board_extents",
        "get_board_2d_view",
        "import_svg_logo",
        "place_component",
        "move_component",
        "batch_move_components",
        "rotate_component",
        "delete_component",
        "edit_component",
        "set_footprint_type",
        "find_component",
        "get_component_properties",
        "add_component_annotation",
        "group_components",
        "replace_component",
        "get_component_pads",
        "get_pads",
        "get_net_pads",
        "get_component_geometry",
        "get_component_list",
        "get_pad_position",
        "get_ratsnest",
        "estimate_airwire_lengths",
        "check_placement_clearance",
        "move_footprint_text",
        "place_component_array",
        "align_components",
        "check_courtyard_overlaps",
        "suggest_placement",
        "duplicate_component",
        "hierarchical_place",
        "add_net",
        "route_trace",
        "route_arc_trace",
        "add_via",
        "add_copper_pour",
        "delete_trace",
        "query_traces",
        "query_zones",
        "add_gnd_stitching_vias",
        "get_nets_list",
        "modify_trace",
        "create_netclass",
        "set_net_color",
        "route_differential_pair",
        "refill_zones",
        "route_pad_to_pad",
        "copy_routing_pattern",
        "set_design_rules",
        "get_design_rules",
        "run_drc",
        "assign_net_to_class",
        "set_layer_constraints",
        "check_clearance",
        "get_drc_violations",
        "export_gerber",
        "export_pdf",
        "export_svg",
        "export_3d",
        "export_bom",
        "export_netlist",
        "export_position_file",
        "export_vrml",
        "export_gerbers",
        "export_drill",
        "export_ipc2581",
        "export_odb",
        "export_ipcd356",
        "export_gencad",
        "export_pos",
        "export_pcb_pdf",
        "export_pcb_svg",
        "export_pcb_dxf",
        "export_gerber_single",
        "export_3d_cli",
        "export_sch_bom",
        "export_sch_pdf",
        "export_sch_svg",
        "export_sch_dxf",
        "export_sch_hpgl",
        "export_sch_ps",
        "export_sch_python_bom",
        "create_schematic",
        "add_schematic_component",
        "delete_schematic_component",
        "edit_schematic_component",
        "set_schematic_component_property",
        "remove_schematic_component_property",
        "get_schematic_component",
        "add_schematic_wire",
        "add_schematic_net_label",
        "add_no_connect",
        "connect_to_net",
        "get_net_connections",
        "get_wire_connections",
        "get_schematic_pin_locations",
        "connect_passthrough",
        "list_schematic_components",
        "list_schematic_nets",
        "list_schematic_wires",
        "list_schematic_labels",
        "move_schematic_component",
        "rotate_schematic_component",
        "annotate_schematic",
        "delete_schematic_wire",
        "delete_schematic_net_label",
        "move_schematic_net_label",
        "export_schematic_svg",
        "export_schematic_pdf",
        "get_schematic_view",
        "run_erc",
        "generate_netlist",
        "sync_schematic_to_board",
        "backannotate_footprints",
        "create_board_from_schematic",
        "get_schematic_view_region",
        "find_overlapping_elements",
        "get_elements_in_region",
        "find_wires_crossing_symbols",
        "list_floating_labels",
        "find_orphaned_wires",
        "snap_to_grid",
        "lint_offgrid",
        "get_net_at_point",
        "add_schematic_hierarchical_label",
        "list_schematic_texts",
        "add_schematic_text",
        "add_sheet_pin",
        "list_libraries",
        "search_footprints",
        "list_library_footprints",
        "get_footprint_info",
        "list_library_table",
        "remove_library_table_entry",
        "set_library_table_uri",
        "list_symbol_libraries",
        "repair_flat_symbols",
        "search_symbols",
        "list_library_symbols",
        "get_symbol_info",
        "list_symbol_pins",
        "batch_list_symbol_pins",
        "set_symbol_pin_type",
        "find_duplicate_symbols",
        "add_hierarchical_sheet",
        "remove_hierarchical_sheet",
        "set_sheet_property",
        "get_sheet_properties",
        "create_hierarchical_subsheet",
        "set_schematic_property_position",
        "batch_set_schematic_property_positions",
        "autoplace_schematic_fields",
        "lint_schematic_cosmetic",
        "suggest_schematic_declutter",
        "batch_add_components",
        "batch_edit_schematic_components",
        "update_symbol_from_library",
        "add_library_symbol_property",
        "replace_instance_lib_ids",
        "replace_schematic_component",
        "batch_add_no_connects",
        "batch_connect",
        "batch_add_and_connect",
        "download_jlcpcb_database",
        "search_jlcpcb_parts",
        "get_jlcpcb_part",
        "get_jlcpcb_database_stats",
        "suggest_jlcpcb_alternatives",
        "digikey_test_connection",
        "digikey_search_parts",
        "digikey_check_library_availability",
        "search_parts_registry",
        "get_registry_part",
        "download_registry_part",
        "enrich_datasheets",
        "get_datasheet_url",
        "create_footprint",
        "add_footprint_3d_model",
        "import_3d_model",
        "add_component_3d_model",
        "edit_footprint_pad",
        "register_footprint_library",
        "list_footprint_libraries",
        "create_symbol",
        "delete_symbol",
        "list_symbols_in_library",
        "register_symbol_library",
        "add_symbol_property",
        "import_symbol",
        "export_symbol",
        "rename_symbol",
        "get_backend_state",
        "check_kicad_ui",
        "launch_kicad_ui",
        "kicad_gui_tree",
        "kicad_gui_click",
        "kicad_run_action_plugin",
        "kicad_gui_wait_for",
        "kicad_gui_screenshot",
        "kicad_pcb_snapshot",
        "kicad_reload_and_open_plugin",
        "kicad_run_drc",
        "kicad_gui_tree_atspi",
        "kicad_gui_click_atspi",
        "install_gui_driver",
        "autoroute",
        "export_dsn",
        "import_ses",
        "check_freerouting",
        "import_eagle_project",
        "import_pcb",
        "validate_schematic",
        "validate_symbol_library"
      ],
      "working": false
    },
    "evidence_strength": "partly_checked",
    "example_checks": [
      {
        "claim": "TypeScript unit tests of the MCP server pass offline",
        "command": "npm run test:ts",
        "deferred": false,
        "evidence": "2026-10-24 04:42:14,665] [INFO] Router tools registered successfully\n\nstderr | tests-ts/no-stale-tool-references.test.ts > discovery responses do not reference deleted tools > every tool named in a discovery response is actually registered\n[2026-10-24 04:42:14,666] [INFO] Registering router tools\n[2026-10-24 04:42:14,667] [INFO] Router tools registered successfully\n\nstderr | tests-ts/request-correlation.test.ts > Python bridge response correlation > discards a late response and resolves only the matching request\n[2026-10-24 04:42:16,116] [WARN] Discarding stale Python response 1; waiting for 2",
        "expected": "112 tests pass under vitest",
        "input": "npm run test:ts",
        "kind": "example",
        "outcome": "command completed successfully",
        "returncode": 0,
        "source": "package.json scripts test:ts",
        "verdict": "yes"
      },
      {
        "claim": "Python test suite runs offline with the documented pytest command",
        "command": "<guest-path> tests/test_schematic_batch.py -q",
        "deferred": false,
        "evidence": "1-172, 180-181, 204-218, 244-246, 250, 253, 255, 264-267, 277-300, 313-315\npython/utils/symbol_instances.py                   300    232    130      2    17%   53-55, 59-61, 71-75, 83-88, 98-113, 128-138, 147-187, 192-199, 213-223, 227-230, 240-247, 260-261, 273-277, 286-292, 312-345, 363-376, 394-403, 417, 421-422, 444-511\n--------------------------------------------------------------------------------------------\nTOTAL                                            25144  23983   9708     60     4%\nCoverage HTML written to dir htmlcov\nCoverage XML written to file coverage.xml\n18 passed in 11.51s",
        "expected": "tests pass under pytest",
        "input": "pytest tests/test_schematic_batch.py",
        "kind": "example",
        "outcome": "command completed successfully",
        "returncode": 0,
        "source": "package.json scripts test:py",
        "verdict": "yes"
      }
    ],
    "status": "FAIL"
  },
  "deviations": [
    "Used a venv with --system-site-packages instead of the README's bare pip3 install, because Ubuntu PEP 668 blocks system pip.",
    "Probe and claim arguments use name+path, matching the registered create_project schema, not projectName.",
    "npm test:ts/pytest suite: 5 pytest failures tied to kicad-cli behavior on KiCad 9.0.9 vs. the KiCad 10 behavior the tests expect (not fixed; prerequisite mismatch)."
  ],
  "fault_owner": "repo",
  "main_blocker": "src/server.ts and src/kicad-server.ts callKicadScript reject calls while the Python worker is still starting (about 1.6 to 3 s after launch) instead of waiting or queueing. A call issued with no delay therefore fails.",
  "operation": "create_project MCP tool via node dist/index.js (README Installation + MCP stdio usage)",
  "operation_scope": "Node MCP server at pinned commit cbb59a6 started with KICAD_PYTHON=<guest-path>; probe and claim call create_project(name, path=<guest-path>).",
  "outcome": "blocked",
  "plain_failure": "The checker's replay of the saved MCP probe and README claim fails. The product works when a call arrives after the worker is READY (manual test with a 3 s delay created files), but the checker validation still reports problems.",
  "steps": [
    "Installed Node 20 (NodeSource setup_20.x from README) and python3-pip/python3-venv via apt.",
    "Installed KiCad 9.0.9 from the kicad 9.0 PPA per README; README asks for 9.0+.",
    "Created venv <guest-path> with --system-site-packages and installed requirements.txt and requirements-dev.txt (PEP 668 blocked plain pip3).",
    "npm install and npm run build succeeded (dist/index.js produced).",
    "Started server with node dist/index.js; initialize and tools/list succeeded (serverInfo kicad-mcp-server 2.8.2).",
    "Manual create_project calls succeeded once the Python worker was ready: Created project: timing3 with .kicad_pro/.kicad_pcb/.kicad_sch/.kicad_prl written.",
    "Timing test: tools/call sent after 0 s and 1 s delay failed with 'Python process for KiCAD scripting is not running'; 3 s delay succeeded.",
    "Checker replay: probe and claim both returned 'Python process for KiCAD scripting is not running' (isError true), because the checker calls tools/call immediately after initialize."
  ],
  "stuck_step": "Checker MCP replay of create_project (probe.json and claims.json): tools/call issued immediately after initialize returns 'Python process for KiCAD scripting is not running'.",
  "suggested_fix": "Make callKicadScript wait for the Python worker READY signal (or queue calls) instead of rejecting during startup, or have the server not answer tools/list until the worker is ready. No checker or probe change has been made to hide this."
}
