dennisthiessenandClaude Opus 5 f8b4cd3473 feat(citadel): cover letter, and fix SW-1 scope traps in two more bundles
Cover letter: 1 page, 270 words, 3 paragraphs, validator PASS. Carries
the one thing the resume structurally cannot - why a Swisscom data
engineer credibly wants a research-platform seat at a market maker,
which against an ex-FAANG field is the main differentiator.

Deliberately uses no external hooks. cl_reference.md says to omit an
unnecessary hook rather than spend words proving company familiarity, so
the only hook is the JD's own language, scraped verbatim and first-party.
No named executives: nothing to verify, and nothing that reads as
name-dropping. The letter also states the R1 gap plainly rather than
hiding it, because a technical reviewer will find it in the first
question anyway and owning it is stronger than being caught by it.
PP-1 appears with its personal-project label and an explicit "I make no
claims for its results".

Separately, loading the bundles for this letter surfaced two live scope
traps. The 2026-08-21 correction that fixed the SW-1 violation in
bundle_data_engineer.md ended with "check the other four bundles for the
same pattern". That sweep was never done, and two of them carried it:

  bundle_data_platform.md - the S5 cover-letter hook read "migrating
  Swisscom's legacy ETL stack to a cloud-native AWS platform", and its
  narrative thread said "migrating an entire ETL infrastructure". Both
  pair a full-ownership framing with a company-scale object, which
  claims.json SW-1 forbids outright.

  bundle_ml_ai_engineer.md - the SW-1 reframing row read "Built
  cloud-native data infrastructure on AWS ... the scalable data layer",
  which is both a full-ownership verb on an org-scale object and an
  unverified scale claim.

Both rewritten to the scoped form with inline scope warnings, matching
the data_engineer fix. bundle_analytics_engineer.md and
bundle_semiconductor.md were checked and are clean.

These were loaded traps: any future cover letter built from either
bundle would have started from a sentence claims.json forbids.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MHtzyTKBcg6BWhD5qFegtK
2026-08-26 09:31:39 +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.
  • Build application cohorts with roughly 70% core, 20% adjacent, and 10% deliberate stretch roles.
  • 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 active 7/2/1 cohort:

python resume_builder/helpers/cohort_tracker.py summary

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
11 MiB
Languages
TeX 76.2%
Python 23.8%