v0.8.0 — cover letters + fact gate
What's new
- Cover letters. A "Cover letter" card on every job page drafts a short (120–180 word) letter from your resume, your confirmed facts and the posting — plus the resume match and researched company facts when they exist. Tone select, angle fields that are remembered between letters, in-place editing that autosaves, Regenerate, and "Save as PDF" / "Save as DOCX".
- A Cover letter page in the menu (
/letter): pick a job from a searchable list of your newest matching jobs, or bring a new posting by URL or pasted text. Writing a letter takes about 25 seconds — the fit score is not computed on this path, and the resume match and company research are opt-in. - Fact gate (F7). Shipped untagged with PR #31 and surfaced here: every generated letter is checked deterministically against your resume and confirmed facts before you see it. An invented number, employer, title or denied tool triggers one regeneration with the violations quoted; a second failure discards the letter, so nothing unverified is ever stored. Your own edits are flagged, never blocked.
- Per-engine Cover letter model on Settings → AI engine (an empty slot follows the resume model). All model pickers now save the moment you change them.
- Letters are written in plain English for a non-technical first reader and normalized to keyboard punctuation — no em dashes, curly quotes or bullets ever reach a stored letter.
Schema
CoverLettertable (20260831180000_add_cover_letter).AppSettings.coverAngles(20260831190000_add_cover_angles).
Verification
648 unit tests; 15+ real generations across five engine/model pairs, three input paths and three tones; live chain failover with the · fallback marker; SSRF guard on the URL fetch; 1200/375 screenshots, 0 console errors.
References
ADR 0020 (fact gate), ADR 0021 (letters generate from stored inputs only), docs/feature-expansion-plan.md §8–9, PRs #31 and #32.