app
adom-chiplinter — 3D chip ↔ KiCad footprint linter
UnreviewedDetect 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 c
{
"schema_version": 1,
"type": "app",
"slug": "adom-chiplinter",
"title": "adom-chiplinter — 3D chip ↔ KiCad footprint linter",
"brief": "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 c",
"version": "0.2.0",
"tags": [],
"license": "MIT",
"discovery_triggers": [
"chiplinter",
"chip linter",
"validate chip footprint",
"chip pad detection",
"pin-1 detection",
"pin-1 vision",
"pin-1 validation",
"footprint vs 3d model",
"bbox-fit chip",
"chip rotational symmetry",
"ambiguous chip orientation",
"chip-pads alignment",
"bake annotated glb",
"chiplinter inspect",
"chiplinter sweep",
"chiplinter run",
"chip orientation tie-break",
"qfn pin-1",
"qfp pin-1",
"bga pin-1",
"soic pin-1"
],
"discovery_pitch": "Lint a 3D chip GLB against its KiCad footprint with a self-validating bbox-fit detector. Detects pin-1, flags rotationally-symmetric pad layouts (QFN/QFP/BGA/SOIC) where pad-fit alone can't disambiguate, and ships pin-1 vision validation that reads the manufacturer indicator off the chip body. Bakes an annotated GLB with chip-pads, FP-pads, and pin-1 marker named in the scene graph for downstream Adom tools.",
"install": {
"binary_name": "adom-chiplinter",
"install_dir": "",
"install_hint": "",
"version_cmd": ""
},
"readme": "# adom-chiplinter\n\nA Rust CLI + Hydrogen webview that detects every chip's electrical-contact\nfeatures (legs / pins / pads / balls / tabs) automatically from a 3D GLB model,\nvalidates placement against the KiCad footprint, and bakes an annotated GLB so\ndownstream Adom tools can read pad positions from the scene graph.\n\nThe \"north star\": you point chiplinter at a chip directory containing the GLB,\nKiCad footprint, datasheet PDF, and `info.json`, and it answers the question\n*\"are these aligned?\"* — with no human override required.\n\n## Why this exists\n\nEvery Adom flow that touches a real chip — InstaPCB previews, solder-jet\nplanning, heatsink-via routing, KiCad library publishing — needs to trust that\nthe 3D model and the footprint agree on where the pads are and which one is\npin 1. chiplinter is the linter that produces that trust.\n\nIt runs four detection stages — geometric bbox-fit, kind-aware inside-test,\nmaterial-color rescue, vision rescue — and writes a single `confidence` value\nper chip that downstream tools can gate on:\n\n| Confidence | Meaning |\n|---|---|\n| `verified` | Both pad geometry AND the chip's manufacturer indicator agree |\n| `high` | Pad geometry uniquely fits at identity rotation (canonical case) |\n| `assumed` | A non-identity rotation won uniquely; verify visually |\n| `ambiguous` | Multiple rotations tie at 100% — vision is the deciding factor |\n| `conflict` | Vision saw the indicator at a different quadrant than pad-1 |\n\n## Quick start\n\n```bash\nchiplinter run path/to/chip-dir # lint a single chip\nchiplinter sweep test-cases/ # full coverage matrix\nchiplinter inspect path/to/chip-dir # interactive Babylon.js webview\n```\n\n## Inspector webview\n\n`chiplinter inspect` serves a Hydrogen webview at `http://localhost:18420`\nshowing the chip GLB rendered with FP pad bboxes, raycast lines, the pin-1\nmarker, and a per-pad walkthrough. One-click **Bake annotated GLB** writes\n`<mpn>-chiplinter.glb` with three named groups in the scene graph:\n\n- `chiplinter_chip_pads` — chip-frame rectangle meshes parented under the\n chip's `__root__` (rotates with the chip on a PCB)\n- `chiplinter_fp_pads` — KiCad footprint pads at the scene root in PCB frame\n (stays fixed when the chip rotates above)\n- `chiplinter_pin1_marker` — pin-1 location with full confidence metadata\n\nOne-click **Validate pin-1** captures a top-down render with N/S/E/W compass\nlabels burned in, ships it to Claude vision with a structured-output schema,\ncompares the indicator quadrant against KiCad pad-1's expected quadrant, and\nupgrades or downgrades the bake-time confidence accordingly.\n\n## Rotational symmetry detection\n\nFor QFN/QFP/BGA/SOIC packages with N-fold symmetric pad layouts, multiple\norientations of the chip will fit the footprint at 100% coverage. chiplinter\ndetects ties at bake time by running the FP-projection raycast at every one\nof the 24 axis-aligned rotations; if more than one rotation matches the max\nhit count, the marker carries `rotational_symmetry_detected: true` and\n`tied_orientations: [0, 1, 2, 3]` (or `[0, 2]` for 2-fold, etc.).\n\nIn this case bake-time confidence is `ambiguous` — the manufacturer's pin-1\nindicator on the chip body is the only signal that breaks the tie. Stage 5b\nvision validation is the deciding factor.\n\nSweep results across the staged test set:\n\n| chip | family | tied | confidence |\n|---|---|---|---|\n| RP2040 | QFN-56 | [0,1,2,3] | ambiguous |\n| LQFP-48 | QFP | [0,1,2,3] | ambiguous |\n| LM358_DFN-8 | DFN | [0,1,2,3] | ambiguous |\n| TMP102 | SOT-563 | [0,1,2,3] | ambiguous |\n| Texas_DSBGA-49 | BGA | [0,1,2,3] | ambiguous |\n| iCE40HX1K-TQ144 | TQFP | [0,1,2,3] | ambiguous |\n| ATtiny85_SOIC-8 | SOIC | [0,2] | ambiguous |\n| W25Q128JV | SOIC | [0,2] | ambiguous |\n| WAGO-2601-3105 | THT | [21] | assumed |\n| NE555_DIP-8 | DIP | [1] | assumed |\n| USB-C-GCT-USB4085 | conn | [16] | assumed |\n\n## Required infra\n\n- `step2glb` — used to convert STEP → color-preserving GLB at chip-staging time\n- `claude` CLI — used for Stage 5b pin-1 vision validation\n- `adom-3d-viewer-babylon9` — vendored 3D viewer ESM bundle (Babylon 9.5.0 +\n Inspector v9), also published to the Adom Wiki\n\n## 3D viewer + design-skill audit (v0.2.0)\n\nThe inspector webview uses `adom-3d-viewer-babylon9` v0.2.0. Compliance vs\nthe `3d-viewer-design` skill:\n\n| Rule | Status |\n|---|---|\n| §1 Babylon engine, §3b gradient, §4a–4d HDRI + lights + shadows + ground | ✅ |\n| §5a PBRMaterial default | ✅ |\n| §6a zoom-to-mouse, §6c Shift+Alt+Click recenter, §7 ViewCube | ✅ |\n| **§8a world-origin axes (default ON, R/G/B, 15% scene radius)** | ✅ **new in v0.2.0** — toolbar \"Axes\" button, `A` keyboard |\n| **§8b mesh-local axes (default OFF, toggleable, parented to each GLB root)** | ✅ **new in v0.2.0** — toolbar \"Mesh axes\" button, `Shift+A` keyboard |\n| **§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 |\n| §6b.i adaptive `wheelDeltaPercentage` | ⚠ open — currently constant `0.1` |\n| §11 Y-up→Z-up | ✅ via `rotateYUpToZUp(scene)` exposed on the bundle global |\n\n## Architecture\n\nThe detection pipeline is described in [SKILL.md](./SKILL.md). Source code\nlives at `adom-inc/adom-chiplinter` (private repo); the canonical install\nartifact is the wiki binary asset.\n\n## Output artifacts\n\n`chiplinter run <chip-dir>` produces:\n\n- `chiplinter-report.json` — per-pad verdict + scoring metadata\n- `chiplinter-inspector.json` — manifest for the inspector webview\n- `<mpn>-chiplinter.glb` (after baking) — annotated GLB\n- `<mpn>-pin1-vision.png` (after vision validation) — labeled top-down render\n\n`chiplinter sweep` produces:\n\n- `coverage-matrix.json` — rows=chips, cols=stages, cells=PASS|WARN|REFUSE\n- `coverage.html` — visual coverage matrix\n",
"author": {
"id": "695820315b5f1e4db2fcf602",
"name": "Kyle Bergstedt",
"email": "[email protected]"
},
"visibility": {
"public": true
},
"hero": null,
"sample_prompts": [],
"metadata": {},
"created_at": "2026-05-28T05:29:11.274Z",
"updated_at": "2026-05-28T05:29:11.274Z",
"skills": []
}