最新资讯
www.infoq.com Edera 推出 Object Capability Bounded Authority,试图将凭证与 AI Agent 工作负载隔离 wechat 这波杀疯了!旗舰级模型不限量、1个月视频额度免费领 dev.to 如何在专用 GPU 服务器上用 OpenAI 兼容 API 部署 LLM dev.to 审计 153 份 Claude Code 与 Codex 会话记录:User-Agent 与 URL 中的邮箱泄露 dev.to 你的 Agent Harness 应具备的 17 项能力 dev.to 离线 AI 记忆中 0.8 余弦阈值为何失效 dev.to Kimi K3.1 Pro 开放权重:自托管 2.8T 模型前的开发者清单 dev.to 如何通过工具调用引导模型以提升 Harness 质量 dev.to AI Agent 审计轨迹不等于对话记录 dev.to 精简 MCP server 工具数量:更少工具、更小影响面,双重收益 dev.to 为什么 git checkout 无法撤销 AI 编码 agent 的改动? wechat AI短剧门槛降降降!实测即梦短剧工作室:剧本分镜预演一条龙,伙伴计划长期护航
多元动态
登录 注册
智能体 github.com · @MadsLorentzen

ai-job-search v1.7.3:收紧 Agent 权限并增加职位文本完整性检查

原文 我的收藏

该补丁版本将技能与代理改为最小权限:技能 frontmatter 不得超出 settings.json 允许范围,settings.json 内置在各类权限模式下均生效的 deny 规则,读取职位文本的代理仅保留读取、抓取和搜索工具。新增 posting_guard.py,在 /apply、/rank、/interview 前移除隐藏 HTML 与注释、剥离零宽及双向字符、引用指令型行并标记混合脚本词;同时修复 IDA 薪资表转换与公司名查找等多项问题。

AI推荐理由 该版本发布说明具体、可核查,列出最小权限技能与代理配置、权限文件 deny/ask 规则、职位文本完整性检查(去除隐藏 HTML、零宽字符、指令型行)以及薪资数据转换修复等改动,并附 issue 编号。对构建带工具权限的 AI Agent 应用有实际参考价值,尤其是把职位描述视为不可信数据、限制代理工具集的做法。局限是仍为项目自述,未提供独立安全审计或效果数据,且部分内容为常规 bug 修复。

72

正文

