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
This commit is contained in:
dennisthiessenandClaude Opus 5 committed 2026-09-05 13:24:44 +02:00
1 parent 89af779bf3
commit a0ec2fedb5
18 files changed
+1250 -37

No files matched your search

+10 -2
View File
@@ -40,7 +40,15 @@
- "AWS IaC (CloudFormation)" — infrastructure-as-code signal
- "AWS migration" — hands-on cloud platform experience
- Security Champion is not a default positioning theme; use the 2025/2026 team role only when the JD explicitly requires security exposure
- "ELK + Grafana + Prometheus observability stack"
- "ELK + Grafana + Prometheus monitoring" — **never** "delivered/built the observability stack" or
"full monitoring suite": `claims.json` BS-4 is a **proof of concept** and forbids "built the
observability platform" / "enterprise observability platform". Carry the PoC scope into any wording.
> **Scope warning (corrected 2026-09-04).** The S3 row for BS-4 previously read "*Designed and
> delivered observability stack … full monitoring suite for manufacturing infrastructure*" and was
> labelled "Full observability stack implementation" — a delivered-capability claim over a PoC, and the
> same defect the 2026-08-21 log entry found in `bundle_data_engineer.md` §S5. That entry said to check
> the other four bundles; this is the one that had it. See CLAUDE.md → Scope Discipline.
**Tone:** Infrastructure-minded engineer who thinks about reliability, observability, and security — not just data throughput. Platform thinking embedded in data work.
@@ -59,7 +67,7 @@
| SW-1 | AWS migration | "Migrated pipelines in his owned domains from legacy Teradata/Oracle processing onto Swisscom's AWS platform (Glue, Athena/Iceberg, Redshift, Airflow, CloudFormation)" | Scoped migration delivery plus AWS breadth |
| SW-2 | Component Owner | "Owned Fulfillment ETL pipelines (Oracle/Kafka → Teradata) — platform reliability, Data Governance compliance, 2nd/3rd-level support and on-call duty" | Platform SLA + on-call = reliability engineer signal |
| BS-1 | ML inference | "Containerized and orchestrated ML inference (Docker, K8s, Ansible) into 24/7 semiconductor production — zero-downtime constrained deployment" | Production-grade containerization under hardest constraints |
| BS-4 | ELK PoC | "Designed and delivered observability stack: ELK + Kafka, Grafana dashboards, Prometheus metrics, Loki log aggregation — full monitoring suite for manufacturing infrastructure" | Full observability stack implementation |
| BS-4 | ELK PoC | "Built an anomaly-detection **proof of concept** on ELK + Kafka (Docker) with Grafana, Prometheus and Loki monitoring, validating centralized logging and alerting for 24/7 semiconductor production" | PoC-scoped observability breadth — **the PoC framing is mandatory, not optional** |
| SW-5 | Security Champion | "2025/2026 team Security Champion; include only if the JD explicitly requires security or DevSecOps exposure" | Secondary team-role evidence, not ownership or certification |
| BS-2 | Data services | "Built multi-language data services (Python/Java/C#) over OracleDB and Hadoop/ImpalaSQL — platform-layer data access for semiconductor analysis teams" | Enterprise DB + Hadoop infrastructure |
| BS-3 | App Owner | "Application Owner for semiconductor analytics platform — SLOs, reliability, vendor management, on-call coverage" | Platform SLA ownership |
+6
View File
@@ -563,6 +563,12 @@
"output": "allowed",
"note": "User-confirmed 2026-08-27 and previously ABSENT from claims.json entirely. Professional: at Bosch (2020-2022) Linux servers carried everything - ML platform, Docker hosts, backend services, Ansible control - and he administered and automated them (see BS-6). Personal and current: a self-hosted Debian server he has run and hardened for ~10 years (see PP-3). Hardening and security configuration evidence leans on the personal side; say so rather than implying an employer mandate. Does NOT license claiming datacenter/physical infrastructure work, which remains a genuine gap."
},
{
"name": "Bash / shell scripting",
"evidence": "production-historical-and-personal-current",
"output": "allowed",
"note": "User-confirmed 2026-09-05 and previously ABSENT from claims.json entirely - the third gap of this shape after Ansible and Linux administration (both 2026-08-27). Evidence basis is the same as Linux administration: professional at Bosch 2020-2022 administering and automating the Linux server estate and the Ansible control path (BS-6), and personal and current on the self-hosted Debian server run for ~10 years (PP-3). Scope is ordinary operational shell work - scripting, automation glue and system administration. Does NOT license Groovy, which stays unverified and forbidden, and does NOT license any claim of systems-programming or kernel-level work."
},
{
"name": "Docker",
"evidence": "production-current-and-historical",
+4 -3
View File
@@ -24,11 +24,12 @@ def save(data: dict) -> None:
def summary(data: dict) -> None:
applications = data["applications"]
print(f"Cohort: {data['cohort_id']} ({len(applications)}/10 applications)")
# Slot caps were dropped 2026-09-05 (application_strategy.md). This is a record, not a
# budget: report counts, never counts-against-a-target, so nothing reads as a remaining slot.
print(f"Application record: {data['cohort_id']} ({len(applications)} applications)")
for fit_class in FIT_CLASSES:
count = sum(item["fit_class"] == fit_class for item in applications)
target = data["target_mix"][fit_class]
print(f" {fit_class}: {count}/{target}")
print(f" {fit_class}: {count}")
for channel in CHANNELS:
count = sum(item["channel"] == channel for item in applications)
print(f" channel {channel}: {count}")
@@ -27,19 +27,56 @@ Before generating a resume, complete Evidence Fit from `critique_framework.md`.
Do not spend a full resume/cover-letter cycle on a no-go role. Record the decision and move on.
## Controlled Ten-Application Cohort
## Application Record (no quotas)
The next diagnostic cohort uses:
**Policy change, 2026-09-05, user decision: the 7 Core / 2 Adjacent / 1 Stretch caps are DROPPED.**
- 7 Core applications.
- 2 Adjacent applications.
- 1 Stretch application maximum.
The caps were arbitrary -- no derivation existed for those numbers -- and they were routed around
whenever they bound (RUAG AI Engineer went in at Evidence Fit 74 with a hard-gate FAIL; Citadel was
recorded Adjacent when the strict reading said Stretch). A rule that is overridden whenever it binds
governs nothing and only adds friction.
Track fit class, hard gates, channel, application date, stage and outcome. Evaluate the cohort only after ten applications or a meaningful screen/interview result; do not infer profile quality from a few high-variance FAANG outcomes.
The cohort was also a confounded experiment. It was designed to test **fit class**, but the variable
it silently held constant was **channel**: all six applications were Weak/cold. It therefore could not
distinguish "Stretch does not convert" from "cold does not convert", and the results point away from
fit class anyway -- the highest-scoring package in the log (Snowflake, ~86) drew no reply in 80 days,
while the one interview (SBB) came from a cold Core submit whose resume was *missing* the three ATS
literals the session had flagged as risky.
**What is kept: the recording, not the rationing.** Every application still records fit class, hard
gate, channel, date, stage and outcome. That record is what makes patterns visible instead of
re-derived, and it produced every useful finding to date. `application_cohort.json` continues as a
durable log; `cohort_tracker.py summary` remains a read-only view. There is no slot to consume and no
application is blocked for lack of one.
**Fit class is now a preparation signal, not a spend limit.** An Evidence Fit of 64 does not mean
"do not apply" -- it means know which two questions you will be asked and have honest answers ready.
Hard gates and NO-GO triggers are unchanged: a required Gap or an unresolved practical constraint is
still a real finding that must be surfaced before the user decides.
### Real constraints that survive independently of any quota
These are not cohort discipline and must not be dropped with it:
- **Google: 3 applications per rolling 30 days**, and a 90-day wait before reapplying to the *same*
role. An external, enforced limit.
- **Do not stack a second cold application on one organisation while the first is pending** -- a
judgment call, made deliberately before (Snowflake Metrics was paused for exactly this).
- **Each package costs real hours.** Volume is limited by effort, not by policy.
## Channel Strategy
For every Core application, attempt at least one warm action before or immediately after applying:
**Channel is the rationed variable, replacing the old slot budget** (2026-09-05). It is the constraint
with a plausible effect and an untested one: the record stands at **six consecutive cold submits, one
interview**, with zero Strong or Moderate channels ever attempted.
**Rule: no application goes out cold when a named contact is published and reachable.**
This has been available and unused repeatedly -- Marco Heinzen at RUAG (published direct line), Andri
Wienandts at SBB (published number, and it still converted), Per Olav Marthinsen at Aker BP. Making
contact costs one phone call or one short email and is the cheapest experiment left.
For every application, attempt at least one warm action before or immediately after applying:
- credible internal referral;
- targeted note to a relevant recruiter;
@@ -47,6 +84,7 @@ For every Core application, attempt at least one warm action before or immediate
- former colleague/customer/vendor connection who can establish work quality.
Record the channel as Strong, Moderate or Weak. Tailoring alone does not upgrade a cold channel.
When no contact is published anywhere, a cold submit is fine -- record it as Weak and move on.
## Resume Strategy
@@ -63,10 +101,10 @@ Apply the decision gate in `cl_reference.md`. A letter is not a default package
## Feedback Loop
After the ten-application cohort, compare:
Review the record whenever a meaningful screen or interview result lands, and compare:
- Warm vs cold progression -- **the primary question now, and still unanswered.**
- Core vs Adjacent/Stretch progression.
- Warm vs cold progression.
- Recruiter rejection vs hiring-manager rejection.
- Tool/domain patterns among successful and unsuccessful roles.
- Whether resume changes affected outcomes.
@@ -18,7 +18,7 @@ Every JD gets `output/<Folder>/session_<name>.md`.
- Hard gate: PASS / FAIL — [reason]
- Channel Strength: Strong / Moderate / Weak
- Channel plan: [referral/recruiter/hiring-team/cold]
- Cohort slot: Core [n]/7, Adjacent [n]/2, Stretch [n]/1
- Named contact published? YES/NO -- [who, and whether contacted] (no slot quotas; see application_strategy.md)
- Decision: PROCEED / HOLD / NO-GO
## Requirements
+1 -1
View File
@@ -28,7 +28,7 @@ Read `resume_builder/reference/application_strategy.md` and `critique_framework.
- Core: proceed.
- Adjacent: proceed selectively and state the serious gap.
- Stretch: confirm cohort capacity and user intent before full generation.
- Stretch: confirm user intent before full generation and state the gap plainly. There is no cohort capacity to check -- the slot caps were dropped 2026-09-05 (`application_strategy.md`).
- No-go: record the decision; do not generate a package unless the user explicitly overrides after seeing the gate.
## Audience and Cover-Letter Decisions
@@ -6,6 +6,13 @@
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
% LANGUAGE — this template is English and relies on TeX's default (English) hyphenation.
% For a GERMAN package you MUST add babel, or words break with English patterns
% (`Hal-bleiterfertigung`, `automa-tisierte`) — a native reader notices, and no overfull
% box warns you. See the 2026-08-27 KB Corrections Log entry.
% \usepackage[ngerman]{babel}
% \hyphenation{Trans-krip-ti-on} % ngerman still breaks this one wrongly
% Then check the breaks in the compiled PDF — a clean box count proves nothing here.
\usepackage[a4paper,left=0.65in,right=0.65in,top=0.55in,bottom=0.55in]{geometry}
\usepackage{xcolor}
\usepackage{hyperref}