[1.24.1] — 2026-05-14
Hot-fix: #/config crash on all 8 locales (G-015).
🚑 Critical hot-fix
fix(config): G-015 — replace removed Element.prototype.also call in config.js(public/js/views/config.js:371) — v1.22.0 N-2 dropped theElement.prototype.alsoglobal monkey-patch and migratedcv.jsto a free-statement pattern, but missedconfig.js. The result:#/configcrashed at first invocation on every locale withc(...).also is not a function. v1.24.1 applies the same migration pattern fromcv.js:188-201— extract the tree to aconst root = c(...), run the activation block on its own, thenreturn root;.
🛡️ CI gate
feat(ci): scripts/check-no-also-leftovers.mjs sweep— walks every file underpublic/js/views/and fails the build on any.also(call site (commented references allowed). Wired into the newnpm run test:ciscript. Future revert of the monkey-patch removal can't re-introduce the same regression silently.
🧪 Tests
test: tests/config-view-syntax.test.mjs— three guards:- parse
config.jsvianode:vm.Script(catches syntax-level regressions without needing Playwright) - assert no
.also(survives outside comments - assert the
const root = c(...)/return root;migration anchors are present
- parse
- 474 → 477 unit (+3) + 32/32 Playwright unchanged.
Verification
$ npm run test:ci
# 477 / 477
# ✓ no .also( leftovers in views/
# Browser smoke:
$ open http://127.0.0.1:4317/#/config
# → renders normally, no "is not a function" card. Every locale equivalent.Out of scope (deferred to v1.25)
- G-014, G-012, G-005, G-003 — see v1.25.0 entry below for the bundle.