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
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
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
- 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>