[1.10.3] — 2026-05-12
Closes 7 of the 11 v1.10.0 QA findings (F-001, F-010 minimal, F-011 minimal, F-013, F-014, F-015, F-019). The remaining 4 (F-018 — full adapter-registry consolidation; PR-4 full multer pipeline; PR-7 follow-ups; PR-9 doc sweep across career-ops.org docs) are deferred to v1.11.0.
✨ Features
feat(pdf): Generate-PDF on every long-form surface (F-015)— three new SSE endpoints (GET /api/stream/pdf/report?slug=,GET /api/stream/pdf/deep?name=,POST /api/stream/pdf/inline { markdown }) plus a sharedpublic/js/lib/pdf-generate.jshelper. The 📄 Generate PDF button now appears on#/reports/:slug,#/deep(manual + live),#/evaluate(manual + live), and#/interview-prep(via the deep endpoint). Each kind reuses the v1.10.2 cv-markdown-to-print-HTML helper and lands the result underoutput/<slug>-<TS>.pdfso the existing auto-download flow takes over.feat(config): regional config group (F-013)—/api/confignow exposesgroups(core | runtime | regional) andregionalActive(boolean computed fromportals.yml::russian_portals.sources). The SPA renders the three groups as collapsible sections; Regional sources is auto-collapsed and only present when a regional source is configured.
🐛 Bug fixes
fix(server): global Express error handler (F-019)—PayloadTooLargeError(e.g. an 11 MB upload to/api/cv/import) andSyntaxErrorfromexpress.jsonnow return JSON envelopes the SPA can localize (HTTP 413 / 400). Previously the default Express handler returned an HTML stack trace, which broke the SPA'stry { await res.json() }.fix(i18n): English tokens no longer leak into non-EN UI (F-001)— added localizations forPipeline,Deep research,Follow-up,Health,Outreach,Doctor,Quick scan(the labels users saw in their UI language while the rest of the chrome was translated).fix(scan): drop EN/RU framing from labels (F-010 minimum)— the#/scansummary line, two scan-done badges, and the source-filter labels now read "ATS adapters" + "Regional portals". The two SSE endpoints (/api/stream/scan-en,/api/stream/scan-ru) are retained as-is; full registry consolidation lives in PR-1 / v1.11.0.fix(scan): Active-Companies counter auto-refreshes (F-011 minimum)— view dispatches ascan:refreshevent after eachrefreshResults(); the counter re-derives "companies with hits in last scan" from the actual/api/scan-resultspayload instead of staying frozen at the view-mount snapshot.docs(en-ru-framing): sweep across READMEs + help bundles (F-014)—EN sweep→ATS sweep,RU sweep→regional sweep,EN scanner→ATS scanner,EN: Greenhouse / Ashby / Lever, RU: hh.ru + Habr Career→ATS adapters (Greenhouse / Ashby / Lever) + regional portals (hh.ru / Habr Career). TouchesREADME.md,README.ru.md,README.ja.md,README.ko-KR.md,docs/help/en.md,docs/help/es.md,docs/help/pt-BR.md.
🧪 Tests
- New
tests/global-error-handler.test.mjs(2 cases): malformed JSON → 400 JSON; 11 MB upload → 413 JSON. - New
tests/config-groups.test.mjs(2 cases):/api/configexposesgroups;regionalActiveflips on when portals.yml gains a regional source. - New
tests/pdf-extra-routes.test.mjs(5 cases): each of/report,/deep,/inlineinvokesgenerate-pdf.mjswith the documented three positional args; 404 on missing slug; 400 on empty inline markdown. - Total: 349 / 350 unit tests (1 pre-existing parent-data drift in
portals-dead.test.mjs). - Coverage: 94.59 % line / 84.16 % branch.
- 20 / 20 smoke E2E, 23 / 23 comprehensive E2E, 28 / 28 Playwright.
📝 Docs
docs/reviews/REVIEW-2026-05-12-v1.10.3.md— session context + scope-out list.- All 8 READMEs: badge bumps (tests 340 → 349, release v1.10.2 → v1.10.3), "What's new in v1.10.3" section per locale.
- All 8 CHANGELOGs receive this entry.
Out of scope (deferred to v1.11.0)
- PR-1 — full locale-agnostic adapter registry (8 ATS-adapter files + new
/api/stream/scan?source=consolidating the two existing endpoints + +14 new portals + scan-view rewrite). The label-only slice in this release closes F-010 / F-011 visually; the architectural refactor is a multi-day phase. - PR-4 — multer-based CV import pipeline (replaces the v1.10.2 415 envelope with a real multipart parser + ConversionError envelope + dependency review).
- PR-9 — full career-ops.org docs integration: fetch career-ops.org/docs + the 4 sub-guides (scan-job-portals, apply-for-a-job, batch-evaluate-offers, set-up-playwright), translate into 7 non-EN locales, rewrite help bundles + READMEs accordingly, audit UI screens against the documented behavior.