Commit Graph
43 Commits
Author SHA1 Message Date
dennisthiessenandClaude Opus 5.5 3a9c2faf44 feat(app): NVIDIA Senior Production Engineer, DGX Cloud submitted; on-duty, GPU and networking KB gaps closed; triage 2026-10-22
Application (submitted 2026-10-22, Workday):
- NVIDIA JR2027105, Switzerland Remote. Evidence Fit 65, Stretch (SLIs and
  error budgets not evidenced), hard gate PASS, channel Weak, no cover letter.
- Package in output/NVIDIA_ProdEng_DGX_Cloud/: session, resume .tex, critique
  (Document Quality 85 before Edit 1; Tier 1 + all Tier 2 applied), verbatim JD.
- Prior NVIDIA req JR2024256 was pulled (last listed 2026-09-18; page gone
  2026-10-22): noted on that application, so there was no stacking conflict.

KB (claims.json, user-confirmed 2026-10-22):
- SW-11: current rotating engineer-on-duty role, Opsgenie alerting, alerts and
  bugs auto-create Jira tickets; he writes alert thresholds (e.g. data quality).
- BS-1: the Bosch inference ran on NVIDIA GPUs; CUDA registered forbidden as a
  skill (system context only, little configuration done).
- BS-4: the PoC included Grafana, Prometheus and Loki; ELK Stack, Grafana,
  Prometheus and Loki registered as PoC-context skills.
- networking: certification context only (AWS SA Associate); work uses
  automated landing zones.
- Extraction and CLAUDE.md log row added.

Scout state:
- decisions: RUAG Senior DevOps (Kubernetes) C5I parked (home-office terms);
  SLB Data Scientist skipped (user); NVIDIA JR2008695 skipped (C++/Rust 8y);
  JR2027105 applied; Norway/Apple/Swiss JD-read triage decisions.
- employer_reputation: SLB (Glassdoor 3.9), MazeMap and SpareBank 1
  Nord-Norge (unchecked).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 22:29:27 +02:00
dennisthiessenandClaude Opus 5.5 ff12f16545 fix(scout): Apple blind to CH for 2 months, BIS behind Cloudflare, NAV rate limit, EMEA leak; reputation for every board
Apple (the big one)
- The location=switzerland-CHE slug stopped resolving; Apple silently applied
  a US location, so every run from at least 2026-08-31 returned the same 21
  US/intern cards and 0 Swiss roles. Now location code CHEC (from
  /api/v1/refData/postlocation), result list item as the card (location
  readable), pagination, settle delay, longer wait and per-element timeout.
  Verified twice: 24 Swiss roles each run.

BIS
- bis.org went behind a Cloudflare challenge (403 even headless). Moved to the
  Workday tenant bis.wd3.myworkdayjobs.com/External, which also carries the
  office. Host alias + lower-cased jr-id keep all 9 bis.org#jr decisions
  linked (applied jr100498 included).

NAV
- Search API 429s after ~9 requests and stays blocked for hours: discovery
  capped at 8 searches (4s pacing). Posting text now comes from NAV's official
  third-party feed (pam-stilling-feed, public rotating token), with a small,
  slow website-page fallback for ads the feed lacks (~2/3). Verified live on
  15 real ads; fallback path tested on fixtures.

Location filter
- EMEA leak fixed: a country allowlist without CH/DK plus a trailing region
  tag is no longer Europe-remote (27 rows). Swiss/Danish segments in
  multi-location strings are evaluated per segment. Regression over all
  2026-10-22 rows: only the fenced rows changed.

Reputation
- Every board now has a dated verdict; kununu added as a primary source next
  to Glassdoor (the one with more reviews decides; user tip). Second-source
  scores now count (a low one means avoid). AVOID: BIS (Glassdoor 2.9),
  BFH (kununu 3.3), Kdo Cy (federal administration kununu 3.4).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 10:44:45 +02:00
dennisthiessenandClaude Opus 5.5 92c3c005b4 feat(scout): Norway outside Oslo via NAV + dedicated boards, language check, reputation, region split
Norway search (user request 2026-10-21/22: Trondheim, Bergen or similar, not Oslo)
- New location policy norway_no_oslo: keeps a role if any Norwegian location
  is outside the Oslo area. Equinor and Telenor move to it.
- New `nav` adapter for the NAV national register (arbeidsplassen.nav.no):
  keyword queries on a fixed request budget, paced; on HTTP 429 it stops and
  returns a PARTIAL run with a warning instead of failing. Full-ad text checks
  are cached in state/nav_detail_cache.json (ignored). Tested against
  fixtures only: the live API was rate-limiting during the build.
- Dedicated boards where NAV was measured thin (2026-10-22: Nordic 0, DNV 2,
  Equinor 2 vs ~10, NATO 0): Nordic Semiconductor (teamtailor custom domain),
  DNV (new `algolia_jobs` adapter; app id/key/index read from the page each
  run), Arm Trondheim (new `radancy` adapter), Microsoft Norway (pcsx).
  Verified live: 7 / 6 / 7 / 6 roles outside Oslo.
- NAV rows that duplicate a dedicated board's posting are dropped
  (employer alias + normalized title).

Language / citizenship check
- classify_language_requirement reads the requirement SENTENCE, not the
  posting language: "norsk og/eller engelsk" is English OK, "kommunisere
  godt ... på norsk og engelsk" is Norwegian required. Only an explicit
  Norwegian requirement or Norwegian-citizenship requirement filters a role;
  clearance is noted, never a gate. Runs on full ad text (NAV detail page,
  untruncated Teamtailor/PCSX descriptions). Telenor Lead Platform Engineer
  now reads NORWEGIAN REQUIRED (it read UNCLEAR on truncated text).
- Norwegian title keywords added (they all scored 0 and were never checked).

Employer reputation (user requirement 2026-10-22)
- state/employer_reputation.json (now tracked): dated Glassdoor lookups with
  sources and the approved thresholds (good >= 3.8 on >= 50 reviews; ok
  3.5-3.79 or thin-but-backed; avoid < 3.5; Vizrt excluded). Every report
  row shows the verdict; unlooked-up employers show UNCHECKED.

