F18 - page-one weighting
- Across four compiled packages the first employment entry began at 45-55% of
page one. A reader reaching the middle of the page had seen a profile and a
skills block, and no evidence.
- The old skills rule counted `\skillline` MACROS, which does not control
density: six categories with long value lists wrap to twelve or more rendered
lines. Replaced with a rendered-line budget verified in the compiled PDF, plus
the rule that a skills line repeating what three bullets below already prove is
spending the first screen to say it twice.
- Employer chronology stays reverse-chronological; the ordering freedom is
WITHIN a position, where the bullet closest to the target role leads.
- New helper `page_metrics.py` measures page-one geometry from the PDF via
pdftotext -bbox.
F19 - education and phrasing
- Degree + focus + institution crammed into one cell with a right-aligned date
produced visible word spacing and mid-word breaks in SBB, NVIDIA and Aker BP.
Split the entry, as RUAG_AI_Engineer_C5I already did. Template carries the rule.
- Grades and thesis stay only where concretely relevant. claims.json
grade_output_rule already keeps grades off by default; the M.Eng. thesis earns
its place on condition-monitoring or sensor-data roles and otherwise does not.
Validated by measurement rather than assertion
- page_metrics.py first reproduced the review's own figures (NVIDIA 55.4%,
SBB 50.6%, RUAG 50.3%). That is what makes the after-figure meaningful.
- The NVIDIA CV was rebuilt FROM A COPY with the guidance applied: experience
moved 55.4% -> 44.0% of page one, page-one text lines 47 -> 39, still two
pages, zero overfull boxes, validator PASS.
- The submitted package itself was not modified. F17 classifies archives as
evidence, not as drafts.
The percentage is a diagnostic, not a target: no pixel goal and no rule that
page two must be filled.
All 19 review findings are now complete. 37/37 tests pass.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qej5SBvhcbGXHwLqNWiskM
Build sweep run this session: 48 sources, 46 built, 2 failed. Infineon_AI_Engineer's
cover letter fails on font expansion (the font is not scalable); cv_template.tex
fails on unfilled placeholders, which is expected for the academic legacy path.
Overfull boxes: Microsoft ISE 25.33pt, Isovalent 0.88pt. All historical, all
left alone.
New: resume_builder/helpers/package_manifest.py records, per application
package, what a rebuild would ACTUALLY do - sources, class-file hashes, PDFs
present, and the reasons a rebuild would not reproduce the submitted document.
It is descriptive; nothing in it authorises rewriting a submitted file.
What it found across 21 packages:
- 17 are DATE-DEPENDENT. The cover letters use oday, so recompiling a
historical package silently restamps it with today's date.
- 1 has an INCOMPLETE SOURCE DISTRIBUTION: output/NATO_AI_ENGINEER ships no
resume.cls. It builds on this machine only because a copy exists elsewhere,
and the shipped PDF hid that. Not repaired by copying the newest class in -
the repo carries THREE different resume.cls variants (13/7/1 copies) and older
macros differ, so that "fix" could silently change a historical document.
- 1 has no PDF at all, so nothing is reviewable without a build.
Classification: 7 application packages were in no reuse category. Added to
historical_revalidate, and the register now records the default explicitly -
anything unlisted is treated as revalidate-before-reuse. Being recent is not the
same as being verified; none of the seven was re-read for this.
Prevention rather than repair: oday removed from the cover-letter template so
new packages stop adding to the pile. A test now fails if it comes back, if the
manifest goes stale, or if a package is left unclassified.
Also: scan_document gained a template mode. A placeholder in a TEMPLATE is what
makes it a template; the defect is one surviving into a generated document.
37/37 tests pass; counter-proof still catches all 9.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qej5SBvhcbGXHwLqNWiskM
F08 - evidence metadata
- Only 1 of 26 claims carried structured source/last_verified/ownership, which
is why recency and reference checks could not run. Added an evidence_schema
block and an evidence block on all 26 claims.
- 8 dates were recovered from each claim's OWN recorded text; the other 18 are
written as the literal "unrecorded". Nothing was inferred. "unrecorded" means
nobody wrote it down, NOT that the claim is unevidenced - most carry evidence
in their free-text scope.
- Coverage is reported as an advisory warning, never a gate: failing on it would
push a future session to invent dates to clear the run.
F09 - templates
- resume_template.tex asserted "12+ years of production software experience".
It does not hold: canonical employment starts 2014-11 (~11y10m) and the
VISIBLE chronology starts 2015-05 (~11y4m) because Capgemini is omitted.
Now "over ten years", with the arithmetic and the no-date-math rule inline.
- cv_template.tex still carries page targets, rendered-line budgets and 2L/3L
variants the project dropped. Banner-marked as the ACADEMIC legacy path so it
is not reached for whenever a posting says "CV".
F10 - US GPA
- The modified Bavarian formula converts FOREIGN grades INTO the German system.
Inverting it to produce a US GPA is not a recognised method, and the TUM
source calls even its forward calculator orientation only.
- Fields renamed to final_grade_us_4pt_orientation_only with that caveat. The
German grades remain the canonical facts. If a recipient publishes its own
conversion, use theirs and record which was used.
Validator PASS (1 advisory), 31/31 tests.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qej5SBvhcbGXHwLqNWiskM
Scout run 2026-09-04 (36 companies, 778 eligible) plus the NVIDIA package it
surfaced, and the tooling and policy fixes found along the way.
Application
- NVIDIA Senior DevOps Engineer, Zurich (JR2024256): submitted 2026-09-05.
Evidence Fit 64/100 Stretch, hard gate FAIL x2, channel Weak. Sent on an
explicit user override with the working model unresolved, so hybrid-vs-onsite
is a live screening topic. 2pp resume + 1pp cover letter, both validators
PASS, 0 boxes, 0 Tier 1 findings open.
Policy
- Drop the 7 Core / 2 Adjacent / 1 Stretch cohort caps. They had no derivation
and were overridden whenever they bound, and the cohort was confounded: it
tested fit class while holding channel constant at Weak across all six
applications. Keep the recording, drop the rationing.
- Channel replaces the slot budget as the rationed variable: no application
goes out cold when a named contact is published and reachable.
- Propagated through shared_ops, session_file_template, cohort_tracker
(counts, never counts-against-a-target) and application_cohort.json.
Tool fixes
- fetch_workday emitted 404 URLs for every Workday company (NVIDIA, Novartis,
Equinor): externalPath is site-relative and needs the locale + site prefix.
6/6 short-form 404, 3/3 long-form 200. 773 dead links repaired across 42
archived reports.
- find_decision_url silently de-linked decisions on two boards, which is why
ruled-out roles kept resurfacing as undecided. RUAG rotates its UUID on
repost; BIS migrated its vacancy URL scheme, orphaning 5 decisions including
a live application. Fixed as a two-tier match, not a slug key -- slugs
collide (two live RUAG reqs shared one).
Knowledge base
- claims.json: add Bash / shell scripting, the third canonical gap of this
shape after Ansible and Linux administration.
- bundle_data_platform: BS-4 was framed as a delivered observability stack over
what claims.json calls a proof of concept -- the defect the 2026-08-21 sweep
was told to look for.
- CLAUDE.md and AGENTS.md: correct the RUAG Data Lakehouse shortlist claim,
which the JD does not support and which both files still asserted.
- resume_template: comment-guard the missing babel/ngerman language block.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QFb8tTCig5r1KzkQiNXcYt
A 3L first bullet in the first experience position overflows page 1,
wasting prime real estate. Updated resume_reference.md (Page Fill
Budgets), critical_rules.md (Budget Reminder), cv_template.tex
(comment block), and /make-resume SKILL.md (Phase 1 checklist).
Co-Authored-By: Akhil Peeketi <akhil@lanl.gov>
- Add ai_fingerprint_rules.md with banned words, structural rules, and
12-item post-gen checklist
- Fix Fellowships/Honors template format: --- to period separator
- Fix Publications under-review template format
- Update all 4 skills to load fingerprint rules during generation
- Add AI scan section to critique framework
- Update resume_reference and cl_reference with em-dash limits
- Reduce em-dashes in example files
Co-Authored-By: Akhil Peeketi <peeketiakhilreddy@gmail.com>