feat(resume): check bullet cadence variety, warn-only

An audit of all 18 packages in output/ (368 bullets) found one rhythm
running through every document: 45% of bullets used the same "X, Y and
Z" triple, and the SBB package reached 85% - 11 of 13 bullets, every
Swisscom and Bosch line - plus two adjacent bullets both opening
"Build and...".

This is a style finding, not a truth finding. Every bullet was accurate.
The corpus is clean on the axes that actually signal generated text: no
AI vocabulary (0 hits for leverage/spearheaded/robust/passionate and 56
others across 35 documents), prose em-dashes at 0.08/bullet, and PDF
metadata carrying nothing but MiKTeX pdfTeX with empty Author/Title
(0 AI tokens and 0 generator-term leaks across 69 PDFs). What is left is
cadence: ten bullets sharing one three-beat rhythm read as machine-made
even when nothing in them is false.

Guarded deliberately so it cannot do harm. cadence_checks() emits WARN
and never ERROR, the critique deduction caps at 1 point, and both the
reference and the docstring state that no claim, scope or hedged verb
may be bent to satisfy rhythm. An anti-monotony rule with teeth would be
worse than the problem - it would pressure a future run into loosening a
scoped claim to vary a sentence.

Thresholds are calibrated on the corpus, not guessed. Position length
spreads are bimodal (1-9 words, then 15-17), so the check flags a spread
of <=4, the tight tail at ~28% of positions; the first draft used <=6
and flagged the median. Also fixed the opening-verb extractor, which
read \textbf{Owned ...} as the word "textbf" and produced six false
positives on one document. Per-package warnings now run 0-3.

Docs: resume_reference.md 7a + verification step, critical_rules.md 7a,
critique_framework.md mechanics row, CLAUDE.md corrections log.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MHtzyTKBcg6BWhD5qFegtK
This commit is contained in:
2026-08-25 09:38:19 +02:00
co-authored by Claude Opus 5
parent af7189a93d
commit 92a81a7dcb
5 changed files with 99 additions and 1 deletions
@@ -96,6 +96,36 @@ Natural one-, two- and three-line bullets may be mixed. There are no target char
Use metrics only when verified. Company size, customer names, generic industry volumes and market economics are context, not personal impact.
### 7a. Cadence variety (anti-monotony)
Individually honest bullets can still read as machine-written when they all share one
rhythm. Measured across the 18 packages in `output/` (368 bullets): **45 % used the same
"X, Y and Z" triple**, and the SBB package reached **85 % — 11 of 13 bullets, every
Swisscom and Bosch line**. Nothing in it was false; it simply had one cadence.
This is a *style* problem, never a truth problem. Never trade accuracy, scope discipline
or a hedged verb to fix cadence — an accurate monotonous bullet beats a varied inaccurate
one. Fix it by reshaping sentences, not by changing what is claimed.
Per document, aim for:
- **At most about half the bullets carrying a three-part list.** The triple is normal resume
grammar and humans use it too; the tell is using little else.
- **At least two or three bullets in a different shape** — a short declarative with a single
object; a bullet with one object rather than three; a bullet whose scope clause comes first.
- **No two consecutive bullets opening with the same verb** (the SBB resume had "Build and
model…" directly followed by "Build and operate…").
- **Visible length variation inside each position**, not just across the document. Five bullets
at 2530 words read as generated even when the document's overall range looks fine.
`validate_resume_system.py --document <file.tex>` measures all three and reports them as
**WARN**, never ERROR — cadence can never fail a document. The length threshold is calibrated
on the 50 multi-bullet positions in `output/`, whose spreads are bimodal (19 words, then
1517): it flags a spread of 4 words or less, the tight tail, not the median.
Diagnostic only — like character counts, these are checks, never targets, and no bullet
should be padded or trimmed to hit them.
## 8. Titles and Seniority
- Preserve official titles when recognizable.
@@ -113,6 +143,8 @@ After generation:
4. Extract text with `pdftotext` and confirm employer/title/date order.
5. Inspect the rendered PDF: no clipping, overlap, tiny text, isolated headings or awkward page break.
6. Check that experience begins comfortably on page 1 and certifications are not duplicated.
7. Act on any cadence WARN from step 1 (§7a). These never fail the document; reshape the
offending sentences, never the claims behind them.
Do not add content merely to reduce bottom whitespace.