Report
- Sections per region: Switzerland, Norway, Europe-remote / Denmark (user
  preference); `--region=ch|no` runs one region only.

Fixes
- Microsoft links: apply.careers.microsoft.com<positionUrl>?jobId=<id>
  with a host alias so all 7 logged Microsoft decisions still resolve; the
  old jobs.careers.microsoft.com form redirected to a generic search page.
  PCSX calls retry on 429.

CLAUDE.md corrections log: design/architecture gap (2026-10-21) and the
Microsoft link fix; the EMEA-suffix location leak stays OPEN.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 09:19:05 +02:00
dennisthiessenandClaude Opus 5.5 dbf937043e fix(scout): BIS per-vacancy location and Confluent via the IBM careers API
BIS
- The RSS feed carries no location, so every vacancy was stamped with
  default_location "Basel, Switzerland". jr100491 (Hong Kong, BIS Asia office)
  therefore passed the CH filter and reached the 2026-10-14 triage.
- fetch_rss now resolves the location per item through _rss_item_location:
  the vacancy page's static "Geographical location" field
  (location_page_regex), then a "based in ..." sentence in the feed
  description, then default_location with a warning on stderr.
- Verified with --only=bis: 3 scraped, 2 eligible (both Basel); jr100491 now
  reads "8 Finance Street, Central, Hong Kong" and is excluded.

Confluent
- IBM closed the acquisition on 2026-03-17. The Ashby board dropped from 17
  jobs (2026-10-08) to {"jobs":[]} (2026-10-14), and careers.confluent.io is
  behind a Vercel bot checkpoint.
- New `ibm` adapter for the open IBM careers search API
  (www-api.ibm.com/search/api/v2; POST; size capped at 100, paged with
  `from`). Location is built from city, country and work mode, e.g.
  "United States - Remote".
- Confluent keeps its id, so seen-state and decisions still link. Verified
  with --only=confluent: 84 roles, none in CH/Europe-remote scope today, and no
  0-jobs warning.

CLAUDE.md corrections log: 2026-10-15 entry. Also notes that HashiCorp
(dropped 2026-06-06 for lacking a public API after the IBM acquisition) could
return through the same adapter.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 10:12:04 +02:00
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 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 0d999ab21b feat(scout): automate Kdo Cy via Prospective API; close SBB and Kdo Cy
Scout
- New `prospective` adapter for ohws.prospective.ch, wired up as `kdocy`
  (jobs.admin.ch, filtered to Kommando Cyber). jobs.admin.ch is an S3-hosted
  SPA that returns AccessDenied to any direct fetch, headless included, so the
  site cannot be scraped -- but the SPA reads a public, unauthenticated API.
  All 463 federal roles in ~2.4s, against RUAG's 35s Playwright scrape.
- This board is richer than any other source: Lohnklasse, application deadline,
  a named contact per posting, and the full Aufgaben/Anforderungen body, so
  scoring runs against the JD text rather than the title.
- Thread `deadline` through normalization, the markdown report and the JSON
  dump. A board with hard deadlines needs them on the row.
- Match `verwaltungseinheit_*` by prefix: the sub-unit key is department
  specific (VBS 1083398, EFD 1083364) and hardcoding one breaks reuse.
- MANUAL_CHECK entry for the Bundeswehr Reserve portal. The data is reachable
  (SAP E-Recruiting OData, SearchCategory 0022) but the portal actively blocks
  automation, and getting through needs UA spoofing plus masking
  navigator.webdriver. Not wired up by choice -- the operator-sanctioned
  Suchauftrag/job alert is the better channel. Reasoning is in the comment.

Applications
- SBB Data Engineer 103755: interviewed 2026-09-09, WITHDRAWN by the candidate
  2026-09-11. Net downgrade on four axes (41h vs 40h, 25+Brueckentage vs 28+5,
  3 vs 2 office days, and Anforderungsniveau K tops out ~145k against ~135k
  inside a band running to ~160k -- he would enter K at its ceiling merely to
  break even). The cohort's only interview, and it ended as his no, not theirs.
- Kdo Cy DevOps Engineer III: REJECTED 2026-09-10, 14 days, no interview.
  Form letter with no diagnostic content. Identical on every recorded
  dimension to SBB (core / 79 / gate pass / DQ 92 / weak channel) and the two
  went opposite ways -- recorded as worth watching, not as evidence for the
  channel thesis.
- Citadel row cleaned up: it claimed the cohort and decision-log entries were
  deliberately unwritten while its own status line read SUBMITTED. Both exist.
  The next-step cell still said "ask BEFORE building the package" two weeks
  after submission.

Decision log
- 69 RUAG rows -> 3 undecided. 63 title/family rule-outs, each noting that it
  is not a JD read, plus three that are: Test Manager C5I, System Engineer C5I,
  ICT Solution Architect. Guarded against the shared F/A-18 slug so one write
  could not silently swallow the other.

Note: the K->L/Kader rule is SBB-specific and was deliberately narrowed --
Anforderungsniveau is SBB's own system and does not map onto jobs.admin.ch
(Lohnklassen), RUAG or PostFinance. Thun-area employers sit outside the Bern
salary logic entirely.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qej5SBvhcbGXHwLqNWiskM
2026-09-11 17:30:46 +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 9a188cafef feat(sbb): interview invitation 2026-09-09, write interview brief
SBB Data Engineer (Job ID 103755): invited 2026-08-28 for Wednesday
9 September 2026, 08:30, 45 min on Teams.

Per the posting's own process this is stage 2 of 4 - "Virtuelles
Kennenlernen mit HR und Fuehrungskraft" - so HR together with Andri
Wienandts, not a pure HR screen. 45 minutes shared between two people,
which is the practical constraint the brief is built around.

