# NativeCAD 0.9.0 "Hogwood" — Claude Desktop installs work again, x_t speaks Parasolid's units, and a hung op is refused by name

**105 tools, nothing removed or renamed — every 0.8.0 call keeps working.**
Two conventions move and a caller can key off both: Parasolid (`.x_t`/`.x_b`) files are now read and written in METRES, the format's own convention (CADSB-818), and a kernel op that hangs is cancelled and refused `E_TIMEOUT` instead of taking the session with it (CADSF-1272). Read "Behaviour changes" before keying off either.

## Packaging — the 0.8.0 release blockers under Claude Desktop
- **CADSB-825** — every tessellating tool on the installed 0.8.0 `.mcpb` (`cad_preview_body`, `cad_tessellate`, exports) died with `E_KERNEL_CRASHED` — "the kernel worker exited (code 1)". Under Claude Desktop's Electron UtilityProcess the worker located the bundle from `require.main`, which is Electron's own bootstrap script. The bundle now records its own path and the worker trusts it first.
- **CADSB-828** — the first call after every restart replayed the WHOLE op journal in-process (109 s on a 25-document journal) and timed out at Claude's 60 s. Boot now only indexes the journal; a document is replayed by the first call that references it, and only the last two boots are restorable. Same journal after: `cad_server_info` 194 ms, `cad_box` 68 ms.
- Both went out early as the unofficial `nativecad-mcp-0.8.0-hotfix2.mcpb`; 0.9.0 is the release that carries them.

## Behaviour changes
- **x_t / x_b are metres (CADSB-818).** Parasolid's convention is one unit = one metre, and every vendor transmit in the corpus agrees. `cad_export` scales mm→m on the way out and a bare `.x_t`/`.x_b` `cad_import` defaults to `units: 'm'` (pass `units: 'mm'` to read a legacy unscaled export). A same-kernel round trip is unit-neutral by construction.
- **`E_TIMEOUT` by name (CADSF-1272).** A non-cooperative kernel loop (blend/loft/sweep/tessellation) that outlives its tool family's ceiling is cancelled on the worker and refused `E_TIMEOUT` with the document rolled back; the session stays up. Opt-in follow-up **CADSF-1274** (`CADSOLVER_MCP_WRITE_WORKER=1`, off by default): the write path acts on the worker's verdict instead of replaying the op on the protocol thread.
- **`cad_fit_surface` (CADSF-958).** Degenerate clouds now REFUSE instead of fitting a sliver; every refusal carries a `reasonCode`; a fit can be trimmed.
- **`cad_thicken` (CADSF-955).** `thicken_edge_not_straight` is retired — a planar sheet with a circular or B-spline rim thickens.

## Fixes
- **Chamfer** — a corner where more than three picked edges meet builds (CADSF-1037); a mitred corner no longer needs square dihedrals (CADSF-1041); the selective chamfer runs out at a reflex in-face corner instead of refusing (CADSB-779).
- **Blend** — a blanket fillet no longer returns a self-intersecting body when two bands meet on one face (CADSB-735).
- **Faces & tessellation** — periodic faces whose period is closed by an inner bound split instead of refusing `curved_seam_wrap` (CADSB-808); watertight repair closes the last open rim quads with a Steiner centroid fan (CADSB-796); the untrimmed fillet-runout band no longer needs the ring-centroid fan at all (CADSF-1056 edge-first boundary sampling, CADSB-736 provenance welding).
- **Parasolid import** — "coarse but located" intersection charts are accepted, rational vertices are read homogeneous, fin SP-curves sample over their own window (CADSB-810); SolidWorks multi-body exports open — ASSEMBLY / INSTANCE / TRANSFORM roots are read (CADSF-1277, CADSB-805).
- **glTF** — 4-byte-aligned quantized vertex attributes are the default and the poster renderer honours `bufferView.byteStride` (CADSF-1256).
- **Booleans** — a union whose operands share no volume is refused again by default, `non_connected_result` (CADSB-829); subtract/intersect keep the multi-lump default.

## Showcases shipped with this release
- **Turbogenerator** — the exploded view is a hemisphere and the engine is bolted down: 16 M24 hold-downs from one HOLD definition (CADSB-813, CADSB-814).
- **Boom sprint-core** — four independent reconstructions from the 2026-09-07 frames (CADSF-1299).

## Known — filed, not hidden
- `test:mcp`'s dev-stage closure gate (`stage-kernel --check`, pinned by `package.test.js` and `cadsf-1148.test.js`) is red on master: CADSF-1296's `ops/bladeQualify.js` uses `require(path.join(ROOT, …))`, which the static closure refuses, and `tools/fea/blade_report.js` requires bare `puppeteer`. The FEA group is PRIVATE and excluded from this artifact, so the published bundle is unaffected; the gate needs a ticket.
- The scheduled fuzz / robustness runs still warn that `CADSOLVER_CORPUS_URL` is unset (CADSB-819 made that non-fatal); the corpus operand kind runs once the secret exists.

**Downloads are served from featureboard.ai** (see `latest.json` for bytes + sha256):
https://featureboard.ai/nativecad/releases/nativecad-mcp-0.9.0.mcpb
Staged kernel: git b52b7310, tree c54a4da1092e.
