Skip to content

D142 — KiCad drift job: the newest KiCad image upgrades, re-reads, judges and routes four boards weekly

Context

M19 (doc 18 A4): "Scheduled job running DRC parity and round trip against the newest KiCad container and, when one exists, a KiCad 11 release candidate". The project pins KiCad 10.0.6 (scripts/kicad-cli); KiCad 10.0.7 was released on 2026-10-18, and no KiCad 11 tag exists on Docker Hub. kicad/kicad:nightly was the obvious image for the road to KiCad 11, but it is stale: it is 10.0.0-rc1.1-513 built on 2026-02-27. The records are in bench/records/m19-drift/.

Decision

  • scripts/kicad_drift.py BOARD ... (any kicad-cli, e.g. the image's own or the docker wrapper): the newest kicad-cli upgrades a copy of each board to its own file format (pcb upgrade --force); then tracemaker check-roundtrip must re-write it byte for byte, tracemaker drc and kicad-cli pcb drc must count the same violations of the fifteen routing-relevant types (as scripts/drc_parity.py, capped at KiCad's 199 per type), and a routed copy (route --work 2000000, with the project files beside it) must give kicad-cli no error type the input did not have. Exit 0 only if every check passed.
  • .github/workflows/kicad-drift.yml: weekly (Monday 04:17 UTC) and by hand. A resolve job reads the kicad/kicad tags and picks the newest release X.Y.Z and, when it is newer, the newest release candidate X.Y.Z-rcN; the dist binary is built in the CI container and checked inside each image on plane_smd and three KiCad demos (ecc83, pic_programmer, complex_hierarchy, from KiCad's 10.0 branch). It does not gate pull requests.

Alternatives

  • kicad/kicad:nightly. Stale (above); a fixed tag would have reported 10.0.0-rc1 as "the newest" for months.
  • The DRC parity corpus and the fixture sets in CI. The full corpus is 2.4 GB of downloads and hours of kicad-cli; four boards in two formats (KiCad 5 demos upgraded, a KiCad 9 board) catch a format or rule change, and the parity tools run on the full sets by hand.
  • Gating pull requests. A new KiCad release must not block unrelated work; the weekly run is a warning to act on.

Consequences

  • Run locally: 4/4 boards pass every check with KiCad 10.0.6 (host wrapper and inside the image, the way CI runs it), 10.0.7 and the stale nightly. The KiCad 11 part of M19 (reader and writer for the 11 formats, the plugin on the IPC API) waits for a KiCad 11 release candidate; the job will start checking one the week its tag appears.
  • Found on the way: route -o OUT wrote only the board, so KiCad opened OUT with its default rules (net classes and custom rules live in the project files): plane_smd's routed copy showed 127 clearance and 139 track_width errors that were not there. route now copies the input's .kicad_pro and .kicad_dru to OUT's name when OUT has none (never over existing ones; test "route -o copies the project files").
  • Docs: 18 §12, 11 (M19 row).