Selective MCP tool filtering, WASM build-speed regression fix, and Haskell parity restoration. A new mcp.disabledTools config field lets you remove specific MCP tools from the schema entirely — useful for smaller-context models that don't need all 33 tools competing for the initial prompt budget. The 3.9.6 expansion of AST_TYPE_MAPS to 23 languages had a side effect of making WASM full builds re-parse every WASM-parseable file in the corpus; the per-file needsFn filter now scopes the re-parse correctly, dropping the 744-file dogfooding build from 14.0s back to 7.8s (matching the 3.9.5 baseline). A second parity fix gates astTypeMap lookups with Object.hasOwn so Haskell's constructor node type no longer walks the prototype chain to Object.prototype.constructor — restoring the Haskell resolver from 0%/0% precision/recall in 3.9.6 to 100%/33% (matching the 3.9.4 baseline). The release benchmark workflow has also been restructured: regression guards now run inside publish.yml before npm publishes, instead of after the docs PR lands, so a regression can no longer ship to npm and then fire on unrelated dev commits.
Features
- mcp: add
mcp.disabledToolsconfig to remove specific tools from the MCP schema — drops disabled tools entirely from the schema (not just rejected at runtime) so smaller-context models save initial-prompt tokens; tool names are normalized for matching (#1035)
Bug Fixes
- parity: gate
astTypeMaplookup withObject.hasOwn— Haskellconstructornodes (Left,Right,Just, …) no longer fall through toObject.prototype.constructor, which was dropping the non-cloneableObject()function intoastNodes.kindand crashing the worker boundary withfunction Object() { [native code] } could not be cloned; Haskell resolver returns to v3.9.4 baseline (precision=1.0, recall=0.333) (#1041)
Performance
- wasm: scope
ensureWasmTreesre-parse to files that actually need it —wasm-worker-entry.tsnow serializes emptyastNodesarrays (empty ≠ undefined) andensureWasmTreesaccepts an optionalneedsFnfilter so only files genuinely lacking data are re-parsed; WASM full build on the 744-file dogfooding corpus drops from 14.0s back to 7.8s, restoring the 3.9.5 baseline (#1038)
CI
- release: gate npm publish on benchmark regressions — moves the regression guard into a
pre-publish-benchmarkjob inpublish.ymlso a regression fails the publish workflow before npm sees the new version, instead of firing on unrelated dev commits after the post-publish benchmark PR lands (#1040) - bench: rename auto-generated benchmark branch prefix from
benchmark/tochore/— aligns with the localguard-git.shallow-list so post-publish benchmark PRs no longer require hook bypass when pushed from a Claude Code session (#1044)