F03 — application records
- Quota already removed with F02's tracker; verified uncapped and that
"interview reached" survives a later withdrawal.
- Aker BP: application date confirmed 2026-07-29 by the user, settling the
one-day conflict. Its Adjacent-despite-79 classification is kept, NOT
reclassified: the user does not remember the rationale and judged it
immaterial on a closed role, and silently reclassifying to make the
arithmetic tidy is the exact objection the review raised. Recorded as an
explicit override reason with a rubric version instead.
F04 — rule hierarchy
- Three levels stated in AGENTS.md and CLAUDE.md: immutable evidence rules,
standing user preferences, market/employer presentation.
- Deliverables separated from QA. The .tex stays the artefact of record; you
still compile, into the application's own output/ folder, because the user
cannot approve what he cannot open.
- `resume_reference.md` said "Capgemini/Bundeswehr: include only when directly
relevant", contradicting the standing never-include rule. Split and fixed.
F05 — a green validator now means something
- Per-claim `forbidden` wording is enforced. 14 of 26 claims carried such a
list and NONE of it was checked, which is why "owned the full ML lifecycle"
passed. Matching tolerates inserted adjectives: the real regression read
"Built a decentralized Data Mesh" and one word defeated the literal list.
- Added identity (e-mail/phone), employer-date, placeholder and
document-exclusion checks. Capgemini's omission rule now has a canonical
home in claims.json instead of living only in memory and config.md.
- Registered Groovy and Snowflake as forbidden skills. Both were absent from
claims.json entirely, so "forbidden" existed in prose with nothing enforcing
it.
- PASS no longer reads as a truth certificate: it prints what it did not check
— scope implications, bullet-to-claim support, whether a number is real.
F06 — the scanner stopped fighting the documents
- LaTeX comments are no longer claims; `% never claim Terraform` was a finding
before, which taught the workflow to write around the checker.
- Markup, accent macros and umlauts are normalized, so `\textbf{Snow}flake`
cannot smuggle a forbidden skill past a substring test and
`Universit\"at der Bundeswehr M\"unchen` is recognisably a school.
- Honest denials pass in English and German.
- The triple-list cadence hint knew only English "and", so it silently did
nothing on every German package. Advisory only, and now labelled as such.
Verification
- The six counter-proofs from the report are caught: 9 errors on one synthetic
document, where the old scanner found none.
- All six packages built under current rules scan clean — SBB, NVIDIA, RUAG,
Kdo Cy, Citadel, Aker BP. Four false positives of my own were found and fixed
on the way there; each is now a regression test.
- 13 older packages do report findings. Those look like genuine historical
violations and are deliberately NOT fixed here: F17 governs archives and they
must not be silently rewritten.
- `tests/test_document_scanner.py` added. Full suite 31/31 pass.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qej5SBvhcbGXHwLqNWiskM
Checkpoint for the 2026-09-11 project review remediation. Work by a previous
agent that ran out of context; committed unchanged as a rollback point before
the remaining findings land on top of it.
F01 — the two agent directories had drifted into different processes
- Six shared workflows under `resume_builder/reference/workflows/`; both
`.agents/skills/` and `.claude/skills/` are now thin entrypoints that route
to the same file instead of carrying full copies.
- The `.claude` copies were the stale side: fixed bullet line variants and
character budgets that the newer process had already dropped. Removing them
is the point of the change, not collateral.
- Parity/link regression test added; corrected the top-level file map, which
pointed at a directory that does not exist.
F02 — application status was stored in four places and disagreed
- New registry `job_scout/state/applications.json` (26 records) with
`application_records.py` (schema, validation, transactional write) and
`application_tracker.py` (add/update, no quota).
- AGENTS.md and CLAUDE.md no longer keep their own status tables; both point
at `current_applications.md`, generated from the registry.
- Interview-reached is now independent of outcome, so a withdrawal after an
interview can record both facts. The old tables are preserved verbatim in
`job_scout/state/history/application_status_before_2026-09-11.json`.
Verification: `python -m unittest discover -s tests -v` — 18/18 pass.
Spot-checked that the detailed SBB and Kdo Cy notes survived the migration
into the registry rather than being flattened.
Known unresolved, deliberately not invented (see FIX_PROGRESS.md):
Aker BP's application date and its Adjacent-despite-79 classification.
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
An audit of all 18 packages in output/ (368 bullets) found one rhythm
running through every document: 45% of bullets used the same "X, Y and
Z" triple, and the SBB package reached 85% - 11 of 13 bullets, every
Swisscom and Bosch line - plus two adjacent bullets both opening
"Build and...".
This is a style finding, not a truth finding. Every bullet was accurate.
The corpus is clean on the axes that actually signal generated text: no
AI vocabulary (0 hits for leverage/spearheaded/robust/passionate and 56
others across 35 documents), prose em-dashes at 0.08/bullet, and PDF
metadata carrying nothing but MiKTeX pdfTeX with empty Author/Title
(0 AI tokens and 0 generator-term leaks across 69 PDFs). What is left is
cadence: ten bullets sharing one three-beat rhythm read as machine-made
even when nothing in them is false.
Guarded deliberately so it cannot do harm. cadence_checks() emits WARN
and never ERROR, the critique deduction caps at 1 point, and both the
reference and the docstring state that no claim, scope or hedged verb
may be bent to satisfy rhythm. An anti-monotony rule with teeth would be
worse than the problem - it would pressure a future run into loosening a
scoped claim to vary a sentence.
Thresholds are calibrated on the corpus, not guessed. Position length
spreads are bimodal (1-9 words, then 15-17), so the check flags a spread
of <=4, the tight tail at ~28% of positions; the first draft used <=6
and flagged the median. Also fixed the opening-verb extractor, which
read \textbf{Owned ...} as the word "textbf" and produced six false
positives on one document. Per-package warnings now run 0-3.
Docs: resume_reference.md 7a + verification step, critical_rules.md 7a,
critique_framework.md mechanics row, CLAUDE.md corrections log.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MHtzyTKBcg6BWhD5qFegtK
Add the JD Integrity section to shared_ops (no reconstructed/inferred JDs;
WebFetch is JS-blind on careers boards; scrape JS-gated postings via the
job_scout Playwright venv; STOP and ask if the real text is unobtainable).
Wire the rule into /make-resume and /critique. Allow cisco/bkw WebFetch.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- cl_reference.md: mandatory web-search verification for all CL hooks
- make-cl/SKILL.md: hook verification gate before presenting CL draft
- critique/SKILL.md: step 8b paper hook verification (Tier 1 if wrong)
- shared_ops.md: copy JD into output folder during Phase 0
- shared_ops.md: rename final PDFs to clean names at finalization
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>