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
141 lines
12 KiB
Markdown
141 lines
12 KiB
Markdown
# 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.
|