/setup Step 3 personalised cv/main_example.tex but never the LaTeX contact
blocks embedded in 05-cv-templates.md and 06-cover-letter-templates.md, the
two files /apply actually compiles from; 06 was not a Step 3 target at all.
Step 3.5 now names the 05 contact tokens, a new Step 3.6 covers the 06
contact line and signature, the completion summary lists 06, and /reset
restores both blocks instead of listing 06 as framework-only (the existing
/reset coverage test forced that half).
tests/test_changelog_structure.py checks [Unreleased] on every PR for
duplicate headings, unknown headings, orphan entries and conflict markers -
the #425 duplicate-heading shape that was fixed by hand at merge time.
Claude-Session: https://claude.ai/code/session_013fqqLgQSnwgWkv98twQhHi
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Add @unittest.skipIf on GITHUB_REPOSITORY to TestCvSentinelsAreDataLocated
and TestProfileSentinelIsDataLocated so python-tests matches the upstream-only
placeholder-integrity job. Default unset GITHUB_REPOSITORY to upstream so local
pristine-template runs still execute the guards.
FixesMadsLorentzen/ai-job-search#405
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: shahidbeig-a11y <shahidbeig-a11y@users.noreply.github.com>
cv/main_example.tex's sentinel was [YOUR_NAME] - a header comment and
the pdftitle, neither of which /setup's documented personalization
touches, so CI reported the file clean while it carried a real name,
address, phone and email (the review proved this end to end; the file
is the one CV the gitignore deliberately allows to be committed). The
guard now checks the \name{} and \email{} data lines, and 01's sentinel
moves from the <!-- SETUP comment onto [YOUR_EMAIL]. New test simulates
the /setup edit and requires every checked CV sentinel to be destroyed
by it. Review finding F28 (2026-08-19).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>