fix: review findings F03-F06 — quotas, rule hierarchy and a validator that checks

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
This commit is contained in:
dennisthiessenandClaude Opus 5 committed 2026-09-11 19:33:24 +02:00
1 parent afdef7eb94
commit fc5f3e49ba
8 files changed
+421 -31

No files matched your search

+51 -11
View File
@@ -6,19 +6,31 @@ Do not rewrite submitted application archives or invent missing evidence.
## Resume point
F01 and F02 complete. Next: F03, route tracker mutations through the authoritative registry, remove quotas and validate events.
Read this file and inspect `git diff` before resuming; do not repeat completed work.
F01–F06 complete. **Next: F07** — propagate evidence corrections into active writing sources
(start at `bundles/bundle_ml_ai_engineer.md:74,81`, the PyTorch context loss named in the report).
Read this file and inspect `git log`/`git diff` before resuming; do not repeat completed work.
Checkpoints so far: `afdef7e` (F01+F02), and the commit that carries F03–F06.
## 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; 10 tests pass |
| 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 | TODO | Remove quota, validate and safely update application records |
| F04 | TODO | Rule hierarchy, deliverables and approval semantics |
| F05 | TODO | Structured document evidence and honest mechanical/semantic results |
| F06 | TODO | LaTeX normalization, schema errors and advisory style diagnostics |
| 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 | TODO | Propagate evidence corrections into active writing sources |
| F08 | TODO | Normalize source/context/ownership metadata without inventing evidence |
| F09 | TODO | Safe professional templates; clearly separate academic legacy |
@@ -33,15 +45,43 @@ Read this file and inspect `git diff` before resuming; do not repeat completed w
| 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. Corrected the top-level file map and added this resume pointer. `python -m unittest discover -s tests -v`: 10/10 pass. The workflow validator now checks the shared critique implementation.
- 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. Original tables/cohort preserved in `job_scout/state/history/application_status_before_2026-09-11.json`. `application_records.py --check` detects stale projections. Aker BP's July 29/30 date discrepancy and original Adjacent override remain explicitly unresolved. No date or rubric explanation invented.
- 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.
- Not re-run this session: the 45-document LaTeX build sweep and the visual sampling.
## 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.
Historical packages are preserved; fixes apply to active sources and future generation unless
specifically noted.