Changelog

GitHub

Hver væsentlig ændring, udgivelse for udgivelse. Samme fil findes i repository'et og er oversat til alle 19 sprog.

[1.175.0] — 2026-08-13

Rettet (LOW, hærdning) — en regressionsvagt for FIND-3 SEO-beskrivelsen + en nullsikker legitimitets-strip (AI-review-opfølgning).

Rettet

  • Paritetsvagt for SEO-beskrivelsen — v1.174.0-rettelsen, der udskiftede et hard-kodet “~55” i hvert sprogs meta.desc med en register-afledt {adapters}-pladsholder, havde ingen test og kunne regressere i stilhed ved næste locale-redigering. Den nye CI-isolerede tests/site-meta-desc-parity.test.mjs fejler, hvis en af de 17 site/src/i18n/*.json mister pladsholderen eller hard-koder et antal igen, eller hvis Landing.astro holder op med at interpolere den ind i alle tre beskrivelses-metaer.
  • Nullsikker legitimitets-strip — stripEmphasis returnerer '' for et nullish-input i stedet for strengen “undefined” (felterne er streng-initialiserede, så det er forsvar i dybden).

Noter

  • Test + en enkeltlinjes vagt i parseren; ingen ændring af rute / CSP / SSRF / forælderskrivning. Tests: tests/site-meta-desc-parity.test.mjs (+3). Suite: 2451 (+3).

[1.174.0] — 2026-08-13

Rettet (HIGH, rapporter) — lokaliserede rapporter viste “Score not detected”; SEO-beskrivelsen var forældet.

Rettet

  • Score-parsing (FIND-1) — en ikke-engelsk rapport, hvis H1 indeholder score-etikettens ord (# Оценка вакансии: <titel>), forveksler ikke længere den titel med scoren. parseReportHeader forankrer nu på den lokaliserede fede etiket (**Оценка:** 1.5 / 5), springer overskriftslinjer over og kræver etiketten lige før dens kolon — så RU-rapporter, der viste “Score not detected”, viser deres rigtige score.
  • Legitimitets-chip (FIND-2) — Markdown-fremhævning fjernes fra værdien, så chippen viser “High Confidence” og ikke “** High Confidence”.
  • Score-overløb — en score-linje med efterhængt statustekst (“1.8, Status: Evaluated, …”) komprimeres til kun scoren; .score-pill får en no-wrap/overflow-grænse, og kortets titelkolonne kan skrumpe, så en farvet chip aldrig løber ud over kortkanten.
  • SEO-beskrivelse (FIND-3) — cvstart.org’s meta / OG / Twitter-beskrivelser (alle 17 sprog) hard-kodede “Scan ~55 job boards”, mens brødteksten talte det rigtige register (“~75”). Beskrivelsen indsætter nu det register-afledte antal, så den ikke driver igen.

Noter

  • Server-parser + klient-render/CSS + site-i18n; ingen ændring af rute / CSP / SSRF / forælderskrivning. Tests: tests/report-header-locale.test.mjs (+4). Suite: 2448 (+4).

[1.173.0] — 2026-08-13

Tilføjet (LOW, konfiguration) — Hermes føjes til listen over registrerede AI-CLI’er (career-ops-paritet).

Tilføjet

  • Fanen #/config → “AI CLI-værktøjer” registrerer nu Hermes (Nous Research), forældreprojektets nyligt understøttede agent-runtime (binær hermes). Den faste tilladelsesliste i server/lib/routes/cli-detect.mjs vokser fra 10 til 11 værktøjer; registrering forbliver en skrivebeskyttet PATH-scanning (ingen binær køres nogensinde).

Noter

  • Ingen ændring af i18n / rute / CSP / SSRF / forælderskrivning; listen er fast, aldrig input. Suite: 2444 (cli-detect-kanariefuglen opdateret 10 → 11).

[1.172.0] — 2026-08-13

Rettet (MEDIUM, scanner) — en misdannet HTML-entitet kunne få en scanningskilde til at gå ned (career-ops #2150-paritet).

Rettet

  • Kilderne oraclecloud, gem og dassault afkodede numeriske HTML-entiteter med en svag Number.isFinite-kontrol før String.fromCodePoint — en reference over 0x10FFFF (f.eks. &#99999999; fra et misdannet eller fjendtligt feed) kastede en ufanget RangeError og afbrød hele parsningen af den kilde. Et delt modul server/lib/html-entities.mjs (spejler forældreprojektets _html-entities.mjs) begrænser nu numeriske referencer til XML 1.0 §2.2 Char-sættet, så String.fromCodePoint aldrig kan kaste, og matcher hex og decimal separat, så &#1a2; ikke længere fejltolkes. De tre kilder importerer det.

Noter

  • Ingen ændring for gyldige feeds; ingen ændring af JS / i18n / rute / CSP / SSRF / forælderskrivning. Konsolidering af de resterende ~20 dekoder-kopier i kilderne spores i qa/PARENT-SYNC-WORKLIST-v1.26.0.md.
  • Tests: tests/html-entities.test.mjs (+7). Suite: 2444 (+7).

[1.171.0] — 2026-08-13

Ændret (LAV, design-system) — typeskala + z-index-lag-tokens (D-4, første trin). Størrelser og stabling var literaler pr. komponent.

Ændret

  • z-index-lag — indførte --z-*-tokens (--z-topbar … --z-skiplink) og migrerede hver z-index-literal. Værdier bevaret, stabling identisk; en ny kanariefugl forbyder nye magiske tal.
  • Typeskala — --font-size-*-rampe (xs 11 … 2xl 28, base = Inter 15px); migrerede kerne-størrelserne (ingen visuel ændring). Værdier uden for rampen migreres gradvist (docs/UX-ROADMAP.md).

Noter

  • Kun CSS-token; ingen ændring af adfærd/JS/i18n/rute/CSP/SSRF/skrivning. Ingen pixel-ændring. tests/design-tokens-scale.test.mjs (+3). Suite: 2437 (+3).

[1.170.0] — 2026-08-13

Tilføjet (LAV) — ærlige ETA-hints på lange AI-genereringer (P4-ETA). Tunge genereringer (karriereplan ~40 s, orientering / marked / netværk ~30 s, two-pager ~20 s) viste blot “Genererer…” uden fornemmelse af varighed.

Tilføjet

  • Hver knap til lang generering har nu et dæmpet ⏱ ~Ns-hint ved siden af (som ETA’en på #/auto). Delt .eta-hint-stil + to generiske nøgler (common.eta ~{n}s, common.etaTitle).

Noter

  • Kun klient; ingen ændring af rute/CSP/SSRF/skrivning. +2 i18n-nøgler ×17 (snapshot 1219 → 1221). tests/generation-eta-hint.test.mjs (+2). Suite: 2434 (+2).

[1.169.0] — 2026-08-13

Tilføjet (LAV) — inline PDF-forhåndsvisning (D-5). GET /api/output/pdfs/:name tvang Content-Disposition: attachment, så selv “Åbn”-linket på #/cv downloadede i stedet for at vise.

Tilføjet

  • ?inline=1 leverer den SAMME sanerede fil med Content-Disposition: inline, til en 👁 Forhåndsvisning i en ny fane; standard er stadig download. Ingen ny rute; samme navne-guards.
  • Første knap i PDF-listen på #/cv er nu 👁 Forhåndsvisning ved siden af ⬇ Download. cv.openPdf “Åbn” → “Forhåndsvisning” ×17.

Noter

  • Ingen CSP/SSRF-ændring — samme sanitizePathName. Én eksisterende i18n-nøgle omformuleret ×17 (snapshot 1219). tests/output-pdfs.test.mjs (+3). Suite: 2432 (+3).

[1.168.0] — 2026-08-13

Rettet (LAV, a11y) — afkrydsningsrækker opfylder nu WCAG 2.5.8’s 24×24-minimum (D-2). Afkrydsnings-/radiolabels på #/scan, #/config, #/evaluate og #/cv-studio lå i et ~22 px-bånd.

Rettet

  • En afgrænset regel label:has(> input[type="checkbox"/"radio"]) { min-height: 24px } garanterer et ≥24 px-bånd. Kun min-height — labels er allerede flex, intet forskydes; .apply-checklist (32 px) overholdt allerede.

Noter

  • Kun CSS; ingen ændring af adfærd/JS/i18n/rute/CSP/SSRF/skrivning. tests/checkbox-target-size.test.mjs (+1). Suite: 2429 (+1).

[1.167.0] — 2026-08-13

Rettet (LAV, design-system) — hævede flader adskiller sig nu fra hårlinjer (D-3). Tokenerne --panel-2 / --surface-elev1 blev til --slate — samme værdi som hårlinjerne --line / --border — uden visuel adskillelse.

Rettet

  • Et dedikeret, tema-bevidst token --elev (#eef1f6 lys / #1e232e mørk, forskellig fra --slate i begge temaer) understøtter nu hævede flader; hårlinjerne bliver på --slate. De øvrige fund (D-2, D-4, D-5, P4-ETA) er backlog i docs/UX-ROADMAP.md.

Noter

  • Kun CSS-token; ingen ændring af adfærd/JS/i18n/rute/CSP/SSRF/skrivning. tests/elevation-token.test.mjs (+2). Suite: 2428 (+2).

[1.166.0] — 2026-08-13

Rettet (LAV) — rubrik-terminologien afspejler nu den kanoniske dokumentation. career-ops.org/docs beskriver “fem dimensioner plus en holistisk samlet score”, men web-ui, cvstart.org og wiki sagde alle “rubrik med seks dimensioner” (5 + 1 = 6, men ordvalget stemte ikke).

Rettet

  • Vedtog dokumentationens formulering — “fem dimensioner plus en holistisk samlet score” — konsistent i README ×17, cvstart.org-sitet ×17, hjælpe-guiden ×17, docs/career-ops-canonical.md og wiki (Home ×17 + Features).

Noter

  • Kun docs/marketing; ingen ændring af kode/i18n-nøgle/rute/CSP/SSRF/skrivning. tests/rubric-terminology.test.mjs (+2). Suite: 2426 (+2).

[1.165.0] — 2026-08-13

Rettet (LAV) — “Two-pager”-termen er nu konsistent inden for hvert sprog. På arabisk viste sidebjælken det latinske “Two-pager”, mens <h1> var fuldt lokaliseret — den eneste latinske streng i en ellers spejlvendt RTL-navigation.

Rettet

  • Beslutning håndhævet: pr. sprog er nav.twoPager og twoPager.title enige om termen (begge latin eller begge lokaliseret). Kun arabisk var splittet; dets nav-etiket er nu lokaliseret (“الصفحتان”). En ny kanariefugl fejler, hvis et sprog igen splitter dem.

Noter

  • Kun tekst; ingen ændring af rute/CSP/SSRF/skrivning. Én i18n-værdi ændret (ar); ingen nye nøgler (snapshot 1219). tests/two-pager-term-consistency.test.mjs (+2). Suite: 2424 (+2).

[1.164.0] — 2026-08-13

Rettet (LAV) — søgefeltets placeholder løber ikke længere over på noget sprog. “Find a company, role or URL…” blev beskåret (nowrap), når søgefeltet skrumpede; “…or URL”-halvdelen var aldrig synlig.

Rettet

  • top.search (×17) er nu den korte “Søg eller indsæt URL” (≤24 tegn på hvert sprog), passer selv i et smalt felt og bevarer URL-henvisningen. Fallback i index.html matcher; aria-label bevarer den fulde detalje.

Noter

  • Kun tekst; ingen ændring af rute/CSP/SSRF/skrivning. Én eksisterende i18n-nøgle omformuleret ×17 (ingen nye; snapshot 1219). tests/search-placeholder-fit.test.mjs (+2). Suite: 2422 (+2).

[1.163.0] — 2026-08-13

Rettet (LAV) — den indbyggede “Spørg dokumentationen”-assistent dækker nu eksport af en rapport til PDF. Den svarede, at guiden ikke dækkede det, selvom #/reports/:slug har en fungerende 📄 Generate PDF-knap.

Rettet

  • Tilføjet en H3 “Eksportér en rapport til PDF” under §10 Rapporter i alle 17 hjælpe-bundter (hvor knappen er, filen lander i output/*.pdf, kræver Playwright, gennemgå før afsendelse). Assistentens søgning viser nu Rapporter-sektionen.

Noter

  • Kun docs/hjælp; ingen ændring af kode/rute/CSP/SSRF/skrivning. Hjælpe-gate 112 → 113 H3 (31 H2 uændret). tests/help-reports-pdf-section.test.mjs (+2). Suite: 2420 (+2).

[1.162.0] — 2026-08-13

Rettet (MELLEM) — hjælpe-“?” er nu et ≥24×24 pegemål (WCAG 2.5.8). .help-hint var 18×18 px med padding:0, under minimum, på hver overskrift.

Rettet

  • .help-hint-boksen er nu 24×24 (det målbare mål), mens den synlige ring forbliver 18px — tegnet af et centreret ::before, så glyffen og <h1>-grundlinjen er uændret. Hover/aktiv/fokus følger ringen; margin 6→3px bevarer afstanden.

Noter

  • Kun CSS; ingen ændring af JS/i18n/rute/CSP/SSRF/skrivning. tests/help-hint-target-size.test.mjs (+2). Suite: 2418 (+2).

[1.161.0] — 2026-08-13

Rettet (MELLEM) — #/reports viser en “Score ikke fundet”-chip i stedet for tomt felt. Efter den sprogbevidste parser i v1.159.0 viste en rapport uden læsbar score et tomt område — umuligt at skelne fra en fejl.

Rettet

  • Score-cellen forgrener nu: score → tone-pille; ingen score → dæmpet .score-muted-chip (“Score ikke fundet”, ×17) med tooltip “Åbn rapporten…”. Kortet forbliver et tastatur-betjenbart role="link", og datoen vises.
  • Genbruger det eksisterende neutrale token; ingen ny farve.

Noter

  • Kun klient; ingen ændring af rute/CSP/SSRF/skrivning. +2 i18n-nøgler ×17 (snapshot 1217 → 1219). Suite: 2416 (+3).

[1.160.0] — 2026-08-13

Rettet (HØJ) — udbydertekst modsiger ikke længere løftet om 7 udbydere. #/config sagde, at live-evalueringen “bruger din Anthropic- eller Gemini-nøgle”, og at OpenAI-nøglen “ikke bruges af web-UI’en”; dashboardet sagde “Anthropic-first scoring” — falsk siden 7-udbyder-kaskaden (v1.157.0).

Rettet

  • config.providerModelNote (×17): siger nu, at ⚡ live-evalueringen kører headless med en hvilken som helst af dine syv nøgler (Anthropic · Gemini · OpenAI · Qwen · OpenRouter · GitHub Models · Hermes), automatisk ordnet med fallback. Den falske OpenAI-sætning er fjernet.
  • dash.quick.evaluateSub (×17): udbyderneutral (“0–5 match-score”). Keys: N / 5 → N / 7.

Noter

  • Kun tekst; ingen ændring af rute/CSP/SSRF/skrivning. Ingen nye i18n-nøgler (snapshot 1217). Suite: 2413 (+3).

[1.159.0] — 2026-08-13

Rettet (HØJ) — rapportmetadata er ikke længere sprogafhængige. Rapporter genereret på et andet sprog end engelsk viste en tom metadatastribe på #/reports, fordi parseReportHeader kun genkendte engelske fede etiketter.

Rettet

  • parseReportHeader parser nu den sproguafhængige ## Machine Summary-YAML-blok (score: / legitimacy: / date: — samme kilde som auto-pipeline allerede læser): engelske etiketter → Machine Summary → lokaliserede etiketter (REPORT_LABELS, 17 sprog). Engelske rapporter er byte-for-byte identiske.
  • Tolerant talparsing (1.5/5, 1,5/5, 1.5 из 5, 4.5 out of 5); datoen falder tilbage til filens mtime, når teksten mangler den.

Noter

  • Kun læsning/parsing; ingen ændring af rute, CSP, SSRF eller forælder-skrivning. Ingen nye i18n-nøgler. Suite: 2410 (+8).

[1.158.0] — 2026-08-12

Rettet — to kosmetiske visningsfejl (et «?» der lækkede i fanetitlen og et forkert udbyderantal på landingssiden). Kun visning; ingen ændring af adfærd, sikkerhed eller dataflow.

Rettet

  • HelpHints «?» lækker ikke længere til document.title. Routeren udledte fanetitlen fra det rå h1.textContent, så fanen viste «Vacancy search?» i stedet for «Vacancy search». router.js::focusNewView kloner nu overskriften, fjerner .help-hint og læser derefter teksten; det synlige «?» er urørt.
  • cvstart.org viste «17 AI providers» i stedet for «7». sub()-helperen i Features.astro omskrev alle {n} til sprogantallet (17) før den kortvise substitution; {n} løses nu pr. kort (udbydere → 7, sprog → 17).

Noter

  • Ingen ændring af server, rute, CSP, SSRF eller i18n-nøgler; facts.json-form uændret. Suite: 2402 tests (+1).

[1.157.0] — 2026-08-12

Rettet — live-evals kører nu på ENHVER konfigureret udbyder, ikke kun Anthropic/Gemini. En bruger med kun OPENROUTER_API_KEY blev fejlagtigt tvunget i manuel tilstand.

Rettet

  • Årsag: et LLM_PROVIDER-pin uden nøgle (fx LLM_PROVIDER=claude fra init) endte blindt; nu falder den tilbage til auto-rækkefølgen blandt de konfigurerede udbydere (i selectActiveProvider + begge dispatch-kaskader).
  • Klient-gating (#/deep + mode-page-views) bruger nu window.ProviderStatus (/api/status/providers, alle 7) i stedet for den forældede Anthropic/Gemini-probe; omskrevne tekster (deep/eval × 17) + «Live-evals»-badge på dashboardet + config.llmProviderHint.

Noter

  • Ingen sikkerhedsændringer. Suite: 2401 tests (+5).

[1.156.0] — 2026-08-12

Refaktor — opdel scan.js under størrelsesgrænsen (P-16) + en CodeQL-rettelse. scan.js var 906 linjer; to adfærdsbevarende fabrikker blev udtrukket → 648. Fuldender view-opdelingsparret P-15/P-16.

Ændret

  • Nye scan/runner.js (scan-udførelsesmotor) og scan/filters.js (filter-tilstandsmaskine) via ctx/refs-poser; scan.js forbinder begge.

Rettet

  • CodeQL js/useless-assignment-to-local (#428) i config/tab-controller.js: let n = i; → let n;.

Noter

  • Ren refaktor, ingen adfærdsændring; 4 kildelæsende tests ompeget. Begge store views nu under 800 (P-15/P-16 færdig). Suite: 2396 tests.

[1.155.0] — 2026-08-12

Refaktor — opdel config.js under størrelsesgrænsen (P-15). config.js var 1030 linjer (over 800-grænsen); to adfærdsbevarende moduler blev udtrukket, ned til 783.

Ændret

  • Nye config/field-specs.js (feltdata + modellister) og config/tab-controller.js (fanebjælke-fabrik); config.js refererer dem, render-logik uændret.

Noter

  • Ren refaktor, ingen adfærdsændring; 6 kildelæsende tests blev ompeget. scan.js (906) forbliver som den er (allerede delvist opdelt; kernen for tæt koblet til en ren mekanisk opdeling). Suite: 2396 tests.

[1.154.0] — 2026-08-12

Ny guide — “Kør hele stakken i skyen.” career-ops har ingen egen sky/server-fortælling, så vi tilføjer en: en trin-for-trin-opskrift på at lægge det overordnede career-ops-pipeline, denne career-ops-ui-fremviser og AI-motoren (et Claude-abonnement via Claude Code, en lokal Hermes, eller API-nøgler) på en lille altid-tændt server. Leveres som Hjælp §31 på 17 sprog, et README-afsnit og en wiki-side.

Tilføjet

  • Hjælp §31 “Kør hele stakken i skyen” (× 17) — de tre dele, klargør + installer, vælg motor, og eksponer sikkert (HTTPS reverse proxy + auth + CSP/SSRF/XSS/ingen-hemmeligheder-invarianterne). Hjælpe-bundtet vokser til 31 H2 / 112 H3.
  • README — et “Kør hele stakken i skyen”-afsnit (× 17) + en Cloud-Deployment-wiki-side.

Noter

  • Kun docs — ingen rute, server eller klientændring; ingen ny i18n-nøgle. De 4 hjælpe-tests flytter til 31 H2 / 112 H3-kontrakten. Suite: 2396 tests (uændret).

[1.153.0] — 2026-08-12

Jobvite-scanneren migreret til det offentlige XML-feed (forælder-sync). Forælderen pensionerede Jobvites JSON-API (returnerer nu nul job); web-ui’s source brugte samme døde endpoint, så enhver sporet Jobvite-virksomhed scannede tomt i stilhed. Porterer forælderens fix (#2623): source’en læser nu det offentlige per-tenant XML-feed, nøglet på companyEId.

Rettet

  • Source’en kaldte det pensionerede JSON-API og returnerede nul job; den kalder nu https://app.jobvite.com/CompanyJobs/Xml.aspx?c={companyEId} og parser XML <result><job>… (CDATA + entiteter, detail-url før apply-url).

Ændret

  • companyEId-opløsning: (1) company_eid: på portalen, (2) c= fra et eksplicit api:, (3) board-side-discovery. fetchText (http-json.mjs) vedhæfter .location/.retryAfter til non-ok-fejlen (skrivebeskyttet, bagudkompatibel).

Noter

  • Sikkerhed — to hosts (jobs.jobvite.com, app.jobvite.com) fastgjort af assertJobviteUrl: kun https, streng allowlist, ingen redirect følges. companyEId er kun en ?c=-værdi; source-antal uændret.
  • Suite: 2396 tests (+4).

[1.152.0] — 2026-08-12

Hermes-udbyder — færdig kabling + docs-ajourføring. En kodegennemgang af Hermes-integrationen fra v1.151.0 fandt to reelle huller og fire fuldstændighedspunkter; alle rettet her, og hele appens LLM-udbyderliste er bragt op til de fulde syv på alle docs-flader og de 17 sprog.

Rettet

  • #/config kunne ikke tvinge Hermes — LLM_PROVIDER-dropdownen viste kun seks udbydere, så man kunne sætte HERMES_API_KEY men ikke tvinge Hermes fra UI. Nu er hermes den 8. mulighed, og en ny paritetstest forhindrer dropdownen i igen at afvige fra LLM_PROVIDERS.
  • Korte self-hosted nøgler blev afvist i stilhed — 20-tegns-gulvet i isUsableKey var kalibreret til cloud-nøgler; hasHermesKey bruger nu et lempet gulv på 8 (Hermes-docs’ eget eksempel er 19 tegn).

Ændret

  • Udbyderlisten blev normaliseret til de fulde syv i README (× 17), in-app-hjælp (× 17), config.llmProviderHint-dict (× 17) og docs/sdd; hermesChatUrl udfylder en vært uden sti; den manuelle fallback-tekst nævner Hermes.

Noter

  • Sikkerhed uændret — ingen ny rute eller SSRF/CSP-ændring; health/doctor får en HERMES_API_KEY-række.
  • Suite: 2392 tests (+2).

[1.151.0] — 2026-08-12

Hermes er nu en tilsluttet LLM-udbyder (Phase 5) — Phase 5-spiket bekræftede, at Nous Research’ Hermes har en OpenAI-kompatibel API Server (hermes gateway → POST /v1/chat/completions), så career-ops-ui kører nu live-evalueringer via en lokal Hermes præcis som OpenAI/Qwen. Sæt HERMES_API_KEY i App-indstillinger, og den træder ind i auto-rækkefølgen (sidst). Lukker roadmappens sidste åbne punkt — Phase 5, Shape A.

Tilføjet

  • Hermes LLM-udbyder (Shape A) — runHermes på den delte runOpenAICompatible-klient (server/lib/openai.mjs), i begge kaskader (llm-dispatch.mjs + routes/llm.mjs), i halen af auto-rækkefølgen + LLM_PROVIDER=hermes-pin, /api/status/providers og llm-pricing.mjs. Den når en konfigurerbar lokal base-URL (standard http://127.0.0.1:8642/v1) med Bearer-auth — det er et KONFIGURERET udbyder-endpoint (som OpenRouter/Qwen), ikke en bruger-leveret job-URL, så den rører ikke SSRF-værnet.
  • #/config-felter — HERMES_API_KEY (hemmelig) + HERMES_BASE_URL + HERMES_MODEL (standard hermes-agent), med 6 nye i18n-nøgler × 17 sprog (snapshot 1208 → 1214).

Ændret

  • Scoping-spiket er løst: docs/integrations/HERMES.md, den indbyggede hjælp §30 (× 17), README-teaseren (× 14), hermes-bridge-skillen og roadmappet går fra “planlagt / endnu ikke tilsluttet” til tilsluttet (Shape A). Shape B (et skræddersyet agent-runtime-relay) var ikke nødvendigt.

Noter

  • Sikkerhed: udbyder-fetch er et konfigureret endpoint, i samme kategori som de andre OpenAI-kompatible udbydere — ingen ny SSRF-flade, ingen CSP-/saniterings-ændring. HERMES_API_KEY er en SECRET_KEY (vises aldrig).
  • Tests (CI-isolerede, stub-transport): tests/hermes-provider.test.mjs (+5); v1.146.0-canaryen “ingen Hermes-gren” er vendt om til at bekræfte, at den ER tilsluttet; udbyder-flade-tests opdateret til 7-udbyder-rækkefølgen.
  • Suite: 2390 tests (+5).

[1.150.0] — 2026-08-12

Konsistente tomme tilstande (Phase 4-finpudsning) — hvert “endnu ikke noget her”-panel gengives nu via den ene delte .empty-stil i stedet for, at nogle visninger redeklarerer udseendet inline med et magisk 40px. Lille visuel konsistensrettelse; de tomme tilstande på #/activity, #/cv-studio, #/stats og #/usage matcher nu alle de andre (tokeniseret 48px padding + stiplet kant).

Ændret

  • #/activity, #/cv-studio, #/stats, #/usage fjernede deres inline style: { padding: '40px', textAlign: 'center', color: 'var(--foggy)' } på tomme paneler — alle tre egenskaber leveres allerede af den delte .empty-klasse (--space-7 = 48px, centreret, dæmpet, stiplet kant). Så disse fire gengives identisk med de ~25 andre .empty-paneler.
  • Legitime per-visnings-tilsidesættelser (#/dashboard width:100%, #/pipeline border:none) er urørte — kun de rent overflødige redeklarationer blev fjernet.

Noter

  • Kun oprydning i CSS-brug på klienten — ingen ændring af rute, server, i18n-nøgle eller CSS-regler (.empty-klassen er uændret); ordbogs-snapshot 1208. Verificeret i browseren (det tomme #/usage-panel beregner 48px padding + stiplet kant, 0 konsolfejl).
  • Den nye canary tests/empty-state-consistency.test.mjs holder .empty som eneste kilde til sandhed. Phase 5 (Hermes-udbyder) er fortsat blokeret.
  • Suite: 2385 tests (+2: tests/empty-state-consistency.test.mjs).

[1.149.0] — 2026-08-12

Portaler flyttet til Indstillinger (Phase 4) — #/portals ligger nu i Setup-navigationsgruppen ved siden af App-indstillinger i stedet for under Sourcing. Siden v1.144.0 er det en indstillingsflade (aktivér/deaktivér fulgte virksomheder + en ATS-sundhedsprobe), ikke en sourcing-handling — så det er der, den hører til. Kun navigationsændring; siden og dens rute er uændret.

Ændret

  • #/portals-navigationselement → Setup-gruppen (i public/index.html), placeret lige efter App-indstillinger. Fjernet fra Sourcing-gruppen (som beholder Scan / Pipeline / Auto-pipeline / Finansierede virksomheder). Ruten #/portals, visningen og nav.portals-etiketten er uændret — kun positionen i sidebjælken flyttede sig.

Noter

  • Kun navigations-markup — ingen ændring af rute, visning, i18n-nøgle eller server. Verificeret i browseren (0 konsolfejl); beskyttet af tests/portals-nav-placement.test.mjs.
  • Suite: 2383 tests (+2: tests/portals-nav-placement.test.mjs).

[1.148.0] — 2026-08-12

Klarere scan-filtre (Phase 4) — filterpanelet er nu et ryddeligt grid — filterpanelet i #/scan gik fra et ujævnt flex-wrap af stive bokse med varierende bredde til et responsivt grid, og handlingerne Anvend / Nulstil ligger nu på deres egen adskilte, højrestillede række. Samme filtre, samme adfærd — bare nemmere at læse. En designfinpudsning (uden parent-sync).

Ændret

  • #/scan-filterpanelet → responsivt grid — .scan-filters er nu display: grid med repeat(auto-fill, minmax(180px, 1fr))-kolonner og ensartede mellemrum, så de 11 mærkede filtre justeres i ryddelige kolonner ved enhver bredde i stedet for at ombrydes til en ujævn række.
  • Handlingerne Anvend / Nulstil spænder over hele gridet på deres egen række, adskilt af en tynd streg og højrestillet. Fjernede det gamle skjulte-label-trick + den indre flex-wrapper i scan.js.

Noter

  • Kun CSS + en lille DOM-oprydning — hvert filter-id (#scan-filter-*, #scan-apply) og SR.render()-forbindelsen er uændret, så Playwright-flowet er urørt. Ingen nye i18n-nøgler.
  • Verificeret i browseren (0 konsolfejl); beskyttet af tests/scan-filters-grid.test.mjs.
  • Suite: 2381 tests (+3: tests/scan-filters-grid.test.mjs).

[1.147.0] — 2026-08-12

Hermes & Telegram — det indbyggede hjælpeafsnit + cvstart.org-fladen (Phase 5b, del 2) — den anden og sidste del af Hermes-dokumentationsarbejdet: vejledningen bor nu inde i appens egen hjælpeguide på alle 17 sprog, og den indbyggede dokumentationsassistent svarer på Hermes-spørgsmål ud fra den. Stadig kun dokumentation — Hermes’ LLM-udbyder-vej forbliver planlagt / endnu ikke tilsluttet (Phase 5).

Tilføjet

  • Indbygget hjælp §30 “Hermes & Telegram” × 17 sprog — et nyt guideafsnit (hvad Hermes er + de to integrationsformer; kørsel på en cloud-server; Telegram via Hermes + reglen “hvad man IKKE skal eksponere”), tilgængeligt fra #/help. Grounding i docs-assistant / DocsFab opfanger det automatisk, da begge læser docs/help/<lang>.md.
  • cvstart.org — et link til Hermes-guiden, der peger på dokumentet på GitHub.

Ændret

  • Hjælpebundtets gate hævet 29 → 30 H2 / 105 → 108 H3 (canonical-docs-coverage, help-ui, help-ru-config-section); §30 tilføjer 3 H3.

Noter

  • Intet kalder stadig Hermes. Den nye canary tests/help-hermes-section.test.mjs sikrer, at hvert sprog har §30 med dens sprog-uafhængige ankre (docs/integrations/HERMES.md, hermes-bridge, #/help, 127.0.0.1, Telegram). Udbyderen forbliver blokeret indtil API-kontrakten fra Phase 5.
  • Dette lukker dokumentation + skill-leverancen for Phase 5b; udbyder-integrationen (Phase 5) forbliver et separat, blokeret punkt.
  • Suite: 2378 tests (+2: tests/help-hermes-section.test.mjs).

[1.146.0] — 2026-08-12

Hermes-agent + Telegram — integrationsguiden + en skill (Phase 5b, del 1) — du kan køre career-ops-ui på en cloud-server og bygge bro mellem dens events (et afsluttet scan, en ny rapport, en akut follow-up) og Telegram via en Hermes-agent fra Nous Research. Denne udgivelse leverer design- + deployment-dokumentationen og en hermes-bridge-skill; Hermes’ LLM-provider-vej er stadig planlagt / endnu ikke tilkoblet (blokeret af Phase 5’s API-kontrakt-spike). Dokumentation før kode, med vilje.

Tilføjet

  • docs/integrations/HERMES.md — det dybdegående dokument: de to integrationsformer (OpenAI-kompatibelt endpoint vs. agent-runtime), cloud-server-deployment (reverse proxy + HTTPS + systemd, den read-only parent-kontrakt på en headless boks), Telegram-via-Hermes, og en trusselsmodel-liste over “hvad man IKKE skal eksponere” (ingen CV / løn / rapportindhold / nøgler til kanalen).
  • ## Hermes agent + Telegram-teaser i README — en kort henvisning + link, i den engelske README og gengivet i de fuldt oversatte README’er for hvert sprog.
  • En hermes-bridge-skill (.claude/skills/hermes-bridge/), der operationaliserer guiden — kontrol af forudsætninger og afgrænsning (Node ≥ 18, nøgler til stede, endpointets tilgængelighed via den SSRF-sikre vej), skriver aldrig secrets til disk/logs, og afviser at opfinde et Hermes-endpoint eller hævde, at provideren er tilkoblet.
  • En Integrations-sektion i docs/architecture/OVERVIEW.md linker til guiden.

Noter

  • Intet kalder Hermes endnu. En canary-test (tests/hermes-docs.test.mjs) sikrer markørerne for ærlighed “planlagt / endnu ikke tilkoblet”, og at llm-dispatch.mjs ikke har nogen Hermes/Nous-gren — så en senere tilkobling af provideren skal opdatere dokumentationen + roadmappet i samme ændring.
  • Udskudt til v1.147.0 (Phase 5b, del 2): hjælpesektionen “Hermes & Telegram” H2 × 17 sprog i appen, samt cvstart.org’s marketingside.
  • Suite: 2376 tests (+4: tests/hermes-docs.test.mjs).

[1.145.0] — 2026-08-12

Indsigtsfulde statistikker (fortsat): et genopbyggeligt diagram — fanen “Målrolle-tendens” på #/stats har nu en Byg et diagram-widget: vælg en metrik × dimension, og det gentegnes live. En brugerønsket UX-anmodning (uden parent-sync).

Tilføjet

  • Genopbyggeligt metrik × dimension-diagram — vælg en metrik (Stillinger / Medianløn / Gennemsnitsløn) og en dimension (Efter land / Efter rolle), og søjlediagrammet gentegnes med det samme. Løn-metrikker respekterer valuta + pr. år ⇄ pr. måned-skifteren; stillinger er en simpel optælling.
  • 8 nye i18n-nøgler × 17 sprog; snapshot 1200 → 1208.

Noter

  • Verificeret i browseren (0 konsolfejl). Suite: 2372 tests (+2).

[1.144.0] — 2026-08-12

Indstillinger og filtre (Fase 4, del 1): aktivér/deaktivér fulgte portaler — du kan nu slå en overvåget virksomhed til eller fra fra #/portals, og scanneren respekterer det. En brugerønsket UX-anmodning (uden parent-sync).

Tilføjet

  • Aktivér/Deaktivér-knap per virksomhed på #/portals — ét klik slukker en portal (EN-scanneren springer allerede virksomheder med enabled: false over, så en deaktiveret portal falder ud af alle fremtidige scanninger) eller tænder den igen, med en optimistisk notifikation.
  • POST /api/portals/toggle — en eksplicit brugerskrivning, der kirurgisk og med parse-validering skifter en virksomheds enabled-flag i portals.yml (kommentarer, rækkefølge og øvrige felter bevares). 5 nye i18n-nøgler × 17 sprog; snapshot 1195 → 1200.

Noter

  • Ændringen i scanneren var nul — en-scanner.mjs filtrerer allerede enabled !== false. Suite: 2370 tests (+3).

[1.143.0] — 2026-08-12

Forståeligt (fortsat): ?-tips på de centrale arbejdsvisninger — hjælpe-? dækker nu de ni vigtigste handlingssider, på alle sprog. En brugerrapporteret UX-justering (uden parent-sync).

Tilføjet

  • ?-hjælpetip på 9 flere visningstitler — #/scan, #/evaluate, #/cv-studio, #/tracker, #/config, #/deep, #/batch, #/auto, #/apply får et indlejret ? (via HelpHint.title), der åbner en lokaliseret “hvad den gør / hvordan man bruger den / hvad man kan forvente”-popover — samme CSP-sikre komponent som i v1.139.0.
  • 9 nye i18n-nøgler × 17 sprog (help.hint.scan/…/apply); snapshot 1186 → 1195.

Noter

  • Verificeret i browseren (0 konsolfejl). Suite: 2365 tests (+1).

[1.142.0] — 2026-08-12

Rettelse: ikke flere “Unknown” karrierearketyper — #/orientation rangerer nu altid blandt de otte navngivne karrierevektorer i stedet for nogle gange at svare “Unknown” og anbefale, at du “satser mere” på den. En brugerrapporteret rettelse (uden parent-sync).

Rettet

  • #/orientation — AI-prompten forbyder nu en arketype uden for sættet. Modellen SKAL rangere top 3 blandt præcis de otte navngivne vektorer og må aldrig svare “Unknown”/“N/A”/“utilstrækkelige data” eller opfinde en etiket. Ved et tyndt CV navngiver den stadig de tre nærmeste med lavere tillid og siger, hvilken evidens der mangler.

Noter

  • Kun ændring af serverprompt (buildOrientationPrompt); ingen i18n-/skemaændring. Suite: 2364 tests (+1).

[1.141.0] — 2026-08-12

Indsigtsfulde statistikker (fortsat): berigelse af finansierede virksomheder — #/funded er nu mere visuel: virksomhedslogoer, et diagram efter finansieringsbeløb og kort med runde / beløb / opdagelsesscore / foreslået handling. En brugerrapporteret UX-justering (uden parent-sync).

Ændret

  • #/funded — flad tabel → kortgitter. Hver nyligt finansieret virksomhed er nu et kort med et logo (udledt af navnet via CompanyLogo, bogstavavatar som reserve), runde- + beløb-chips, forældreprojektets opdagelsesscore og foreslåede handling samt link og dato for finansieringsnyheden.
  • Visualisering af finansieringsbeløb — et vandret søjlediagram over de største virksomheder efter oplyst beløb; fritekstbeløb (“$120M”/“€1.5B”) parses til en størrelse med et nyt parseAmount. 3 nye i18n-nøgler × 17 sprog.

Noter

  • Stadig skrivebeskyttet over GET /api/company-funded; beskrivelse og lønramme findes ikke i finansieringskilden. Suite: 2363 tests (+2).

[1.140.0] — 2026-08-12

Indsigtsfulde statistikker: rigere løntal — lønopdelingen i “Min pipeline” på #/stats viser nu gennemsnittet (ikke kun medianen), en pr. år ⇄ pr. måned-skifter og en min · gns · median · maks-tabel pr. land. Første del af Fase 3. En brugerrapporteret UX-justering (uden parent-sync).

Tilføjet

  • Gennemsnitsløn — RoleStats.salaryStats returnerer nu avgUsd ved siden af minUsd/medianUsd/maxUsd. Medianen modstår outliers, gennemsnittet afslører skævhed — sammen læses de som en fordeling.
  • Pr. år ⇄ pr. måned-skifter og en min · gns · median · maks-tabel pr. land i lønsektionen, styret af valuta- og periodevælgerne. 8 nye i18n-nøgler × 17 sprog.

Noter

  • Tallene stammer stadig kun fra opslag med læsbar løn og normaliseres til USD (vejledende). Suite: 2361 tests (+1).

[1.139.0] — 2026-08-12

Forståeligt: ? hjælpetips — en genanvendelig, CSP-sikker ?-knap, der ved klik forklarer “hvad den gør / hvordan den virker / hvad man kan forvente” på dit sprog. En brugerrapporteret UX-justering (uden parent-sync).

Tilføjet

  • ? hjælpetip-popover (window.HelpHint) — et rundt ? ved siden af en overskrift åbner en let, tema-tilpasset og RTL-spejlet popover, der viser en lokaliseret forklaring via UI.md(); tilgængelig (role="tooltip", aria-expanded, luk med Escape/klik udenfor, fokus gendannet) og CSP-sikker.
  • ? på de 5 faner i #/stats og på 8 AI-/analyse-visningstitler (career-plan, orientering, two-pager, networking, mock-interview, hukommelse, funded, ugentlig opsummering) — 14 nye i18n-nøgler × 17 sprog.

Noter

  • Alle visninger havde allerede en enkeltlinjes undertitel; ? tilføjer den dybere forklaring efter behov og gør tomme tilstande selvforklarende. Suite: 2360 tests (+4).

[1.138.0] — 2026-08-12

Generering på dit interfaces sprog — hver AI-generering svarer nu på det sprog, du har valgt i UI’et, plus review-drevne teststyrkelser. En brugerrapporteret UX-justering (uden parent-sync).

Ændret

  • AI-genereringer respekterer nu UI-sproget. Med interfacet på russisk, spansk, japansk, … kommer den genererede tekst tilbage på det sprog i stedet for altid engelsk. Output-sprogdirektivet føres gennem alle genererings-endpoints — karriereplan, orientering, markedsrapport, mock-interview, networking-plan, «spørg dokumentationen», hukommelsesnote-forslaget og two-pager-udkastet. Kode og identifikatorer forbliver engelske (fx two-pager YAML-nøgler); kun prosa, overskrifter og punkter lokaliseres.

Rettet

  • CSS-farverolle-vagt (tests/css-role-tokens.test.mjs) — en statisk kanariefugl for, at v1.137.0-mørketilstandens alias-tokens aldrig ombytter rolle: tekst-tokens (--fg/--danger/--ok/…) bruges aldrig som background, og overflade-tokens (--card/--panel/--line/…) aldrig som tekst-color, på tværs af al CSS og SPA’ens inline-styles.
  • UI.md() XSS-loaderens selvtest — testen, der loader md() fra api.js, prober nu md('<script>…') lige efter udtrækket og kaster fejl, hvis escapen mangler, så en fremtidig fejlskæring fejler højlydt i stedet for at gøre sikkerhedssuiten grøn på en afkortet funktion.
  • Scroll-vagt på #/career-plan — scrollIntoView efter generering kører kun, når forhåndsvisningen stadig er forbundet til dokumentet.

Noter

  • docs/UX-ROADMAP.md opdateret: ?-hjælpetips + sidebeskrivelser + tomme tilstande rykker til v1.139.0; en Nous Research / Hermes-udbyder — med en cloud-server + Telegram-deployment-guide og et Hermes-skill — spores som Fase 5 / 5b.
  • Suite: 2356 tests (+5).

[1.137.0] — 2026-08-11

Læsbarheds- og renderingsrettelser — mørk-tilstand-kontrast, diagramlabels og karriereplanen. En brugerrapporteret UX-gennemgang (ingen forælder-synkronisering).

Rettet

  • Hvid-på-hvid / sort-på-sort i mørk tilstand på mange skærme — femten CSS-brugeregenskaber, som flere visninger refererede til (--fg, --panel, --panel-2, --ok, --danger, --card, …), var aldrig deklareret, så de faldt tilbage til hardkodede lyse/sorte værdier: fint i lys tilstand, ulæseligt i mørk tilstand (#/pipeline-oversigtens chips, #/stats’ aktive fane, #/config’s “Aktiv / Nøgler” + “✓ sat”, #/two-pager-sektioner, #/mock-interview-spørgsmålsboblen, fejltekst). De er nu aliaset til de rigtige temabevidste tokens, så de følger temaet automatisk — 0 WCAG-AA-kontrastfejl på tværs af alle 29 visninger, verificeret af en automatiseret revisor; #/configs aktive fane er flyttet til en læsbar tonet stil (.tab-btn.is-active). En regressionsspærring (tests/dark-theme-tokens.test.mjs) holder dem aliaset.
  • #/stats-diagramlabels blev afskåret midt i et ord (“Senior Backend Engineer” → “…Enginee”) — de bliver nu elliptisk afkortet, mens den fulde label bevares som et hover-tooltip.
  • #/career-plan viste den genererede plan som rå Markdown — den gengives nu automatisk som formateret, læsbar tekst via UI.md() (den redigerbare Markdown forbliver i tekstfeltet; Forhåndsvisning skifter mellem dem).

Noter

  • #/career-plan, #/two-pager, #/stats og det ugentlige interviewsammendrag er ikke defekte — de viser tomme tilstande, indtil du genererer en plan / har data. Klarere vejledning på siden og ?-hjælpehints er planlagt som næste skridt (docs/UX-ROADMAP.md).

[1.136.0] — 2026-08-11

Paritet med forælder-projektet career-ops v1.26.x (efter v1.26.0-hovedgrenen) — én ny kilde uden godkendelse plus en bølge af kvalitets- og robusthedsporteringer til kode, som web-ui spejler. Registret rummer nu 79 kilder = 74 engelske + 5 russiske (ALL_ADAPTERS 74).

Tilføjet

  • eightfold (Eightfold AI, #2684) — opslagstavler til talentrekruttering via den godkendelsesfrie https://<tenant>.eightfold.ai/api/apply/v2/jobs-API, vært-fastgjort til *.eightfold.ai (den brandede careers.<company>.com-CNAME afvises med vilje); pagineret med et sikkerhedsloft, dødt-opslagstavle-kast og URL-dedup. Kilde + adapter + en CI-isoleret suite; optræder i #/scans Kilde-filter og på landingssiden.

Rettet

  • Unicode-bevidste dedup- og rollenøgler (#2569 / #2587 / #2667) — en ny fælles normalizeTextKey (NFKC, bevarer bogstaver/mærker/cifre fra ethvert skriftsystem) afløser de rent ASCII-baserede nøgler: detect-reposts klynger nu virksomhedsvarianter med forskellig bredde/tegnsætning (“Acme, Inc.” ≡ “Acme Inc”) og kollapser aldrig forskellige ikke-latinske arbejdsgivere, mens role-matcher folder fuldbredde-titler sammen og bevarer ikke-latinske rolle-tokens i stedet for at udslette dem.
  • fetchJsonWithRetry forsøger ikke længere igen ved en afvist omdirigering (#2657) — en redirect:'error'-vagt, der møder en 3xx, er deterministisk, så den er nu ikke-genforsøgbar og fejler hurtigt i stedet for at opbruge genforsøgsbudgettet.
  • title_filter.positive-AND-grupper (#2552) — et mellemrumsafgrænset + inden i en positiv post kræver nu, at hvert udtryk indgår i titlen, i vilkårlig rækkefølge.
  • oraclecloud accepterer de nummererede tenant-apex-domæner oraclecloud1.com … oraclecloud99.com (#2683) — en afgrænset familie (intet foranstillet nul, ≤ 2 cifre), aldrig et wildcard-apex.
  • workable hærdet (#2675) — genforsøg, browser-lignende headers og serialisering af forespørgsler mod den Cloudflare-fordelte vært.
  • personio falder tilbage til en HTML-scrape, når XML-feedet er deaktiveret, i stedet for at returnere ingenting.
  • states FALLBACK-aliasser er resynkroniseret med forælderen (#2615).

Noter

  • Ikke porteret (ikke spejlet af web-ui, eller kun CLI): reply-matcher (#2672), jd-similarity (#2661), jd-skill-gap (#2686), scan env-path (#2568) / --flag=value-parsing (#2589), samt ændringer til cover-letter / CV-skabelon / doctor / ollama / generate-pdf. De HIGH-sårbarhedsadvarsler for web-js-yaml/nanoid var allerede rettet i web-ui v1.135.0.

[1.135.0] — 2026-08-11

Paritet med forælder-projektet career-ops v1.26.0 — fem nye scan-kilder uden godkendelse plus korrektionsrettelser til fire opslagstavler, som web-ui allerede har. Registret rummer nu 78 kilder = 73 engelske + 5 russiske (ALL_ADAPTERS 73).

Tilføjet

  • Fem nye scan-kilder (hver med kilde + adapter + en CI-isoleret suite; de optræder i #/scans Kilde-filter og på cvstart.org-landingssiden):
    • join (JOIN) — en virksomheds JOIN-opslagstavle fra Next.js’ __NEXT_DATA__ på join.com/companies/<slug> (vært-fastgjort, sidebegrænset).
    • getro (Getro) — VC-“talentnetværk”-porteføljetavler via den offentlige api.getro.com POST-API, pagineret nyeste-først; hvert job tilskrives porteføljearbejdsgiveren, ikke fonden.
    • consider (Consider) — getconsider.com VC-porteføljetavler via en same-origin POST; den konfigurationsstyrede vært er fastgjort af en strukturel SSRF-vagt (kun offentlig HTTPS-vært).
    • joinup (JOINUP) — den schweiziske opslagstavle joinup.ch, som læser den SSR’ede nyeste side; fejler lukket ved et scraper-brud.
    • remotli (Remotli) — remotli.ch, fjernstillinger hos schweiziske virksomheder (CHF-lønninger); udsender arbejdsgiverens egen ATS-ansøgnings-URL, så krydslistninger deduplikeres.

Rettet

  • a16z Speedrun afbryder ikke længere hele opslagstavlen ved en forbigående fejl — sidehentninger går nu gennem en delt fetchJsonWithRetry (begrænsede genforsøg kun ved forbigående 429/5xx/timeout, aldrig en permanent 4xx), og sidebudgettet er tilpasset den 50-jobs side.
  • arbeitsagentur er flyttet til v6 Jobsuche-API’en (/pc/v6/jobs) — det gamle v4-endpoint giver 404; svarformen er omdøbt, og fjernfiltrering indsnævres nu server-side.
  • thehub er flyttet til v2 jobsandfeatured-API’en; rækker bærer ingen offentliggørelsesdato og er undtaget fra alderfilteret.
  • hackernews finder pålideligt den månedlige “Who is hiring?”-tråd ved at filtrere Algolia-opslaget til kontotagget author_whoishiring i stedet for en fritekstforespørgsel.

Noter

  • Ikke porteret (web-ui er allerede sikker, relæ-absorberet eller kun CLI): Unicode-rolle-dedup-/virksomhedsmatch-nøglerne (web-ui’s genopslags-gruppering nøgler allerede virksomheden på en almindelig små bogstaver-streng, så forskellige ikke-latinske arbejdsgivere aldrig kollapser); opfølgnings-afvisnings-forsinkelsessignalet + finansierede-virksomheder-finpudsningerne (relæet er skrivebeskyttet, fail-soft); scan-miljøoverstyrbare stier og --flag=value-parsing (web-ui kører scannerne in-process); User-Agent-konsolideringsomskrivningen (web-ui centraliserer den allerede); og kun-CLI-punkter (utroværdigt-indhold-rosteret, oferta/tilbudsforberedelse, doctor, cover-/CV-skabelonændringer).

[1.134.1] — 2026-08-05

Validering-hærdning — rettelser afdækket af en fuldstændig projektgennemgang.

Rettet

  • successfactors kasserer ikke længere hentede job ved en fejl midt i scanningen (regression i v1.134.0’s port af “dødt-opslagstavle-kaster-fejl”) — dens pagineringsloop havde ingen try/catch, så en fejl på side 2 eller senere (efter at side 1 var lykkedes) kastede en fejl og kasserede alt, hvad der allerede var indsamlet; og hvis denne fejl var en 404 (en startrow uden for området), ville en-scanner sætte en live tenant i karantæne som “død” i flere dage. Spejler nu phenom/radancy: en fejl på side 0 kaster stadig en fejl (død opslagstavle), men en fejl på en senere side bevarer de delvise resultater.
  • #/scan-facetfiltrenes chips er nu tastaturbetjenbare (WCAG 2.1.1) — facet-chippene (og “ryd”-chippen) var spans med en klik-handler, men uden tabindex/rolle, så tastatur- og skærmlæserbrugere ikke kunne nå eller aktivere dem. De bærer nu role="button", tabindex="0", aria-pressed og Enter/Space-aktivering.
  • Tre hardkodede engelske strenge er nu lokaliseret — #/scan-tillidsbadgets tooltip, #/scan-relokeringskolonnens overskrift og #/dashboard-scoreoverskriften var bare literaler, som i18n-paritetstjekket ikke kunne se (de var aldrig nøgler), så de blev stående på engelsk i alle ikke-engelske lokaliteter. Nu scan.trustTip + scan.col.reloc (2 nye nøgler) + genbrug af track.col.score, med en kildestatisk vagt.

[1.134.0] — 2026-08-05

Paritet med forælder-projektet career-ops v1.25.0.

Tilføjet

  • Ny scan-kilde: getManfred (manfred) — et boardbredt feed af spanske/EU-teknologijob med offentliggjorte lønninger, fra www.getmanfred.com/api/v2/public/offers (ingen auth, host-pinned + kun HTTPS, fuldt katalog i én enkelt forespørgsel). Kilde + adapter + en CI-isoleret suite (tests/sources-manfred.test.mjs); registret rummer nu 73 kilder = 68 engelske + 5 russiske (ALL_ADAPTERS 68). Optræder i #/scans Kilde-filter og på cvstart.org-landingssiden.

Rettet

  • a16z Speedrun-feedet blev stille afkortet til 50 job (#2404) — feedet loftbelægger en side ved 50, men kilden anmodede om PER_PAGE = 100, så pagineringen stoppede efter side 1. Rettet til 50.
  • Døde jobopslagstavler kaster nu en fejl i stedet for at blive læst som “live, men tom” (#2379) — cryptocurrencyjobs, phenom, radancy, successfactors: en hentningsfejl, hvor ingen forespørgsel nogensinde blev afsluttet, kaster nu en fejl (så #/portals-sundhedstjek og scanningen registrerer en reel fejl), i stedet for at sluge den til en tom liste; en fejl midt i scanningen efter mindst én succes bevarer de delvise resultater.
  • workable bruger nu den offentlige widget-API (#5ab8425) — skiftet til apply.workable.com/api/v1/widget/accounts/<slug>, som returnerer en stor kontos fulde opslagsliste i én enkelt forespørgsel, så store konti ikke længere afkortes.

Noter

  • Ikke porteret (kun CLI eller ikke spejlet af web-ui): detect-reposts #2389’s titel-bucketing-ydelsesomskrivning; Unicode-firmanøgle-rettelserne (web-ui’s eget tracker-dedup er allerede sikkert for ikke-latinske tegn); scan --since; cv-facts; CV-skabelon-/PDF-revisionsgennemgangen; doctor; tilstandenes direktiv for utroværdigt indhold.

[1.133.1] — 2026-08-02

Rettet

  • #/funded (Finansierede virksomheder) viser nu resultater — to fejl fik tabellen til altid at vise “ingen finansierede virksomheder”, selv når forælderens company-funded.mjs returnerede en fuld liste. (1) Visningen læste resultaterne under res.candidates, men forælderen udsender dem under companies (hver { company, amount, round, funding: { sources: [{ source, url, observed_date }] } }); klienten læser nu den korrekte nøgle og mapper den reelle evidensform. (2) Resultattabellen sendte sine celler til UI.el('tr', {}, …) som varargs, men UI.el(tag, attrs, children) forventer children som en enkelt node eller et array, så kun den første kolonne (Virksomhed) blev gengivet — cellerne sendes nu som et array. Verificeret i en rigtig browser: 11 virksomheder på tværs af de fire feeds gengives med kolonnerne Virksomhed / Finansieringssignal / Kilde / Dato og fungerende evidenslinks, ingen konsolfejl. Et tomt resultat viser nu også diagnostik pr. kilde, så en stille nyhedsdag kan skelnes fra et blokeret feed.
  • Regressionsspærringer i tests/parity-routes-v1133.test.mjs: det simulerede forælderscript udsender nu den reelle companies-outputform (den oprindelige fixture spejlede den forkerte candidates-form — hvilket er præcis grunden til, at fejlen slap igennem med grønne tests), plus kildestatiske kanariefugle for, at funded.js læser res.companies (aldrig res.candidates) og bygger tabelrækker med børn som array (+1 → 2144).

[1.133.0] — 2026-08-01

Tilføjet

  • Opdagelse af finansierede virksomheder (#/funded, forælder-paritet #2117) — en ny skrivebeskyttet visning, der videreformidler forælderens career-ops company-funded.mjs via GET /api/company-funded: en liste med fokus på gennemgang over nyligt finansierede virksomheder, fundet fra offentlige, host-pinnede finansieringsfeeds (TechCrunch, PR Newswire, The Guardian, Hacker News). Relæet kører scriptet med --json --dry-run (JSON til stdout, ingen filskrivninger), sender aldrig brugerinput videre til --sources, har rate limiting og udløses af brugeren (en Opdag-knap, aldrig ved indlæsning). Nyt rutemodul server/lib/routes/funded.mjs + public/js/views/funded.js, under Sourcing.
  • Ugentligt interviewresumé (#/interview-digest, forælder-paritet #2129/#2130) — en ny skrivebeskyttet visning, der videreformidler forælderens nul-LLM weekly-digest.mjs via GET /api/interview/weekly-digest: en mekanisk sammenfatning af interviewsessionsnoterne — hvilke virksomheder og runder du har interviewet med i denne uge, tilbagevendende kompetencer og bedst-mulige åbne huller. Det valgfrie ?from=&to=-interval sendes kun med, når BEGGE er gyldige YYYY-MM-DD; et tomt interval er et gyldigt available:true-resumé. Tilføjet til server/lib/routes/interview.mjs + public/js/views/interview-digest.js, under Analyse.
  • Begge relæer følger den etablerede fail-soft available:false-kontrakt, når forælderens script ikke er til stede (CI, standalone-installationer). 26 nye i18n-nøgler ×17 lokaliteter; CI-isoleret suite tests/parity-routes-v1133.test.mjs (+5 → 2143).

Noter

  • Forælderens career-ops er avanceret forbi v1.24.0 med Next.js web/-appens Follow-up Tracker-side (#1422) og backend-PDF-rendering (#2182) — ikke porteret: web-ui har allerede sit eget follow-up-relæ og PDF-runnere, og den underliggende followup-cadence.mjs-hærdning kommer gratis med via shell-out-relæet. set-status.mjs/tracker-utils.mjs-ændringerne er CLI-interne og spejles ikke.

[1.132.0] — 2026-07-31

Ændret

  • #/scan-resultatgengivelses-delsystemet blev udtrukket til public/js/lib/scan-results.js (afvikling af file-size-contract-gæld — public/js/views/scan.js var vokset til ~1254 LOC). Delsystemet (renderResults, buildChipRow, getRows, række-/facet-bygherrerne, valgmulighedsmalerne og FALLBACK_SOURCES-registerspejlet) blev flyttet ind i en window.ScanResults.create(ctx)-fabrik, der lukker over et kontekstobjekt, som visningen leverer. Ingen adfærdsændring — funktionerne blev flyttet ordret, og closure-variablerne blev omkoblet til ctx.*; scan.js er nu ~906 LOC (en anden udtrækningsrunde mod 800-LOC-målet er planlagt).
  • Kildestatiske tests læser begge filer via tests/helpers/scan-src.mjs::loadScanSrc(); tests/scan-fallback-sources.test.mjs læser nu registerspejlet fra scan-results.js.
  • Ny regressionsspærring i browseren — tests/playwright-scan-filters.mjs sår en foruddefineret data/last-scan.json og gennemkører hvert #/scan-filter, idet den verificerer nøjagtige rækketal (npm run test:e2e:browser); stabile filter-id’er (#scan-filter-*, #scan-apply) blev tilføjet.
  • README’s “Seneste udgivelse”-banner er skåret ned til et enkeltlinjeresumé + et link til den fulde ændringslog (den lange fortællemur på tværs af flere versioner er udfaset). Anvendt på tværs af alle 17 lokaliteter.

[1.131.2] — 2026-07-31

Ændret

  • app.css opdelt i tre ordnede stylesheets (file-size-contract-gæld — den enkelte fil var vokset til ca. 1990 LOC, langt over den hårde grænse på 800 LOC). Den er nu app.css (~672 — a11y, design-tokens/tema, sidebar, main, knapper, content-shell), components.css (~595 — kort, grids, paginator, badges, tabeller, formularer, log/konsol, markdown, sprogskifter, chip-filter, forbindelsesbanner) og overlays.css (~737 — toast, notifikationsskuffe, modal, diverse/responsivt, [dir="rtl"]-spejlingen, docs-fab, usage-hud), hver inden for den hårde grænse.
    • Snittet er sammenhængende og i rækkefølge, så cascaden er byte-for-byte identisk med filen før opdelingen; index.html indlæser de tre som ordnede <link>s. Ingen ændring af adfærd, markup eller i18n.
    • CSS-testene læser nu konkatenationen via en delt hjælper, tests/helpers/css.mjs::loadAppCss(). Den nye tests/css-modularization.test.mjs fastlåser opdelingen (filerne findes · hver ≤ 800 LOC · index.html-linkrækkefølge) → suite 2138. Verificeret i browseren: alle tre stylesheets parses, og deres regler anvendes.

[1.131.1] — 2026-07-31

Rettet

  • Host-pinning-konsistens for adapterne i de to v1.130.0-kilder (code-review-opfølgninger, forsvar-i-dybden; ingen adfærdsændring for gyldige input):
    • a16z-speedrun-talent-adapteren genvaliderer nu api:/a16z-speedrun-talent:-overskrivningen ved buildEndpoint (HTTPS + eksakt host speedrun-talent-network.com) og falder tilbage til det kanoniske feed, hvis det fejler — paritet med cryptocurrencyjobs-adapteren, så en off-host-værdi aldrig når frem til fetch-slottet (tidligere afhang det udelukkende af fetch-tids-vagten assertSpeedrunUrl). Det eksakte host-tjek er nu et enkelt eksporteret SPEEDRUN_TALENT_HOST_RE, som deles af vagten og adapteren.
    • cryptocurrencyjobs-parseren — cleanUrl bruger nu den samme eksakte host-vagt som assertCryptocurrencyJobsUrl og adapter-overskrivningen (var endsWith, som accepterede subdomæner). Parseren er aldrig mere tilladende end SSRF-vagten: et sub.cryptocurrencyjobs.co-linkelement kasseres.
    • +2 tests → suite 2135.

[1.131.0] — 2026-07-31

Tilføjet

  • #/tracker CRM-fanebladstavle (porteret fra forælderens web-apps /pipeline-visning). Trackerens funnel-chip-bar + status-dropdown erstattes af en fanebladsstrimmel: en Alle-fane plus én fane pr. kanonisk status — Evaluated · Applied · Responded · Interview · Offer · Rejected · Discarded · SKIP · Hired — hver med et live optalt tal for hele historikken, inklusive nul-tælling-stadier, så hele tragten altid er synlig (CRM-udseendet). Den aktive fane styrer filtret; et nyt klik på den rydder tilbage til Alle. Rækkerne beholder deres score-tone, legitimitet, PDF- og rapport-muligheder, og firmacellen viser nu et brandlogo, når logoer er aktiveret (fra som standard → nul ekstra forespørgsler).
    • Ny read-only rute GET /api/tracker/stages returnerer den kanoniske tragt (etiketter i rækkefølge) + et alias-foldningskort, hentet fra server/lib/states.mjs (templates/states.yml, med den indbyggede fallback) — så klienten aldrig hardkoder statuswhitelisten. Det legacy parameterløse GET /api/tracker-svar er uændret (kun { rows }).
    • Nyt rent, enhedstestet klientbibliotek public/js/lib/tracker-stages.js grupperer rækker efter serverens stadier og tolererer forvildet markdown-fed skrift og lokaliserede aliasser (fx aplicado → Applied). Fanerne er tilgængelige (role tablist/tab, aria-selected, ≥44 px hit-areal, tællinger i hver fanes tilgængelighedsnavn). Ingen nye i18n-nøgler. Suite 2133.

[1.130.0] — 2026-07-31

Tilføjet

  • To nye scan-kilder porteret fra forælderens career-ops v1.24.0 (in-process, ingen nye afhængigheder; begge optræder i #/scans Kilde-filter og på cvstart.org-landingssiden):
    • a16z Speedrun (a16z-speedrun-talent, #2231) — det boardbrede JSON-feed for a16z Speedruns talent-network. Host-pinned til speedrun-talent-network.com, kun HTTPS, 0-indekseret paginering med et sideloft, per-virksomheds q/config-threading, fail-soft.
    • Cryptocurrency Jobs (cryptocurrencyjobs) — Web3-jobboardet cryptocurrencyjobs.co, hentet via dets offentlige RSS 2.0-feed (ingen auth). To-pas XML-entitetsdekodning, kun fjernopslag (remote), arbejdsgiver parset fra titlens hale "… at <Company>".
    • Registret rummer nu i alt 72 kilder = 67 engelske + 5 russiske (ALL_ADAPTERS = 67 engelske portal-adaptere).

Rettet

  • echojobs — hybride roller forbliver adskillelige fra remote (spejler forælderens #2258). En case-insensitive hybrid-markør giver nu "<By> · Hybrid" (eller et bart Hybrid, når der ikke er nogen by) og workplaceType: 'Hybrid', i stedet for at blive kollapset til Remote.
  • radancy — legacy TalentBrew-markup + JSON-resultatfragment-transport (spejler forælderens a3e6df9), gatet af en injicerbar opts.fetchJson.

Noter

  • Ikke porteret — kun CLI-funktioner i forælderen. career-ops v1.24.0’s store CLI-/tilstandsflade forbliver uden for web-ui, som er en fremviser + tynd write-through, ikke en tilstandsvært: compliance-/jurisdiktionstabellerne, kontakt-telefonbogen + vCard, interview-transskript-debriefing/opkaldsplatform-detektion, ledger-statusskift, resultatregistrering, to-pas-triage, jd-similarity, det versionerede ansøgnings-CV-artefaktskema, doctors Playwright-MCP-detektion og portals/fix-slugs.mjs. Scan-orkestreringsændringer, der findes i forælderens scan.mjs — Interamt.de-Playwright-scanneren, iCIMS reverse-ATS-fuldsweep, land-berettigelses-remote-filteret, DNS-lookup-pacing, StepStones rltr-deduplikering og den normaliserede firmakolonne i scan-historikken — gælder ikke: web-ui kører EN/RU-scannerne in-process og shell’er ikke ud til scan.mjs.
  • Allerede dækket. role-matchers accent-foldningsrettelse (#2209) blev porteret i v1.127.0, så det er en no-op her.

[1.129.1] — 2026-07-29

Rettet

  • AI-review-opfølgninger på web-portene fra v1.128/v1.129 (alle rådgivende, rettet ved kilden): niveau-præcedens i job-facets.js (en eksplicit modifikator vinder nu over et ledelsesord — Senior Engineering Manager → senior, før lead); fallback i states.mjs fastlåses ikke længere (en vellykket læsning memoiseres, fallback returneres ucachet — en forælder der er midlertidigt utilgængelig ved boot genlæses ved næste kald) + console.warn ved en tilstedeværende men misdannet fil; score-tone.js — en række uden score er neutral (muted), ikke rød; domainFromName() springer ikke-ASCII-slugs over før /api/logo; +en isolationsvagt i tests/states.test.mjs. +4 tests → 2073.

[1.129.0] — 2026-07-29

Tilføjet

  • Niveaufacet + alderskolonne på #/scan — job-facets.js-biblioteket fra v1.128.0 er nu koblet til scan-UI’et (før kun logik). En ny Niveau-dropdown inddeler hver opslags titel i lead/staff/senior/mid/junior/praktikant (JobFacets.seniorityFromTitle) og udfyldes ud fra det, der faktisk er i resultaterne (som Land-facetten); titler uden niveauord passerer altid. Bevares i gemte søgninger, Nulstil og Anvend. Tabellen får en Niveau-badgekolonne og en token-fri Alder-kolonne (i dag / Nd, fra JobFacets.daysSince). 12 i18n-nøgler ×17, +3 tests → 2069.

[1.128.0] — 2026-07-29

Tilføjet

  • Fire løsninger porteret fra forælderens egen web-app (../web/, Next.js), genimplementeret i vanilla JS/ESM, uden nye afhængigheder: (1) server/lib/states.mjs læser templates/states.yml live som trackerens kanoniske statusordforråd (CI-fallback) — fjerner den manuelle whitelist-resync hver udgivelse; POST folder aliasser (spansk/legacy) til den kanoniske etiket, GET-funnel grupperer efter kanonisk status; (2) firmalogoer på ATS-hostede rækker via domainFromName() (~90 brand→domæne); (3) score-tone.js — 4-trins score-tone (≥4.2/3.8/3.0 + bogstav-fallback); (4) job-facets.js — seniority/source/days-facetter. +21 tests.

Noter

  • Ikke porteret (kun koncept): forælderens agent-handlingslag (actions/registry.ts + api/assistant/route.ts) — plan for når docs-fab bliver en copilot. Ingen nye kilder (register 70), ingen i18n/help-ændringer.

[1.127.0] — 2026-07-29

Tilføjet

  • Tre nye scan-kilder (career-ops v1.23.0-paritet) — registret rummer nu 70 adaptere (65 EN + 5 RU): Flowxtra (board-wide aggregator uden auth), VDAB (den flamske jobservices keyword-API) og iCIMS (careers-<tenant>.icims.com-portaler, adskilt fra jibeapply). Desuden vender Cursor tilbage til CLI-rosteret (parent #2115): cli-detect registrerer nu cursor (10 værktøjer), roster genoprettet i help/README/config ×17.

Rettet

  • agenticjobs skiftede fra HTML-scraping til REST-API (#2167); Greenhouse genfinder byen fra /offices, når location.name kun er en arbejdsmodel (#2104); role-matcher-paritet (#1933/#2164/#2009: MTS-præfiks, product-baseline, accent-foldning, sub-baseline-uenighed).

Noter

  • Ikke porteret. Størstedelen af v1.23.0 er CLI/dashboard-flade som web-ui ikke bruger (batch-tailor, discover-ats, NL/PT-tilstande, PDF-temaer, Go-dashboard, updater/doctor); relay-scripts uændret. Forælderens VERSION → 1.23.0.

[1.126.1] — 2026-07-25

Rettet

  • To CLI-roster-drift-steder som v1.126.0-resyncen missede — (1) introen på API keys-fanen i #/config (config.providerModelNote, i18n ×17) listede kun 7 CLIer — nu indsættes Antigravity og Grok Build efter OpenCode; (2) en anden sammenligningstabel-række i hjælpeguiden (×17) og det CI-byggede site-help stod stadig Inside Claude Code / Codex / Cursor / Gemini CLI — det forældede sæt med Cursor — nu det fulde roster. Begge brugte skråstreg/midtpunkt-separatorer som v1.126.0-fejningens mønstre ikke dækkede. i18n-snapshot regenereret; suiten forbliver 1969.

[1.126.0] — 2026-07-25

Tilføjet

  • AI CLI-værktøjsfanen registrerer nu alle 8 førsteklasses career-ops-CLIer — #/config-rosteret er synkroniseret med forælderens docs/SUPPORTED_CLIS.md: server/lib/routes/cli-detect.mjs får Grok Build CLI (grok) og Kimi CLI (kimi), og Antigravity prober nu sin kanoniske binær agy først. Den skrivebeskyttede PATH-scanning rapporterer nu 9 værktøjer; den kører stadig aldrig en fundet binær.

Ændret

  • Dokumentations-resync med career-ops.org/docs — hver dokumentationsflade blev afstemt med forælderens live-sider (alle 31 læst). Det kanoniske AI-assistent-roster (help ×17 + README ×17) lister nu de 8 førsteklasses CLIer — Claude Code, Codex, OpenCode, Antigravity CLI, Grok Build CLI, Qwen Code, Kimi, GitHub Copilot CLI — plus Gemini CLI (legacy-wrapper). Hjælpebundterne bevarer deres 29 H2 / 105 H3-struktur.

[1.125.4] — 2026-07-23

Ændret

  • site-afhængigheder (dependabot #151–#153) — sharp 0.34.5→0.35.3, svgo 4.0.1→4.0.2, fast-uri (dev) 3.1.3→3.1.4 i site/; Astro-build grønt, ingen påvirkning af SPA/server.

Noter

  • Paritetsgennemgang af forælderen (career-ops 37d17ec..254764a, efter v1.22.0) — intet at portere: forkert-række-garden i set-status (#2108) er kun CLI (i web-ui vælges tracker-rækker eksplicit i UI’et, og ingen rute kalder set-status.mjs), Risk Summary i lokaliserede tilstande (#2109) rører modes/<lang>/-filer, som web-ui aldrig læser (kun modes/*.md på øverste niveau), manifest-verifikationen i update-system (#2111) gælder kun opdateringsværktøjet, og resten er forælderens dokumentation (tyrkisk README, SIGNATURES ×4, SCRIPTS.md, es-accenter). Forælderens VERSION forbliver 1.22.0 — parentVersion uændret.

[1.125.3] — 2026-07-23

Rettet

  • LLM-prompter på dansk og hindi svarede på engelsk (brugerrapporteret) — LOCALE_NAMES og alle fem SCAFFOLD_STRINGS-blokke i server/lib/prompts.mjs blev aldrig udvidet med da og hi, så resolveLocale() faldt tilbage til en, og hver AI-prompt — deep research (live og manuel), tilstande, evaluering, interview, netværk, CV Studio — mistede sit # Output language-direktiv på disse to sprog. Begge er nu fuldgyldige: sprogdirektiv + lokaliseret stillads. Regressionsporten i tests/locale-scaffold.test.mjs gennemgår nu den kanoniske liste med 17 sprog i stedet for 12 hårdkodede, og en ny strukturel paritetsport fejler enhver stilladsnøgle, der falder tilbage til engelsk — et fremtidigt sprog, der springer prompts.mjs over, kan ikke længere udgives (+12 tests, suiten er nu på 1969).

[1.125.2] — 2026-07-22

Rettet

  • Deep research via Gemini: HTTP 502 (MALFORMED_FUNCTION_CALL) (#145, bidrag fra @Alien10140) — live-prompten i /api/deep bad modellen om at »Use WebFetch / WebSearch« og gemme briefet i en fil, men headless API-udbydere har ingen værktøjskanal; Gemini svarede med et funktionskald i stedet for tekst, hvilket viste sig som en tom HTTP 502. buildDeepPrompt og bundleProjectContext tager nu et headless-flag: live-kørsler (Anthropic/Gemini/fallback-kaskaden) får en prompt uden værktøjer, der skriver briefet ud fra den indlejrede kontekst, mens copy-paste-prompten til Claude Code beholder sine værktøjsinstruktioner. +1 test i tests/critical-fixes.test.mjs.

Ændret

  • Gemini-standarder løftet forbi den udfasede gemini-2.0-flash (#144, bidrag fra @Alien10140) — konfigurations-dropdownen, server-fallbacken i gemini.mjs (som i stilhed var uenig med hintet), OpenRouter-fallbackkæden, config.geminiModelHint ×17 og hjælpeguiden ×17 peger nu alle på gemini-3.6-flash. Den nye drift-gate tests/gemini-default-model.test.mjs (+5 tests) fastgør alle overflader til samme literal — suiten er nu på 1957 tests.

[1.125.1] — 2026-07-21

Rettet

  • SuccessFactors: multi-brand RMK-tenants beholder deres brand-sti (forælder #2099, post-v1.22.0) — holdingselskaber, der driver flere opkøbte brands fra én fælles RMK-instans, adskiller dem via et sti-segment (careers.nemetschek.com/Bluebeam/ versus …/Vectorworks/); adapteren kollapsede tidligere den konfigurerede URL til dens origin og scannede derved stille og roligt moderbrandets opslag. Endpointet bevarer nu brand-præfikset og fjerner kun et afsluttende /search/- eller /tile-search-results/-segment, så intet nogensinde dubleres oven i sig selv; enkelt-domæne-tenants er byte-for-byte uændrede. Ny eksporteret hjælpefunktion resolveTenantBase + 1 overført testblok i tests/sources-successfactors.test.mjs.

[1.125.0] — 2026-07-21

Tilføjet

  • cvstart.org: landingssektionen “Jobkilder” — en ny sektion mellem screenshots og sammenligningen, der lister alle 67 scanner-kilder som klikbare chips (62 engelsksprogede boards/ATS’er + de 5 russiske boards under egen underoverskrift), hver med link til kildens offentlige side. Listen synkroniseres med det aktive adapter-register ved build (sync-assets.mjs → facts.sources), så den aldrig kan afvige fra appen; et kurateret linkkort i Sources.astro er sikret af den nye test tests/site-sources.test.mjs. Header-navigationen fik et Sources-anker; 4 nye site-i18n-nøgler ×17. Rettede desuden landingens JSON-LD inLanguage-liste, der stadig manglede hi.

[1.124.0] — 2026-07-21

Tilføjet

  • Fem scan-kilder (paritet med forælder v1.22.0, #1808/#1572/#2024/#2055) — Welcome to the Jungle (board-bred JSON-API), Agentic Engineering Jobs (agentic-/AI-engineering-board), Jobvite (zero-auth per-tenant-ATS), Gem (per-tenant-ATS) og Alibaba Group (careers-JSON-API, Meituan/Tencent-mønster). Hver er et vært-fastgjort, CI-isoleret kilde- og adapter-par; registreringen leverer nu 67 adaptere (62 EN + 5 RU); #/scan-Source-rullelistens fallback og dens drift-gate er opdateret; fem nye suiter tests/sources-{wttj,agenticjobs,jobvite,gem,alibaba}.test.mjs.

Rettet

  • Arbeitsagentur: landsdækkende remote kun når homeofficetyp er VOLLSTAENDIG (forælder #1981) — homeoffice=nv_true-forespørgslen returnerer også hybrid-stillinger, så remote-passet bekræfter nu hvert hit mod job-detalje-endpointet i små batches og fejler lukket (en opslagsfejl beholder jobbets rigtige by, så lokationsfiltre stadig gælder).
  • SmartRecruiters: offentlige job-URL’er bygget uden /postings/ (forælder #2047) — links lander nu på den offentlige opslagsside i stedet for en 404 for tenants, hvis offentlige site dropper segmentet.

Noter

  • Forælder v1.22.0 leverede også CLI-side ændringer, som web-ui’en ikke shell’er ind i eller allerede dækker: zh-CN-CV-skabelonen + PDF-typografi, /expand-tilstanden, provider-prompt-cache-finjusteringer (Gemini/OpenAI/Ollama), den trin-for-trin-token-opdeling (web-ui’en har sin egen forbrugsmåler), tracker-writer-lock-serialisering (web-ui’en har rutet skrivninger gennem withFileLock siden v1.21), scan-visa_filter- og absolut-opslagsdato-CLI-flagene (web-ui’en har sit eget “Opslået inden for”-alders-filter), samt seen-sources-dedup-seedingen (web-ui-scanneren beholder sin egen scan-historik-dedup).

[1.123.0] — 2026-07-17

Tilføjet

  • Oracle Recruiting Cloud-scan-kilde (paritet med forælder v1.21.0, #1929) — den zero-auth recruitingCEJobRequisitions-REST-API’en på Oracle Fusion/ORC-karrieresider (JPMorgan Chase, Oracle, BNY Mellon, American Express, Honeywell, …): vært-fastgjort til *.fa[.<region>][.ocs].oraclecloud.com, sitenummeret udledes af hver sporet virksomheds careers_url, offset-paginering med et hårdt sidetag, og WAF-bevidste browser-lignende headers. Registreringen leverer nu 62 adaptere (57 EN + 5 RU); #/scan-Source-rullelistens fallback og dens drift-gate er opdateret; ny CI-isoleret suite tests/sources-oraclecloud.test.mjs.

Rettet

  • Repost-detektor: grundtitler forbliver adskilt fra søskende med specialiserings-suffiks (forælder #1922) — “Senior Analytics Engineer” klynger ikke længere sammen med “Senior Analytics Engineer, People Analytics”: når den ene titels tokens er en streng delmængde af den andens, og det ekstra token er en reel specialisering (ikke et basisord), behandles de to som separat-opslåelige stillinger. Repost-annoteringer (“(Repost)”, “relisted”) stopordsfiltreres nu som meta-støj. +2 assertions i tests/detect-reposts.test.mjs.

Noter

  • Forælder v1.21.0 leverede også CLI-side ændringer, som web-ui’en ikke shell’er ind i eller allerede dækker: gentag-virksomheds-genansøgningsadvarslen (web-ui’en har haft genansøgnings-cooldown siden v1.84.0), cover letter-flagene --format/--report, samtale-tilstandene for røde flag / panel-indsigt / no-show-e-mail-prompts, scan-tillidssignaler & portal-sundheds-persistens (web-ui’en kører sin egen in-process-scanner med trust-validator og Portalsundhed-siden) samt stats-/løngab-udvidelserne (relæet er skrivebeskyttet og fejler blødt).

[1.122.0] — 2026-07-16

Tilføjet

  • Hindi (हिन्दी) — det 17. sprog — komplet UI-ordbog (ca. 1.110 nøgler), den fuldstændige indbyggede hjælpevejledning (29 H2 / 105 H3 paritet), README.hi.md, en ny CHANGELOG.hi.md (starter ved v1.122.0, efter samme model som de/it/tr), cvstart.org-landingen + Metodologi-/Licens-/Changelog-/Hjælp-siderne, sprogvælgeren (🇮🇳), automatisk browsersprog-detektion og et lokaliseret dashboard-screenshot. Hver ×16-paritetsgate kører nu ×17: i18n-ordbogsparitet + snapshot, hjælp-gates for H2/H3, changelog-paritet, sitets check-i18n og Playwright-lokalitetsgennemgangen.

[1.121.0] — 2026-07-16

Tilføjet

  • cvstart.org: Metodologi-, licens- og changelog-sider — landingen fik tre nye sektioner på alle 16 sprog, ved siden af den eksisterende Sammenligning-blok: /methodology/ (den seks-dimensioners 0,0–5,0-scoringsrubrik, 4,0-ansøgningstærsklen og reglerne for, hvad systemet aldrig gør — et lokaliseret resumé af career-ops.org/methodology), /license/ (den kanoniske MIT-tekst med henvisning til NOTICE.md) og /changelog/ (denne fil, gengivet pr. sprog ud fra repository’ets 16 oversatte changelogs). Ny Metodologi-post i headeren og links til Ressourcer i footeren; sync-assets.mjs synkroniserer nu CHANGELOG ×16 og LICENSE ind i sitet ved build-tid, så siderne aldrig kan drifte væk fra repository’et.
  • Metodologi-links på tværs af dokumentationen — README’en (alle 16), den indbyggede hjælpeguides §1-kanoniske liste (alle 16) og wikien linker nu til career-ops.org/methodology (plus FAQ’en og ordlisten) sammen med de eksisterende career-ops.org/docs-vejledninger.

Ændret

  • README-udgivelsesbanner og badges opdateret (1850 tests, udgivelse v1.121.0) — banneret annoncerede stadig v1.119.5.

[1.120.0] — 2026-07-16

Tilføjet

  • CareerOps-manifestet (paritet med forælder v1.20.0) — moderprojektet udgav CareerOps-manifestet (MANIFESTO.md · career-ops.org/manifesto) og fremhæver det nu i sin README, sin updater og sit Go-dashboard. Web-ui’en følger trop: et nyt link i sidebjælke-footeren åbner manifest-siden (ny i18n-nøgle footer.manifesto i alle 16 lokaliseringer), den indbyggede hjælpeguide fik §29 “CareerOps-manifestet” på alle 16 sprog, README’en forklarer, hvad manifestet er, og hvordan man underskriver det, og cvstart.org-landingens footer linker også til det.

Noter

  • Forælder v1.20.0 rettede også undertrykkelsen af allerede kendte kompetencer i upskill-tilstandens målrettede tilstand, gjorde dotenv tavs, så stdout fra scan --json forbliver parsebar, og rettede HTML-CV-skabelonen, så en rolleoverskrift bliver hos sine punkter — CLI-side-flader, som web-ui’en ikke shell’er ind i; ingen ændring af web-ui-kode var nødvendig.

[1.119.5] — 2026-07-13

Rettet

  • Sprogknappen på landingen ombrydes ikke længere — med flagene fra v1.119.2 kunne switcher-etiketten i headeren (f.eks. «🇷🇺 Русский») knække på op til tre linjer ved smalle desktop-bredder; switcher-etiketten og alle dropdown-valg er nu whitespace-nowrap — flag + endonym altid på én linje. Sproglisten i footeren gik fra et stift to-kolonne-gitter til en ombrydende række af enkeltlinjede punkter — «🇧🇷 Português (Brasil)» knækker heller ikke længere midt i navnet.

[1.119.4] — 2026-07-13

Ændret

  • LICENSE nævner forfatteren — copyright-linjen lyder nu: Sergei Emelianov (Fighter90) https://sergey-cv.com and career-ops-ui contributors (kanonisk MIT-tekst urørt). En ny NOTICE.md udfolder licenseringen i detaljer: hvem der holder copyright, præcis hvad MIT-tilladelsen dækker (kode, docs, oversættelser, landingen, wikien), hvad den IKKE dækker (dine runtime-data, forældreprojektet, jobboard-indhold, varemærker), tabellen over tredjepartskomponenter (express/js-yaml — MIT; Astro/Tailwind — MIT; skrifttyperne Figtree og JetBrains Mono — SIL OFL 1.1; sharp — Apache-2.0) og en valgfri krediteringslinje.

[1.119.3] — 2026-07-13

Tilføjet

  • SECURITY.md — sikkerhedspolitikken, som CONTRIBUTING pegede på, findes nu: understøttede versioner, privat rapporteringsflow (GitHubs private vulnerability reporting er nu aktiveret på repoet — Security-fanen → „Report a vulnerability”), trusselsmodellen for en localhost-bundet enkeltbruger-app (i scope: XSS via fjendtlige jobopslag / SSRF / path traversal / lækage af hemmeligheder / CSP-svækkelse; uden for scope: DoS mod egen localhost og problemer i forældreprojektet) og hardening-baseline for reviewere.

[1.119.2] — 2026-07-13

Tilføjet

  • CONTRIBUTING.md — bidragyderguiden, som landingen og README altid har linket til, findes nu: opsætning, projektkort, de hårde sikkerheds-/no-build-regler, testniveauer, to-registre-gennemgangen til at tilføje en scanningskilde, ×16-i18n-kontrakten, commit-/PR-konventioner og release-processen.
  • Sprogflag på landingen — cvstart.orgs sprogvælger, footerens sproggitter og “læs på dit sprog”-banneret viser nu hver lokalitets flag ved siden af dens endonym (samme sæt regionale indikatorer som appens sprog-<select>; degraderer til regionsbogstaver, hvor flagglyffer mangler).
  • Landing-footer-rettelser — det døde Discussions-link (funktionen er ikke aktiveret på repoet) peger nu på projektets wiki, og footeren krediterer forfatteren: Sergei Emelianov (sergey-cv.com · LinkedIn).

[1.119.1] — 2026-07-13

Rettet

  • Kildefilteret på #/scan har indhentet registreringen — den statiske FALLBACK_SOURCES-liste bag Source-dropdownen (bruges kun når GET /api/scan/sources er utilgængelig) haltede stille bagefter siden v1.87.0: 20 udbydere manglede i offline-fallbacken (Amazon, Avature, SAP SuccessFactors, Get on Board, Dassault Systèmes, beesite, HigherEdJobs, JibeApply (iCIMS), softgarden, Cornerstone, Phenom, Radancy, Deutsche Bahn, EchoJobs, TKMS, Heckler & Koch, Rheinmetall, LaraJobs og de nye Meituan / Tencent). Synkroniseret med alle 61 og nu sikret af en drift-test, der fejler CI, når klientlisten afviger fra server-registreringen (værdier OG labels). +1 test (1845).

[1.119.0] — 2026-07-13

Paritet med forældre-career-ops v1.19.0 + refresh af cvstart.org-landingen.

Tilføjet

  • 2 nye scanningsudbydere — Meituan (zhaopin.meituan.com) og Tencent (careers.tencent.com): de kinesiske tech-boards’ offentlige JSON-API’er uden auth, host-detekteret eller valgt via eksplicit provider:, med server-side søgning pr. nøgleord, paginering og URL-deduplikering — nu 61 adaptere (56 EN + 5 RU). +20 tests (1844).
  • Bidragyder-blok på landingen — cvstart.org viser avatarer for alle, der har bidraget med kode (GitHubs /contributors-API på build-tid, bots filtreret), lokaliseret på alle 16 sprog, med link til den fulde bidragyder-graf.
  • Live GitHub-stjernetæller på landingen — header-badget opdateres nu klient-side fra GitHub-API’et ved hvert besøg (build-øjebliksbilledet er fallback), og en ugentlig planlagt Pages-genopbygning holder øjebliksbilledet + bidragyderlisten frisk; API-kald i CI er token-autentificerede.

Rettet

  • Workday CXS-forespørgsler bærer browser-lignende headers (forælder #1813) — Cloudflare-beskyttede tenants (set live: geico) svarer 500 på forespørgsler uden almindelige UA/accept-language/origin/referer; fetcheren udleder nu origin + site-slug fra selve CXS-URL’en. Glints-forespørgsler fik samme browser-UA + origin/referer, begge fra den fælles konstant BROWSER_LIKE_USER_AGENT i http-json.mjs.

[1.118.4] — 2026-07-10

Rettet

  • hh.ru-scanninger returnerede 0 resultater fra en russisk IP (links på regionalt subdomæne) — fra en russisk residential-IP omdirigerer hh.ru søgningen (302) til et regionalt subdomæne (sochi.hh.ru, spb.hh.ru, …) og returnerer joblinks på det subdomæne. Parseren søgte titel-linket på den fast indkodede vært https://hh.ru/vacancy/ og ramte ingen af de regionale, så en fuldt fungerende scanning registrerede lydløst 0. Den accepterer nu enhver *.hh.ru-vært (annoncer på adsrv.hh.ru/click?… udelukkes fortsat — de har ingen /vacancy/<id>-sti) og kanoniserer hver resultat-URL tilbage til https://hh.ru/vacancy/<id>. Verificeret live: 17 rigtige jobs parses nu fra en sochi.hh.ru-side, der før gav 0. +1 test (1824).

[1.118.3] — 2026-07-10

Rettet

  • hh.ru returnerede lydløst 0 resultater (VPN-tjek-interstitial) — hh.ru omdirigerer nu (302) netværk, det anser for VPN/proxy (datacenter-IP’er), til en interstitial /vpncheeck (“VPN мешает работе сайта”), der svarer HTTP 200 uden et eneste vakance-kort, så scanningen rapporterede 0 helt uden fejl. Scanneren opdager nu omdirigeringen via svarets endelige URL, deaktiverer hh.ru for resten af kørslen og skriver et ærligt hint: trafikken skal reelt gå ud via en residential IP — en systemdækkende VPN/proxy kan stadig være aktiv, selv når browser-kontakten er slået fra. +1 test (1823).

[1.118.2] — 2026-07-10

Vedligeholdelse

  • Landing-opfølgning (#118) — site/README.md bragt i overensstemmelse med Astro 7 (sikkerhedsopgraderingen fra #116), ubrugt import fjernet og +4 eksekverbare vagter for landingens build-scripts: i18n-paritetsporten fejler bevisligt på en ødelagt ordbog, og sync-assets skriver aldrig uden for site/ — suite 1822. To CodeQL-advarsler løst (én rettet i kilden, én afvist som tilsigtet build-adfærd).

[1.118.1] — 2026-07-10

Rettet

  • hh.ru-scanning uden for Rusland — hh.ru svarer nu med HTTP 451 (regional juridisk blokering) til ikke-russiske IP’er på de offentlige søgesider. Scanneren behandler 451 som 403: efter den første blokering deaktiveres hh.ru for resten af kørslen med en ærlig loglinje, der peger på russisk IP / VPN-exit, så de resterende forespørgsler og de øvrige RU-kilder ikke spildes. Hjælp §7 opdateret på alle 16 sprog. +1 test (1818).

[1.118.0] — 2026-07-09

Paritetspakke med forældre-career-ops v1.18.0.

Tilføjet

  • 9 nye scanningsudbydere — Cornerstone OnDemand (csod), Phenom (phenom), Radancy (radancy), Deutsche Bahn (deutschebahn), EchoJobs (echojobs), TKMS (tkms), Heckler & Koch (hecklerkoch), Rheinmetall (rheinmetall), LaraJobs (larajobs) — nu 54 adaptere. Lever-adapteren genkender desuden EU-tenant-boards (jobs.eu.lever.co).
  • Hired-status i trackeren (paritet med forælderens states.yml): accepterede tilbud får deres egen kanoniske status, et festligt badge og et «jobbet er i hus»-banner på #/tracker; tragten og konverteringerne tæller den som gennemført alle trin.
  • Samlet-fane i #/stats — skrivebeskyttet relæ af forælderens stats.mjs (samlet tracker-oversigt, akkumulerede tragtrater, scannertal, portaldækning) plus lønobservationer fra salary-gap.mjs (ønsket vs annonceret vs faktisk, pr. ansøgning). Nye ruter GET /api/stats/lifetime og GET /api/stats/salary-gap — shell-outs uden tokens, sikker degradering {available:false} uden forældre-projektet.
  • 28 nye i18n-nøgler i alle 16 sprog; hjælpeguiden §14/§26 opdateret på alle sprog.

Tests

  • +38 enhedstests (tre udbyder-paritetssuiter + relæ-/statusruter) — 1817 i alt.

[1.117.2] — 2026-07-06

Tom-tracker-rettelse for paritets-shell-outs. Forælderens scripts afslutter med kode 1 og et struktureret {error}-JSON, når trackeren endnu ingen ansøgninger har; kadencetavlen og fanen med afvisningsmønstre viste det som “script-error”. Begge ruter videregiver det nu som en sund tom tilstand (available:true, empty:true), så UI’et viser sin ærlige “intet endnu”-besked. Verificeret live mod en rigtig forælder.

Nyt: intet.

[1.117.1] — 2026-07-06

Hærdning af v1.117.0 (CodeQL-triage). De tre shell-out-endpoints (GET /api/followup, POST /api/followup/seed, GET /api/stats/patterns) bærer nu den delte per-IP-begrænser (de starter en børneproces pr. forespørgsel; no-op på loopback). Føj-til-CV’s URL-tekstudtræk fjerner tags til et fikspunkt og sletter derefter alle resterende </> — en bevisligt komplet sanering for LLM-prompttekst. Ingen adfærdsændring for gyldigt input.

Nyt: intet.

[1.117.0] — 2026-07-06

Forælder-paritetspakke — seks evner fra det overordnede career-ops bragt ind i UI’et. (1) Kadencetavle på #/followup: hastighed pr. ansøgning (🔴/🟠/🟡/🔵) fra followup-cadence.mjs, plus knappen Så opfølgningsdatoer (followup-seed.mjs --backfill). (2) Afvisningsmønstre: en fjerde statistik-fane kører analyze-patterns.mjs (skrivebeskyttet) — udfaldsmiks, anbefalinger, avanceringsrate pr. ATS-leverandør. (3) Føj til CV: et CV Studio-kort forvandler en URL eller indsat tekst til ATS-punkter, der KUN bygger på den kilde (kun forslag, ingen skrivninger; URL-hentning er SSRF-beskyttet). (4) 4 nye scan-udbydere — beesite, HigherEdJobs (RSS), JibeApply (iCIMS), softgarden — registret har nu 50 adaptere (45 EN + 5 RU), alle i Scan-rullelisten. (5) Præ-scan af diskvalifikatorer i Apply-tjeklisten. (6) Reconcile-runner (/api/run/reconcile). Shell-out-ruter degraderer ærligt uden forælderens scripts.

  • Nyt rutemodul server/lib/routes/followup.mjs (31.) + nye ruter + 8 source/adapter-filer. Tests: 6 + 7 nye; suite 1737 → 1750. 41 nye i18n-nøgler ×16. Hjælp §13/§17/§24/§26 udvidet ×16.

Nyt: GET /api/followup, POST /api/followup/seed, GET /api/stats/patterns, POST /api/cv-studio/add-entry, POST /api/run/reconcile.


career-ops-ui v1.267.1 · page 4/9 · mirror of the project changelog for cvstart.org