# NativeCAD 0.24.0 "Gelmetti" — NX, Inventor and SolidWorks assembly import, exact tangent booleans, mechanism sweeps

**184 tools, one more than 0.23.3 (`cad_assembly_sweep`).** The command schema moves from 1.64.0 to 1.65.0 (`import` gains an optional `searchPaths`; additive, so every 1.64.0 document validates unchanged). Installs on 0.17.2 and later pick this release up through the self-update.

The import census over the 654-file corpus stands at 437/654 (66.8 %) on master af70d847, from 306/654 at CADSB-100574 (CADSB-100592).

* **New CAD importers** (CADSB-100580, CADSB-100581, CADSB-100587, CADSB-100589, CADSB-100593):
  * NX `.prt` parts open through their embedded Parasolid partition: 21/25 NX corpus parts, 13 STEP pairs within 0.03 % volume. Creo `.prt` is refused `PRT_CREO_UNSUPPORTED`.
  * Inventor `.ipt` parts open through their embedded ACIS SAB stream, with an extended `SatReader`: ipt census 16/18, the other 2 placeholder fixtures.
  * SolidWorks `.sldasm` assemblies open from their referenced `.sldprt` parts, found in the assembly folder or the new `searchPaths`; an unresolved reference refuses `XA_COMPONENTS_MISSING` with the list. sldasm census 3/100 -> 82/100.
* **IGES and Parasolid import closes more files** (CADSB-100575, CADSB-100577, CADSB-100588 and others). IGES 308/408 subfigures are instanced (tachyon 167 -> 798 closed bodies, boron 93 -> 259 solids). The whole-file sew measures exact curve deviation, and genuine open sheets refuse `IGES_SHEET_OPEN`. XT stubs and Git LFS pointers refuse by name (`XT_NO_BODY_DATA`, `XT_GIT_LFS_POINTER`), and `.sldprt` takes a `configuration` selector.
* **Tangent boolean cases build exact or are refused by name** (CADSB-100562 to CADSB-100567). The 19-case tangent table (CADSF-101502) pinned six kernel gaps, and all six are closed:
  * exact subtract and intersect for the equal-radius tee and the Steinmetz cross (ELLIPSE edges, not 78-152 LINE chords);
  * the nested tangent-ball union is an exact copy of the outer ball, and its subtract is refused `tangent_contact_pinch`;
  * near-tangent rods union exactly (4 faces, was 638 facets);
  * no-volume union refusals name the POINT, LINE or GAP;
  * an empty intersect carries a `sub_tolerance_overlap` warning.
* **Mechanisms and fasteners** (CADSF-102136 to CADSF-102141, CADSF-102146, CADSB-100475). The new `cad_assembly_sweep` returns the minimum clearance over a declared mechanism's whole motion, plus clash intervals and transmission/toggle margins, without moving anything. `cad_joint` kind `"pin"` builds a real bushed revolute stack. `cad_fastener` seats hardware in `host` bodies by envelope (clearance, countersink, potted insert), and `cad_fastener_audit` measures along the hardware against the modelled solids. `cad_assembly_contacts` adds conical contacts, running/press fits and a z-fight check.
* **Modelling**:
  * `cad_hole_pattern` kind `"radial"` cuts rows of radial through-holes in coaxial tube walls in one pass (CADSF-101574: 240 holes in 12.0 s).
  * `cad_chamfer_edges` gains `flip` (CADSF-101467).
  * Welded frames: exact cylinder + torus tubes by default, ball-jointed elbows, and `cad_boolean_union {mitre:true}` (CADSF-2568, CADSF-2569, CADSF-2571).
  * Shell and blend refusals carry their cause as data (CADSF-2751 to CADSF-2753, CADSF-1812).
