v2.6.0
A minor bump: 10 new tools, a breaking change to how schematic tools report an unparseable sheet, and a fix for a bug that made deleting anything from a board break the session.
Deleting from a board no longer kills the session
This is the one to know about. delete_component worked exactly once — the next board operation, even a pure read like get_component_list, failed with a SwigPyObject error, and the only way back was close_project then open_project. Every delete cost a full reload.
The cause was an ownership bug rather than a lifetime one. KiCad's own SWIG wrapper documents it:
def Remove(self, item):
"""Remove a BOARD_ITEM ... set the thisdown flag so that the python
wrapper owns the C++ BOARD_ITEM"""
self.RemoveNative(item)
if (not IsActionRunning()):
item.thisown = 1 # Python now owns the C++ objectRemove() is for detaching an item you intend to keep or re-add. Six handlers used it to delete and then dropped the reference, so the interpreter ran the C++ destructor on an object KiCad still pointed at. Reproduced against a real KiCad 10.0 install, the damage is process-wide — SWIG's type registry gets corrupted, so even pcbnew.FootprintLoad stops working — and on some builds the process segfaults outright.
delete_component was only one of six affected call sites. Also fixed: delete_trace (all three deletion paths), clear_board_outline, and delete_graphic. If you have seen odd behaviour after deleting traces or a board outline, that was this.
Thanks to @Dewieinns, whose instrumented trace made it findable: the two errors named different methods, and GetPosition being a footprint method rather than a board method is what pointed at child proxies instead of the board itself.
10 new tools
import_pcb— convert PADS, Altium, Eagle, CADSTAR, Fabmaster, P-CAD, SolidWorks PCB, or a binary Cadence Allegro.brdvia KiCad 10's native importer. Binary Allegro needsformat: "auto"; there is no"allegro"literal in the CLI enum.- Hierarchical schematics —
remove_hierarchical_sheet,set_sheet_property,get_sheet_properties, andhierarchical_placefor arranging footprints by schematic hierarchy. - Schematic lint and repair —
lint_offgridfinds and safely snaps off-grid geometry (a single off-grid endpoint can poison junction placement for a whole sheet, since KiCad's connection grid is fixed at 50 mil and matching is exact);repair_flat_symbolsfixes SnapEDA/SamacSys symbols that crash kicad-skip;lint_schematic_cosmetictidies pin names and label orientation. set_board_origin/get_board_originfor the auxiliary and grid origins.
All from @rossvonfange, who split a 6000-line PR into four reviewable ones on request — and two of the three things raised in review came back reworked rather than re-argued.
Your .kicad_pro net classes stop disappearing
In a long-lived backend, pcbnew reuses a stale in-memory project model: LoadBoard does not re-read a hand-edited .kicad_pro, and the next save serialized that stale model over your file, reverting custom net classes and netclass_patterns to Default-only. Board saves are now guarded, and opening a project no longer rewrites the file at all — it is a read.
Breaking: schematic tools fail loudly on an unparseable sheet
Tools that previously returned partial or empty results now return a structured error:
{
"success": false,
"error": "schematic_load_failed",
"flatSymbols": ["LIB:PART"],
"message": "Schematic load failed for ...: embedded flat lib symbols [...]"
}Affected: find_orphaned_wires, hierarchical net traversal, and sync_schematic_to_board among others.
This is deliberate. Silently skipping a broken sheet produced an incomplete pad-to-net map reported as success, which is worse than an error. flatSymbols names the offending symbols and repair_flat_symbols fixes the usual cause. See KNOWN_ISSUES.md section 7.
Performance
sync_schematic_to_board now loads each distinct footprint once instead of once per component — nothing downstream memoized it, so a board with thirteen identical resistors paid for thirteen identical disk reads. On a measured 29-component mix that is 29 loads down to 6.
A note on the tool count
The headline moved 143 → 146 while only 10 tools were added. getRegistryStats() had been summing routed + direct tools while seven schematic essentials sit in both lists on purpose, so v2.5.0's published 143 was overstated by exactly seven. The true v2.5.0 figure was 136. Now fixed, with a test pinning it.
Relatedly, the README's claim that the tool router "reduces AI context by 70%" has been corrected. The gating half of that design was deliberately rolled back in March because indirect execution made the model invent tool schemas, and execute_tool was removed in May. Every tool is registered directly, so nothing is hidden and no context is saved. The history is now recorded in ROUTER_ARCHITECTURE.md rather than left for the next person to rediscover.
Full details in the CHANGELOG.