Changelog
Every release, in plain language. career-ops ships several times a week; this page reads straight from GitHub Releases and updates itself. Your data is never touched by an update — see the Data Contract.
v1.28.0
LatestNew
application-answersParse a rendered section back into a snapshotbatchNative Node.js batch evaluator for Geminicompany-historyEmit no-response-friction signal per RFC #1506 schema v1cvMake Work Experience an optional sectiondiscover-atsProbe the long-tail ATS vendors, not just the big threedoctorEmit the Gemini Node 20+ verdict instead of leaving it in prosefollowupsExport withFollowupsLock so other writers can share the lockofertaAI-screening disclosure signal — Block G Signal 15portalsAdd Wellfound search queries to the example templateprovidersAdd yourator job board providerreportsAdd reports_to to the Machine Summary schemascan-ats-fullOptional title_filter_full override for the full-board sweeptitlesLet the mode retire a keyword, not only add one
Fixed
add-entryExact-match dedup keys so a prefix cannot false-positivearchive-postingReject mistyped flags via the shared helperbatch-runnerCurl pre-fetch JD file to avoid empty $jd_file fallbackbatch-runnerEmit the JD word count color-independentlyclassify-tierValidate CLI flags and add a usage blockconsiderPerform GET /jobs CSRF handshake before the POSTcontactsAdd -h/--help and reject unrecognized flagscover-letterPreserve --out subdirectories inside the output rootcvAn empty Skills section no longer deletes the sections after itfunnel-velocityValidate CLI flags via the shared helperintakeTreat a nonzero version probe as present, not missinglivenessRead same-origin iframes so embedded postings aren't false negativeslocksThe other two copies of the protocol had the same Windows bugmerge-trackerDon't let an unscoreable (N/A) re-eval overwrite a real scoremerge-trackerWrite rows at the header's actual width on customized trackerspipeline-lockAn unreadable owner stamp is not an ownerless lockpipeline-lockTime out a wedged holder, not an unlucky waiterpipelineSerialize browser-backed extraction so workers never share a sessionportalsBlock German student and support postings in the example title filterportalsRefresh example board URLs after ATS migrationsprovidersRaise inter-page pacing to 250 ms on the eight providers still at 150providersSenjob was the fifth private entity decoder, and the weakest — it emitted C0 controlsscanAdd block_hard tier so always_allow cannot discard an explicit blockset-statusRejects today's date east of UTC, logs tomorrow's west of itstatsValidate CLI flags via the shared helpertest-allTolerate Windows EPERM on fixture cleanup so a green run stays greentrackerTreat Windows rename contention as contention, not deathtrust-validatorA company with an accent in its name is flagged for being on its own domainupdaterDetect tree drift and prune retired system files (#2630, #2532)updaterParse git status paths from untrimmed outputupskillValidate CLI flags via the shared helperverify-cv-factsCatch fabricated headcounts outside softwareverify-portals--add probes slugs that cannot exist for an accented company namewebBlock_hard survives the Explore round-trip — type, URL params, seed and serializerwebPersist the only installed CLI so jobs can startwebResolve 27 unmapped states.yml aliases and fix the Turkish status foldwebResolve company logos by name, not one guessed domainwebSafe Codex AI-search exec with mtime-keyed capability cachewebStop first-run from claiming no setupwebTake the core followups lock so web writes cannot race the seederwebToday primary action opens the reportworkspaceKeep artifacts and PDF metadata in the tracker's workspace
New
cliAdd --help / -h usage block to stats.mjscliShared flag-validation helper, migrate 3 fixed scripts, fix scan.mjs, closes #2775dashboardAdd a POSTED column showing requisition agedashboardAdd Stats analytics view with score quality & seniority mix chartsintakeRead documents/ locally to propose source-annotated profile additionsinvite-matchDistinguish AI-interviewer platforms from human calls, closes #2673negotiationROI-based salary-negotiation talking points from verified achievementspdfBatch render path reusing one Chromium across N CVsprovidersEightfold AI talent-acquisition boardsprovidersExtend getro with auto-resolve, salary, retry and remote-detect, closes #2602providersSenjob — the scanner's first African source, SenegalrankOpt-in LLM relevance re-ranker for pipeline.mdscanAND-groups in title_filter.positivescanRecord failed runs in scan-runs.tsv so trends exclude survivorship biasskill-extractRecognize certifications, not just engineering toolstemplatesFive named CV templates + a contract test for template variantstracker-sync-checkFlag applications.md rows that active-interviews.md has already moved pastupdateDeclare fork-local paths outside the system layerupdateRestore locally deleted system files instead of preserving the deletionwebGive the Apply page a way back and a way to record that you applied
Fixed
add-entryKey non-Latin headings and dedup keys faithfullyadd-entryReject mistyped flags instead of reading them as dataagent-inboxGive concurrent add() a burst-sized lock timeout, closes #2824agent-inboxSerialize concurrent adds through the shared lockagent-inboxStop dropping requests queued during an addarchiveKey JD captures to report numbers so they resolve after capture dayassessment-logReject unknown flagsbatch-tailor--min-score 4.5 was silently ignored, and the worker's pdf mode path was cwd-relativebatchRetry state updates and lock reservations to prevent worker silent dropsbuild-cv-htmlRender numeric year/date scalars instead of dropping thembuild-cv-latexNumeric year/date scalars are still dropped — #2641 fixed only the HTML mirrorcheck-table-freshnessValidate CLI flags and add a usage block, closes #2855ciOnly greet a first-time contributor when it is actually their firstciSkip the upgrade leg when nothing managed changed, instead of failingclassify-tierAn incidental senior word outranked an explicit intern markercliA one-letter typo returned a false all-clear at exit 0 in 4 reporting CLIscompany-historyRecord response dates via --on, not --note free textcontactoLinkedIn connection-request limit is 200 on free tier, not 300csodReplay bootstrap session cookies and repair fetchResponse()cv-factsTreat a k/M/B magnitude suffix as part of the numbercvKorean and Traditional Chinese CVs had no font rulededup-trackerReject unrecognized flags instead of silently live-runningdepsMake js-yaml imports work on both 4.x and 5.xdepsPatch both HIGH advisories in web (js-yaml 4.3.1, nanoid 3.3.18)depsRaise the js-yaml floor to ^4.3.1 and guard itdoctorDetect Playwright MCP servers provided by Claude Code pluginsdoctorValidate CLI flags and add a usage block, closes #2856evalMerge openrouter tracker TSVs and send Ollama options to the native /api/chatfindPrint the one USAGE constant on the empty-query path toofindReject mistyped flags instead of searching for themfollowup-cadenceParse annotated pins, and add a retire directivefollowup-seedResolve "today" in local time, not UTCfollowupIgnore an apply date cited about another row, closes #2607invite-matchValidate CLI flags and add usagejd-similarityAdd --help and reject unknown flags instead of reading them as paths, closes #2772jd-similarityThe seniority gate fired on JD boilerplatejd-skill-gapRecognize all six markdown heading levelsjd-skill-gapRecognize sentence-form requirement headingsjobviteMigrate to the public XML feed after the JSON API retirementkeysStop the dotted-I fix from collapsing Polish, Lithuanian and MaltesekeysStop the Turkish dotted capital from splitting one employer in twolivenessClassify a rate-limited posting as uncertain, not expiredlivenessTreat an api.lever.co 404 as inconclusive, not proof of removallocksTreat Windows rm/stat contention as contention, not deathmatch-starScore a non-English story bank against a question in its own languagemerge-trackerDeterministic dedup on the posting URLmerge-trackerMatch inline URL headers so URL dedup activates for doc-style rowsmerge-trackerRe-eval no longer inherits the superseded report's checkmarkollamaInclude profile context in evaluationsoraclecloudAccept Oracle's numbered tenant apexes (oraclecloud1-99.com)patternsRate denominators counted rows that could never contributepipeline-lockA non-EEXIST mkdir refusal is contention, not a fatal error, closes #2777pipeline-lockJitter the retry so a starved writer costs a retry, not an itemplugin-auditValidate CLI arguments and add a usage block, closes #2771process-qualityThree undisclosed employers were reported as disclosedprovidersDecode HTML entities in titles before matching so encoded ampersands stop dropping jobsprovidersFill in the docs and vendor-detection gapsprovidersHarden workable with retry, headers, and serializationprovidersIsRetryableError no longer misclassifies a refused redirectprovidersMake themuse resilient to per-page fetch failuresprovidersPersonio falls back to HTML scrape when the XML feed is disabledprovidersPhenom pagination/retry fixes, drop dead auto-detectionprovidersReject numeric entities outside the XML 1.0 Char setprovidersRoute seven RSS decoders through the shared safe entity decoder, closes #2790providersRoute softgarden and radancy through the shared entity decoderreply-matcherRequire corroboration for partial role-title matchesreply-matcherThe '?' unknown-employer placeholder matched everythingreply-watchReject unrecognized CLI flags instead of treating them as a pathreserve-report-numDo not read a bare date file as a report number, closes #2757role-matcherTokenize non-Latin role titles and scope the mark fold, closes #2781scan-ats-fullCap single-host ATS sweeps at their own concurrencyscanLocate the URL anywhere in a pipeline.md entryscanTake the shared lock for scan-history.tsv appendsset-statusStop the --role guard from folding every non-Latin title to the same keystatesAliases the engine accepts were missing from states.ymlstatusFold Turkish dotted capitals so uppercase tracker rows resolve to canonical statestestsContain a discovered suite that throws at importtheme-styleA `$`-pattern in a profile style value splices the body into the CV'supdateCommit the index so file-mode changes are not droppedupdateIgnore CRLF/LF-only differences when detecting local system edits, closes #2817updateReconcile .gitignore on apply so new ignore rules reach existing installsvelocityCount a web-written transition as an observationverify-cv-factsFold allow_metrics through the same noun synonymsverify-cv-factsTreat a period as a thousands separator toovoice-dnaMake voice-dna.md private via the template patternwebAdd Grok Build CLI to the web runtime pickerwebAnalytics tells an offer-holder they have 0 interviews (and nudges them to try harder)webAnchor the fallback stderr classifier so a word can't fail a runwebCarry the posted: segment so web evaluations reach the POSTED columnwebDetect OpenCode in its default install directorywebEmit the posting URL in the tracker-additions TSV so web runs join the dedupwebEnforce that no runtime grants itself blanket write permissionwebFinish Unicode company keys for explore + registrywebFold Turkish dotted capitals in status keys, and stop hand-copying the state listwebKeep Codex JSONL + exit code authoritative for web scoringwebLet the pipeline table scroll horizontally instead of clipping on narrow screenswebMake the tracker reader agree with parseTrackerRow on row shapewebPrevent Codex run jobs from waiting on stdinwebRead target_roles with the shape it is actually written inwebShow the retry card, not the update-checkout panel, for runtime scan errorswebSkip {n}-RESERVED.md sentinels when looking up reportswebStop the 16-chip cap from truncating the user's own portals.ymlwebStrip the author letter from any lettered block, not just A-GwebTake the core tracker lock in POST /api/statusworkdayKey the cap-hit warning on entry provenance, not on --since
Faster
analyticsDrop redundant existsSync probes before report readsscanRead each dedup source once per scan run
New
webGive the Apply page a way back and a way to record that you applied
Fixed
depsMake js-yaml imports work on both 4.x and 5.xdepsPatch both HIGH advisories in web (js-yaml 4.3.1, nanoid 3.3.18)depsRaise the js-yaml floor to ^4.3.1 and guard itkeysStop the dotted-I fix from collapsing Polish, Lithuanian and MaltesekeysStop the Turkish dotted capital from splitting one employer in twoscanTake the shared lock for scan-history.tsv appendswebAdd Grok Build CLI to the web runtime pickerwebAnalytics tells an offer-holder they have 0 interviews (and nudges them to try harder)webAnchor the fallback stderr classifier so a word can't fail a runwebCarry the posted: segment so web evaluations reach the POSTED columnwebDetect OpenCode in its default install directorywebEmit the posting URL in the tracker-additions TSV so web runs join the dedupwebEnforce that no runtime grants itself blanket write permissionwebFinish Unicode company keys for explore + registrywebFold Turkish dotted capitals in status keys, and stop hand-copying the state listwebKeep Codex JSONL + exit code authoritative for web scoringwebLet the pipeline table scroll horizontally instead of clipping on narrow screenswebMake the tracker reader agree with parseTrackerRow on row shapewebPrevent Codex run jobs from waiting on stdinwebRead target_roles with the shape it is actually written inwebShow the retry card, not the update-checkout panel, for runtime scan errorswebSkip {n}-RESERVED.md sentinels when looking up reportswebStop the 16-chip cap from truncating the user's own portals.ymlwebStrip the author letter from any lettered block, not just A-GwebTake the core tracker lock in POST /api/status
New
coverOptional letter.signature sign-off block, closes #2510cvStrip the Core Competencies section when it has no entries, closes #2509doctorWarn when an API key is overriding the Claude subscriptionfollowupRejection-latency signal, courtesy-threshold onlyinvite-matchRecognize rejection emails, not just interview invitesofertaMinimum-wage lawyer question, arithmetic-onlyofertaPay-transparency range-width check, self-computed onlyoffer-prepSub-statutory terms route to lawyer, no floors tableprovidersAdd join.com SSR __NEXT_DATA__ parserprovidersAdd remotli — Swiss remote job boardscanAdd getro, consider and joinup zero-auth providersscanMake the pipeline and scan-history paths env-overridable, closes #2271
Fixed
a16z-speedrunRetry a transient page failure instead of aborting the whole boardarbeitsagenturMove to the v6 Jobsuche APIcoverFail on an unresolved template token instead of shipping it into the lettercvDrop empty Skills section instead of rendering a bare headercvPair _EMPTY fallbacks with their block so mixed rows stay alignedcvPass a replacer function so $-patterns in candidate text stay literaldedupUse the shared Unicode-aware company key instead of a local ASCII copydedupWrite the blind-via key prefix as an escape, not a raw NUL bytedoctorTreat the cloud billing switches as opt-in, not merely present, closes #2592- Extend the backup-file ignore to .npmignore and pin it with a test
httpConsolidate duplicated User-Agent strings into a shared moduleinvite-matchNon-Latin company names returned zero candidatesjd-skill-gapCRLF-terminated JDs extracted zero skillsmerge-trackerWrite a lower-scored re-evaluation through instead of discarding itprovidersHackernews thread lookup filters by the whoishiring tagprovidersMove The Hub to the v2 jobsandfeatured APIprovidersResize a16z page budgets for the 50-job page sizerepoAdd .gitattributes so Windows checkouts stop producing whole-file diffsscanRead --company/--posted-after/--posted-before in =value form tooscanUnicode-aware keys for role dedup and company matchingseedsWalk every YC page instead of stopping after page 1, closes #2525seedsWalk every YC page instead of stopping after page 1update-systemApply .gitattributes before the files it governswebDerive company matching keys from the core, not an ASCII-only copywebRe-read states.yml when it changes instead of caching it for the process lifetimewebRoute Today's "See all N" link to the fresh-matches viewwebTake Write/Edit away from the dashboard's pdf mode
New
- Add company:funded — review-first funded-company discovery from public RSS sources
cvAdd optional Awards / Honors section to HTML + LaTeX CV templatesi18nAdd Italian translations for interview modespdfOpt-in hiring-manager audit pass — adversarial, research-grounded CV reviewprovidersGetManfred board-wide feed (Spanish/EU tech, salaries published)repostsAdd --help usage block to detect-repostsscanAdd --since, a relative posted-date bound that also stops paging earlytestDynamic upgrade PR gate — old install applies the commit under testwebFollow-up Tracker page with logging, history, and cadence settingsweekly-digestWeekly interview digest aggregator
Fixed
batch-runnerTab-IFS collapse recorded score "-" for every successful offercli--flag=value was silently ignored in five scriptscompany-fundedCatch the layoff spellings #2404 left throughcompany-fundedThe cuts N% layoff exclusion never matchedcompany-historyCount a hire as a company responsecv-factsThe anti-fabrication gate saw nothing in five shipped localescv-factsThe employer/title gate only matched lowercase triggerscv-latexSingle mailto: scheme + escape OT1-unsafe glyphsdashboardLocalize the hired status label and buffer split stream openersdashboardThe progress funnel dropped Hired from every stagededupUse Unicode-aware Via key for blind-employer groupingdepsUpdate npm dependencies (+ Dockerfile playwright pins, web lockfile sync)doctorDetect Playwright MCP in JSONC OpenCode configsfingerprintNon-Latin employers no longer collapse to the same company key- Git-ignore article-digest.md and guard the user layer against tracking
jd-skill-gapWarn when zero skills are classified instead of printing a clean summarylivenessClassify transient 5xx as uncertain, not expiredmerge-trackerCollapse placeholder Notes to the re-eval markermerge-trackerFour silent data-loss paths in the merge loop, with Unicode-safe company matchingprovidersA16z speedrun feed silently truncates to 50 jobsprovidersDead boards throw instead of reading as live-but-empty- Resolve the PDF manifest from the tracker, not the install dir
scan-ats-full--since -5 silently scanned nothing and called it a clean runscan-ats-fullKeep the checkpoint when a resolver outage stops a sweepset-statusClose the report-less-row blind spot and add explicit --row/--report selectors- Show actual LinkedIn URL as cover-letter link text, not the word "LinkedIn"
- Strip GitHub URL scheme case-insensitively in cover letters
sync-pdfReject unknown optionstailorPrompt-cache the openai-tailor.mjs static system prefixtest-allThe states.yml freeze guarded 6 of 9 idstestForbid finish() in discovered suites — it forges the global verdicttestReport the Windows-unobservable lock contention signal instead of failingtestsBudget harness waits for slow runners and preserve crashed-script diagnosticstestsFind Git Bash under Scoop and name the fallback shell in failurestestsIsolate tracker-columns fixtures from the real reports/ directorytestStop test-all silently passing when a node:test suite failstestUse a junction on Windows for the node_modules linktrackerNon-Latin company names all keyed to empty string, silently overwriting each othertrackerRank Hired in dedup, canonicalize its aliases, stop bare tracker-number merges across rolesverify-cv-factsStop the modifier count from deciding whether a claim existsverify-pipelineOrphan check masks and invents orphansverify-pipelineUnicode-aware keys for company/role/Via groupingwebRender PDFs from the backend instead of the spawned agentweekly-digest--from=… was silently ignored, digesting the wrong weekworkableUse the public widget API so large accounts are scanned
Faster
detect-repostsBucket titles instead of comparing every pairfingerprintPopcount table + hoisted loop state in findCrossListingstestsFix the dead SSRF DNS stub and cut three fixed costs from test-all
New
complianceCheck-table-freshness.mjs — staleness validator for jurisdiction tables (closes #2036)contactsCompany-history.mjs, employer silence and repost facts, closes #1711contactsJob-search phonebook with vCard exportcvBlock unsupported employer, title, and tool claims in cover letterscvRecommend CV reuse for similar JDs — deterministic jd-similarity helperdoctorCLI-aware Playwright MCP detection + OpenCode config supportinterview-prepDetect call platform (phone/Zoom/Teams/Meet) from invite textinterview-redflagProtected-grounds question detection with jurisdiction tableinterview/debriefCorrect contradicted facts in the prep file in placeinterview/planWire in interview-prep's sourced-question research before Block 4interviewDebrief directly from an existing transcriptledgerSet-status transition log + mode wiringoferta/applyImmigration-status requirement overreach — jurisdiction table + posting signal + form warningoferta/applyJurisdiction-prohibited content signal — table + Block G + apply-form warningofertaAgency licensing check — jurisdiction table + registry pointer for agency-mediated postings (closes #2037)offer-prepJurisdiction-aware restrictive-covenant notesoutcomeOutcome recording and application archiving, phase 1portalsStandalone fix-slugs.mjs — auto-write ATS slug fixes to portals.ymlprovidersA16z speedrun talent network board-wide feedprovidersAdd iCIMS to the reverse-ATS full sweep, closes #2137providersCryptocurrencyjobs — Web3 job board via public RSS, zero-authradancySupport legacy TalentBrew markup and the JSON results fragmentscan-historyAdditive normalized-company column for reliable repost keyingscanAdd Playwright scanner for Interamt.descanCountry-eligibility filter for remote postings, closes #2093scanNegative-cache resolver refusals and stop the sweep on a resolver outagescanPace DNS lookups so a full sweep can't trip a resolver's rate limitstatsWire followup-cadence's cold classification into activeAppstestSeed-fixture.mjs + era-appropriate install fixturestriageStandalone two-pass triage mode to cut evaluation tokens- Versioned application CV artifact schema — bundles with flat-path coexistence
Fixed
analyze-patternsUse symbol-safe lookarounds so C++, C# and .NET stop vanishing from tech gapsbatchDon't mark a worker-reported failure as completedciA fork signature's valid check must not go red when the ack comment can't postcoverPrevent double comma in achievement bulletsdashboardPin the row's own status to the top of the status pickerdashboardStop reading funding and valuation figures as PaydashboardThe 'hired' status renders with no colour in the pipeline listechojobsKeep hybrid roles distinguishable from remotefollowup-seedAge out an orphaned recover guard so it can't permanently disable stale-lock recoveryfollowupAccept an estimated apply date and report which date the age came fromfollowupRecognise name-only outreach so an empty contact list means no contactjd-skill-gapCanonicalize CV and JD tokens through skill-extractmerge-trackerStop sibling-req clobber when the qualifier is a slashed acronympipeline-lockFloor the ownerless stale check, harden the timeout testsrole-matcherFold accented Latin letters before tokenizing role titles, closes #2207scaffolderMaterialize the Kimi skill entrypoint on symlink-less filesystemsscanA title-stated remote role survives a city-only locationscanIgnore StepStone's volatile rltr param when deduping posting URLsscanPortal-health cross-process lock + resolve PORTAL_HEALTH_PATH from cwdscanRecord auth, server and unknown fetch errors in portal-health instead of reachabletestAccept a materialized skill entrypoint, not just a symlinktracker-utils, followup-seedFloor the ownerless stale-lock check so a just-created lock can't be stolentrackerA data row containing --- is invisible to merge-tracker dedupwebAdd Hired to the states.ts FALLBACK so the degraded path accepts itwebLabel-aware pipeline.md reader — posted:/trust:/note: never misread as columnswebPropagate the Hired terminal-success state across the whole dashboard
New
batchAdd batch-tailor.mjs for bulk CV tailoring of high-scoring roles, closes #1836cliAdd Cursor as a supported CLI hostcvSupport declarative section HTML partials from disk, closes #2183dashboardAdd a RESPONDED filter tab to the pipeline screen, closes #1999dashboardBuild the pay-span regex from an explicit currency listevalToken-budget-aware context compression for the Gemini and OpenAI evaluators, closes #2077i18nAdd Dutch (nl) modeslatex-texSupport resumeItemWithoutTitle bullets and resumeSubItem skillsofertaFlag explicit no-sponsorship as a hard blocker, closes #2016pdfDynamic CSS theming from a profile.yml style block, closes #1837providersAdd Flowxtra board-wide job providerprovidersAdd VDAB zero-auth providerscanDiscover-ats.mjs — resolve a company list to scannable ATS boards, closes #1864skillsExtract the shared skill tokenizer into skill-extract.mjsupskillLearning plan on the aggregate gap heatmap, closes #1740
Fixed
agentic-jobsReplace the broken HTML scraper with the documented REST API, closes #2143agentsCompress AGENTS.md ~20% with zero semantic lossbatchUpdate Claude tier mapping to the current model lineupcvAdd GitHub contact link to the HTML CV pipelinedashboardPersist status changes from viewer Discard/SKIP and stale rowsdedupMerge notes from removed entries instead of dropping them, closes #1833depsUpdate dependency next to v16.2.11 [security]depsUpdate module golang.org/x/sys to v0.47.0doctorTreat missing user prerequisites as non-fatal setup warningsfunnel-velocityCount non-canonical Applied rows in the waiting backlogjd-skill-gapRecognize real-world requirement headers, stop at benefitslivenessNormalize typographic punctuation and accents before matching, closes #2162livenessTreat the SPA "has been filled" phrasing as expired, closes #2211match-starTokenize tag matches so short tokens do not substring-collidenormalize-statusesUse header-mapped columns instead of fixed indicesopencodeAdd missing /career-ops command router, closes #2191patternsRecognize the canonical Hired status in analyze-patternspdfApply the CV section-order check to non-English CVspipelineLock appendToPipeline() against concurrent read-modify-write, closes #2188pluginMirror plugin.json at .github/plugin/ for the awesome-copilot validatorprovidersGuard decodeEntities against out-of-range code pointsreply-matcherDecide rejections before offers to stop mis-typingreply-matcherSanitize domains harvested from tracker notes, closes #2134- Restore empty-Certifications section stripping lost in the v1.22.0 refactor, closes #2118
- Restore the Kimi SKILL.md entrypoint as a real symlink
role-matcherStop collapsing leveled variants into the bare titlerole-matcherStrip the "Member of Technical Staff" prefix before tokenizing, closes #1965role-matcherTreat 'product' as a baseline token so PM sibling specialties stay distinctsalary-gapParse US ranges with the currency symbol on both bounds, closes #2190scanKeep body consumption inside the fetch timeout window, closes #2136scanLowercase the path in normalizeUrlForDedup to catch cross-source duplicatesscanRecover Greenhouse office cities when location.name is a work modelscanWord-boundary location keywords + URL location fallbackset-statusFail closed when a lone company row contradicts --role, closes #2009skillRouting drift + discoverable metadata across the agent surfacesuccessfactorsPreserve brand path for multi-brand RMK tenants, closes #2010- Sync the PDF and scan summary output
testMake the SYSTEM_PATHS coverage guard actually run in CItrackerSet SQLite busy_timeout to avoid SQLITE_BUSY under concurrent access, closes #1957trackerSync the PDF column from data/pdf-index.tsv, closes #1429update-systemRollback removes additions left behind under a directory pathspec, closes #2015update-systemVerify the target manifest materialized instead of reporting success, closes #1998verify-cv-factsDetect metric claims the pattern was silently missingwebResolve nested postcss and sharp advisories via overrides
Faster
scanCache DNS lookups in-process to stop resolver floods, closes #2154
New
cvChinese minimal CV templatecvImprove profile-photo configuration and previewexpandAdd /expand mode to discover missing CV competencies, closes #1521gemini-evalStatic prefix as systemInstruction for implicit cachingi18nSimplified Chinese interview modes (plan/practice/debrief)ofertaBlock G signal 9 — third-party platform location tag mismatchopenai-evalHost-gated prompt-cache breakpoint for the static prefixpdfFirst-class zh-CN typography supportpdfWarn on rendered page overflow, --strict-pages opt-in hard limitpipelinePer-step token breakdown at end of runprovidersAdd Alibaba Group careers providerprovidersAdd Gem scanner providerprovidersAdd Jobvite zero-auth providerprovidersAdd Welcome to the Jungle and Agentic Engineering Jobs providersscan--posted-after/--posted-before absolute posting-date filtersscanAdd visa_filter for surfacing visa-sponsoring roles, closes #2057
Fixed
arbeitsagenturOnly tag nationwide-remote when homeofficetyp is VOLLSTAENDIG- Drop stale plugins-registry.json from updater path manifests
- Honor output language in headless evaluators
ollama-evalMove temperature into options where Ollama reads itpdfDrop empty Education section instead of rendering a bare headerpdfHarden optional-section boundaries, extract shared cv-sections-corepipelineRecognize #1799 score sentinels in verify-pipelineprovidersBuild public SmartRecruiters URLs without /postings/scan-ats-fullWire content_filter into reverse scansscanHide unconfigured salary/content filter summariesscanNormalize cosmetic URL variants for dedupscanSeed the company+role dedupe key from all three seen-sources- Serialize all tracker writers through the shared lock
testKeep discovered suites from terminating the run mid-suitetrackerRecognize the Hired canonical status in merge-tracker and statsverify-cv-factsStop a bare '<' from swallowing source evidence
New
applyWarn before reapplying to a repeat company, closes #1920cover-letterSupport --format and --report CLI arguments, closes #1828dashboardManifesto shortcut, help entry and footer linkemailAdd confirmed-time no-show follow-up variant, closes #1859interview-prepCross-reference coffee chat notes against interview intel, closes #1940interview-redflagFlag scope/compensation mismatch as a separate fifth dimension, closes #1942interview-redflagSuggest a ready-to-copy blacklist row at Reconsider level, closes #1854interview/planWire the existing Panel Intel table into multi-panelist rounds, closes #1857ledgerImmutable n: ordinal per signature + first-contribution question for new signerslivenessAdd Workday to the zero-token ATS liveness API rungofertaBlock G signal for benefits terminology country mismatch, closes #1935onboardingRoute to the manifesto from the README and the first successful scanpdfAdd role name to the tailored PDF filename for multi-role trackingprovidersAdd Oracle Recruiting Cloud zero-auth providerreportsUnified Risk Summary block joining the five company-risk signals, closes #1737salary-gapTrack compensation figures stated per interview round, closes #1852scanPersist and surface the scanner trust signal to pipeline and history, closes #1743scanTrack portal health over time and surface coverage decay, closes #1744
Fixed
cv-templateKeep role header with its bullets when a location line is presentdoctorWarn when Node is below 22.5 instead of passing silently, closes #1829envrcOnly load the Nix flake when Nix is installedinterview-redflagDrop GitHub PR references from candidate-facing output templatesledger-botMake the first-contribution confirmation copy match what shipsledger-botRestore the 'done' confirmation now that the certificate render is liveonboardingRelay the manifesto note in agent-mediated updatespdfDrop empty Projects section instead of rendering a bare headerrole-matcherKeep base titles distinct from specialized-suffix siblings, closes #1881scan-ats-fullRespect data/blacklist.md, closes #1911scanQuiet dotenv so --json stdout stays parseable, closes #1906- Unify atomic report number allocation, closes #1733 #1801 #1835 #1895
update-systemAttribute the post-update manifesto link (utm_source=updater)update-systemSurface commit failures instead of silently swallowing them, closes #1844upskillKeep fetched JD text as a string in the targeted --url-text path, closes #1894
New
onboardingSurface the CareerOps Manifesto after updates and setup
Fixed
upskillCorrect inverted known-skill suppression in targeted mode
New
batchApply compensation reliability checks to batch workersbrowser-extractConfigurable jd-mode text cap via --max-charscalibrationFunnel-velocity.mjs — own funnel vs market benchmarks (#1693, part 1)cvFact validator — block invented metrics in generated CVsdashboardAdd Spanish (es) locale to the i18n catalog, closes #1764dashboardDiscard reason picker with learning loop, closes #1380dashboardI18n extraction for the Go TUI (split from #1666)emailATS-broken fallback scenario — recover a stuck applicationi18nAdd Traditional Chinese (zh-TW) modesi18nChinese salary reliability checks — zh mirror of the compensation tiersimg-to-pdfConvert a screenshot into a PDF for ATS uploadsinterview-prepURL entry path for a role that was never evaluated, closes #1816invite-matchFuzzy-match interview-invite emails to tracker entries- Language.output preference — output language decoupled from market modes
latexOpt-in latex-tex in-place tailoring of user-owned .tex CVs- Make CLAUDE.md a thin @AGENTS.md wrapper — single canonical agent spec
modesWire the opt-in CLI extractor into the oferta + auto-pipeline JD pathsofertaBlock G signal 7 — AI-buzzword vs infrastructure mismatchofertaCompany-type + compensation-reliability tiers in evaluationsopenrouterPrompt-cache the static system prefix via cache_controlpdfDeterministic HTML CV renderer to cut PDF-step token burnpdfJD skill-gap checker before CV generation, zero-LLM, closes #1558pipelineOpenai-tailor.mjs — headless CV tailoring for the no-agent pathproviders4dayweek auto-detect with spoof-safe host matching (#1657 follow-up)providersAdd LaraJobs zero-auth RSS providerprovidersAdd Meituan careers providerprovidersAdd Tencent careers zero-auth providerregistryRegister serper and theirstack provider plugins (#1645, #1697)registrySplit plugins-registry.json into per-plugin filesreply-watchPaste-reply.mjs manual input path for users without Gmail, closes #1802scanData/blacklist.md — user-owned do-not-apply listscanOpt-in max_posting_age_days freshness gatescanPersist provider postedAt to pipeline and scan-historyscanSuppress duplicate roles via company aliases- Spend_tier config for model-agnostic model routing + batch pre-screen gate
templatesConfig-selectable CV and cover-letter templatestrackerAssessment-log.mjs — skills-assessment events with staleness signaltrackerRecognize "—"/"-" as valid score-cell N/A sentinels, closes #1799upskillAggregate skill-gap analysis from tracked reports (#1520, phase 1)upskillTargeted single-posting mode with SSRF-guarded fetch, closes #1739
Fixed
analyzerResolve report paths relative to the tracker filecoverResolve the cover-letter template through the shared resolver- Gitignore data/active-interviews.md (user interview data)
- Ignore logo cache directory
livenessTreat off-posting redirects as uncertain, not active- Load profile and custom rules deterministically in all mode paths
merge-trackerPreserve empty interior cells in tracker-row parsingpdfClean temporary HTML when browser launch failspdfRender markdown bold in CV summary as (ATS-safe)portalsValidator accepts provider-plugin ids like the runtime doesprovidersSupport explicit api: override for ashby/lever with host-pinned guardsreserve-report-numSupport report numbers past 999scanRestore browser-like headers on Workday CXS requests, closes #1811templatesAllowlist the template format to prevent path traversaltestNormalize CRLF at read time for doc assertionstestsClose CodeQL command-injection findings in the test harnesstestsSkip web-reader tests when web/ is absent on core-only installstrackerDetect and prevent duplicate tracker # numbersupdate-systemAdd .claude/hooks/ to USER_PATHSupdate-systemKeep the updater self-loading to survive old→new re-exec
New
- Classify application replies and generate review digest, closes #1585
dashboardHired canonical status + job-landed celebration flowi18nAdd German translations of interview modesi18nAdd Hindi language support with dedicated modes and documentationi18nAdd Indonesian (id) modesinterview-prepStructured Panel Intel tableinterviewCompany red-flag detector from transcript signal- Match employer reply candidates to application tracker, closes #1584
ofertaEmployment classification risk signal in Block G, closes #1630- Offer-prep mode — contract reading companion at Offer stage, closes #1608
offer-prepNegotiation reply-draft step — draft-only email from Items to raisepatternsPer-agency advance-rate analysis from the Via channelpdfAllow intentional CV section reordering via --allow-reorderprovidersAdd Lever EU instance (jobs.eu.lever.co)providersCornerstone OnDemand (csod) + RheinmetallprovidersEchoJobs zero-auth JSON aggregator providerprovidersPhenom People (phenom) + Radancy TalentBrew (radancy)providersTKMS, Heckler & Koch, and Deutsche Bahn providersregistryAdd career-ops-plugin-markdown v0.1.0salaryMode wiring — advertised_comp + observation appendssalarySalary-gap.mjs — append-only compensation observation analyzerscanJD-content fingerprinting — flag agency+direct cross-listings, closes #1597scanOpt-in CLI page extractor (browser-extract.mjs)scanPersist per-run scan counters to data/scan-runs.tsvscanScope content_filter per title-category via by_title_keywordscoringCulture-screen dimension with structural cappingstatsLifetime pipeline stats aggregator- Titles mode — suggest adjacent job titles from the CV, closes #1632
trackerSet-status.mjs — canonical CLI for tracker status updates, closes #1428trackerVia channel — end employer vs recruiter/agency intermediary
Fixed
dashboardDuplicate tracker headers resolve last-occurrence to match JS readerdepsUpdate npm dependenciesmodesEnforce modes/_custom.md overrides across mode files, closes #1618modesWire modes/_custom.md into the read path — house rules were write-onlypdfExplain the agentic HTML flow in generate-pdf.mjs usage output- Prevent role-matcher from collapsing different seniorities, closes #1616
scan-ats-fullReject unrecognized CLI flags with usage helptrackerRetrofit remaining positional readers onto the shared header-aware parserupdateRaise local git timeout default 30s -> 120s for cloud-evicted treesweb44px tap-targets at the component levelwebContrast tokens — AA across both themeswebPortals copy + analytics semanticswebUx-audit cleanup — CostBadge global CSS + last sub-44 stragglers
New
- Add the opt-in experimental web UI surface (web/) — isolated versioning, CI and packaging
add/career-ops add — fetch a project/paper/role into cv.md and article-digest.mdagent-inboxQueue requests for the next sessionapplyPre-scan forms for knock-out questions before draftingcontactoShort-greeting variant for chat-style outreachemailFormal application email drafts — draft-only, never sends- Experimental local-first web UI (opt-in alpha)
findResolve a company/role/number query to its full pipeline identityfollowupSeed a pinned first follow-up when a row turns Appliedi18nAdd Korean career-ops modesi18nTranslate interview modes to French, closes #1489i18nTranslate interview modes to Spanish, closes #1490ofertaFlag 'remote' location contradicted by JD-body signalspatternsRecruiting-process friction signal at company levelpatternsTranscript-driven targeting correction (Step 1b) — closes #960pipelineOptional per-offer note in the pipeline writerportalsProbe non-ATS boards through the provider layerprofileCandidate contact-channel preference for outreach CTAs, closes #1556providersAdd Get on Board (getonbrd) zero-auth providerprovidersAmazon (amazon.jobs) and Avature zero-token providersprovidersAvature self-heals jobOffset→offset paginationprovidersBeesite (milch & zucker) + softgarden providersprovidersDassault Systèmes zero-token provider (Exalead XML)providersHonour api: on workday and smartrecruitersprovidersSAP SuccessFactors (RMK) zero-token providerprovidersSuccessFactors CSB strategy + bounded health-probe budgetregistryAdd startup boards pluginreserve-report-num--count N contiguous range reservationscanReport unreachable boards with error classification + doctor sweepverifyDetect duplicate and orphan reportswebConfig microcopy humanized (P1.5)webCost affordance — CostBadge muted (P1.6)webDedupe bug reports at write — stable fingerprint + click-gated similar-issue searchwebEmpty-state free-scan button (P0.1)webExtract cleanChips to a tested module + tab/CR paste delimiterwebInbox triage — Abundance → Triage → Shortlist → Opt-in ScorewebMobile tap-targets ≥44px + FAB clearancewebOrange hierarchy — brand-soft Mark-applied + inbox cost legend (P1.4)webReport progressive disclosure (P0.3+P1.8)webRicher bug-report diagnostics — data-shape fingerprint, core version, API errors
Fixed
- Correctness sweep across tracker, providers, and eval reporting, closes #1527
dedupRequire exact company+role match so distinct same-company roles surviveinfraExempt web/ from the SYSTEM_PATHS coverage guard (isolation contract)merge-trackerDetect TSV score/status column order by header, closes #1427merge-trackerGuard tier-3 fuzzy dedup with req/job number, closes #1524onboardingAuto-copy template seeds in doctor --json (#782, #1369)pathsPrefer cygpath over wslpath in toBashPath()pdfUse CSS @page setup for marginspluginsHarden manifest path containment against symlink traversal- Prevent notion plugin from mangling slash-formatted scores
providersAvature parser tolerates two live tenant markup variantsprovidersHarden workday pagination against 429s, API caps, and dateless tenantsprovidersUpdate Glints API to v2-alc/searchJobsV3, document Jobstreet GraphQL migrationprovidersWorkday honors ctx.maxPages so the liveness probe stops cleanlyscanLoad .env credentials via optional dotenv importupdateMake updater timeout budgets configurableupdatePreserve local CLAUDE.md additions during /career-ops updateupdaterAdd .claude/settings.json to USER_PATHS, closes #1408webBump FOLLOW-UPS DUE tap-targets to 44px on mobilewebPin turbopack.root to prevent Windows postcss OOMwebPoint the 'Get one free' link at the free-AI-engine guidewebRestore the report-a-bug kit lost between the RC branch and main
New
- Add interview skill modes — plan, practice, debrief
applyATS auto-fill for Greenhouse / Ashby / Lever — prepare, don't submitdiscoverySeed company universe from VC portfolios (YC / a16z)…patternsATS channel yield analysis — algorithmic-monoculture awarepluginsSeed/successor model — community plugins can supersede a bundled referenceprovidersAdd HigherEdJobs RSS providerprovidersAdd JibeApply providerprovidersAdd NoDesk providerprovidersAdd Teamtailor zero-auth RSS providerregistryAdd career-ops-plugin-obsidian v0.1.0registryAdd career-ops-plugin-tavily v0.1.0registryAdd google-calendar plugin v0.1.0scanAdd seniority-tier classifier with optional skip_tiers fi…
Fixed
cv-templateKeep role titles from orphaning at page breaksdashboardMap tracker columns by header namefollowup-cadenceSchedule first responded follow-up with responded_initiallivenessAdd Ashby API rung so live jobs.ashbyhq.com postings aren't false-expiredpdfAnchor the output path-traversal guard to the repo root, not cwdpdfKeep a right gutter so right-aligned CV content isn't clippedpdfThread manifest metadata through render options
New
- Add opt-in plugin system (engine + supply-chain governance + registry)
- Add optional profile photo support for resume template
dashboardAdd cover letter hotkey to report viewerdashboardHotkeys to view (d) and regenerate (D) the CV PDF- OpenRouter runner — free models, auto-blacklist, no Claude CLI required
providersAdd 4 Day Week provider (public zero-auth API)providersAdd Arbeitnow providerprovidersAdd Hacker News "Who is hiring?" provider (Algolia API)providersAdd Himalayas providerprovidersAdd Jobicy providerprovidersAdd Jobspresso providerprovidersAdd Landing.jobs providerprovidersAdd Pinpoint ATS providerprovidersAdd Rippling ATS providerprovidersAdd The Hub providerprovidersAdd The Muse providerscanAdd detect-reposts.mjs repost detection from scan-history.tsvscanAdd JustJoin and NoFluffJobs providersscanPersist compensation to pipeline.mdscriptsAdd build:dashboard and serve:dashboard npm scriptsupdaterStructural SYSTEM_PATHS coverage check
Fixed
depsUpdate dependency playwright to v1.61.1evalBound research budget to a single-pass query capscanTighter company matching and dedup order for cooldown filtersecurityHarden batch tmpfile, PDF output path, and tracker cellstrackerShare header-name column mapping across all readers
New
- Add modes/_custom.md for user custom instructions
applyATS behavioural question matcher from story-bank.mdarchiveAdd archive-posting.mjs to save live job postings as PDFbatchAdd --limit flag + budget guidecliAdd first-class Codex supportcliAdd Grok Build CLI supportcliRegister Kimi as a supported CLI hostcvAdd opt-in profile photo for DACH/European CVsevalAdd openai-eval.mjs for any OpenAI-compatible endpointmodesAdd Danish (da) localemodesAdd EU SWE application calibration modemodesAdd recruiter-side application heuristicsollamaAdd local interactive Ollama evaluatorprovidersAdd Comeet ATS providerprovidersAdd Personio ATS providerprovidersAdd WeWorkRemotely RSS provider, closes #1241scanAdd early trust validation and job trust metadatascanPreserve job location in pipeline.md
Fixed
batchSingle-worker lock fallback + exit-127 shim-swap retrymodesBound subagent delegation to prevent research fan-out, closes #1235pluginDrop non-schema skills/permissions keys from plugin.jsonscanTrim title-filter keywords before the length checktemplateScope break-inside to atomic units to prevent CV pagination breaksupdaterResolve self-reexec checkout from the import closure, closes #1245
New
arbeitsagenturConfig-driven remoteMatch + server-side homeoffice filterbatchAdd --skip-pdf flag to batch-runner.shdashboardAdd in-viewer status picker overlaydashboardCustomizable columns with column pickerdashboardRecognize EUR/GBP/CHF pay and international cities in pipeline derivelivenessZero-token ATS API check before Playwright (closes #574)modesAdd Polish (pl) locale modesmodesOptional voice-dna.md writing guardrailportalsAdd verify-portals.mjs ATS slug validatorprovidersAdd BambooHR providerprovidersAdd Breezy HR scanner providerscanAdd --json output, --include-undated, and --shuffle to scan-ats-fulltrackerAdd `delete --num N` to remove an application row safely
Fixed
- Auto-create data/pipeline.md and harden Playwright doctor check
batchHarden status score handlingbatchUse awk instead of bc for score mathcontractExpand interview-prep/* coverage in DATA_CONTRACTdashboardRewrite only the Status cell on status update- Images not rendering in PDF output due to about:blank origin
- Normalize report links from data files
providersHarden lever/ashby/workday against SSRF via redirectrecruiteeKeep offer URLs on tenant custom domainsscanGuard title-filter keyword normalization against malformed configscanMatch short acronym title-filter keywords on word boundariestemplateEmit mailto:/tel: links for email and phone in CV headertemplatesDisable fi/fl ligatures for ATS-clean PDF text extraction
New
batchAdd --status and --watch progress monitoring to batch-runner.shcliAdd Antigravity CLI compatibilityi18nAdd Chinese language modes for China-market job seekerspdfRender Japanese CVs with a lang="ja" CJK font fallbackprovidersAdd Jobstreet and Glints providers for the Indonesian market, closes #1085providersAdd RemoteOK, Remotive, Working Nomads, IBM board providers, closes #1075providersPort Arbeitsagentur to an in-process providerscanAdd content/description filter for providers
Fixed
ashbyInclude secondaryLocations so EU-eligible roles surface, closes #1073batchReconcile pipeline.md inbox after batch runsdashboardArchetype regex matches English and Spanish reportsdashboardOpen Windows targets without shelldashboardReport last-contact in calendar days, not hours-since-midnightfollowupResolve report path relative to tracker directory, closes #1070followupUse the real application date from notes, not the eval dategeminiValidate evaluation report shapelatexLanguage-agnostic section validation + CJK guardmerge-trackerRequire company match for number-based dedup, closes #912pdfAuto-install Playwright chromium after updatepdfUse ATS-safe system fonts for clean CV text extraction, closes #1074pipelineAdd batch liveness sweep for unconfirmed entriesscanSanitize external metadata before writessecurityHarden local-parser against command/arg injection and scan-ats against SSRFtrackerPreserve notes column when rewriting rows without a trailing pipeupdateMaterialize skill entrypoints without symlinksupdaterGit-safety on abort + preserve user files on safety-violation rollback
New
- Add first-class OpenCode support alongside Claude Code
coverAdd optional salutation/greeting to cover letterscoverLoad _profile.md so personalization governs the letterdoctorWarn when Playwright MCP tools are not configuredtrackerMap tracker columns by header nametrackerSQLite derived index over applications.md — phase 1
Fixed
cvAlign certification org column width across rowsdepsUpdate npm dependencies to v1.61.0evalGate dead links before evaluation in oferta and auto-pipelinegenerate-pdfInline local fonts as data: URLs so they actually embedmerge-trackerSerialize concurrent tracker merges with a filesystem lockpdfWait for load instead of networkidle during render- Remove story-bank.md from git tracking
skillSurface latex mode in command menustestsRun tracker-mutating scripts with --dry-run in script checkstrackerPrevent dedup from deleting distinct same-company rolesupdateDistribute missing runtime pathsupdateMatch Release Please component-prefixed tags in version checkupdateRebuild dashboard binary after Go source changesupdateUse target updater manifest during apply
New
applyAdd preflight liveness and role-match gatebatchPause batch runner on Claude session limitscoverAdd cover letter generation modecvAdd build-cv-latex.mjs structured JSON to LaTeX rendererdashboardKeep discard reason visible in pipeline previewdashboardSortable Location, Pay, and Last-contact columns in pipeline view- Dockerize project for hosts blocked from native Playwright install
doctorAdopt doctor --json as the single onboarding state sourcefollowupRead cadence settings from profile.ymli18nAdd full Arabic language support and modesmodesAdd interactive interview onboarding subcommandscanAdd --rediscover-404 fallback for moved tracked postingsscanAdd configurable salary filtering to the zero-token scannerscanAdd portals.yml schema validatorscanAdd scan-ats-full.mjs — reverse-discover jobs from public ATS APIsscanAdd scan-history TTL and recheck policyscanAdd SolidJobs provider and job_boards support
Fixed
applyPreserve form field contractsbatchAppend profile context to worker promptsbatchIsolate workers from inherited MCP to prevent parallel deadlockbatchStop after min-score skip instead of falling through to completeddashboardResolve tracker-relative report links against the tracker directory, closes #779doctorSingle source of truth for onboarding state via doctor --jsonflakeDeclare systems so the devShell resolves on macOS, closes #334livenessStop false-expiring postings behind anti-bot wallsmerge-trackerRequire company match on exact entry-number dedupmerge-trackerUse token-union ratio in roleFuzzyMatch to stop cross-role dedup, closes #751patternsParse header-style and Detected-archetype formats in analyze-patternspdfReject CV section ordering that diverges from cv.md sourcepipelineAtomic report-number reservation for parallel workersreleaseAuto-sync VERSION via release-please generic extra-filereleaseSync VERSION file to 1.9.0securityClose SSRF guard bypasses in liveness-browserupdateBootstrap tracker-links.mjs and scaffolder/ for v1.8.x to v1.9.0 upgradesupdateRun curl version checks concurrently in check()updateUse curl in check() so updates work inside the Claude Code sandbox, closes #754
New
- Add npx career-ops scaffolder for one-command install, closes #855
- Add structured machine summaries to evaluations
- Add Ukrainian language and market support
batchAdd --model flag to batch-runner.shdashboard/-key live search across pipeline rowsi18nAdd Turkish (TR) language modesinterview-prepSplit prep by interviewer audience- Make PDF auto-generation configurable via auto_pdf_score_threshold
scanAdd --verify flag to drop expired postings before pipeline appendscanAdd local-parser provider and agent skip rulesscanAdd optional always_allow tier to location_filter, closes #650scanAdd Workable, SmartRecruiters, Recruitee ATS parsers, closes #651
Fixed
batchWait and retry batch workers on rate limits, closes #505dashboardWidth-aware Markdown rendering with table wrapping in viewergeminiAuto-merge Gemini evals into the tracker instead of a manual-edit reminder- Make tracker report links relative to the tracker file
pdfDon't spell out ambiguous ¥ currency symbolpdfNormalize arrows, middots, and currency symbols for ATS extraction, closes #730- Register the career-ops skill in Claude Code via user_invocable key, closes #763
releaseSync VERSION file to 1.8.0scaffolderDon't pre-create user config so agent onboarding triggers, closes #855scanBootstrap providers/ on update + harden greenhouse detect()scanRaise Ashby provider timeout + add backoff retryscanSurface websearch-handoff companies in the run summary, closes #747- Scope npm package as @santifer/career-ops
update-systemAdd tracker-links.mjs to SYSTEM_PATHSupdate-systemApply() safety violation reverts cleanly and releases lockupdate-systemBootstrap liveness-browser.mjs for v1.7→v1.8 upgrades, closes #704update-systemRollback() removes paths absent from backup branchupdateDistribute missing modes, locales and CLI configs via update-systemupdateTimestamp backup branches and roll back to the newest, closes #733
New
scanOptional location_filter in portals.yml + persist location to scan-history
Fixed
batchWorkers read modes/_profile.md and config/profile.yml, closes #534depsUpdate dotenv to v17gemini-evalInclude profile.yml and _profile.md in evaluation, closes #617gemini-evalRedact API key from error logs, harden summary parsinggemini-evalSwitch default model to non-deprecated endpoint, surface 429 guidance, closes #614manifestAlign plugin.json skills field with Claude Code plugin schemamerge-trackerPreserve short specialty acronyms, require non-baseline overlap, closes #633modesMake /career-ops deep respect user language, not JD languageportalsUpdate Weights & Biases entry to CoreWeave acquisitionreleaseSync VERSION file to 1.7.1scanValidate Greenhouse URL hostname against allowlist to prevent SSRFtemplatesAlign CV certification rows on a 3-column gridupdate-systemAllow writing-samples/README.md as system-owned fileupdate-systemBootstrap .agents/ for v1.6→v1.7 migrationupdate-systemDefensive VERSION parsing for release-please marker