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
109 lines
5.4 KiB
Markdown
109 lines
5.4 KiB
Markdown
# Evidence-first resume kit
|
|
|
|
This repository turns verified career evidence into role-specific LaTeX resumes and, when useful, cover letters. It is designed to prevent a common failure mode of AI-assisted applications: making a document sound closer to the job description by silently overstating skills, scope, titles, or outcomes.
|
|
|
|
The workflow separates three questions that should never be confused:
|
|
|
|
1. **Evidence Fit:** does the candidate actually meet the role, including hard gates?
|
|
2. **Document Quality:** does the resume communicate the supported evidence clearly?
|
|
3. **Channel Strength:** is the application cold, referred, or supported by a warm contact?
|
|
|
|
A polished resume cannot repair a failed qualification gate. A strong fit can still be hidden by a weak document. The system records both.
|
|
|
|
## Source hierarchy
|
|
|
|
```text
|
|
source documents
|
|
-> structured extractions
|
|
-> canonical claims registry
|
|
-> experience records and role bundles
|
|
-> session plan
|
|
-> generated resume / optional cover letter
|
|
```
|
|
|
|
`resume_builder/canonical/claims.json` is the highest-authority career source. Generated files under `output/` are never treated as evidence. `historical_outputs.json` records whether an older package is safe to consult, must be revalidated, or must not be reused.
|
|
|
|
## Default application strategy
|
|
|
|
- Target Staff/Senior Data Engineering first.
|
|
- Use ML Platform/MLOps, data platform, analytics, and semiconductor profiles only where direct evidence covers the actual requirements.
|
|
- Treat direct LLM engineering, formal model evaluation, Terraform-heavy SRE, and similar missing required experience as gates rather than keyword opportunities.
|
|
- Record fit and outcomes without application quotas; a fit classification is a preparation signal.
|
|
- Add a warm-channel action for core applications.
|
|
|
|
The default document is a two-page International Tech resume for US-tech/FAANG-style roles in Europe. A Swiss/DACH policy overlay is available for employers that expect local conventions. Cover letters are conditional, not automatic.
|
|
|
|
## Workflow
|
|
|
|
### Add evidence
|
|
|
|
1. Put employment records, project material, papers, or notes under `knowledge_base/`.
|
|
2. Run `setup-extract` to create a source-grounded extraction.
|
|
3. Review it, then run `setup-build-kb` to update canonical claims, experience files, bundles, and support data.
|
|
|
|
### Apply to a role
|
|
|
|
1. Run `make-resume` with the real JD.
|
|
2. Review the requirement table and fit gate before approving content generation.
|
|
3. Generate and validate the LaTeX resume.
|
|
4. Run `make-cl` only when the session records a justified `YES` decision.
|
|
5. Run `critique` for separate Evidence Fit, Document Quality, and Channel Strength findings.
|
|
6. Run `edit-resume` for approved repairs.
|
|
|
|
The skills live in `.agents/skills/`. Each application receives a session file under `output/<Role>/` that preserves the JD, fit decision, claim IDs, content plan, validation results, and application status.
|
|
|
|
## Validation
|
|
|
|
Validate the knowledge system:
|
|
|
|
```powershell
|
|
python resume_builder/helpers/validate_resume_system.py
|
|
```
|
|
|
|
Validate a generated document:
|
|
|
|
```powershell
|
|
python resume_builder/helpers/validate_resume_system.py --document output/Role/resume.tex
|
|
```
|
|
|
|
Track the uncapped application record (use `summary --all` for older applications too):
|
|
|
|
```powershell
|
|
python resume_builder/helpers/cohort_tracker.py summary
|
|
```
|
|
|
|
`job_scout/state/applications.json` owns current status and event history. The old cohort JSON and
|
|
`resume_builder/reference/current_applications.md` are generated views. Update status without erasing interview history:
|
|
|
|
```powershell
|
|
python resume_builder/helpers/cohort_tracker.py update --id <application-id> --date YYYY-MM-DD --event interview_held --note "Interview completed"
|
|
python resume_builder/helpers/cohort_tracker.py update --id <application-id> --date YYYY-MM-DD --outcome withdrawn_by_candidate --note "Reason"
|
|
python resume_builder/helpers/application_records.py --check
|
|
```
|
|
|
|
Use `application_records.py --render` to recover stale generated views. A classification that differs
|
|
from its numeric rubric needs `--fit-override-reason`; it is never silently relabelled.
|
|
|
|
Character counts are available only as readability diagnostics. There are no fixed character bands, equal-length bullet rules, or page-fill quotas.
|
|
|
|
Run the offline regression suite with `python -m unittest discover -s tests -v`.
|
|
The application registry and its import history are versioned; seen-state and generated PDFs are not.
|
|
`package_manifest.py --check` checks source/class content and any recorded PDFs that are present.
|
|
Missing local PDFs are permitted. After inspecting changes, run `package_manifest.py` to refresh
|
|
source hashes, or add `--record-pdfs` to explicitly record current PDF hashes. These snapshots
|
|
detect edits; they do not certify that an existing PDF was built from a particular source.
|
|
|
|
Scout writers are serialized with `job_scout/state/scout.lock`. After a crash, remove a stale
|
|
lock only after verifying no scout process is still running. Successful reports, including
|
|
`--new-only` and `--only=...`, mark their delivered results seen without changing other companies.
|
|
|
|
## Output and prerequisites
|
|
|
|
The system writes `.tex` source only. Compile locally with a LaTeX distribution such as MiKTeX, TeX Live, or MacTeX. Generated resumes should also be checked through PDF rendering and text extraction before submission.
|
|
|
|
See [DOCS.md](DOCS.md) for the architecture and policy reference.
|
|
|
|
## License
|
|
|
|
MIT; see [LICENSE](LICENSE).
|