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 ...(anykicad-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); thentracemaker check-roundtripmust re-write it byte for byte,tracemaker drcandkicad-cli pcb drcmust count the same violations of the fifteen routing-relevant types (asscripts/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. Aresolvejob reads thekicad/kicadtags and picks the newest releaseX.Y.Zand, when it is newer, the newest release candidateX.Y.Z-rcN; thedistbinary is built in the CI container and checked inside each image onplane_smdand 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 OUTwrote only the board, so KiCad openedOUTwith its default rules (net classes and custom rules live in the project files): plane_smd's routed copy showed 127clearanceand 139track_widtherrors that were not there.routenow copies the input's.kicad_proand.kicad_druto OUT's name when OUT has none (never over existing ones; test "route -o copies the project files"). - Docs: 18 §12, 11 (M19 row).