Two facts worth recording:
- This is the FIRST conversion of the evidence-first cohort (6
  applications, 2 rejections), and it came from a COLD submit. The
  channel plan called for phoning Wienandts before applying; that never
  happened, so the published warm contact went unused.
- The resume never contained Snowflake, dbt or Power BI - the three
  literals an ATS keyword screen would have keyed on, and a risk the
  session had explicitly recorded as "accepted, not solvable". It did
  not filter him out, so a human read the dossier and the honest
  substitution framing survived first contact. One data point; not
  enough to revise strategy on, but it is evidence against assuming
  honest omissions are fatal at the screen.

Brief covers the four questions that must not go unasked (Anforderungs-
niveau K band, design/architecture scope vs current Staff + Component
Owner level, RAMSI's Java/Spring Boot/Angular share, Kidz Care rate),
the substitution answers for each named-but-non-canonical tool, the
swissTAMP/RIS/MUD context, and the thesis boundary - methods prototype,
no operational data, no accuracy figures, PSO surveyed only.

It also asks him to decide three things before the call rather than on
camera: what he does if K lands at 130-150k, if architecture is set
elsewhere, or if RAMSI turns out to be heavily Angular. Any one can be
a no, and the level question is the same shape as the declined BKW.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JMcHCsTKWvVzqyLChF5ckk
2026-08-28 16:41:55 +02:00
dennisthiessenandClaude Opus 5 a0f844c143 feat(ruag): submit AI Engineer C5I, and record the Kdo Cy package
RUAG C5I - AI Engineer C5I (Thun, app ID 18027): SUBMITTED 2026-08-27.
Evidence Fit 74/100, fit class Stretch, title-capability hard gate FAIL
(R1 build/operate the AI-LLM platform and R2 in-house LLM/retrieval are
Adjacent, not Direct) - all knowingly accepted under the user's explicit
Phase 0 override. Consumes the cohort's sole Stretch slot: cohort is now
6/10, Stretch 1/1.

Critique ran twice. Round 1 scored the documents 85/100 and raised three
Tier 1 items; Round 2, after the fixes, scores 93/100 with truth and
provenance 24/25 and zero Tier 1 findings. Evidence Fit did not move and
was not allowed to: PP-3 is a personal project and cannot convert an
Adjacent title-capability into a Direct one.

Documents (.tex is the deliverable; PDFs are gitignored):
- resume 2pp/13 bullets, letter 1pp/295 words, both validators PASS
- headline is now the canonical title "Staff Data, Analytics & AI
  Engineer", which puts the req's own word above the fold
- PP-3 added as a Projekte section - the only current Linux/hardening
  evidence, since BS-6 ended Dec 2022
- the letter names the AI-platform gap in one sentence, then connects
  SW-5 to C5I's stated DevSecOps model
- "governte" -> "governance-konforme"; JD term coverage 18/22 -> 22/22
  claimable, with all six gap terms still correctly absent

Two defects found and fixed that the first critique missed:
- the resume never loaded babel, so a German document was hyphenated
  with English patterns (Hal-bleiterfertigung, Tran-skription). Fixed
  with babel[ngerman] plus a Transkription exception; this also cleared
  an overfull box. Check this on every future German package -
  resume_template.tex likely has the same omission.
- IBM AI Engineering had no primary-source record. Certificate read
  directly (IBM via Coursera, 4 Jun 2020, verify 3ZBZFVAL6A34), recorded
  as entry #8; it also proves PyTorch, now evidence: certification.

Also included: the submitted Kdo Cy DevOps Engineer III package, the
Capgemini omit rule promoted into config.md, BW-1 canonicalized in
experience_bundeswehr.md, and a scout.py comment correcting the
telenorgroup slug from "near-empty" to a claimed board serving stale
phantom listings that DEMO_TITLES would not catch.

Compensation, PSP/project eligibility and role level were never resolved
before sending and are now live screening topics.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JMcHCsTKWvVzqyLChF5ckk
2026-08-27 23:20:17 +02:00
dennisthiessenandClaude Opus 5 93b0fc5b76 chore(akerbp): record rejection, cold channel and slot stays consumed
Rejected 2026-08-27, no interview, ~28 days after submission. Recorded
in all four places that track an outcome: cohort state, decision log,
the Active Sessions row and the session file's status block.

The cohort slot is not freed. A rejection consumes an attempt the same
way a submission does, so the Adjacent count stays 2/2 and the cohort
stays 4/10 - unlike the Google FDE III and AWS FDE no-gos, which were
declined before a package existed.

Recorded as rejected_no_interview on the evidence: nothing in the log
shows any contact after submission. Recruiter-vs-hiring-manager
disposition is a tracked cohort variable, so this is one edit away from
being corrected if a screen did happen.

The package was validator PASS with no Tier 1 truth findings and the
follow-up email to Per Olav Marthinsen was never actioned, making this a
pure cold submit. A cold-channel no-interview rejection does not
implicate document quality on its own. That is now 2 of 4 cohort
applications rejected without interview, both cold, which fits the
channel thesis already in the log - and application_strategy.md forbids
reacting to a single rejection, so no positioning or targeting changed.

The Norway lane is explicitly not closed. NATO JWC Stavanger is still
live and strong Norwegian employers remain in scope; both the row and
the decision note say so, because with Aker BP closed the earlier
Equinor note ("lane now reduced to the open Aker BP application") would
otherwise read as an implied closure.

Submission date left inconsistent on purpose: the contemporaneous
records say 2026-07-29, the retrospective ones 2026-07-30. Both now
carry a note pointing at the other rather than one being overwritten.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JMcHCsTKWvVzqyLChF5ckk
2026-08-27 14:45:09 +02:00
dennisthiessenandClaude Opus 5 420e205e37 fix(kb): settle ECTS B as the 10-35% band, 'top 35%' is correct
ECTS grade B is the next 25% after the top 10%, so the accurate phrasing
is 'top 35%'. The record's original value was right; the 'top 30%'
considered yesterday was the error, now removed rather than left as an
open question.

The field also now says never to narrow B to a point estimate. B is a
band, and quoting 'top 30%' or 'top 25%' overstates the standing - the
kind of small, checkable claim that costs credibility for no gain.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MHtzyTKBcg6BWhD5qFegtK
2026-08-26 09:56:34 +02:00
dennisthiessenandClaude Opus 5 124f5d4953 feat(kb): record degree final grades and US 4.0 conversions
A Citadel application form asked for GPA and neither degree's
Abschlussnote existed anywhere in claims.json - only the M.Eng. thesis
grade. The single lead was an old CV extraction whose own provenance
note disclaims it and which already carries a known error, so it was not
safe to convert from. User confirmed both directly: M.Eng. 1.6 and
B.Eng. 2.4 on the German 1.0-4.0 scale.

US 4.0 equivalents recorded via the modified Bavarian formula, which
simplifies to 5.0 - G: 3.4 and 2.6. Both fields carry usage rules,
because a converted grade is easy to misuse. They are for application
forms and credential checks only, never to be presented as a natively
awarded GPA, and the German scale must always be stated alongside -
particularly for the bachelor, where the conversion makes a solid "gut"
read weaker to a US audience than it is.

Also flagged a percentile that does not agree with itself. The relative
grade is ECTS B, but this record said top 35%, the user said top 30%,
and ECTS B is formally the next 25% after the top 10%. Rather than pick
one, the field now says to check the certificate and notes that quoting
"ECTS grade B" alone is always safe. A specific percentile on an
application is exactly the kind of small number that a credential check
can contradict.

New grade_output_rule: neither grade belongs on a resume or in a cover
letter by default. Industry resumes omit grades, and the thesis 1.0 is
the only figure worth surfacing where academic performance is valued.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MHtzyTKBcg6BWhD5qFegtK
2026-08-26 09:53:55 +02:00
dennisthiessenandClaude Opus 5 5cd5f49aa5 chore(citadel): record submission, and the form had no Zurich option
Submitted 2026-08-26. Cohort entry added (Adjacent 2/2, cohort now
4/10, channel weak x3) and decision logged.

The finding that matters is not the submission. The application form's
preferred-work-location selector offered no Zurich, despite the JD body
reading "in Miami, Zurich or New York", the posting header listing
Zurich, and the site's own Zurich location filter returning this exact
req when checked on 2026-08-25. The careers site footer reads Citadel
Enterprise Americas LLC, so the likeliest explanation is a US-entity
apply flow with European seats routed elsewhere, or a Zurich seat that
is closed while the multi-location posting stands.

This partly supersedes the working-model risk that blocked Phase 2. If
no Zurich seat is reachable through that form, whether Zurich runs
hybrid or five-day onsite is moot, and the application may be sitting
against a US requisition - a hard no under the standing no-relocation
constraint.

Carry-forward rule recorded in both CLAUDE.md and the session file:
check the application form's location selector before investing in a
package. Two independent signals - the posting's stated locations and
the employer's own location filter - both proved unreliable as evidence
that a seat is actually reachable. Phase 0 treated the filter result as
confirmation that the req was live in Zurich; that inference was weaker
than it looked.

Package itself is finished and reusable: both documents cleared the
validator with zero warnings and the Tier 1 fixes lifted JD term
coverage from 51% to 68%. Nothing about the documents is the weak point.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MHtzyTKBcg6BWhD5qFegtK
2026-08-26 09:49:08 +02:00
dennisthiessenandClaude Opus 5 0c34bd0347 chore(citadel): finalize package, hold submission records
Finalization per shared_ops.md. Both submitted documents re-validated:
resume and cover letter each PASS with zero warnings. Final PDFs copied
to Dennis_Thiessen_Resume.pdf and Dennis_Thiessen_Cover_Letter.pdf.

Steps 5 and 6 - submission date and cohort entry - are deliberately not
done. The user directed "apply as is" but has not confirmed the
application was actually sent, and stamping today's date on a submission
that may happen tomorrow corrupts the log that every cohort and
disposition-timing judgement is read from. Both commands are written out
in the session file, ready to run on confirmation. This is the same
discipline applied to the SBB Wienandts call: record what happened, not
what was intended.

The critique stays STALE by choice rather than being re-run: it scored
the pre-Tier-1 resume and predates the cover letter. The estimated ~91
post-edit Document Quality is flagged in both the session file and here
as an estimate that must never be quoted as a score.

The working-model question is unresolved and now travels with the
application rather than blocking it, which is the user's call and a
reasonable one now that the package exists: clarifying first only pays
off in the branch where a cold application gets a call. It must be asked
at first recruiter contact. If Zurich is 5-day onsite this is a decline
on the Bern constraint no matter how the process goes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MHtzyTKBcg6BWhD5qFegtK
2026-08-26 09:34:28 +02:00
dennisthiessenandClaude Opus 5 0eda29327a fix(citadel): working model unresolved - block Phase 2, 74 -> 71
The user asked whether Citadel has a hybrid model. The JD is silent:
grepping the verbatim posting for hybrid, remote, onsite, in-office and
days per week returns zero matches. Phase 0 scored practical constraints
5/5 on an unexamined assumption that Zurich was workable. Withdrawn.

Ken Griffin is on record that Citadel returned to the office five days a
week, early and deliberately, and calls it his most important leadership
decision of the past seven years - framed as core apprenticeship culture
rather than a policy setting. The only contrary evidence is an anonymous
2022 Fishbowl post about Operations claiming three days minimum: four
years stale, wrong division, contradicted by the founder on record. No
official Citadel Securities Zurich policy statement could be found.

If five-day onsite holds for Zurich, it means roughly 2 to 2.5 hours of
commuting per day from Bern, or relocating - which breaks both the
Bern-based, 2-3 day hybrid bar in user_comp_bar and the "keep a Swiss
home base" constraint in user_international_mobility.

Practical constraints 5/5 -> 2/5 (language and authorization stay clean:
English working language, EU citizen, Swiss B permit). Evidence Fit
74 -> 71, still Adjacent but mid-band rather than a point below Core.

More consequential than the number: critique_framework.md treats an
unresolved location or relocation constraint as a NO-GO trigger, so the
qualifications gate passes while the practical gate does not. Phase 2 is
blocked pending an answer.

This has to be asked, not researched - the same class of question as the
SBB Anforderungsniveau K band. Recording the sequencing explicitly,
because SBB was submitted with its equivalent question still open and
that question is now a live screening topic instead of a settled fact.
Repeating it here should be a deliberate choice, not an oversight.

The Phase 1 bullet plan is written and unaffected: 11 recommended, 14
with options, budget PASS. Two items still open - the Vizrt VZ-1
C++/distributed bullet the user previously skipped on Snowflake, and
adding a Projects section for PP-1.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MHtzyTKBcg6BWhD5qFegtK
2026-08-26 08:30:22 +02:00
dennisthiessenandClaude Opus 5 ec5be5f2ed feat(citadel): Phase 0 for Citadel Securities Platform Engineer, Zurich
Evidence Fit 74/100, Adjacent at the top of the band, hard gate PASS
with one flagged risk. Phase 1 not started - user asked for Phase 0 only.

The stack alignment is the best in the log: zero Gaps across all seven
minimum qualifications, and all five preferred technologies (Kafka,
Kubernetes, Spark, Airflow, distributed databases) are Direct and
production-current.

What holds it at 74 is that the title-defining function splits. R2 -
ingestion, transformation, storage and lifecycle management of large
datasets - is Direct and describes SW-1/SW-7 almost word for word. R1 -
design and build the distributed research platform itself - is Adjacent,
the same authoring-vs-building shape as Aker BP, and it cannot be
written around: Scope Discipline forbids pairing a full-ownership verb
with an org-scale object, so it can only be honestly bridged.

Recorded the classification conflict rather than hiding it.
application_strategy.md says a defining responsibility that is only
Adjacent makes the role Stretch; that strict reading applies to R1. It
is filed as Adjacent because R2 is equally title-defining and is Direct,
and because Aker BP set that precedent at 79. Both cohort slots are free
either way, so the label changes nothing operationally.

Corrections the user was right about, now recorded so a later run does
not repeat them: Go is NOT a gap, because Q3 is disjunctive and Python
satisfies it outright; and a production Kafka/K8s/Spark/Airflow estate
IS a distributed system, so Q4 is Direct rather than a stretch.

Two traps written down explicitly. The $175,000-350,000 base range is a
US pay-transparency disclosure under NY law and says nothing about the
Zurich figure - it must be asked, not assumed. And the sibling reqs that
web search surfaces as closer title matches (Research Platform - Data
Platform Engineer, Research Platform Infrastructure Engineer) are dead:
404 and Cloudflare-blocked, absent from the live board. Those Built In
listings are stale.

JD saved verbatim via Playwright; WebFetch returns 403 on this host.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MHtzyTKBcg6BWhD5qFegtK
2026-08-25 23:24:02 +02:00
dennisthiessenandClaude Opus 5 b97dec978a feat(kb): add trading-domain evidence as PP-1 and PP-2
claims.json had zero hits for trading, finance or quant, so a real
capability could not legally reach any document: the file is the
highest-authority source and nothing outside it is claimable. Surfaced
while assessing the Citadel Securities Platform Engineer req (Zurich),
where domain fluency is exactly what was missing.

PP-1 is the self-built investing/signal platform: US-equity price,
fundamental and LLM-assisted sentiment ingestion, a long-only
cross-sectional residual 12-1 momentum book with ATR stop/trail and max
15 concurrent names, scheduled scan and backtest pipelines, web
dashboard and Telegram alerts. PP-2 is the Udacity AI for Trading
nanodegree. Two allowed-with-context skills reference both.

Written defensively, because this is the kind of entry a later run
inflates. Each carries an explicit forbidden list: no PnL, Sharpe,
return or backtest figure may EVER be quoted (none is verified); PP-1 is
single-user and self-hosted, so never distributed, scalable, production
or multi-user; neither implies professional quantitative, trading or
finance experience; the nanodegree is never an academic or quant
credential. Legitimate use is self-directed domain fluency plus an
end-to-end ingestion/backtest/alerting build outside work.

PP-1 is also the one claim where full-ownership verbs are correct - it
is genuinely solo, unlike the employer work that Scope Discipline
governs. Stated in the scope so the two rules do not collide later.

JSON valid, validator PASS, 9/9 tests pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MHtzyTKBcg6BWhD5qFegtK
2026-08-25 23:18:18 +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
dennisthiessenandClaude Opus 5 e53abd4ff6 chore(log): submit SBB, close Snowflake, correct Norway lane framing
Application log updates from the 2026-08-24 scout run and the days after.

SBB Data Engineer (Asset Management, Bern, job 103755): SUBMITTED
2026-08-25. Consumes Core slot 2/7 in evidence-first-2026-01. Submitted
with the Anforderungsniveau K comp question still unresolved, against
the channel plan and the critique's closing advice, so the K band, the
design-vs-build-and-run scope question and the Kidz Care rate are now
screening-call topics rather than pre-cleared facts. Next action changed
from "call then submit" to "prep an interview brief". The stale pointer
to an /edit-resume Tier 1 fix is removed - that fix landed 2026-08-21.

Snowflake Sr SWE Enterprise (Observe): CLOSED - NO RESPONSE at 80 days
silent, past the longest real disposition in the log (Equinor, 79).
Recorded as closed_no_response, deliberately NOT as a rejection: none
was ever received, so it must not enter rejection statistics or read as
a document-quality signal. Pre-dates the cohort, so no slot is freed.
An ~86/100 package - the highest in the log - drawing no reply at all is
the strongest evidence yet that the constraint is channel, not documents.
Unblocks the Observe Metrics Platform req, which was paused only to
avoid stacking a second cold application on the same org.

Norway lane: corrected a false "closed" framing that had propagated into
the Equinor row and was used to dismiss Norwegian rows in the scout
readout. The lane is OPEN but selective. The gates are norsk working
language and NO security clearance - NOT compensation: the 180k bar is
CH-only and explicitly does not apply to Norway. Equinor, Telenor and
NATO JWC stay in the scout.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MHtzyTKBcg6BWhD5qFegtK
2026-08-25 09:07:07 +02:00
dennisthiessenandClaude Opus 5 73336cc4f9 feat(sbb): critique the package and apply its Tier 1 fix
Critique per critique_framework.md: hard gate PASS, Evidence Fit 79/100
(Core, unchanged — a document cannot move candidate-role fit), Document
Quality 90/100, Channel Weak but uniquely upgradeable. Claim audit clean
across all 13 bullets; no Tier 1 truth findings.

The skill's own spec asks for a single 8-dimension score including a
Publications weight, which contradicts critique_framework.md and CLAUDE.md
("never collapse them into one optimistic score"). Followed CLAUDE.md and
recorded the conflict — the skill definition looks stale relative to the
July rewrite.

Tier 1 finding and fix: the JD names Abfrageleistungsoptimierung in a
required line and the document had zero occurrences of "query", despite
canonical support sitting in BS-2's 3L variant. BS-2 now reads "tuning
query performance for analysis teams working with…" and the Pipelines
skills line gains "query performance tuning". Also surfaced "agile" in
SW-3, whose canonical 2L variant records "in an agile DevOps team" and
whose absence left the JD's second required line unaddressed.

Deliberately NOT applied: the API term. claims.json SW-7 records only
"onboard source systems" and SW-2's ingestion is Oracle to Kafka, so
adding it would be vocabulary substitution rather than evidence. Left
open pending user confirmation.

Re-verified after the edit: validator PASS, forbidden-token scan PASS,
compile PASS at 2 pages, both pages re-rendered and inspected. Longest
bullet 34 words, still under the flag threshold. Document Quality 90 to
92 on relevance/terminology.

Still not submitted — held pending the Anforderungsniveau K comp answer.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WpMtWFtYkGkjSMShuTgXiB
2026-08-21 17:09:27 +02:00
dennisthiessenandClaude Opus 5 a64661e42a feat(sbb): 2-page English resume for SBB Data Engineer, Bern
13 bullets, 6 skills lines, International Tech profile in English with an
explicit Languages line naming German as mother tongue (user instruction).
Framing leads on operate-and-own — Component Ownership with on-call and
governance answers the JD's "Betrieb" and "Verantwortung für Qualität und
Nachhaltigkeit" — and carries the Bosch industrial sensor-data thread
(defect records, wafer inspection images, PCM parameters) against the
role's vorausschauende-Wartung purpose. GenAI/LLM material dropped.

Two deviations from the approved 11-bullet plan, both deliberate:
Fraunhofer keeps one combined bullet rather than zero, because dropping the
role opens an unexplained 21-month gap between Vizrt and Bosch; and BS-1 is
added as a fifth Bosch bullet, HIGH priority in the bundle and directly
relevant to an employer running a 24/7 network.

Kept the guarded page break after testing the natural flow: without it page 1
fills, but two Bosch bullets land on page 2 with no visible employer header.
Hierarchy beats page-fill, and page-fill quotas were removed on 2026-07-27.

Gates: canonical validator PASS (0 warnings), forbidden-token scan PASS (none
of the seven non-canonical JD tools present), scope-discipline scan PASS,
compile PASS at exactly 2 pages, both pages visually inspected. SW-1 and SW-7
bullets also read by eye against their claims.json forbidden lists.

Not submitted — held pending the Anforderungsniveau K comp answer.

Also fixes a KB defect found during generation: bundle_data_engineer.md §S5's
cover-letter hook read "leading the migration of our legacy stack", a
full-ownership verb on a company-scale object that contradicts claims.json
SW-1 and its own narrative thread. Rewritten, warned inline, and recorded in
the CLAUDE.md corrections log. The other four bundles are unchecked.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WpMtWFtYkGkjSMShuTgXiB
2026-08-21 16:56:48 +02:00
dennisthiessenandClaude Opus 5 787a1d937e feat(sbb): Phase 0 for SBB Data Engineer, Asset Management, Bern
Job ID 103755, posted 2026-08-20, surfaced by the 2026-08-21 scout run.
Evidence Fit 79/100 (Core, lower end), hard gate PASS. The title-defining
capability — build and operate cloud data pipelines and governed data
products — is Direct and current, unlike the AWS FDE NO-GO.

Best practical fit in the log: Bern-based, German-language, no relocation,
EU citizen plus B permit. Real strength cluster for the role's vorausschauende
Wartung purpose: Bosch fab sensor/process data, ELK/Kafka anomaly detection,
containerized ML inference, plus the condition-monitoring thesis.

Two open risks, both level and comp rather than fit: Anforderungsniveau K is
a capped GAV band whose figures are not public and must be asked, and the seat
reads lateral or below current Staff plus Component Owner scope — the same
shape declined at BKW. Level and ownership scored 9/15 for that reason.

Seven named tools are non-canonical (Snowflake, dbt, Argo Workflows, Helm,
Power BI, Spring Boot, Angular); survivable only because the JD prefixes the
stack list with "z. B.". Recorded as an accepted ATS risk, with a Phase 2
gate to keep all seven out of the generated document.

Cover letter: NO — SBB explicitly waives it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WpMtWFtYkGkjSMShuTgXiB
2026-08-21 16:33:39 +02:00
dennisthiessenandClaude Opus 5 cbb713ba7d chore(aws-fde): NO-GO at Phase 0 gate — 69/100 below the fit bar
User declined at the gate: 69 is not a strong enough fit to spend a package on.
Consistent with revealed behaviour — every application actually submitted scored
77.5-89; nothing below 75 has ever been sent.

No cohort slot consumed (Adjacent stays 1/2). No bullets written, no resume, no
cover letter. Phase 0 analysis retained in the session file in case a
better-fitting AWS req appears.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 13:02:54 +02:00
dennisthiessenandClaude Opus 5 cc109524f8 feat(aws-fde): Phase 0 for AWS Senior Forward Deployed Engineer, Zurich
Verbatim JD (amazon.jobs 10504263, posted 2026-08-17) retrieved via Playwright
and stored with the session.

Evidence Fit 69/100, Adjacent. All four Basic Qualifications are Direct, so the
minimum-qualification gate passes. Disclosed rather than buried: forward
deployment is the title-defining capability and is a Gap - SW-4, VZ-1 and
global_forbidden_output_patterns all forbid "customer-embedded delivery", and
application_strategy lists strategic-account FDE as a Stretch target. Scored
Adjacent because AWS's published minimum bar is pure software engineering and
the org is seven weeks old, hiring builders at volume.

Assets: AWS is the evidenced cloud (claims.json forbids GCP output), and Kiro -
named in the JD - is in the verified GenAI toolchain.

CL decision YES. Would consume the last Adjacent cohort slot.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 12:58:39 +02:00
dennisthiessenandClaude Opus 5 e09437dc27 chore(pipeline): close SDU + Google FDE III, triage 5 JDs, drop Louis Dreyfus
Pipeline:
- SDU PhD: closed, not proceeding. Prof. Jørgensen never replied to the
  2026-08-02 enquiry; user dismissed it two days before the 2026-08-20 deadline.
- Google FDE III GTM: closed, not proceeding after two Google rejections. The
  bar for a third attempt is now a very strong fit; this was Adjacent with an
  agent-orchestration gap. Frees the Adjacent cohort slot (back to 1/2).

JD triage — 5 pulled and read, 1 survives:
- SHORTLIST AWS Senior FDE Zurich: all four basic quals pass and AI/agentic is
  preferred-only, unlike the Google Senior Staff FDE where vector DB + RAG were
  minimum quals. AWS is the evidenced cloud; JD names Kiro, which he uses.
- SKIP AWS ProServe Bern (clinical pharma domain gate), AWS Principal Delivery
  Consultant (8+ yrs architecture leadership + VP+ exec comms), GitLab FDE EMEA
  (Ruby/Go hard gate), MS 200044133 (title says FDE Data Scientist, quals are
  BGP/MPLS/SD-WAN network engineering — mislabelled req).

Roster:
- Dropped Louis Dreyfus: 300 roles, all Brazil/India/Bulgaria ops, zero Swiss.
- Kept MET Group: its "0 eligible" was a filter artifact; exclusion mode reveals
  real Baar/Zug commodity-trading roles.
- Kept Equinor/Telenor/NATO. Memory corrected: the Norway lane is selective, not
  closed — the user still wants very good Norwegian roles.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 12:16:45 +02:00
dennisthiessenandClaude Opus 5 94913a004a chore(pipeline): record Equinor and Microsoft ISE rejections, add Google FDE III Phase 0
Equinor Manager / AI Architect (JR106747): REJECTED 2026-08-14, no interview.
79 days from submission (2026-05-27) to disposition, the longest turnaround
recorded. Pre-dates the evidence-first-2026-01 cohort (started 2026-07-27),
so it does not free an Adjacent cohort slot. Norway lane now reduced to the
open Aker BP application.

Microsoft Senior SWE, ISE Zurich (200040836): REJECTED 2026-08-11, no
interview, ~39 days. The separate Principal FDE req 200043897 is a different
pipeline and remains open.

Also carries forward uncommitted work from the 08-07 / 08-11 sessions:
- Google FDE III, Cloud GTM (78350205438567110) Phase 0 session file and
  scraped JD; Adjacent, Evidence Fit 67/100, hard gate PASS.
- Scout skip decisions: BIS jr100411 (platform admin, not data eng), two
  Google reqs gated on a C++ minimum qualification, and the FDE III
  Generative AI sibling req confirmed taken down.
- settings.local.json: allow the job_scout venv python invocation.

Every closed application to date has been Channel Weak with no interview.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-15 22:32:33 +02:00
dennisthiessenandClaude Opus 5 239129b37e feat(sdu): add SDU PhD enquiry, verify thesis claims from source
Explore SDU Center for Energy Informatics PhD, Theme 2 (Predictive
Maintenance and Asset Management of Smart Energy Networks), Odense DK,
deadline 2026-08-20. JD scraped live via Playwright.

Verified the master's thesis against the source PDF rather than the
stored title alone:
- Vibration-based condition monitoring of CNC machine tools; features
  are the dimensionless waveform, peak, pulse, margin and kurtosis
  indices.
- Implemented a hybrid of rule-based reasoning and a 7-10-3 ANN.
- Evaluation measured throughput and latency, not model accuracy:
  ~500 SPS pipeline against 72.9 kSPS sensors.
- Corrects an earlier note in the same session: PSO was surveyed only
  and never implemented. Recorded under thesis_limits alongside the
  absence of real operational data and accuracy figures.

Also records the ECTS relative grade (B, top 35%), the existence of
English-language transcripts, and the concrete Bosch sensor-data types
(defect management records, wafer inspection images, PCM electrical
parameters) under BS-2.

Adds the enquiry email sent to Prof. Bo Norregaard Jorgensen, which
asks whether an industry candidate is viable and whether non-academic
letters of recommendation are accepted.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-02 23:09:30 +02:00
dennisthiessenandClaude Opus 5 f1095a062f feat(applications): archive Aker BP package, add Compass evidence, extend scout
Aker BP ASA — Data Product Architect (FINN 469067315): archive the finalized
resume/CL sources, JD, session and critique. Submitted 2026-07-30 ahead of the
2026-08-02 deadline; logged as applied in the scout decision log and marked
SUBMITTED in Active Sessions.

KB: record Atlassian Compass as Swisscom's metadata/catalogue platform for data
products and lineage (user-confirmed 2026-07-29). Practitioner use only —
claims.json forbids claiming administration, rollout or ownership, and it is
explicitly not a substitute claim for Purview, Collibra or Alation.

Also: close out the Google Business Home session (no interview), extend the job
scout, and allow the job-board domains used during the Aker BP research.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-01 10:18:07 +02:00
dennisthiessen fe5f24704f feat: rebuild evidence-first application workflow 2026-07-27 17:56:15 +02:00
dennisthiessenandClaude Sonnet 5 d0525cc437 chore(applications): archive BIS + NATO submitted packages, ignore tmp/
Add BIS Basel and NATO JWC Stavanger application output (resume/CV, cover letter,
session file, critique) plus the Bundeswehr experience file backing the NATO
package; update session status tables in AGENTS.md/CLAUDE.md; record two new
Bash allowlist entries for the job scout venv. tmp/ is scratch working files,
now gitignored.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-18 21:03:45 +02:00
dennisthiessenandClaude Fable 5 2ee509bb34 feat(applications): submit Microsoft ISE Senior SWE Zürich (2026-07-03)
Microsoft — Senior Software Engineer, Industry Solutions Engineering
(ISE), Zürich, req 200040836. Applied 2026-07-03, ~7 days after posting.

- Package: 2pp resume (18 bullets) + 1pp CL (299 words), critiqued to
  85.8/100 (Pass 2). Same-day cycle: verbatim Eightfold JD fetch ->
  build -> critique 83.3 -> Tier 1+2 fixes -> 85.8 -> submit.
- Fixes applied: "model evaluation" completes the JD's RQ triple
  verbatim; open-source stack labeled in skills; summary gains LLM +
  cross-functional, on-call bound to Component Owner (precision).
- CL hooks all web-verified: ISE Engineering Fundamentals Playbook,
  SharePoint-permissions-to-RAG blog, USD 400M Swiss datacenter.
- Logs 'applied' in job_scout decisions.json, flips the CLAUDE.md
  Active Sessions row to SENT, archives the JD under JDs/.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 13:58:28 +02:00
dennisthiessenandClaude Fable 5 ad5422acb0 chore(applications): Kraken SRE rejected; Google DE advanced to Hiring Assessment
2026-06-17 status updates:
- Kraken (Payward) SRE, AI Agents -> CLOSED, REJECTED (no interview).
  Honest infra/SRE gaps (Terraform, SRE title, agent frameworks) the
  likely filter. decisions.json -> rejected.
- Google Senior Data Engineer -> ADVANCED. Resume cleared recruiter
  screen; invited to ~30-min Google Hiring Assessment (work-styles/SJT).
  Open item at recruiter stage: clarify L4/L5 + comp clears 180k+.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-17 13:53:09 +02:00
dennisthiessenandClaude Fable 5 cad2c230eb feat(applications): submit Google Sr Data Engineer + Kraken SRE AI Agents (2026-06-15)
Two applications sent and finalized on 2026-06-15:

- Google - Senior Data Engineer (Merchant Data Science, Zurich), 85.5/100.
  Tier-1 scope fix + both Tier-2 polish applied: re-scoped the Swisscom
  migration claim in resume B2 + CL P2 (Scope-Discipline), added project-
  delivery vocab (B4), and JD-exact 'distributed data processing' (B5).
- Kraken (Payward) - SRE, AI Agents (remote, CH-eligible), 87.2/100.
  Finalized as-is; crypto-native + production-ML edge, honest infra gaps.

Logs both as 'applied' in job_scout/state/decisions.json and flips their
CLAUDE.md Active Sessions rows to SENT. Open item for both: confirm level
and comp clear the 180k+ all-in bar at the recruiter stage.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-15 19:57:18 +02:00
dennisthiessenandClaude Opus 4.8 dd2f0308c5 feat(resume): Snowflake Sr SWE Enterprise (Observe) package (sent, ~86/100)
Observability-spine framing: Bosch telemetry/observability PoC promoted to
lead, Swisscom Iceberg lakehouse + on-call/RCA. Real Ashby JD (verbatim).
Tier 1+2 critique fixes applied; Vizrt low-latency skipped per user.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-06 20:44:30 +02:00
dennisthiessenandClaude Opus 4.8 09316a73cf feat(resume): QuantCo Cloud Engineer package (sent, ~82/100)
- Full resume + cover letter + critique for QuantCo Cloud Engineer (Zürich)
- Applied Tier 1+2 critique fixes: corrected education dates, hedged Data
  Mesh ownership, sharpened tagline/summary, added SRE token
- Mark QuantCo Cloud Engineer + Equinor as sent in trackers
- decisions.json: QuantCo Cloud Engineer -> applied

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 21:40:40 +02:00
dennisthiessenandClaude Opus 4.7 e61c4bac6d feat(equinor): tailored AI Architect resume + cover letter package
Pass 2 critique 80.0/100 (honest-stretch reach app, converged near ceiling).
Includes accuracy fix: Swisscom Data Mesh reframed from sole-build to
company-wide migration contributed to (hedged verbs); orchestration +
reference-architecture surfaced; removed -ing bullet trailers; CL trimmed
to 300 words with matching ownership hedge.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-27 20:58:58 +02:00
dennisthiessenandClaude Opus 4.7 3b07c4b900 feat(job_scout): expand to 19 companies + new adapters, filters, dedup
- New SmartRecruiters adapter (EU energy/commodity firms)
- Add data-infra US tech (Confluent/GitLab/ClickHouse/Grafana) and
  commodity/energy traders (MET Group/Vitol/Louis Dreyfus)
- Headless stealth (navigator.webdriver mask + chrome fingerprint) — unblocks
  Google; also enabled Meta and Cisco scraping
- Tight title prefilter + title-only scoring + cross-region dedup so
  high-volume all-remote boards don't flood the report
- Remove Canonical (below-market pay, poor culture) and IBM Research
  (research-scale pay below bar; weak data-eng fit) per reputation review

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-22 12:38:35 +02:00
dennisthiessen 1fde4c6b34 first commit 2026-05-21 11:07:51 +02: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