Node 26 compatibility — native-module (better-sqlite3) ABI fix + Node-major CI matrix. Restores massu on the now-default Node 26. @massu/core shipped a prebuilt better-sqlite3 binary compiled for an older NODE_MODULE_VERSION (ABI) and declared engines.node ">=20.0.0 <26.0.0"; when Homebrew's default Node became v26 (ABI 147), the native module failed to load (NODE_MODULE_VERSION 127 ... requires 147), breaking BOTH the license check and the memory database in every consumer repo — npx @massu/core@1 doctor reported UNHEALTHY. This bumps better-sqlite3 ^12.6.2 → ^12.11.1 (which ships prebuilt ABI-147 binaries for macOS/Linux/Alpine/Windows, so npx consumers with no compiler still load it) and removes the artificial <26.0.0 engines ceiling (now >=20.0.0). Verified end-to-end: the full sqlite-backed suite (2710 tests) + doctor HEALTHY on Node 26 AND Node 22 (previously-shipped ABI 127 — no regression). Patch per semver: a compatibility fix with no API change.
Fixed
- better-sqlite3 native module fails to load on Node 26 (ABI 147). Bumped
better-sqlite3to^12.11.1(prebuilt ABI-147 binaries for every consumer platform) and widenedpackages/core+@massu/adapter-rails+@massu/adapter-springengines.nodeto>=20.0.0(dropped the<26.0.0ceiling that excluded the new default Node).checkNativeModules()+checkLicenseStatus()inmassu doctornow pass on Node 26 (Status: HEALTHY). - root
npm audit→ 0 findings. Bumpedtsx^4.0.0→^4.23.0(built on patched esbuild~0.28.0) and added a rootoverridespinesbuild^0.28.1, deduping the dev/test tree onto esbuild 0.28.1 and closing GHSA-g7r4-m6w7-qqqr (esbuild dev-server file read, Windows-only; esbuild is a build/test-only dep — never in@massu/coredependenciesnor any published artifact).npm audit fixresolvedtar(GHSA-vmf3-w455-68vh, file smuggling) andvite(GHSA-v6wh-96g9-6wx3, high). All-severity closure:npm auditreports zero at repo root.
Added
- CI Node-major matrix + hard gate (structural drift-prevention, CR-46).
.github/workflows/ci.ymlnative-modulejob runs a better-sqlite3 load assertion + the full sqlite-backed suite on Node20 / 22 / 24 / 26 / latest— thelatestleg auto-tracks the newest release, so a FUTURE Node major that breaks the native-module ABI fails CI with no manual matrix edit. Fronted by a requiredNative Module Gatestatus check (.github/rulesets/main-branch.json). The class is pinned bynode-compat-drift-guard.test.ts(native load + no-<-ceiling onengines.node+ CI-guard-wired) and the ruleset allowlist mirror (ruleset-parser.ts↔ruleset-context-coverage.mjs). Closes the "single-Node CI never sees a new-major ABI break" gap that let this incident ship. Incident:docs/incidents/2026-07-05-node-26-native-module-abi.md.