Commit Graph
15 Commits
Author SHA1 Message Date
dennisthiessenandClaude Opus 5.5 2273c3eac8 feat(app): BIS jr100498 Senior/Lead Data & Analytics Engineer (MED IT) submitted; KB gaps closed; scout triage 2026-10-14
Application
- BIS Basel, Senior/Lead Data & Analytics Engineer, Monetary and Economic
  Department IT (jr100498, 3-year term): resume, cover letter, verbatim JD,
  session, critique and the four portal free-text answers. Submitted
  2026-10-15 via the BIS portal, cold (Evidence Fit 78 Core, hard gate PASS,
  Document Quality 88 after Tier 2 polish). Different unit from the rejected
  jr100429 (Banking Technology). Recorded in applications.json and
  decisions.json.

Knowledge base
- claims.json: BS-9 and SW-10 (onboarded and mentored junior developers at
  Bosch and Swisscom); skills TIBCO Spotfire, Teradata, Oracle Database and
  Hadoop / Impala registered from existing claim scopes; SDMX registered as
  forbidden (user-confirmed never used); SW-4 scope records the
  prototype-and-iterate approach with B2B business, architects and engineers.
- Clarification note 2026-10-14 with verbatim user answers, including
  "schedule yes, budget no" for project planning (unattributed, so not a
  claim yet).
- CLAUDE.md corrections log: 2026-10-14 entry.

Scout
- 2026-10-14 run (37 companies, 101 new): 19 JDs read; BIS jr100498 taken
  forward; Snowflake Engineering Productivity (mis-titled "Sr SWE,
  Enterprise"), Google SWE III Shopping Graph Feeds and Meta SWE
  Infrastructure logged as maybe; 15 roles logged as skip with the failing
  JD line quoted. Found: BIS RSS adapter stamps every vacancy as Basel
  (jr100491 is Hong Kong); Confluent Ashby board returns no jobs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 10:06:22 +02:00
dennisthiessenandClaude Opus 5.5 504fa373f7 feat(app): Kongsberg Seatex DevOps & Test Infra submitted; KB gaps closed; scout triage 2026-10-08
Application
- Kongsberg Discovery / Seatex, Lead Engineer DevOps and Test Infrastructure
  (Trondheim): resume, cover letter (+ paste text), verbatim JD, session and
  critique. Submitted 2026-10-08 via EasyCruit as a deliberate cold application
  on a user override of the embedded-SW hard gate (Evidence Fit 69, Document
  Quality 84). Recorded in applications.json and decisions.json.
- Google Senior SWE Full Stack Commerce: session and verbatim JD from
  2026-10-03 (no-go on the frontend gap, held, not submitted).

Knowledge base
- claims.json: ED-1 (embedded/robotics coursework, none since studies),
  SW-9 (current unit testing, pytest), new skills (pytest, unit testing,
  embedded systems (coursework), VHDL, robotics (coursework)), and Jenkins and
  GitLab CI/CD registered from existing GN-1/FC-1/BS-6/SW-3 scopes.
- Earlier uncommitted KB work: 2026-09-18 Python frameworks / enterprise SaaS
  clarification, 2026-10-03 data-product design / no-frontend clarification,
  2026-10-06 working-model rule (3 homeoffice days baseline) in config.md and
  application_strategy.md, plus related experience/bundle/taxonomy updates.
- CLAUDE.md corrections log: 2026-10-08 entry for the three canonical gaps.

Scout
- 2026-10-08 run triaged by JD read: NVIDIA DGX Cloud Senior Production
  Engineer, Google SRE III Prod AI / Senior SRE / Staff Shopping Graph and
  Amazon RIVR DevOps logged as maybe; GenAI FDE family, Kraken AI Platform,
  PostFinance DevOps and five Kdo Cy reqs logged as skip with reasons.

Housekeeping
- .gitignore: ignore .cache/ and raw HTML page dumps under output/.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 21:50:04 +02:00
dennisthiessenandClaude Opus 5 881d904e68 feat(app): Swisscom Data Engineer - Geo Platform (internal, R-0006447), submitted
Internal application, submitted 2026-09-15. Evidence Fit 78, hard gate FAIL
(ArcGIS and FME required, never used), overridden by the user. Document
Quality 89, no Tier 1 findings. Channel Moderate: hiring manager Marianne
Temerowski was contacted first and encouraged the application - the first
time a named contact was used before applying. 2-page English resume, no
cover letter (internal).

KB CORRECTIONS FOUND ON THE WAY
- BS-8: geospatial work at Bosch (Oracle SDO_GEOMETRY; normalizing and
  transforming wafer data across coordinate reference systems; performance
  tuning) was missing from claims.json. The first assessment also wrongly
  assumed wafer data carries no CRS; the user corrected it. ArcGIS, FME, QGIS,
  PostGIS, GeoServer and GDAL are registered as forbidden.
- Swisscom was recorded as one undifferentiated current role. It is two
  units: ART B2B (past - Teradata DWH component ownership, Kubernetes, GitLab
  CI/CD, Kafka) and ART DPT, Team Offering (current - AWS data products with
  ODP-Flow, PySpark/Python, Glue, Iceberg, Athena, Airflow). The first build
  wrote the B2B ownership in present tense. Kafka and Kubernetes are now
  production-historical. Official internal title recorded (Engineer IV, III
  before Apr 2025); the unit switch date deliberately not.
- Confirmed: SW-1 migration in Python Glue jobs with ODP-Flow; SW-3
  multi-environment deployments; SW-7 relational data models. SW-3 narrowed:
  he worked with automated GitLab CI/CD and did not build it.
- Skills added: Apache Iceberg, relational data modelling, ODP-Flow, Oracle
  SDO_GEOMETRY, coordinate system transformation.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 15:00:06 +02:00
dennisthiessenandClaude Opus 5 34299bce54 fix: follow-up review corrections, BIS rejection, and a gitignore miss
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
2026-09-11 23:57:06 +02:00
dennisthiessenandClaude Opus 5 b8c5141279 fix(F18-F19): get evidence onto page one earlier, measured not asserted
F18 - page-one weighting
- Across four compiled packages the first employment entry began at 45-55% of
  page one. A reader reaching the middle of the page had seen a profile and a
  skills block, and no evidence.
- The old skills rule counted `\skillline` MACROS, which does not control
  density: six categories with long value lists wrap to twelve or more rendered
  lines. Replaced with a rendered-line budget verified in the compiled PDF, plus
  the rule that a skills line repeating what three bullets below already prove is
  spending the first screen to say it twice.
- Employer chronology stays reverse-chronological; the ordering freedom is
  WITHIN a position, where the bullet closest to the target role leads.
- New helper `page_metrics.py` measures page-one geometry from the PDF via
  pdftotext -bbox.

F19 - education and phrasing
- Degree + focus + institution crammed into one cell with a right-aligned date
  produced visible word spacing and mid-word breaks in SBB, NVIDIA and Aker BP.
  Split the entry, as RUAG_AI_Engineer_C5I already did. Template carries the rule.
- Grades and thesis stay only where concretely relevant. claims.json
  grade_output_rule already keeps grades off by default; the M.Eng. thesis earns
  its place on condition-monitoring or sensor-data roles and otherwise does not.

Validated by measurement rather than assertion
- page_metrics.py first reproduced the review's own figures (NVIDIA 55.4%,
  SBB 50.6%, RUAG 50.3%). That is what makes the after-figure meaningful.