Official release notes (https://github.com/MadsLorentzen/ai-job-search/releases/tag/v1.7.3) A patch release in two halves. **The security model now does what the docs said it did:** skills and agents get only the tools they need, the permission file ships rules that hold even in bypass mode, and every job posting is checked for hidden instructions before anything reads it. **And contributors closed fifty-eight bugs in two weeks**, most of them found by running the real tools against real data. Seventy-one entries. ## Highlights ### Least-privilege skills, agents and permissions (#642, #654) A public review by an AI agent read the shipped configuration and concluded that local use was unsafe as configured. It had a point. The job-application skill's frontmatter granted bare `Bash`, `Edit` and `Write`. The scraper pre-approved `bun run` on any CLI path. And the `/apply` reviewer and the `/rank` scorers ran as general-purpose agents with every tool while they held untrusted posting text. Now: - **Skill frontmatter grants nothing beyond what `settings.json` already allows.** The security guard checks every skill and command frontmatter against an exact allowlist, and a portal skill may grant only its own CLI. - **`settings.json` ships `deny` rules that hold in every permission mode.** They block uploads via `curl`/`wget`, `scp`, `ssh`, `nc`, and reads of `.env` and credential folders. `ask` rules cover edits to the permission files themselves and `git push`. - **The agents that read postings can read, fetch and search, but not edit or write.** These are `posting-fetcher`, `posting-scorer` and `application-reviewer`. The guard now requires every agent definition to declare its tools. - **The 403 retry is `tools/fetch_page.py`, not a documented `curl`.** It makes one GET, checks robots.txt first, and has no upload path. `SECURITY.md` now lists every shipped grant, its lifetime and its guard in one table, and says plainly what the permission layer does not do. ### Every posting passes an integrity gate (#654) "Postings are data, never instructions" was only as strong as the model's adherence. `tools/posting_guard.py` now removes hidden HTML and comments, strips zero-width and bidi characters, quotes instruction-shaped lines, and flags mixed-script words and URLs that exist only in hidden content. `/apply`, `/rank` and `/interview` show its one-line verdict. A clean posting costs one line and no prompt; on a flagged one `/apply` asks before continuing and `/rank` marks the row. It advises and never blocks. ### Salary data converts and looks up correctly again (#615, #570, #571, #572, #576, #584, #590, #592, #594) The real IDA workbook had stopped converting after a header rename (`Firmanavn og by`). It converts again. A run of fixes also makes conversion robust to: - chart-only tabs, - Unicode whitespace grouping, - non-finite text cells, - whitespace-only company names. Lookups now match `Nestle` to `Nestlé`, accept a BOM-prefixed file, and tell a missing index from a suppressed one. ### Portal CLIs reject bad input instead of searching anyway (#555, #561, #568, #573, #577, #538, #540) Missing option values, empty facets and invalid `--format` flags now exit with `BAD_ARG` instead of running an unfiltered search. Three portal-specific fixes: - `jobnet-search` sends external ads to the employer's own URL. - `jobdanmark-search detail` renders its description as text. - `jobbank-search` keeps repeated filter values. New: `python3 tools/install_portal_clis.py` installs every portal CLI with one cross-platform command. ### `/rank` and `/scrape` keep their state honest (#534, #535, #501, #608, #617) `/rank` now: - retries a posting it could not fetch instead of expiring it, - retires scored jobs whose deadline has passed, even when nothing new arrived, - tries an installed portal CLI's `detail` before `WebFetch` for portal URLs. `job_key.py` no longer gives two postings one key when a title or company is partly non-Latin. ## Fork maintainers: what to reconcile Pull this tag rather than raw `master`, then check four things: 1. **`.claude/settings.json` gained `ask` and `deny` blocks, and the guard requires them.** If you customised `settings.json`, keep your own `allow` lines and take the two new blocks as they are. A portal skill of your own still needs its path-scoped `bun run` line in `settings.json` and in `ALLOWED_PERMISSIONS` in `tools/security_guards.py`. Its `SKILL.md` may grant exactly its own CLI and nothing else. 2. **Agents need a `tools:` list.** Guard check 5 fails on any `.claude/agents/*.md` without one. `gemini-research-expert.md` is gone. If you used it, restore it from history in your fork and give it a `tools:` line. 3. **Compile and cleanup now prompt in default mode.** The bare `Bash` grant used to cover `lualatex`/`xelatex` and the `rm -f` of build files. A `lualatex:*` rule would also approve `-shell-escape`, so these are deliberately not pre-approved; approve them when asked. 4. **Three methodology files moved** (`framework_version`). `job-application-assistant/SKILL.md` went 1.3.4 -> 1.3.6, `09-web-research.md` 1.1.1 -> 1.1.5, and `05-cv-templates.md` 1.4.5 -> 1.4.7. `check_upstream_updates.py` flags them; re-read them before merging your edits over them. ## Also in this release - `/reset` keeps the profile headings, the Languages table header and the `framework_version` frontmatter intact. It also clears nested document entries while keeping the folder scaffolds. - The upstream tooling (`upstream_triage`, framework version checks) now handles UTF-8, fork deletions, new files and dependency order correctly. - `verify_pdf.py --ascii-dates` and `verify_layout.py` stop misreading numbers and page positions. - `freehire-search` names this project in its User-Agent and uses a lighter endpoint for `--no-description` (#631, #633). Both came from freehire's own maintainer. Thanks to everyone who reported and fixed this cycle: - rudycelekli, for 24 merged fixes. - ayobamiseun, for 15. - oscarbol09, Mgobeaalcoba, strelov1, ahmed-husssain, yang2632, timaero, mohamedelawakey, luochen211, jonathanwxh-cell, canmugan, ahmedashraffcih, NishilRathod, Bortlesboat and AndreStabile. - The reviewer whose public critique started the security work. Repository README (current repository documentation, not release changes) # AI Job Search *The job search that runs on your machine.* [![CI](https://github.com/MadsLorentzen/ai-job-search/actions/workflows/ci.yml/badge.svg)](https://github.com/MadsLorentzen/ai-job-search/actions/workflows/ci.yml) An AI-powered job application framework built on [Claude Code](https://claude.com/claude-code). Fork it, fill in your profile, and let Claude evaluate job postings, tailor your CV, write cover letters, and prepare you for interviews. > Note: This is an independent open-source project and is not affiliated with, endorsed by, sponsored by, or maintained by Anthropic. Anthropic and Claude Code are referenced only to describe the toolchain this workflow uses. > > This project has **no affiliated cryptocurrency, token, or paid sponsorship program**. Anything claiming otherwise is unauthorized and should be treated as a scam. The only ways to support the project are the Ko-fi link below and contributing on GitHub. ## Does it actually work? I'm a geophysicist by training. When my position was cut in late 2025, I built this framework to run my own job search - the same `/scrape`, `/apply`, and `/interview` workflow in this repo, used weekly, on my own career. I was upfront about it with every employer I spoke to, and instead of counting against me, it usually sparked a genuine technical conversation. Sixty-nine tailored applications, twenty first interviews, and one signed contract later, I started as an AI engineer in June 2026. People kept asking whether this actually works. It got me hired. Now it's yours. *The longer version, including the full application funnel, is on [LinkedIn](https://www.linkedin.com/in/mads-lorentzen/).* Did this save you a Sunday of cover-letter writing? Consider a coffee. Did it land you the job? Maybe two. ☕ ## What this is A structured workflow that turns Claude Code into a full-stack job application assistant. The core workflow (self-profiling, fit evaluation, and the drafter-reviewer application pipeline) is **language- and country-agnostic**. The job portal search skills are built for the Danish market (Jobindex, Jobnet, Akademikernes Jobbank, etc.), but the pattern is designed to be swapped for your local job boards. ``` /setup /scrape /apply | | | v v v Fill in Search job Evaluate fit your profile portals Score & recommend | | | v v v Profile Present matches Draft CV + Cover Letter files ready with fit ratings (LaTeX, tailored) | | v v Pick a match Reviewer agent critiques -> /apply -> Revise -> Final output ``` The framework encodes career guidance best practices, including structured evaluation criteria, forward-looking cover letter framing, and optional salary benchmarking. ## Prerequisites - [Claude Code](https://claude.com/claude-code) (CLI). Claude Code has no free tier: you need a Claude Pro/Max/Team subscription or Anthropic API credits (pay-per-token, usually cheaper for occasional use). Using a different agent tool (Codex, Antigravity, Gemini CLI)? Start at [`AGENTS.md`](AGENTS.md) - the portal search skills work there out of the box, and [community forks](https://github.com/MadsLorentzen/ai-job-search/discussions/78) adapt the full workflow. - Python 3.10+ - [Bun](https://bun.sh) (for job search CLI tools) - LaTeX distribution with `lualatex` and `xelatex`: [TeX Live](https://tug.org/texlive/), [MacTeX](https://tug.org/mactex/), [TinyTeX](https://yihui.org/tinytex/), or [MiKTeX](https://miktex.org/). The CV compiles with `lualatex` (pdflatex often fails on modern MiKTeX installs with `fontawesome5` font-expansion errors); the cover letter compiles with `xelatex` because `cover.cls` requires `fontspec`. If using a minimal TeX install such as TinyTeX or BasicTeX, install the extra packages listed in [SETUP.md](SETUP.md#minimal-tex-install-tinytexbasictex). - Optional: `pip install pypdf` for `/apply`'s ATS parseability check (BSD; no Poppler required). Poppler `pdftotext` remains a fallback (macOS: `brew install poppler`, Debian/Ubuntu: `apt install poppler-utils`, Windows: `choco install poppler`). If both are missing, the check degrades to a visual keyword review. ## Quick start > 🎥 **Prefer to see it in action first?** [The Next New Thing did a hands-on walkthrough](https://www.youtube.com/watch?v=HoVxjMNFYv4) of how the workflow is actually used, from setup to a finished application (recorded August 2026 - commands may have evolved since). ### 1. Fork and clone ```bash gh repo fork MadsLorentzen/ai-job-search --clone cd ai-job-search ``` > [!IMPORTANT] > **A fork of this repo is always public** — GitHub does not allow private forks of > public repositories — and `/setup` (step 3 below) writes your personal data (name, > contact details, employment history, salary expectations) into **tracked** files. > If this copy is for your own job search rather than for contributing changes back, > use a **private repository** with this repo as `upstream` instead — the two-minute > recipe is in [SETUP.md section 8](SETUP.md#8-pulling-upstream-updates-into-your-fork), > and every update workflow works identically. Fork only to contribute. ### 2. Install job search tools ```bash python3 tools/install_portal_clis.py # Windows: python tools\install_portal_clis.py ``` It runs `bun install` in every portal CLI under `.agents/skills/*/cli/` - discovered, not listed, so a portal you add with `/add-portal` or copy from another fork is included on a fresh clone. A CLI whose `package.json` declares an install-time lifecycle script is skipped and reported rather than run. `--dry-run` shows what it would install. For `linkedin-search` and `freehire-search` the install is optional: both have zero runtime dependencies and run with plain `bun`; `bun install` only pulls TypeScript dev types. ### 3. Set up your profile ```bash claude # Then inside Claude Code: /setup ``` `/setup` offers three paths: read your `documents/` folder if you have one populated (CV PDF, LinkedIn export, diplomas, reference letters, past applications), import a single CV pasted in chat, or walk through an interview. It auto-detects what you have and asks. Documents-folder mode is idempotent and safe to re-run as you add more material; see `documents/README.md` for the layout. ### 4. Search for jobs ```bash /scrape ``` This searches multiple job portals for positions matching your profile, deduplicates results, and presents them sorted by fit. Pick a match to run `/apply` on it directly — or, when a scrape returns more jobs than you want to eyeball, run `/rank` to batch-score them all against the fit framework and get a ranked shortlist first. ### 5. Apply to a job ```bash /apply https://jobindex.dk/job/1234567 ``` If the URL can't be fetched (some job portals block automated access), you can paste the job description directly instead: ```bash /apply ``` This runs the full workflow: evaluate fit, draft CV + cover letter, review with a second agent, revise, and present the final output. The posting passes a deterministic integrity gate first (hidden text, invisible characters, instruction-shaped lines, hidden links), and its one-line verdict opens the evaluation; the agents that fetch and review read-only. Postings are treated as untrusted input (the workflow follows no instructions embedded in them and fetches no links from their body), but agentic defenses are instruction-level, not a sandbox - on an unfamiliar job board, skim what was fetched and written before you hit send. Details in [SECURITY.md](SECURITY.md). ## Other commands `/setup`, `/scrape`, and `/apply` form the core workflow. Ten more commands extend it once your profile is in place: - **`/interview`** preps you for a scheduled interview on a tracked application. It builds a stage-specific prep pack from the application's archive (the exact posting, the CV and cover letter the interviewer actually read, feedback recorded from earlier rounds), researches the company and interviewers with a verify-before-use rule, maps likely questions to your STAR examples, and offers a mock interview following the roleplay protocol in `07-interview-prep.md`. Gaps get honest bridge answers, never invented experience. - **`/outcome`** records what happened to an application - interview stages, offers, rejections, silence. It archives the submitted CV, cover letter, and posting text into `documents/applications/_/`, keeps `outcome.md` in the format `/setup` Path A parses, and updates the tracker. It also owns the stretch before there is an outcome to record: `/outcome followup` surfaces open applications that have gone quiet (default 10 days), drafts a short channel-appropriate follow-up in your writing style using only claims from the materials you already submitted (drafts only, never sends; at most twice per application), and offers a thank-you note in the same turn an interview stage is recorded. Once a few applications resolve, it points you back to `/setup` to calibrate the fit framework from what actually got interviews. - **`/notion-sync`** publishes a one-way, read-only view of the pipeline into a Notion database via the official Notion MCP server (OAuth, no API keys) - one row per ranked job plus every tracked application, with a write-once briefing page per row. The repo files stay the system of record: nothing syncs back, and documents sync as filenames only. Complements `/html-report`: that is the deep offline dashboard you regenerate at your desk; this is the glanceable live view from anywhere Notion runs (desktop, web, phone). - **`/gmail-sync`** reads your Gmail (via the Gmail connector) for status signals on your open applications - interview invites, assessment links, offers, rejections - and proposes them as a batch for you to approve before anything is written to the tracker or `outcome.md`, citing the source email on every proposed change. Offers stop short of proposing `hired`/`offer_declined` since that's your call; conflicting or unmatched signals get flagged for a manual `/outcome` pass instead of guessed. - **`/rank`** bridges `/scrape` and `/apply`: it batch-scores all newly scraped postings against the fit framework (parallel agents fetch each posting and score the five evaluation dimensions) and returns a ranked shortlist with honest per-job strengths and gaps. Deal-breakers veto, deadlines get urgency flags, dead postings get marked expired. Pick a number and it hands off to the full `/apply` workflow. - **`/expand`** enriches your profile by scanning public sources you've already linked in it (GitHub repos, portfolio site, Kaggle, Google Scholar) and looking up syllabi for named courses and certifications. Discovered competencies are added to your profile with a source tag. Useful right after `/setup` to surface skills that documents alone don't make explicit. - **`/upskill`** analyzes the gap between your profile, your tracked job postings, and your ranked-but-untracked postings (`/rank`'s recorded gaps in `job_scraper/seen_jobs.json`) — or a single posting via `/upskill `. Produces a prioritized heatmap of skill gaps and a learning plan with web-searched study resources and time estimates. Useful for career planning between applications. - **`/html-report`** generates a self-contained HTML dashboard from `job_search_tracker.csv` and the application archives — stat cards, status/sector/channel/funnel charts (inline SVG, no external dependencies), and a filterable applications table. Opens directly in a browser, fully offline. Re-run it any time after `/apply` or `/outcome` adds new entries. - **`/add-template`** registers your own CV or cover letter template (LaTeX, Typst, or another toolchain) in place of the stock ones. It captures the template's instructions (source extension, compile command, fonts, style rules, page limit), runs a mandatory test compile, and wires the template into `/apply`. See [Custom templates](#custom-templates) below. - **`/add-portal`** generates a job-portal search skill for a job board in your market. It investigates the portal (search URL pattern, result structure, access rules), scaffolds the CLI skill from the same structure as the shipped ones, and test-runs a live query before registering. See [Job search tools](#job-search-tools) below. `/reset` is also available, see [Starting over](#starting-over) below. ## File structure ``` ai-job-search/ ├── CLAUDE.md # Main candidate profile + workflow rules ├── .claude/ │ ├── commands/ │ │ ├── apply.md # /apply workflow (drafter-reviewer) │ │ ├── setup.md # /setup onboarding (documents folder, CV import, or interview) │ │ ├── expand.md # /expand competency enrichment from documents and online presence │ │ ├── add-template.md # /add-template register custom templates (LaTeX, Typst, ...) │ │ ├── add-portal.md # /add-portal generate a job-portal search skill for your market │ │ ├── rank.md # /rank triage scraped jobs into a ranked shortlist │ │ ├── outcome.md # /outcome record application results, archive materials │ │ ├── gmail-sync.md # /gmail-sync auto-detect application status from Gmail │ │ ├── interview.md # /interview stage-specific prep pack + mock interview │ │ ├── html-report.md # /html-report generate application tracker dashboard │ │ ├── notion-sync.md # /notion-sync one-way pipeline view in a Notion database │ │ └── reset.md # /reset wipe profile data or documents folder │ ├── skills/ │ │ ├── job-application-assistant/ # Core application skill │ │ │ ├── SKILL.md # Skill definition │ │ │ ├── 01-candidate-profile.md # Your education, experience, skills │ │ │ ├── 02-behavioral-profile.md# PI/DISC/personality assessment │ │ │ ├── 03-writing-style.md # Tone, structure, do's and don'ts │ │ │ ├── 04-job-evaluation.md # Scoring framework for job fit │ │ │ ├── 05-cv-templates.md # LaTeX CV structure + tailoring rules │ │ │ ├── 06-cover-letter-templates.md # LaTeX cover letter templates │ │ │ └── 07-interview-prep.md # STAR examples + interview framework │ │ ├── job-scraper/ # Job search orchestration │ │ └── upskill/ # /upskill skill gap analysis and learning plan │ └── settings.json # Claude Code permissions (shared, scoped) ├── .agents/skills/ # Job portal CLI tools │ ├── jobbank-search/ # Akademikernes Jobbank (Denmark) │ ├── jobdanmark-search/ # Jobdanmark.dk (Denmark) │ ├── jobindex-search/ # Jobindex.dk (Denmark) │ ├── jobnet-search/ # Jobnet.dk (Denmark, government portal) │ ├── linkedin-search/ # LinkedIn public job listings (country-agnostic) │ └── freehire-search/ # freehire.me tech job aggregator (multi-market, REST API) ├── cv/ │ └── main_example.tex # moderncv LaTeX template ├── cover_letters/ │ ├── cover.cls # Custom cover letter LaTeX class │ ├── cover_example.tex # Example cover letter (structural reference + CI smoke test) │ └── OpenFonts/ # Lato + Raleway fonts ├── templates/ # Custom templates registered via /add-template │ └── README.md # Folder layout instructions ├── documents/ # Career source materials for /setup Path A and /expand │ ├── README.md # Folder layout instructions │ ├── cv/ # Master CV (PDF or .tex) │ ├── linkedin/ # LinkedIn profile export (PDF) │ ├── diplomas/ # Degree certificates and transcripts │ ├── references/ # Reference letters │ └── applications/ # Past application records (_/) ├── .github/workflows/ci.yml # CI: LaTeX smoke compiles, skill lint, CLI typechecks ├── salary_lookup.py # Salary benchmarking tool (BYO data) ├── tools/ │ ├── check_framework_version.py # CI check: framework_version bumped when skill files change │ ├── check_upstream_updates.py # Preview which personalized files an upstream update touches │ ├── convert_salary_excel.py # Convert salary Excel to JSON │ ├── fetch_page.py # GET-only browser-header retry for 403s (robots.txt enforced) │ ├── install_portal_clis.py # Install every discovered portal CLI (bun install) │ ├── lint_skills.py # CI lint for skills, commands, settings.json │ ├── posting_guard.py # Integrity gate: strip hidden text, flag injection-shaped lines │ ├── robots_check.py # Gate the browser-header retry against robots.txt │ ├── security_guards.py # CI guards: permission allow/ask/deny, skill grants, gitignore, manifests │ ├── upstream_triage.py # Sort upstream commits into worth-reviewing vs probably-skip │ ├── verify_layout.py # Measure a compiled PDF's page layout (holes, orphans, footer collisions) │ ├── verify_pdf.py # Verify a compiled PDF's page count and extractable text │ └── README_SALARY_TOOL.md # Salary tool setup instructions ├── job_scraper/ # Scraper state (seen jobs, results) ├── gmail_sync/ # /gmail-sync state (processed message IDs, last sync date) ├── upskill/ # /upskill report output (markdown reports per run) ├── job_search_tracker.csv # Application tracking spreadsheet └── SETUP.md # Detailed setup guide ``` ## How `/apply` works The `/apply` command runs a **drafter-reviewer workflow** with mandatory PDF compilation: 1. **Parse** the job posting (URL or text) 2. **Evaluate fit** against your profile (skills, experience, culture, location, career alignment) 3. **Draft** a tailored CV and cover letter in LaTeX 4. **Spawn a reviewer agent** that researches the company and critiques the drafts 5. **Revise** based on the reviewer's feedback 6. **Compile and inspect** both PDFs: lualatex for the CV, xelatex for the cover letter. Claude reads the rendered pages and iterates on the LaTeX until the CV is exactly 2 pages with no orphaned entry titles, and the cover letter is exactly 1 page with the signature visible and fonts consistent. 7. **ATS-check the CV**: extract the PDF's text layer (`pdftotext`, optional dependency) and verify it the way an ATS parser sees it — contact details present as literal text, no garbled glyphs, sane reading order — then score the posting's keyword coverage against the extraction. Keywords the profile genuinely supports get added; genuine gaps stay visible, never stuffed. 8. **Present** the final output with a verification checklist All claims in the CV and cover letter are verified against your actual profile. The system never fabricates skills or experience. ### What makes this workflow different - **PDF verification loop.** Most LaTeX-resume templates produce "looks fine in the .tex" output that breaks in the PDF: job titles orphan to the next page, cover letters spill onto page 2, bullet fonts silently fall back to the body font. The `/apply` command compiles and visually inspects every PDF and applies targeted fixes (`\needspace`, `\enlargethispage`, font-matching wrappers for list items) until the layout is clean. This runs automatically on every application. - **ATS verification on the PDF text layer.** An ATS reads the PDF's embedded text, not the rendered page — and LaTeX can silently produce PDFs whose text extracts as garbage (icon glyphs where the email should be, interleaved lines from multi-column layouts). `/apply` extracts the compiled CV's text layer with `pdftotext` and verifies contact details, reading order, and the posting's keyword coverage against what a parser actually sees. Honesty rule enforced: a keyword the profile doesn't support is acknowledged as a gap, never stuffed in. - **Relevance-weighted CV cutting.** When a CV overflows 2 pages, the workflow does not cut mechanically from the "oldest" section. It scores each candidate line by (a) relevance to the target posting, (b) uniqueness in the document, and (c) whether the cover letter depends on it, and cuts the lowest-total-score line first. An older-role bullet that hits posting keywords survives ahead of a recent-role bullet that does not. - **Drafter-reviewer separation.** The drafter writes; a second Claude agent, spawned with a fresh context, researches the company and critiques the drafts. The drafter then revises. This catches missed keywords, weak framing, and generic language that a single pass often leaves in. - **Token-efficient reviewer dispatch.** The reviewer agent receives drafts inline rather than re-reading them, and the verification checklist runs once at the end of the workflow rather than being duplicated by both agents. Note: the new compile-and-inspect step in Step 5 spends some of those savings on PDF rendering and layout iteration — the workflow trades some end-to-end token cost for a real reduction in broken PDFs reaching the user. ## Customization ### Which files to edit manually If you prefer editing files directly instead of using `/setup`: | File | What to change | |------|---------------| | `CLAUDE.md` | Your full profile (name, education, experience, skills, goals) | | `01-candidate-profile.md` | Structured version of your CV data | | `02-behavioral-profile.md` | Your behavioral assessment or self-assessment | | `04-job-evaluation.md` | Skill match areas, career goals, motivation filters | | `05-cv-templates.md` | Profile statement templates for different role types | | `07-interview-prep.md` | Your STAR examples from actual experience | | `search-queries.md` | Job search queries for your skills and location | ### Updating your search queries As your priorities evolve, you can reconfigure just the job search without re-running the full profile setup: ``` /setup --section search ``` This re-runs the search configuration interview: which roles to target, which skills to search for, which locations, and which portals. It also suggests role types you may not have considered based on your profile. ### Custom templates The CV uses [moderncv](https://ctan.org/pkg/moderncv) (banking style). The cover letter uses a custom `cover.cls` with Lato/Raleway fonts. Both are LaTeX — the reference engine this repo ships and maintains. To use your own template instead — LaTeX, [Typst](https://typst.app/), or any other toolchain that compiles to PDF from the command line — run: ``` /add-template ``` Point

来源报道 · 2 篇 · 以下链接均前往原始媒体

← 返回精选动态 原文

更多内容