# NativeCAD 0.26.0 "Graf" — no extra body after a curved boolean, CATIA V5 parts as exact solids, Creo assemblies, STEP pcurves

**185 tools, the same as 0.25.0. The command schema stays at 1.68.0.** Two optional fields were added without a version move (`import` `exactBrep`, `dfm_check` `machiningStockMm`), so every 1.68.0 document validates unchanged. Installs on 0.17.2 and later pick this release up through the self-update.

* **Fixed: an extra body in exports after a curved boolean (0.24.0 and 0.25.0).** After a general-engine union, subtract or intersect, the identity check's faceted complement could stay a live solid, and STEP, 3MF, GLB and mesh-payload exports wrote it as a second body. A sphere r16 minus a through-cylinder r5 exported two `MANIFOLD_SOLID_BREP`; it now exports one. The published solid is unchanged. A session saved by 0.24.0 or 0.25.0 can still hold the stray body: rebuild it, or remove the body with `cad_delete_body`, before exporting again.
* **CATIA V5 `.CATPart` opens as an exact solid** when its B-rep decodes, closes and agrees with its own display mesh: 251 of the 306 ledger CATParts and 19 of 20 NIST parts (none in 0.25.0). Otherwise it opens as the display mesh, as before, with the reason on `brepSubCode`. `exactBrep:false` keeps the display mesh.
* **New and wider importers**: Creo assemblies (`.asm`) open with their components placed (216 of 369), and Creo parts read more surface types (1,400 of 1,873 open). Binary ACIS `.sab` is now an import extension, and procedural ACIS surfaces are rebuilt exactly (`.sat` 955 of 981). Rhino 2 files and mesh-only `.3dm` open (900 of 937). Older NX parts with uncompressed Parasolid open.
* **STEP export writes PCURVEs** for the boundary and interior trims of B-spline faces, so OCCT-based readers (gmsh, FreeCAD, build123d) stop re-projecting edges. Metre exports declare their tolerance in metres.
* **Metre and other declared-unit files tessellate like their millimetre twins**: five millimetre constants had been applied in model units.
* **Booleans**: butted coaxial pipe runs union exactly, a subtract carries its cut cylinder exact beside an untouched one, near-tangent sphere intersects are proven empty, and more curved trims are re-fitted as B-spline edges. The 32-plane pierce bound now refuses `pierce_plane_count`.
* **Spline lofts** handle ply-drop steps, G1 knee bulges and fading corners. Glazing cuts on a planar host use an exact prism.
* Also: `update:"now"` bypasses staging, channel and the skipped list as documented, and `cad_dfm_check` accepts `machiningStockMm`.

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

## Gates

* **stdio smoke on the shipped `.mcpb`, `.plugin` and Cursor zip** (inside `plugin/build.js`, `build-plugin.js` and `build-cursor.js`): `cadsolver 0.26.0`, tools/list 185 (Cursor surface 26), staged git `21a2199d9`, 0 fails. The licensed smokes also exercise `cad_export_body` and `cad_import`. `mcp-smoke.js` gives 185 tools on both `dist/server.min.js` and `bin/nativecad-mcp.js`.
* **`dist/server.min.js` is byte-identical in the `.tgz`, `.mcpb`, `.plugin` and Cursor zip** (sha256 `7f80664cc98ca1ad…`); `npm pack` is 9 files, no `src/`, no `kernel/`.
* **The fix, on the shipped tarball**: a sphere r16 minus a through-cylinder r5, then a STEP export, all through the MCP tools. The 0.25.0 tarball writes 2 `MANIFOLD_SOLID_BREP` (14,706.4069 and 2,447.0935 mm³); the 0.26.0 tarball writes 1 (14,706.4069 mm³).
* **Staged-kernel e2e** (`e2e/scenario-f-blend-smoke`, `e2e/scenario-g-conerim-smoke`): 27 and 20 assertions green. **Named gates**: `cadsf-1128` 35, `package` 329, `cadsf-1148` (private groups withheld) 58, `schema-sync` 596, `tool-list-budget` 32 (403,659 B public, 1,845 B headroom), `cadsf-1662` (server.json drift) 19, `mcp:sync` clean, SBOM current (328 components).
* **MCP suite**: 331 files, 15,968 assertions passed. See `docs/releases/0.26.0.md` for the four red files and the two fixed for this release.

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

```
ec3690e5edde19d43114c5cc8cc8d586c25e36d2dd9731b325d150cd98eab31b  nativecad-mcp-0.26.0.mcpb
64b45389d29896560a55dbc82b08d44d34de2dee29a6907a7f01bdfca7e51a74  nativecad-mcp-0.26.0.plugin
362ef54887603cf966ca37cde6cb4290b27bc782e4a09a0661145b12a88be3d8  nativecad-mcp-0.26.0.tgz
3aab37a24788e66d9b657577bb0c0439181af7aa732fc37d54f8bc0186cafc41  nativecad-cursor.zip
ddbff515ae856b23af40afcfbb1bfab11757de16d50748d4b1c54d46ad8f3056  nativecad-kernel-0.3.2.tgz
```

**Build.** Built on LewisCostco1 (Windows) from `21a2199d9` (master `fb9c50ee4` plus the release-prep commit: version bump, CHANGELOG, SBOM, the release-gate fixes and the version embeds), `SOURCE_DATE_EPOCH` 1793129586 (its commit time). Kernel tree `92a52490c56e` (1176 files); the `.plugin` and the Cursor zip are re-wrapped from the `.mcpb` (`--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.
