# NativeCAD 0.13.0 "Rostropovich" — FEA on the public surface

**130 tools — three added since 0.12.4: `cad_fea_case`, `cad_fea_run`, `cad_modal` (CADSF-1779); nothing removed or renamed.** The CalculiX / MYSTRAN finite-element arm ships in the npm tarball and the `.mcpb` for the first time. Two release-gate defects that would have stopped this build are fixed on the way (CADSB-1237, CADSB-1238).

## The FEA tools ship (CADSF-1779)
Since CADSF-1148 the whole `fea` group was withheld from every artifact because its *preferred* solver was a partner's product. 0.13.0 splits it:

- **Public `fea`** — `cad_fea_case` (the case contract: body, boundary conditions, material presets or SI values, body loads, static or modal solve, tessellation and provenance blocks), `cad_fea_run` (writes the C3D10 deck, runs `ccx`, reads the `.frd` back into `results.json`), `cad_modal` (eigenpairs, free-free or restrained, with the rotor block for centrifugal prestress and Campbell sweeps). `ops/feaCalculix.js`, `ops/feaNastran.js` and the `CaeExporter` `.inp` / `.nas` writers travel with them. docs/AGENT_FEA_LOOP.md's five-call design loop and `tools/design_loop.js --instance bracket_fea` run from a plain install with `ccx` on PATH — no `--private`, no env var.
- **Private blade qualification** — `cad_blade_qualify` and the partner-solver adapter stay behind the CADSF-1148 gate, pending the commercial agreement. On a public boot `cad_server_info.privateGroups` no longer names `fea`.
- `cad_fea_run.solver` is a free string, not an enum: `"auto"` (default — every registered solver adapter in order, then CalculiX), `"calculix"`, or a registered adapter's name. A name this build does not know is `E_INVALID_ARGS` with `details.reason: "solver_unknown"` and `details.available`. Never a silent substitution.
- `solver_missing` hints name the CalculiX install routes (apt / brew / conda-forge / `CADSOLVER_CCX`).

## Two release gates, fixed (CADSB-1237, CADSB-1238)
- The packager's dynamic-require scan matched any identifier that merely ended in `require`; the wave-3 landing's `Tolerance.js` guard `_require(scope, fn)` tripped it and no release build after 4d5c4097 could produce a bundle. The scan now matches only the loader's own `require(` (CADSB-1237).
- With the three FEA tools public, `tools/list` was 354 KB against the CADSF-1170 340 KiB line. `cad_fea_case` now publishes its rotor block by reference (the full shape is on `cad_modal`, the tool a rotor belongs to; `ops/feaCase.js` validates every field either way), `fatigueCorrection` is one `additionalProperties` shape, and the two schema-heavy tools take the registry's 25 B field budget — 350.9 KB. The total line is rebased to 360 KiB at 130 tools (the per-tool average is *down*, 3813 → ~2700 B); the 400 KiB absolute ceiling is unchanged (CADSB-1238).

## Also on the surface since 0.12.4
- `CADSOLVER_TOOLSET=full|core+expand|verb-payload` is enforced at listing and dispatch (`E_TOOL_NOT_AVAILABLE`; `cad_help` opens a tool for the session) — CADSF-1639.
- `packages/mcp/server.json` for the official MCP registry, with a version-drift gate — CADSF-1662.
- The journal keeps per-client call lines and pending slots; `restoreDocument` claims the default document only on crash restore; `of:"all"` is scoped to the caller — CADSF-1573.
- ADR-22 descopes the cross-solver MODAL agreement band (no second modal path exists to agree with) — CADSF-1574.
- Live-body quotes no longer throw into `file_unavailable` (`ops/quotePipe.js` deterministic epoch) — CADSB-1209.
- `cad_fastener_audit` names stated-but-unmodelled fixings (`unfastened[]`) — CADSF-1576.

## Kernel
- A third equal-radius cylinder onto a cylinder tee stays analytic — 20 faces where the general engine gave 2135 planar ones (CADSB-1187); `imprint()`'s hull-trim reads the region polygon from the same chart it tests, so a filleted tee tiles closed and unions (CADSB-1186).
- Blend overflow policy — `spec.overflowPolicy` default / keep-edge / keep-surface / notch, full-round refused at exact tangency (CADSF-1610); whole-selection blend-network classification behind `CADSOLVER_BLEND_NETWORK=1` (CADSF-1609).
- `meshBool` carries measured source-face provenance (CADSB-1068); a rim band whose outer loop doubles back is cut into monotone pieces instead of sorted through (CADSB-1195); the STEP round trip's collinear-sliver guard no longer culls at 4× the document tolerance (CADSB-1189).
- Parasolid: every XT cone was imported as its mirror image — the axis sign in case 52 is corrected over 79 corpus cone faces (CADSB-1154).
- `ops/faceMerge.js` statistical cylinder fit and hole loops as `FACE_BOUND` — the VSV vane recovers 4/4 cylinders, was 2 (CADSB-710).
- `cad_revolve_feature` keeps its authored loop on the document (CADSF-1689); bored shafts build and keyways read off the B-rep (CADSF-1690/1691).
- `Tolerance.js`: one branded tolerance scope minted by `scopeOfSolid` / `scopeOfPoints`, one producer for `rho()` / `tol()` (CADSF-1655).

## Known reds carried
Two `packages/mcp` test files were already red at 0.12.4 and are red here, neither touching a shipped behaviour: `cadsf-1296.test.js` (the blade-qualification fixture predates the CADSB-857 `rotor.vaneCount` requirement — private group) and `cadsf-1448.test.js` (a `modeCount` description regex written for the 100 B field budget CADSB-1038 lowered to 50). Both are on the board.

## Gates
bundle-smoke over stdio on the shipped `.mcpb` (initialize 0.13.0, tools/list 130, cad_server_info staged git 57623dcc, licence gate) · package.test.js 224 · cadsf-1148 58/58 · cadsf-1285 57/57 · schema-sync 481/481 · tool-list-budget 24/24 · cadsf-1662 19/19 · smoke / scenario-f / scenario-g on the staged tree 105 + 27 + 20 · `dist/server.min.js` sha256 `5a7a91b5…` identical in the tgz and the `.mcpb`.

**Downloads are served from featureboard.ai** (see `latest.json` for bytes + sha256):
https://featureboard.ai/nativecad/releases/nativecad-mcp-0.13.0.mcpb
Staged kernel: git 57623dcc, tree 094f527fb5fd, 367 files. Built from a detached worktree of 57623dcc with `SOURCE_DATE_EPOCH` pinned to its commit time, esbuild 0.28.1.
