KiCad schematic authoring

One of the kicad_skills usage guides for the eda CLI — all of them. Plain Markdown: read it directly, or hand it to whatever assistant you use.

How to draw a schematic, for an agent that writes .kicad_sch files. The schematic review guide covers reading and judging one; this guide is the other direction, distilled from making five generated designs readable and watching exactly where they failed. The checks named here are enforced by rules, so the loop is closed: draw, review, fix what fires.

The required checks

Run all three on every sheet you produce, and treat the first two as gates:

./bin/eda.sh sch erc     hardware/                 # KiCad's own ERC: zero errors
./bin/eda.sh sch review  hardware/ --text          # the toolkit's rules
./bin/eda.sh gate        hardware/ --policy ai-generated --text

ERC must pass on every KiCad version you claim to support, not just the one you develop against. KiCad 9 and KiCad 10 build connectivity differently: a wire that runs through a junction instead of being broken at it connects on both sides in KiCad 10 and on one side in KiCad 9 — the netlist silently differs between versions, and only ERC on the older version shows it. If the container images for both versions exist, run ERC in each.

Then render the sheet and look at it:

./bin/eda.sh sch render hardware/ -o /tmp/sch --dpi 150

Half of what makes a sheet unreadable changes nothing in the netlist — notes printed over the regulator, a connector parked on the title block — and is only visible in the plot. Several of those are now rules (readability.margin_intrusion, readability.text_over_symbol), but the render is still the only check that sees everything.

Wires, not labels

The most recognisable mark of a generated sheet is every connection drawn as a stub and a net label — a valid netlist and an unreadable drawing. readability.label_only measures it. The method that fixed it:

Junctions and tees

Power symbols and flags

Notes sit beside their subject

One block of prose in a corner reads as none: nobody carries sentence four across the sheet to capacitor three. Split the design notes and anchor each block beside the circuit it explains — the input note by the input, the filter math by the filter, the indicator note by the LED. On an analog sheet, add test points where the simulation is meant to meet the board, and say so in a note beside them (test.no_testpoints notices when there are none).

Parts and their annotations

Orientation and placement

The failure the netlist never shows

Two nets touching on the sheet — a stub ending on another net’s wire — makes one net where the design says two, and everything downstream is self- consistently wrong; the only symptom is KiCad’s schematic parity check disagreeing about a net name. Check for it at generation time by comparing every wire against every other for shared endpoints and tees across nets, and refuse to write the file. Finding it later costs an evening; finding it at build time costs a message.

Where the rules live

Every check named above is in eda sch review / eda gate --list-rules: readability.label_only, readability.missing_junction, readability.wire_through_junction, readability.overlapping_wires, readability.facing_away, readability.margin_intrusion, readability.text_over_symbol, plus the off-grid, dangling-wire and overlapping-symbol rules the review guide describes. What cannot be a rule — polarity semantics, which nets deserve wires versus names, whether a drawing reads — is this guide, and the render.