Skip to content

v0.2.0 — the part standard, importers, and the full ECAD check chain

Choose a tag to compare

@theironchef theironchef released this 22 Jul 12:48

Everything since v0.1.0 — one day of development, every block CI-verified.

The Part standard (ADR-0008–0011)

  • Parts are the universal unit; an assembly IS a part (full nesting). Domain-neutral interfaces: envelope + named frames + typed ports (mech.bolt, elec.pin, ...)
  • Interface-semver, machine-enforced: a moved mounting hole requires a MAJOR bump — check_release rejects under-bumped releases mechanically
  • Lockfiles: ^/~/exact constraints resolved deterministically, pinned by canonical-content hash — builds reproducible from a git tag forever
  • Derived interfaces: boards derive part.json from mounting holes + outline; models derive envelopes from built geometry. Change the board, the release gate reacts — nothing hand-maintained

Importers — bring your existing work

  • STEP (round-trip verified to 1e-6), FreeCAD .FCStd (reads embedded breps — no FreeCAD needed), KiCad .kicad_pcb (v5–v9)
  • Honest ImportReport on every import: what came in, what was approximated, what was dropped. >2 routed copper layers is a refusal, never silent loss
  • Imports pinned by sha256 — builds fail loudly on swapped geometry

The full ECAD check chain

  • Schematic capture (text-first netlist, typed pins) + ERC (pin-type conflict matrix, undriven inputs, unpowered power pins)
  • Schematic↔board parity (the ECO check, both directions)
  • DRC engine: net-scoped rules in canonical, shareable rule packs — clearance, track width, annular ring, drill sizes, hole spacing, edge clearance. It caught a real routing bug in our own demo the day it was born.
  • The blinky example now runs capture → ERC → layout → parity → DRC → fab-validate → Gerbers in one script

Correctness hardening (independent review, P0–P4 fully closed)

  • One canonicalization policy (NaN rejected, −0.0 normalized, int≡float) across every serializer
  • Value-based feature ids; duplicate ids rejected at load (the git-merge failure mode)
  • Identity wired end-to-end: stable entity ids assigned at build, persistable registry, and fillet-by-entity-id that survives upstream edits — the topological-naming promise, implemented and tested
  • Honest verification: null-kernel fallback can't masquerade as geometry checks (geometry_verified on every MCP response); OCP imports confined to the kernel seam by invariant test; structured MCP errors; transmit-safe fingerprints; ADR-0007 scrub + similarity gate completed

Attached artifacts (generated by examples/)

bracket.step / bracket.pdf — model → STEP + dimensioned drawing
blinky-fab.zip — Gerber X2, Excellon (PTH+NPTH), pick-and-place, schematic, manifest

99 tests · CI green on py3.10/3.12 + full OCCT with end-to-end demos · https://gitcad.xyz

🤖 Generated with Claude Code