# NativeCAD 0.23.3 "Gatti" — exact spline gears, angled features in FreeCAD, bent-pipe unions

**183 tools, one more than 0.23.2 (`cad_cast_mould`).** The command schema is unchanged (1.64.0). Installs on 0.17.2 and later pick this release up through the self-update.

The three headline fixes come from the cadbench.ai rerun of 0.23.2 (CADSF-102020).

* **Spur gears are exact B-spline solids** (CADSB-100465). The flanks are cubic B-splines in the kernel: a 50-tooth gear is 202 B-rep faces (was 2802) and its STEP file carries B-spline surfaces. The `.FCStd` export is a blank Pad, a tooth-gap sketch with 2 B-splines, a Pocket and a PolarPattern, so FreeCAD rebuilds the teeth as features.
* **Angled and face-placed features stay PartDesign features in `.FCStd`** (CADSB-100466). A face-placed `cad_hole_pattern` exports as a Hole plus a `PolarPattern` or `LinearPattern`, and a rotated box or cylinder as a sketch plus a Pad, with no `Part::Feature` snapshot.
* **The hollow bent pipe + holed flange unions work** (CADSB-100467 and its follow-up). Arcs that are pieces of one full circle share that circle's spacing, so the second flange union no longer cracks, and a parser-state leak that broke the second of two separate `cad_boolean_union` calls is fixed.
* **New tool `cad_cast_mould`** (CADSF-101870 and follow-ups): one call from a part to a printable two-half casting mould with a JSON + HTML report, with core-print seats, risers, a conformal flange, a spigot and funnel, interoperable STEP / 3MF export and a work-vs-review automation rate. `cad_dfm_check pack:"foundrylab_dmc"` adds the Foundry Lab digital-casting rules.
* Also: `cad_picogk` refuses a decimated body with non-manifold edges (CADSF-102123), and `cad_assembly_contacts` no longer reports a false bore/shaft interference (CADSB-100299, FBR-000081).

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

## Gates

* **stdio smoke on the shipped `.mcpb` and `.plugin`.** `cadsolver 0.23.3`, tools/list 183, staged git 7dd0ea1e.
* **FreeCAD 1.1.0, on `.FCStd` files exported by the shipped `.mcpb` bundle over stdio** (one `doc.recompute()`, nothing touched by hand):
  * 50-tooth module-1 spur gear with a Ø16 hub and Ø8 bore: one valid Body (Pad, Pocket, `PolarPattern` x 50, tooth-gap sketch with 2 B-splines), 205 faces, 12619.558 mm³ vs NativeCAD's 12621.484 mm³ (0.015 %);
  * the elbow (hollow bent pipe, two 8-hole flanges) built as pipe ∪ flange 1, then ∪ flange 2 in two separate `cad_boolean_union` calls (33.1 s and 53.1 s): both succeed, watertight, and FreeCAD gives one Body (AdditivePipe + 2 Pads), no `Part::Feature` or `FeatureBase`, 442393.232 mm³, equal to NativeCAD's;
  * 100 x 100 x 10 mm plate with a 6 x Ø8 bolt circle (`cad_hole_pattern`): one Body with Hole + `PolarPattern` (6), 96984.071 mm³; `cad_edit_guarded` occurrences 6 -> 8: guard pass, lossless, recomputed at 95978.761 mm³, a drop of 1005.310 mm³ = two Ø8 x 10 holes.

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

```
797ea642694cae7de43eb897d8753725246ba40050c1bd23e69d56f364338f0f  nativecad-mcp-0.23.3.mcpb
51b01db63f343bc1aba61864b311f2b8a2b18cd4207172c310e1194373e51ed7  nativecad-mcp-0.23.3.plugin
41c156b5e9a94b7fc2dc78f63311c6070bdd09bdeb0e470ffc663dbf2b7e9dee  nativecad-mcp-0.23.3.tgz
ddbff515ae856b23af40afcfbb1bfab11757de16d50748d4b1c54d46ad8f3056  nativecad-kernel-0.3.2.tgz
```

**Build.** Built in the Cowork VM from origin/master `7dd0ea1e`, with this release commit's version bump, CHANGELOG, README install line and the `ops/mouldInterop.js` literal-require fix applied, and `SOURCE_DATE_EPOCH` set to 1792389456 (that commit's time). `dist/server.min.js` (sha256 `16eeec33…`) is identical in the `.tgz`, the `.mcpb` and the `.plugin`.
