v0.2.0 — the part standard, importers, and the full ECAD check chain
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_releaserejects 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
ImportReporton 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_verifiedon 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