dennisthiessenandClaude Opus 5 d702c4bc0c feat(kb): extract Bosch, Swisscom and Vizrt evidence; record 6 discrepancies
All three read as primary documents. Uncontested facts are written in; six
conflicts between the documents and the KB are RECORDED AND LEFT OPEN, because
several are the user's call and one contradicts a memory entry that shaped
targeting.

New evidence
- Swisscom Zwischenzeugnis (Okt 2025) is unusually specific and now backs SW-1,
  SW-2 and SW-3 verbatim: component ownership for the ETL pipelines feeding the
  TERADATA DATA WAREHOUSE, Python on Kubernetes with GitLab CI/CD, AWS migration
  (S3, Glue, Athena, Redshift, Airflow), 2nd/3rd-level support and on-call.
- Bosch Zeugnis corroborates BS-1 directly: "Erarbeitung und Durchfuehrung von
  Integrationsstrategien fuer den Einsatz von Machine Learning Modellen in der
  24/7 Fertigungsumgebung". It also confirms the BS-4 PoC framing as the
  document's own wording rather than a policy hedge.
- NEW claim BS-7: "Fachliche Betreuung von Studierenden, auch im Rahmen von
  Abschlussarbeiten". Documented mentoring evidence, recorded NOWHERE before
  today, although "developing other engineers" is a recurring JD requirement -
  SBB asked for it explicitly and the answer had to lean on team roles instead.
- Vizrt's letter is thin: testing responsibilities only. It does NOT mention the
  transcoding backend, Python or C++, so VZ-1 is marked as resting on the user's
  statement rather than on the document.

Six open discrepancies (claims.json: open_discrepancies_2026_09_11)
- D1 HIGH: the Bosch Zeugnis says "Ingenieur" in "Fertigungstechnologie" 1/2/3.
  The words "Senior" and "Data Analysis" do not appear in it, yet the KB note
  claims official_title is "the formal combined string on the Zeugnis".
- D2: KB has a promotion at 2021-01; the Zeugnis shows department moves at
  2021-06 and 2022-03 and names no promotion.
- D3 HIGH: "Seit dem 01. September 2021 arbeitete Herr Thiessen in Teilzeit."
  Bosch was PART-TIME for its final ~16 months. Recorded nowhere. Tenure wording
  including "over ten years" was written without knowing this.
- D4 HIGH: the Swisscom Zeugnis says he uses ENGLISH, FRENCH and ITALIAN
  professionally on a regular basis. Memory user_international_mobility says
  "DE/EN only (no French)" - and that entry screened out French-speaking roles.
- D5 HIGH: Swisscom component ownership feeding a Teradata DWH, plus Fraunhofer
  MSSQL, undercut two premises of the RUAG "Senior Data Engineer (MSSQL)"
  rule-out. Talend and SAP S/4HANA are still 0 and may still carry it.
- D6 LOW: Vizrt letter says 01.07.2017-01.07.2018; KB has end 2018-05.

None of the six is resolved here. Do not quietly pick a side when writing a
document - ask.

Validator PASS, 37/37 tests.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qej5SBvhcbGXHwLqNWiskM
2026-09-11 21:33:32 +02:00

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

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:

python resume_builder/helpers/validate_resume_system.py

Validate a generated document:

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

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:

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.

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 for the architecture and policy reference.

License

MIT; see LICENSE.

S
Description
No description provided
Readme MIT
13 MiB
0 Stars 1 Watchers 0 Forks
Languages
TeX 66.6%
Python 33.4%