Stage 3 — CV and cover letter

Stage 3 is where your CV and cover letter get tailored to each application. A single Stage 3 click fans out generation across every selected Stage 2 profile in parallel — one writer per CV and one per cover letter — and saves both documents back to each application.

Inputs the agent reads

  • Your CV templates (Settings → CV Templates) — these are the source. The agent extracts experience bullets, projects, and skills from whichever template you have selected as primary.
  • Your cover-letter template (if any) — the structure and salutation pattern.
  • Your writing-style profile — vocabulary, sentence length, banned filler words.
  • The employer profile from Stage 2 — overview, role needs, fit points, cover-letter angle.
  • The job description — captured at Stage 1 ingest, optionally re-fetched if stale.
  • Format mode (per-app) — standard (the default Inter 11px PDF) or ats (Calibri 11pt single-column, parser-safe).

The agent does NOT invent experience. If a fit point requires a skill you don’t list anywhere in your CV templates, the bullet stays generic — won’t fabricate a project, won’t claim a tool you’ve never used.

The two-doc output and the per-doc Re-Generate

Each application row shows CV status + Cover Letter status independently. If you tweak the CV by hand and want a fresh cover letter, the per-doc Re-Generate runs only that doc — the other one is left untouched. This relies on the agent honoring the explicit generate_cv / generate_cl flags the route passes.

Format mode

Settings → Profile → Document Format toggles the default for new applications. The Stage 3 picker overrides per-app. ATS mode means: ALL-CAPS section headers, plain - bullets, no tables, no images, single column, 0.75-inch margins. Workday and Taleo eat ATS-mode output without mangling.

Regenerate detection

When your format-mode setting changes after generation, Stage 3 surfaces a yellow “Re-Generate” badge on rows whose *_format_mode_applied snapshot disagrees with the current setting. You’re never silently shipping a stale doc.

Concurrency guard

Two cv-adapter runs racing on the same application would each PATCH cvText/coverLetterText and silently overwrite each other. The route refuses with 409 if a run is already in flight for that application; the active-runs indicator surfaces it.