mirror of
https://github.com/MadsLorentzen/ai-job-search.git
synced 2026-09-17 00:26:26 +00:00
feat(apply): add mandatory PDF compile-and-inspect step and relevance-weighted cutting
Adds a new Step 5 to the /apply workflow that compiles the CV (lualatex)
and cover letter (xelatex) and visually inspects the resulting PDFs before
presenting them to the user. This catches page-break failures that .tex
review cannot detect: orphaned cventry titles, cover letters spilling to
a second page, and bullet fonts not matching body text.
Also introduces relevance-weighted cutting as the rule for shrinking an
overflowing CV: score each candidate line by (a) relevance to the posting,
(b) uniqueness in the document, and (c) load-bearing role in the cover
letter, then cut the lowest-total-score line first, regardless of section.
This replaces the old static "cut oldest section first" heuristic, which
was wrong whenever a relevant older-role bullet competed with an
irrelevant recent-role bullet.
Bundled with the earlier pending token-efficiency improvements to the
/apply workflow (inline draft passing to the reviewer, scoped reviewer
file reads, single end-of-workflow verification pass).
Changes:
- .claude/commands/apply.md: new Step 5 (Compile & Inspect PDFs), renumber
old Step 5 to Step 6, update token-efficiency rules at top to reference
Step 6 for the verification checklist
- .claude/skills/job-application-assistant/05-cv-templates.md: switch
recommended compile engine from pdflatex to lualatex (pdflatex fails on
modern MiKTeX with fontawesome5 font-expansion errors), add
"Compile-and-Inspect Loop" section with needspace/enlargethispage
patterns, add "Relevance-weighted cutting" section
- .claude/skills/job-application-assistant/06-cover-letter-templates.md:
add compile command, add "Compile-and-Inspect Loop", document the
"\lettercontent{} + itemize" pitfall and the required font-matching
Raleway-Medium wrapper fix
- CLAUDE.md: add "Compiled PDF verification (MANDATORY)" checklist items
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.7
parent
c66d599d75
commit
32e63e5143
@@ -7,9 +7,17 @@
|
||||
All CVs use the moderncv LaTeX package with the "banking" style and "blue" color scheme.
|
||||
|
||||
**Output file:** `cv/main_<company>.tex`
|
||||
**Compile with:** pdflatex (not xelatex)
|
||||
**Compile with:** **lualatex** on MiKTeX/TeX Live. pdflatex often fails on modern MiKTeX installs with `fontawesome5` font-expansion errors; lualatex handles the same sources cleanly.
|
||||
**Master reference:** `cv/main_example.tex` (comprehensive CV with all competencies, experience, and achievements - use as source when building targeted CVs)
|
||||
|
||||
### Compile command
|
||||
|
||||
```bash
|
||||
cd cv && lualatex -interaction=nonstopmode main_<company>.tex
|
||||
```
|
||||
|
||||
Expected output: `Output written on main_<company>.pdf (2 pages, ...)`. Any page count other than 2 is a failure that must be fixed before presenting to the user.
|
||||
|
||||
## Document Structure
|
||||
|
||||
```latex
|
||||
@@ -101,6 +109,34 @@ If there is a gap in your employment history:
|
||||
- End with: "More references are available upon request."
|
||||
- **Do not attach reference letters** - employers typically contact references directly
|
||||
|
||||
## Compile-and-Inspect Loop (MANDATORY)
|
||||
|
||||
After writing the CV and before presenting to the user, always compile and visually inspect the PDF. Iterate until the layout is clean. Workflow:
|
||||
|
||||
1. Run `lualatex -interaction=nonstopmode main_<company>.tex`
|
||||
2. Check the output page count: must be exactly 2
|
||||
3. Read the PDF via the Read tool and visually inspect both pages
|
||||
4. Check for **orphaned entries**: a `\cventry` title line must never sit alone at the bottom of page 1 with its bullets on page 2
|
||||
|
||||
### Fixing common page-break problems
|
||||
|
||||
**Problem: entry title on page 1, bullets orphaned to page 2**
|
||||
Add `\needspace{5\baselineskip}` immediately before the problematic `\cventry`:
|
||||
```latex
|
||||
\needspace{5\baselineskip}
|
||||
\item{\cventry{YEAR--YEAR}{Role Title}{Organization}{Location}{}{...}}
|
||||
```
|
||||
Include `\usepackage{needspace}` in the preamble.
|
||||
|
||||
**Problem: one trailing section spills to page 3 (e.g., References alone on page 3)**
|
||||
Add `\enlargethispage{2-3\baselineskip}` before a late section (e.g., before `\section{Honors and Awards}`) to stretch page 2 by a few lines. This is the standard LaTeX rescue for near-miss overflows.
|
||||
|
||||
**Problem: 3 pages with significant content on page 3**
|
||||
Cut content — do not compress geometry or `\vspace`. See "Relevance-weighted cutting" below for the rule.
|
||||
|
||||
**Problem: content finishes early on page 2 (feels thin)**
|
||||
Restore the highest-relevance item that was previously cut — a CV that ends mid-page 2 looks incomplete.
|
||||
|
||||
## Page Budget - Hard 2-Page Limit
|
||||
|
||||
The CV **must** fit on exactly 2 pages when compiled. Use these content limits as a guide:
|
||||
@@ -119,6 +155,33 @@ The CV **must** fit on exactly 2 pages when compiled. Use these content limits a
|
||||
|
||||
**If in doubt, cut rather than squeeze.** Reducing `\vspace` or geometry scale to force-fit content makes the CV look cramped.
|
||||
|
||||
## Relevance-weighted cutting (the right way to shrink a CV)
|
||||
|
||||
**Cut by signal, not by section.** Static priority lists ("remove oldest education first, then shorten the earliest role...") are wrong when a relevant "lower-priority" item is competing with an irrelevant "higher-priority" item. An older-role bullet that speaks directly to the posting is worth more than a recent-role bullet that does not.
|
||||
|
||||
For every candidate line, score three things:
|
||||
|
||||
1. **Relevance to THIS posting** — does the line hit a named tool, keyword, or stated responsibility in the job ad?
|
||||
2. **Uniqueness** — is it the only place this claim appears, or is it duplicated elsewhere in the CV?
|
||||
3. **Narrative load** — does the cover letter depend on it? If cutting the line would force you to rewrite a cover-letter paragraph, it is load-bearing.
|
||||
|
||||
Cut the lowest-total-score line first, regardless of which section it sits in.
|
||||
|
||||
### Practical order of cuts (easiest → last resort)
|
||||
|
||||
1. **Redundancy.** If an achievement appears in both Core Competencies AND a role bullet, the Core Competencies version is usually the cleaner cut (the experience bullet is more concrete evidence).
|
||||
2. **Profile-statement fluff.** A sentence that just restates what Publications or Skills will show. ("Peer-reviewed publications on X..." is already a Publications entry — profile can claim it once and stop.)
|
||||
3. **Low-relevance experience bullets.** A bullet about work that does not touch posting keywords, wherever it sits. This cuts across sections before touching the structural list.
|
||||
4. **Low-relevance supporting content.** An older-role bullet that does not speak to the target role. A certification that does not touch the posting's stack. A language entry that can be condensed to one line.
|
||||
5. **Low-relevance publications.** Keep 1-2 publications that best match the posting. Cut the rest before touching experience bullets.
|
||||
6. **Last-resort structural cuts.** Oldest education entry, tightening an older role to 2 bullets, collapsing Certifications into a single line. These only happen if the relevance-weighted cuts above have already been exhausted.
|
||||
|
||||
### Pitfalls to avoid
|
||||
|
||||
- Do not mechanically cut from the bottom of a static section list without checking relevance. "Cut the oldest role first" is wrong if that role is literally about the skill the posting asks for.
|
||||
- Do not cut the one concrete example the cover letter leans on. Relevance is measured against the cover letter you wrote, not just the job posting — interviewers will have read both.
|
||||
- Do not cut to fit if the fit is borderline (2.02 pages). Prefer `\enlargethispage{2-3\baselineskip}` on a late section for near-misses; reserve content cuts for genuine overflow (content on page 3 that is more than a single trailing section).
|
||||
|
||||
## Recommended Section Order
|
||||
|
||||
The section order varies by role type:
|
||||
|
||||
Reference in New Issue
Block a user