Detect every chip's electrical-contact features (legs / pins / pads / balls / tabs) automatically from a 3D model, validate against the KiCad footprint, and bake an annotated GLB so downstream tools can read pad positions from the scene graph. Stage 5b pin-1 vision validation catches rotational ambiguity in QFN/QFP/BGA/SOIC packages where 4-fold or 2-fold symmetric pad layouts make the bake-time orientation an arbitrary tie-break.
adom-chiplinter
A Rust CLI + Hydrogen webview that detects every chip's electrical-contact
features (legs / pins / pads / balls / tabs) automatically from a 3D GLB model,
validates placement against the KiCad footprint, and bakes an annotated GLB so
downstream Adom tools can read pad positions from the scene graph.
The "north star": you point chiplinter at a chip directory containing the GLB,
KiCad footprint, datasheet PDF, and info.json, and it answers the question
"are these aligned?" — with no human override required.
Why this exists
Every Adom flow that touches a real chip — InstaPCB previews, solder-jet
planning, heatsink-via routing, KiCad library publishing — needs to trust that
the 3D model and the footprint agree on where the pads are and which one is
pin 1. chiplinter is the linter that produces that trust.
It runs four detection stages — geometric bbox-fit, kind-aware inside-test,
material-color rescue, vision rescue — and writes a single confidence value
per chip that downstream tools can gate on:
| Confidence | Meaning |
|---|
verified | Both pad geometry AND the chip's manufacturer indicator agree |
high | Pad geometry uniquely fits at identity rotation (canonical case) |
assumed | A non-identity rotation won uniquely; verify visually |
ambiguous | Multiple rotations tie at 100% — vision is the deciding factor |
conflict | Vision saw the indicator at a different quadrant than pad-1 |
Quick start
chiplinter run path/to/chip-dir # lint a single chip
chiplinter sweep test-cases/ # full coverage matrix
chiplinter inspect path/to/chip-dir # interactive Babylon.js webview
Inspector webview
chiplinter inspect serves a Hydrogen webview at http://localhost:18420
showing the chip GLB rendered with FP pad bboxes, raycast lines, the pin-1
marker, and a per-pad walkthrough. One-click Bake annotated GLB writes
<mpn>-chiplinter.glb with three named groups in the scene graph:
chiplinter_chip_pads — chip-frame rectangle meshes parented under the
chip's __root__ (rotates with the chip on a PCB)
chiplinter_fp_pads — KiCad footprint pads at the scene root in PCB frame
(stays fixed when the chip rotates above)
chiplinter_pin1_marker — pin-1 location with full confidence metadata
One-click Validate pin-1 captures a top-down render with N/S/E/W compass
labels burned in, ships it to Claude vision with a structured-output schema,
compares the indicator quadrant against KiCad pad-1's expected quadrant, and
upgrades or downgrades the bake-time confidence accordingly.
Rotational symmetry detection
For QFN/QFP/BGA/SOIC packages with N-fold symmetric pad layouts, multiple
orientations of the chip will fit the footprint at 100% coverage. chiplinter
detects ties at bake time by running the FP-projection raycast at every one
of the 24 axis-aligned rotations; if more than one rotation matches the max
hit count, the marker carries rotational_symmetry_detected: true and
tied_orientations: [0, 1, 2, 3] (or [0, 2] for 2-fold, etc.).
In this case bake-time confidence is ambiguous — the manufacturer's pin-1
indicator on the chip body is the only signal that breaks the tie. Stage 5b
vision validation is the deciding factor.
Sweep results across the staged test set:
| chip | family | tied | confidence |
|---|
| RP2040 | QFN-56 | [0,1,2,3] | ambiguous |
| LQFP-48 | QFP | [0,1,2,3] | ambiguous |
| LM358_DFN-8 | DFN | [0,1,2,3] | ambiguous |
| TMP102 | SOT-563 | [0,1,2,3] | ambiguous |
| Texas_DSBGA-49 | BGA | [0,1,2,3] | ambiguous |
| iCE40HX1K-TQ144 | TQFP | [0,1,2,3] | ambiguous |
| ATtiny85_SOIC-8 | SOIC | [0,2] | ambiguous |
| W25Q128JV | SOIC | [0,2] | ambiguous |
| WAGO-2601-3105 | THT | [21] | assumed |
| NE555_DIP-8 | DIP | [1] | assumed |
| USB-C-GCT-USB4085 | conn | [16] | assumed |
Required infra
step2glb — used to convert STEP → color-preserving GLB at chip-staging time
claude CLI — used for Stage 5b pin-1 vision validation
adom-3d-viewer-babylon9 — vendored 3D viewer ESM bundle (Babylon 9.5.0 +
Inspector v9), also published to the Adom Wiki
3D viewer + design-skill audit (v0.2.0)
The inspector webview uses adom-3d-viewer-babylon9 v0.2.0. Compliance vs
the 3d-viewer-design skill:
| Rule | Status |
|---|
| §1 Babylon engine, §3b gradient, §4a–4d HDRI + lights + shadows + ground | ✅ |
| §5a PBRMaterial default | ✅ |
| §6a zoom-to-mouse, §6c Shift+Alt+Click recenter, §7 ViewCube | ✅ |
| §8a world-origin axes (default ON, R/G/B, 15% scene radius) | ✅ new in v0.2.0 — toolbar "Axes" button, A keyboard |
| §8b mesh-local axes (default OFF, toggleable, parented to each GLB root) | ✅ new in v0.2.0 — toolbar "Mesh axes" button, Shift+A keyboard |
| §8c screen-space corner triad (always on) | ⚠ deferred to v0.3.0 — second-camera-viewport rendering doesn't fire from the canonical viewer's render loop; needs UtilityLayerRenderer with explicit secondary engine.render() pass |
§6b.i adaptive wheelDeltaPercentage | ⚠ open — currently constant 0.1 |
| §11 Y-up→Z-up | ✅ via rotateYUpToZUp(scene) exposed on the bundle global |
Architecture
The detection pipeline is described in SKILL.md. Source code
lives at adom-inc/adom-chiplinter (private repo); the canonical install
artifact is the wiki binary asset.
Output artifacts
chiplinter run <chip-dir> produces:
chiplinter-report.json — per-pad verdict + scoring metadata
chiplinter-inspector.json — manifest for the inspector webview
<mpn>-chiplinter.glb (after baking) — annotated GLB
<mpn>-pin1-vision.png (after vision validation) — labeled top-down render
chiplinter sweep produces:
coverage-matrix.json — rows=chips, cols=stages, cells=PASS|WARN|REFUSE
coverage.html — visual coverage matrix
name: adom-chiplinter
user-invocable: true
description: "3D chip ↔ KiCad footprint linter. Detect every chip's electrical-contact features (legs / pins / pads / balls / tabs) automatically from a 3D model, and validate placement against the KiCad footprint. Stage 5b pin-1 vision validation catches rotational ambiguity in QFN/QFP/BGA/SOIC packages where 4-fold or 2-fold symmetric pad layouts make the bake-time orientation an arbitrary tie-break. Use when: linting a 3D chip against a footprint, finding pin-1, validating pad alignment, baking annotated GLBs with chip-pad / FP-pad scene-graph entries for downstream Adom tools, debugging chip placement, building a chip test library. Trigger words: chiplinter, chip linter, validate chip footprint, chip pad detection, pin-1 detection, pin-1 vision, footprint vs 3d model, bbox-fit chip, chip rotational symmetry, chip-pads alignment, bake annotated glb, chiplinter inspect, chiplinter sweep, chiplinter run."
adom-chiplinter — 3D chip ↔ KiCad footprint linter
Detects every chip's electrical-contact features (legs / pins / pads / balls /
tabs) automatically from a 3D GLB model, validates placement against the KiCad
footprint, and bakes an annotated GLB so downstream Adom tools can read pad
positions from the scene graph.
The "north star": you point chiplinter at a chip directory containing the GLB,
KiCad footprint, datasheet PDF, and info.json, and it answers the question
"are these aligned?" — with no human override required.
Quick start
# Lint a single chip
chiplinter run path/to/chip-dir
# Lint every chip under test-cases/ and produce a coverage matrix
chiplinter sweep test-cases/
# Open the interactive inspector in a Hydrogen webview
chiplinter inspect path/to/chip-dir --port 18420
A chip directory contains:
<mpn>.kicad_mod — KiCad footprint
<mpn>.glb — 3D model (color-preserving GLB from step2glb or kicad-cli)
<mpn>.pdf — datasheet (optional, used by Stage 0 datasheet extraction)
info.json — structural classification + provenance
Detection pipeline
Five stages, self-validating:
| Stage | What it does |
|---|
| 0 | Datasheet extraction (Claude vision → <mpn>-datasheet.json sidecar) |
| 1 | Load + classify (footprint pads, GLB triangles, body materials) |
| 2 | Z-band slab + 2D rasterize + connected-components → detected pad bboxes |
| 3 | 24-rotation fit-test + Hungarian matching (kind-aware inside-test) |
| 4 | Material-color rescue (filter to gold/metal triangles for inset pads) |
| 5 | Vision rescue (top-down render → Claude vision detects pin-1 indicator) |
Stage 3 produces both the orientation transform and the per-pad correspondence
in one pass. Stage 5b (pin-1 vision) is the deciding factor for rotationally-
symmetric chips — see "Rotational symmetry" below.
Pin-1 confidence model
The bake step writes chiplinter_pin1_marker.extras.chiplinter.confidence based
on pad-fit symmetry detection:
| Confidence | When | Meaning |
|---|
high | orient #0 uniquely won at 100% | kicad-packages3d STEPs author pin-1 in the conventional position; FP authors pad-1 in the matching position. Identity-rotation match means the chip's authored pin-1 indicator aligns by construction. |
ambiguous | multiple rotations tied at 100% | The chip's pad layout is rotationally symmetric (QFN/QFP/BGA/SOIC). Vision validation is the deciding factor. |
assumed | a non-identity rotation won uniquely | Position derives from FP pad-1; chip-body indicator is the ground truth. Verify visually before reflow. |
verified | vision confirmed indicator at expected quadrant | High confidence — both pad geometry and the manufacturer's chip-body indicator agree. |
conflict | vision saw indicator at a different quadrant | Real disagreement. Downstream tools should refuse to auto-flow; human review required. |
vision_inconclusive | vision ran but couldn't see an indicator | Falls back to bake-time confidence. |
Rotational symmetry
For QFN/QFP/BGA/SOIC packages with N-fold symmetric pad layouts, multiple
orientations of the chip will fit the footprint at 100% coverage. The bake step
detects ties by running the FP-projection raycast at every one of the 24
axis-aligned rotations; if more than one rotation matches the max hit count,
the marker carries rotational_symmetry_detected: true and
tied_orientations: [0, 1, 2, 3] (or [0, 2] for 2-fold, etc.).
In this case bake-time confidence is ambiguous — the manufacturer's pin-1
indicator on the chip body is the only signal that breaks the tie. Pin-1 vision
validation is built in: render top-down via chiplinter inspect, click
"Validate pin-1," and the inspector ships a labeled top-down PNG to Claude
vision with a structured-output schema. The result writes back to the baked
GLB extras.
Output artifacts
chiplinter run <chip-dir> produces:
chiplinter-report.json — per-pad verdict + scoring metadata
chiplinter-inspector.json — manifest for the inspector webview
<mpn>-chiplinter.glb (after baking) — annotated GLB with three named groups:
chiplinter_chip_pads (under __root__) — chip-frame rectangle meshes
chiplinter_fp_pads (at scene root) — FP pads in PCB frame
chiplinter_pin1_marker — pin-1 location + confidence metadata
chiplinter sweep produces a coverage matrix (coverage-matrix.json +
coverage.html) showing every chip's pass/warn/refuse status across the
detection pipeline.
Inspector webview
chiplinter inspect <chip-dir> --port 18420 serves an interactive Babylon.js
webview at http://localhost:18420 showing:
- The chip GLB rendered with FP pad bboxes + raycast lines + pin-1 marker
- Per-pad walkthrough that proves each FP pad ↔ chip-surface association
- 24-orientation iteration table with coverage % and σ
- One-click "Bake annotated GLB" → writes
<mpn>-chiplinter.glb
- One-click "Validate pin-1" → captures top-down PNG, ships to vision, shows
verdict (Verified / Conflict / Inconclusive) with the bake-time symmetry
context
The inspector uses a vendored ESM build of adom-3d-viewer-babylon9 (Babylon
9.5.0 with the new Inspector v9). Open the page in a Hydrogen webview tab —
not in the deprecated Adom Viewer panel.
CLI flags
Usage: chiplinter <COMMAND>
Commands:
run Run detection on one chip directory; emits chiplinter-report.json
sweep Run all chips under a test-cases directory; emits coverage matrix
inspect Generate inspector manifest + serve the webview
install Deploy this binary + SKILL.md to the user's PATH
help Print this message or the help of the given subcommand(s)
Run options:
--verbose Detailed per-band diagnostics
Inspect options:
--port <PORT> [default: 18420]
--no-serve Generate manifest only, don't serve
Sweep options:
[cases_dir] [default: test-cases]
Required infra (auto-checked by chiplinter install)
step2glb — used to convert STEP → color-preserving GLB at chip-staging time
(chiplinter consumes pre-staged GLBs, but the staging pipeline assumes
step2glb is on PATH)
claude CLI — used for Stage 5b pin-1 vision validation
adom-wiki (optional) — for publishing chip libraries
Troubleshooting
chiplinter inspect shows blank canvas — the vendored 3d-viewer assets
weren't installed alongside the binary. The binary must be co-located with
web/inspector.html and vendor/3d-viewer/. For now, run inspect from a
checkout of adom-inc/adom-chiplinter.
- Vision verdict is "conflict" — the manufacturer pin-1 indicator on the
chip body disagrees with KiCad pad-1's quadrant. For 4-fold symmetric chips
this is a true ambiguity that needs human review before reflow.
chiplinter sweep REFUSES on multiple chips — check info.json for the
structural_type field; some classes (smd_inset_pads,
hybrid_smd_plus_mech_clip) need Stage 4 material rescue or Stage 5 vision
rescue, which require the corresponding flags to be enabled in
DetectionParams.
Related
adom-3d-viewer-babylon9 — vendored 3D viewer ESM bundle (Babylon 9.5.0 +
Inspector v9). Also published to the Adom Wiki.
adom-chipfit — sister tool, validates a chip GLB against a footprint with a
simpler single-chip scope; chiplinter is the rebuilt "north-star" detector.
step2glb — STEP → GLB converter; chiplinter consumes the GLB output.
No sub-skills yet. Be the first to contribute one!