Files
claude-resume-kit/FIX_PROGRESS.md
T
dennisthiessenandClaude Opus 5 34299bce54 fix: follow-up review corrections, BIS rejection, and a gitignore miss
Second-pass review of this session's work by another agent. It corrected several
real mistakes of mine and finished F06 gaps I had left open. Reviewed, verified
and committed as-is.

THE MISS THAT MATTERS
`job_scout/state/applications.json` — the authoritative application registry
introduced by F02 — was never actually tracked. `job_scout/state/*` in
.gitignore silently excluded it, so my checkpoint commit afdef7e claimed to add
it and did not. Only `application_cohort.json`, the GENERATED projection, was
version-controlled; the source of truth and the migration history backup were
not. .gitignore now carries explicit negations for both.

MY ERRORS, CORRECTED
- "kastellaun" was in CH_LOCATION_KEYWORDS. Kastellaun is in Rhineland-Palatinate.
  I took it from a Bundeswehr reserve listing and filed it under Switzerland -
  precisely the class of bug F12 existed to fix.
- The F12 fix only widened the keyword list; SmartRecruiters still discarded the
  structured country, which was the concrete case the review named
  (city=Baar, country=CH). The adapter now preserves it, and a COUNTRY_NAMES
  mapping gives country precedence over a bare town name.
- F15 was applied to Taleo and Prospective only. Greenhouse still wrote
  `updated_at` into `posted`; it now uses `published_at` and carries provenance.
- My negation guard `\b(no|not|...)\b[^.;]{0,60}$` was too loose - an unrelated
  "not" within 60 characters could mask a real claim. Tightened to require the
  negation to govern the term.
- F18's retirement of the macro-count rule missed "Four to six compact skills
  lines" in the workflow; removed now.

F06 GAPS I LEFT OPEN, NOW CLOSED
Date-format validation on education/employment periods (the 2035-99 case named
in the review), evidence-structure validation, referential integrity on evidence
source files, and the missing-identity KeyError.

F10 TAKEN FURTHER, AND RIGHTLY
I demoted the US-GPA fields to *_orientation_only. They are now removed
entirely, with grade_output_rule saying what to do instead: use the German grade
and scale, and if a recipient requires a US GPA, use THEIR method and record it.
Keeping a number derived by a non-recognised method invites its use.

Also: the Capgemini omit-preference now sits in experience_capgemini.md itself,
alongside the instruction not to fill or explain the intentional gap.

BIS BASEL - REJECTED 2026-09-11
jr100429, applied 2026-07-10, no interview, no reason given. Recorded in the
registry with a dated event and in the decision log; the "prep interview brief
when screening lands" next action is cleared. This also settles the 2026-09-04
observation that the req had vanished from the BIS board - it was a real
rejection, not just a closed posting.

VERIFICATION I RAN MYSELF BEFORE COMMITTING
49/49 tests. Validator PASS with 0 advisory warnings. Package manifest and
registry views current. All 12 F12 location cases still correct, including
Kastellaun now rejecting. The F05 counter-proof still catches all 9 violations.
SBB, NVIDIA, RUAG and Kdo Cy resumes still scan clean. Diffs are net-additive
across every reference file - the deletions are replacements, not losses.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qej5SBvhcbGXHwLqNWiskM
2026-09-11 23:57:06 +02:00

141 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
**Follow-up review corrections implemented and verified.** The previous DONE labels below
describe the first implementation. This checklist records the subsequent corrections:
- [x] Make authoritative application registry and migration history visible to Git.
- [x] Fix scanner context/markup and basic schema validation.
- [x] Fix country precedence, related decisions, new-only state and serialize scout writers.
- [x] Fix chronological application updates.
- [x] Make manifest content-sensitive and independent of absent local PDFs.
- [x] Fix heading measurement and actual education template.
- [x] Add DK/NO guidance; remove residual scope/Capgemini/GPA contradictions.
- [x] Run regression tests, isolated checkout checks and template visual QA.
Verification: 49/49 tests pass both locally and in an isolated copy of all Git-included
working-tree files, with no ignored PDFs or runtime state. Canonical, registry-view and
manifest checks pass. The professional template builds to two pages and was visually checked.
Historical submitted documents were not changed. No new dependencies or framework introduced.
Manifest PDF hashes detect changed files; they intentionally do not claim a verified build association.
The scanner remains a mechanical check; semantic claim review is still required.
Historical first-pass limitation: only geometry was measured then; the corrected template has
now also been visually checked. The older packages listed below still carry historical findings;
they are preserved as submission records, not reused as career-evidence sources.
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) · `eecdbda` (F17) · plus F18–F19.
## 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 | DONE | Rendered-line budget replaces the source-macro count; `page_metrics.py` measures page-one geometry. Demonstrated on a rebuilt copy of the NVIDIA CV: experience moved **55.4% → 44.0%**, 47 → 39 page-one lines, still 2 pages, 0 boxes, validator PASS |
| F19 | DONE | Education entries split (degree on the entry line, institution below) after the RUAG model; grades/thesis kept only where concretely relevant; template carries the rule as a comment |
**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.py` could 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 summary` runs uncapped and reports "interview reached: 1" for SBB
despite the withdrawal — the F02 separation working. Aker BP written through
`records.transaction()`, so validation and view regeneration ran; `--check` reports views current.
- F04: `resume_reference.md` said "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.py` added: 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: `unrecorded` is 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_4pt` references 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=kdocy` wrote `2026-09-11.only-kdocy.md` while 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_Engineer` cover letter (font expansion: the font is not scalable) and
`cv_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** (` oday` in the cover
letter, so a rebuild restamps them), **1 has an incomplete source distribution** (NATO ships no
`resume.cls` and only builds because a copy exists elsewhere on this machine), 1 has no PDF.
The repo carries **three different `resume.cls` variants** (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.
- F18/F19 validated by measurement, not assertion: `page_metrics.py` reproduced the review's own
figures (NVIDIA 55.4%, SBB 50.6%, RUAG 50.3%) before any change, which is what makes the
after-figure meaningful. The submitted NVIDIA package was NOT modified - the demonstration was
built from a copy.
- The percentage is a DIAGNOSTIC, not a target. No pixel goal, no forced page-two filling.
## 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.