Changelog
GitHubHver 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.descmed en register-afledt{adapters}-pladsholder, havde ingen test og kunne regressere i stilhed ved næste locale-redigering. Den nye CI-isoleredetests/site-meta-desc-parity.test.mjsfejler, hvis en af de 17site/src/i18n/*.jsonmister pladsholderen eller hard-koder et antal igen, eller hvisLanding.astroholder op med at interpolere den ind i alle tre beskrivelses-metaer. - Nullsikker legitimitets-strip —
stripEmphasisreturnerer''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.parseReportHeaderforankrer 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-pillfå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ærhermes). Den faste tilladelsesliste iserver/lib/routes/cli-detect.mjsvokser 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,gemogdassaultafkodede numeriske HTML-entiteter med en svagNumber.isFinite-kontrol førString.fromCodePoint— en reference over0x10FFFF(f.eks.�fra et misdannet eller fjendtligt feed) kastede en ufangetRangeErrorog afbrød hele parsningen af den kilde. Et delt modulserver/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.fromCodePointaldrig kan kaste, og matcher hex og decimal separat, såa2;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=1leverer den SAMME sanerede fil medContent-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å
#/cver 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. Kunmin-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(#eef1f6lys /#1e232emørk, forskellig fra--slatei 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 idocs/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.mdog 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.twoPagerogtwoPager.titleenige 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 iindex.htmlmatcher;aria-labelbevarer 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-betjenbartrole="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
parseReportHeaderparser nu den sproguafhængige## Machine Summary-YAML-blok (score:/legitimacy:/date:— samme kilde somauto-pipelineallerede 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::focusNewViewkloner nu overskriften, fjerner.help-hintog læser derefter teksten; det synlige «?» er urørt. - cvstart.org viste «17 AI providers» i stedet for «7».
sub()-helperen iFeatures.astroomskrev 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 (fxLLM_PROVIDER=claudefrainit) endte blindt; nu falder den tilbage til auto-rækkefølgen blandt de konfigurerede udbydere (iselectActiveProvider+ begge dispatch-kaskader). - Klient-gating (
#/deep+ mode-page-views) bruger nuwindow.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) ogscan/filters.js(filter-tilstandsmaskine) viactx/refs-poser;scan.jsforbinder begge.
Rettet
- CodeQL
js/useless-assignment-to-local(#428) iconfig/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) ogconfig/tab-controller.js(fanebjælke-fabrik);config.jsrefererer 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-urlførapply-url).
Ændret
companyEId-opløsning: (1)company_eid:på portalen, (2)c=fra et eksplicitapi:, (3) board-side-discovery.fetchText(http-json.mjs) vedhæfter.location/.retryAftertil non-ok-fejlen (skrivebeskyttet, bagudkompatibel).
Noter
- Sikkerhed — to hosts (
jobs.jobvite.com,app.jobvite.com) fastgjort afassertJobviteUrl: kun https, streng allowlist, ingen redirect følges.companyEIder 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
#/configkunne ikke tvinge Hermes —LLM_PROVIDER-dropdownen viste kun seks udbydere, så man kunne sætteHERMES_API_KEYmen ikke tvinge Hermes fra UI. Nu erhermesden 8. mulighed, og en ny paritetstest forhindrer dropdownen i igen at afvige fraLLM_PROVIDERS.- Korte self-hosted nøgler blev afvist i stilhed — 20-tegns-gulvet i
isUsableKeyvar kalibreret til cloud-nøgler;hasHermesKeybruger 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) ogdocs/sdd;hermesChatUrludfylder 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) —
runHermespå den delterunOpenAICompatible-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/providersogllm-pricing.mjs. Den når en konfigurerbar lokal base-URL (standardhttp://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(standardhermes-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_KEYer enSECRET_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,#/usagefjernede deres inlinestyle: { 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 (
#/dashboardwidth:100%,#/pipelineborder: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.mjsholder.emptysom 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 (ipublic/index.html), placeret lige efter App-indstillinger. Fjernet fra Sourcing-gruppen (som beholder Scan / Pipeline / Auto-pipeline / Finansierede virksomheder). Ruten#/portals, visningen ognav.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-filterser nudisplay: gridmedrepeat(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) ogSR.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 idocs-assistant/DocsFabopfanger det automatisk, da begge læserdocs/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.mjssikrer, 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.mdlinker 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 atllm-dispatch.mjsikke 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 medenabled: falseover, 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 virksomhedsenabled-flag iportals.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.mjsfiltrerer alleredeenabled !== 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,#/applyfår et indlejret?(viaHelpHint.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 viaCompanyLogo, 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.salaryStatsreturnerer nuavgUsdved siden afminUsd/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 viaUI.md(); tilgængelig (role="tooltip",aria-expanded, luk med Escape/klik udenfor, fokus gendannet) og CSP-sikker.?på de 5 faner i#/statsog 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 sombackground, 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 loadermd()fraapi.js, prober numd('<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—scrollIntoViewefter generering kører kun, når forhåndsvisningen stadig er forbundet til dokumentet.
Noter
docs/UX-ROADMAP.mdopdateret:?-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-planviste den genererede plan som rå Markdown — den gengives nu automatisk som formateret, læsbar tekst viaUI.md()(den redigerbare Markdown forbliver i tekstfeltet; Forhåndsvisning skifter mellem dem).
Noter
#/career-plan,#/two-pager,#/statsog 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 godkendelsesfriehttps://<tenant>.eightfold.ai/api/apply/v2/jobs-API, vært-fastgjort til*.eightfold.ai(den brandedecareers.<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-repostsklynger nu virksomhedsvarianter med forskellig bredde/tegnsætning (“Acme, Inc.” ≡ “Acme Inc”) og kollapser aldrig forskellige ikke-latinske arbejdsgivere, mensrole-matcherfolder fuldbredde-titler sammen og bevarer ikke-latinske rolle-tokens i stedet for at udslette dem. fetchJsonWithRetryforsøger ikke længere igen ved en afvist omdirigering (#2657) — enredirect:'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.oraclecloudaccepterer de nummererede tenant-apex-domæneroraclecloud1.com … oraclecloud99.com(#2683) — en afgrænset familie (intet foranstillet nul, ≤ 2 cifre), aldrig et wildcard-apex.workablehærdet (#2675) — genforsøg, browser-lignende headers og serialisering af forespørgsler mod den Cloudflare-fordelte vært.personiofalder tilbage til en HTML-scrape, når XML-feedet er deaktiveret, i stedet for at returnere ingenting.statesFALLBACK-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/nanoidvar 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 offentligeapi.getro.comPOST-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_whoishiringi 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
successfactorskasserer 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 ingentry/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 en404(enstartrowuden for området), villeen-scannersætte en live tenant i karantæne som “død” i flere dage. Spejler nuphenom/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 udentabindex/rolle, så tastatur- og skærmlæserbrugere ikke kunne nå eller aktivere dem. De bærer nurole="button",tabindex="0",aria-pressedog 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. Nuscan.trustTip+scan.col.reloc(2 nye nøgler) + genbrug aftrack.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, frawww.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_ADAPTERS68). 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ælderenscompany-funded.mjsreturnerede en fuld liste. (1) Visningen læste resultaterne underres.candidates, men forælderen udsender dem undercompanies(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 tilUI.el('tr', {}, …)som varargs, menUI.el(tag, attrs, children)forventerchildrensom 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 reellecompanies-outputform (den oprindelige fixture spejlede den forkertecandidates-form — hvilket er præcis grunden til, at fejlen slap igennem med grønne tests), plus kildestatiske kanariefugle for, atfunded.jslæserres.companies(aldrigres.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-opscompany-funded.mjsviaGET /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 rutemodulserver/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-LLMweekly-digest.mjsviaGET /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 gyldigeYYYY-MM-DD; et tomt interval er et gyldigtavailable:true-resumé. Tilføjet tilserver/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 suitetests/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 tilpublic/js/lib/scan-results.js(afvikling af file-size-contract-gæld —public/js/views/scan.jsvar vokset til ~1254 LOC). Delsystemet (renderResults,buildChipRow,getRows, række-/facet-bygherrerne, valgmulighedsmalerne ogFALLBACK_SOURCES-registerspejlet) blev flyttet ind i enwindow.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 tilctx.*;scan.jser 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.mjslæser nu registerspejlet frascan-results.js. - Ny regressionsspærring i browseren —
tests/playwright-scan-filters.mjssår en foruddefineretdata/last-scan.jsonog 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.cssopdelt 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 nuapp.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) ogoverlays.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.htmlindlæ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 nyetests/css-modularization.test.mjsfastlå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.
- Snittet er sammenhængende og i rækkefølge, så cascaden er byte-for-byte identisk med filen før opdelingen;
[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 nuapi:/a16z-speedrun-talent:-overskrivningen vedbuildEndpoint(HTTPS + eksakt hostspeedrun-talent-network.com) og falder tilbage til det kanoniske feed, hvis det fejler — paritet medcryptocurrencyjobs-adapteren, så en off-host-værdi aldrig når frem til fetch-slottet (tidligere afhang det udelukkende af fetch-tids-vagtenassertSpeedrunUrl). Det eksakte host-tjek er nu et enkelt eksporteretSPEEDRUN_TALENT_HOST_RE, som deles af vagten og adapteren.cryptocurrencyjobs-parseren —cleanUrlbruger nu den samme eksakte host-vagt somassertCryptocurrencyJobsUrlog adapter-overskrivningen (varendsWith, som accepterede subdomæner). Parseren er aldrig mere tilladende end SSRF-vagten: etsub.cryptocurrencyjobs.co-linkelement kasseres.- +2 tests → suite 2135.
[1.131.0] — 2026-07-31
Tilføjet
#/trackerCRM-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/stagesreturnerer den kanoniske tragt (etiketter i rækkefølge) + et alias-foldningskort, hentet fraserver/lib/states.mjs(templates/states.yml, med den indbyggede fallback) — så klienten aldrig hardkoder statuswhitelisten. Det legacy parameterløseGET /api/tracker-svar er uændret (kun{ rows }). - Nyt rent, enhedstestet klientbibliotek
public/js/lib/tracker-stages.jsgrupperer rækker efter serverens stadier og tolererer forvildet markdown-fed skrift og lokaliserede aliasser (fxaplicado→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.
- Ny read-only rute
[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 tilspeedrun-talent-network.com, kun HTTPS, 0-indekseret paginering med et sideloft, per-virksomhedsq/config-threading, fail-soft. - Cryptocurrency Jobs (
cryptocurrencyjobs) — Web3-jobboardetcryptocurrencyjobs.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).
- a16z Speedrun (
Rettet
echojobs— hybride roller forbliver adskillelige fra remote (spejler forælderens #2258). En case-insensitivehybrid-markør giver nu"<By> · Hybrid"(eller et bartHybrid, når der ikke er nogen by) ogworkplaceType: 'Hybrid', i stedet for at blive kollapset tilRemote.radancy— legacy TalentBrew-markup + JSON-resultatfragment-transport (spejler forælderens a3e6df9), gatet af en injicerbaropts.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ælderensscan.mjs— Interamt.de-Playwright-scanneren, iCIMS reverse-ATS-fuldsweep, land-berettigelses-remote-filteret, DNS-lookup-pacing, StepStonesrltr-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 tilscan.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ørlead); fallback istates.mjsfastlå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.warnved 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 itests/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, fraJobFacets.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.mjslæsertemplates/states.ymllive 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 viadomainFromName()(~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årdocs-fabbliver 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 frajibeapply). Desuden vender Cursor tilbage til CLI-rosteret (parent #2115):cli-detectregistrerer nucursor(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årlocation.namekun 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 stadigInside 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ælderensdocs/SUPPORTED_CLIS.md:server/lib/routes/cli-detect.mjsfår Grok Build CLI (grok) og Kimi CLI (kimi), og Antigravity prober nu sin kanoniske binæragyfø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) —
sharp0.34.5→0.35.3,svgo4.0.1→4.0.2,fast-uri(dev) 3.1.3→3.1.4 isite/; 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 iset-status(#2108) er kun CLI (i web-ui vælges tracker-rækker eksplicit i UI’et, og ingen rute kalderset-status.mjs), Risk Summary i lokaliserede tilstande (#2109) rørermodes/<lang>/-filer, som web-ui aldrig læser (kunmodes/*.mdpå øverste niveau), manifest-verifikationen iupdate-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 —parentVersionuændret.
[1.125.3] — 2026-07-23
Rettet
- LLM-prompter på dansk og hindi svarede på engelsk (brugerrapporteret) —
LOCALE_NAMESog alle femSCAFFOLD_STRINGS-blokke iserver/lib/prompts.mjsblev aldrig udvidet meddaoghi, såresolveLocale()faldt tilbage tilen, 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 itests/locale-scaffold.test.mjsgennemgå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 springerprompts.mjsover, 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/deepbad 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.buildDeepPromptogbundleProjectContexttager nu etheadless-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 itests/critical-fixes.test.mjs.
Ændret
- Gemini-standarder løftet forbi den udfasede
gemini-2.0-flash(#144, bidrag fra @Alien10140) — konfigurations-dropdownen, server-fallbacken igemini.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-gatetests/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ælpefunktionresolveTenantBase+ 1 overført testblok itests/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 iSources.astroer sikret af den nye testtests/site-sources.test.mjs. Header-navigationen fik et Sources-anker; 4 nye site-i18n-nøgler ×17. Rettede desuden landingens JSON-LDinLanguage-liste, der stadig mangledehi.
[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 suitertests/sources-{wttj,agenticjobs,jobvite,gem,alibaba}.test.mjs.
Rettet
- Arbeitsagentur: landsdækkende remote kun når
homeofficetyperVOLLSTAENDIG(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 gennemwithFileLocksiden 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 virksomhedscareers_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 suitetests/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 medtrust-validatorog 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 nyCHANGELOG.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, sitetscheck-i18nog 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.mjssynkroniserer 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øglefooter.manifestoi 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 frascan --jsonforbliver 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å
#/scanhar indhentet registreringen — den statiskeFALLBACK_SOURCES-liste bag Source-dropdownen (bruges kun nårGET /api/scan/sourceser 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 eksplicitprovider:, 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 konstantBROWSER_LIKE_USER_AGENTihttp-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ærthttps://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 tilhttps://hh.ru/vacancy/<id>. Verificeret live: 17 rigtige jobs parses nu fra ensochi.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.mdbragt 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, ogsync-assetsskriver aldrig uden forsite/— 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ælderensstates.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ælderensstats.mjs(samlet tracker-oversigt, akkumulerede tragtrater, scannertal, portaldækning) plus lønobservationer frasalary-gap.mjs(ønsket vs annonceret vs faktisk, pr. ansøgning). Nye ruterGET /api/stats/lifetimeogGET /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