# NativeCAD 0.12.4 "Masur" — the MCP surface reports what it actually did

**127 tools — one added since 0.12.3, `cad_weld_schedule` (CADSF-1652, landed after the 0.12.3 build); nothing removed or renamed.** Four tools now say what they did rather than something adjacent to it, and the known red 0.12.2 and 0.12.3 both shipped with and named is closed.

## A partial batch comes back partial (CADSB-1016)
`cad_batch` with `stopOnError:false` returned an `ERROR` envelope on the first failure and discarded every other op's result — the one setting whose purpose is "keep going" threw away what kept going. It now returns `ok:false` carrying every op's inline `result` or `error`, plus a `skipped` entry for an op that referenced a failed op's name. `batch.test.js` 66/66.

## `cad_gap_registry` ships at all (CADSB-1018, CADSB-994)
Every `.mcpb` and `.tgz` shipped so far answered `E_PRECONDITION`: `registry.js` located `data/gaps/registry.json` through a private `__dirname` escape that no packaged layout satisfies. It goes through `kernelAsset()` now, so `stage-kernel.js` and `bundle-server.mjs` stage and embed it like every other data file — **4 verbatim assets, was 3**. The tool works in a packaged build for the first time.

## `cad_list_model_state` names consumed inputs (CADSB-1019)
Additive: `handles.retired.solid`, and a `consumed[]` of `{handle, kind, consumedBy:{op, opIndex}, stale}` — a caller can now tell a handle a boolean ate from one that never existed. `SessionStore.peekValue()` keeps a listing from warming the LRU. `cadsb-529.test.js` 55 → 75.

## An exact B-rep centroid and inertia (CADSB-1056)
`cad_mass_properties` integrates the first and second moments over the same analytic faces as CADSB-1026's exact volume: closed forms to 1e-15 on the box, the off-origin box, the cylinder, the sphere, the cone and the torus, where the tessellated inertia was 0.3–0.6 % out. Published under CADSB-1072's agreement guard with per-field `centroidSource` / `inertiaSource` / `meshCentroid` / `exactCentroidRefusal`; `volumeSource` now reaches the payload. 84 assertions.

## The known red is closed (CADSB-1134)
`cad_license`'s offline, no-network posture moves into the first sentence-and-a-half of its description, so it fits inside CADSB-1038's 420 B `tools/list` description cap. `license.test.js` is green again at 145 (201 with the gate file). **No known red is carried.**

## Kernel
- A union whose tool is contained in the base (B ⊆ A) answers as a copy of the containing operand rather than a contact refusal (CADSB-1171).
- The coplanar-continuation run-out's free end builds and the free-end/split-rail pair refuses by name: 3 of the 6 CADSB-1132 rows build, was 1 (CADSB-1158, CADSB-1169).
- The equal-radius "ear" regime (sEnd ∈ (0, R)) is analytic — 12 faces in ~25 ms where the general engine gave 907–1205 `PLANE` faces in 5–7 s (CADSB-1040).
- A union across a tangent circle is `non_connected_result` and a subtract across one is `no_material_removed`, both naming the contact; the measured shared volume is exactly 0 (CADSB-1122, CADSB-1124).
- A blend fit probe with one unreadable end no longer discards the whole pick's overruns — `LED_1812` at r = 0.045 goes dressed 24 → 28, blend-result-not-watertight 3 → 0 (CADSB-1161).
- A root fillet running out onto a cylindrical wall the body carries as several faces of one cylinder is named `blend-sel-cyl-wall-runout-split` with its census (CADSB-1168).
- Mass-property no-ops are no-ops again; `surfaceArea` comes off the same B-rep as `volume` and an inverted shell no longer reports negative area (CADSB-1179).
- `cad_sheet_fold` and `cad_sheet_box` self-gate on the `scs_bend` DFM pack they used to build past silently, with a material-independent `min_bend_radius` rule (CADSB-1025).
- The bundle-freshness hash is a function of the commit, not the host (CADSB-1184).

## Gates
bundle-smoke over stdio on the shipped `.mcpb` (initialize, tools/list 127, cad_server_info, licence gate) · cadsf-1128 35/35 · package.test.js 221 · cadsf-1148 51/51 · schema-sync 481/481 · tool-list-budget 24/24 · batch 66/66 · license 201/201 · cadsb-1018 11/11 · `dist/server.min.js` sha256 `4036500e…` identical in the tgz and the `.mcpb`. **No known red carried** — CADSB-1134 closed the one 0.12.2 and 0.12.3 both named.

**Downloads are served from featureboard.ai** (see `latest.json` for bytes + sha256):
https://featureboard.ai/nativecad/releases/nativecad-mcp-0.12.4.mcpb
Staged kernel: git 5f35ac77, tree 3d2b029990a8, 349 files. Built with `SOURCE_DATE_EPOCH` pinned from a clean `git archive` export of 5f35ac77, esbuild 0.28.1.
