v1.99.0
[1.99.0] — 2026-07-05
Portals health page (#/portals). The scanner watches a set of companies in portals.yml (tracked_companies:), and an ATS slug can quietly break — a company renames its board or moves off Greenhouse — after which that employer silently vanishes from every future scan with no error. The new Portals page lists every watched company (provider + enabled state) and, on Check portal health, HEAD/GET-probes each careers_url through the DNS-pinned safeGet (SSRF-safe, chunked concurrency) and flags the dead ones (a 404 = silently dropped). Read-only — it never writes portals.yml.
- New route
server/lib/routes/portals.mjs(POST /api/portals/health; the company list reuses the existingGET /api/portals) + viewpublic/js/views/portals.js, under the Sourcing nav group.#/portalswas promoted from a config alias to a real registered view (router alias removed). Suitetests/portals-routes.test.mjs+ updatedtests/router.test.mjs. 14 new i18n keys ×16. - Bug-reporter hardening (v1.98.0 follow-up, per review):
logbuf.js's fetch wrapper now has a.catchso network-layer failures (offline/DNS/abort — the failures a bug reporter most wants) reach the ring buffer;bug-report.js's scrubber now redacts bare/unlabelled provider keys (sk-ant-,sk-,ghp_,xoxb-,AIza…), not only labelled ones. +3 scrub assertions.
New: server/lib/routes/portals.mjs; public/js/views/portals.js.