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
10 KiB
Review remediation — 2026-09-11
User authorized all recommendations in output/Project_Review_2026-09-11/project_review.tex.
Work sequentially; update this file after each verified fix and before stopping.
Do not rewrite submitted application archives or invent missing evidence.
Resume point
F01–F17 complete. Next: F18 — evidence earlier on page one and a rendered skills budget.
F18/F19 change how the CVs look; the user authorised this on 2026-09-11. They need compiling
and visual inspection, not blind patching, so budget for a build loop.
Read this file and inspect git log/git diff before resuming; do not repeat completed work.
Checkpoints: afdef7e (F01+F02) · fc5f3e4 (F03–F06) · ce5b7f5 (F07) · 3519b2f (F08–F10) · afd8174 (F11–F13) · ce8619b (F14) · c7e8d4e (F15–F16) · plus F17.
User rulings — 2026-09-11
- Aker BP application date: 2026-07-29 (confirmed; the CLAUDE.md cell saying 07-30 was wrong).
- Aker BP Adjacent-despite-79: user does not remember and considers it immaterial, role closed and rejected — "mach wie du es am saubersten findest". Resolved as: keep the recorded class, record an honest override reason saying the rationale is unrecoverable, and do not reclassify. Silent reclassification was the review's own objection.
- F18/F19 document layout changes: authorized.
Checklist
| Finding | Status | Scope / verification |
|---|---|---|
| F01 | DONE | Six shared workflows; both agent entrypoints route identically; parity/link regression test |
| F02 | DONE | 26 registry records, preserved original tables, common current view, interview events independent of outcome |
| F03 | DONE | Quota gone (tracker is uncapped, cohort_tracker.py is a shim); Aker BP date and override recorded; validation enforces unique IDs, ISO dates, score range and gate/class consistency |
| F04 | DONE | Three-level rule hierarchy in AGENTS.md + CLAUDE.md; deliverable vs QA separated; resume_reference.md Capgemini contradiction removed |
| F05 | DONE | Per-claim forbidden wording enforced, identity/employer/placeholder/exclusion checks, document_exclusions given a canonical home, PASS no longer claims to be a truth certificate |
| F06 | DONE | LaTeX comments, markup, accent macros and umlauts normalized; negations respected; German und in the cadence hint; advisory warnings labelled as never a gate |
| F07 | DONE | Overstatement narrowed (BS-1, zero-downtime, retrieval, evaluation, PyTorch context); undervaluation fixed (BS-6 reached no bundle at all; Linux/Ansible/Bash missing from taxonomy) |
| F08 | DONE | evidence_schema + per-claim evidence block on all 26; 8 dates recovered from existing text, 18 written unrecorded rather than guessed; coverage reported as an advisory hint, never a gate |
| F09 | DONE | 12+ years -> over ten years with the reasoning inline; cv_template.tex banner-marked as the academic legacy path |
| F10 | DONE | US figures renamed *_orientation_only; the Bavarian formula runs foreign-INTO-German, so inverting it is not a recognised conversion. German grades stay canonical |
| F11 | DONE | Requisition-keyed; same-req locations merge; shared titles warn instead of deleting. Live run recovered 57 roles (758→815), including a second RUAG Software Engineer C5I req that was invisible |
| F12 | DONE | Whole-word place matching (Bernau no longer reads as Bern); ~25 Swiss towns incl. Thun and Zimmerwald; Danish cities; pan-regional scope no longer beats an explicit onsite/one-country restriction. All 14 review cases correct |
| F13 | DONE | Identifying query params kept in the key; read and write paths share lookup_decision. Live run recovered 7 reposted RUAG decisions, labelled RELATED rather than applied as identical |
| F14 | DONE | Buckets renamed to keyword relevance with an explicit 'NOT a fit judgement'; German titles and platform/DevOps vocabulary added. Kdo Cy ICT-System Engineer (DevSecOps/Platform Automation) went 0→10; Senior Dateningenieur 1→3, level with its English twin |
| F15 | DONE | Taleo deadline moved out of posted (a closing date was making roles look freshly published); unit, compensation, contact and date_provenance carried as fields through to the report and JSON. Named contacts now surface — directly serving the channel rule |
| F16 | DONE | Restricted runs write <date>.only-x.md and leave the daily report intact; seen-state committed only after the report is on disk, and never by a restricted run; unique temp names for atomic writes |
| F17 | DONE | Build sweep 46/48; package_manifest.py records per package what a rebuild would really do; 7 unclassified packages registered with a safe default; oday removed from the cover-letter template. Historical packages untouched |
| F18 | TODO | Evidence earlier on page one; rendered skills budget |
| F19 | TODO | Education layout, phrasing guidance, reproducible word counts |
Sequencing note: F11–F16 all touch scout.py. Fix behaviours in place and keep each
finding's diff separately verifiable. Do not start the ~2400-line file split F16 suggests
mid-remediation — it would destroy the ability to attribute a regression to a specific fix.
Verification log
- Review baseline: 9 existing tests passed; 43/45 LaTeX builds succeeded. See the report for limitations.
- F01: moved current workflows into
resume_builder/reference/workflows/; preserved skill frontmatter and Claude invocation support.python -m unittest discover -s tests -v: 10/10 pass. - F01 limitation: external
quick_validate.pycould not start because PyYAML is absent; repository tests validate frontmatter and both routing links. - F02: imported 26 applications from the newer CLAUDE table and seven structured cohort records.
Originals preserved in
job_scout/state/history/application_status_before_2026-09-11.json. - F03:
application_tracker.py summaryruns uncapped and reports "interview reached: 1" for SBB despite the withdrawal — the F02 separation working. Aker BP written throughrecords.transaction(), so validation and view regeneration ran;--checkreports views current. - F04:
resume_reference.mdsaid "Capgemini/Bundeswehr: include only when directly relevant", contradicting the standing never-include rule. Corrected, and the two rules separated. - F05/F06 verification — the counter-proof document is the evidence:
- All six counter-proofs from the report are now caught (9 errors on one synthetic document).
% Never claim Terraform(a comment) and an honest "no Terraform experience" — English and German — correctly produce no finding.- All six packages built under current rules scan clean: SBB, NVIDIA, RUAG, Kdo Cy, Citadel, Aker BP — 0 errors each. Four false positives of my own making were found and fixed along the way (title collision across employers, education institution vs employment entry, umlauts, LaTeX accent macros). Each is now a regression test.
- 13 older packages DO report findings (Apple 9, Microsoft Principal FDE 8, …). These look like genuine historical violations under today's stricter rules — "petabyte scale", "own the AWS data platform", uncontextualised PyTorch/TensorFlow. Not fixed: F17 governs historical archives and they must not be silently rewritten. Feed this list into F17.
tests/test_document_scanner.pyadded: 8 must-fail, 4 must-not-fail, plus a guard that current packages stay clean. Full suite 31/31 pass.
- F07: raw history preserved; only selection rules and safe wording changed. The NVIDIA/RUAG
"line could not be stopped" phrasing is left in the submitted letters and recorded as an OPEN
ITEM in
experience_bosch.md- plausible, unevidenced, to be confirmed before reuse. - F08:
unrecordedis deliberately a real value. Failing the build on it would push a future session to invent dates to get a green run. - F10: no stale
final_grade_us_4ptreferences remain anywhere in the repo. - F11–F14 validated on a live 37-company run: 815 matches vs 758 the day before, the delta being requisitions the title dedupe had been deleting. Seven employers reported shared-title collisions that are now kept and flagged (Grafana 5, Axpo 6, AWS 3, RUAG 2, …).
- F14 note: the score floor on RUAG/SBB/BKW/PostFinance/Kdo Cy was a workaround for missing German vocabulary. The vocabulary is now the fix; the floors can probably be reduced later, but they were left in place to keep this diff attributable.
- F15/F16 validated on a live 37-company run: named contacts with phone numbers now appear in
report rows, NATO/Taleo closing dates render as Bewerbungsfrist rather than Posted, and
--only=kdocywrote2026-09-11.only-kdocy.mdwhile leaving the full report untouched. - F16 context: the daily-report clobber is not hypothetical. It happened twice in this session (2026-09-10 and 09-11) and both times the full run had to be repeated by hand.
- F17 build sweep RUN this session: 48 sources, 46 built, 2 failed —
Infineon_AI_Engineercover letter (font expansion: the font is not scalable) andcv_template.tex(unfilled placeholders, expected for the academic legacy template). Overfull boxes: Microsoft ISE 25.33pt, Isovalent 0.88pt. Both are historical; not touched. - F17 findings across 21 application packages: 17 are date-dependent (
odayin the cover letter, so a rebuild restamps them), 1 has an incomplete source distribution (NATO ships noresume.clsand only builds because a copy exists elsewhere on this machine), 1 has no PDF. The repo carries three differentresume.clsvariants (13/7/1 copies), which is exactly why copying the newest one into NATO would not be a safe repair. - F17 classification: 7 packages were unregistered; added to
historical_revalidate, with a recorded default that anything unlisted is treated that way. Being recent is not being verified — none was re-read for this. - Still not re-run: the visual page sampling (F18).
Completion rules
DONE requires implementation plus relevant checks. Record partial work and exact next action. Missing factual evidence must remain explicitly unresolved, never silently promoted to verified. Historical packages are preserved; fixes apply to active sources and future generation unless specifically noted.