v2.18.1 — Maintenance
Patch release closing the v2.18.1 maintenance window plus spec-hygiene cleanup.
🔒 Security
npm audit fix→ 0 vulnerabilities (ajv, fast-uri, fast-xml-parser, minimatch, flatted, picomatch, brace-expansion); no--force, all within semver ranges.
📄 Fixed
\printanswersshort-answer differentiation —LaTeXFormatter.formatShortAnswer()now wraps the model answer in the exam class's\begin{solution}environment, so a short-answer-only exam's answer key reveals answers when\printanswersis uncommented (previously emitted only blank writing space).
🧹 Changed
- Gated
npm run lintin CI (was ungated) + cleared 22 pre-existing ESLint errors — behavior-preserving. - De-flaked the
ai-providerrate-limit timing assertion (wall-clock vs monotonic-clock skew under parallel CI load).
📝 Docs
- Normalized status markers on 11 shipped specs to
Implemented (vX.Y.Z), relocated the validate-r spec intodocs/specs/, added a spec close-out step to the release checklist, and parked the rich-exam v1 acceptance gaps as.STATUSbacklog.
Tests: 3,405 (3,268 Jest + 137 node:test), 143 suites.
Full changelog: v2.18.0...v2.18.1