career-ops-v1.32.0
asheshgoplani/agent-deckcareer-ops-v1.32.0Sep 3, 2026by github-actions[bot]
AI Summary
This major release introduces new job aggregators (Built In, Garena) and scanner providers (Feishu Jobs, MokaHR), along with H1B sponsorship tracking. It also enhances the LaTeX CV generation with CJK support and improves stability across agent operations, email parsing, and merge tracking.
Key Highlights
- Add Built In aggregator and Garena careers providers
- Add H1B sponsorship history plugin for US roles
- Add CJK support for LaTeX CVs via tectonic
- Remember permanently dead ATS boards
- Add confirmation requirement before installation
New Features
- Discard-log analytics
- H1B sponsorship plugin
- Built In provider
- Feishu Jobs provider
- MokaHR provider
- Garena provider
- Durable scan receipt
- CJK LaTeX support
- Confirmation before install
Full Release Notes
## [1.32.0](https://github.com/career-ops-hq/career-ops/compare/career-ops-v1.31.0...career-ops-v1.32.0) (2026-09-03) ### Features * **discard:** add discard-log analytics and tuning summary ([#3443](https://github.com/career-ops-hq/career-ops/issues/3443)) ([8827f40](https://github.com/career-ops-hq/career-ops/commit/8827f4064bf6afe3e8922ec0b99ef74e74c7c99a)), closes [#3392](https://github.com/career-ops-hq/career-ops/issues/3392) * **oferta:** add evidence-tiered requirement importance to Block B ([#3596](https://github.com/career-ops-hq/career-ops/issues/3596)) ([14710e2](https://github.com/career-ops-hq/career-ops/commit/14710e29a6a801ea3ae52bb3f15756dc9ada7d29)) * **plugin:** add h1b-sponsor for DOL sponsorship history on US roles ([#2635](https://github.com/career-ops-hq/career-ops/issues/2635)) ([11ae621](https://github.com/career-ops-hq/career-ops/commit/11ae621cc505a21d835abc751fa0e2ac8ac9959d)) * **providers:** add Built In aggregator provider ([#3645](https://github.com/career-ops-hq/career-ops/issues/3645)) ([291c301](https://github.com/career-ops-hq/career-ops/commit/291c301051f54936dd14d65200a1fd06db6c2989)) * **providers:** add Feishu Jobs and MokaHR scanner providers ([#3491](https://github.com/career-ops-hq/career-ops/issues/3491)) ([1696bec](https://github.com/career-ops-hq/career-ops/commit/1696bec4d021768e7359f9aad6b329cba883da20)) * **providers:** add Garena careers provider ([#3567](https://github.com/career-ops-hq/career-ops/issues/3567)) ([d88cfe1](https://github.com/career-ops-hq/career-ops/commit/d88cfe160cfc1637fe5b5562726726d00a020974)) * **scan:** add a durable machine-readable scan receipt ([#3532](https://github.com/career-ops-hq/career-ops/issues/3532)) ([26f47d2](https://github.com/career-ops-hq/career-ops/commit/26f47d2972b6a2bcf00c2aa707744691a0f0ec63)) * **scan:** remember permanently dead ATS boards ([#2869](https://github.com/career-ops-hq/career-ops/issues/2869)) ([bf54f20](https://github.com/career-ops-hq/career-ops/commit/bf54f20eaf295808a037cac0c5dec2810798f4e9)), closes [#2840](https://github.com/career-ops-hq/career-ops/issues/2840) * **templates:** CJK support for the LaTeX/Overleaf CV path via tectonic ([#3554](https://github.com/career-ops-hq/career-ops/issues/3554)) ([1b58724](https://github.com/career-ops-hq/career-ops/commit/1b5872460bf57cd810807ac33957c2f5104dd61c)), closes [#3553](https://github.com/career-ops-hq/career-ops/issues/3553) * **updater:** require confirmation before installation ([#2866](https://github.com/career-ops-hq/career-ops/issues/2866)) ([f33b8e2](https://github.com/career-ops-hq/career-ops/commit/f33b8e2dfa88b02b13460332c3d09e152d8e3a7b)), closes [#2865](https://github.com/career-ops-hq/career-ops/issues/2865) ### Bug Fixes * **agent-inbox:** lock resolve rewrites so a concurrent add is never dropped ([#3479](https://github.com/career-ops-hq/career-ops/issues/3479)) ([e26a8cc](https://github.com/career-ops-hq/career-ops/commit/e26a8cc23ca0dc5c4e7d00873347e690e2b6b2e6)), closes [#3478](https://github.com/career-ops-hq/career-ops/issues/3478) * **analyze-patterns:** stop counting Applied as positive ([#3667](https://github.com/career-ops-hq/career-ops/issues/3667)) ([f4df0c6](https://github.com/career-ops-hq/career-ops/commit/f4df0c6ab0325ed42403759c7724456eba3b5c9f)) * **calibrate:** resolve the tracker colmap from the line array, not the header line ([#3496](https://github.com/career-ops-hq/career-ops/issues/3496)) ([abaf075](https://github.com/career-ops-hq/career-ops/commit/abaf07565ba888d181cf8d1d094610f3c0c3e1f1)), closes [#3495](https://github.com/career-ops-hq/career-ops/issues/3495) * **cv:** block delegated authorship escalation ([#3657](https://github.com/career-ops-hq/career-ops/issues/3657)) ([08bdb3f](https://github.com/career-ops-hq/career-ops/commit/08bdb3f184f4abf7b355915609a71985d30c1881)) * **cv:** reject CV payloads whose section keys the builders never read ([#3524](https://github.com/career-ops-hq/career-ops/issues/3524)) ([9f6efb5](https://github.com/career-ops-hq/career-ops/commit/9f6efb5c73d890675c269099fd1b182d3d6ddb42)), closes [#3523](https://github.com/career-ops-hq/career-ops/issues/3523) * **dashboard:** match company slugs at hyphen boundaries so Meta cannot open Metabase's CV ([#3483](https://github.com/career-ops-hq/career-ops/issues/3483)) ([f5e2753](https://github.com/career-ops-hq/career-ops/commit/f5e27531e866514441bcd6f9e03b56db93b93c91)) * **data-root:** resolve templates/states.yml from the codebase, not the data root ([#3503](https://github.com/career-ops-hq/career-ops/issues/3503)) ([be61f60](https://github.com/career-ops-hq/career-ops/commit/be61f60be88aed8277cef2f498140c098517e65e)) * **email:** align fit points with the tailored CV via the pdf-index row ([#3473](https://github.com/career-ops-hq/career-ops/issues/3473)) ([d08aac2](https://github.com/career-ops-hq/career-ops/commit/d08aac29e33775245f70d1f5b9a781103f40777d)), closes [#3460](https://github.com/career-ops-hq/career-ops/issues/3460) * **fact-gate:** count education and training nouns as metrics ([#3646](https://github.com/career-ops-hq/career-ops/issues/3646)) ([12b1a4a](https://github.com/career-ops-hq/career-ops/commit/12b1a4a2f54cdabfa33faf35519c55e255899155)) * **funnel-velocity:** fold status-log history into calibration rates ([#3494](https://github.com/career-ops-hq/career-ops/issues/3494)) ([369db53](https://github.com/career-ops-hq/career-ops/commit/369db538ccf4c62eff5de890433a9e00805b6d41)), closes [#3493](https://github.com/career-ops-hq/career-ops/issues/3493) * **gemini:** resolve encoding mojibake on Windows and route localized modes ([#1443](https://github.com/career-ops-hq/career-ops/issues/1443)) ([3f54486](https://github.com/career-ops-hq/career-ops/commit/3f54486e540a74ef1a6eca81f2bda9ab59bc7ca4)) * **gitignore:** the tracker's derived SQLite index is unignored outside data/ ([#3468](https://github.com/career-ops-hq/career-ops/issues/3468)) ([bc5771a](https://github.com/career-ops-hq/career-ops/commit/bc5771a12fab34ce28b66856be54ece6504b6e3a)) * **gmail:** skip page assets so logos stop landing as job leads ([#3649](https://github.com/career-ops-hq/career-ops/issues/3649)) ([c172fd8](https://github.com/career-ops-hq/career-ops/commit/c172fd8993862f5ad99dfdf6dc67f3cc650d087f)) * harden context budget prompt assembly ([#3591](https://github.com/career-ops-hq/career-ops/issues/3591)) ([1be498d](https://github.com/career-ops-hq/career-ops/commit/1be498d177cf8a52e6f7affe2d00f12baf552394)) * **invite-match:** stop extractReqId backtracking quadratically ([#3463](https://github.com/career-ops-hq/career-ops/issues/3463)) ([637e7eb](https://github.com/career-ops-hq/career-ops/commit/637e7eb718d7ac1a2bb19706b892b07e7f636b78)) * **jd-skill-gap:** recognize Traditional and Simplified Chinese requirement headings ([#3631](https://github.com/career-ops-hq/career-ops/issues/3631)) ([08e8747](https://github.com/career-ops-hq/career-ops/commit/08e8747fe0a77756db54b0f88bd3e8dc45b8c58a)) * **merge-tracker:** a corporate-suffix variant is the same employer ([#3666](https://github.com/career-ops-hq/career-ops/issues/3666)) ([a4f5276](https://github.com/career-ops-hq/career-ops/commit/a4f52765f1920c353933984ff5ed71da50bedf36)), closes [#3665](https://github.com/career-ops-hq/career-ops/issues/3665) * **merge-tracker:** two '?' rows with no Via silently merge, overwriting one ([#3466](https://github.com/career-ops-hq/career-ops/issues/3466)) ([8f22538](https://github.com/career-ops-hq/career-ops/commit/8f22538a1458ee7fe5ad0da70183facf72361d90)), closes [#3410](https://github.com/career-ops-hq/career-ops/issues/3410) * **oferta:** lead Block B with the decisive columns and freeze their order ([#3660](https://github.com/career-ops-hq/career-ops/issues/3660)) ([abc5a89](https://github.com/career-ops-hq/career-ops/commit/abc5a893a61b752b1e410d5145c044b82638f0d2)) * **openai-eval:** stream the evaluation call instead of a single buffered response ([#3501](https://github.com/career-ops-hq/career-ops/issues/3501)) ([ee6e8f6](https://github.com/career-ops-hq/career-ops/commit/ee6e8f63ce6f1a62d64e22a9fb37c28b2a000429)) * **openrouter:** write scan-history and pipeline through the shared locked writers ([#3462](https://github.com/career-ops-hq/career-ops/issues/3462)) ([81e27c5](https://github.com/career-ops-hq/career-ops/commit/81e27c5e9b6225b73383dea4f9fe464977821123)) * **pdf:** accept the canonical modes/pdf.md tailoring order in validateCvSectionOrder ([#3642](https://github.com/career-ops-hq/career-ops/issues/3642)) ([a9c957c](https://github.com/career-ops-hq/career-ops/commit/a9c957caedea5dbdc17d165d072dd66d330b42d4)) * **pdf:** run the fact gate before rendering a CV ([#3647](https://github.com/career-ops-hq/career-ops/issues/3647)) ([1b299fa](https://github.com/career-ops-hq/career-ops/commit/1b299faa659c782d2385c4119191c382a0b01dea)) * **plugins:** a YAML typo in plugins.yml no longer destroys the whole config ([#3593](https://github.com/career-ops-hq/career-ops/issues/3593)) ([00f185d](https://github.com/career-ops-hq/career-ops/commit/00f185d672dd7bf2499f5a3ae7ee7be340493da3)), closes [#3592](https://github.com/career-ops-hq/career-ops/issues/3592) * **portals:** sweep and validate job_boards, not only tracked_companies ([#3448](https://github.com/career-ops-hq/career-ops/issues/3448)) ([2c5894e](https://github.com/career-ops-hq/career-ops/commit/2c5894e0a4a74146bf04b8c8532e338d45a131ea)) * **reply-matcher:** a partial role-word match must be a whole word ([#3535](https://github.com/career-ops-hq/career-ops/issues/3535)) ([90d311f](https://github.com/career-ops-hq/career-ops/commit/90d311f25684ed66180825d679ce78c38adb62e7)) * **reserve-report-num:** handle --help/-h explicitly ([#3569](https://github.com/career-ops-hq/career-ops/issues/3569)) ([84693b4](https://github.com/career-ops-hq/career-ops/commit/84693b407326e0ae65274e2eebaf613de890f515)) * **role-matcher:** a level stated on both sides of a title must agree ([#3651](https://github.com/career-ops-hq/career-ops/issues/3651)) ([dfeb2fc](https://github.com/career-ops-hq/career-ops/commit/dfeb2fccd4a0c2a27e666969823150b61ee91159)) * **scaffolder:** restore the published npm package name ([5e2bf5b](https://github.com/career-ops-hq/career-ops/commit/5e2bf5b9726097413294f3acffb3a2025ae9570f)) * **scan-ats-full:** collapse a Workday requisition served under several sites of one tenant ([#3446](https://github.com/career-ops-hq/career-ops/issues/3446)) ([5c26e4a](https://github.com/career-ops-hq/career-ops/commit/5c26e4af43b89a11f79caa7592a1a2e03caeb55d)) * **scan-ats-full:** send the progress counter to stderr under --json ([fa6a84f](https://github.com/career-ops-hq/career-ops/commit/fa6a84f48d949bd75ff5d94839494a1ef7a70a20)) * **scan:** do not block Dublin OH as Ireland ([#3633](https://github.com/career-ops-hq/career-ops/issues/3633)) ([56429bf](https://github.com/career-ops-hq/career-ops/commit/56429bfaa07ec695581500fbfd12184e9ba43723)) * **scan:** resolve scanner user data against the data root, not the cwd ([#3511](https://github.com/career-ops-hq/career-ops/issues/3511)) ([7d7b0f9](https://github.com/career-ops-hq/career-ops/commit/7d7b0f97d447a2d1c72b7b3a24c9c99ebc9a5d7a)), closes [#3510](https://github.com/career-ops-hq/career-ops/issues/3510) * **set-status:** a transition into Applied seeds the follow-up from set-status itself ([#3470](https://github.com/career-ops-hq/career-ops/issues/3470)) ([9312da7](https://github.com/career-ops-hq/career-ops/commit/9312da7ee49e24f496dcb81adec86530de644051)), closes [#3459](https://github.com/career-ops-hq/career-ops/issues/3459) * **skill-extract:** recognize marketing/GTM skills and stop reporting tracked employers as gaps ([#3537](https://github.com/career-ops-hq/career-ops/issues/3537)) ([f8de04e](https://github.com/career-ops-hq/career-ops/commit/f8de04e20444fbd80d034c0d37fd3d47a82b0501)) * **templates:** honor profile font_family in the Traditional Chinese CV block ([#3525](https://github.com/career-ops-hq/career-ops/issues/3525)) ([f0d2082](https://github.com/career-ops-hq/career-ops/commit/f0d2082a4f2b7668e825016bccb18e219b3c982d)), closes [#3154](https://github.com/career-ops-hq/career-ops/issues/3154) * **templates:** keep CJK fallback fonts active for ja, zh-CN and ko ([#3531](https://github.com/career-ops-hq/career-ops/issues/3531)) ([f3b7c60](https://github.com/career-ops-hq/career-ops/commit/f3b7c60f18ff25e8122a3cea6d1e22c4005acae3)) * **tests:** answer gitignore probes that cross a user-layer symlink ([#3598](https://github.com/career-ops-hq/career-ops/issues/3598)) ([aa8832f](https://github.com/career-ops-hq/career-ops/commit/aa8832f2c1795f2ae9e802d9eb5d20fb807f3e00)) * **tests:** stop the photo suite writing cv-preview.html into the user's data root ([#3599](https://github.com/career-ops-hq/career-ops/issues/3599)) ([f1b7a8e](https://github.com/career-ops-hq/career-ops/commit/f1b7a8e582c385254539488fb7c82224a333a49a)) * **tracker:** reject malformed application IDs instead of coercing them ([#3485](https://github.com/career-ops-hq/career-ops/issues/3485)) ([c68a7d4](https://github.com/career-ops-hq/career-ops/commit/c68a7d46b6fe1e5869b8316b0814cc4c0675cd95)) * **tracker:** resolve templates/states.yml from the module, not the cwd ([#3509](https://github.com/career-ops-hq/career-ops/issues/3509)) ([08b7f31](https://github.com/career-ops-hq/career-ops/commit/08b7f317b596fa010d06cd28f8a9b53799c02fd1)), closes [#3508](https://github.com/career-ops-hq/career-ops/issues/3508) * **tracker:** resolve the derived index path at call time, not at import ([#3507](https://github.com/career-ops-hq/career-ops/issues/3507)) ([9bd4445](https://github.com/career-ops-hq/career-ops/commit/9bd4445e25e1308aefe44e6f04c1750c373edaff)) * **tracker:** sort the applications table by # ascending on write ([#3515](https://github.com/career-ops-hq/career-ops/issues/3515)) ([372cd04](https://github.com/career-ops-hq/career-ops/commit/372cd043b35e8d07cd522fec955a65252c0906db)) * **triage:** fall back to Playwright when WebFetch finds nothing ([#3571](https://github.com/career-ops-hq/career-ops/issues/3571)) ([10b93a5](https://github.com/career-ops-hq/career-ops/commit/10b93a5f6e4444332243fefaef65b8b153835fc1)) * **update-system:** apply() cannot commit when a path it stages is ignored or never tracked ([ae6909f](https://github.com/career-ops-hq/career-ops/commit/ae6909f718c9316a0d1424379e1688f438a07706)) * **update:** point the updater at the repository's new home ([9063495](https://github.com/career-ops-hq/career-ops/commit/9063495036e253668e42d6bbbd4234e750b25782)) * **updater:** back up self-bootstrap edits before checkout ([#3474](https://github.com/career-ops-hq/career-ops/issues/3474)) ([203c90b](https://github.com/career-ops-hq/career-ops/commit/203c90b79e632209e3a55068499f8ca5cbea489e)) * **updater:** scope commits to shipped files ([#3688](https://github.com/career-ops-hq/career-ops/issues/3688)) ([455bf37](https://github.com/career-ops-hq/career-ops/commit/455bf375a84508a955acd58819392fa9f7a07bd0)) * **verify-cv-facts:** bind a count to the nearest metric noun, not the farthest ([#3465](https://github.com/career-ops-hq/career-ops/issues/3465)) ([53620d3](https://github.com/career-ops-hq/career-ops/commit/53620d3bfaf10652bb8d746c73758ad5cda8fe5c)) * **web,dashboard:** point two user-facing references at the repository's new home ([6c0e68d](https://github.com/career-ops-hq/career-ops/commit/6c0e68d472d4ee1e0082fd861c133778f262ecfe)) * **web:** a company with no usable slug must not match every tailored CV ([#3214](https://github.com/career-ops-hq/career-ops/issues/3214)) ([880c58b](https://github.com/career-ops-hq/career-ops/commit/880c58b999033b7f38439f20246943e9342e7fdf)) * **web:** enable apply from the generated pdf index ([ac761fa](https://github.com/career-ops-hq/career-ops/commit/ac761fa612fc943b1ef9458f704fefd653954955)) * **web:** find Grok in its default install dirs, not only on PATH ([77657dc](https://github.com/career-ops-hq/career-ops/commit/77657dcd0bcb7c2e9a9950148d337d160aa5b459)) * **web:** order the Today action queue before truncating it ([3a067ee](https://github.com/career-ops-hq/career-ops/commit/3a067ee580b7982cf5dd6edf7895112e4e99600b)) * **web:** preserve a malformed portals.yml instead of overwriting it with the example ([07ed4f3](https://github.com/career-ops-hq/career-ops/commit/07ed4f31295bee9d03ce1ab61d6d59c835431ff7)) * **web:** rank "Awaiting your decision" by every EVALUATED alias, not an English prefix ([d7573e1](https://github.com/career-ops-hq/career-ops/commit/d7573e189193993c56d19c9216313f0fd4cebee2)) * **web:** require the cv- prefix so the tailored-CV resolvers stop returning the cover letter ([#2156](https://github.com/career-ops-hq/career-ops/issues/2156)) ([414d340](https://github.com/career-ops-hq/career-ops/commit/414d340b4425bf199ddad36dfc0a551da4e99fe0)) * **web:** resolve the tailored CV for THIS application, not the newest for the company ([ca11627](https://github.com/career-ops-hq/career-ops/commit/ca116279d3a5ba9a18e57e3f03f056066c178649)) * **web:** self-host the production fonts so the app starts without Google ([a2e46c3](https://github.com/career-ops-hq/career-ops/commit/a2e46c329fa9819ca6748a437c4ecdbdac4a6ec2)) * **web:** tell the beta reporter's user when the dupe search could not run ([77bf490](https://github.com/career-ops-hq/career-ops/commit/77bf4906abc5c5f63ac07a6c27a7f24c1d03683d)) * **workday:** recover offset-clamped tenants with a facet split ([#3310](https://github.com/career-ops-hq/career-ops/issues/3310)) ([e268a5a](https://github.com/career-ops-hq/career-ops/commit/e268a5a226b15c8e695db923b85416423490bf65)) * **workday:** resolve a CXS-form URL as the endpoint, not as a careers page ([#3505](https://github.com/career-ops-hq/career-ops/issues/3505)) ([0dbe4a9](https://github.com/career-ops-hq/career-ops/commit/0dbe4a9129d3c3a5dbaec1c883320b327958f5ca))