* **Cold previews go async** (CADSB-100418, FBR-000091). A cold whole-document `cad_preview_body` or tessellating `cad_export_body` estimated past the job cost line returns a `jobId` instead of timing out past the 60 s bridge wait.
* Also:
  * the MCP server refuses SDK development keys (CADSF-102166, `dev_key_not_mcp`);
  * `pierce()` refuses past 32 pierced planes instead of hanging (CADSB-1328);
  * `cad_nest` gains `sls_eos_p396` and `wallMarginMm` (CADSF-102274), and `cad_cast_mould` gains `draftAllowance` (CADSF-102177);
  * the kernel bundle ships every printer record (CADSB-100478), and the `.plugin` drops `bin/` for claude.ai;
  * fixed reported issues: PDF drawings on one annotation-named layer (CADSB-100083, FBR-000041) and `cad_engrave_text` `origin` among same-normal faces (CADSB-100106, FBR-000050).

See `packages/mcp/CHANGELOG.md` under `## 0.24.0`.

## Gates

* **stdio smoke on the shipped `.mcpb` and `.plugin`** (inside `plugin/build.js` and `build-plugin.js`): `cadsolver 0.24.0`, tools/list 184, staged git `ec4700313`, 0 fails. `mcp-smoke.js` gives 184 tools on both `dist/server.min.js` and `bin/nativecad-mcp.js`.
* **`dist/server.min.js` is byte-identical in the `.tgz`, `.mcpb` and `.plugin`** (sha256 `b21688921afef319…`); `npm pack` is 9 files, no `src/`, no `kernel/`.
* **Staged-kernel e2e** (`e2e/scenario-f-blend-smoke`, `e2e/scenario-g-conerim-smoke`) against the kernel staged at `ec4700313`: 27 and 20 assertions green. `cadsf-1128` (bundle, `.mcpb`, determinism) 35, `cadsf-1148` (private groups withheld) 58, `schema-sync` 596, `tool-list-budget` 32, `cadsb-1475` 225, `cadsf-1662` (server.json drift) 19, `mcp:sync` and `mcp:tools:check` clean.
* **MCP suite** (`npm --prefix packages/mcp test`, 317 files): see `docs/releases/0.24.0.md` for the run and the one file left red inside the shared-process suite (`cadsb-1451`, the 50-body union against its 60 s per-call ceiling; 51 s alone).

**Downloads:** https://featureboard.ai/nativecad/releases/nativecad-mcp-0.24.0.mcpb, https://featureboard.ai/nativecad/releases/nativecad-mcp-0.24.0.plugin and https://featureboard.ai/nativecad/releases/nativecad-mcp-0.24.0.tgz, plus the kernel library https://featureboard.ai/nativecad/releases/nativecad-kernel-0.3.2.tgz (unchanged; `latest.json` lists bytes and sha256).

```
3b14a96989d42848ef6831c4d324b688e92046e50dc5ccf003a65a9a2371b4d7  nativecad-mcp-0.24.0.mcpb
9b909c0904d42e67ffdff2b80fc566db33bf3f4ba5eb611efb1b0d691e50c2c5  nativecad-mcp-0.24.0.plugin
0a673653598651a756e8c29cfb7b9745ed23be841cdc2678cd8d4a4777ae07ae  nativecad-mcp-0.24.0.tgz
ddbff515ae856b23af40afcfbb1bfab11757de16d50748d4b1c54d46ad8f3056  nativecad-kernel-0.3.2.tgz
```

**Build.** Built on CostcoPC01 (Windows) from master `ec4700313` (the release-prep commit: version bump, CHANGELOG, SBOM and the release-gate fixes), `SOURCE_DATE_EPOCH` 1792619422 (its commit time). Kernel staged with `stage-kernel.js --for-publish` (1068 files, tree `ae776b9348b9`); the `.plugin` is re-wrapped from the `.mcpb` (`build-plugin.js --from-mcpb`) and the `.tgz` is `npm pack` under the same environment. `latest.json` is signed with the host release key (`d2791510af4077e7`) and self-verified.
