Files
claude-resume-kit/resume_builder/helpers/cohort_tracker.py
T
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

82 lines
3.0 KiB
Python

#!/usr/bin/env python3
"""Record and summarize the controlled ten-application cohort."""
from __future__ import annotations
import argparse
import json
from pathlib import Path
ROOT = Path(__file__).resolve().parents[2]
TRACKER = ROOT / "job_scout" / "state" / "application_cohort.json"
FIT_CLASSES = ("core", "adjacent", "stretch")
CHANNELS = ("strong", "moderate", "weak")
def load() -> dict:
return json.loads(TRACKER.read_text(encoding="utf-8"))
def save(data: dict) -> None:
TRACKER.write_text(json.dumps(data, indent=2, ensure_ascii=False) + "\n", encoding="utf-8")
def summary(data: dict) -> None:
applications = data["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)
print(f" {fit_class}: {count}")
for channel in CHANNELS:
count = sum(item["channel"] == channel for item in applications)
print(f" channel {channel}: {count}")
outcomes: dict[str, int] = {}
for item in applications:
outcome = item.get("outcome", "open")
outcomes[outcome] = outcomes.get(outcome, 0) + 1
print(" outcomes: " + ", ".join(f"{key}={value}" for key, value in sorted(outcomes.items())))
def main() -> None:
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest="command", required=True)
subparsers.add_parser("summary")
add = subparsers.add_parser("add")
add.add_argument("--company", required=True)
add.add_argument("--role", required=True)
add.add_argument("--date", required=True)
add.add_argument("--fit-class", choices=FIT_CLASSES, required=True)
add.add_argument("--evidence-fit", type=float, required=True)
add.add_argument("--channel", choices=CHANNELS, required=True)
add.add_argument("--hard-gate", choices=("pass", "fail"), required=True)
add.add_argument("--outcome", default="open")
args = parser.parse_args()
data = load()
if args.command == "add":
if len(data["applications"]) >= 10:
raise SystemExit("cohort already contains ten applications")
if args.hard_gate == "fail" and args.fit_class != "stretch":
raise SystemExit("a hard-gate failure must be recorded as stretch")
data["applications"].append(
{
"company": args.company,
"role": args.role,
"application_date": args.date,
"fit_class": args.fit_class,
"evidence_fit": args.evidence_fit,
"hard_gate": args.hard_gate,
"channel": args.channel,
"outcome": args.outcome,
}
)
save(data)
summary(data)
if __name__ == "__main__":
main()