- The NVIDIA CV was rebuilt FROM A COPY with the guidance applied: experience
  moved 55.4% -> 44.0% of page one, page-one text lines 47 -> 39, still two
  pages, zero overfull boxes, validator PASS.
- The submitted package itself was not modified. F17 classifies archives as
  evidence, not as drafts.

The percentage is a diagnostic, not a target: no pixel goal and no rule that
page two must be filled.

All 19 review findings are now complete. 37/37 tests pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qej5SBvhcbGXHwLqNWiskM
2026-09-11 20:56:17 +02:00
dennisthiessenandClaude Opus 5 fc5f3e49ba 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
2026-09-11 19:33:24 +02:00
dennisthiessenandClaude Opus 5 afdef7eb94 refactor: shared agent workflows (F01) and one application registry (F02)
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
2026-09-11 19:23:13 +02:00
dennisthiessenandClaude Opus 5 a0ec2fedb5 feat: NVIDIA Sr DevOps application, drop cohort caps, fix Workday/decision-log bugs
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
2026-09-05 13:24:44 +02:00
dennisthiessenandClaude Opus 5 92a81a7dcb feat(resume): check bullet cadence variety, warn-only
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
2026-08-25 09:38:19 +02:00
dennisthiessen fe5f24704f feat: rebuild evidence-first application workflow 2026-07-27 17:56:15 +02:00
dennisthiessenandClaude Opus 4.8 d576254971 docs(skills): enforce JD integrity — real posting verbatim + Playwright recipe
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>
2026-06-06 20:46:10 +02:00
Akhil Reddy Peeketi 54f7b91aa6 feat: add CL hook verification, JD copy, and PDF rename to kit
- 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
2026-03-09 19:15:08 -06:00
Akhil Reddy PeeketiandAkhil Peeketi fd0de39b4e fix: add CV Page 1 rule — first bullet must be 2L
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>
2026-03-09 16:57:13 -06:00
Akhil Reddy Peeketi 9a7c627cc3 feat: add AI fingerprint avoidance rules and fix em-dash patterns
- 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>
2026-03-09 05:08:57 -06:00
Akhil Reddy Peeketi c51b49882f Initial release — claude-resume-kit v1.0
Complete AI-assisted resume/CV generation framework:
- 6 Claude Code skills (setup-extract, setup-build-kb, make-resume, make-cl, edit-resume, critique)
- LaTeX templates (resume, CV, cover letter) with .cls class files
- 6 reference docs (shared_ops, resume_reference, cl_reference, critical_rules, session_file_template, critique_framework)
- Fictional Dr. Jordan Chen examples (extraction, experience, bundle, config, session, JD)
- Knowledge base scaffolding and config template
- README with setup guide and workflow documentation
2026-03-09 02:42:10 -06:00