Compare commits
26
Commits
0d999ab21b
...
main
No files matched your search
@@ -3,60 +3,8 @@ name: critique
|
||||
description: Critique an existing resume or cover-letter package against its real job description. Use for application-fit review, truth/provenance audit, recruiter and hiring-manager evaluation, separate Evidence Fit and Document Quality scoring, channel-strength assessment, and post-edit re-critique.
|
||||
---
|
||||
|
||||
# Critique an Application Package
|
||||
# Shared project workflow
|
||||
|
||||
## Startup
|
||||
Read and follow [the critique workflow](../../../resume_builder/reference/workflows/critique.md) before doing this task. Resolve project paths from the repository root.
|
||||
|
||||
1. Read `resume_builder/reference/shared_ops.md`.
|
||||
2. Read `resume_builder/canonical/claims.json` completely.
|
||||
3. Read `config.md`, the session file, and the real verbatim JD.
|
||||
4. Stop if the JD is reconstructed, incomplete or inferred.
|
||||
5. Read `resume_builder/reference/critique_framework.md` and `resume_builder/support/ai_fingerprint_rules.md`.
|
||||
6. Read the resume and optional cover letter. Never use either as evidence; verify against canonical claims and experience files.
|
||||
|
||||
## Preflight
|
||||
|
||||
Run:
|
||||
|
||||
```powershell
|
||||
python resume_builder/helpers/validate_resume_system.py --document <resume.tex>
|
||||
```
|
||||
|
||||
Add `--document <cover_letter.tex>` when a letter exists. Any failure is Tier 1 and prevents approval.
|
||||
|
||||
Compile the documents and inspect the PDFs. Extract resume text with `pdftotext` and confirm that employer, formal title and dates appear in the expected order.
|
||||
|
||||
## Critique
|
||||
|
||||
Follow `critique_framework.md` exactly:
|
||||
|
||||
1. Hard-gate audit.
|
||||
2. Evidence Fit score, independent of writing.
|
||||
3. Document Quality score, independent of role fit.
|
||||
4. Channel Strength rating.
|
||||
5. Competitive and reader-sequence assessment.
|
||||
6. Canonical claim audit.
|
||||
7. Tiered fixes.
|
||||
8. Cover-letter decision/critique.
|
||||
9. Mechanical verification.
|
||||
|
||||
Do not issue a single overall score. Do not label a high-quality document submit-ready when Evidence Fit fails a hard gate.
|
||||
|
||||
## Cover-Letter Handling
|
||||
|
||||
If the session records `Cover Letter Decision: NO`, do not penalize absence. If a letter exists, first assess whether it should exist under `cl_reference.md`.
|
||||
|
||||
## Save and Report
|
||||
|
||||
Save `output/<Folder>/critique_<name>.md`. Update the session with:
|
||||
|
||||
- Evidence Fit score and Core/Adjacent/Stretch classification.
|
||||
- Hard-gate result.
|
||||
- Document Quality score.
|
||||
- Channel Strength.
|
||||
- Tier 1 fixes.
|
||||
- Critique status and date.
|
||||
|
||||
Present the fit verdict first, then the two scores and actionable fixes. Wait for explicit user approval before finalization or editing.
|
||||
|
||||
When approved, run the finalization checks from `shared_ops.md`. A package with a hard-gate NO-GO may be archived, but must not be described as recommended for submission.
|
||||
This shared file is the only workflow implementation for both agents. Preserve existing user authorization and resume from the application's recorded state.
|
||||
@@ -3,49 +3,8 @@ name: edit-resume
|
||||
description: Edit an existing resume or cover letter from critique or user feedback. Use to make evidence-safe content, hierarchy, format, or readability changes while preserving canonical claims, revalidating role fit, compiling LaTeX, and recording the edit.
|
||||
---
|
||||
|
||||
# Edit a Resume or Cover Letter
|
||||
# Shared project workflow
|
||||
|
||||
## Startup
|
||||
Read and follow [the edit-resume workflow](../../../resume_builder/reference/workflows/edit-resume.md) before doing this task. Resolve project paths from the repository root.
|
||||
|
||||
1. Read `shared_ops.md` and `resume_builder/canonical/claims.json` completely.
|
||||
2. Run the system validator.
|
||||
3. Read the session, real JD, target `.tex`, critique/feedback, selected profile rules and relevant experience files.
|
||||
4. Check `historical_outputs.json`. A package marked unsafe must be regenerated from canonical sources rather than lightly polished.
|
||||
5. If the package was already submitted, preserve it as history. Create a clearly named new version only when the user requests a reusable corrected document.
|
||||
|
||||
## Diagnose
|
||||
|
||||
Classify requested changes as:
|
||||
|
||||
- Truth/provenance correction.
|
||||
- Fit/framing correction.
|
||||
- Information hierarchy or readability.
|
||||
- Content selection.
|
||||
- Mechanical/LaTeX.
|
||||
- Blocked because evidence is absent.
|
||||
|
||||
Do not treat whitespace, equal bullet lengths or an exact character target as defects. Do not add filler. A critique cannot authorize an unsupported claim.
|
||||
|
||||
Present a concise edit plan and wait for explicit confirmation unless the user already approved specific edits.
|
||||
|
||||
## Execute
|
||||
|
||||
- Source every work claim from canonical IDs and experience files.
|
||||
- Keep employer/title/date hierarchy conventional.
|
||||
- Preserve natural bullet lengths and verified ownership scope.
|
||||
- Remove unsupported skills rather than replacing them with synonyms.
|
||||
- Update a cover letter only when its session decision is YES or the user explicitly requests it.
|
||||
- If edits reveal a hard fit gate, update the Evidence Fit classification; writing improvements cannot remove the gate.
|
||||
|
||||
## Verify
|
||||
|
||||
Run the validator on every edited document, compile, inspect the PDF, and verify extracted text order. Compare before/after for:
|
||||
|
||||
- validator failures;
|
||||
- page count;
|
||||
- employer/title/date visibility;
|
||||
- bullet count and relevance;
|
||||
- duplicated sections;
|
||||
- readability at normal size.
|
||||
|
||||
Update the session Edit History, Document Quality, status and next action. Mark the critique stale after material edits. Present results and wait for approval.
|
||||
This shared file is the only workflow implementation for both agents. Preserve existing user authorization and resume from the application's recorded state.
|
||||
@@ -3,43 +3,8 @@ name: make-cl
|
||||
description: Decide whether a cover letter adds value and, when justified, generate a concise evidence-first LaTeX letter from an approved session and resume. Use for requested letters, Swiss/DACH motivation letters, meaningful transitions, or employer-specific formats; skip generic optional letters.
|
||||
---
|
||||
|
||||
# Decide and Generate a Cover Letter
|
||||
# Shared project workflow
|
||||
|
||||
## Startup
|
||||
Read and follow [the make-cl workflow](../../../resume_builder/reference/workflows/make-cl.md) before doing this task. Resolve project paths from the repository root.
|
||||
|
||||
1. Read `shared_ops.md`, `resume_builder/canonical/claims.json`, `cl_reference.md`, the session, real JD and finished resume.
|
||||
2. Run the validator on the resume.
|
||||
3. Confirm that the session has a completed resume and a recorded Cover Letter Decision.
|
||||
|
||||
## Decision Gate
|
||||
|
||||
If the session says NO, explain the recorded reason and stop unless the user explicitly asks to override it. If no decision exists, apply `cl_reference.md` before writing and record YES/NO.
|
||||
|
||||
Do not generate a letter merely because an upload field exists or because older workflow expected a three-page package.
|
||||
|
||||
## Plan
|
||||
|
||||
State in one sentence what the letter adds beyond the resume. Select at most two evidence themes. Verify any named company/product/programme hook from a current primary source and save its URL in the session.
|
||||
|
||||
If the only possible content repeats resume bullets or paraphrases company news, change the decision to NO and explain why.
|
||||
|
||||
## Generate
|
||||
|
||||
- Use the selected audience profile and employer-requested language.
|
||||
- International Tech/industry: normally 200--300 words in two or three paragraphs.
|
||||
- Swiss/DACH: one A4 page, appropriate formality.
|
||||
- Employer-specific: follow the requested format or portal limit.
|
||||
- Lead with candidate-role connection.
|
||||
- Add motivation, decision context or a genuine connection.
|
||||
- Use only claims already present in both the canonical registry and resume.
|
||||
- Never introduce a new tool, metric, customer, ownership claim or result.
|
||||
|
||||
## Verify
|
||||
|
||||
Run:
|
||||
|
||||
```powershell
|
||||
python resume_builder/helpers/validate_resume_system.py --document <resume.tex> --document <cover_letter.tex>
|
||||
```
|
||||
|
||||
Compile and inspect the letter. Confirm it is readable, within the employer's limit, and materially different from the resume. Update the session and present the letter for approval. Point to `/critique` next.
|
||||
This shared file is the only workflow implementation for both agents. Preserve existing user authorization and resume from the application's recorded state.
|
||||
@@ -3,88 +3,8 @@ name: make-resume
|
||||
description: Generate a tailored evidence-first resume from a real job description. Use for new applications to assess hard qualifications and role fit before writing, select International Tech or Swiss/DACH format, plan canonical achievements, generate LaTeX, validate claims, compile, and record the application decision.
|
||||
---
|
||||
|
||||
# Generate a Resume
|
||||
# Shared project workflow
|
||||
|
||||
## Input
|
||||
Read and follow [the make-resume workflow](../../../resume_builder/reference/workflows/make-resume.md) before doing this task. Resolve project paths from the repository root.
|
||||
|
||||
Accept a JD file, pasted JD, or URL. Obtain the real posting text before analysis. If it cannot be retrieved, ask the user to paste it; never reconstruct it.
|
||||
|
||||
## Phase 0 — Canonical and JD Preflight
|
||||
|
||||
1. Read `resume_builder/reference/shared_ops.md`.
|
||||
2. Read `resume_builder/canonical/claims.json` completely.
|
||||
3. Read `config.md`, `AGENTS.md`, `application_strategy.md`, `resume_reference.md`, and `critique_framework.md`.
|
||||
4. Run `python resume_builder/helpers/validate_resume_system.py`.
|
||||
5. Verify and save the verbatim JD; record source/date/status.
|
||||
6. Create the output folder and session from `session_file_template.md`.
|
||||
|
||||
## Phase 1 — Fit Gate Before Writing
|
||||
|
||||
Build a requirement table with Required/Preferred and Direct/Adjacent/Gap/Constraint classifications. Cite canonical claim IDs for every Direct or Adjacent match.
|
||||
|
||||
Compute Evidence Fit and identify hard gates using `critique_framework.md`. Then assign:
|
||||
|
||||
- Core.
|
||||
- Adjacent.
|
||||
- Stretch.
|
||||
- No-go.
|
||||
|
||||
Record Channel Strength and a warm-channel action for Core roles.
|
||||
|
||||
Stop and present the fit decision before resume planning when:
|
||||
|
||||
- a hard gate fails;
|
||||
- the role is Stretch;
|
||||
- the selected cohort category is already full;
|
||||
- a practical constraint is unresolved.
|
||||
|
||||
Proceed on a no-go only after the user explicitly overrides the stated reason. An override does not change the fit classification.
|
||||
|
||||
## Phase 2 — Audience and Content Plan
|
||||
|
||||
Select International Tech by default. Use Swiss/DACH or Employer-specific format only when the employer/context supports it.
|
||||
|
||||
Read the matching role bundle, `skills_taxonomy.md`, `achievement_reframing_guide.md`, and only the experience files needed for selected claims.
|
||||
|
||||
Plan:
|
||||
|
||||
- Optional 2--3 line summary.
|
||||
- Four to six evidence-backed skills lines.
|
||||
- Swisscom 4--5 bullets.
|
||||
- Bosch 3--4 bullets.
|
||||
- Zero or one bullet for each older role.
|
||||
- Normally 11--14 bullets total, with no page-fill quota.
|
||||
|
||||
For each proposed bullet show canonical ID, evidence type, scope, and why it belongs. Identify any impact metric that still needs user confirmation.
|
||||
|
||||
Apply `cl_reference.md` and propose `Cover Letter Decision: YES/NO` with one reason.
|
||||
|
||||
Present the plan and wait for explicit user confirmation before generation.
|
||||
|
||||
## Phase 3 — Generate
|
||||
|
||||
Copy `resume.cls` and `resume_template.tex` into the output folder. For a Swiss/DACH audience, also read `resume_template_dach.tex` as an audience-policy overlay; it is not a standalone document. Write fresh content from canonical claims and experience records; never copy a historical output.
|
||||
|
||||
Rules:
|
||||
|
||||
- Employer, formal/transparent title, dates and location come first.
|
||||
- Do not use tailored themes as job titles.
|
||||
- Mix natural bullet lengths.
|
||||
- Use only verified metrics and outcomes.
|
||||
- Preserve allowed verbs and ownership scope.
|
||||
- Never add a skill to mirror the JD.
|
||||
- Certifications appear once.
|
||||
|
||||
## Phase 4 — Validate and Inspect
|
||||
|
||||
Run:
|
||||
|
||||
```powershell
|
||||
python resume_builder/helpers/validate_resume_system.py --document <resume.tex>
|
||||
```
|
||||
|
||||
Fix every failure. Compile the LaTeX, inspect both pages, and run `pdftotext` to verify parsing and information order. Do not add filler to reduce whitespace.
|
||||
|
||||
Update the session with the as-built content, validation results, page count, cover-letter decision, and next action.
|
||||
|
||||
Present the finished resume and the original Evidence Fit classification. Wait for approval. If the cover-letter decision is YES, point to `/make-cl`; otherwise point directly to `/critique`.
|
||||
This shared file is the only workflow implementation for both agents. Preserve existing user authorization and resume from the application's recorded state.
|
||||
@@ -3,80 +3,8 @@ name: setup-build-kb
|
||||
description: Build or update the resume knowledge base from structured extractions. Use to normalize employment evidence, maintain the canonical claims registry, add achievements with ownership and metric status, update evidence-tiered skills and role bundles, propagate corrections, and validate the full resume system.
|
||||
---
|
||||
|
||||
# Build or Update the Knowledge Base
|
||||
# Shared project workflow
|
||||
|
||||
## Authority Model
|
||||
Read and follow [the setup-build-kb workflow](../../../resume_builder/reference/workflows/setup-build-kb.md) before doing this task. Resolve project paths from the repository root.
|
||||
|
||||
The pipeline is:
|
||||
|
||||
`source documents -> extractions -> canonical claims -> experience records/bundles -> generated applications`
|
||||
|
||||
Generated applications never flow backward into the KB.
|
||||
|
||||
Read `resume_builder/canonical/claims.json`, `config.md`, and all relevant extractions before changing normalized sources. Preserve raw source documents. A verified correction must update canonical claims first and then every dependent normalized file.
|
||||
|
||||
## Canonical Claim Record
|
||||
|
||||
For each employment item or achievement, record:
|
||||
|
||||
- stable ID;
|
||||
- employer, title, dates and location;
|
||||
- factual scope;
|
||||
- individual vs shared ownership;
|
||||
- allowed verbs;
|
||||
- forbidden overstatements;
|
||||
- metric/result and verification status;
|
||||
- evidence source;
|
||||
- last verified date.
|
||||
|
||||
When ownership is ambiguous, use contributing/shared scope and ask the user. Do not default to full ownership.
|
||||
|
||||
## Experience Files
|
||||
|
||||
Experience files explain facts and context. They may contain example phrasings, but those examples cannot override canonical scope and should not be optimized to fixed line counts.
|
||||
|
||||
Every achievement section must include canonical ID, source, ownership scope, status, verified result/metric state, relevant skills and role relevance.
|
||||
|
||||
## Skills Taxonomy
|
||||
|
||||
Use only these evidence levels:
|
||||
|
||||
- Production — current.
|
||||
- Production — historical.
|
||||
- Hands-on — current.
|
||||
- Project / proof of concept.
|
||||
- Certification / coursework.
|
||||
- Unverified / never used.
|
||||
|
||||
Do not assign Expert/Proficient/Familiar labels. Add a skill to canonical claims before it can appear in a generated document.
|
||||
|
||||
## Role Bundles
|
||||
|
||||
Each bundle must contain:
|
||||
|
||||
1. Defensible positioning.
|
||||
2. Good-fit roles and hard-gate cautions.
|
||||
3. Achievement priorities.
|
||||
4. Safe reframing rules.
|
||||
5. Evidence-backed skills guidance.
|
||||
6. Conditional cover-letter guidance.
|
||||
|
||||
Bundles may rank evidence; they may not broaden it. Title-defining gaps must be stated explicitly.
|
||||
|
||||
## Significance Context
|
||||
|
||||
Keep company/industry context separate from candidate impact. Mark external claims for re-verification at application time. Never attach generic scale, economics, customers or market trends to the candidate.
|
||||
|
||||
## Correction Propagation
|
||||
|
||||
After any correction, search canonical claims, config, extractions, experience files, bundles, support files, templates and active drafts. Historical submitted outputs remain unchanged but update `historical_outputs.json` when they become unsafe for reuse.
|
||||
|
||||
## Validation
|
||||
|
||||
Run:
|
||||
|
||||
```powershell
|
||||
python resume_builder/helpers/validate_resume_system.py
|
||||
```
|
||||
|
||||
Then review the diff for dates, titles, ownership, metrics and skill evidence. Present the changed claim records and affected downstream files to the user for confirmation.
|
||||
This shared file is the only workflow implementation for both agents. Preserve existing user authorization and resume from the application's recorded state.
|
||||
@@ -3,99 +3,8 @@ name: setup-extract
|
||||
description: Extract source-grounded career evidence from papers, employment records, project documents, and notes into structured knowledge-base files without promoting inference to fact.
|
||||
---
|
||||
|
||||
# Source Evidence Extraction
|
||||
# Shared project workflow
|
||||
|
||||
Use this skill when adding new evidence to `knowledge_base/extractions/`. Extraction preserves what a source supports; it does not tailor claims to a vacancy.
|
||||
Read and follow [the setup-extract workflow](../../../resume_builder/reference/workflows/setup-extract.md) before doing this task. Resolve project paths from the repository root.
|
||||
|
||||
## Required inputs
|
||||
|
||||
1. Read `config.md` and the anti-fabrication rules in `AGENTS.md`.
|
||||
2. Read the complete source material.
|
||||
3. Check `resume_builder/canonical/claims.json` for existing facts and identifiers.
|
||||
4. Inspect related extraction files so new evidence does not create a duplicate or contradiction.
|
||||
|
||||
Generated resumes, cover letters, critiques, and session files under `output/` are never evidence sources.
|
||||
|
||||
## Extraction procedure
|
||||
|
||||
### 1. Identify the source
|
||||
|
||||
Record:
|
||||
|
||||
- source filename and type;
|
||||
- source date, if known;
|
||||
- whether it is primary evidence, user-authored notes, or a secondary description;
|
||||
- the person, employer, project, or publication it concerns.
|
||||
|
||||
### 2. Separate evidence from inference
|
||||
|
||||
For every potentially reusable fact, record:
|
||||
|
||||
- the source-supported statement;
|
||||
- the exact supporting passage or precise location;
|
||||
- any interpretation separately as `Inference`;
|
||||
- confidence: `verified`, `user-confirmed`, `needs verification`, or `do not use`.
|
||||
|
||||
Never silently convert an inference into a verified claim.
|
||||
|
||||
### 3. Capture career facts precisely
|
||||
|
||||
When applicable, extract:
|
||||
|
||||
- exact employer, formal title, location, and start/end dates;
|
||||
- ownership scope and collaborators;
|
||||
- work performed, method, technology, and domain;
|
||||
- outcome and beneficiary;
|
||||
- metrics with units, baseline, period, and attribution;
|
||||
- publication status, authorship position, and venue;
|
||||
- current versus historical skill use;
|
||||
- certification versus practical experience.
|
||||
|
||||
For large-company work, describe only the user's component, domain, pipeline, service, or contribution. Do not infer ownership of organization-wide platforms or transformations.
|
||||
|
||||
### 4. Record claim controls
|
||||
|
||||
For each major claim, include where useful:
|
||||
|
||||
- allowed verbs;
|
||||
- verbs or framings that would overstate ownership;
|
||||
- safe resume wording;
|
||||
- known contradictions requiring resolution;
|
||||
- whether a metric is verified, qualitative only, or still missing.
|
||||
|
||||
### 5. Write the extraction
|
||||
|
||||
Create or update a focused Markdown file in `knowledge_base/extractions/`. Use a clear structure such as:
|
||||
|
||||
```markdown
|
||||
# Subject
|
||||
|
||||
## Source
|
||||
## Verified facts
|
||||
## Ownership and attribution
|
||||
## Outcomes and metrics
|
||||
## Skills and recency
|
||||
## Safe claim seeds
|
||||
## Inferences / open questions
|
||||
## Conflicts with existing KB
|
||||
```
|
||||
|
||||
Claim seeds are factual building blocks, not polished resume bullets. Do not add unsupported impact language for relevance.
|
||||
|
||||
## Publication rules
|
||||
|
||||
- Never infer `published`, `accepted`, or `under review` from a manuscript file.
|
||||
- Preserve the user's author position.
|
||||
- Institutional funding is not a personal award.
|
||||
- Follow `config.md` provenance flags.
|
||||
|
||||
## Completion
|
||||
|
||||
Report:
|
||||
|
||||
- files created or updated;
|
||||
- newly verified facts;
|
||||
- unresolved contradictions or missing metrics;
|
||||
- suggested next command: use `setup-build-kb` to promote reviewed evidence into the canonical registry, experience files, bundles, and support files.
|
||||
|
||||
Do not update canonical claims from an unreviewed extraction.
|
||||
This shared file is the only workflow implementation for both agents. Preserve existing user authorization and resume from the application's recorded state.
|
||||
@@ -1,111 +1,11 @@
|
||||
---
|
||||
description: Re-critique existing resume/CV output files against a JD
|
||||
name: critique
|
||||
description: Critique an existing resume or cover-letter package against its real job description. Use for application-fit review, truth/provenance audit, recruiter and hiring-manager evaluation, separate Evidence Fit and Document Quality scoring, channel-strength assessment, and post-edit re-critique.
|
||||
user-invocable: true
|
||||
---
|
||||
|
||||
# /critique
|
||||
# Shared project workflow
|
||||
|
||||
**User input:** `$ARGUMENTS`
|
||||
Read and follow [the critique workflow](../../../resume_builder/reference/workflows/critique.md) before doing this task. Resolve project paths from the repository root.
|
||||
|
||||
Parse `$ARGUMENTS`:
|
||||
- Session file path (e.g., `output/Acme/session_acme_engineer.md`) → read session file, derive .tex paths from Output Files
|
||||
- .tex file path(s) + JD source (existing format) → backward compatible
|
||||
- Session name (e.g., `acme_engineer`) → find session file via derivation
|
||||
|
||||
If no CL .tex provided or found in session file, critique resume/CV alone (Part 7 adjustments noted below).
|
||||
|
||||
---
|
||||
|
||||
## Safety Rules
|
||||
|
||||
**Accuracy > Relevance > Impact > ATS > Brevity**
|
||||
|
||||
Read `config.md` Provenance Flags. Verify every claim against that table.
|
||||
**JD integrity:** the critique is only as valid as the JD. If the JD source is a reconstruction/inference/template rather than the real posting (see `shared_ops.md` → JD Integrity), STOP — flag it to the user and offer to scrape the live posting (Playwright recipe) before critiquing. Never score against a fabricated JD.
|
||||
Check `config.md` KB Corrections Log — do not flag corrected items as errors.
|
||||
Use the email from `config.md` Personal Info — flag if a different email appears in output.
|
||||
FIXED sections (from `config.md` FIXED Sections) are template-locked — do not flag for editing. Flag only VARIABLE sections.
|
||||
|
||||
---
|
||||
|
||||
## User Input During Execution
|
||||
|
||||
If the user provides feedback, corrections, or suggestions at any point:
|
||||
1. Acknowledge the input immediately
|
||||
2. If it changes scoring criteria or focus: adjust the critique accordingly
|
||||
3. Never restart — resume from current position
|
||||
|
||||
---
|
||||
|
||||
## Startup
|
||||
|
||||
Read `resume_builder/reference/shared_ops.md` — Fresh Session Startup + Session File Derivation.
|
||||
Read `CLAUDE.md` — check Active Sessions and KB Corrections.
|
||||
Read `config.md` — load Provenance Flags, FIXED Sections, email.
|
||||
Find and read the session file for the .tex being critiqued (use derivation protocol from shared_ops.md).
|
||||
|
||||
**Recovery check:**
|
||||
- If CL not DONE in session file → "CL not yet generated. Run `/make-cl` first."
|
||||
- If Critique: CURRENT → "Already critiqued (score X/100). Re-run? Waiting for confirmation."
|
||||
- If Critique: STALE → "Edits made since last critique. Re-critiquing."
|
||||
- If Critique: PENDING → proceed
|
||||
|
||||
---
|
||||
|
||||
## Protocol
|
||||
|
||||
1. **Read session file** — specifically note:
|
||||
- **Company Context** → reviewer persona, "why this company"
|
||||
- **Framing Strategy** → intentional reframing decisions (flag only execution inconsistencies, not the strategy itself)
|
||||
- **Cover Letter Plan** → CL structure rationale
|
||||
- **Critique Context** → reviewer persona, competitive landscape, domain vocabulary
|
||||
- If session file lacks Company Context or Critique Context: do 1-2 web searches to fill gaps
|
||||
2. Read `resume_builder/reference/critique_framework.md`
|
||||
3. Read `resume_builder/support/ai_fingerprint_rules.md` — use Section 6 checklist in Part 7 verification
|
||||
3. Read the .tex file(s) — derive paths from session file Output Files, or from `$ARGUMENTS`
|
||||
4. Read the JD (path from `$ARGUMENTS` or session file)
|
||||
5. Read the relevant bundle (`resume_builder/bundles/bundle_[role_type].md` — from session file)
|
||||
6. Run char count:
|
||||
```bash
|
||||
python3 resume_builder/helpers/char_count.py -f [resume|cv] [file.tex]
|
||||
```
|
||||
7. Compile and visually verify:
|
||||
```bash
|
||||
pdflatex -interaction=nonstopmode -output-directory=output/<FolderName> [file.tex]
|
||||
```
|
||||
Use the Read tool to view the compiled PDF — check orphans, page fill, header wrapping.
|
||||
If compile fails: note "COMPILE FAILED — visual checks could not be verified" in Part 8.
|
||||
8. If a prior critique exists (`output/<FolderName>/critique_<name>.md`): read it and note previous score.
|
||||
8b. **Paper Hook Verification:** If the CL cites named papers, PIs, programs, or publications, web-search to verify title, journal, year, and PI affiliation. Flag factual errors as Tier 1 fixes.
|
||||
|
||||
9. **Run the full critique per critique_framework.md. The output MUST contain ALL 8 sections** (even if the framework file has partially compacted, produce every section):
|
||||
|
||||
1. **Domain-Specialist Lens** — 7 elements:
|
||||
(a) Reviewer persona (b) Company context (c) JD vocabulary extraction (d) Domain vocabulary map
|
||||
(e) Gap ranking (fatal/serious/cosmetic) (f) Methodology transfer test (g) Competitive landscape
|
||||
2. **Five-Perspective Read-Through** — ATS, Recruiter (10s), HR (30s), HM (2min), Technical (10min) — each with verdict
|
||||
3. **Eight-Dimension Scoring** — weighted table summing to 100
|
||||
(ATS 15%, Summary 10%, Skills 10%, Bullets 25%, Publications 10%, Narrative 15%, Visual 5%, Credibility 10%)
|
||||
4. **Interview Likelihood** — per-reader probability + ceiling analysis
|
||||
5. **Tiered Improvements** — Tier 1 (>=1pt each), Tier 2 (0.3-0.9), Tier 3 (<0.3)
|
||||
6. **Interview Bridge Points** — 5-7 resume-to-interview talking points
|
||||
7. **Cover Letter Critique** — 6 sub-checks (6A anti-patterns, 6B tailoring, 6C context-specific, 6D ATS, 6E structural, 6F package cohesion)
|
||||
- **If no CL provided:** Skip 6A-6E. Run 6F as resume standalone assessment — evaluate whether the resume earns an interview without a CL. Note: "Cover letter not provided — package cohesion not assessed."
|
||||
8. **Post-Generation Verification** — mechanical + content + structural checklists
|
||||
|
||||
10. Save to `output/<FolderName>/critique_<name>.md`
|
||||
11. **Update session file** — Critique Summary (score, findings, tier 1 fixes), Status → Critique: CURRENT
|
||||
12. **Update memory pointer** with new score
|
||||
|
||||
Progress: "Reading session file for framing context..." / "Running ATS keyword scan — 16/20 match..." / "Scoring 8 dimensions..." / "Score: 87.0/100"
|
||||
|
||||
### >>>>>> MANDATORY STOP <<<<<<
|
||||
Present: score table + tier 1 actionable fixes + interview likelihood.
|
||||
**You MUST wait for the user's explicit text response before continuing.**
|
||||
If edits needed, tell user to run `/edit-resume`.
|
||||
|
||||
### When user approves / says "looks good" / finalizes:
|
||||
Verify all expected files exist in `output/<FolderName>/`:
|
||||
- session file, resume/CV .tex + .pdf, CL .tex + .pdf, critique .md
|
||||
- Compile artifacts (.aux, .log, .out)
|
||||
Confirm to user: "Package complete in output/<FolderName>/ — [list files]"
|
||||
This shared file is the only workflow implementation for both agents. Preserve existing user authorization and resume from the application's recorded state.
|
||||
@@ -1,208 +1,11 @@
|
||||
---
|
||||
description: Edit existing resume/CV or cover letter from critique feedback and user suggestions
|
||||
name: edit-resume
|
||||
description: Edit an existing resume or cover letter from critique or user feedback. Use to make evidence-safe content, hierarchy, format, or readability changes while preserving canonical claims, revalidating role fit, compiling LaTeX, and recording the edit.
|
||||
user-invocable: true
|
||||
---
|
||||
|
||||
# /edit-resume
|
||||
# Shared project workflow
|
||||
|
||||
**User input:** `$ARGUMENTS`
|
||||
Read and follow [the edit-resume workflow](../../../resume_builder/reference/workflows/edit-resume.md) before doing this task. Resolve project paths from the repository root.
|
||||
|
||||
Parse `$ARGUMENTS`: First argument is the .tex file path (required). A `.md` path is the critique file. Text in quotes is inline instructions.
|
||||
- `/edit-resume output/Acme/e2e_acme_resume.tex`
|
||||
- `/edit-resume output/Acme/e2e_acme_resume.tex output/Acme/critique_acme.md`
|
||||
- `/edit-resume output/Acme/e2e_acme_resume.tex "shorten Position 1 header, fill last page"`
|
||||
|
||||
If only .tex path and no instructions: ask the user what to fix.
|
||||
|
||||
---
|
||||
|
||||
## Safety Rules (ALWAYS ENFORCED)
|
||||
|
||||
**Accuracy > Relevance > Impact > ATS > Brevity**
|
||||
|
||||
Read `config.md` Provenance Flags before editing any content. Verify every claim against that table.
|
||||
|
||||
- Use the email from `config.md` Personal Info in all outputs
|
||||
- Source ALL bullet content from `resume_builder/experience/` files. Never fabricate.
|
||||
- Resume bullets: ALL variable bullets must be 2L (CV: 2L/3L mix OK, check `config.md` Document Preferences)
|
||||
- Run `python3 resume_builder/helpers/char_count.py` after edits — the tool is authoritative
|
||||
|
||||
### FIXED Sections — Refuse if Asked to Edit
|
||||
Check `config.md` FIXED Sections for the list of template-locked sections. Say no and explain: these are template-locked across all outputs.
|
||||
|
||||
VARIABLE sections only: Summary, Technical Skills, Research Experience bullets/headers.
|
||||
|
||||
---
|
||||
|
||||
## User Input During Execution
|
||||
|
||||
If the user provides feedback, corrections, or suggestions at any point:
|
||||
1. Acknowledge the input immediately
|
||||
2. If it affects an already-applied edit: go back, fix it, re-run char count gate
|
||||
3. If it changes the edit plan: update session file, adjust remaining edits
|
||||
4. If it's a question: answer it, then continue from current step
|
||||
5. Never restart a phase — resume from current position
|
||||
|
||||
---
|
||||
|
||||
## Startup
|
||||
|
||||
Read `resume_builder/reference/shared_ops.md` — Fresh Session Startup + Session File Derivation.
|
||||
Read `CLAUDE.md` — check Active Sessions and KB Corrections.
|
||||
Read `config.md` — load Provenance Flags, email, FIXED Sections, document preferences.
|
||||
Find and read the session file (use derivation protocol from shared_ops.md).
|
||||
|
||||
**Recovery check:**
|
||||
- Read session file, check for existing Edit N Status
|
||||
- If Edit N Status shows IN_PROGRESS: read .tex, identify which edits are done, resume
|
||||
- If no edit in progress: proceed to Phase 1
|
||||
|
||||
---
|
||||
|
||||
## Phase 1: Load Context
|
||||
|
||||
Read in this order:
|
||||
1. **Session file** (`output/<FolderName>/session_<name>.md`) — note: Framing Strategy, Company Context, Bullet Plan, Edit History
|
||||
2. `resume_builder/reference/resume_reference.md` — char limits, budgets, fixed sections
|
||||
3. The .tex file being edited
|
||||
4. Critique file (if provided in `$ARGUMENTS`)
|
||||
5. JD file (path from session file's JD Info section)
|
||||
6. Compile current .tex and record baseline page count
|
||||
7. Run: `python3 resume_builder/helpers/char_count.py -f [resume|cv] [file.tex]`
|
||||
|
||||
**Record baseline in session file** under `## Edit [N] Baseline` (scan existing Edit History sections; next N = max existing + 1, or 1 if none):
|
||||
|
||||
```
|
||||
## Edit [N] Baseline
|
||||
- Pages: [N]
|
||||
- Char violations: [list or "none"]
|
||||
- Orphan violations: [list or "none"]
|
||||
- White space last page: [N lines]
|
||||
- Variable bullets: [N]
|
||||
- Rendered lines: [N]
|
||||
```
|
||||
|
||||
Progress: "Reading session file — [company], [role type] bundle..." / "Baseline: 2 pages, 0 char violations, 1 orphan..."
|
||||
|
||||
---
|
||||
|
||||
## Phase 2: Diagnose & Plan Edits
|
||||
|
||||
Gather change requests from THREE sources:
|
||||
1. **User instructions** from `$ARGUMENTS` (highest priority)
|
||||
2. **Critique file** (Tier 1 fixes first, then Tier 2)
|
||||
3. **Auto-detected issues** from Phase 1 (char violations, orphans, page fill)
|
||||
|
||||
Cross-check against **session file framing strategy** — edits must stay consistent with decisions from `/make-resume`.
|
||||
|
||||
**For each change, classify:**
|
||||
- **MODIFY:** Change text of existing bullet/summary/skills. Budget unchanged.
|
||||
- **SWAP:** Replace one bullet with another. Budget unchanged if same variant.
|
||||
- **ADD:** Insert new bullet. Budget increases by rendered lines.
|
||||
- **REMOVE:** Drop a bullet. Budget decreases.
|
||||
- **VARIANT CHANGE:** e.g., 2L → 3L. Budget changes by rendered line delta.
|
||||
- **FIXED:** Blocked — show in plan with `[FIXED — cannot edit]` and explain why.
|
||||
|
||||
**Budget revalidation (if any change is ADD, REMOVE, SWAP-with-different-variant, or VARIANT CHANGE):**
|
||||
Recalculate total variable bullets and rendered lines. Compare against budget from resume_reference.md.
|
||||
If OVER budget: present overflow and ask user which bullet to drop or shorten.
|
||||
Show: `Budget: [N] bullets ([M] rendered lines) vs target [T]. PASS/FAIL`
|
||||
|
||||
If edit targets **cover letter** (not resume/CV): note this — Phase 4 will use CL-specific gates. Load CL .tex path from session file Output Files section.
|
||||
|
||||
### >>>>>> MANDATORY STOP — DO NOT PROCEED <<<<<<
|
||||
Present numbered edit plan. Each item shows: what, why, source, classification (MODIFY/ADD/SWAP/FIXED).
|
||||
**You MUST wait for the user's explicit text response before continuing.**
|
||||
Proceeding without confirmation may make unwanted edits that break package consistency.
|
||||
|
||||
---
|
||||
|
||||
## Phase 3: Load Reference Files (only confirmed edits)
|
||||
|
||||
Load ONLY what the confirmed edits need:
|
||||
|
||||
- **All edits:** `resume_builder/support/ai_fingerprint_rules.md` — scan for banned words/patterns before and after edits
|
||||
- **Bullet expand/rewrite/add:** `resume_builder/experience/` files + matching bundle + `resume_builder/support/achievement_reframing_guide.md`
|
||||
- **Summary rewrite:** Bundle (S2 summary guide) + `resume_builder/support/skills_taxonomy.md`
|
||||
- **Cover letter edits:** `resume_builder/support/significance_*.md` + `resume_builder/reference/cl_reference.md`
|
||||
- **Simple fixes** (orphans, headers, spacing): No extra files needed
|
||||
|
||||
---
|
||||
|
||||
## Phase 4: Execute Edits
|
||||
|
||||
Apply edits one section at a time. After each edited section:
|
||||
|
||||
1. Run char count gate:
|
||||
```bash
|
||||
python3 resume_builder/helpers/char_count.py -f [resume|cv] output/<FolderName>/[file].tex
|
||||
```
|
||||
2. Fix any OVER violations or orphans before next section
|
||||
3. If a bullet expansion doesn't render as expected (1L when targeting 2L, or 3L), adjust immediately
|
||||
|
||||
Update session file Edit N Status after each individual edit:
|
||||
- Edit 1 (orphan fix): DONE
|
||||
- Edit 2 (Summary rewrite): IN_PROGRESS
|
||||
|
||||
### Resume/CV Verification Gates
|
||||
| Gate | Check | If FAIL |
|
||||
|------|-------|---------|
|
||||
| Char count | No OVER violations | Fix bullet before proceeding |
|
||||
| Page fill | Resume: <= 3 lines white space. CV: check rendered line target | Expand/trim variable bullets |
|
||||
| Page count | Match `config.md` Document Preferences | Trim/expand variable content |
|
||||
| Orphan | 2L bullet last line >= 70% | Pad or trim |
|
||||
| Title width | Position title + date fits 1 line | Shorten title |
|
||||
| Compile | Clean pdflatex | Fix LaTeX errors |
|
||||
|
||||
### Cover Letter Verification Gates (if CL was edited)
|
||||
| Gate | Check | If FAIL |
|
||||
|------|-------|---------|
|
||||
| Word count | Industry 250-300, Lab/Academic 350-450 | Trim/expand |
|
||||
| Page fill | 1pg: well-filled. 2pg: page 2 >= half filled before signature | Adjust |
|
||||
| Paragraph count | Industry 3, Lab/Academic 4 | Restructure |
|
||||
| Anti-patterns | No generic opener, no defensive framing, no credential dump | Rewrite |
|
||||
| Package cohesion | CL claims traceable to resume bullets, no contradictions | Fix |
|
||||
|
||||
After all edits, compile:
|
||||
```bash
|
||||
pdflatex -interaction=nonstopmode -output-directory=output/<FolderName> output/<FolderName>/[file].tex
|
||||
```
|
||||
Use the Read tool to view the compiled PDF — check page count, white space, orphans, header wrapping.
|
||||
|
||||
Progress: "Editing Position 1 bullet 6 — was 184 chars, now 197..." / "Compiling... 2 pages, page fill OK"
|
||||
|
||||
---
|
||||
|
||||
## Phase 5: Update Session File & Present
|
||||
|
||||
1. **Append Edit History** (use the N from Phase 1 baseline):
|
||||
```
|
||||
### Edit [N] ([date]): [short description]
|
||||
- Changes: [what changed]
|
||||
- Source: critique item # / user request / auto-detected
|
||||
- Verification: gates passed
|
||||
```
|
||||
|
||||
2. **Compare against baseline:**
|
||||
|
||||
| Metric | Before | After | Delta |
|
||||
|--------|--------|-------|-------|
|
||||
| Page count | [N] | [N] | [+/-] |
|
||||
| Char violations | [N] | [N] | [+/-] |
|
||||
| Orphans | [N] | [N] | [+/-] |
|
||||
| White space | [N] | [N] | [+/-] |
|
||||
|
||||
Flag any metric that worsened.
|
||||
|
||||
3. **Update Status** — mark critique as STALE if edits made after last critique. Update Next.
|
||||
|
||||
4. **Update memory pointer** if status changed.
|
||||
|
||||
5. **Present:** Changes summary + delta table + compiled PDF.
|
||||
|
||||
### >>>>>> MANDATORY STOP <<<<<<
|
||||
Show results. Wait for user approval or further edits.
|
||||
**You MUST wait for the user's explicit text response before continuing.**
|
||||
|
||||
### When user approves / says "looks good" / finalizes:
|
||||
Run file organization from `resume_builder/reference/shared_ops.md` — Finalization check.
|
||||
This shared file is the only workflow implementation for both agents. Preserve existing user authorization and resume from the application's recorded state.
|
||||
@@ -1,142 +1,11 @@
|
||||
---
|
||||
description: Generate a tailored cover letter from an existing session file and finished resume/CV
|
||||
name: make-cl
|
||||
description: Decide whether a cover letter adds value and, when justified, generate a concise evidence-first LaTeX letter from an approved session and resume. Use for requested letters, Swiss/DACH motivation letters, meaningful transitions, or employer-specific formats; skip generic optional letters.
|
||||
user-invocable: true
|
||||
---
|
||||
|
||||
# /make-cl
|
||||
# Shared project workflow
|
||||
|
||||
**User input:** `$ARGUMENTS`
|
||||
Read and follow [the make-cl workflow](../../../resume_builder/reference/workflows/make-cl.md) before doing this task. Resolve project paths from the repository root.
|
||||
|
||||
Parse `$ARGUMENTS`:
|
||||
- Session file path (e.g., `output/Acme/session_acme_engineer.md`) → read that session file
|
||||
- Session name (e.g., `acme_engineer`) → find session file via shared_ops.md derivation
|
||||
- Empty → check `CLAUDE.md` Active Sessions for latest
|
||||
|
||||
---
|
||||
|
||||
## Safety Rules (ALWAYS ENFORCED)
|
||||
|
||||
**Accuracy > Relevance > Impact > ATS > Brevity**
|
||||
|
||||
Read `config.md` Provenance Flags before generating any content. Verify every claim against that table.
|
||||
|
||||
- Use the email from `config.md` Personal Info in all outputs
|
||||
- CL deepens what resume presents — never introduces new claims not traceable to resume bullets
|
||||
- Source field context from `resume_builder/support/significance_*.md` files
|
||||
|
||||
---
|
||||
|
||||
## User Input During Execution
|
||||
|
||||
If the user provides feedback, corrections, or suggestions at any point:
|
||||
1. Acknowledge the input immediately
|
||||
2. If it affects already-written content: fix it, re-verify word count and anti-patterns
|
||||
3. If it changes the framing: note the change in session file Framing Strategy
|
||||
4. Never restart — resume from current position
|
||||
|
||||
---
|
||||
|
||||
## Startup
|
||||
|
||||
Read `resume_builder/reference/shared_ops.md` for session startup and file derivation.
|
||||
|
||||
Then:
|
||||
1. Read `CLAUDE.md` — check Active Sessions and KB Corrections
|
||||
2. Read `config.md` — load Provenance Flags, email, role types
|
||||
3. Find and read the session file
|
||||
4. **Recovery check:**
|
||||
- If CL Status is DONE → "CL already generated. Run `/critique` next." Show next command. Stop.
|
||||
- If CL Status is IN_PROGRESS → check if CL .tex exists, offer to resume or regenerate
|
||||
- If Resume Status is not DONE → "Resume not yet generated. Run `/make-resume` first." Stop.
|
||||
- If CL Status is PENDING → proceed to Phase 1
|
||||
|
||||
---
|
||||
|
||||
## Phase 1: Load Context
|
||||
|
||||
Read in this order:
|
||||
1. **Session file** — specifically: Company Context, Cover Letter Plan, Framing Strategy, ATS Keywords
|
||||
2. **Finished resume/CV .tex** — path from session file Output Files. Read to understand what CL must complement.
|
||||
3. `resume_builder/reference/cl_reference.md` — CL format rules, paragraph templates, anti-patterns
|
||||
4. `resume_builder/support/ai_fingerprint_rules.md` — Banned words, structural rules (CLs are most vulnerable)
|
||||
5. The matching bundle from session file role type → `resume_builder/bundles/bundle_[role_type].md` — Section 5 (Cover Letter)
|
||||
5. All significance files from `resume_builder/support/significance_*.md`
|
||||
|
||||
Update session file Status: `Cover Letter: IN_PROGRESS`
|
||||
|
||||
Progress: "Loading CL context — [company], [role type] bundle, [institution type]..."
|
||||
|
||||
---
|
||||
|
||||
## Phase 2: Generate Cover Letter
|
||||
|
||||
Read `resume_builder/templates/coverletter_template.tex`.
|
||||
|
||||
**Detect institution type** from session file Cover Letter Plan:
|
||||
- Industry → 3 paragraphs, 250-300 words
|
||||
- National Lab → 4 paragraphs, 350-450 words
|
||||
- Academic → 4 paragraphs, 350-450 words (postdoc) or 450-650 words (faculty)
|
||||
|
||||
**Generate CL following cl_reference.md paragraph structure:**
|
||||
- Use significance files for field-context depth (NOT resume bullet text)
|
||||
- Use session file CL hooks and "why them" angle
|
||||
- Ensure every major claim is traceable to a resume/CV bullet
|
||||
- Open with a specific reference to their work — no generic openers
|
||||
- Weave credentials into body paragraphs, not closing
|
||||
|
||||
Save to `output/<FolderName>/e2e_<name>_cover_letter.tex`
|
||||
|
||||
Progress: "Writing [institution type] cover letter — [N] paragraphs, targeting [N] words..."
|
||||
|
||||
### CL Hook Verification Gate (MANDATORY before presenting to user)
|
||||
|
||||
Web-search every hook used in the CL:
|
||||
- Academic: PI name + cited paper/research area
|
||||
- National Lab: named program, thrust area, or group publication
|
||||
- Industry: product, technology, or company news referenced
|
||||
|
||||
Present evidence as:
|
||||
> **Claim:** [what the CL says] → **Evidence:** [what the search found] → **Source:** [URL]
|
||||
|
||||
Flag any unverified item: **"UNVERIFIED — please confirm"**
|
||||
|
||||
Do NOT present the CL draft to the user until all hooks are verified or flagged.
|
||||
|
||||
---
|
||||
|
||||
## Phase 3: Compile & Verify
|
||||
|
||||
```bash
|
||||
pdflatex -interaction=nonstopmode -output-directory=output/<FolderName> output/<FolderName>/e2e_<name>_cover_letter.tex
|
||||
```
|
||||
|
||||
Use Read tool to view compiled PDF. Verify:
|
||||
|
||||
| Gate | Check | If FAIL |
|
||||
|------|-------|---------|
|
||||
| Word count | Industry 250-300, Lab/Academic 350-450 | Trim/expand |
|
||||
| Page count | Resume package: 1 page. CV package: 1-2 pages | Adjust content |
|
||||
| Page fill | 1pg: well-filled. 2pg: page 2 >= half filled before signature | Adjust |
|
||||
| Anti-patterns | No generic opener, no defensive framing, no credential dump | Rewrite |
|
||||
| Package cohesion | CL claims traceable to resume bullets, no contradictions | Fix |
|
||||
| Compile | Clean pdflatex | Fix LaTeX errors |
|
||||
|
||||
Update session file:
|
||||
- Add CL to Output Files
|
||||
- Status: `Cover Letter: DONE`
|
||||
- Add Next Critique command
|
||||
|
||||
Progress: "Compiled — 1 page, 278 words. Package cohesion verified."
|
||||
|
||||
### >>>>>> MANDATORY STOP — DO NOT PROCEED <<<<<<
|
||||
Present: CL summary (word count, page count, key hooks used).
|
||||
**You MUST wait for the user's explicit text response before continuing.**
|
||||
|
||||
If user requests changes: apply them, re-compile, re-verify. Update session file.
|
||||
If user approves: update Status, present next command.
|
||||
|
||||
**Do NOT trigger file organization** — that happens after `/critique` approval.
|
||||
|
||||
"Cover letter done. Next steps:
|
||||
1. /clear
|
||||
2. [exact /critique command with session file path]"
|
||||
This shared file is the only workflow implementation for both agents. Preserve existing user authorization and resume from the application's recorded state.
|
||||
@@ -1,241 +1,11 @@
|
||||
---
|
||||
description: Generate a tailored resume/CV from a JD
|
||||
name: make-resume
|
||||
description: Generate a tailored evidence-first resume from a real job description. Use for new applications to assess hard qualifications and role fit before writing, select International Tech or Swiss/DACH format, plan canonical achievements, generate LaTeX, validate claims, compile, and record the application decision.
|
||||
user-invocable: true
|
||||
---
|
||||
|
||||
# /make-resume
|
||||
# Shared project workflow
|
||||
|
||||
**User input:** `$ARGUMENTS`
|
||||
Read and follow [the make-resume workflow](../../../resume_builder/reference/workflows/make-resume.md) before doing this task. Resolve project paths from the repository root.
|
||||
|
||||
Parse `$ARGUMENTS`:
|
||||
- File path (e.g., `JDs/*.txt`) → read that file for the JD
|
||||
- A URL → this is NOT a JD, it's a pointer. Fetch the real posting text first (see JD Integrity below), save it verbatim to `JDs/<company>_<role>.txt`, then proceed.
|
||||
- Text after the path starting with "Focus:"/"Emphasize:"/"Downplay:" → focus directive
|
||||
- "Quick:" prefix → Quick Mode (see below)
|
||||
- Empty → ask the user for the JD
|
||||
- Inline JD text (no file path) → save to `JDs/temp_<company>.txt`, proceed normally
|
||||
|
||||
**JD Integrity (read `shared_ops.md` → "JD Integrity"):** The JD must be the real posting, verbatim. NEVER invent, reconstruct, paraphrase, or infer JD content. `WebFetch` is JS-blind on careers boards — use the job_scout Playwright recipe in `shared_ops.md` to scrape JS-gated postings. If you cannot get the real text, STOP and ask the user to paste it. Do not proceed on a guessed JD.
|
||||
|
||||
---
|
||||
|
||||
## Safety Rules (ALWAYS ENFORCED)
|
||||
|
||||
**Accuracy > Relevance > Impact > ATS > Brevity**
|
||||
|
||||
Read `config.md` Provenance Flags before generating any content. Verify every claim against that table.
|
||||
|
||||
- **JD is ground truth — use the real posting verbatim. NEVER reconstruct, invent, or infer a JD** (see `shared_ops.md` → JD Integrity). If you can't get the real text, STOP and ask the user to paste it.
|
||||
- Use the email from `config.md` Personal Info in all outputs
|
||||
- Resume bullets: ALL variable bullets are 2L (CV: 2L/3L mix OK, check `config.md` Document Preferences)
|
||||
- Source ALL bullet content from `resume_builder/experience/` files. Never fabricate.
|
||||
- Run `python3 resume_builder/helpers/char_count.py` after each section — the tool is authoritative
|
||||
|
||||
---
|
||||
|
||||
## User Input During Execution
|
||||
|
||||
If the user provides feedback, corrections, or suggestions at any point:
|
||||
1. Acknowledge the input immediately
|
||||
2. If it affects an already-written section: go back, fix it, re-run char count gate
|
||||
3. If it changes the bullet plan: update session file Bullet Plan
|
||||
4. If it's a question: answer it, then continue from current step
|
||||
5. Never restart a phase — resume from current position
|
||||
|
||||
---
|
||||
|
||||
## Startup
|
||||
|
||||
Read `resume_builder/reference/shared_ops.md` for session startup, file derivation, and organization protocols.
|
||||
|
||||
Then:
|
||||
1. Read `CLAUDE.md` — check Active Sessions and KB Corrections
|
||||
2. Read `config.md` — load Provenance Flags, email, document preferences, role types
|
||||
3. If session file exists for this JD:
|
||||
- Read session file, check Status
|
||||
- Phase 0: DONE, Phase 1: PENDING → resume at Phase 1
|
||||
- Phase 1: DONE → resume at Budget Gate
|
||||
- Phase 2: IN_PROGRESS → read .tex, check what sections exist, resume from checkpoint
|
||||
- Phase 2: DONE → "Resume already done. Run /make-cl next." Show next command. Stop.
|
||||
4. If no session file: proceed to Phase 0
|
||||
|
||||
---
|
||||
|
||||
## Quick Mode
|
||||
|
||||
Trigger: `$ARGUMENTS` starts with "Quick:"
|
||||
|
||||
Defaults:
|
||||
- Select all HIGH priority achievements from bundle's Priority Matrix as 2L
|
||||
- Fill remaining budget with MEDIUM priority in Priority Matrix order
|
||||
- Default format: 2-page resume (unless JD clearly requires CV)
|
||||
- Skip Phase 0 STOP and Phase 1 STOP
|
||||
- Keep Budget Gate (auto-pass if within target) and end-of-resume STOP
|
||||
- Run all phases with progress commentary instead of interactive stops
|
||||
|
||||
---
|
||||
|
||||
## Phase 0: Research & Session Setup
|
||||
|
||||
**Read these files:**
|
||||
1. The JD — the **real posting text**, verbatim. If `$ARGUMENTS` was a URL or the posting is on a JS-gated board, scrape it with the Playwright recipe in `shared_ops.md` (JD Integrity) BEFORE this step and save to `JDs/`/`output/<FolderName>/JD_<name>.txt`. If you cannot obtain the real text, STOP and ask the user to paste it — do NOT reconstruct or infer it.
|
||||
2. `resume_builder/reference/resume_reference.md` — Budget Card, Section Specs, Char Limits, Page Budgets
|
||||
3. `config.md` — Role-Type Decision Tree to identify the matching bundle
|
||||
|
||||
**Web Search (MANDATORY — 2-3 searches).** Load WebSearch via ToolSearch first.
|
||||
1. `[Company] research & development [key JD domain]` — products, recent projects
|
||||
2. `[Company] [specific technology from JD]` — concrete hooks for cover letter
|
||||
3. `[Company] careers [role type] culture` OR recent news — hiring context
|
||||
|
||||
If web search returns no results: use JD text + training knowledge. Flag: "Web search returned limited results — CL hooks may be generic."
|
||||
|
||||
**Produce all of these (reference `resume_builder/reference/session_file_template.md` for format):**
|
||||
- **JD Analysis** — classify every requirement as Direct / Bridge (with confidence) / Gap. Extract ATS keywords by category.
|
||||
- **Company Context** — mission, role purpose, culture signals, "why them" angle (from web research)
|
||||
- **Framing Strategy** — lead narrative, reframing map, emphasize/downplay, CL hooks, user focus directives
|
||||
- **Critique Context** — reviewer persona, competitive landscape, domain vocabulary
|
||||
- **Cover Letter Plan** — institution type, paragraph structure, hooks, jargon level
|
||||
|
||||
**Create output folder:**
|
||||
Derive folder name from JD filename: `JDs/JD_Acme.txt` → `output/Acme/`
|
||||
```bash
|
||||
mkdir -p output/<FolderName>/
|
||||
```
|
||||
Write session file to `output/<FolderName>/session_<name>.md` (NOT flat `output/`).
|
||||
All subsequent output files go in this folder.
|
||||
|
||||
**Verify completeness:** Re-read the session file. Confirm these 8 sections are non-empty: JD Info, Requirements table, ATS Keywords, Gap Assessment, Company Context, Framing Strategy, Critique Context, Cover Letter Plan. Fill any missing section before presenting.
|
||||
|
||||
**Write memory pointer** to `CLAUDE.md` Active Sessions.
|
||||
|
||||
**Update session file Status:** `Phase 0: DONE`
|
||||
|
||||
Progress: "Searching for [company] + [domain]..." / "JD analysis: X/Y requirements direct match, Z bridges, W gaps"
|
||||
|
||||
### >>>>>> MANDATORY STOP — DO NOT PROCEED <<<<<<
|
||||
Present: research summary, role type + bundle, format, framing strategy.
|
||||
Ask user to confirm: (1) role type + bundle, (2) format, (3) framing strategy.
|
||||
**You MUST wait for the user's explicit text response before continuing.**
|
||||
Proceeding without confirmation misaligns the entire resume and requires full regeneration.
|
||||
|
||||
---
|
||||
|
||||
## Phase 1: Plan Bullets
|
||||
|
||||
**Re-read `output/<FolderName>/session_<name>.md`** — specifically Framing Strategy and ATS Keywords.
|
||||
|
||||
**Read:**
|
||||
1. The matching bundle from `config.md` Role Types → `resume_builder/bundles/bundle_[role_type].md` — Section 1 (Priority Matrix)
|
||||
- For hybrid JDs: read both bundles. Use primary for Priority Matrix, secondary for Reframing Map on 1-2 bridging bullets.
|
||||
2. All experience files from `resume_builder/experience/`
|
||||
3. `resume_builder/support/achievement_reframing_guide.md`
|
||||
4. `resume_builder/support/skills_taxonomy.md`
|
||||
5. `resume_builder/support/pub_metadata.md`
|
||||
|
||||
**Present one table per position:**
|
||||
|
||||
**[Position Name] (Budget: N-M bullets, ~X-Y rendered lines)**
|
||||
|
||||
| | ID | Achievement | Variant | Lines | JD Match |
|
||||
|---|---|-------------|---------|-------|----------|
|
||||
| * | P1-1 | [short description] | 2L | 2 | Direct |
|
||||
| * | P1-5 | [short description] | 2L | 2 | Direct |
|
||||
| o | P1-3 | [short description] | 2L | 2 | Bridge |
|
||||
| x | P1-7 | [short description] | -- | -- | Weak |
|
||||
|
||||
**Legend:** `*` = recommended (HIGH on Priority Matrix + Direct JD match) | `o` = available (MEDIUM priority or Bridge match) | `x` = not recommended (LOW priority or Gap)
|
||||
|
||||
**After all positions, show:**
|
||||
- Recommended set total vs budget (from Quick Budget Card in resume_reference.md)
|
||||
- Remaining budget slots and what could fill them
|
||||
- Forced exclusions per provenance flags
|
||||
- Focus directive impact (what changed vs Priority Matrix defaults)
|
||||
- CV: confirm first bullet of first experience is 2L (page 1 rule)
|
||||
|
||||
**Update session file** — write Bullet Plan tables. Status: `Phase 1: DONE (N bullets confirmed)`
|
||||
|
||||
Progress: "Reading experience files for bullet candidates..." / "Recommending N bullets per position"
|
||||
|
||||
### >>>>>> MANDATORY STOP — DO NOT PROCEED <<<<<<
|
||||
Present bullet plan. Wait for user to confirm/modify selections.
|
||||
**You MUST wait for the user's explicit text response before continuing.**
|
||||
If you proceed without confirmation, you will generate bullets the user didn't approve.
|
||||
**Update session file with confirmed plan before continuing.**
|
||||
|
||||
---
|
||||
|
||||
## Budget Gate (AFTER user confirms bullet plan, BEFORE Phase 2)
|
||||
|
||||
**Re-read session file Bullet Plan section** to verify confirmed counts.
|
||||
|
||||
- Check budget targets from `resume_builder/reference/resume_reference.md` Budget Card.
|
||||
- Show: `Budget: [N] bullets vs target [T]. PASS/FAIL`
|
||||
- **FAIL = do not proceed. Reconcile with user first.**
|
||||
|
||||
---
|
||||
|
||||
## Phase 2: Generate
|
||||
|
||||
**Re-read to restore context after compaction:**
|
||||
1. `output/<FolderName>/session_<name>.md` (framing + confirmed bullet plan)
|
||||
2. `resume_builder/reference/critical_rules.md` — Character Limits, Bold Width Penalty, Orphan rules
|
||||
3. `resume_builder/support/ai_fingerprint_rules.md` — Banned words, structural rules, post-gen checklist
|
||||
|
||||
**Read template:** `resume_builder/templates/resume_template.tex` or `cv_template.tex` + `.cls`
|
||||
FIXED sections (from `config.md` FIXED Sections) are template-locked — only generate VARIABLE sections (Summary, Skills, Experience bullets/headers).
|
||||
|
||||
**Read section specs:** `resume_builder/reference/resume_reference.md` — Section-by-Section Specs for your format
|
||||
|
||||
**Generate section by section** (follow Section-by-Section Specs):
|
||||
1. Summary → check against session framing strategy
|
||||
- Update Status → `Phase 2: Summary DONE`
|
||||
2. Technical Skills
|
||||
- Update Status → `Phase 2: Skills DONE`
|
||||
3. Each position's bullets → **CHAR COUNT GATE after each position**
|
||||
- Position titles: bold theme + date must fit ONE line (see resume_reference.md). If wrapping, shorten title.
|
||||
- After each position: Update Status → `Phase 2: [Position] DONE`
|
||||
4. **PAGE FILL GATE after all experience**
|
||||
|
||||
Save .tex to `output/<FolderName>/e2e_<name>_resume.tex` or `_cv.tex`
|
||||
|
||||
**Update session file** — add Output Files.
|
||||
|
||||
Progress: "Writing Position 1 bullets (6 of 7)..." / "Bullet 4 is SHORT at 184 chars — padding" / "Compiling resume... 2 pages OK"
|
||||
|
||||
### CHAR COUNT GATE (per position)
|
||||
```bash
|
||||
python3 resume_builder/helpers/char_count.py -f [resume|cv] output/<FolderName>/[file].tex
|
||||
```
|
||||
No OVER violations. Last line of 2L bullets >= 70% fill. **Fix before next position.**
|
||||
|
||||
### PAGE FILL GATE
|
||||
Resume: <= 3 lines white space on last page. CV: check rendered line target from resume_reference.md. **If FAIL: add/trim variable bullets.**
|
||||
|
||||
### COMPILE GATE
|
||||
```bash
|
||||
pdflatex -interaction=nonstopmode -output-directory=output/<FolderName> output/<FolderName>/e2e_<name>_resume.tex
|
||||
```
|
||||
Verify page counts match `config.md` Document Preferences. Use the Read tool to view compiled PDF — check orphans, header wrapping, page fill. **If FAIL: fix variable content, recompile.**
|
||||
|
||||
Run the Post-Generation Verification checklist from `resume_builder/reference/resume_reference.md` before proceeding.
|
||||
|
||||
Update Status → `Phase 2: Compile DONE`
|
||||
|
||||
---
|
||||
|
||||
## End of /make-resume
|
||||
|
||||
Update session file Status:
|
||||
- `Resume: DONE`
|
||||
- `Cover Letter: PENDING`
|
||||
- `Critique: PENDING`
|
||||
- `Next: /make-cl output/<FolderName>/session_<name>.md`
|
||||
- `Next Critique: /critique output/<FolderName>/session_<name>.md`
|
||||
|
||||
### >>>>>> MANDATORY STOP <<<<<<
|
||||
Present: resume compilation summary (pages, char count results, any violations fixed).
|
||||
**You MUST wait for the user's explicit text response before continuing.**
|
||||
|
||||
"Resume compiled and verified. Next steps:
|
||||
1. /clear
|
||||
2. [exact /make-cl command with session file path]"
|
||||
This shared file is the only workflow implementation for both agents. Preserve existing user authorization and resume from the application's recorded state.
|
||||
@@ -1,329 +1,11 @@
|
||||
---
|
||||
description: Synthesize completed extractions into the knowledge base files needed for resume generation
|
||||
name: setup-build-kb
|
||||
description: Build or update the resume knowledge base from structured extractions. Use to normalize employment evidence, maintain the canonical claims registry, add achievements with ownership and metric status, update evidence-tiered skills and role bundles, propagate corrections, and validate the full resume system.
|
||||
user-invocable: true
|
||||
---
|
||||
|
||||
# /setup-build-kb
|
||||
# Shared project workflow
|
||||
|
||||
**User input:** `$ARGUMENTS`
|
||||
Read and follow [the setup-build-kb workflow](../../../resume_builder/reference/workflows/setup-build-kb.md) before doing this task. Resolve project paths from the repository root.
|
||||
|
||||
Parse `$ARGUMENTS`:
|
||||
- Empty → full build (all phases)
|
||||
- Phase number (e.g., `3`) → resume from that phase
|
||||
- "experience" / "bundles" / "skills" / "pubs" / "reframing" / "significance" → run only that component
|
||||
- "status" → show what's built and what's missing
|
||||
|
||||
---
|
||||
|
||||
## Startup
|
||||
|
||||
1. Read `CLAUDE.md` — check KB Corrections Log
|
||||
2. Read `config.md` — load:
|
||||
- Personal Info (positions, institutions, dates)
|
||||
- Role Types table (defines which bundles to create)
|
||||
- Provenance Flags (propagate to all KB files)
|
||||
- Document Preferences (bullet variant defaults)
|
||||
3. Read `knowledge_base/extractions/_INVENTORY.md` — verify extractions exist
|
||||
4. Scan `resume_builder/` to see what's already built
|
||||
|
||||
**Pre-flight check:**
|
||||
- If `_INVENTORY.md` is empty or has no entries: "No extractions found. Run `/setup-extract` first." Stop.
|
||||
- If fewer than 2 extractions: warn "Only [N] extraction(s) found. KB quality improves with more papers. Continue anyway?"
|
||||
|
||||
Progress: "Found [N] extractions across [M] positions. Config has [K] role types defined."
|
||||
|
||||
---
|
||||
|
||||
## Phase 1: Build Experience Files
|
||||
|
||||
**Goal:** Create one experience file per position, containing all achievements organized for resume generation.
|
||||
|
||||
**Read:** All extraction files listed in `_INVENTORY.md`
|
||||
|
||||
**For each position** (from `config.md` or inferred from extraction metadata):
|
||||
|
||||
1. Group extractions by the position they belong to (based on dates, institution, or user clarification)
|
||||
2. Ask the user to confirm grouping if ambiguous: "I've grouped these papers under [Position]. Correct?"
|
||||
|
||||
**Experience file format** (`resume_builder/experience/experience_<position_key>.md`):
|
||||
|
||||
```markdown
|
||||
# Experience: [Position Title] — [Institution]
|
||||
## [Date Range]
|
||||
|
||||
### Cross-Position Section
|
||||
[Brief narrative connecting this position's work to the user's broader trajectory]
|
||||
[CL framing content — how this position fits the career arc]
|
||||
|
||||
---
|
||||
|
||||
### Achievement [ID]: [Short Title]
|
||||
**Source:** [extraction filename]
|
||||
**Paper:** [citation or "internal"/"unpublished"]
|
||||
**User's role:** [first author / contributing / sole developer]
|
||||
**Status:** [published / under review / draft / internal]
|
||||
|
||||
**Context:** [1-2 sentences — what problem, why it matters]
|
||||
|
||||
**Bullet variants:**
|
||||
- **2L:** [Full 2-line bullet text — STAR format, ~180-210 rendered characters]
|
||||
- **3L:** [Full 3-line bullet text — for CV use, ~270-310 rendered characters]
|
||||
- **1L:** [Condensed 1-line version — ~90-110 rendered characters, for tight budgets]
|
||||
|
||||
**Key skills:** [comma-separated list of skills this achievement demonstrates]
|
||||
**ATS keywords:** [domain-specific terms an ATS might scan for]
|
||||
**Reframing notes:** [how to emphasize different aspects for different role types]
|
||||
|
||||
---
|
||||
[Repeat for each achievement]
|
||||
```
|
||||
|
||||
### >>>>>> MANDATORY STOP — DO NOT PROCEED <<<<<<
|
||||
Present the experience file(s) — show achievement count per position, total bullet variants.
|
||||
Ask user to review: "Are the groupings correct? Any achievements missing or misattributed?"
|
||||
**You MUST wait for the user's explicit text response before continuing.**
|
||||
|
||||
---
|
||||
|
||||
## Phase 2: Build Skills Taxonomy
|
||||
|
||||
**Goal:** Create a categorized inventory of all technical skills from extractions.
|
||||
|
||||
**Read:** All extraction files (Methods & Tools sections) + experience files from Phase 1
|
||||
|
||||
**Build** `resume_builder/support/skills_taxonomy.md`:
|
||||
|
||||
```markdown
|
||||
# Skills Taxonomy
|
||||
|
||||
## Summary Stats
|
||||
- Total unique skills: [N]
|
||||
- Publications: [N] ([breakdown by status])
|
||||
- Top methods: [ranked list]
|
||||
|
||||
## Categories
|
||||
|
||||
### [Category 1: e.g., Computational Methods]
|
||||
| Skill | Proficiency | Evidence | Resume Weight |
|
||||
|-------|-----------|----------|---------------|
|
||||
| [skill] | [expert/proficient/familiar] | [paper IDs] | [HIGH/MED/LOW] |
|
||||
|
||||
### [Category 2: e.g., Programming & Software]
|
||||
[same table format]
|
||||
|
||||
### [Category 3: e.g., Machine Learning]
|
||||
[same table format]
|
||||
|
||||
[Continue for all categories — typically 4-7 categories]
|
||||
```
|
||||
|
||||
**Proficiency levels:**
|
||||
- **Expert:** Multiple first-author papers, developed custom tools
|
||||
- **Proficient:** Used extensively in published work, comfortable teaching
|
||||
- **Familiar:** Used in one project, or contributed to someone else's implementation
|
||||
|
||||
Progress: "Built taxonomy — [N] skills across [M] categories"
|
||||
|
||||
---
|
||||
|
||||
## Phase 3: Build Publication Metadata
|
||||
|
||||
**Goal:** Structured pub data for resume/CV generation.
|
||||
|
||||
**Build** `resume_builder/support/pub_metadata.md`:
|
||||
|
||||
```markdown
|
||||
# Publication Metadata
|
||||
|
||||
## Summary
|
||||
- Total publications: [N]
|
||||
- First-author: [N] | Co-first: [N] | Contributing: [N]
|
||||
- Published: [N] | Under review: [N] | In preparation: [N]
|
||||
|
||||
## Publication List
|
||||
|
||||
### First-Author / Co-First
|
||||
| # | Citation (et al. format) | Journal | Year | Status | Key Topic |
|
||||
|---|-------------------------|---------|------|--------|-----------|
|
||||
| 1 | [Author et al., Journal, Year] | [journal] | [year] | [status] | [topic] |
|
||||
|
||||
### Contributing Author
|
||||
[same table format]
|
||||
|
||||
### Under Review / In Preparation
|
||||
[same table format, with provenance notes]
|
||||
```
|
||||
|
||||
Progress: "Pub metadata — [N] first-author, [M] contributing, [K] under review"
|
||||
|
||||
---
|
||||
|
||||
## Phase 4: Build Achievement Reframing Guide
|
||||
|
||||
**Goal:** Per-achievement significance lines + framing directives for each role type.
|
||||
|
||||
**Read:** Experience files + `config.md` Role Types
|
||||
|
||||
**Build** `resume_builder/support/achievement_reframing_guide.md`:
|
||||
|
||||
```markdown
|
||||
# Achievement Reframing Guide
|
||||
|
||||
## How to Use
|
||||
For each achievement, `Significance:` provides a one-line framing cue.
|
||||
The role-type table shows how to emphasize/de-emphasize for each target audience.
|
||||
|
||||
---
|
||||
|
||||
### [Achievement ID]: [Title]
|
||||
**Significance:** [One sentence — why this matters broadly]
|
||||
|
||||
| Role Type | Emphasis | Lead Verb | Framing Angle |
|
||||
|-----------|----------|-----------|---------------|
|
||||
| [role 1] | HIGH | Developed | [emphasize X aspect] |
|
||||
| [role 2] | MEDIUM | Applied | [bridge to Y domain] |
|
||||
| [role 3] | LOW | -- | [omit or condense] |
|
||||
|
||||
**Overclaiming warning:** [if applicable — e.g., "Do not claim sole credit for experimental results"]
|
||||
**First-pass checklist:** [ ] Verb matches author role [ ] Numbers from paper [ ] Status matches provenance
|
||||
|
||||
---
|
||||
[Repeat for each achievement]
|
||||
```
|
||||
|
||||
### >>>>>> MANDATORY STOP — DO NOT PROCEED <<<<<<
|
||||
Present the reframing guide summary — show which achievements are HIGH for which role types.
|
||||
Ask user: "Does this priority mapping look right for your target roles?"
|
||||
**You MUST wait for the user's explicit text response before continuing.**
|
||||
|
||||
---
|
||||
|
||||
## Phase 5: Build Bundles
|
||||
|
||||
**Goal:** One bundle per role type from `config.md`, with 5 sections each.
|
||||
|
||||
**Read:** Experience files + Skills Taxonomy + Reframing Guide + `config.md` Role Types
|
||||
|
||||
**For each role type**, create `resume_builder/bundles/bundle_<role_type>.md`:
|
||||
|
||||
```markdown
|
||||
# Bundle: [Role Type Name]
|
||||
|
||||
> Target employers: [from config.md]
|
||||
> Tier: [from config.md]
|
||||
|
||||
---
|
||||
|
||||
## S1: Role Profile & Priority Matrix
|
||||
|
||||
**Positioning:** [1-2 sentences — how to position the user for this role type]
|
||||
|
||||
### Priority Matrix
|
||||
| Priority | Achievement IDs | Rationale |
|
||||
|----------|----------------|-----------|
|
||||
| HIGH | [IDs] | [why these lead for this role type] |
|
||||
| MEDIUM | [IDs] | [supporting evidence, bridge topics] |
|
||||
| LOW | [IDs] | [omit unless budget allows or JD specifically asks] |
|
||||
|
||||
---
|
||||
|
||||
## S2: Summary Guide
|
||||
|
||||
**Headline pattern:** [Role-appropriate headline template]
|
||||
**Building blocks:** [3-5 phrases that should appear in summaries for this role type]
|
||||
**Avoid:** [terms/framings that don't fit this audience]
|
||||
|
||||
---
|
||||
|
||||
## S3: Achievement Reframing Map
|
||||
|
||||
[For each HIGH/MEDIUM achievement: which angle to use, which metrics to lead with]
|
||||
|
||||
| ID | Default Framing | This Role's Framing | Key Metric |
|
||||
|----|----------------|--------------------|-----------|
|
||||
| [ID] | [generic] | [role-specific angle] | [number to highlight] |
|
||||
|
||||
---
|
||||
|
||||
## S4: Skills Guide
|
||||
|
||||
**Bold tools (resume):** [3-5 tools to bold in Technical Skills for this role type]
|
||||
**Must-include skills:** [skills that MUST appear for ATS match]
|
||||
**Nice-to-have:** [skills to include if budget allows]
|
||||
**Omit:** [skills irrelevant to this audience]
|
||||
|
||||
---
|
||||
|
||||
## S5: Cover Letter Guide
|
||||
|
||||
**Institution type:** [Industry / National Lab / Academic]
|
||||
**Opening hook pattern:** [template for first paragraph opener]
|
||||
**Key narrative thread:** [what story to tell across paragraphs]
|
||||
**"Why them" angle:** [what to research about target employer]
|
||||
**Avoid:** [CL anti-patterns for this role type]
|
||||
```
|
||||
|
||||
Progress: "Building bundle for [role type] — [N] HIGH priority achievements, [M] bold tools"
|
||||
|
||||
---
|
||||
|
||||
## Phase 6: Build Significance Research Files
|
||||
|
||||
**Goal:** Field context for cover letters — NOT for resume bullets.
|
||||
|
||||
**For each position**, create `resume_builder/support/significance_<position_key>.md`:
|
||||
|
||||
```markdown
|
||||
# Significance Research: [Position]
|
||||
|
||||
> Use in cover letters and summaries — NOT in resume bullet text.
|
||||
> These provide field context that demonstrates the user understands the landscape.
|
||||
|
||||
---
|
||||
|
||||
### [Achievement ID]: Field Context
|
||||
**The problem:** [What challenge does this address? Industry/scientific context]
|
||||
**Competing approaches:** [What else exists? What are the limitations?]
|
||||
**Why this matters:** [Market size, DOE/funding priorities, industry need]
|
||||
**Differentiation:** [What makes the user's approach unique or better?]
|
||||
|
||||
---
|
||||
[Repeat for each major achievement worth cover-letter depth]
|
||||
|
||||
### Field Overview: [Broad Topic]
|
||||
[2-3 paragraphs of field context that multiple achievements contribute to]
|
||||
[Useful for cover letter opening hooks and "why this matters" framing]
|
||||
```
|
||||
|
||||
Progress: "Significance research — [N] achievements with field context, [M] field overviews"
|
||||
|
||||
---
|
||||
|
||||
## Final: Status Report
|
||||
|
||||
After all phases complete (or after the requested subset), present:
|
||||
|
||||
### KB Build Status
|
||||
| Component | File | Status | Items |
|
||||
|-----------|------|--------|-------|
|
||||
| Experience files | `experience/*.md` | [DONE/MISSING] | [N achievements] |
|
||||
| Skills taxonomy | `support/skills_taxonomy.md` | [DONE/MISSING] | [N skills] |
|
||||
| Pub metadata | `support/pub_metadata.md` | [DONE/MISSING] | [N pubs] |
|
||||
| Reframing guide | `support/achievement_reframing_guide.md` | [DONE/MISSING] | [N entries] |
|
||||
| Bundles | `bundles/bundle_*.md` | [DONE/MISSING] | [N bundles] |
|
||||
| Significance | `support/significance_*.md` | [DONE/MISSING] | [N files] |
|
||||
|
||||
### Ready for Generation?
|
||||
- [ ] At least 1 experience file with 5+ achievements
|
||||
- [ ] Skills taxonomy with 20+ skills
|
||||
- [ ] At least 1 bundle matching a target role type
|
||||
- [ ] Pub metadata complete
|
||||
- [ ] Reframing guide covers all achievements
|
||||
- [ ] Significance files for cover letter depth
|
||||
|
||||
If all checked: "Knowledge base is ready. Save a JD to `JDs/` and run `/make-resume JDs/<filename>.txt`"
|
||||
If gaps: "[List what's missing and which phase to re-run]"
|
||||
|
||||
### >>>>>> MANDATORY STOP <<<<<<
|
||||
Present status report. Wait for user confirmation.
|
||||
**You MUST wait for the user's explicit text response before continuing.**
|
||||
This shared file is the only workflow implementation for both agents. Preserve existing user authorization and resume from the application's recorded state.
|
||||
@@ -1,170 +1,11 @@
|
||||
---
|
||||
description: Extract structured information from research papers, PDFs, or code into knowledge base extractions
|
||||
name: setup-extract
|
||||
description: Extract source-grounded career evidence from papers, employment records, project documents, and notes into structured knowledge-base files without promoting inference to fact.
|
||||
user-invocable: true
|
||||
---
|
||||
|
||||
# /setup-extract
|
||||
# Shared project workflow
|
||||
|
||||
**User input:** `$ARGUMENTS`
|
||||
Read and follow [the setup-extract workflow](../../../resume_builder/reference/workflows/setup-extract.md) before doing this task. Resolve project paths from the repository root.
|
||||
|
||||
Parse `$ARGUMENTS`:
|
||||
- File path to a paper (e.g., `papers/Smith2024_catalyst.pdf`, `papers/project_report.tex`) → read that file
|
||||
- Multiple paths separated by spaces → batch mode (process each sequentially)
|
||||
- Empty → ask the user for the paper path or paste content
|
||||
|
||||
---
|
||||
|
||||
## Startup
|
||||
|
||||
1. Read `CLAUDE.md` — check KB Corrections Log for known issues
|
||||
2. Read `config.md` — load Personal Info (to identify user's author position), Provenance Flags
|
||||
3. Read `knowledge_base/extractions/_INVENTORY.md` — see what's already extracted, avoid duplicates
|
||||
|
||||
If the paper is already in the inventory:
|
||||
- Show the existing extraction path
|
||||
- Ask: "This paper is already extracted. Re-extract (overwrite) or skip?"
|
||||
- Wait for user response before proceeding
|
||||
|
||||
---
|
||||
|
||||
## Phase 1: Read & Understand the Paper
|
||||
|
||||
Read the paper using the appropriate method:
|
||||
- **PDF files:** Use the Read tool (supports PDF reading)
|
||||
- **.tex source:** Read directly — often has more detail than the compiled PDF
|
||||
- **If both exist:** Prefer .tex for content extraction, use PDF for figures/tables
|
||||
|
||||
**While reading, collect:**
|
||||
1. Full title, all authors, year, journal/venue, DOI (if available)
|
||||
2. The user's position in the author list (first, co-first, second, middle, last, corresponding)
|
||||
3. Publication status (check `config.md` Provenance Flags first, then infer: published / under review / draft / internal)
|
||||
4. All computational methods, experimental techniques, software, and frameworks mentioned
|
||||
5. Quantitative results — speedups, accuracies, efficiencies, improvements over baselines
|
||||
6. Novelty claims — "first-ever", "new framework", "novel approach", etc.
|
||||
7. Collaboration indicators — other groups, institutions, shared resources
|
||||
8. Funding acknowledgments
|
||||
|
||||
Progress: "Reading paper... [title] by [first author] et al., [year]"
|
||||
|
||||
---
|
||||
|
||||
## Phase 2: Clarify User's Role
|
||||
|
||||
If the user's contribution is not obvious from the paper (common for multi-author work), ask:
|
||||
|
||||
**Questions to ask (skip any that are already clear from the paper):**
|
||||
1. "What was your specific contribution? (e.g., all computational work, specific analysis, code development)"
|
||||
2. "Did you develop any tools, methods, or code used in this paper?"
|
||||
3. "Were there other groups or institutions involved? What was your group's role?"
|
||||
4. "Any quantitative results you can personally claim? (e.g., 'I ran all the simulations')"
|
||||
5. "Is there anything in this paper that should NOT appear on your resume? (e.g., collaborator's experimental data)"
|
||||
|
||||
### >>>>>> MANDATORY STOP — DO NOT PROCEED <<<<<<
|
||||
Present your understanding of the paper and ask the clarifying questions above.
|
||||
**You MUST wait for the user's explicit text response before continuing.**
|
||||
|
||||
---
|
||||
|
||||
## Phase 3: Write Extraction
|
||||
|
||||
Create the extraction file at `knowledge_base/extractions/<AuthorYear_short_descriptor>.md`
|
||||
|
||||
**Naming convention:** `<FirstAuthorLastName><Year><2-3_word_descriptor>.md`
|
||||
- Examples: `Smith2024_protein_stability.md`, `Chen2023_binding_affinity.md`
|
||||
- If the user is first author: use their last name
|
||||
- Normalize to lowercase with underscores
|
||||
|
||||
**Extraction format:**
|
||||
|
||||
```markdown
|
||||
# [Full Paper Title]
|
||||
|
||||
## Metadata
|
||||
- **Authors:** [author list — highlight user's name with bold]
|
||||
- **Year:** [year]
|
||||
- **Journal:** [journal/venue or "unpublished"/"internal"/"under review at X"]
|
||||
- **DOI:** [DOI or "N/A"]
|
||||
- **User's role:** [first author / co-first / contributing / corresponding]
|
||||
- **Status:** [published | under review | draft | internal]
|
||||
|
||||
## Methods & Tools
|
||||
- **Computational methods:** [e.g., MD, ML, FEA, CFD, etc. — be specific about methods, force fields, etc.]
|
||||
- **Software/frameworks:** [e.g., GROMACS, PyTorch, ABAQUS, custom code, etc.]
|
||||
- **Hardware/HPC:** [if mentioned — clusters, GPU resources, etc.]
|
||||
- **Key techniques:** [specific methodological details that map to resume skills]
|
||||
|
||||
## Key Results
|
||||
[Number each result. Include quantitative metrics wherever possible.]
|
||||
1. [Result with numbers — e.g., "Achieved 5,000x speedup over brute-force screening"]
|
||||
2. [Result — e.g., "Screened 8,500 variants, identified 7 top candidates"]
|
||||
3. [...]
|
||||
|
||||
## Novelty Claims
|
||||
[What's genuinely new — be precise, avoid overclaiming]
|
||||
- [e.g., "First application of framework X to system Y"]
|
||||
- [e.g., "New method combining A and B — no prior work exists"]
|
||||
|
||||
## Collaboration & Scope
|
||||
- **Other groups:** [institutions, PIs involved]
|
||||
- **User's specific contribution:** [from Phase 2 clarification]
|
||||
- **Shared vs. sole work:** [what the user did alone vs. with others]
|
||||
|
||||
## Provenance Notes
|
||||
- **Publication status:** [matches config.md if listed there]
|
||||
- **Safe to claim:** [what the user can put on a resume without hedging]
|
||||
- **Needs hedging:** [claims that require "contributed to" or "supported" framing]
|
||||
- **Do NOT claim:** [results from collaborators, claims that would be overclaiming]
|
||||
|
||||
## Resume Bullet Seeds
|
||||
[3-5 draft bullets in STAR format. These are seeds, not final text.]
|
||||
[Use full-ownership verbs only for sole-contributor work. Hedge for shared work.]
|
||||
1. [Action verb] + [what was done] + [quantitative result/impact]
|
||||
2. [Action verb] + [method/tool developed] + [what it enabled]
|
||||
3. [Action verb] + [scope — e.g., "across N systems"] + [outcome]
|
||||
4. [Optional: collaboration-framed bullet]
|
||||
5. [Optional: tool/infrastructure bullet]
|
||||
```
|
||||
|
||||
Save the file. Show the user the complete extraction.
|
||||
|
||||
Progress: "Writing extraction for [short title]... [N] results identified, [M] bullet seeds drafted"
|
||||
|
||||
---
|
||||
|
||||
## Phase 4: Update Inventory
|
||||
|
||||
Read and update `knowledge_base/extractions/_INVENTORY.md`.
|
||||
|
||||
Add a row to the inventory table:
|
||||
|
||||
```
|
||||
| [filename] | [short title] | [user's role] | [status] | [primary methods] | [date extracted] |
|
||||
```
|
||||
|
||||
Present the updated inventory entry to the user.
|
||||
|
||||
---
|
||||
|
||||
## Phase 5: Next Steps
|
||||
|
||||
After extraction is complete, present:
|
||||
|
||||
1. **Extraction summary:** [N] methods, [M] quantitative results, [K] bullet seeds
|
||||
2. **Provenance flags:** Any items that need special handling
|
||||
3. **Suggested next action:**
|
||||
- If more papers to extract: "Run `/setup-extract [next paper path]`"
|
||||
- If all papers done: "Run `/setup-build-kb` to synthesize extractions into experience files and bundles"
|
||||
|
||||
### >>>>>> MANDATORY STOP <<<<<<
|
||||
Present extraction summary. Wait for user feedback or next paper.
|
||||
**You MUST wait for the user's explicit text response before continuing.**
|
||||
|
||||
---
|
||||
|
||||
## Batch Mode
|
||||
|
||||
If `$ARGUMENTS` contains multiple file paths:
|
||||
1. Process each paper through Phases 1-4 sequentially
|
||||
2. Ask Phase 2 clarifying questions for ALL papers at once (grouped) before writing any extractions
|
||||
3. After all extractions: present combined inventory update and summary
|
||||
4. Single STOP at the end (not per paper)
|
||||
This shared file is the only workflow implementation for both agents. Preserve existing user authorization and resume from the application's recorded state.
|
||||
+11
@@ -29,6 +29,11 @@ job_scout/state/*
|
||||
# application_cohort.json — cohort slot tracker (core/adjacent/stretch mix)
|
||||
!job_scout/state/decisions.json
|
||||
!job_scout/state/application_cohort.json
|
||||
!job_scout/state/applications.json
|
||||
!job_scout/state/employer_reputation.json
|
||||
!job_scout/state/history/
|
||||
job_scout/state/history/*
|
||||
!job_scout/state/history/application_status_before_2026-09-11.json
|
||||
|
||||
# One-off job-board data pulls (debug artifacts)
|
||||
*_jd.json
|
||||
@@ -52,3 +57,9 @@ job_scout/*_verify.txt
|
||||
|
||||
# Scratch/temp working files
|
||||
tmp/
|
||||
|
||||
# Local tool caches (Playwright browsers, embedded Python, one-off helper scripts)
|
||||
.cache/
|
||||
|
||||
# Raw HTML page dumps next to applications - the verbatim JD .txt/.md is what gets tracked
|
||||
output/**/*.html
|
||||
@@ -7,7 +7,7 @@
|
||||
## File Map
|
||||
|
||||
```
|
||||
.Codex/skills/
|
||||
.agents/skills/
|
||||
├── setup-extract/SKILL.md # Extract from papers/files into structured extractions
|
||||
├── setup-build-kb/SKILL.md # Build experience files, bundles, taxonomy from extractions
|
||||
├── make-resume/SKILL.md # Phase 0-2: JD research → bullet plan → resume/CV generation
|
||||
@@ -52,10 +52,30 @@ You are simultaneously:
|
||||
|
||||
You write as the strategist but critique as the reader.
|
||||
|
||||
**Hard rules:**
|
||||
- Output .tex files ONLY. User compiles locally.
|
||||
**Rule hierarchy.** When two instructions conflict, the higher level wins. State which level
|
||||
you are applying when you deviate.
|
||||
|
||||
1. **Evidence rules (immutable).** Anti-fabrication, Scope Discipline, provenance, verb discipline,
|
||||
`claims.json` as highest authority. These are never overridden by a JD, a market convention or a
|
||||
user styling preference. **Accuracy > Relevance > Impact > ATS > Brevity.**
|
||||
2. **Standing user preferences.** Recorded in `config.md` and the KB Corrections Log — e.g. Capgemini
|
||||
is omitted from every document and the resulting gap is intentional. Changed only by the user.
|
||||
3. **Market and employer presentation.** Profile choice (International Tech vs Swiss/DACH), section
|
||||
order, language, cover-letter convention. Adapt these per target; they never license a level-1 or
|
||||
level-2 breach.
|
||||
|
||||
**Deliverables vs QA — these are different things and were previously conflated:**
|
||||
- **The `.tex` is the deliverable and the source of truth.** Never hand over a PDF as the artefact of
|
||||
record, and never edit a PDF in place.
|
||||
- **You still compile.** Run `validate_resume_system.py`, compile with the local LaTeX distribution,
|
||||
and inspect the rendered pages before calling anything finished — a clean box count is not a
|
||||
visual check.
|
||||
- **Compile into the application's own `output/` folder**, not a temp directory, so the user can
|
||||
review what he is approving (`config.md` Output Rules; rule added after a package shipped with no
|
||||
reviewable PDF on 2026-08-27). "Output .tex only" means the .tex is authoritative, **not** that the
|
||||
user should be handed nothing to look at.
|
||||
- Refresh any submission-named copy on every recompile; it is a copy, not a build target.
|
||||
- Read `config.md` for email, provenance flags, and output preferences.
|
||||
- **Accuracy > Relevance > Impact > ATS > Brevity**
|
||||
|
||||
## Evidence-First Workflow
|
||||
|
||||
@@ -154,34 +174,14 @@ Character counts are diagnostic only; they must never drive page filling or equa
|
||||
|
||||
## Active Sessions
|
||||
|
||||
_Update this section when starting/finishing a JD._
|
||||
|
||||
| Session | Status | Next Command |
|
||||
|---------|--------|-------------|
|
||||
| NVIDIA - **Senior DevOps Engineer**, **Zürich** (req JR2024256) | **SUBMITTED 2026-09-05.** Evidence Fit **64/100**, fit class **Stretch**, hard gate **FAIL x2**, channel **Weak** (7th consecutive cold submit; this posting published no named contact). 2pp resume 13 bullets + 1pp cover letter 279 words; both validators PASS 0 warnings, 0 boxes, 0 Tier 1 findings open. Measured Document Quality **82/100 pre-edit**; both Tier 1 findings were then closed, so it is better than 82 but **not re-measured - never quote a post-edit estimate as a score**. Submitted on an explicit user override. ⚠ **Hybrid vs 5-day onsite was never resolved before sending** - now a live screening topic, not pre-cleared. Thun→Zürich is ~1h50 each way. Comp is *not* a risk (levels.fyi Greater Zürich IC3 median ≈ CHF 204k). Honest gaps named in the letter: on-prem networking (0 canonical) and that employer-side Linux/Ansible ended Dec 2022, with only the personal `PP-3` server carrying currency. | Await response. **Raise the working model at first contact** - a 5-day-onsite seat would be a late no. |
|
||||
| SBB - **Data Engineer (m/w/d)**, Asset Management Infrastrukturanlagen, **Bern** (Job ID 103755) | ⭐ **INTERVIEW INVITED 2026-08-28 - 9. September 2026, 08:30, 45 Min, MS Teams. The only live interview in the log.** Stage **2 of 4** per the posting: *"Virtuelles Kennenlernen mit HR und Fuehrungskraft"*, so **HR together with Andri Wienandts**, not a pure HR screen. Brief: `output/SBB_DataEngineer_AssetMgmt/interview_brief_sbb_2026-09-09.md`. **First conversion of the evidence-first cohort** (6 applications, 2 rejections) and it came from a **COLD submit** - the warm contact printed on the posting was never called. The resume never contained **Snowflake, dbt or Power BI**, the literals an ATS screen would key on, and it still got through: a human read it and the honest-substitution framing held. One data point, do not over-read it. Submitted 2026-08-25, Core, Evidence Fit **79/100**, hard gate PASS, Document Quality **92/100**, no cover letter (SBB waives it). Best practical fit in the log: Bern, German-language, no relocation, EU + B permit. **Four unresolved items, now live call topics:** Anforderungsniveau **K** band (capped GAV, not public, likely below the 180k bar); the seat reads **lateral or below** current Staff + Component Owner scope (the declined-BKW shape); **RAMSI** Java/Spring Boot/Angular is a full responsibility line on a historical/absent stack; Kidz Care scales on gross household income. Gaps to answer honestly: Snowflake, dbt, Argo, Helm, Power BI, Spring Boot, Angular - survivable only because the JD says "z. B.". Thesis stays a **methods prototype**: no operational data, no accuracy figures, PSO surveyed only. | **Decide before 9.9.:** what he does if K lands at 130-150k, if architecture is set elsewhere, or if RAMSI is heavily Angular. Any one can be a no - better decided in advance than improvised on camera. |
|
||||
| RUAG C5I - **AI Engineer C5I**, **Thun** (application ID 18027) | **SUBMITTED 2026-08-27** via jobs.ruag.ch (portal only). Evidence Fit **74/100**, fit class **Stretch**, hard gate **FAIL** (R1/R2, the title-defining responsibilities, are Adjacent not Direct), Document Quality **93/100** after a critique-and-fix round, channel **Weak/cold**. German CV 2 pages/13 bullets + motivation letter 1 page/295 words; validators PASS, 0 boxes, visual QA clean. (Cohort slot language here is historical: the **7/2/1 caps were dropped 2026-09-05** - see `application_strategy.md`.) Positioning is his canonical title Staff Data, Analytics & AI Engineer; `PP-3` carries current Linux/hardening evidence and `SW-5` ties DevSecOps to C5I's stated model. The letter names the AI-platform gap in one sentence. Honest gaps: no AI/LLM platform, no compute/GPU cluster, no RAG/retrieval, ML/AI frameworks certification-context only. **Compensation, PSP/project eligibility and level were never resolved and are now live screening topics.** Marco Heinzen's published direct line was never used. **If rejected, do not drop RUAG** - **Senior DevOps Engineer C5I** is shortlisted and fits better (still live on the board 2026-09-04). The **Data Lakehouse / Senior Data Platform Engineer** req was a title-match prior the JD does not support: reposted 2026-09-04 as **Senior Data Engineer (MSSQL)**, requiring on-prem MSSQL/Talend/SAP S/4HANA - 0 canonical each - and **ruled out**. | Await response; optional calls to Marco Heinzen (scope/level) and Frank Haugwitz (comp/PSP). |
|
||||
| Schweizer Armee - **Kommando Cyber (Kdo Cy)**, DevOps Engineer III (Data Platform), **Zimmerwald** (Ref JRQ$540-19848) | **SUBMITTED 2026-08-27.** Evidence Fit **79/Core**, hard gate **PASS**, Document Quality **92/100**, channel **Weak**. German 2-page CV plus 1-page motivation letter; validators PASS, 0 boxes, visual QA clean. BW-1 surfaces the six-year Bundeswehr officer career. User explicitly accepted the critique's remaining BS-1 wording issue (*„ohne manuellen Eingriff“*) as good enough and submitted unchanged. Cohort evidence-first-2026-01 is now 5/10, Core 3/7. | Await response; optional post-submit call to Marcel Matthey-Doret about Lohnklasse, Engineer-III level and development path. |
|
||||
| Google - Software Engineer III, Business Home, Zurich (req 93922217108087494) | **CLOSED - NOT PROCEEDING 2026-07-28** (submitted 2026-07-27; Core, Evidence Fit 89/100, Document Quality 94/100; no interview). Rapid early-screen disposition; known risks were Mid-level versus current Staff scope, data/platform versus product-SWE positioning, preferred algorithms/accessibility gaps, and a cold channel. | Done - cohort rejection recorded; do not treat this outcome alone as a document-quality failure |
|
||||
| Microsoft — Principal Forward Deployed Engineer, SWE (German Speaking), Zürich (req 200043897) | **SUBMITTED 2026-07-27** (84.2/100 Pass 2; finalized 2-page resume + 1-page cover letter). Strong native-German, Staff progression, production ownership and enterprise-data-readiness case; honest gaps remain in end-to-end LLM delivery, Azure AI and strategic-account FDE experience. | Done — await response |
|
||||
| BIS Basel — Senior Data & Analytics Engineer, AI (jr100429, 3-yr term) | **SENT 2026-07-10** (80.5/100; deadline 2026-07-24; hybrid Basel, English-working intl org). Critique flags LLM-depth probe (integration/config vs. ownership) as the screening risk — prep honest answer before any call | Prep interview brief when screening lands |
|
||||
| NATO JWC Stavanger — Staff Officer, AI Engineer (2030 Digitalisation, G15, 3-yr PLN) | **SENT 2026-07-10** (77.5/100; deadline 2026-08-09; final interviews 2nd half Oct 2026). Borderline screen: Azure-cert "or equivalent", LLM depth, no current clearance; German national + officer service are the legibility assets. Tax-free NOK 93,933/mo + allowances | Await screening; no action until contact |
|
||||
| Microsoft — Senior SWE, Industry Solutions Engineering (ISE), Zürich (req 200040836) | **SENT 2026-07-03** (85.8/100 Pass 2; 2pp resume + 1pp CL; verbatim Eightfold JD; IC4 base CHF 146.2–245.9k; applied ~7 days after posting). Same-day build-to-critique-to-submit. Decisions.json logged as applied | Done — await response |
|
||||
| Kraken (Payward) — SRE, AI Agents (remote, CH-eligible) | **CLOSED — REJECTED 2026-06-17** (applied 2026-06-15 ~87.2/100, no interview). Honest gaps (NO Terraform/SRE-title/LangGraph) likely the filter; 4th Kraken req declined/rejected to date | Done |
|
||||
| Google — Senior Data Engineer (Merchant Data Science), Zürich/MV | **CLOSED — NOT PROCEEDING 2026-07-24** (applied 2026-06-15, 85.5/100; passed Google Hiring Assessment 2026-06-20, no interview). Assessment pass remains recorded separately. The official 90-day wait applies only to reapplying for the same job; different Google roles remain eligible, subject to 3 applications per rolling 30 days. | Done — target a different strong-fit Google req |
|
||||
| Snowflake — Sr SWE, Enterprise (Observe by Snowflake), Zürich | **SENT 2026-06-06** (~86/100; 2pp resume + 1pp CL; real Ashby JD; comp CHF 176–253k base; NO C++ gate). Tier 1+2 applied; Vizrt low-latency skipped per user. Best-fit role in the 2026-06 search | Done — await response |
|
||||
| Isovalent (Cisco) Sr Data Engineer, Observability | **CLOSED — role pulled** (live Cisco scrape 2026-06-02: not on board; Recruitee link dead). Package finalized ~86/100, SHELVED for reuse | Done — retarget PDFs to next live data-eng req (QuantCo/Grafana/Confluent) |
|
||||
| Google Zürich Sr SWE Infrastructure (Data Pipeline) | **CLOSED — DROPPED + DELETED 2026-06-02** (poor fit). Live JD = Core infra/systems SWE with **C++ as a MINIMUM qual**, off-thesis vs `user_positioning`. Output folder deleted (was built on a fabricated JD). | Done — do not reattempt this req |
|
||||
| Kraken AI Infrastructure | **CLOSED — REJECTED** (applied, no interview) | Done |
|
||||
| Infineon Doctoral | **CLOSED — withdrew** (got interview invite, declined: no relocation to Germany) | Done |
|
||||
| Infineon AI Engineer | **CLOSED — not applied** (no relocation to Germany) | Done |
|
||||
| Apple Data Engineer (ISE, Zurich) | **CLOSED — REJECTED** (no interview) | Done |
|
||||
| Google FDE GenAI (Zurich) | PAUSED — GenAI evidence gap too large; redirecting to data-eng/MLOps roles | Likely abandon |
|
||||
| Equinor AI Architect (Norway) | **SENT** (~80/100) | Done — await response |
|
||||
| QuantCo Cloud Engineer (Europe/Zürich) | **CLOSED — REJECTED** (applied 2026-06-01 ~82/100, no interview; rejection 2026-06-15) | Done |
|
||||
Read [current applications](resume_builder/reference/current_applications.md), generated from `job_scout/state/applications.json`. Update the registry through the tracker, then regenerate views. Do not maintain another status table here. Historical notes are preserved under `job_scout/state/history/`.
|
||||
|
||||
---
|
||||
|
||||
## KB Corrections Log
|
||||
|
||||
_See `config.md` for user-specific corrections. Add verified errors here as you find them._
|
||||
|
||||
## Maintenance resume point
|
||||
|
||||
For the authorized project-review fixes, read [FIX_PROGRESS.md](FIX_PROGRESS.md) before continuing. Both agent skill directories route to the shared workflows in `resume_builder/reference/workflows/`.
|
||||
@@ -7,7 +7,7 @@
|
||||
## File Map
|
||||
|
||||
```
|
||||
.claude/skills/
|
||||
.agents/skills/
|
||||
├── setup-extract/SKILL.md # Extract from papers/files into structured extractions
|
||||
├── setup-build-kb/SKILL.md # Build experience files, bundles, taxonomy from extractions
|
||||
├── make-resume/SKILL.md # Phase 0-2: JD research → bullet plan → resume/CV generation
|
||||
@@ -52,10 +52,30 @@ You are simultaneously:
|
||||
|
||||
You write as the strategist but critique as the reader.
|
||||
|
||||
**Hard rules:**
|
||||
- Output .tex files ONLY. User compiles locally.
|
||||
**Rule hierarchy.** When two instructions conflict, the higher level wins. State which level
|
||||
you are applying when you deviate.
|
||||
|
||||
1. **Evidence rules (immutable).** Anti-fabrication, Scope Discipline, provenance, verb discipline,
|
||||
`claims.json` as highest authority. These are never overridden by a JD, a market convention or a
|
||||
user styling preference. **Accuracy > Relevance > Impact > ATS > Brevity.**
|
||||
2. **Standing user preferences.** Recorded in `config.md` and the KB Corrections Log — e.g. Capgemini
|
||||
is omitted from every document and the resulting gap is intentional. Changed only by the user.
|
||||
3. **Market and employer presentation.** Profile choice (International Tech vs Swiss/DACH), section
|
||||
order, language, cover-letter convention. Adapt these per target; they never license a level-1 or
|
||||
level-2 breach.
|
||||
|
||||
**Deliverables vs QA — these are different things and were previously conflated:**
|
||||
- **The `.tex` is the deliverable and the source of truth.** Never hand over a PDF as the artefact of
|
||||
record, and never edit a PDF in place.
|
||||
- **You still compile.** Run `validate_resume_system.py`, compile with the local LaTeX distribution,
|
||||
and inspect the rendered pages before calling anything finished — a clean box count is not a
|
||||
visual check.
|
||||
- **Compile into the application's own `output/` folder**, not a temp directory, so the user can
|
||||
review what he is approving (`config.md` Output Rules; rule added after a package shipped with no
|
||||
reviewable PDF on 2026-08-27). "Output .tex only" means the .tex is authoritative, **not** that the
|
||||
user should be handed nothing to look at.
|
||||
- Refresh any submission-named copy on every recompile; it is a copy, not a build target.
|
||||
- Read `config.md` for email, provenance flags, and output preferences.
|
||||
- **Accuracy > Relevance > Impact > ATS > Brevity**
|
||||
|
||||
## Evidence-First Workflow
|
||||
|
||||
@@ -153,36 +173,7 @@ Character counts are diagnostic only; they must never drive page filling or equa
|
||||
|
||||
## Active Sessions
|
||||
|
||||
_Update this section when starting/finishing a JD._
|
||||
|
||||
| Session | Status | Next Command |
|
||||
|---------|--------|-------------|
|
||||
| NVIDIA - **Senior DevOps Engineer**, **Zürich** (req JR2024256) | **SUBMITTED 2026-09-05.** Recorded in the application record (now 7 entries) and in the scout decision log. ⚠ **Hybrid vs 5-day onsite was never resolved before sending**, so the working model is now a **live screening topic**, not a pre-cleared one - the same pattern as RUAG's comp/PSP. Thun→Zürich is ~1h50 each way; a 5-day-onsite answer is the main disqualifier to watch for. Comp is *not* a risk (levels.fyi Greater Zürich IC3 median ≈ CHF 204k, IC4 ≈ CHF 379k). Channel **Weak - the 7th consecutive cold submit**, though this posting published no named contact, so cold was the only option available. Submission PDFs `Dennis_Thiessen_Resume.pdf` and `Dennis_Thiessen_Cover_Letter.pdf` exist and are MD5-verified against source; letter recompiled so its date reads 5 Sep 2026. ⚠ **The letter carries ` oday` and the submission copies are copies, not build targets - if it is sent on a later day, recompile the letter and refresh both copies first** (`config.md` Output Rules). Submitted despite the hard-gate failures on an explicit user override, the same shape as RUAG AI Engineer C5I. Resume 2pp/13 bullets + 1pp cover letter (279 body words), both validators PASS 0 warnings, 0 boxes, visually inspected. Measured **Document Quality 82/100** at critique; **both Tier 1 findings were fixed 2026-09-05** - `Ubuntu` removed from the skills line (0 canonical; `PP-3` is Debian only, and the Debian→Ubuntu transfer argument belongs in an interview answer, not a skills line) and `security hardening` now marked *(personal server)* per the explicit `claims.json` instruction. Four honest ATS terms were added from existing evidence (configuration management, service reliability, container orchestration, observability), lifting JD term coverage **50%→61%**; no bullet was touched, so the budget stayed at 13 and cadence could not regress. **The critique is now STALE BY DESIGN - the document is better than 82 but that number was not re-measured, so never quote a post-edit estimate as a score.** The headline reorder was deliberately NOT applied: it is a positioning call for the user and `\headline` sits in the FIXED header block. Cover-letter hook is first-party verified (NVIDIA's own live Zürich posting JR2022878); **a hook was DROPPED at verification** - the Phase 0 plan's "Alps / Swiss AI Initiative with ETH Zürich and EPFL" is **not** supported by the first-party NVIDIA newsroom release, which mentions neither EPFL nor any Swiss AI Initiative; that came from secondary coverage. The letter names **both** honest gaps out loud - on-prem networking, and that employer-side Linux/Ansible ended Dec 2022 with only a personal server carrying currency. **⚠ BLOCKING: the working model is still unresolved and no document fix changes that.** Session `output/NVIDIA_SrDevOps_Zurich/session_nvidia_sr_devops.md`; JD scraped live via Playwright and saved verbatim (posted ~2026-09-01, very fresh). Evidence Fit **64/100**, fit class **Stretch**, **hard gate FAIL on two counts**: (1) required line *"Strong expertise in on-premises networking and compute infrastructure"* is a **Gap** - networking is 0 canonical and is not substitutable from data-platform work; (2) **hybrid vs onsite is UNRESOLVED** and the JD is silent - Thun→Zürich is ~1h50 each way. Required tally **3 Direct / 3 Adjacent / 1 Gap**. Recorded as an override rather than a passing gate, the same shape as RUAG AI Engineer C5I. (At the time this also had no free cohort slot; **that constraint no longer exists** - caps dropped 2026-09-05.) **Correction to the same day's scout triage: it called two required lines Gaps; only Q5b networking is one. Q2 (10+ yrs DevOps) is Adjacent and defensible** - a continuous CI/CD/automation thread runs Generali 2015 → today across five employers; the honest weakness is that those roles were titled data/test/research engineer, not DevOps. **The finding that changes the calculus: comp.** levels.fyi Greater Zürich puts NVIDIA IC3 median ≈ CHF 204k and IC4 ≈ CHF 379k, the highest-paying SWE employer in the city - the first role in the log where comp is a reason to *accept* a long commute rather than decline. Caveat: self-reported and equity-heavy after an extraordinary NVDA run; treat base as the reliable part. Strongest match is **R3, CI/CD pipelines for R&D engineering teams** - literally his career shape (`FC-1` Jenkins at a Fraunhofer institute, `BS-6` Ansible/Jenkins for fab analytics teams, `SW-3` Kubernetes + GitLab today). Zürich is NVIDIA's HPC/AI infrastructure-software R&D hub - first-party verified from NVIDIA's own live Zürich posting JR2022878 (*"building the next generation of scalable AI infrastructure ... distributed training, real-time inference, and communication efficiency across large systems"*), which is the hook the letter uses. **The Alps / Swiss AI Initiative framing was checked and dropped** - see above. **Honest gaps that travel with Line truncated
|
||||
| RUAG C5I - **AI Engineer C5I**, **Thun** (application ID 18027) | **SUBMITTED 2026-08-27** via jobs.ruag.ch (portal only; email and post refused). Evidence Fit **74/100**, fit class **Stretch**, hard gate **FAIL** (R1 and R2, the two title-defining responsibilities, are Adjacent not Direct), Document Quality **93/100** after a full critique-and-fix round (85 pre-edit), truth and provenance 24/25, **0 Tier 1 findings at Round 2**, channel **Weak/cold**. Submitted: German CV **2 pages, 13 bullets** + German motivation letter **1 page, 295 words**; both validators PASS, 0 boxes, text-order and visual QA clean, submission PDFs MD5-verified before sending. **Cohort evidence-first-2026-01 is now 6/10 and the sole Stretch slot is CONSUMED (Core 3/7, Adjacent 2/2, Stretch 1/1)** - any further application must clear Core or Adjacent on its own merits. Positioning is his canonical title **Staff Data, Analytics & AI Engineer**, carried by `BS-1` production ML-inference integration, `BS-6` Linux/Ansible, `SW-3`/`SW-7`/`SW-2` current Kubernetes and data-product work, `PP-3` current self-hosted Linux and hardening, `SW-5` DevSecOps tied to C5I's stated operating model, and the canonical `BW-1` officer career. The letter **names the AI-platform gap in one sentence** and pivots to the operations/platform side. **Honest gaps that travel with it:** no AI/LLM platform built or operated, no compute/GPU cluster, no RAG/retrieval implementation, no formal LLM evaluation; ML/AI-framework depth is certification-context only. **Compensation, PSP/project eligibility and role level were NEVER resolved before sending, so all three are now live screening topics rather than pre-cleared ones.** ⚠ **Marco Heinzen's published direct line (+41 79 568 14 96) was never used** - this went in as a pure cold submit, the sixth consecutive one. **If rejected, that is NOT a signal to drop RUAG:** five other RUAG C5I reqs sit in the scout log, and **Senior DevOps Engineer C5I** is already shortlisted and is a **materially better fit than this one**, sitting on the lane where his evidence is Direct rather than Adjacent (still live and verified on the board 2026-09-04). The **Data Lakehouse / Senior Data Platform Engineer** req was a title-match prior that the JD does not support — it was reposted 2026-09-04 as **Senior Data Engineer (MSSQL)**, requires on-prem MSSQL / Talend / SAP S/4HANA (0 canonical each), and is **ruled out**. **Scout run 2026-09-07: the RUAG C5I backlog is now SETTLED — undecided RUAG rows went 69 → 3** (`ICT Architect`, `Software Engineer C5I`, `Cyber Security Consultant` remain open; `ICT Architect C5I` stays `paused`). Do not re-triage that board from scratch; read `decisions.json`, where every rule-out note states whether it came from a JD read or from the title/family pattern. Three JD reads that cycle all ruled out: **Test Manager C5I** (the closest call — it escapes the networking gap entirely and BW-1 scores, but required *"fundierte Erfahrung als Test Engineer"* rests on `VIZRT`, **ten months, ended 2018-05**, so it is thin and stale, plus a lane exit and a third C5I req while 18027 is pending), **System Engineer C5I** (VMware + Firewall + Netzwerk, all 0), and **ICT Solution Architect Business Applications** (required *"mehrjährige Erfahrung als Solution Architect"* — a title `feedback_swisscom_datamesh_ownership` forbids — and the duties are *"unter Anleitung"*, a supporting seat below authoring). | Await response. Optional but still worthwhile: call **Marco Heinzen** about technical scope and level, and **Frank Haugwitz** about compensation and PSP/project eligibility. **NEW CONTACT 2026-09-07 — `Lars Kauz`, Head of ICT Infrastructure C5I, +41 79 293 93 82, lars.kauz@ruag.ch**, published on the System Engineer C5I posting. Channel is the rationed variable since the 09-05 cohort change, so a published, reachable name matters — **but he heads ICT Infrastructure, the function whose req was ruled out for VMware/VDI/Windows content, and that is NOT demonstrably the Kubernetes platform group Senior DevOps C5I sits in.** He is a warm entry into C5I, not a verified channel for rank 1; Haugwitz stays the recorded gate. Do not react to a single outcome with positioning changes (`application_strategy.md` §38/§74). |
|
||||
| Schweizer Armee - **Kommando Cyber (Kdo Cy)**, DevOps Engineer III (Data Platform), **Zimmerwald** (Ref JRQ$540-19848) | **CLOSED - REJECTED 2026-09-10** (submitted 2026-08-27, **14 days to disposition**, no interview - the fastest in the log after Google Business Home). Form letter from **Besarta Mehmeti**; the text is boilerplate (*„Profil und unsere Kriterien nicht in allen Punkten übereinstimmen"*) and carries **zero diagnostic content** - it is not a signal about the package and is **no reason to re-audit it**. Same disposition class as Microsoft ISE, Google Business Home and Aker BP: **a cold-channel no-interview rejection does not implicate document quality on its own.** ⚠ **WORTH WATCHING, NOT CONCLUDING:** this application and **SBB** are identical on every recorded dimension - Core, Evidence Fit **79**, hard gate PASS, Document Quality **92**, channel Weak - and they went opposite ways: SBB converted to an interview, this died in 14 days. **That shows the fit score did not discriminate; it does not show what did.** n=1 on each side - do not react with positioning changes (`application_strategy.md` §38/§74). **Channel:** Marcel Matthey-Doret's published line (+41 58 46 78409) was never called - the **fourth** published, reachable contact left unused after Heinzen (RUAG), Wienandts (SBB) and Marthinsen (Aker BP). Consistent with the 2026-09-05 channel policy but **not evidence for it**: the only interview in the log came from a *cold* submit whose resume was missing all three ATS literals. **Kdo Cy as an organisation is NOT closed** - 11 Kdo Cy roles were open on the portal at submission time and only this req is decided. Evidence Fit **79/Core**, hard gate **PASS**, Document Quality **92/100**, channel **Weak**. Submitted package: German 2-page CV with **15 bullets** and 1-page motivation letter with **300 body words**; validators PASS, 0 boxes, text order and visual QA clean. Canonical **BW-1** records the six-year Bundeswehr officer career and anchors the letter's military/public-service motivation. User explicitly accepted the critique's remaining BS-1 wording issue (*„ohne manuellen Eingriff“*) as good enough and submitted unchanged. Honest gaps remain physical datacenter work, GPGPU, ClickHouse and named Pull-GitOps practice. Cohort evidence-first-2026-01 is now **5/10, Core 3/7** *(pre-dates the 2026-09-05 cap drop; counts are a record, not a budget)*. | Done - rejection recorded in `application_cohort.json`, `decisions.json` and the session file. Optional and low-cost: a one-line feedback request to **Besarta Mehmeti**, which also builds a contact at an org with other open reqs. |
|
||||
| Citadel Securities — Platform Engineer, Research Platform Engineering, **Zürich** (also NY/Miami) | **SUBMITTED 2026-08-26 — open, awaiting response.** Recorded as `adjacent` in `application_cohort.json` (outcome `applied`) and as `applied` in `decisions.json`. *Slot language from the capped-cohort era has been removed here: the caps were dropped 2026-09-05 and counts are a record, not a budget.* ⚠️ **KEY FINDING — the application form's preferred-work-location selector offered NO Zurich**, despite the JD saying "Miami, Zurich or New York" and the site's own Zurich filter returning this req. Careers site is operated by **Citadel Enterprise Americas LLC**; the apply flow is likely US-entity, or the Zurich seat is closed while the posting stands. **This partly supersedes the working-model risk** — if no Zurich seat is reachable through that form, hybrid-vs-onsite is moot and the application may sit against a US req, a hard NO on relocation. **Rule for any future Citadel application: check the form's location selector BEFORE building a package** — the posting's stated locations and the site filter both proved unreliable. User applied with low expectation; cold channel, evergreen standing req. 2pp resume (13 bullets) + 1pp CL (270 words), both validator **PASS, 0 warnings**; JD term coverage 51%→68% after Tier 1 fixes. Critique **STALE by design** (86/100 pre-edit; user chose to submit as-is over re-critiquing; est. ~91 post-edit, never quote as a score). **CORRECTED 2026-09-10:** this row previously said *"Cohort entry and decision-log entry deliberately NOT written — no confirmed send date"* while its own status line read SUBMITTED. **Both entries exist and both are dated 2026-08-26** — the sentence was pre-submission text that survived the send. **The working-model question is still open and travels with the application:** Evidence Fit **71/100 (Adjacent, mid-band; revised down from 74)**, qualifications gate PASS but **a practical constraint is UNRESOLVED**, which `critique_framework.md` treats as a NO-GO trigger. **The JD is silent on hybrid vs onsite (0 grep matches), and Ken Griffin is on record that Citadel returned to the office 5 days a week and calls it his most important leadership decision.** If that holds for Zurich, it means ~2–2.5h daily commuting from Bern or relocating — breaking the Bern-based / 2–3 day hybrid bar. Only contrary evidence is a stale 2022 anonymous Fishbowl post about Operations. **Must be asked, not researched** — same class as the SBB K band. Practical constraints scored 5/5 in Phase 0 on an unexamined assumption; corrected to 2/5. **Zero Gaps among the 7 minimum quals**, and all five preferred technologies (Kafka, Kubernetes, Spark, Airflow, distributed DBs) are Direct — **the strongest raw stack alignment in the log**. Title-defining function **splits**: R2 (ingestion/transformation/storage/lifecycle of large datasets) is Direct and describes SW-1/SW-7 exactly; **R1 (design and build the research platform itself) is Adjacent** — the Aker BP authoring-vs-building shape again, and unwritable-around under Scope Discipline. **Classification caveat:** `application_strategy.md`'s "a defining responsibility is only Adjacent → Stretch" would strictly class this Stretch; recorded Adjacent per the Aker BP precedent (the caps this once turned on no longer exist). Gaps: platform authoring at firm scale, no professional quant/finance (now partly mitigated by new **PP-1/PP-2**), SDKs (0 evidence), low-latency/HFT (0 evidence — thesis throughput figure is explicitly barred by `thesis_limits`). **Go is NOT a gap** — Q3 is disjunctive and Python satisfies it. **$175–350k in the posting is a US/NY pay-transparency disclosure, NOT the Zurich number — must be asked.** Channel **Weak/cold** — it was the 5th consecutive cold application, in an office visibly staffed from Google and ETH (platform research head Costas Bekas; Nicolai Meinshausen leads principal research). Cover letter **was written and submitted** (1pp, 270 words); the PP-1 domain story carries it. | **Await response** (submitted 2026-08-26). No document work pending. **Two questions travel with this application and must both be asked at first contact, before any interview effort:** (1) **is the application even against the Zürich seat?** — the apply form offered no Zürich, so it may sit against a US req, which is a hard NO on relocation; (2) **hybrid or 5-day onsite?** — unresolved at submission, and 5-day onsite is a likely NO-GO on the Bern constraint. Same shape as the NVIDIA working-model issue: it went out unresolved, so it is now a live screening topic rather than a pre-cleared one. Also unasked: the Zürich compensation figure — the posting's $175–350k is a US/NY pay-transparency disclosure. |
|
||||
| SBB - **Data Engineer (m/w/d)**, Asset Management Infrastrukturanlagen, **Bern** (Job ID 103755) | **CLOSED - APPLICATION WITHDRAWN BY THE CANDIDATE 2026-09-11.** Interview held 2026-09-09 (HR + Scrum Master, **not** the People Leader the brief expected); SBB confirmed there was no room on the Einstufung, and he withdrew. **This is the cohort's only interview and it ended as a NO from his side, not theirs.** 💰 **HARD COMP FIGURES - supersedes the earlier +10% estimate and is the reference point for the whole Bern/Thun tier:** **Anforderungsniveau K tops out at ~CHF 145k.** He sits at **~CHF 135k inside a Swisscom band that runs to ~CHF 160k**. The decisive argument was **headroom, not the absolute number** - he would have entered K at its ceiling merely to break even, with nothing above. ⚠ **The package was a net DOWNGRADE on four counts:** 41h vs 40h week · 25 days holiday + Brückentage vs 28 + 5 from Zeitautonomie · 3 office days vs 2 · the band ceiling. ⚠ **Qualitative red flag worth carrying forward:** he spoke only to HR and the Scrum Master and **perceived difficulties in the team** - that is not repairable by a salary offer. 🎯 **TARGETING RULE — SBB ONLY: Anforderungsniveau K is too low; at SBB aim at NIVEAU L and/or KADER.** ⚠ **Deliberately NOT generalised** (user, 2026-09-11): *Anforderungsniveau* is **SBB's own** salary system (published at <https://company.sbb.ch/de/jobs-karriere/arbeitgeberin/lohn.html>) and does not map onto other employers — **jobs.admin.ch/Schweizer Armee uses Lohnklassen**, RUAG has its own scheme, PostFinance publishes per-posting bands. ~145k is an **SBB** ceiling, not a tier anchor. ⚠ **Thun and surroundings (RUAG, Kdo Cy) are explicitly OUT of this reasoning:** near-zero commute plus benefits that a salary band does not show — he named **childcare-cost coverage at the Schweizer Armee/Kdo Cy as potentially far more generous** (unverified — ask, do not assume). **Never decline a Thun-area role on band alone before pricing the benefits.** What *does* carry across employers: judge by **headroom in the band**, and price the **total package** (working time, holiday, office days), not the entry salary. Original record: interview was stage 2 of 4, **INTERVIEW HELD 2026-09-09.** SBB asked him to come back on whether the role interests him; **SBB's own feedback is still outstanding.** User's summary: *„ok"*, but **ein paar Red Flags**, and in his read the Rahmenbedingungen do not compensate for them - **leaning negative, explicitly undecided as of 2026-09-10, and he asked to leave it open.** ⚠ **The specific red flags were NOT captured while fresh** - anyone reopening this must ask rather than rely on memory. 💰 **First real read on Anforderungsniveau K:** his post-interview estimate is that roughly **+10% on the current ~140k** looks achievable (very roughly ~155k). **This is HIS ESTIMATE of what is negotiable, not a band SBB is recorded as quoting** - whether the K range was named on the call is unrecorded. Well below the 180k bar, above current pay. Recorded in `comp_worksheet_sbb.md` as the **first calibration point for the entire Bern/Thun local tier** (RUAG, Swissgrid, BKW, BFH), which was previously pure guesswork - treat as an estimate, never quote as a figure. **INTERVIEW INVITED 2026-08-28 - 9. September 2026, 08:30, 45 Min, MS Teams.** Per the posting's own process this is **stage 2 of 4**, *"Virtuelles Kennenlernen mit HR und Fuehrungskraft"* - **HR together with Andri Wienandts**, not a pure HR screen. Brief written to `output/SBB_DataEngineer_AssetMgmt/interview_brief_sbb_2026-09-09.md`. **This is the FIRST interview of the evidence-first cohort** (6 applications, 2 rejections, 1 conversion) and it converted from a **COLD submit** - the channel plan called for phoning Wienandts first and that never happened. **The resume never contained Snowflake, dbt or Power BI**, the three literals an ATS keyword screen would have keyed on; the session had recorded that risk 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, do not over-read it** - but it is evidence against assuming honest omissions are fatal at the screen. Submitted 2026-08-25: 2pp English resume, 13 bullets, no cover letter (SBB waives it), Evidence Fit **79/100 Core**, hard gate **PASS**, Document Quality **92/100**, channel **Weak/cold**. Best practical fit in the log - Bern-based, German-language, no relocation, EU citizen + B permit. **Four things unresolved before submitting and now live call topics:** (1) **Anforderungsniveau K** is a capped GAV band, figures not public, very likely below the 180k bar; (2) the seat reads **lateral or below** current Staff + Component Owner scope, the same shape as the declined BKW, and the JD's only architecture language is a personal skill not an ownership mandate; (3) **RAMSI** Java/Spring Boot/Angular is a whole responsibiliLine truncated
|
||||
| AWS (AWS EMEA SARL, Switzerland Branch) — Senior Forward Deployed Engineer, Zürich (job 10504263) | **CLOSED — NO-GO 2026-08-18** at the Phase 0 gate. Evidence Fit **69/100** (Adjacent). Minimum-qual gate passed (all 4 Basic Quals Direct) but the *title-defining* capability — customer embedding — is a Gap that `claims.json` globally forbids claiming, and R2 multi-agent/retrieval is a second Gap. User declined: **69 is below the fit bar worth spending 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).** Phase 0 analysis retained in the session file for reuse if a better-fitting AWS req appears. | Done — no package built |
|
||||
| Google — Forward Deployed Engineer III, Google Cloud GTM (French, German), Zürich (req 78350205438567110) | **CLOSED — NOT PROCEEDING 2026-08-18.** Phase 0 was done (Evidence Fit 67/100, hard gate PASS) but user declined to proceed after **two Google rejections** (Merchant Data Science, Business Home): the bar is now that a Google req must fit *very* well to be worth a third attempt, and this one was Adjacent with an agent-orchestration Gap. **Frees the Adjacent cohort slot (back to 1/2).** Phase 1 never started. | Done — do not reopen without a materially stronger Google req |
|
||||
| SDU Center for Energy Informatics, Odense DK — PhD, Theme 2 Predictive Maintenance & Asset Management of Smart Energy Networks (job 4159) | **CLOSED — NOT PROCEEDING 2026-08-18.** Enquiry email to Prof. Bo Nørregaard Jørgensen (sent 2026-08-02) went unanswered for 16 days; user dismissed the idea. Genuine thesis fit (vibration condition monitoring, RBR+ANN hybrid) but the blockers were never the documents — 2 letters of recommendation 13 years out of academia, and DKK 37,075/mo ≈ CHF 56k against a 180k bar. Deadline was 2026-08-20. | Done — no further action |
|
||||
| Aker BP ASA — Data Product Architect, AI-ready Data Products (FINN 469067315) | **CLOSED — REJECTED 2026-08-27** (submitted 2026-07-30, ~28 days to disposition, no interview; the session file and cohort record record the submission as 2026-07-29 — a one-day inconsistency, never reconciled). Adjacent, **Evidence Fit 79/100**, Document Quality 93/100, hard gate PASS, **Channel Weak/cold** — the optional follow-up email to Per Olav Marthinsen was left unsent, so this went in as a pure cold submit. Stavanger/Oslo/Trondheim, English working language, no Norwegian and no clearance required, EEA work rights. 2pp resume + 1pp CL, both validator PASS, no Tier 1 truth findings — **a cold-channel no-interview rejection does not implicate document quality on its own** (same disposition class as Microsoft ISE and Google Business Home). Honest practitioner framing: builds governed data products *inside* Swisscom's Data Mesh; role *authored* an enterprise framework — real level stretch, never fabricated authorship. **Atlassian Compass closed the catalogue-tool gap** (74→79). Standing gaps if a similar req appears: framework authorship, no energy domain, AWS vs their Microsoft/Cognite stack, **zero verified metrics**. **Cohort slot stays consumed** (evidence-first-2026-01, Adjacent 1/2 — a rejection does not free a slot; cohort remains 4/10). **The Norway lane stays OPEN and selective** — NATO JWC Stavanger is still live, and Equinor/Telenor and other strong Norwegian employers remain in scope per the user's standing instruction. Never frame this lane as closed. | Done — cohort rejection recorded; do not react to this single outcome with positioning changes (`application_strategy.md` §38/§74) |
|
||||
| Google - Software Engineer III, Business Home, Zurich (req 93922217108087494) | **CLOSED - NOT PROCEEDING 2026-07-28** (submitted 2026-07-27; Core, Evidence Fit 89/100, Document Quality 94/100; no interview). Rapid early-screen disposition; known risks were Mid-level versus current Staff scope, data/platform versus product-SWE positioning, preferred algorithms/accessibility gaps, and a cold channel. | Done - cohort rejection recorded; do not treat this outcome alone as a document-quality failure |
|
||||
| Microsoft — Principal Forward Deployed Engineer, SWE (German Speaking), Zürich (req 200043897) | **SUBMITTED 2026-07-27** (84.2/100 Pass 2; finalized 2-page resume + 1-page cover letter). Strong native-German, Staff progression, production ownership and enterprise-data-readiness case; honest gaps remain in end-to-end LLM delivery, Azure AI and strategic-account FDE experience. | Done — await response |
|
||||
| BIS Basel — Senior Data & Analytics Engineer, AI (jr100429, 3-yr term) | **SENT 2026-07-10** (80.5/100; deadline 2026-07-24; hybrid Basel, English-working intl org). Critique flags LLM-depth probe (integration/config vs. ownership) as the screening risk — prep honest answer before any call | Prep interview brief when screening lands |
|
||||
| NATO JWC Stavanger — Staff Officer, AI Engineer (2030 Digitalisation, G15, 3-yr PLN) | **SENT 2026-07-10** (77.5/100; deadline 2026-08-09; final interviews 2nd half Oct 2026). Borderline screen: Azure-cert "or equivalent", LLM depth, no current clearance; German national + officer service are the legibility assets. Tax-free NOK 93,933/mo + allowances | Await screening; no action until contact |
|
||||
| Microsoft — Senior SWE, Industry Solutions Engineering (ISE), Zürich (req 200040836) | **CLOSED — REJECTED 2026-08-11** (submitted 2026-07-03, 85.8/100 Pass 2; 2pp resume + 1pp CL; verbatim Eightfold JD; IC4 base CHF 146.2–245.9k; applied ~7 days after posting). No interview, ~39 days to disposition. Cold-channel application; does not implicate document quality on its own. The separate Microsoft **Principal FDE** req 200043897 is a different pipeline and remains open | Done — cohort rejection recorded |
|
||||
| Kraken (Payward) — SRE, AI Agents (remote, CH-eligible) | **CLOSED — REJECTED 2026-06-17** (applied 2026-06-15 ~87.2/100, no interview). Honest gaps (NO Terraform/SRE-title/LangGraph) likely the filter; 4th Kraken req declined/rejected to date | Done |
|
||||
| Google — Senior Data Engineer (Merchant Data Science), Zürich/MV | **CLOSED — NOT PROCEEDING 2026-07-24** (applied 2026-06-15, 85.5/100; passed Google Hiring Assessment 2026-06-20, no interview). Assessment pass remains recorded separately. The official 90-day wait applies only to reapplying for the same job; different Google roles remain eligible, subject to 3 applications per rolling 30 days. | Done — target a different strong-fit Google req |
|
||||
| Snowflake — Sr SWE, Enterprise (Observe by Snowflake), Zürich | **CLOSED — NO RESPONSE 2026-08-25** (sent 2026-06-06, ~86/100; 2pp resume + 1pp CL; real Ashby JD; comp CHF 176–253k base; NO C++ gate). Closed by user decision at **80 days silent** — past the longest real disposition in the log (Equinor, 79 days). **No rejection was ever received: this is a presumed-dead call, not a rejection — do not count it in rejection statistics or treat it as a document-quality signal.** Cold channel. Pre-dates the evidence-first-2026-01 cohort (started 2026-07-27), so **no cohort slot freed**. Highest-scoring package in the log at ~86 and it drew no reply at all — the strongest single argument in the log for the channel problem over the document problem. **Unblocks the Snowflake Observe Metrics Platform req** (`db4f0492`), paused 2026-07-28 solely to avoid stacking a second cold application on the same org while this one was open | Done — if Snowflake is still wanted, the Metrics Platform req is now open to pursue, but route it through a recruiter rather than another cold submit |
|
||||
| Isovalent (Cisco) Sr Data Engineer, Observability | **CLOSED — role pulled** (live Cisco scrape 2026-06-02: not on board; Recruitee link dead). Package finalized ~86/100, SHELVED for reuse | Done — retarget PDFs to next live data-eng req (QuantCo/Grafana/Confluent) |
|
||||
| Google Zürich Sr SWE Infrastructure (Data Pipeline) | **CLOSED — DROPPED + DELETED 2026-06-02** (poor fit). Live JD = Core infra/systems SWE with **C++ as a MINIMUM qual**, off-thesis vs `user_positioning`. Output folder deleted (was built on a fabricated JD). | Done — do not reattempt this req |
|
||||
| Kraken AI Infrastructure | **CLOSED — REJECTED** (applied, no interview) | Done |
|
||||
| Infineon Doctoral | **CLOSED — withdrew** (got interview invite, declined: no relocation to Germany) | Done |
|
||||
| Infineon AI Engineer | **CLOSED — not applied** (no relocation to Germany) | Done |
|
||||
| Apple Data Engineer (ISE, Zurich) | **CLOSED — REJECTED** (no interview) | Done |
|
||||
| Google FDE GenAI (Zurich) | PAUSED — GenAI evidence gap too large; redirecting to data-eng/MLOps roles | Likely abandon |
|
||||
| Equinor — Manager / AI Architect, Agentic systems (Stavanger/Oslo/Rotvoll/Sandsli; req JR106747) | **CLOSED — REJECTED 2026-08-14** (submitted 2026-05-27, ~80/100; posting deadline 05.06.2026). No interview, **79 days** to disposition — the longest turnaround recorded. Cold channel. This was a **Manager** req, not a pure IC architect role, so level/scope stretch compounds the standing Norway per-role gates (norsk working-language, no NO clearance — **not** comp: the 180k bar is CH-only and does not apply to Norway). **Pre-dates the evidence-first-2026-01 cohort (started 2026-07-27) — does not free a cohort slot.** **The Norway lane stays OPEN but selective** — Equinor, Telenor and NATO JWC remain in the scout; the user has explicitly said he still wants to reach out for very good Norwegian roles, Equinor included, after this rejection. Never frame this lane as closed. | Done — cohort-external rejection recorded |
|
||||
| QuantCo Cloud Engineer (Europe/Zürich) | **CLOSED — REJECTED** (applied 2026-06-01 ~82/100, no interview; rejection 2026-06-15) | Done |
|
||||
Read [current applications](resume_builder/reference/current_applications.md), generated from `job_scout/state/applications.json`. Update the registry through the tracker, then regenerate views. Do not maintain another status table here. Historical notes are preserved under `job_scout/state/history/`.
|
||||
|
||||
---
|
||||
|
||||
@@ -192,6 +183,15 @@ _See `config.md` for user-specific corrections. Add verified errors here as you
|
||||
|
||||
| Date | Correction | Files fixed |
|
||||
|------|-----------|-------------|
|
||||
| 2026-10-22 | **Current on-call was unrecorded, which made the KB look as if his production-operations evidence ended at ART B2B. This is the eighth gap of the recurring ops shape, surfaced by the NVIDIA *Senior Production Engineer, DGX Cloud* (JR2027105) fit check.** User-confirmed in his current team: **Opsgenie** alerting, a **rotating engineer-on-duty role** he takes part in, and bugs and alerts that automatically create Jira tickets the team assigns and fixes. Recorded as **SW-11**. A follow-up confirmed that **he writes the alert thresholds for his own pipelines**, data-quality thresholds being the named example. The Opsgenie/Jira integration is not his and "24/7" is not established. The follow-up also confirmed that the Bosch BS-4 PoC included **Grafana, Prometheus and Loki** (previously only in his earlier CV); registered as PoC-context skills with ELK Stack. **Same message:** (a) the Bosch ML inference (BS-1) **ran on NVIDIA GPUs with CUDA**, but he "never did much configuration there". The writable form is "GPU-backed inference on NVIDIA GPUs". **CUDA is registered `forbidden`** as a skill (it is system context only), and GPU tuning is forbidden on BS-1. (b) **Networking: no professional configuration.** Day-to-day work runs on automated AWS landing zones, and AWS networking is covered only by the Solutions Architect – Associate certificate. Recorded as `networking`, certification context only. **Lesson, the same as before: on an SRE/production JD, ask about the CURRENT on-call and alerting setup before scoring. The past SW-2 Rufbereitschaft had hidden the current one.** | `claims.json` (SW-11, BS-1, skills Opsgenie/CUDA/networking); `knowledge_base/extractions/2026-10-22_oncall_networking_gpu_clarification.md` |
|
||||
| 2026-10-21 | **Software design and architecture was under-recorded: the seventh canonical gap of the recurring shape, surfaced by the Google *Staff SWE, Shopping Graph* minimum *"3 years of experience with software design and architecture."*** Before this, the only design evidence was SW-7 (current, undated, 2026-10-03) and a *contribution* at Generali (GN-3), so the line read as unproven. User-confirmed: **software design and architecture were part of his work at Bosch (ingestion and inference scripts, 2020-2022) and at Swisscom (data products)**, and both count toward the year requirement; together they exceed three years. Recorded on BS-1, BS-2 and SW-7, with `designed` added to the BS-1/BS-2 allowed verbs. **Scope kept tight:** at Bosch, "designed" covers the ingestion scripts and the inference integration only, not the data services in general (the first patch over-extended it and was trimmed the same session). Design never means an architect title, design authority or shared-platform architecture. The Swisscom start date stays undated. **Lesson, the same as 10-08 and 10-14: when a JD has a years-of-X minimum that the canonical file states without a duration, ask for the duration before scoring.** | `claims.json` (BS-1, BS-2, SW-7); `config.md` (data-product design row); `knowledge_base/extractions/2026-10-21_software_design_architecture_clarification.md` |
|
||||
| 2026-10-22 | **Scout findings fixed in one pass; the biggest one is that Apple had been blind to Switzerland for about two months.** (a) **Apple:** the `location=switzerland-CHE` slug stopped resolving and Apple silently applied a US location ("Chesterfield, Missouri"). Every run from at least 2026-08-31 to 2026-10-22 returned the same 21 US/intern cards and **0 Swiss roles**, which read as "Apple has nothing" rather than as a failure. The code is now `CHEC` (from `/api/v1/refData/postlocation`); the card is the result list item, so the location is readable; and there is pagination, a settle delay and per-element timeouts (one run took 876s, the next 25s). Result: **24 Swiss roles**, Zurich AIML/infra included. (b) **BIS:** bis.org went behind a Cloudflare challenge (403, even for a headless browser), so the board moved to its Workday tenant `bis.wd3.myworkdayjobs.com/External`, which also gives the real office. A host alias plus a lower-cased jr-id keep all 9 `bis.org#jr…` decisions linked (applied jr100498 included). (c) **NAV:** the search API 429s after ~9 requests and then for hours. Discovery now stays at 8 searches, and posting text comes from NAV's official third-party feed (`pam-stilling-feed`, public rotating token), which tolerated bursts. The feed lacks ~2/3 of ads, so a small, slow website-page fallback covers those, and verdicts are cached. (d) **EMEA leak fixed:** a country allowlist without CH/DK plus a trailing "EMEA" tag is no longer Europe-remote (27 rows removed). Swiss/Danish segments in multi-location strings are checked per segment, so "PL-Poland-Remote \| CH-Zurich-MSO" stays Swiss. A regression over all *eligible* 2026-10-22 rows showed only the fenced rows changing (rows newly admitted by the per-segment check were not regression-tested). (e) **Reputation:** every board now has a dated verdict. Glassdoor and **kununu** are both primary sources, and whichever has more reviews decides (user tip: kununu is far better for Swiss employers). AVOID: **BIS** (Glassdoor 2.9/56, where an application is pending), **BFH** (kununu 3.3/132), **Kdo Cy** (federal-administration kununu 3.4/997, not unit-specific). **Lesson: a board that returns the same non-zero count with zero eligible rows for weeks is a silent failure, not an empty market. Check what filter the site actually applied.** | `scout.py` (Apple, BIS, NAV, location filter, reputation); `state/employer_reputation.json` |
|
||||
| 2026-10-21 | **FIXED 2026-10-22 (Microsoft links; the EMEA leak below was fixed the same day, see the 2026-10-22 row).** Fix: `fetch_pcsx` now emits `apply.careers.microsoft.com<positionUrl>?jobId=<displayJobId>`, a `?jobId=` pattern precedes the `/job/` one in `_JOB_ID_PATTERNS`, and `_HOST_ALIASES` maps the new host to the old so `_decision_key` is unchanged. Verified: all 7 logged Microsoft decisions still resolve (applied 200043897 included), and a new-form link opened the real posting with the job number on the page. Reports before 2026-10-22 still carry the dead form. Original finding: **every Microsoft link the scout emits is dead, in every report**, found in the 2026-10-20 triage. `fetch_pcsx` builds `jobs.careers.microsoft.com/global/en/job/<displayJobId>`, which now redirects to a generic `apply.careers.microsoft.com/careers?...&pid=1970393557041551` search page. Verified on 200060867 and on the **pending application 200043897** (Principal FDE). The application itself is unaffected; only the link is. The working form is `https://apply.careers.microsoft.com/careers/job/<pcsx id>`, the API's `positionUrl`. **Deliberately NOT patched yet:** 6 logged Microsoft decisions (including 200043897) are keyed on `displayJobId` through the `careers\.microsoft\.com /job/(\d+)` pattern. Swapping the URL would re-key them on the pcsx id and orphan them, the same failure as the 09-04 RUAG/BIS de-linking. **Safe fixes:** (a) keep `url` and add a working `apply_url` field to the row, or (b) emit the new URL with the display id carried in it, plus a host-normalised key pattern. Either way, verify all 6 rows still resolve through `find_decision_url` afterwards. Same triage, also OPEN: an **"EMEA" region suffix lets country-fenced roles through the location filter** (GitLab FR/DE/NL/ES/UK, Grafana ×5, Fivetran Serbia: 7 of 109 new rows), which breaks the docstring rule against multi-country allowlists that omit CH. | not yet fixed: `scout.py` (`fetch_pcsx`, location filter); evidence in `reports/2026-10-20.triage.md` |
|
||||
| 2026-10-15 | **Two scout adapters were reporting wrong data without failing; both were found by the 2026-10-14 triage.** (a) **BIS:** the RSS adapter stamped `default_location: Basel, Switzerland` on every vacancy, so **jr100491 (Hong Kong, BIS Asia office)** passed the CH filter and reached a JD read. The feed carries no location, but each vacancy page has a static *Geographical location* field. `fetch_rss` now reads it per item (`location_page_regex`), falls back to a *"based in ..."* sentence in the feed description, and only then uses `default_location`, printing a warning when it does. Verified: Basel reqs still pass, and jr100491 now reads *8 Finance Street, Central, Hong Kong* and is excluded. (b) **Confluent:** IBM closed the acquisition on 2026-03-17, and the Ashby board went from 17 jobs (10-08) to `{"jobs":[]}` (10-14). careers.confluent.io sits behind a Vercel bot checkpoint. The roles are now IBM requisitions, served by the open IBM careers search API (`www-api.ibm.com/search/api/v2`, POST, `size` capped at 100, pages with `from`). New `ibm` adapter; Confluent keeps its id, so seen-state and decisions still link. First run: 84 roles, 0 in CH/Europe-remote scope. **HashiCorp was dropped on 2026-06-06 for having "no clean public ATS API" after IBM absorbed it. That API exists, so HashiCorp can come back through the same adapter if wanted.** **Rule: when an adapter must assume a field, the assumption has to be visible. A silent default looks exactly like real data.** | `scout.py` (`fetch_rss`, `_rss_item_location`, `fetch_ibm`, BIS and Confluent config) |
|
||||
| 2026-10-14 | **Spotfire was the sixth evidenced-but-unregistered skill, and junior mentoring was unrecorded - both surfaced by the BIS Basel jr100498 *Senior/Lead Data & Analytics Engineer* (MED IT) triage.** (a) **TIBCO Spotfire** sat in the BS-5 and BS-8 scopes (co-owned environment, technical Application Owner, C# extensions, TAF 2022, spatial wafer-data map charts) but not in the `skills` array, so the JD line *"using database reporting and business intelligence tools"* had no citable skill; registered `production-historical`, `allowed` on user instruction. It does not license Power BI, Tableau or Qlik. (b) The JD requires *"Experience providing general supervision and task-specific guidance to junior colleagues"*, and the only canonical evidence was BS-7 (students, one thesis as Zweitpruefer). User-confirmed: he **onboarded and mentored junior developers at Bosch and at Swisscom** - recorded as **BS-9** and **SW-10**, one per employer. The Swisscom phase (ART B2B or ART DPT) is not recorded, so write it in past tense. Neither is people management. (c) **SDMX: user-confirmed never used**; registered `forbidden` so the scanner catches it. It is an accountability line in the JD, not a qualification. (d) The same audit found **Teradata, Oracle Database and Hadoop/Impala** evidenced only in the SW-2/BS-2/BS-8 scopes and absent from the `skills` array, although every past skills line listed them; registered `production-historical` from those scopes (Oracle explicitly does not establish DBA work). **Lesson, same as 10-08: when a JD has a supervision or mentoring line, ask about junior colleagues before falling back on BS-7. Student supervision is weaker evidence and the stronger evidence was simply unrecorded.** | `claims.json` (BS-9, SW-10; skills TIBCO Spotfire, SDMX, Teradata, Oracle Database, Hadoop / Impala); `knowledge_base/extractions/2026-10-14_mentoring_spotfire_sdmx_clarification.md` |
|
||||
| 2026-10-08 | **Three more canonical gaps of the recurring shape, surfaced by the Kongsberg Seatex *Lead Engineer, DevOps and Test Infrastructure* (Trondheim) package.** (a) **Jenkins and GitLab CI/CD** were evidenced in claim scopes (GN-1, FC-1, BS-6, SW-3) but absent from the `skills` array, so no skills line could cite them; registered as `production-historical`, with GitLab keeping SW-3's "used, not built" limit. (b) **Embedded coursework** was unrecorded: user-confirmed an Embedded Systems course (C/C++ and VHDL with an ARM platform) and Robotics during his studies, and **no embedded work since** - recorded as **ED-1**, coursework-only, degree attribution not yet given. (c) **Current unit testing** was unrecorded: he writes unit tests today and knows pytest - recorded as **SW-9**; whether pytest is the Swisscom framework is not confirmed. The JD's required line *"Experience working with embedded SW and Linux"* stays a **half Gap** (hard-gate FAIL); the user overrode it knowingly. **Lesson, again: for any DevOps/test JD ask about current testing practice and about academic hardware work before scoring - neither lives in `claims.json` by default.** | `claims.json` (ED-1, SW-9, 7 skills); `knowledge_base/extractions/2026-10-08_embedded_coursework_testing_clarification.md`; Kongsberg package |
|
||||
| 2026-09-15 | **Swisscom was recorded as one undifferentiated current role, so past work read as present.** The first Geo Platform build said *"Own the ETL pipeline components"* and *"Owns ... Teradata"* in the summary - wrong. User-supplied: the tenure has two phases. **ART B2B** (first part, PAST): the legacy Teradata DWH - Fulfillment ETL component ownership (SW-2), Python on Kubernetes with GitLab CI/CD (SW-3), dashboards and analyses (SW-4), Kafka. **ART DPT, Team Offering** (CURRENT): migration and implementation of AWS data products on AWS, ODP-Flow, PySpark/Python, Glue, Iceberg, Athena, Airflow (SW-1, SW-6, SW-7). **Kafka and Kubernetes downgraded to `production-historical`**; SW-2/SW-3/SW-4 allowed verbs are now past tense; Apache Iceberg added as a canonical skill. Official internal title recorded: `Data, Analytics & AI Engineer IV` (III before Apr 2025), per the Oct 2025 Zwischenzeugnis. **The switch date is deliberately not recorded (user: not relevant) - never date the two units.** Any already-submitted package that presents Swisscom Kubernetes, Kafka or Teradata ownership as current stays as submitted history, but expect the question in interviews. **Lesson: the Zwischenzeugnis gives the whole tenure as one duty list, and a duty list says nothing about which duties are current - ask which phase each belongs to.** Same session, same shape: the Zeugnis's *"automation of CI/CD processes in GitLab"* overstated his part - the user clarified he **worked with** automated GitLab CI/CD rather than building it, and SW-3 now forbids claiming the automation. | `claims.json` (SWISSCOM org/title history; SW-1/2/3/4/6/7; Kafka, Kubernetes, Apache Iceberg; SW-3 CI/CD scope); `experience_swisscom.md` SW-3; Geo Platform resume |
|
||||
| 2026-09-15 | **Geospatial evidence was missing from `claims.json` - the fifth canonical gap of the Ansible/Linux/Bash/Kotlin shape - and the first assessment compounded it with a wrong assumption about the domain.** Surfaced by the internal Swisscom posting *Data Engineer - Geo Platform* (R-0006447), which requires *"Fundierte Praxis mit ArcGIS und FME"*. User-confirmed: at Bosch he worked extensively with geospatial data in Oracle (**`SDO_GEOMETRY`**) and TIBCO Spotfire to visualize, locate and analyze wafer data, across **multiple coordinate reference systems** - normalizing and transforming between them was the main difficulty of the work, performance tuning the other. Recorded as **BS-8** plus two `allowed-with-context` skills. **The assessment first asserted that wafer coordinates carry no CRS and scored the geo lines on that basis; it was wrong and the user corrected it.** Boundary kept, not re-litigated: geographic/geodetic specifics (datums, map projections, EPSG, LV95) are not established. **ArcGIS, FME, QGIS, PostGIS, GeoServer and GDAL are user-confirmed never used** and are now registered `forbidden` so the scanner catches them. **Lesson: do not discount a domain bridge on an assumption about the domain - ask the discriminating question before scoring.** | `claims.json` (BS-8; 2 new skills; 6 forbidden skills) |
|
||||
| 2026-09-05 | **The ten-application cohort's slot caps (7 Core / 2 Adjacent / 1 Stretch) were DROPPED by user decision.** Two reasons, both evidenced. **(a) The numbers were arbitrary and non-binding:** no derivation existed anywhere, and they were routed around whenever they bound - RUAG AI Engineer went in at Evidence Fit 74 with a hard-gate FAIL, and Citadel was recorded Adjacent when the strict reading said Stretch. **(b) The cohort was a confounded experiment:** it was built to test *fit class*, but the variable it silently held constant was *channel* - `cohort_tracker.py` reports **channel weak: 6, moderate: 0, strong: 0**. It therefore could not separate "Stretch does not convert" from "cold does not convert", and the evidence points away from fit class regardless: the highest-scoring package in the log (Snowflake, ~86) drew no reply in 80 days, while the single interview (SBB) came from a **cold Core submit whose resume was missing the three ATS literals** the session had flagged. **What was kept is the recording, not the rationing** - fit class, hard gate, channel, date, stage and outcome are still logged on every application, because that record is what makes patterns visible rather than re-derived. **Channel replaces the slot budget as the rationed variable: no application goes out cold when a named contact is published and reachable** - Marco Heinzen (RUAG), Andri Wienandts (SBB) and Per Olav Marthinsen (Aker BP) were all published, reachable and never used. **Fit class is now a preparation signal, not a spend limit:** 64/100 means know which two questions are coming, not do not apply. Hard gates and NO-GO triggers are unchanged. **Three real constraints survive independently and must not be dropped with the caps:** Google's 3-applications-per-rolling-30-days and 90-day same-role wait; not stacking a second cold application on one org while the first is pending; and the hours each package actually costs. Propagated to `application_strategy.md`, `shared_ops.md`, `session_file_template.md`, `cohort_tracker.py` (now prints counts, never counts-against-a-target) and `application_cohort.json`. | `application_strategy.md`; `shared_ops.md`; `session_file_template.md`; `cohort_tracker.py`; `application_cohort.json`; `CLAUDE.md` |
|
||||
| 2026-09-05 | **`Bash` / shell scripting was missing from `claims.json` entirely - the third canonical gap of exactly this shape, after Ansible and Linux administration (both 2026-08-27).** It surfaced while building the NVIDIA Senior DevOps package: the JD names *"proficient scripting skills in Bash, Python, or Groovy"*, and ten years of Debian administration plus intensive Ansible work at Bosch plainly involve shell scripting - but the canonical file was silent, so under the evidence-first rule the skill was **unwritable** and was deliberately left off the resume. User-confirmed 2026-09-05 and added as `production-historical-and-personal-current`, `output: allowed`, with the same evidence basis as Linux administration (`BS-6` professional 2020-2022; `PP-3` personal and current). The note records two hard limits: it does **not** license **Groovy**, which stays unverified and forbidden, and it does **not** license systems-programming or kernel-level claims. **Systemic lesson, now three times over: the KB is data-engineering shaped and under-records ordinary infrastructure and operations skills. Before scoring any DevOps/platform/SRE JD, ask about ops evidence explicitly rather than trusting `claims.json` to be complete.** Edit note confirmed again: the file is compact inline JSON with CRLF - patch it as text; this change was 6 insertions with no reformatting. | `claims.json` (new skill); NVIDIA resume Languages line |
|
||||
| 2026-09-04 | **This file asserted a shortlist that the JD does not support, and the 2026-08-31 scout triage had already caught it — but nothing was written here, so it survived into the next session exactly as that triage predicted.** The RUAG session block called **Senior DevOps Engineer C5I** *and* **Data Lakehouse / Senior Data Platform Engineer** "both already shortlisted and materially better fits… where his evidence is Direct rather than Adjacent." Only the first half held. The Data Lakehouse claim was a **title-match prior**: the live JD is **on-prem, MSSQL, Talend, SAP S/4HANA**, and `claims.json` has **0** for all three. RUAG then settled it itself — between the 08-31 and 09-04 scrapes the req was pulled and reposted as **"Senior Data Engineer (MSSQL) mit Data Lakehouse Perspektive"**, with the disqualifier moved into the title; its sibling *Senior Data Analyst & Data Scientist* was likewise reposted as *Senior BI Specialist (Qlik Sense)*. Required line reads *"mehrjährige Erfahrung im Aufbau und Betrieb von **on premise** Data Warehouse Lösungen"* — his stack is AWS cloud-native. Senior DevOps C5I re-verified live on the board 2026-09-04 and stays rank 1. **Systemic lesson: a triage finding that is not written into this log does not exist. Close the loop in the same session that finds it.** | `CLAUDE.md` (RUAG session block); `reports/2026-09-04.triage.md` |
|
||||
@@ -216,3 +216,7 @@ _See `config.md` for user-specific corrections. Add verified errors here as you
|
||||
| 2026-08-02 | **Bosch data types named.** Fab sensor/process data: defect-management records, wafer inspection images, PCM electrical parameters (user-confirmed). Previously the KB named no concrete sensor-data types for Bosch. | `claims.json` BS-2 |
|
||||
| 2026-07-27 | **Bullet density.** Fixed 1L/2L/3L and character-band rules made bullets uniform and encouraged page filling. | Replaced globally with natural-length, evidence-led bullets; character counts are diagnostic only. |
|
||||
| 2026-08-25 | **Cadence monoculture across every generated package.** Audit of all 18 packages in `output/` (368 bullets) found **45% used the same "X, Y and Z" triple**; the SBB package hit **85% — 11 of 13 bullets, every Swisscom and Bosch line** — plus two adjacent bullets both opening "Build and…". Not a truth defect: every bullet was accurate and the corpus is clean on AI vocabulary (0 cliché hits in 35 documents) and prose em-dashes (0.08/bullet). It is a *rhythm* tell — uniform three-beat cadence reads as machine-written. PDF metadata is clean (MiKTeX pdfTeX, empty Author/Title, no AI tokens in 69 PDFs, no generator-term leakage). | New `resume_reference.md` §7a + verification step 7; `critical_rules.md` rule 7a; `critique_framework.md` mechanics row now scores cadence (max 1 pt, style only) |
|
||||
|
||||
## Maintenance resume point
|
||||
|
||||
For the authorized project-review fixes, read [FIX_PROGRESS.md](FIX_PROGRESS.md) before continuing. Both agent skill directories route to the shared workflows in `resume_builder/reference/workflows/`.
|
||||
+140
@@ -0,0 +1,140 @@
|
||||
# Review remediation — 2026-09-11
|
||||
|
||||
User authorized all recommendations in `output/Project_Review_2026-09-11/project_review.tex`.
|
||||
Work sequentially; update this file after each verified fix and before stopping.
|
||||
Do not rewrite submitted application archives or invent missing evidence.
|
||||
|
||||
## Resume point
|
||||
|
||||
**Follow-up review corrections implemented and verified.** The previous DONE labels below
|
||||
describe the first implementation. This checklist records the subsequent corrections:
|
||||
|
||||
- [x] Make authoritative application registry and migration history visible to Git.
|
||||
- [x] Fix scanner context/markup and basic schema validation.
|
||||
- [x] Fix country precedence, related decisions, new-only state and serialize scout writers.
|
||||
- [x] Fix chronological application updates.
|
||||
- [x] Make manifest content-sensitive and independent of absent local PDFs.
|
||||
- [x] Fix heading measurement and actual education template.
|
||||
- [x] Add DK/NO guidance; remove residual scope/Capgemini/GPA contradictions.
|
||||
- [x] Run regression tests, isolated checkout checks and template visual QA.
|
||||
|
||||
Verification: 49/49 tests pass both locally and in an isolated copy of all Git-included
|
||||
working-tree files, with no ignored PDFs or runtime state. Canonical, registry-view and
|
||||
manifest checks pass. The professional template builds to two pages and was visually checked.
|
||||
Historical submitted documents were not changed. No new dependencies or framework introduced.
|
||||
Manifest PDF hashes detect changed files; they intentionally do not claim a verified build association.
|
||||
The scanner remains a mechanical check; semantic claim review is still required.
|
||||
|
||||
Historical first-pass limitation: only geometry was measured then; the corrected template has
|
||||
now also been visually checked. The older packages listed below still carry historical findings;
|
||||
they are preserved as submission records, not reused as career-evidence sources.
|
||||
Read this file and inspect `git log`/`git diff` before resuming; do not repeat completed work.
|
||||
|
||||
Checkpoints: `afdef7e` (F01+F02) · `fc5f3e4` (F03–F06) · `ce5b7f5` (F07) · `3519b2f` (F08–F10) · `afd8174` (F11–F13) · `ce8619b` (F14) · `c7e8d4e` (F15–F16) · `eecdbda` (F17) · plus F18–F19.
|
||||
|
||||
## User rulings — 2026-09-11
|
||||
|
||||
- **Aker BP application date: 2026-07-29** (confirmed; the CLAUDE.md cell saying 07-30 was wrong).
|
||||
- **Aker BP Adjacent-despite-79:** user does not remember and considers it immaterial, role closed
|
||||
and rejected — *"mach wie du es am saubersten findest"*. Resolved as: keep the recorded class,
|
||||
record an honest override reason saying the rationale is unrecoverable, and do **not** reclassify.
|
||||
Silent reclassification was the review's own objection.
|
||||
- **F18/F19 document layout changes: authorized.**
|
||||
|
||||
## Checklist
|
||||
|
||||
| Finding | Status | Scope / verification |
|
||||
|---|---|---|
|
||||
| F01 | DONE | Six shared workflows; both agent entrypoints route identically; parity/link regression test |
|
||||
| F02 | DONE | 26 registry records, preserved original tables, common current view, interview events independent of outcome |
|
||||
| F03 | DONE | Quota gone (tracker is uncapped, `cohort_tracker.py` is a shim); Aker BP date and override recorded; validation enforces unique IDs, ISO dates, score range and gate/class consistency |
|
||||
| F04 | DONE | Three-level rule hierarchy in AGENTS.md + CLAUDE.md; deliverable vs QA separated; `resume_reference.md` Capgemini contradiction removed |
|
||||
| F05 | DONE | Per-claim forbidden wording enforced, identity/employer/placeholder/exclusion checks, `document_exclusions` given a canonical home, PASS no longer claims to be a truth certificate |
|
||||
| F06 | DONE | LaTeX comments, markup, accent macros and umlauts normalized; negations respected; German `und` in the cadence hint; advisory warnings labelled as never a gate |
|
||||
| F07 | DONE | Overstatement narrowed (BS-1, zero-downtime, retrieval, evaluation, PyTorch context); undervaluation fixed (BS-6 reached no bundle at all; Linux/Ansible/Bash missing from taxonomy) |
|
||||
| F08 | DONE | `evidence_schema` + per-claim `evidence` block on all 26; 8 dates recovered from existing text, 18 written `unrecorded` rather than guessed; coverage reported as an advisory hint, never a gate |
|
||||
| F09 | DONE | `12+ years` -> `over ten years` with the reasoning inline; `cv_template.tex` banner-marked as the academic legacy path |
|
||||
| F10 | DONE | US figures renamed `*_orientation_only`; the Bavarian formula runs foreign-INTO-German, so inverting it is not a recognised conversion. German grades stay canonical |
|
||||
| F11 | DONE | Requisition-keyed; same-req locations merge; shared titles warn instead of deleting. **Live run recovered 57 roles (758→815)**, including a second RUAG *Software Engineer C5I* req that was invisible |
|
||||
| F12 | DONE | Whole-word place matching (Bernau no longer reads as Bern); ~25 Swiss towns incl. Thun and Zimmerwald; Danish cities; pan-regional scope no longer beats an explicit onsite/one-country restriction. All 14 review cases correct |
|
||||
| F13 | DONE | Identifying query params kept in the key; read and write paths share `lookup_decision`. **Live run recovered 7 reposted RUAG decisions**, labelled RELATED rather than applied as identical |
|
||||
| F14 | DONE | Buckets renamed to keyword relevance with an explicit 'NOT a fit judgement'; German titles and platform/DevOps vocabulary added. Kdo Cy *ICT-System Engineer (DevSecOps/Platform Automation)* went 0→10; *Senior Dateningenieur* 1→3, level with its English twin |
|
||||
| F15 | DONE | Taleo deadline moved out of `posted` (a closing date was making roles look freshly published); `unit`, `compensation`, `contact` and `date_provenance` carried as fields through to the report and JSON. Named contacts now surface — directly serving the channel rule |
|
||||
| F16 | DONE | Restricted runs write `<date>.only-x.md` and leave the daily report intact; seen-state committed only after the report is on disk, and never by a restricted run; unique temp names for atomic writes |
|
||||
| F17 | DONE | Build sweep 46/48; `package_manifest.py` records per package what a rebuild would really do; 7 unclassified packages registered with a safe default; ` oday` removed from the cover-letter template. Historical packages untouched |
|
||||
| F18 | DONE | Rendered-line budget replaces the source-macro count; `page_metrics.py` measures page-one geometry. Demonstrated on a rebuilt copy of the NVIDIA CV: experience moved **55.4% → 44.0%**, 47 → 39 page-one lines, still 2 pages, 0 boxes, validator PASS |
|
||||
| F19 | DONE | Education entries split (degree on the entry line, institution below) after the RUAG model; grades/thesis kept only where concretely relevant; template carries the rule as a comment |
|
||||
|
||||
**Sequencing note:** F11–F16 all touch `scout.py`. Fix behaviours in place and keep each
|
||||
finding's diff separately verifiable. **Do not start the ~2400-line file split F16 suggests**
|
||||
mid-remediation — it would destroy the ability to attribute a regression to a specific fix.
|
||||
|
||||
## Verification log
|
||||
|
||||
- Review baseline: 9 existing tests passed; 43/45 LaTeX builds succeeded. See the report for limitations.
|
||||
- F01: moved current workflows into `resume_builder/reference/workflows/`; preserved skill frontmatter
|
||||
and Claude invocation support. `python -m unittest discover -s tests -v`: 10/10 pass.
|
||||
- F01 limitation: external `quick_validate.py` could not start because PyYAML is absent; repository
|
||||
tests validate frontmatter and both routing links.
|
||||
- F02: imported 26 applications from the newer CLAUDE table and seven structured cohort records.
|
||||
Originals preserved in `job_scout/state/history/application_status_before_2026-09-11.json`.
|
||||
- F03: `application_tracker.py summary` runs uncapped and reports "interview reached: 1" for SBB
|
||||
despite the withdrawal — the F02 separation working. Aker BP written through
|
||||
`records.transaction()`, so validation and view regeneration ran; `--check` reports views current.
|
||||
- F04: `resume_reference.md` said "Capgemini/Bundeswehr: include only when directly relevant",
|
||||
contradicting the standing never-include rule. Corrected, and the two rules separated.
|
||||
- F05/F06 verification — **the counter-proof document is the evidence**:
|
||||
- All six counter-proofs from the report are now caught (9 errors on one synthetic document).
|
||||
- `% Never claim Terraform` (a comment) and an honest "no Terraform experience" — English and
|
||||
German — correctly produce **no** finding.
|
||||
- **All six packages built under current rules scan clean: SBB, NVIDIA, RUAG, Kdo Cy, Citadel,
|
||||
Aker BP — 0 errors each.** Four false positives of my own making were found and fixed along the
|
||||
way (title collision across employers, education institution vs employment entry, umlauts,
|
||||
LaTeX accent macros). Each is now a regression test.
|
||||
- 13 older packages DO report findings (Apple 9, Microsoft Principal FDE 8, …). These look like
|
||||
genuine historical violations under today's stricter rules — "petabyte scale", "own the AWS data
|
||||
platform", uncontextualised PyTorch/TensorFlow. **Not fixed: F17 governs historical archives and
|
||||
they must not be silently rewritten.** Feed this list into F17.
|
||||
- `tests/test_document_scanner.py` added: 8 must-fail, 4 must-not-fail, plus a guard that current
|
||||
packages stay clean. Full suite 31/31 pass.
|
||||
- F07: raw history preserved; only selection rules and safe wording changed. The NVIDIA/RUAG
|
||||
"line could not be stopped" phrasing is left in the submitted letters and recorded as an OPEN
|
||||
ITEM in `experience_bosch.md` - plausible, unevidenced, to be confirmed before reuse.
|
||||
- F08: `unrecorded` is deliberately a real value. Failing the build on it would push a future
|
||||
session to invent dates to get a green run.
|
||||
- F10: no stale `final_grade_us_4pt` references remain anywhere in the repo.
|
||||
- F11–F14 validated on a live 37-company run: 815 matches vs 758 the day before, the delta being
|
||||
requisitions the title dedupe had been deleting. Seven employers reported shared-title collisions
|
||||
that are now kept and flagged (Grafana 5, Axpo 6, AWS 3, RUAG 2, …).
|
||||
- F14 note: the score floor on RUAG/SBB/BKW/PostFinance/Kdo Cy was a workaround for missing German
|
||||
vocabulary. The vocabulary is now the fix; the floors can probably be reduced later, but they were
|
||||
left in place to keep this diff attributable.
|
||||
- F15/F16 validated on a live 37-company run: named contacts with phone numbers now appear in
|
||||
report rows, NATO/Taleo closing dates render as Bewerbungsfrist rather than Posted, and
|
||||
`--only=kdocy` wrote `2026-09-11.only-kdocy.md` while leaving the full report untouched.
|
||||
- F16 context: the daily-report clobber is not hypothetical. It happened twice in this session
|
||||
(2026-09-10 and 09-11) and both times the full run had to be repeated by hand.
|
||||
- F17 build sweep RUN this session: 48 sources, 46 built, 2 failed —
|
||||
`Infineon_AI_Engineer` cover letter (font expansion: the font is not scalable) and
|
||||
`cv_template.tex` (unfilled placeholders, expected for the academic legacy template).
|
||||
Overfull boxes: Microsoft ISE 25.33pt, Isovalent 0.88pt. Both are historical; not touched.
|
||||
- F17 findings across 21 application packages: **17 are date-dependent** (` oday` in the cover
|
||||
letter, so a rebuild restamps them), **1 has an incomplete source distribution** (NATO ships no
|
||||
`resume.cls` and only builds because a copy exists elsewhere on this machine), 1 has no PDF.
|
||||
The repo carries **three different `resume.cls` variants** (13/7/1 copies), which is exactly why
|
||||
copying the newest one into NATO would not be a safe repair.
|
||||
- F17 classification: 7 packages were unregistered; added to `historical_revalidate`, with a
|
||||
recorded default that anything unlisted is treated that way. Being recent is not being verified —
|
||||
none was re-read for this.
|
||||
- F18/F19 validated by measurement, not assertion: `page_metrics.py` reproduced the review's own
|
||||
figures (NVIDIA 55.4%, SBB 50.6%, RUAG 50.3%) before any change, which is what makes the
|
||||
after-figure meaningful. The submitted NVIDIA package was NOT modified - the demonstration was
|
||||
built from a copy.
|
||||
- The percentage is a DIAGNOSTIC, not a target. No pixel goal, no forced page-two filling.
|
||||
|
||||
## Completion rules
|
||||
|
||||
DONE requires implementation plus relevant checks. Record partial work and exact next action.
|
||||
Missing factual evidence must remain explicitly unresolved, never silently promoted to verified.
|
||||
Historical packages are preserved; fixes apply to active sources and future generation unless
|
||||
specifically noted.
|
||||
Binary file not shown.
@@ -28,7 +28,7 @@ source documents
|
||||
- Target Staff/Senior Data Engineering first.
|
||||
- Use ML Platform/MLOps, data platform, analytics, and semiconductor profiles only where direct evidence covers the actual requirements.
|
||||
- Treat direct LLM engineering, formal model evaluation, Terraform-heavy SRE, and similar missing required experience as gates rather than keyword opportunities.
|
||||
- Build application cohorts with roughly 70% core, 20% adjacent, and 10% deliberate stretch roles.
|
||||
- Record fit and outcomes without application quotas; a fit classification is a preparation signal.
|
||||
- Add a warm-channel action for core applications.
|
||||
|
||||
The default document is a two-page International Tech resume for US-tech/FAANG-style roles in Europe. A Swiss/DACH policy overlay is available for employers that expect local conventions. Cover letters are conditional, not automatic.
|
||||
@@ -66,14 +66,37 @@ Validate a generated document:
|
||||
python resume_builder/helpers/validate_resume_system.py --document output/Role/resume.tex
|
||||
```
|
||||
|
||||
Track the active 7/2/1 cohort:
|
||||
Track the uncapped application record (use `summary --all` for older applications too):
|
||||
|
||||
```powershell
|
||||
python resume_builder/helpers/cohort_tracker.py summary
|
||||
```
|
||||
|
||||
`job_scout/state/applications.json` owns current status and event history. The old cohort JSON and
|
||||
`resume_builder/reference/current_applications.md` are generated views. Update status without erasing interview history:
|
||||
|
||||
```powershell
|
||||
python resume_builder/helpers/cohort_tracker.py update --id <application-id> --date YYYY-MM-DD --event interview_held --note "Interview completed"
|
||||
python resume_builder/helpers/cohort_tracker.py update --id <application-id> --date YYYY-MM-DD --outcome withdrawn_by_candidate --note "Reason"
|
||||
python resume_builder/helpers/application_records.py --check
|
||||
```
|
||||
|
||||
Use `application_records.py --render` to recover stale generated views. A classification that differs
|
||||
from its numeric rubric needs `--fit-override-reason`; it is never silently relabelled.
|
||||
|
||||
Character counts are available only as readability diagnostics. There are no fixed character bands, equal-length bullet rules, or page-fill quotas.
|
||||
|
||||
Run the offline regression suite with `python -m unittest discover -s tests -v`.
|
||||
The application registry and its import history are versioned; seen-state and generated PDFs are not.
|
||||
`package_manifest.py --check` checks source/class content and any recorded PDFs that are present.
|
||||
Missing local PDFs are permitted. After inspecting changes, run `package_manifest.py` to refresh
|
||||
source hashes, or add `--record-pdfs` to explicitly record current PDF hashes. These snapshots
|
||||
detect edits; they do not certify that an existing PDF was built from a particular source.
|
||||
|
||||
Scout writers are serialized with `job_scout/state/scout.lock`. After a crash, remove a stale
|
||||
lock only after verifying no scout process is still running. Successful reports, including
|
||||
`--new-only` and `--only=...`, mark their delivered results seen without changing other companies.
|
||||
|
||||
## Output and prerequisites
|
||||
|
||||
The system writes `.tex` source only. Compile locally with a LaTeX distribution such as MiKTeX, TeX Live, or MacTeX. Generated resumes should also be checked through PDF rendering and text extraction before submission.
|
||||
|
||||
@@ -61,6 +61,21 @@ Verified errors to never re-introduce. Add entries as you catch mistakes.
|
||||
| Swisscom Security Champion | NOT an award. It is a mandatory team role (security point of contact). Dennis holds the badge for 2025/2026 only — NOT "3 consecutive years." Do not frame as an award or honor. Only include when JD requires security experience. |
|
||||
| Swisscom AWS migration — not solo | **User-corrected 2026-07-27.** `experience_swisscom.md` SW-1 previously read "Primary owner / **sole technical lead**" and its 3L bullet said "**Led** migration of legacy Teradata/Oracle ETL stack." Both are wrong. Dennis was the primary engineer for **his own domains'** pipelines and a contributor to the wider company migration programme. Always scope the object ("my domains' ETL stack") or hedge the verb ("contributed to"). Source files corrected. |
|
||||
| LangChain | **NEVER USED — do not list.** Crept into Apple and Infineon resume outputs as a fabrication when "custom GPTs" was reframed to fit JD vocabulary. Verified GenAI toolchain: **Kiro** (AI IDE / spec-driven dev), **VS Code + Copilot**, **LiteLLM** (LLM API gateway — created/used APIs), **custom GPTs** with fed domain knowledge. Never substitute LangChain/LangGraph/LlamaIndex for these. |
|
||||
| Python backend frameworks | **Django, Flask and FastAPI used in private/hobby projects only, never professionally** (user-confirmed 2026-09-18; PP-4). Allowed with explicit personal-project context. Do not infer project names, dates, scale or production deployment. |
|
||||
| Enterprise SaaS/SSO administration | **Not performed**, user-confirmed 2026-09-18. Personal server administration and the Bosch secrets plugin do not establish enterprise SaaS/identity administration. This is not a blanket statement that OAuth/SCIM/Okta have never been encountered in any context. |
|
||||
| Data-product design / frontend | **User-confirmed 2026-10-03:** current Swisscom work includes data modelling, design and implementation of data products (SW-7). **Updated 2026-10-21:** software design and architecture were part of his work at Bosch (ingestion/inference scripts, 2020-2022) and at Swisscom (data products); combined they exceed three years. The Swisscom start date stays undated, and design is scoped to his own components, never shared-platform architecture or an architect title. **No frontend experience**; do not claim frontend/UI development or Full Stack expertise from backend JavaScript, Selenium tests, thesis wording or a personal dashboard. |
|
||||
|
||||
---
|
||||
|
||||
## Job-change Preferences
|
||||
|
||||
User clarification, 2026-10-06:
|
||||
|
||||
- **Current baseline:** 3 homeoffice days per week.
|
||||
- **Fewer than 3 homeoffice days:** acceptable only when the role offers a clear overall improvement over the current position. Assess the total package, including compensation, role scope, development, commute, working time and benefits; no numerical improvement threshold has been specified.
|
||||
- Homeoffice is a conditional trade-off, not an absolute 3-day minimum. Clarify the working model and total package early; do not automatically reject a role solely for fewer homeoffice days.
|
||||
- The user expects a sufficient improvement most likely at FAANG or comparable employers. This is his expectation, not a restriction to those employers or a verified compensation claim.
|
||||
- **Internal Swisscom move (Geo Platform):** a separate change of tasks, with no change to position or seniority and no substantial salary change expected (user clarification, 2026-10-06). It does not replace, pause or change the external search, including if the internal move succeeds. Evaluate it as an internal task change; do not apply the external-upgrade expectation to this move.
|
||||
|
||||
---
|
||||
|
||||
|
||||
+1336
-81
File diff suppressed because it is too large.
Load diff
@@ -12,66 +12,92 @@
|
||||
"adjacent": "Evidence Fit 60-74, no required Gap, normally at most one serious preferred gap",
|
||||
"stretch": "Evidence Fit below 60 or a defining responsibility is only Adjacent"
|
||||
},
|
||||
"policy_change_2026_09_05": "Slot caps (7 core / 2 adjacent / 1 stretch) DROPPED by user decision. target_mix is retained only as a record of the original design and is no longer read by cohort_tracker.py or enforced anywhere. This file continues as a durable application log. Channel is now the rationed variable: no application goes out cold when a named contact is published and reachable. See resume_builder/reference/application_strategy.md.",
|
||||
"generated_from": "job_scout/state/applications.json",
|
||||
"applications": [
|
||||
{
|
||||
"company": "Google",
|
||||
"role": "Software Engineer III, Business Home",
|
||||
"application_date": "2026-07-27",
|
||||
"fit_class": "core",
|
||||
"evidence_fit": 89.0,
|
||||
"hard_gate": "pass",
|
||||
"company": "NVIDIA",
|
||||
"role": "Senior DevOps Engineer, Zurich (JR2024256)",
|
||||
"application_date": "2026-09-05",
|
||||
"fit_class": "stretch",
|
||||
"evidence_fit": 64.0,
|
||||
"hard_gate": "fail",
|
||||
"channel": "weak",
|
||||
"outcome": "rejected_no_interview"
|
||||
"outcome": "applied",
|
||||
"id": "app-9068f462d9b9",
|
||||
"label": "NVIDIA - Senior DevOps Engineer, Zürich (req JR2024256)",
|
||||
"next_action": "No action expected; req pulled ~2026-09-20. Treat as dormant. Does not block NVIDIA JR2027105 (Senior Production Engineer, DGX Cloud).",
|
||||
"current_summary": "SUBMITTED 2026-09-05.",
|
||||
"events": [
|
||||
{
|
||||
"type": "legacy_status_import",
|
||||
"recorded_at": "2026-09-11",
|
||||
"source": "CLAUDE.md / application_cohort.json",
|
||||
"details": "**SUBMITTED 2026-09-05.** Recorded in the application record (now 7 entries) and in the scout decision log. ⚠ **Hybrid vs 5-day onsite was never resolved before sending**, so the working model is now a **live screening topic**, not a pre-cleared one - the same pattern as RUAG's comp/PSP. Thun→Zürich is ~1h50 each way; a 5-day-onsite answer is the main disqualifier to watch for. Comp is *not* a risk (levels.fyi Greater Zürich IC3 median ≈ CHF 204k, IC4 ≈ CHF 379k). Channel **Weak - the 7th consecutive cold submit**, though this posting published no named contact, so cold was the only option available. Submission PDFs `Dennis_Thiessen_Resume.pdf` and `Dennis_Thiessen_Cover_Letter.pdf` exist and are MD5-verified against source; letter recompiled so its date reads 5 Sep 2026. ⚠ **The letter carries `\today` and the submission copies are copies, not build targets - if it is sent on a later day, recompile the letter and refresh both copies first** (`config.md` Output Rules). Submitted despite the hard-gate failures on an explicit user override, the same shape as RUAG AI Engineer C5I. Resume 2pp/13 bullets + 1pp cover letter (279 body words), both validators PASS 0 warnings, 0 boxes, visually inspected. Measured **Document Quality 82/100** at critique; **both Tier 1 findings were fixed 2026-09-05** - `Ubuntu` removed from the skills line (0 canonical; `PP-3` is Debian only, and the Debian→Ubuntu transfer argument belongs in an interview answer, not a skills line) and `security hardening` now marked *(personal server)* per the explicit `claims.json` instruction. Four honest ATS terms were added from existing evidence (configuration management, service reliability, container orchestration, observability), lifting JD term coverage **50%→61%**; no bullet was touched, so the budget stayed at 13 and cadence could not regress. **The critique is now STALE BY DESIGN - the document is better than 82 but that number was not re-measured, so never quote a post-edit estimate as a score.** The headline reorder was deliberately NOT applied: it is a positioning call for the user and `\\headline` sits in the FIXED header block. Cover-letter hook is first-party verified (NVIDIA's own live Zürich posting JR2022878); **a hook was DROPPED at verification** - the Phase 0 plan's \"Alps / Swiss AI Initiative with ETH Zürich and EPFL\" is **not** supported by the first-party NVIDIA newsroom release, which mentions neither EPFL nor any Swiss AI Initiative; that came from secondary coverage. The letter names **both** honest gaps out loud - on-prem networking, and that employer-side Linux/Ansible ended Dec 2022 with only a personal server carrying currency. **⚠ BLOCKING: the working model is still unresolved and no document fix changes that.** Session `output/NVIDIA_SrDevOps_Zurich/session_nvidia_sr_devops.md`; JD scraped live via Playwright and saved verbatim (posted ~2026-09-01, very fresh). Evidence Fit **64/100**, fit class **Stretch**, **hard gate FAIL on two counts**: (1) required line *\"Strong expertise in on-premises networking and compute infrastructure\"* is a **Gap** - networking is 0 canonical and is not substitutable from data-platform work; (2) **hybrid vs onsite is UNRESOLVED** and the JD is silent - Thun→Zürich is ~1h50 each way. Required tally **3 Direct / 3 Adjacent / 1 Gap**. Recorded as an override rather than a passing gate, the same shape as RUAG AI Engineer C5I. (At the time this also had no free cohort slot; **that constraint no longer exists** - caps dropped 2026-09-05.) **Correction to the same day's scout triage: it called two required lines Gaps; only Q5b networking is one. Q2 (10+ yrs DevOps) is Adjacent and defensible** - a continuous CI/CD/automation thread runs Generali 2015 → today across five employers; the honest weakness is that those roles were titled data/test/research engineer, not DevOps. **The finding that changes the calculus: comp.** levels.fyi Greater Zürich puts NVIDIA IC3 median ≈ CHF 204k and IC4 ≈ CHF 379k, the highest-paying SWE employer in the city - the first role in the log where comp is a reason to *accept* a long commute rather than decline. Caveat: self-reported and equity-heavy after an extraordinary NVDA run; treat base as the reliable part. Strongest match is **R3, CI/CD pipelines for R&D engineering teams** - literally his career shape (`FC-1` Jenkins at a Fraunhofer institute, `BS-6` Ansible/Jenkins for fab analytics teams, `SW-3` Kubernetes + GitLab today). Zürich is NVIDIA's HPC/AI infrastructure-software R&D hub - first-party verified from NVIDIA's own live Zürich posting JR2022878 (*\"building the next generation of scalable AI infrastructure ... distributed training, real-time inference, and communication efficiency across large systems\"*), which is the hook the letter uses. **The Alps / Swiss AI Initiative framing was checked and dropped** - see above. **Honest gaps that travel with it:** on-prem networking (0), HPC (0), Line truncated
|
||||
"legacy_next_action": "**Await response. Raise the working model at first contact** - it went in unresolved and a 5-day-onsite seat would be a late no. Note: `claims.json` has no shell-scripting entry, so **Bash is omitted** from Skills although the JD names it and ten years of Debian admin plus Ansible work plainly involve it - same shape as the Ansible/Linux gaps found 2026-08-27. Confirm with the user and record it. Groovy stays out regardless."
|
||||
},
|
||||
{
|
||||
"company": "Aker BP ASA",
|
||||
"role": "Data Product Architect - AI-ready Data Products",
|
||||
"application_date": "2026-07-29",
|
||||
"fit_class": "adjacent",
|
||||
"evidence_fit": 79.0,
|
||||
"hard_gate": "pass",
|
||||
"channel": "weak",
|
||||
"outcome": "rejected_no_interview",
|
||||
"submitted": "2026-07-29",
|
||||
"rejection_date": "2026-08-27"
|
||||
"type": "applied",
|
||||
"date": "2026-09-05"
|
||||
},
|
||||
{
|
||||
"company": "SBB",
|
||||
"role": "Data Engineer (m/w/d), Asset Management Infrastrukturanlagen, Bern",
|
||||
"job_id": "103755",
|
||||
"application_date": "2026-08-25",
|
||||
"fit_class": "core",
|
||||
"evidence_fit": 79.0,
|
||||
"hard_gate": "pass",
|
||||
"type": "note",
|
||||
"date": "2026-10-22",
|
||||
"note": "Posting pulled: JR2024256 was last listed in the 2026-09-18 scout scrape, absent from every scrape since 2026-09-23, and the posting page reads 'The page you are looking for doesn't exist' on 2026-10-22. No response from NVIDIA recorded. Outcome left as applied (no rejection received). The req is closed, so it no longer blocks a second NVIDIA application (BIS jr100429 precedent)."
|
||||
}
|
||||
],
|
||||
"cohort_id": "evidence-first-2026-01"
|
||||
},
|
||||
{
|
||||
"company": "RUAG MRO Holding AG (Business Area C5I)",
|
||||
"role": "AI Engineer C5I (w/m/d), Thun",
|
||||
"application_date": "2026-08-27",
|
||||
"fit_class": "stretch",
|
||||
"evidence_fit": 74.0,
|
||||
"hard_gate": "fail",
|
||||
"channel": "weak",
|
||||
"outcome": "withdrawn_by_candidate",
|
||||
"submitted": "2026-08-25",
|
||||
"open_risk": "Anforderungsniveau K is a capped GAV band, figures not public; seat may read lateral or below current Staff + Component Owner scope.",
|
||||
"outcome": "rejected_after_interview",
|
||||
"id": "app-ca0990d47bd0",
|
||||
"label": "RUAG C5I - AI Engineer C5I, Thun (application ID 18027)",
|
||||
"next_action": "Abgeschlossen: Absage nach Interview; Anforderungen vor allem beim Homeoffice nicht vereinbar. Keine weitere Aktion fuer diese Bewerbung offen.",
|
||||
"current_summary": "Absage von RUAG am 2026-10-06 erhalten, laut Nutzer. RUAG konnte die Anforderungen des Nutzers, vor allem bezueglich Homeoffice, nicht erfuellen. Konkreter Homeoffice-Umfang nicht genannt. Interview am 2026-10-02 bleibt dokumentiert.",
|
||||
"events": [
|
||||
{
|
||||
"type": "legacy_status_import",
|
||||
"recorded_at": "2026-09-11",
|
||||
"source": "CLAUDE.md / application_cohort.json",
|
||||
"details": "**SUBMITTED 2026-08-27** via jobs.ruag.ch (portal only; email and post refused). Evidence Fit **74/100**, fit class **Stretch**, hard gate **FAIL** (R1 and R2, the two title-defining responsibilities, are Adjacent not Direct), Document Quality **93/100** after a full critique-and-fix round (85 pre-edit), truth and provenance 24/25, **0 Tier 1 findings at Round 2**, channel **Weak/cold**. Submitted: German CV **2 pages, 13 bullets** + German motivation letter **1 page, 295 words**; both validators PASS, 0 boxes, text-order and visual QA clean, submission PDFs MD5-verified before sending. **Cohort evidence-first-2026-01 is now 6/10 and the sole Stretch slot is CONSUMED (Core 3/7, Adjacent 2/2, Stretch 1/1)** - any further application must clear Core or Adjacent on its own merits. Positioning is his canonical title **Staff Data, Analytics & AI Engineer**, carried by `BS-1` production ML-inference integration, `BS-6` Linux/Ansible, `SW-3`/`SW-7`/`SW-2` current Kubernetes and data-product work, `PP-3` current self-hosted Linux and hardening, `SW-5` DevSecOps tied to C5I's stated operating model, and the canonical `BW-1` officer career. The letter **names the AI-platform gap in one sentence** and pivots to the operations/platform side. **Honest gaps that travel with it:** no AI/LLM platform built or operated, no compute/GPU cluster, no RAG/retrieval implementation, no formal LLM evaluation; ML/AI-framework depth is certification-context only. **Compensation, PSP/project eligibility and role level were NEVER resolved before sending, so all three are now live screening topics rather than pre-cleared ones.** ⚠ **Marco Heinzen's published direct line (+41 79 568 14 96) was never used** - this went in as a pure cold submit, the sixth consecutive one. **If rejected, that is NOT a signal to drop RUAG:** five other RUAG C5I reqs sit in the scout log, and **Senior DevOps Engineer C5I** is already shortlisted and is a **materially better fit than this one**, sitting on the lane where his evidence is Direct rather than Adjacent (still live and verified on the board 2026-09-04). The **Data Lakehouse / Senior Data Platform Engineer** req was a title-match prior that the JD does not support — it was reposted 2026-09-04 as **Senior Data Engineer (MSSQL)**, requires on-prem MSSQL / Talend / SAP S/4HANA (0 canonical each), and is **ruled out**. **Scout run 2026-09-07: the RUAG C5I backlog is now SETTLED — undecided RUAG rows went 69 → 3** (`ICT Architect`, `Software Engineer C5I`, `Cyber Security Consultant` remain open; `ICT Architect C5I` stays `paused`). Do not re-triage that board from scratch; read `decisions.json`, where every rule-out note states whether it came from a JD read or from the title/family pattern. Three JD reads that cycle all ruled out: **Test Manager C5I** (the closest call — it escapes the networking gap entirely and BW-1 scores, but required *\"fundierte Erfahrung als Test Engineer\"* rests on `VIZRT`, **ten months, ended 2018-05**, so it is thin and stale, plus a lane exit and a third C5I req while 18027 is pending), **System Engineer C5I** (VMware + Firewall + Netzwerk, all 0), and **ICT Solution Architect Business Applications** (required *\"mehrjährige Erfahrung als Solution Architect\"* — a title `feedback_swisscom_datamesh_ownership` forbids — and the duties are *\"unter Anleitung\"*, a supporting seat below authoring).",
|
||||
"legacy_next_action": "Await response. Optional but still worthwhile: call **Marco Heinzen** about technical scope and level, and **Frank Haugwitz** about compensation and PSP/project eligibility. **NEW CONTACT 2026-09-07 — `Lars Kauz`, Head of ICT Infrastructure C5I, +41 79 293 93 82, lars.kauz@ruag.ch**, published on the System Engineer C5I posting. Channel is the rationed variable since the 09-05 cohort change, so a published, reachable name matters — **but he heads ICT Infrastructure, the function whose req was ruled out for VMware/VDI/Windows content, and that is NOT demonstrably the Kubernetes platform group Senior DevOps C5I sits in.** He is a warm entry into C5I, not a verified channel for rank 1; Haugwitz stays the recorded gate. Do not react to a single outcome with positioning changes (`application_strategy.md` §38/§74)."
|
||||
},
|
||||
{
|
||||
"type": "applied",
|
||||
"date": "2026-08-27"
|
||||
},
|
||||
{
|
||||
"type": "interview_invited",
|
||||
"date": null,
|
||||
"recorded_at": "2026-09-28",
|
||||
"scheduled_for": "2026-10-02",
|
||||
"source": "user update 2026-09-28"
|
||||
},
|
||||
{
|
||||
"type": "interview_held",
|
||||
"date": "2026-10-02",
|
||||
"note": "Interview am 2026-10-02 gefuehrt. Umfeld aus Nutzersicht interessant; Angebot bzw. Gesamtpaket vermutlich wenig konkurrenzfaehig (vorlaeufiger Eindruck, kein bestaetigtes Angebot oder Gehaltsbetrag). Entscheidung offen. Nutzer ueberlegt und will RUAG naechste Woche seinen Eindruck mitteilen.",
|
||||
"outcome": "interviewing"
|
||||
},
|
||||
{
|
||||
"type": "rejected_after_interview",
|
||||
"date": "2026-10-06",
|
||||
"note": "Absage von RUAG am 2026-10-06 erhalten, laut Nutzer. RUAG konnte die Anforderungen des Nutzers, vor allem bezueglich Homeoffice, nicht erfuellen. Konkreter Homeoffice-Umfang nicht genannt. Interview am 2026-10-02 bleibt dokumentiert.",
|
||||
"outcome": "rejected_after_interview"
|
||||
}
|
||||
],
|
||||
"cohort_id": "evidence-first-2026-01",
|
||||
"interview": {
|
||||
"stage": "Stage 2 of 4 - Virtuelles Kennenlernen mit HR und Fuehrungskraft",
|
||||
"invited": "2026-08-28",
|
||||
"scheduled": "2026-09-09 08:30",
|
||||
"duration_min": 45,
|
||||
"format": "Microsoft Teams",
|
||||
"held": "2026-09-09",
|
||||
"result": "Held 2026-09-09 (HR + Scrum Master). Candidate WITHDREW 2026-09-11 after SBB confirmed there was no room to move on the Einstufung.",
|
||||
"user_read": "User reported 'ein paar Red Flags' and judged that the Rahmenbedingungen do not compensate for them. The specific red flags were NOT captured while fresh - if this is reopened, ask before relying on memory. Leaning negative but explicitly undecided as of 2026-09-10; he asked to leave it open pending SBB's feedback."
|
||||
},
|
||||
"note": "FIRST interview invitation in the evidence-first cohort. Converted from a COLD submit - the published warm contact (Andri Wienandts, +41 79 364 62 53) was never called. The resume never contained Snowflake, dbt or Power BI, the three literals an ATS keyword screen would have keyed on, so a human read the dossier.",
|
||||
"comp_datapoint": "HARD FIGURES, from the interview - supersedes the earlier +10% estimate. Anforderungsniveau K TOPS OUT AT ~CHF 145k. His own position: ~CHF 135k today inside a Swisscom band that runs to ~CHF 160k. So the decisive point was NOT the absolute number but the HEADROOM: he would have had to enter K at its ceiling just to break even, with nothing left above. First hard calibration of a Swiss public-sector band and the reference point for the whole Bern/Thun tier (RUAG, Swissgrid, BKW, BFH, PostFinance).",
|
||||
"withdrawn": "2026-09-11",
|
||||
"why_withdrawn": "Total package was a net DOWNGRADE on four counts: 41h vs 40h week; 25 days holiday + Brueckentage vs 28 + 5 from Zeitautonomie; 3 office days vs 2; and the band ceiling above. Plus a qualitative red flag: he spoke only to HR and the Scrum Master and perceived DIFFICULTIES IN THE TEAM. That one is not fixable by a salary offer - note it if SBB or a similar Bern-tier seat comes back.",
|
||||
"lesson": "SBB-SPECIFIC targeting rule (user 2026-09-11): at SBB, Anforderungsniveau K is too low - aim at Niveau L and/or Kader. NARROWED the same day at the user's instruction: Anforderungsniveau is SBB's OWN system (https://company.sbb.ch/de/jobs-karriere/arbeitgeberin/lohn.html) and does NOT generalise - jobs.admin.ch uses Lohnklassen, RUAG its own scheme, PostFinance per-posting bands. ~145k is an SBB ceiling, not a tier anchor. THUN-AREA EMPLOYERS (RUAG, Kdo Cy) ARE EXPLICITLY OUT of this reasoning: near-zero commute plus benefits a band does not show - he named childcare-cost coverage at the Schweizer Armee/Kdo Cy as potentially far more generous (UNVERIFIED - ask). Never decline a Thun-area role on band alone. What DOES generalise: judge by headroom in the band, and price the total package (working time, holiday, office days), not the entry number."
|
||||
},
|
||||
{
|
||||
"company": "Citadel Securities",
|
||||
"role": "Platform Engineer, Research Platform Engineering (Zurich/NY/Miami)",
|
||||
"application_date": "2026-08-26",
|
||||
"fit_class": "adjacent",
|
||||
"evidence_fit": 71.0,
|
||||
"hard_gate": "pass",
|
||||
"channel": "weak",
|
||||
"outcome": "applied"
|
||||
"scheduled": "2026-10-02",
|
||||
"date_precision": "day"
|
||||
}
|
||||
},
|
||||
{
|
||||
"company": "Schweizer Armee - Kommando Cyber",
|
||||
@@ -85,28 +111,400 @@
|
||||
"submitted": "2026-08-27",
|
||||
"rejection_date": "2026-09-10",
|
||||
"days_to_disposition": 14,
|
||||
"note": "Form-letter rejection from Besarta Mehmeti, no interview, 14 days to disposition - the fastest in the log after Google Business Home. The letter is boilerplate ('Profil und unsere Kriterien nicht in allen Punkten uebereinstimmen') and carries ZERO diagnostic content, so it is not a signal about the package and is no reason to re-audit it. Same disposition class as Microsoft ISE, Google Business Home and Aker BP: a cold-channel no-interview rejection does not implicate document quality on its own. WORTH WATCHING, NOT CONCLUDING: this row and the SBB row are identical on every recorded dimension - core, Evidence Fit 79, hard gate pass, Document Quality 92, channel weak - and they went opposite ways (SBB converted to an interview, this died in 14 days). That shows the fit score did not discriminate; it does NOT show what did. n=1 on each side. Do not react with positioning changes (application_strategy.md 38/74). Channel note: Marcel Matthey-Doret (+41 58 46 78409) was published and never called - the fourth published, reachable contact left unused after Heinzen (RUAG), Wienandts (SBB) and Marthinsen (Aker BP). Consistent with the 2026-09-05 channel policy, but NOT evidence for it: the single interview in this log came from a cold submit."
|
||||
"note": "Form-letter rejection from Besarta Mehmeti, no interview, 14 days to disposition - the fastest in the log after Google Business Home. The letter is boilerplate ('Profil und unsere Kriterien nicht in allen Punkten uebereinstimmen') and carries ZERO diagnostic content, so it is not a signal about the package and is no reason to re-audit it. Same disposition class as Microsoft ISE, Google Business Home and Aker BP: a cold-channel no-interview rejection does not implicate document quality on its own. WORTH WATCHING, NOT CONCLUDING: this row and the SBB row are identical on every recorded dimension - core, Evidence Fit 79, hard gate pass, Document Quality 92, channel weak - and they went opposite ways (SBB converted to an interview, this died in 14 days). That shows the fit score did not discriminate; it does NOT show what did. n=1 on each side. Do not react with positioning changes (application_strategy.md 38/74). Channel note: Marcel Matthey-Doret (+41 58 46 78409) was published and never called - the fourth published, reachable contact left unused after Heinzen (RUAG), Wienandts (SBB) and Marthinsen (Aker BP). Consistent with the 2026-09-05 channel policy, but NOT evidence for it: the single interview in this log came from a cold submit.",
|
||||
"id": "app-e7389ad9d46f",
|
||||
"label": "Schweizer Armee - Kommando Cyber (Kdo Cy), DevOps Engineer III (Data Platform), Zimmerwald (Ref JRQ$540-19848)",
|
||||
"next_action": "Closed; no pending application action. Read recorded history before reopening.",
|
||||
"current_summary": "CLOSED - REJECTED 2026-09-10",
|
||||
"events": [
|
||||
{
|
||||
"type": "legacy_status_import",
|
||||
"recorded_at": "2026-09-11",
|
||||
"source": "CLAUDE.md / application_cohort.json",
|
||||
"details": "**CLOSED - REJECTED 2026-09-10** (submitted 2026-08-27, **14 days to disposition**, no interview - the fastest in the log after Google Business Home). Form letter from **Besarta Mehmeti**; the text is boilerplate (*„Profil und unsere Kriterien nicht in allen Punkten übereinstimmen\"*) and carries **zero diagnostic content** - it is not a signal about the package and is **no reason to re-audit it**. Same disposition class as Microsoft ISE, Google Business Home and Aker BP: **a cold-channel no-interview rejection does not implicate document quality on its own.** ⚠ **WORTH WATCHING, NOT CONCLUDING:** this application and **SBB** are identical on every recorded dimension - Core, Evidence Fit **79**, hard gate PASS, Document Quality **92**, channel Weak - and they went opposite ways: SBB converted to an interview, this died in 14 days. **That shows the fit score did not discriminate; it does not show what did.** n=1 on each side - do not react with positioning changes (`application_strategy.md` §38/§74). **Channel:** Marcel Matthey-Doret's published line (+41 58 46 78409) was never called - the **fourth** published, reachable contact left unused after Heinzen (RUAG), Wienandts (SBB) and Marthinsen (Aker BP). Consistent with the 2026-09-05 channel policy but **not evidence for it**: the only interview in the log came from a *cold* submit whose resume was missing all three ATS literals. **Kdo Cy as an organisation is NOT closed** - 11 Kdo Cy roles were open on the portal at submission time and only this req is decided. Evidence Fit **79/Core**, hard gate **PASS**, Document Quality **92/100**, channel **Weak**. Submitted package: German 2-page CV with **15 bullets** and 1-page motivation letter with **300 body words**; validators PASS, 0 boxes, text order and visual QA clean. Canonical **BW-1** records the six-year Bundeswehr officer career and anchors the letter's military/public-service motivation. User explicitly accepted the critique's remaining BS-1 wording issue (*„ohne manuellen Eingriff“*) as good enough and submitted unchanged. Honest gaps remain physical datacenter work, GPGPU, ClickHouse and named Pull-GitOps practice. Cohort evidence-first-2026-01 is now **5/10, Core 3/7** *(pre-dates the 2026-09-05 cap drop; counts are a record, not a budget)*.",
|
||||
"legacy_next_action": "Done - rejection recorded in `application_cohort.json`, `decisions.json` and the session file. Optional and low-cost: a one-line feedback request to **Besarta Mehmeti**, which also builds a contact at an org with other open reqs."
|
||||
},
|
||||
{
|
||||
"company": "RUAG MRO Holding AG (Business Area C5I)",
|
||||
"role": "AI Engineer C5I (w/m/d), Thun",
|
||||
"application_date": "2026-08-27",
|
||||
"fit_class": "stretch",
|
||||
"evidence_fit": 74.0,
|
||||
"hard_gate": "fail",
|
||||
"channel": "weak",
|
||||
"outcome": "applied"
|
||||
"type": "applied",
|
||||
"date": "2026-08-27"
|
||||
},
|
||||
{
|
||||
"company": "NVIDIA",
|
||||
"role": "Senior DevOps Engineer, Zurich (JR2024256)",
|
||||
"application_date": "2026-09-05",
|
||||
"fit_class": "stretch",
|
||||
"evidence_fit": 64.0,
|
||||
"hard_gate": "fail",
|
||||
"channel": "weak",
|
||||
"outcome": "applied"
|
||||
"type": "rejected_no_interview",
|
||||
"date": "2026-09-10"
|
||||
}
|
||||
],
|
||||
"policy_change_2026_09_05": "Slot caps (7 core / 2 adjacent / 1 stretch) DROPPED by user decision. target_mix is retained only as a record of the original design and is no longer read by cohort_tracker.py or enforced anywhere. This file continues as a durable application log. Channel is now the rationed variable: no application goes out cold when a named contact is published and reachable. See resume_builder/reference/application_strategy.md."
|
||||
"cohort_id": "evidence-first-2026-01"
|
||||
},
|
||||
{
|
||||
"company": "Citadel Securities",
|
||||
"role": "Platform Engineer, Research Platform Engineering (Zurich/NY/Miami)",
|
||||
"application_date": "2026-08-26",
|
||||
"fit_class": "adjacent",
|
||||
"evidence_fit": 71.0,
|
||||
"hard_gate": "pass",
|
||||
"channel": "weak",
|
||||
"outcome": "applied",
|
||||
"id": "app-ef2bec6fe379",
|
||||
"label": "Citadel Securities — Platform Engineer, Research Platform Engineering, Zürich (also NY/Miami)",
|
||||
"next_action": "Await response. At first contact, confirm whether the application is for the Zurich seat; relocation to the US remains ruled out. Clarify homeoffice/onsite requirements and the Zurich compensation package. Baseline is 3 homeoffice days/week; fewer days require a clear overall improvement. The posted US salary range is not a Zurich figure.",
|
||||
"current_summary": "SUBMITTED 2026-08-26 — open, awaiting response.",
|
||||
"events": [
|
||||
{
|
||||
"type": "legacy_status_import",
|
||||
"recorded_at": "2026-09-11",
|
||||
"source": "CLAUDE.md / application_cohort.json",
|
||||
"details": "**SUBMITTED 2026-08-26 — open, awaiting response.** Recorded as `adjacent` in `application_cohort.json` (outcome `applied`) and as `applied` in `decisions.json`. *Slot language from the capped-cohort era has been removed here: the caps were dropped 2026-09-05 and counts are a record, not a budget.* ⚠️ **KEY FINDING — the application form's preferred-work-location selector offered NO Zurich**, despite the JD saying \"Miami, Zurich or New York\" and the site's own Zurich filter returning this req. Careers site is operated by **Citadel Enterprise Americas LLC**; the apply flow is likely US-entity, or the Zurich seat is closed while the posting stands. **This partly supersedes the working-model risk** — if no Zurich seat is reachable through that form, hybrid-vs-onsite is moot and the application may sit against a US req, a hard NO on relocation. **Rule for any future Citadel application: check the form's location selector BEFORE building a package** — the posting's stated locations and the site filter both proved unreliable. User applied with low expectation; cold channel, evergreen standing req. 2pp resume (13 bullets) + 1pp CL (270 words), both validator **PASS, 0 warnings**; JD term coverage 51%→68% after Tier 1 fixes. Critique **STALE by design** (86/100 pre-edit; user chose to submit as-is over re-critiquing; est. ~91 post-edit, never quote as a score). **CORRECTED 2026-09-10:** this row previously said *\"Cohort entry and decision-log entry deliberately NOT written — no confirmed send date\"* while its own status line read SUBMITTED. **Both entries exist and both are dated 2026-08-26** — the sentence was pre-submission text that survived the send. **The working-model question is still open and travels with the application:** Evidence Fit **71/100 (Adjacent, mid-band; revised down from 74)**, qualifications gate PASS but **a practical constraint is UNRESOLVED**, which `critique_framework.md` treats as a NO-GO trigger. **The JD is silent on hybrid vs onsite (0 grep matches), and Ken Griffin is on record that Citadel returned to the office 5 days a week and calls it his most important leadership decision.** If that holds for Zurich, it means ~2–2.5h daily commuting from Bern or relocating — breaking the Bern-based / 2–3 day hybrid bar. Only contrary evidence is a stale 2022 anonymous Fishbowl post about Operations. **Must be asked, not researched** — same class as the SBB K band. Practical constraints scored 5/5 in Phase 0 on an unexamined assumption; corrected to 2/5. **Zero Gaps among the 7 minimum quals**, and all five preferred technologies (Kafka, Kubernetes, Spark, Airflow, distributed DBs) are Direct — **the strongest raw stack alignment in the log**. Title-defining function **splits**: R2 (ingestion/transformation/storage/lifecycle of large datasets) is Direct and describes SW-1/SW-7 exactly; **R1 (design and build the research platform itself) is Adjacent** — the Aker BP authoring-vs-building shape again, and unwritable-around under Scope Discipline. **Classification caveat:** `application_strategy.md`'s \"a defining responsibility is only Adjacent → Stretch\" would strictly class this Stretch; recorded Adjacent per the Aker BP precedent (the caps this once turned on no longer exist). Gaps: platform authoring at firm scale, no professional quant/finance (now partly mitigated by new **PP-1/PP-2**), SDKs (0 evidence), low-latency/HFT (0 evidence — thesis throughput figure is explicitly barred by `thesis_limits`). **Go is NOT a gap** — Q3 is disjunctive and Python satisfies it. **$175–350k in the posting is a US/NY pay-transparency disclosure, NOT the Zurich number — must be asked.** Channel **Weak/cold** — it was the 5th consecutive cold application, in an office visibly staffed from Google and ETH (platform research head Costas Bekas; Nicolai Meinshausen leads principal research). Cover letter **was written and submitted** (1pp, 270 words); the PP-1 domain story carries it.",
|
||||
"legacy_next_action": "**Await response** (submitted 2026-08-26). No document work pending. **Two questions travel with this application and must both be asked at first contact, before any interview effort:** (1) **is the application even against the Zürich seat?** — the apply form offered no Zürich, so it may sit against a US req, which is a hard NO on relocation; (2) **hybrid or 5-day onsite?** — unresolved at submission, and 5-day onsite is a likely NO-GO on the Bern constraint. Same shape as the NVIDIA working-model issue: it went out unresolved, so it is now a live screening topic rather than a pre-cleared one. Also unasked: the Zürich compensation figure — the posting's $175–350k is a US/NY pay-transparency disclosure."
|
||||
},
|
||||
{
|
||||
"type": "applied",
|
||||
"date": "2026-08-26"
|
||||
}
|
||||
],
|
||||
"cohort_id": "evidence-first-2026-01"
|
||||
},
|
||||
{
|
||||
"company": "SBB",
|
||||
"role": "Data Engineer (m/w/d), Asset Management Infrastrukturanlagen, Bern",
|
||||
"job_id": "103755",
|
||||
"application_date": "2026-08-25",
|
||||
"fit_class": "core",
|
||||
"evidence_fit": 79.0,
|
||||
"hard_gate": "pass",
|
||||
"channel": "weak",
|
||||
"outcome": "withdrawn_by_candidate",
|
||||
"submitted": "2026-08-25",
|
||||
"interview": {
|
||||
"stage": "Stage 2 of 4 - Virtuelles Kennenlernen mit HR und Fuehrungskraft",
|
||||
"invited": "2026-08-28",
|
||||
"scheduled": "2026-09-09 08:30",
|
||||
"duration_min": 45,
|
||||
"format": "Microsoft Teams",
|
||||
"held": "2026-09-09",
|
||||
"result": "Held 2026-09-09 (HR + Scrum Master). Candidate WITHDREW 2026-09-11 after SBB confirmed there was no room to move on the Einstufung.",
|
||||
"user_read": "User reported 'ein paar Red Flags' and judged that the Rahmenbedingungen do not compensate for them. The specific red flags were NOT captured while fresh - if this is reopened, ask before relying on memory. Leaning negative but explicitly undecided as of 2026-09-10; he asked to leave it open pending SBB's feedback."
|
||||
},
|
||||
"withdrawn": "2026-09-11",
|
||||
"why_withdrawn": "Total package was a net DOWNGRADE on four counts: 41h vs 40h week; 25 days holiday + Brueckentage vs 28 + 5 from Zeitautonomie; 3 office days vs 2; and the band ceiling above. Plus a qualitative red flag: he spoke only to HR and the Scrum Master and perceived DIFFICULTIES IN THE TEAM. That one is not fixable by a salary offer - note it if SBB or a similar Bern-tier seat comes back.",
|
||||
"lesson": "SBB-SPECIFIC targeting rule (user 2026-09-11): at SBB, Anforderungsniveau K is too low - aim at Niveau L and/or Kader. NARROWED the same day at the user's instruction: Anforderungsniveau is SBB's OWN system (https://company.sbb.ch/de/jobs-karriere/arbeitgeberin/lohn.html) and does NOT generalise - jobs.admin.ch uses Lohnklassen, RUAG its own scheme, PostFinance per-posting bands. ~145k is an SBB ceiling, not a tier anchor. THUN-AREA EMPLOYERS (RUAG, Kdo Cy) ARE EXPLICITLY OUT of this reasoning: near-zero commute plus benefits a band does not show - he named childcare-cost coverage at the Schweizer Armee/Kdo Cy as potentially far more generous (UNVERIFIED - ask). Never decline a Thun-area role on band alone. What DOES generalise: judge by headroom in the band, and price the total package (working time, holiday, office days), not the entry number.",
|
||||
"id": "app-799e2880a22e",
|
||||
"label": "SBB - Data Engineer (m/w/d), Asset Management Infrastrukturanlagen, Bern (Job ID 103755)",
|
||||
"next_action": "Closed. For future SBB roles assess Niveau L/Kader; do not generalize SBB bands to other employers.",
|
||||
"current_summary": "Withdrew after interview and confirmation that SBB could not improve the classification. Niveau K ceiling and total package unsuitable for this application.",
|
||||
"events": [
|
||||
{
|
||||
"type": "legacy_status_import",
|
||||
"recorded_at": "2026-09-11",
|
||||
"source": "CLAUDE.md / application_cohort.json",
|
||||
"details": "**CLOSED - APPLICATION WITHDRAWN BY THE CANDIDATE 2026-09-11.** Interview held 2026-09-09 (HR + Scrum Master, **not** the People Leader the brief expected); SBB confirmed there was no room on the Einstufung, and he withdrew. **This is the cohort's only interview and it ended as a NO from his side, not theirs.** 💰 **HARD COMP FIGURES - supersedes the earlier +10% estimate and is the reference point for the whole Bern/Thun tier:** **Anforderungsniveau K tops out at ~CHF 145k.** He sits at **~CHF 135k inside a Swisscom band that runs to ~CHF 160k**. The decisive argument was **headroom, not the absolute number** - he would have entered K at its ceiling merely to break even, with nothing above. ⚠ **The package was a net DOWNGRADE on four counts:** 41h vs 40h week · 25 days holiday + Brückentage vs 28 + 5 from Zeitautonomie · 3 office days vs 2 · the band ceiling. ⚠ **Qualitative red flag worth carrying forward:** he spoke only to HR and the Scrum Master and **perceived difficulties in the team** - that is not repairable by a salary offer. 🎯 **TARGETING RULE — SBB ONLY: Anforderungsniveau K is too low; at SBB aim at NIVEAU L and/or KADER.** ⚠ **Deliberately NOT generalised** (user, 2026-09-11): *Anforderungsniveau* is **SBB's own** salary system (published at <https://company.sbb.ch/de/jobs-karriere/arbeitgeberin/lohn.html>) and does not map onto other employers — **jobs.admin.ch/Schweizer Armee uses Lohnklassen**, RUAG has its own scheme, PostFinance publishes per-posting bands. ~145k is an **SBB** ceiling, not a tier anchor. ⚠ **Thun and surroundings (RUAG, Kdo Cy) are explicitly OUT of this reasoning:** near-zero commute plus benefits that a salary band does not show — he named **childcare-cost coverage at the Schweizer Armee/Kdo Cy as potentially far more generous** (unverified — ask, do not assume). **Never decline a Thun-area role on band alone before pricing the benefits.** What *does* carry across employers: judge by **headroom in the band**, and price the **total package** (working time, holiday, office days), not the entry salary. Original record: interview was stage 2 of 4, **INTERVIEW HELD 2026-09-09.** SBB asked him to come back on whether the role interests him; **SBB's own feedback is still outstanding.** User's summary: *„ok\"*, but **ein paar Red Flags**, and in his read the Rahmenbedingungen do not compensate for them - **leaning negative, explicitly undecided as of 2026-09-10, and he asked to leave it open.** ⚠ **The specific red flags were NOT captured while fresh** - anyone reopening this must ask rather than rely on memory. 💰 **First real read on Anforderungsniveau K:** his post-interview estimate is that roughly **+10% on the current ~140k** looks achievable (very roughly ~155k). **This is HIS ESTIMATE of what is negotiable, not a band SBB is recorded as quoting** - whether the K range was named on the call is unrecorded. Well below the 180k bar, above current pay. Recorded in `comp_worksheet_sbb.md` as the **first calibration point for the entire Bern/Thun local tier** (RUAG, Swissgrid, BKW, BFH), which was previously pure guesswork - treat as an estimate, never quote as a figure. **INTERVIEW INVITED 2026-08-28 - 9. September 2026, 08:30, 45 Min, MS Teams.** Per the posting's own process this is **stage 2 of 4**, *\"Virtuelles Kennenlernen mit HR und Fuehrungskraft\"* - **HR together with Andri Wienandts**, not a pure HR screen. Brief written to `output/SBB_DataEngineer_AssetMgmt/interview_brief_sbb_2026-09-09.md`. **This is the FIRST interview of the evidence-first cohort** (6 applications, 2 rejections, 1 conversion) and it converted from a **COLD submit** - the channel plan called for phoning Wienandts first and that never happened. **The resume never contained Snowflake, dbt or Power BI**, the three literals an ATS keyword screen would have keyed on; the session had recorded that risk 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, do not over-read it** - but it is evidence against assuming honest omissions are fatal at the screen. Submitted 2026-08-25: 2pp English resume, 13 bullets, no cover letter (SBB waives it), Evidence Fit **79/100 Core**, hard gate **PASS**, Document Quality **92/100**, channel **Weak/cold**. Best practical fit in the log - Bern-based, German-language, no relocation, EU citizen + B permit. **Four things unresolved before submitting and now live call topics:** (1) **Anforderungsniveau K** is a capped GAV band, figures not public, very likely below the 180k bar; (2) the seat reads **lateral or below** current Staff + Component Owner scope, the same shape as the declined BKW, and the JD's only architecture language is a personal skill not an ownership mandate; (3) **RAMSI** Java/Spring Boot/Angular is a whole responsibility line on a stack that is historical or absent - ask its share, do not ovLine truncated
|
||||
"legacy_next_action": "Done - withdrawn and recorded in `application_cohort.json`, `decisions.json`, `comp_worksheet_sbb.md` and memory. **Carry forward the headroom + total-package test, NOT the K→L mapping** — that one is SBB-specific and was explicitly narrowed by the user on 2026-09-11.",
|
||||
"legacy_open_risk": "Anforderungsniveau K is a capped GAV band, figures not public; seat may read lateral or below current Staff + Component Owner scope.",
|
||||
"legacy_note": "FIRST interview invitation in the evidence-first cohort. Converted from a COLD submit - the published warm contact (Andri Wienandts, +41 79 364 62 53) was never called. The resume never contained Snowflake, dbt or Power BI, the three literals an ATS keyword screen would have keyed on, so a human read the dossier.",
|
||||
"legacy_comp_datapoint": "HARD FIGURES, from the interview - supersedes the earlier +10% estimate. Anforderungsniveau K TOPS OUT AT ~CHF 145k. His own position: ~CHF 135k today inside a Swisscom band that runs to ~CHF 160k. So the decisive point was NOT the absolute number but the HEADROOM: he would have had to enter K at its ceiling just to break even, with nothing left above. First hard calibration of a Swiss public-sector band and the reference point for the whole Bern/Thun tier (RUAG, Swissgrid, BKW, BFH, PostFinance)."
|
||||
},
|
||||
{
|
||||
"type": "applied",
|
||||
"date": "2026-08-25"
|
||||
},
|
||||
{
|
||||
"type": "interview_invited",
|
||||
"date": "2026-08-28"
|
||||
},
|
||||
{
|
||||
"type": "interview_held",
|
||||
"date": "2026-09-09"
|
||||
},
|
||||
{
|
||||
"type": "withdrawn_by_candidate",
|
||||
"date": "2026-09-11"
|
||||
}
|
||||
],
|
||||
"cohort_id": "evidence-first-2026-01"
|
||||
},
|
||||
{
|
||||
"company": "Aker BP ASA",
|
||||
"role": "Data Product Architect - AI-ready Data Products",
|
||||
"application_date": "2026-07-29",
|
||||
"fit_class": "adjacent",
|
||||
"evidence_fit": 79.0,
|
||||
"hard_gate": "pass",
|
||||
"channel": "weak",
|
||||
"outcome": "rejected_no_interview",
|
||||
"submitted": "2026-07-29",
|
||||
"rejection_date": "2026-08-27",
|
||||
"id": "app-80e038df976c",
|
||||
"label": "Aker BP ASA — Data Product Architect, AI-ready Data Products (FINN 469067315)",
|
||||
"next_action": "Closed; no pending application action. Read recorded history before reopening.",
|
||||
"current_summary": "CLOSED — REJECTED 2026-08-27",
|
||||
"events": [
|
||||
{
|
||||
"type": "legacy_status_import",
|
||||
"recorded_at": "2026-09-11",
|
||||
"source": "CLAUDE.md / application_cohort.json",
|
||||
"details": "**CLOSED — REJECTED 2026-08-27** (submitted 2026-07-30, ~28 days to disposition, no interview; the session file and cohort record record the submission as 2026-07-29 — a one-day inconsistency, never reconciled). Adjacent, **Evidence Fit 79/100**, Document Quality 93/100, hard gate PASS, **Channel Weak/cold** — the optional follow-up email to Per Olav Marthinsen was left unsent, so this went in as a pure cold submit. Stavanger/Oslo/Trondheim, English working language, no Norwegian and no clearance required, EEA work rights. 2pp resume + 1pp CL, both validator PASS, no Tier 1 truth findings — **a cold-channel no-interview rejection does not implicate document quality on its own** (same disposition class as Microsoft ISE and Google Business Home). Honest practitioner framing: builds governed data products *inside* Swisscom's Data Mesh; role *authored* an enterprise framework — real level stretch, never fabricated authorship. **Atlassian Compass closed the catalogue-tool gap** (74→79). Standing gaps if a similar req appears: framework authorship, no energy domain, AWS vs their Microsoft/Cognite stack, **zero verified metrics**. **Cohort slot stays consumed** (evidence-first-2026-01, Adjacent 1/2 — a rejection does not free a slot; cohort remains 4/10). **The Norway lane stays OPEN and selective** — NATO JWC Stavanger is still live, and Equinor/Telenor and other strong Norwegian employers remain in scope per the user's standing instruction. Never frame this lane as closed.",
|
||||
"legacy_next_action": "Done — cohort rejection recorded; do not react to this single outcome with positioning changes (`application_strategy.md` §38/§74)"
|
||||
},
|
||||
{
|
||||
"type": "applied",
|
||||
"date": "2026-07-29"
|
||||
},
|
||||
{
|
||||
"type": "rejected_no_interview",
|
||||
"date": "2026-08-27"
|
||||
},
|
||||
{
|
||||
"type": "record_correction",
|
||||
"date": "2026-09-11",
|
||||
"details": "Application date CONFIRMED BY THE USER as 2026-07-29, settling the one-day conflict between the cohort record (07-29) and the CLAUDE.md session cell (07-30). The legacy import event above still quotes 07-30; it is preserved verbatim as the historical text and is not edited."
|
||||
}
|
||||
],
|
||||
"cohort_id": "evidence-first-2026-01",
|
||||
"fit_override_reason": "Recorded Adjacent although Evidence Fit 79 with a passing hard gate would score Core under the numeric rubric. The original rationale is NOT RECOVERABLE: the user was asked on 2026-09-11 and does not remember, and judged it immaterial because the role is closed and rejected. Deliberately NOT reclassified to Core - that would be the silent reclassification the review objected to, and it would rewrite a historical judgement to make the arithmetic tidy. The contemporaneous note points at a real reason rather than an error: the title-defining responsibility (authoring an enterprise framework) was only Adjacent, and application_strategy.md says a defining responsibility that is only Adjacent pushes a role down a class. Treated as a judgement recorded under the pre-2026-09-05 rubric, not as a data error. No future record may cite this one as precedent without stating its own reason.",
|
||||
"rubric_version": "pre-2026-09-05-cohort",
|
||||
"classification_note_for_stats": "Fit-class counts that include this row mix one pre-2026-09-05 judgement with post-rubric entries. Immaterial for a closed role; state it if the distribution is ever used as evidence."
|
||||
},
|
||||
{
|
||||
"company": "Google",
|
||||
"role": "Software Engineer III, Business Home",
|
||||
"application_date": "2026-07-27",
|
||||
"fit_class": "core",
|
||||
"evidence_fit": 89.0,
|
||||
"hard_gate": "pass",
|
||||
"channel": "weak",
|
||||
"outcome": "rejected_no_interview",
|
||||
"id": "app-767097db424a",
|
||||
"label": "Google - Software Engineer III, Business Home, Zurich (req 93922217108087494)",
|
||||
"next_action": "Closed; no pending application action. Read recorded history before reopening.",
|
||||
"current_summary": "CLOSED - NOT PROCEEDING 2026-07-28",
|
||||
"events": [
|
||||
{
|
||||
"type": "legacy_status_import",
|
||||
"recorded_at": "2026-09-11",
|
||||
"source": "CLAUDE.md / application_cohort.json",
|
||||
"details": "**CLOSED - NOT PROCEEDING 2026-07-28** (submitted 2026-07-27; Core, Evidence Fit 89/100, Document Quality 94/100; no interview). Rapid early-screen disposition; known risks were Mid-level versus current Staff scope, data/platform versus product-SWE positioning, preferred algorithms/accessibility gaps, and a cold channel.",
|
||||
"legacy_next_action": "Done - cohort rejection recorded; do not treat this outcome alone as a document-quality failure"
|
||||
},
|
||||
{
|
||||
"type": "applied",
|
||||
"date": "2026-07-27"
|
||||
},
|
||||
{
|
||||
"type": "rejected_no_interview",
|
||||
"date": "2026-07-28"
|
||||
}
|
||||
],
|
||||
"cohort_id": "evidence-first-2026-01"
|
||||
},
|
||||
{
|
||||
"id": "app-535c5bfb3f94",
|
||||
"company": "Swisscom (Schweiz) AG",
|
||||
"role": "Data Engineer - Geo Platform, Bern/Worblaufen (internal, req R-0006447)",
|
||||
"label": "Swisscom (Schweiz) AG — Data Engineer - Geo Platform, Bern/Worblaufen (internal, req R-0006447)",
|
||||
"application_date": "2026-09-15",
|
||||
"fit_class": "no-go",
|
||||
"evidence_fit": 78.0,
|
||||
"hard_gate": "fail",
|
||||
"channel": "moderate",
|
||||
"outcome": "interviewing",
|
||||
"cohort_id": "evidence-first-2026-01",
|
||||
"job_id": "R-0006447",
|
||||
"url": null,
|
||||
"fit_override_reason": "User override 2026-09-15 after seeing the ArcGIS/FME hard gate (required, never used). Internal move with no change to level or conditions; hiring manager Marianne Temerowski encouraged the application.",
|
||||
"rubric_version": "critique-framework-2026-09-11",
|
||||
"next_action": "Swisscom-Rueckmeldung zwischen 2026-10-08 und 2026-10-15 abwarten; internen Aufgabenwechsel separat bewerten. Externe Suche unabhaengig vom Ausgang aktiv fortsetzen, auch bei erfolgreichem internem Wechsel.",
|
||||
"current_summary": "SUBMITTED 2026-09-15 via the internal Swisscom Workday posting (R-0006447): 2-page English resume (Dennis_Thiessen_Resume.pdf), no cover letter (internal). Evidence Fit 78, hard gate FAIL (ArcGIS/FME) overridden by the user, Document Quality 89, channel Moderate (hiring manager Marianne Temerowski encouraged the application).",
|
||||
"events": [
|
||||
{
|
||||
"type": "open",
|
||||
"date": "2026-09-15"
|
||||
},
|
||||
{
|
||||
"type": "contact_conversation",
|
||||
"date": "2026-09-15",
|
||||
"note": "Contacted hiring manager Marianne Temerowski before applying; she encouraged the application. She signed his Swisscom Zwischenzeugnis (Oct 2025). Whether ArcGIS/FME was discussed is not recorded. First application in the log where the named contact was used."
|
||||
},
|
||||
{
|
||||
"type": "applied",
|
||||
"date": "2026-09-15",
|
||||
"note": "SUBMITTED 2026-09-15 via the internal Swisscom Workday posting (R-0006447): 2-page English resume (Dennis_Thiessen_Resume.pdf), no cover letter (internal). Evidence Fit 78, hard gate FAIL (ArcGIS/FME) overridden by the user, Document Quality 89, channel Moderate (hiring manager Marianne Temerowski encouraged the application).",
|
||||
"outcome": "applied"
|
||||
},
|
||||
{
|
||||
"type": "interview_invited",
|
||||
"date": null,
|
||||
"recorded_at": "2026-09-28",
|
||||
"scheduled_for": "2026-10-01",
|
||||
"source": "user update 2026-09-28"
|
||||
},
|
||||
{
|
||||
"type": "interview_held",
|
||||
"date": "2026-10-01",
|
||||
"note": "Interview held 2026-10-01. User says it went fairly well. Response expected in 1-2 weeks. User perceives a possible mismatch: team may seek a more junior or AI-native candidate. No employer feedback or decision yet."
|
||||
},
|
||||
{
|
||||
"type": "note",
|
||||
"date": "2026-10-06",
|
||||
"note": "Nutzer-Klarstellung: Der interne Wechsel aendert nur den Aufgabenbereich, nicht Position oder Senioritaet und nicht wesentlich das Gehalt. Separater interner Aufgabenwechsel; die externe Suche bleibt unveraendert und laeuft auch bei erfolgreichem internen Wechsel weiter."
|
||||
}
|
||||
],
|
||||
"interview": {
|
||||
"scheduled": "2026-10-01",
|
||||
"date_precision": "day"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "app-google-commerce-140594136896938694",
|
||||
"company": "Google",
|
||||
"role": "Senior Software Engineer, Full Stack, Commerce, Zürich",
|
||||
"label": "Google — Senior Software Engineer, Full Stack, Commerce, Zürich",
|
||||
"application_date": null,
|
||||
"fit_class": "no-go",
|
||||
"evidence_fit": 73.0,
|
||||
"hard_gate": "fail",
|
||||
"channel": "weak",
|
||||
"outcome": "open",
|
||||
"cohort_id": "evidence-first-2026-01",
|
||||
"job_id": "140594136896938694",
|
||||
"url": "https://www.google.com/about/careers/applications/jobs/results/140594136896938694-senior-software-engineer-full-stack-commerce?location=Switzerland",
|
||||
"fit_override_reason": null,
|
||||
"rubric_version": "critique-framework-2026-09-11",
|
||||
"next_action": "No action - superseded by the Staff Shopping Graph package (output/Google_Staff_SWE_Shopping_Graph/). Reopen only if the user explicitly overrides the frontend gap.",
|
||||
"current_summary": "Preparation held: frontend experience denied; Full Stack title-defining gap. Not submitted.",
|
||||
"events": [
|
||||
{
|
||||
"type": "open",
|
||||
"date": "2026-10-03",
|
||||
"note": "User selected Google Commerce from scout shortlist. Preparation only; this is not an application submission."
|
||||
},
|
||||
{
|
||||
"type": "note",
|
||||
"date": "2026-10-03",
|
||||
"note": "User confirmed current data-product modelling/design/implementation and denied frontend experience. Full Stack is title-defining: project fit-policy no-go; no separate explicit frontend minimum claimed. Design duration still unconfirmed. Preparation held; not submitted and not user-withdrawn."
|
||||
},
|
||||
{
|
||||
"type": "note",
|
||||
"date": "2026-10-21",
|
||||
"note": "Superseded 2026-10-21: the user chose Google Staff SWE, Shopping Graph (Feeds Infra) as the single Google application after comparing all live Zurich reqs (job_scout/reports/2026-10-20.triage.md addendum). Commerce stays unsubmitted; frontend gap unchanged."
|
||||
}
|
||||
],
|
||||
"session": "output/Google_Senior_SWE_Commerce/session_google_senior_swe_commerce.md",
|
||||
"evidence_fit_status": "73 is the initial provisional score, not reassessed after clarification; confirmed title-defining gap overrides it"
|
||||
},
|
||||
{
|
||||
"id": "app-59d425526499",
|
||||
"company": "Kongsberg Discovery (Seatex)",
|
||||
"role": "Lead Engineer, DevOps and Test Infrastructure, Trondheim",
|
||||
"label": "Kongsberg Discovery (Seatex) — Lead Engineer, DevOps and Test Infrastructure, Trondheim",
|
||||
"application_date": "2026-10-08",
|
||||
"fit_class": "no-go",
|
||||
"evidence_fit": 69.0,
|
||||
"hard_gate": "fail",
|
||||
"channel": "weak",
|
||||
"outcome": "applied",
|
||||
"cohort_id": "evidence-first-2026-01",
|
||||
"job_id": "easycruit-3663291",
|
||||
"url": "https://www.kongsberg.com/careers/vacancies/lead-engineer-devops-and-test-infrastructure/",
|
||||
"fit_override_reason": "User override 2026-10-08 after seeing the hard gate: required 'Experience working with embedded SW and Linux' - Linux Direct, embedded academic-only (ED-1 coursework, none since studies); clearance ('may be required') unresolved; on-site Trondheim with relocation deferred to offer stage by user. Named contact Are B. Willumsen published but deliberately NOT contacted (user decision) - a deliberate cold submit. Document Quality 84; Tier 2 fixes declined.",
|
||||
"rubric_version": "critique-framework-2026-09-11",
|
||||
"next_action": "Wait for Kongsberg response. Screen prep: embedded targets/HIL question, recency of DevOps/test work (2015-22), relocation to Trondheim, clearance eligibility as German citizen resident in Switzerland, on-site expectations. Package: output/Kongsberg_Lead_Engineer_DevOps_Test_Infra/.",
|
||||
"current_summary": "applied",
|
||||
"events": [
|
||||
{
|
||||
"type": "applied",
|
||||
"date": "2026-10-08"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "app-bis-jr100498",
|
||||
"company": "BIS (Bank for International Settlements)",
|
||||
"role": "Senior/Lead Data & Analytics Engineer, MED IT, Basel (jr100498, 3-yr term)",
|
||||
"label": "BIS (Bank for International Settlements) — Senior/Lead Data & Analytics Engineer, MED IT, Basel (jr100498, 3-yr term)",
|
||||
"application_date": "2026-10-15",
|
||||
"fit_class": "core",
|
||||
"evidence_fit": 78.0,
|
||||
"hard_gate": "pass",
|
||||
"channel": "weak",
|
||||
"outcome": "applied",
|
||||
"cohort_id": "evidence-first-2026-01",
|
||||
"job_id": "jr100498",
|
||||
"url": "https://www.bis.org/vacancy/jr100498",
|
||||
"fit_override_reason": null,
|
||||
"rubric_version": "critique-framework-2026-09-11",
|
||||
"next_action": "Await BIS response. If contacted: ask office days and total package; weigh the 3-year fixed term against the permanent Swisscom post. Interview prep is in the critique: SDMX answer, Swisscom dashboard tool (not in KB), attributed schedule example for project planning, Lead story.",
|
||||
"current_summary": "Submitted 2026-10-15 via the BIS portal by the user. Package: Dennis_Thiessen_Resume.pdf + Dennis_Thiessen_Cover_Letter.pdf (dated 15 October 2026) + four portal free-text answers (international/public-sector experience, SDMX/XBRL, data-application example, requirements example); answers saved in output/BIS_Lead_Data_Analytics_MED/portal_answers_bis_jr100498.md. Core 78, hard gate PASS, Document Quality 88, channel Weak (no warm contact recorded before submission).",
|
||||
"events": [
|
||||
{
|
||||
"type": "open",
|
||||
"date": "2026-10-14"
|
||||
},
|
||||
{
|
||||
"type": "note",
|
||||
"date": "2026-10-14",
|
||||
"note": "User selected BIS jr100498 from the 2026-10-14 scout triage. Preparation only; not submitted. KB clarified the same day: no SDMX; junior-developer onboarding/mentoring at Bosch and Swisscom (BS-9, SW-10); Spotfire registered."
|
||||
},
|
||||
{
|
||||
"type": "note",
|
||||
"date": "2026-10-15",
|
||||
"note": "Package finalized 2026-10-15: resume (Document Quality 86, Tier 2 polish applied) + cover letter dated 15 October 2026; submission copies Dennis_Thiessen_Resume.pdf / Dennis_Thiessen_Cover_Letter.pdf in output/BIS_Lead_Data_Analytics_MED/. NOT submitted yet."
|
||||
},
|
||||
{
|
||||
"type": "applied",
|
||||
"date": "2026-10-15",
|
||||
"note": "Submitted 2026-10-15 via the BIS portal by the user. Package: Dennis_Thiessen_Resume.pdf + Dennis_Thiessen_Cover_Letter.pdf (dated 15 October 2026) + four portal free-text answers (international/public-sector experience, SDMX/XBRL, data-application example, requirements example); answers saved in output/BIS_Lead_Data_Analytics_MED/portal_answers_bis_jr100498.md. Core 78, hard gate PASS, Document Quality 88, channel Weak (no warm contact recorded before submission).",
|
||||
"outcome": "applied"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "app-google-staff-shopping-graph-102064172115600070",
|
||||
"company": "Google",
|
||||
"role": "Staff Software Engineer, Shopping Graph (Feeds Infra), Zürich",
|
||||
"label": "Google — Staff Software Engineer, Shopping Graph (Feeds Infra), Zürich",
|
||||
"application_date": "2026-10-21",
|
||||
"fit_class": "stretch",
|
||||
"evidence_fit": 70.0,
|
||||
"hard_gate": "pass",
|
||||
"channel": "weak",
|
||||
"outcome": "applied",
|
||||
"cohort_id": "evidence-first-2026-01",
|
||||
"job_id": "102064172115600070",
|
||||
"url": "https://www.google.com/about/careers/applications/jobs/results/102064172115600070-staff-software-engineer-shopping-graph?location=Switzerland",
|
||||
"fit_override_reason": "Stretch by definition (Staff-level technical leadership only Adjacent); all five minimums met; user chose it as the single Google application 2026-10-21.",
|
||||
"rubric_version": "critique-framework-2026-09-11",
|
||||
"next_action": "Await Google response. Google limit: next Google application window counts this submit (3 per rolling 30 days). At first contact clarify level (L6 vs L5), Zurich hybrid days vs current 3 homeoffice days, and total package. Interview prep: SW-4 prototype story as the technical-direction example, plus one concrete Staff-level example the user names; Java currency; end-to-end system design with scale and trade-offs. Package: output/Google_Staff_SWE_Shopping_Graph/.",
|
||||
"current_summary": "applied",
|
||||
"events": [
|
||||
{
|
||||
"type": "applied",
|
||||
"date": "2026-10-21"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "app-b13ee50001fc",
|
||||
"company": "NVIDIA",
|
||||
"role": "Senior Production Engineer, DGX Cloud, Switzerland Remote (JR2027105)",
|
||||
"label": "NVIDIA — Senior Production Engineer, DGX Cloud, Switzerland Remote (JR2027105)",
|
||||
"application_date": "2026-10-22",
|
||||
"fit_class": "stretch",
|
||||
"evidence_fit": 65.0,
|
||||
"hard_gate": "pass",
|
||||
"channel": "weak",
|
||||
"outcome": "applied",
|
||||
"cohort_id": "evidence-first-2026-01",
|
||||
"job_id": "JR2027105",
|
||||
"url": "https://nvidia.wd5.myworkdayjobs.com/en-US/NVIDIAExternalCareerSite/job/Switzerland-Remote/Senior-Production-Engineer----DGX-Cloud_JR2027105",
|
||||
"fit_override_reason": "Stretch: required SRE line (SLIs, SLOs, error budgets) only Adjacent; hard gate PASS. User chose it 2026-10-22 over the alternatives (remote CH, NVIDIA rating 4.4); prior NVIDIA req JR2024256 pulled, so no stacking.",
|
||||
"rubric_version": "critique-framework-2026-09-11",
|
||||
"next_action": "Await response. Send the LinkedIn note to an NVIDIA recruiter or DGX Cloud engineer (draft in session). Interview prep: incident debugged end to end (SW-2/SW-11); safe model rollout in the fab (BS-1, rollout mechanics not in KB); Kubernetes recency; distributed systems at scale; vLLM/SGLang/Dynamo not used. Package: output/NVIDIA_ProdEng_DGX_Cloud/.",
|
||||
"current_summary": "applied",
|
||||
"events": [
|
||||
{
|
||||
"type": "applied",
|
||||
"date": "2026-10-22"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,906 @@
|
||||
{
|
||||
"schema_version": 1,
|
||||
"cohort_metadata": {
|
||||
"cohort_id": "evidence-first-2026-01",
|
||||
"status": "active (log, not a capped cohort)",
|
||||
"started": "2026-07-27",
|
||||
"target_mix": {
|
||||
"core": 7,
|
||||
"adjacent": 2,
|
||||
"stretch": 1
|
||||
},
|
||||
"definitions": {
|
||||
"core": "Evidence Fit 75+ and no hard-gate failure",
|
||||
"adjacent": "Evidence Fit 60-74, no required Gap, normally at most one serious preferred gap",
|
||||
"stretch": "Evidence Fit below 60 or a defining responsibility is only Adjacent"
|
||||
},
|
||||
"policy_change_2026_09_05": "Slot caps (7 core / 2 adjacent / 1 stretch) DROPPED by user decision. target_mix is retained only as a record of the original design and is no longer read by cohort_tracker.py or enforced anywhere. This file continues as a durable application log. Channel is now the rationed variable: no application goes out cold when a named contact is published and reachable. See resume_builder/reference/application_strategy.md."
|
||||
},
|
||||
"applications": [
|
||||
{
|
||||
"company": "NVIDIA",
|
||||
"role": "Senior DevOps Engineer, Zurich (JR2024256)",
|
||||
"application_date": "2026-09-05",
|
||||
"fit_class": "stretch",
|
||||
"evidence_fit": 64.0,
|
||||
"hard_gate": "fail",
|
||||
"channel": "weak",
|
||||
"outcome": "applied",
|
||||
"id": "app-9068f462d9b9",
|
||||
"label": "NVIDIA - Senior DevOps Engineer, Zürich (req JR2024256)",
|
||||
"next_action": "No action expected; req pulled ~2026-09-20. Treat as dormant. Does not block NVIDIA JR2027105 (Senior Production Engineer, DGX Cloud).",
|
||||
"current_summary": "SUBMITTED 2026-09-05.",
|
||||
"events": [
|
||||
{
|
||||
"type": "legacy_status_import",
|
||||
"recorded_at": "2026-09-11",
|
||||
"source": "CLAUDE.md / application_cohort.json",
|
||||
"details": "**SUBMITTED 2026-09-05.** Recorded in the application record (now 7 entries) and in the scout decision log. ⚠ **Hybrid vs 5-day onsite was never resolved before sending**, so the working model is now a **live screening topic**, not a pre-cleared one - the same pattern as RUAG's comp/PSP. Thun→Zürich is ~1h50 each way; a 5-day-onsite answer is the main disqualifier to watch for. Comp is *not* a risk (levels.fyi Greater Zürich IC3 median ≈ CHF 204k, IC4 ≈ CHF 379k). Channel **Weak - the 7th consecutive cold submit**, though this posting published no named contact, so cold was the only option available. Submission PDFs `Dennis_Thiessen_Resume.pdf` and `Dennis_Thiessen_Cover_Letter.pdf` exist and are MD5-verified against source; letter recompiled so its date reads 5 Sep 2026. ⚠ **The letter carries `\today` and the submission copies are copies, not build targets - if it is sent on a later day, recompile the letter and refresh both copies first** (`config.md` Output Rules). Submitted despite the hard-gate failures on an explicit user override, the same shape as RUAG AI Engineer C5I. Resume 2pp/13 bullets + 1pp cover letter (279 body words), both validators PASS 0 warnings, 0 boxes, visually inspected. Measured **Document Quality 82/100** at critique; **both Tier 1 findings were fixed 2026-09-05** - `Ubuntu` removed from the skills line (0 canonical; `PP-3` is Debian only, and the Debian→Ubuntu transfer argument belongs in an interview answer, not a skills line) and `security hardening` now marked *(personal server)* per the explicit `claims.json` instruction. Four honest ATS terms were added from existing evidence (configuration management, service reliability, container orchestration, observability), lifting JD term coverage **50%→61%**; no bullet was touched, so the budget stayed at 13 and cadence could not regress. **The critique is now STALE BY DESIGN - the document is better than 82 but that number was not re-measured, so never quote a post-edit estimate as a score.** The headline reorder was deliberately NOT applied: it is a positioning call for the user and `\\headline` sits in the FIXED header block. Cover-letter hook is first-party verified (NVIDIA's own live Zürich posting JR2022878); **a hook was DROPPED at verification** - the Phase 0 plan's \"Alps / Swiss AI Initiative with ETH Zürich and EPFL\" is **not** supported by the first-party NVIDIA newsroom release, which mentions neither EPFL nor any Swiss AI Initiative; that came from secondary coverage. The letter names **both** honest gaps out loud - on-prem networking, and that employer-side Linux/Ansible ended Dec 2022 with only a personal server carrying currency. **⚠ BLOCKING: the working model is still unresolved and no document fix changes that.** Session `output/NVIDIA_SrDevOps_Zurich/session_nvidia_sr_devops.md`; JD scraped live via Playwright and saved verbatim (posted ~2026-09-01, very fresh). Evidence Fit **64/100**, fit class **Stretch**, **hard gate FAIL on two counts**: (1) required line *\"Strong expertise in on-premises networking and compute infrastructure\"* is a **Gap** - networking is 0 canonical and is not substitutable from data-platform work; (2) **hybrid vs onsite is UNRESOLVED** and the JD is silent - Thun→Zürich is ~1h50 each way. Required tally **3 Direct / 3 Adjacent / 1 Gap**. Recorded as an override rather than a passing gate, the same shape as RUAG AI Engineer C5I. (At the time this also had no free cohort slot; **that constraint no longer exists** - caps dropped 2026-09-05.) **Correction to the same day's scout triage: it called two required lines Gaps; only Q5b networking is one. Q2 (10+ yrs DevOps) is Adjacent and defensible** - a continuous CI/CD/automation thread runs Generali 2015 → today across five employers; the honest weakness is that those roles were titled data/test/research engineer, not DevOps. **The finding that changes the calculus: comp.** levels.fyi Greater Zürich puts NVIDIA IC3 median ≈ CHF 204k and IC4 ≈ CHF 379k, the highest-paying SWE employer in the city - the first role in the log where comp is a reason to *accept* a long commute rather than decline. Caveat: self-reported and equity-heavy after an extraordinary NVDA run; treat base as the reliable part. Strongest match is **R3, CI/CD pipelines for R&D engineering teams** - literally his career shape (`FC-1` Jenkins at a Fraunhofer institute, `BS-6` Ansible/Jenkins for fab analytics teams, `SW-3` Kubernetes + GitLab today). Zürich is NVIDIA's HPC/AI infrastructure-software R&D hub - first-party verified from NVIDIA's own live Zürich posting JR2022878 (*\"building the next generation of scalable AI infrastructure ... distributed training, real-time inference, and communication efficiency across large systems\"*), which is the hook the letter uses. **The Alps / Swiss AI Initiative framing was checked and dropped** - see above. **Honest gaps that travel with it:** on-prem networking (0), HPC (0), Line truncated
|
||||
"legacy_next_action": "**Await response. Raise the working model at first contact** - it went in unresolved and a 5-day-onsite seat would be a late no. Note: `claims.json` has no shell-scripting entry, so **Bash is omitted** from Skills although the JD names it and ten years of Debian admin plus Ansible work plainly involve it - same shape as the Ansible/Linux gaps found 2026-08-27. Confirm with the user and record it. Groovy stays out regardless."
|
||||
},
|
||||
{
|
||||
"type": "applied",
|
||||
"date": "2026-09-05"
|
||||
},
|
||||
{
|
||||
"type": "note",
|
||||
"date": "2026-10-22",
|
||||
"note": "Posting pulled: JR2024256 was last listed in the 2026-09-18 scout scrape, absent from every scrape since 2026-09-23, and the posting page reads 'The page you are looking for doesn't exist' on 2026-10-22. No response from NVIDIA recorded. Outcome left as applied (no rejection received). The req is closed, so it no longer blocks a second NVIDIA application (BIS jr100429 precedent)."
|
||||
}
|
||||
],
|
||||
"cohort_id": "evidence-first-2026-01"
|
||||
},
|
||||
{
|
||||
"company": "RUAG MRO Holding AG (Business Area C5I)",
|
||||
"role": "AI Engineer C5I (w/m/d), Thun",
|
||||
"application_date": "2026-08-27",
|
||||
"fit_class": "stretch",
|
||||
"evidence_fit": 74.0,
|
||||
"hard_gate": "fail",
|
||||
"channel": "weak",
|
||||
"outcome": "rejected_after_interview",
|
||||
"id": "app-ca0990d47bd0",
|
||||
"label": "RUAG C5I - AI Engineer C5I, Thun (application ID 18027)",
|
||||
"next_action": "Abgeschlossen: Absage nach Interview; Anforderungen vor allem beim Homeoffice nicht vereinbar. Keine weitere Aktion fuer diese Bewerbung offen.",
|
||||
"current_summary": "Absage von RUAG am 2026-10-06 erhalten, laut Nutzer. RUAG konnte die Anforderungen des Nutzers, vor allem bezueglich Homeoffice, nicht erfuellen. Konkreter Homeoffice-Umfang nicht genannt. Interview am 2026-10-02 bleibt dokumentiert.",
|
||||
"events": [
|
||||
{
|
||||
"type": "legacy_status_import",
|
||||
"recorded_at": "2026-09-11",
|
||||
"source": "CLAUDE.md / application_cohort.json",
|
||||
"details": "**SUBMITTED 2026-08-27** via jobs.ruag.ch (portal only; email and post refused). Evidence Fit **74/100**, fit class **Stretch**, hard gate **FAIL** (R1 and R2, the two title-defining responsibilities, are Adjacent not Direct), Document Quality **93/100** after a full critique-and-fix round (85 pre-edit), truth and provenance 24/25, **0 Tier 1 findings at Round 2**, channel **Weak/cold**. Submitted: German CV **2 pages, 13 bullets** + German motivation letter **1 page, 295 words**; both validators PASS, 0 boxes, text-order and visual QA clean, submission PDFs MD5-verified before sending. **Cohort evidence-first-2026-01 is now 6/10 and the sole Stretch slot is CONSUMED (Core 3/7, Adjacent 2/2, Stretch 1/1)** - any further application must clear Core or Adjacent on its own merits. Positioning is his canonical title **Staff Data, Analytics & AI Engineer**, carried by `BS-1` production ML-inference integration, `BS-6` Linux/Ansible, `SW-3`/`SW-7`/`SW-2` current Kubernetes and data-product work, `PP-3` current self-hosted Linux and hardening, `SW-5` DevSecOps tied to C5I's stated operating model, and the canonical `BW-1` officer career. The letter **names the AI-platform gap in one sentence** and pivots to the operations/platform side. **Honest gaps that travel with it:** no AI/LLM platform built or operated, no compute/GPU cluster, no RAG/retrieval implementation, no formal LLM evaluation; ML/AI-framework depth is certification-context only. **Compensation, PSP/project eligibility and role level were NEVER resolved before sending, so all three are now live screening topics rather than pre-cleared ones.** ⚠ **Marco Heinzen's published direct line (+41 79 568 14 96) was never used** - this went in as a pure cold submit, the sixth consecutive one. **If rejected, that is NOT a signal to drop RUAG:** five other RUAG C5I reqs sit in the scout log, and **Senior DevOps Engineer C5I** is already shortlisted and is a **materially better fit than this one**, sitting on the lane where his evidence is Direct rather than Adjacent (still live and verified on the board 2026-09-04). The **Data Lakehouse / Senior Data Platform Engineer** req was a title-match prior that the JD does not support — it was reposted 2026-09-04 as **Senior Data Engineer (MSSQL)**, requires on-prem MSSQL / Talend / SAP S/4HANA (0 canonical each), and is **ruled out**. **Scout run 2026-09-07: the RUAG C5I backlog is now SETTLED — undecided RUAG rows went 69 → 3** (`ICT Architect`, `Software Engineer C5I`, `Cyber Security Consultant` remain open; `ICT Architect C5I` stays `paused`). Do not re-triage that board from scratch; read `decisions.json`, where every rule-out note states whether it came from a JD read or from the title/family pattern. Three JD reads that cycle all ruled out: **Test Manager C5I** (the closest call — it escapes the networking gap entirely and BW-1 scores, but required *\"fundierte Erfahrung als Test Engineer\"* rests on `VIZRT`, **ten months, ended 2018-05**, so it is thin and stale, plus a lane exit and a third C5I req while 18027 is pending), **System Engineer C5I** (VMware + Firewall + Netzwerk, all 0), and **ICT Solution Architect Business Applications** (required *\"mehrjährige Erfahrung als Solution Architect\"* — a title `feedback_swisscom_datamesh_ownership` forbids — and the duties are *\"unter Anleitung\"*, a supporting seat below authoring).",
|
||||
"legacy_next_action": "Await response. Optional but still worthwhile: call **Marco Heinzen** about technical scope and level, and **Frank Haugwitz** about compensation and PSP/project eligibility. **NEW CONTACT 2026-09-07 — `Lars Kauz`, Head of ICT Infrastructure C5I, +41 79 293 93 82, lars.kauz@ruag.ch**, published on the System Engineer C5I posting. Channel is the rationed variable since the 09-05 cohort change, so a published, reachable name matters — **but he heads ICT Infrastructure, the function whose req was ruled out for VMware/VDI/Windows content, and that is NOT demonstrably the Kubernetes platform group Senior DevOps C5I sits in.** He is a warm entry into C5I, not a verified channel for rank 1; Haugwitz stays the recorded gate. Do not react to a single outcome with positioning changes (`application_strategy.md` §38/§74)."
|
||||
},
|
||||
{
|
||||
"type": "applied",
|
||||
"date": "2026-08-27"
|
||||
},
|
||||
{
|
||||
"type": "interview_invited",
|
||||
"date": null,
|
||||
"recorded_at": "2026-09-28",
|
||||
"scheduled_for": "2026-10-02",
|
||||
"source": "user update 2026-09-28"
|
||||
},
|
||||
{
|
||||
"type": "interview_held",
|
||||
"date": "2026-10-02",
|
||||
"note": "Interview am 2026-10-02 gefuehrt. Umfeld aus Nutzersicht interessant; Angebot bzw. Gesamtpaket vermutlich wenig konkurrenzfaehig (vorlaeufiger Eindruck, kein bestaetigtes Angebot oder Gehaltsbetrag). Entscheidung offen. Nutzer ueberlegt und will RUAG naechste Woche seinen Eindruck mitteilen.",
|
||||
"outcome": "interviewing"
|
||||
},
|
||||
{
|
||||
"type": "rejected_after_interview",
|
||||
"date": "2026-10-06",
|
||||
"note": "Absage von RUAG am 2026-10-06 erhalten, laut Nutzer. RUAG konnte die Anforderungen des Nutzers, vor allem bezueglich Homeoffice, nicht erfuellen. Konkreter Homeoffice-Umfang nicht genannt. Interview am 2026-10-02 bleibt dokumentiert.",
|
||||
"outcome": "rejected_after_interview"
|
||||
}
|
||||
],
|
||||
"cohort_id": "evidence-first-2026-01",
|
||||
"interview": {
|
||||
"scheduled": "2026-10-02",
|
||||
"date_precision": "day"
|
||||
}
|
||||
},
|
||||
{
|
||||
"company": "Schweizer Armee - Kommando Cyber",
|
||||
"role": "DevOps Engineer III (Data Platform)",
|
||||
"application_date": "2026-08-27",
|
||||
"fit_class": "core",
|
||||
"evidence_fit": 79.0,
|
||||
"hard_gate": "pass",
|
||||
"channel": "weak",
|
||||
"outcome": "rejected_no_interview",
|
||||
"submitted": "2026-08-27",
|
||||
"rejection_date": "2026-09-10",
|
||||
"days_to_disposition": 14,
|
||||
"note": "Form-letter rejection from Besarta Mehmeti, no interview, 14 days to disposition - the fastest in the log after Google Business Home. The letter is boilerplate ('Profil und unsere Kriterien nicht in allen Punkten uebereinstimmen') and carries ZERO diagnostic content, so it is not a signal about the package and is no reason to re-audit it. Same disposition class as Microsoft ISE, Google Business Home and Aker BP: a cold-channel no-interview rejection does not implicate document quality on its own. WORTH WATCHING, NOT CONCLUDING: this row and the SBB row are identical on every recorded dimension - core, Evidence Fit 79, hard gate pass, Document Quality 92, channel weak - and they went opposite ways (SBB converted to an interview, this died in 14 days). That shows the fit score did not discriminate; it does NOT show what did. n=1 on each side. Do not react with positioning changes (application_strategy.md 38/74). Channel note: Marcel Matthey-Doret (+41 58 46 78409) was published and never called - the fourth published, reachable contact left unused after Heinzen (RUAG), Wienandts (SBB) and Marthinsen (Aker BP). Consistent with the 2026-09-05 channel policy, but NOT evidence for it: the single interview in this log came from a cold submit.",
|
||||
"id": "app-e7389ad9d46f",
|
||||
"label": "Schweizer Armee - Kommando Cyber (Kdo Cy), DevOps Engineer III (Data Platform), Zimmerwald (Ref JRQ$540-19848)",
|
||||
"next_action": "Closed; no pending application action. Read recorded history before reopening.",
|
||||
"current_summary": "CLOSED - REJECTED 2026-09-10",
|
||||
"events": [
|
||||
{
|
||||
"type": "legacy_status_import",
|
||||
"recorded_at": "2026-09-11",
|
||||
"source": "CLAUDE.md / application_cohort.json",
|
||||
"details": "**CLOSED - REJECTED 2026-09-10** (submitted 2026-08-27, **14 days to disposition**, no interview - the fastest in the log after Google Business Home). Form letter from **Besarta Mehmeti**; the text is boilerplate (*„Profil und unsere Kriterien nicht in allen Punkten übereinstimmen\"*) and carries **zero diagnostic content** - it is not a signal about the package and is **no reason to re-audit it**. Same disposition class as Microsoft ISE, Google Business Home and Aker BP: **a cold-channel no-interview rejection does not implicate document quality on its own.** ⚠ **WORTH WATCHING, NOT CONCLUDING:** this application and **SBB** are identical on every recorded dimension - Core, Evidence Fit **79**, hard gate PASS, Document Quality **92**, channel Weak - and they went opposite ways: SBB converted to an interview, this died in 14 days. **That shows the fit score did not discriminate; it does not show what did.** n=1 on each side - do not react with positioning changes (`application_strategy.md` §38/§74). **Channel:** Marcel Matthey-Doret's published line (+41 58 46 78409) was never called - the **fourth** published, reachable contact left unused after Heinzen (RUAG), Wienandts (SBB) and Marthinsen (Aker BP). Consistent with the 2026-09-05 channel policy but **not evidence for it**: the only interview in the log came from a *cold* submit whose resume was missing all three ATS literals. **Kdo Cy as an organisation is NOT closed** - 11 Kdo Cy roles were open on the portal at submission time and only this req is decided. Evidence Fit **79/Core**, hard gate **PASS**, Document Quality **92/100**, channel **Weak**. Submitted package: German 2-page CV with **15 bullets** and 1-page motivation letter with **300 body words**; validators PASS, 0 boxes, text order and visual QA clean. Canonical **BW-1** records the six-year Bundeswehr officer career and anchors the letter's military/public-service motivation. User explicitly accepted the critique's remaining BS-1 wording issue (*„ohne manuellen Eingriff“*) as good enough and submitted unchanged. Honest gaps remain physical datacenter work, GPGPU, ClickHouse and named Pull-GitOps practice. Cohort evidence-first-2026-01 is now **5/10, Core 3/7** *(pre-dates the 2026-09-05 cap drop; counts are a record, not a budget)*.",
|
||||
"legacy_next_action": "Done - rejection recorded in `application_cohort.json`, `decisions.json` and the session file. Optional and low-cost: a one-line feedback request to **Besarta Mehmeti**, which also builds a contact at an org with other open reqs."
|
||||
},
|
||||
{
|
||||
"type": "applied",
|
||||
"date": "2026-08-27"
|
||||
},
|
||||
{
|
||||
"type": "rejected_no_interview",
|
||||
"date": "2026-09-10"
|
||||
}
|
||||
],
|
||||
"cohort_id": "evidence-first-2026-01"
|
||||
},
|
||||
{
|
||||
"company": "Citadel Securities",
|
||||
"role": "Platform Engineer, Research Platform Engineering (Zurich/NY/Miami)",
|
||||
"application_date": "2026-08-26",
|
||||
"fit_class": "adjacent",
|
||||
"evidence_fit": 71.0,
|
||||
"hard_gate": "pass",
|
||||
"channel": "weak",
|
||||
"outcome": "applied",
|
||||
"id": "app-ef2bec6fe379",
|
||||
"label": "Citadel Securities — Platform Engineer, Research Platform Engineering, Zürich (also NY/Miami)",
|
||||
"next_action": "Await response. At first contact, confirm whether the application is for the Zurich seat; relocation to the US remains ruled out. Clarify homeoffice/onsite requirements and the Zurich compensation package. Baseline is 3 homeoffice days/week; fewer days require a clear overall improvement. The posted US salary range is not a Zurich figure.",
|
||||
"current_summary": "SUBMITTED 2026-08-26 — open, awaiting response.",
|
||||
"events": [
|
||||
{
|
||||
"type": "legacy_status_import",
|
||||
"recorded_at": "2026-09-11",
|
||||
"source": "CLAUDE.md / application_cohort.json",
|
||||
"details": "**SUBMITTED 2026-08-26 — open, awaiting response.** Recorded as `adjacent` in `application_cohort.json` (outcome `applied`) and as `applied` in `decisions.json`. *Slot language from the capped-cohort era has been removed here: the caps were dropped 2026-09-05 and counts are a record, not a budget.* ⚠️ **KEY FINDING — the application form's preferred-work-location selector offered NO Zurich**, despite the JD saying \"Miami, Zurich or New York\" and the site's own Zurich filter returning this req. Careers site is operated by **Citadel Enterprise Americas LLC**; the apply flow is likely US-entity, or the Zurich seat is closed while the posting stands. **This partly supersedes the working-model risk** — if no Zurich seat is reachable through that form, hybrid-vs-onsite is moot and the application may sit against a US req, a hard NO on relocation. **Rule for any future Citadel application: check the form's location selector BEFORE building a package** — the posting's stated locations and the site filter both proved unreliable. User applied with low expectation; cold channel, evergreen standing req. 2pp resume (13 bullets) + 1pp CL (270 words), both validator **PASS, 0 warnings**; JD term coverage 51%→68% after Tier 1 fixes. Critique **STALE by design** (86/100 pre-edit; user chose to submit as-is over re-critiquing; est. ~91 post-edit, never quote as a score). **CORRECTED 2026-09-10:** this row previously said *\"Cohort entry and decision-log entry deliberately NOT written — no confirmed send date\"* while its own status line read SUBMITTED. **Both entries exist and both are dated 2026-08-26** — the sentence was pre-submission text that survived the send. **The working-model question is still open and travels with the application:** Evidence Fit **71/100 (Adjacent, mid-band; revised down from 74)**, qualifications gate PASS but **a practical constraint is UNRESOLVED**, which `critique_framework.md` treats as a NO-GO trigger. **The JD is silent on hybrid vs onsite (0 grep matches), and Ken Griffin is on record that Citadel returned to the office 5 days a week and calls it his most important leadership decision.** If that holds for Zurich, it means ~2–2.5h daily commuting from Bern or relocating — breaking the Bern-based / 2–3 day hybrid bar. Only contrary evidence is a stale 2022 anonymous Fishbowl post about Operations. **Must be asked, not researched** — same class as the SBB K band. Practical constraints scored 5/5 in Phase 0 on an unexamined assumption; corrected to 2/5. **Zero Gaps among the 7 minimum quals**, and all five preferred technologies (Kafka, Kubernetes, Spark, Airflow, distributed DBs) are Direct — **the strongest raw stack alignment in the log**. Title-defining function **splits**: R2 (ingestion/transformation/storage/lifecycle of large datasets) is Direct and describes SW-1/SW-7 exactly; **R1 (design and build the research platform itself) is Adjacent** — the Aker BP authoring-vs-building shape again, and unwritable-around under Scope Discipline. **Classification caveat:** `application_strategy.md`'s \"a defining responsibility is only Adjacent → Stretch\" would strictly class this Stretch; recorded Adjacent per the Aker BP precedent (the caps this once turned on no longer exist). Gaps: platform authoring at firm scale, no professional quant/finance (now partly mitigated by new **PP-1/PP-2**), SDKs (0 evidence), low-latency/HFT (0 evidence — thesis throughput figure is explicitly barred by `thesis_limits`). **Go is NOT a gap** — Q3 is disjunctive and Python satisfies it. **$175–350k in the posting is a US/NY pay-transparency disclosure, NOT the Zurich number — must be asked.** Channel **Weak/cold** — it was the 5th consecutive cold application, in an office visibly staffed from Google and ETH (platform research head Costas Bekas; Nicolai Meinshausen leads principal research). Cover letter **was written and submitted** (1pp, 270 words); the PP-1 domain story carries it.",
|
||||
"legacy_next_action": "**Await response** (submitted 2026-08-26). No document work pending. **Two questions travel with this application and must both be asked at first contact, before any interview effort:** (1) **is the application even against the Zürich seat?** — the apply form offered no Zürich, so it may sit against a US req, which is a hard NO on relocation; (2) **hybrid or 5-day onsite?** — unresolved at submission, and 5-day onsite is a likely NO-GO on the Bern constraint. Same shape as the NVIDIA working-model issue: it went out unresolved, so it is now a live screening topic rather than a pre-cleared one. Also unasked: the Zürich compensation figure — the posting's $175–350k is a US/NY pay-transparency disclosure."
|
||||
},
|
||||
{
|
||||
"type": "applied",
|
||||
"date": "2026-08-26"
|
||||
}
|
||||
],
|
||||
"cohort_id": "evidence-first-2026-01"
|
||||
},
|
||||
{
|
||||
"company": "SBB",
|
||||
"role": "Data Engineer (m/w/d), Asset Management Infrastrukturanlagen, Bern",
|
||||
"job_id": "103755",
|
||||
"application_date": "2026-08-25",
|
||||
"fit_class": "core",
|
||||
"evidence_fit": 79.0,
|
||||
"hard_gate": "pass",
|
||||
"channel": "weak",
|
||||
"outcome": "withdrawn_by_candidate",
|
||||
"submitted": "2026-08-25",
|
||||
"interview": {
|
||||
"stage": "Stage 2 of 4 - Virtuelles Kennenlernen mit HR und Fuehrungskraft",
|
||||
"invited": "2026-08-28",
|
||||
"scheduled": "2026-09-09 08:30",
|
||||
"duration_min": 45,
|
||||
"format": "Microsoft Teams",
|
||||
"held": "2026-09-09",
|
||||
"result": "Held 2026-09-09 (HR + Scrum Master). Candidate WITHDREW 2026-09-11 after SBB confirmed there was no room to move on the Einstufung.",
|
||||
"user_read": "User reported 'ein paar Red Flags' and judged that the Rahmenbedingungen do not compensate for them. The specific red flags were NOT captured while fresh - if this is reopened, ask before relying on memory. Leaning negative but explicitly undecided as of 2026-09-10; he asked to leave it open pending SBB's feedback."
|
||||
},
|
||||
"withdrawn": "2026-09-11",
|
||||
"why_withdrawn": "Total package was a net DOWNGRADE on four counts: 41h vs 40h week; 25 days holiday + Brueckentage vs 28 + 5 from Zeitautonomie; 3 office days vs 2; and the band ceiling above. Plus a qualitative red flag: he spoke only to HR and the Scrum Master and perceived DIFFICULTIES IN THE TEAM. That one is not fixable by a salary offer - note it if SBB or a similar Bern-tier seat comes back.",
|
||||
"lesson": "SBB-SPECIFIC targeting rule (user 2026-09-11): at SBB, Anforderungsniveau K is too low - aim at Niveau L and/or Kader. NARROWED the same day at the user's instruction: Anforderungsniveau is SBB's OWN system (https://company.sbb.ch/de/jobs-karriere/arbeitgeberin/lohn.html) and does NOT generalise - jobs.admin.ch uses Lohnklassen, RUAG its own scheme, PostFinance per-posting bands. ~145k is an SBB ceiling, not a tier anchor. THUN-AREA EMPLOYERS (RUAG, Kdo Cy) ARE EXPLICITLY OUT of this reasoning: near-zero commute plus benefits a band does not show - he named childcare-cost coverage at the Schweizer Armee/Kdo Cy as potentially far more generous (UNVERIFIED - ask). Never decline a Thun-area role on band alone. What DOES generalise: judge by headroom in the band, and price the total package (working time, holiday, office days), not the entry number.",
|
||||
"id": "app-799e2880a22e",
|
||||
"label": "SBB - Data Engineer (m/w/d), Asset Management Infrastrukturanlagen, Bern (Job ID 103755)",
|
||||
"next_action": "Closed. For future SBB roles assess Niveau L/Kader; do not generalize SBB bands to other employers.",
|
||||
"current_summary": "Withdrew after interview and confirmation that SBB could not improve the classification. Niveau K ceiling and total package unsuitable for this application.",
|
||||
"events": [
|
||||
{
|
||||
"type": "legacy_status_import",
|
||||
"recorded_at": "2026-09-11",
|
||||
"source": "CLAUDE.md / application_cohort.json",
|
||||
"details": "**CLOSED - APPLICATION WITHDRAWN BY THE CANDIDATE 2026-09-11.** Interview held 2026-09-09 (HR + Scrum Master, **not** the People Leader the brief expected); SBB confirmed there was no room on the Einstufung, and he withdrew. **This is the cohort's only interview and it ended as a NO from his side, not theirs.** 💰 **HARD COMP FIGURES - supersedes the earlier +10% estimate and is the reference point for the whole Bern/Thun tier:** **Anforderungsniveau K tops out at ~CHF 145k.** He sits at **~CHF 135k inside a Swisscom band that runs to ~CHF 160k**. The decisive argument was **headroom, not the absolute number** - he would have entered K at its ceiling merely to break even, with nothing above. ⚠ **The package was a net DOWNGRADE on four counts:** 41h vs 40h week · 25 days holiday + Brückentage vs 28 + 5 from Zeitautonomie · 3 office days vs 2 · the band ceiling. ⚠ **Qualitative red flag worth carrying forward:** he spoke only to HR and the Scrum Master and **perceived difficulties in the team** - that is not repairable by a salary offer. 🎯 **TARGETING RULE — SBB ONLY: Anforderungsniveau K is too low; at SBB aim at NIVEAU L and/or KADER.** ⚠ **Deliberately NOT generalised** (user, 2026-09-11): *Anforderungsniveau* is **SBB's own** salary system (published at <https://company.sbb.ch/de/jobs-karriere/arbeitgeberin/lohn.html>) and does not map onto other employers — **jobs.admin.ch/Schweizer Armee uses Lohnklassen**, RUAG has its own scheme, PostFinance publishes per-posting bands. ~145k is an **SBB** ceiling, not a tier anchor. ⚠ **Thun and surroundings (RUAG, Kdo Cy) are explicitly OUT of this reasoning:** near-zero commute plus benefits that a salary band does not show — he named **childcare-cost coverage at the Schweizer Armee/Kdo Cy as potentially far more generous** (unverified — ask, do not assume). **Never decline a Thun-area role on band alone before pricing the benefits.** What *does* carry across employers: judge by **headroom in the band**, and price the **total package** (working time, holiday, office days), not the entry salary. Original record: interview was stage 2 of 4, **INTERVIEW HELD 2026-09-09.** SBB asked him to come back on whether the role interests him; **SBB's own feedback is still outstanding.** User's summary: *„ok\"*, but **ein paar Red Flags**, and in his read the Rahmenbedingungen do not compensate for them - **leaning negative, explicitly undecided as of 2026-09-10, and he asked to leave it open.** ⚠ **The specific red flags were NOT captured while fresh** - anyone reopening this must ask rather than rely on memory. 💰 **First real read on Anforderungsniveau K:** his post-interview estimate is that roughly **+10% on the current ~140k** looks achievable (very roughly ~155k). **This is HIS ESTIMATE of what is negotiable, not a band SBB is recorded as quoting** - whether the K range was named on the call is unrecorded. Well below the 180k bar, above current pay. Recorded in `comp_worksheet_sbb.md` as the **first calibration point for the entire Bern/Thun local tier** (RUAG, Swissgrid, BKW, BFH), which was previously pure guesswork - treat as an estimate, never quote as a figure. **INTERVIEW INVITED 2026-08-28 - 9. September 2026, 08:30, 45 Min, MS Teams.** Per the posting's own process this is **stage 2 of 4**, *\"Virtuelles Kennenlernen mit HR und Fuehrungskraft\"* - **HR together with Andri Wienandts**, not a pure HR screen. Brief written to `output/SBB_DataEngineer_AssetMgmt/interview_brief_sbb_2026-09-09.md`. **This is the FIRST interview of the evidence-first cohort** (6 applications, 2 rejections, 1 conversion) and it converted from a **COLD submit** - the channel plan called for phoning Wienandts first and that never happened. **The resume never contained Snowflake, dbt or Power BI**, the three literals an ATS keyword screen would have keyed on; the session had recorded that risk 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, do not over-read it** - but it is evidence against assuming honest omissions are fatal at the screen. Submitted 2026-08-25: 2pp English resume, 13 bullets, no cover letter (SBB waives it), Evidence Fit **79/100 Core**, hard gate **PASS**, Document Quality **92/100**, channel **Weak/cold**. Best practical fit in the log - Bern-based, German-language, no relocation, EU citizen + B permit. **Four things unresolved before submitting and now live call topics:** (1) **Anforderungsniveau K** is a capped GAV band, figures not public, very likely below the 180k bar; (2) the seat reads **lateral or below** current Staff + Component Owner scope, the same shape as the declined BKW, and the JD's only architecture language is a personal skill not an ownership mandate; (3) **RAMSI** Java/Spring Boot/Angular is a whole responsibility line on a stack that is historical or absent - ask its share, do not ovLine truncated
|
||||
"legacy_next_action": "Done - withdrawn and recorded in `application_cohort.json`, `decisions.json`, `comp_worksheet_sbb.md` and memory. **Carry forward the headroom + total-package test, NOT the K→L mapping** — that one is SBB-specific and was explicitly narrowed by the user on 2026-09-11.",
|
||||
"legacy_open_risk": "Anforderungsniveau K is a capped GAV band, figures not public; seat may read lateral or below current Staff + Component Owner scope.",
|
||||
"legacy_note": "FIRST interview invitation in the evidence-first cohort. Converted from a COLD submit - the published warm contact (Andri Wienandts, +41 79 364 62 53) was never called. The resume never contained Snowflake, dbt or Power BI, the three literals an ATS keyword screen would have keyed on, so a human read the dossier.",
|
||||
"legacy_comp_datapoint": "HARD FIGURES, from the interview - supersedes the earlier +10% estimate. Anforderungsniveau K TOPS OUT AT ~CHF 145k. His own position: ~CHF 135k today inside a Swisscom band that runs to ~CHF 160k. So the decisive point was NOT the absolute number but the HEADROOM: he would have had to enter K at its ceiling just to break even, with nothing left above. First hard calibration of a Swiss public-sector band and the reference point for the whole Bern/Thun tier (RUAG, Swissgrid, BKW, BFH, PostFinance)."
|
||||
},
|
||||
{
|
||||
"type": "applied",
|
||||
"date": "2026-08-25"
|
||||
},
|
||||
{
|
||||
"type": "interview_invited",
|
||||
"date": "2026-08-28"
|
||||
},
|
||||
{
|
||||
"type": "interview_held",
|
||||
"date": "2026-09-09"
|
||||
},
|
||||
{
|
||||
"type": "withdrawn_by_candidate",
|
||||
"date": "2026-09-11"
|
||||
}
|
||||
],
|
||||
"cohort_id": "evidence-first-2026-01"
|
||||
},
|
||||
{
|
||||
"id": "app-b34da8c3f4a3",
|
||||
"label": "AWS (AWS EMEA SARL, Switzerland Branch) — Senior Forward Deployed Engineer, Zürich (job 10504263)",
|
||||
"company": "AWS (AWS EMEA SARL, Switzerland Branch)",
|
||||
"role": "AWS (AWS EMEA SARL, Switzerland Branch) — Senior Forward Deployed Engineer, Zürich (job 10504263)",
|
||||
"outcome": "not_proceeding",
|
||||
"next_action": "Closed; no pending application action. Read recorded history before reopening.",
|
||||
"current_summary": "CLOSED — NO-GO 2026-08-18",
|
||||
"events": [
|
||||
{
|
||||
"type": "legacy_status_import",
|
||||
"recorded_at": "2026-09-11",
|
||||
"source": "CLAUDE.md / application_cohort.json",
|
||||
"details": "**CLOSED — NO-GO 2026-08-18** at the Phase 0 gate. Evidence Fit **69/100** (Adjacent). Minimum-qual gate passed (all 4 Basic Quals Direct) but the *title-defining* capability — customer embedding — is a Gap that `claims.json` globally forbids claiming, and R2 multi-agent/retrieval is a second Gap. User declined: **69 is below the fit bar worth spending 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).** Phase 0 analysis retained in the session file for reuse if a better-fitting AWS req appears.",
|
||||
"legacy_next_action": "Done — no package built"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "app-dfd0467ead74",
|
||||
"label": "Google — Forward Deployed Engineer III, Google Cloud GTM (French, German), Zürich (req 78350205438567110)",
|
||||
"company": "Google",
|
||||
"role": "Google — Forward Deployed Engineer III, Google Cloud GTM (French, German), Zürich (req 78350205438567110)",
|
||||
"outcome": "not_proceeding",
|
||||
"next_action": "Closed; no pending application action. Read recorded history before reopening.",
|
||||
"current_summary": "CLOSED — NOT PROCEEDING 2026-08-18.",
|
||||
"events": [
|
||||
{
|
||||
"type": "legacy_status_import",
|
||||
"recorded_at": "2026-09-11",
|
||||
"source": "CLAUDE.md / application_cohort.json",
|
||||
"details": "**CLOSED — NOT PROCEEDING 2026-08-18.** Phase 0 was done (Evidence Fit 67/100, hard gate PASS) but user declined to proceed after **two Google rejections** (Merchant Data Science, Business Home): the bar is now that a Google req must fit *very* well to be worth a third attempt, and this one was Adjacent with an agent-orchestration Gap. **Frees the Adjacent cohort slot (back to 1/2).** Phase 1 never started.",
|
||||
"legacy_next_action": "Done — do not reopen without a materially stronger Google req"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "app-2dce75760765",
|
||||
"label": "SDU Center for Energy Informatics, Odense DK — PhD, Theme 2 Predictive Maintenance & Asset Management of Smart Energy Networks (job 4159)",
|
||||
"company": "SDU Center for Energy Informatics, Odense DK",
|
||||
"role": "SDU Center for Energy Informatics, Odense DK — PhD, Theme 2 Predictive Maintenance & Asset Management of Smart Energy Networks (job 4159)",
|
||||
"outcome": "not_proceeding",
|
||||
"next_action": "Closed; no pending application action. Read recorded history before reopening.",
|
||||
"current_summary": "CLOSED — NOT PROCEEDING 2026-08-18.",
|
||||
"events": [
|
||||
{
|
||||
"type": "legacy_status_import",
|
||||
"recorded_at": "2026-09-11",
|
||||
"source": "CLAUDE.md / application_cohort.json",
|
||||
"details": "**CLOSED — NOT PROCEEDING 2026-08-18.** Enquiry email to Prof. Bo Nørregaard Jørgensen (sent 2026-08-02) went unanswered for 16 days; user dismissed the idea. Genuine thesis fit (vibration condition monitoring, RBR+ANN hybrid) but the blockers were never the documents — 2 letters of recommendation 13 years out of academia, and DKK 37,075/mo ≈ CHF 56k against a 180k bar. Deadline was 2026-08-20.",
|
||||
"legacy_next_action": "Done — no further action"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"company": "Aker BP ASA",
|
||||
"role": "Data Product Architect - AI-ready Data Products",
|
||||
"application_date": "2026-07-29",
|
||||
"fit_class": "adjacent",
|
||||
"evidence_fit": 79.0,
|
||||
"hard_gate": "pass",
|
||||
"channel": "weak",
|
||||
"outcome": "rejected_no_interview",
|
||||
"submitted": "2026-07-29",
|
||||
"rejection_date": "2026-08-27",
|
||||
"id": "app-80e038df976c",
|
||||
"label": "Aker BP ASA — Data Product Architect, AI-ready Data Products (FINN 469067315)",
|
||||
"next_action": "Closed; no pending application action. Read recorded history before reopening.",
|
||||
"current_summary": "CLOSED — REJECTED 2026-08-27",
|
||||
"events": [
|
||||
{
|
||||
"type": "legacy_status_import",
|
||||
"recorded_at": "2026-09-11",
|
||||
"source": "CLAUDE.md / application_cohort.json",
|
||||
"details": "**CLOSED — REJECTED 2026-08-27** (submitted 2026-07-30, ~28 days to disposition, no interview; the session file and cohort record record the submission as 2026-07-29 — a one-day inconsistency, never reconciled). Adjacent, **Evidence Fit 79/100**, Document Quality 93/100, hard gate PASS, **Channel Weak/cold** — the optional follow-up email to Per Olav Marthinsen was left unsent, so this went in as a pure cold submit. Stavanger/Oslo/Trondheim, English working language, no Norwegian and no clearance required, EEA work rights. 2pp resume + 1pp CL, both validator PASS, no Tier 1 truth findings — **a cold-channel no-interview rejection does not implicate document quality on its own** (same disposition class as Microsoft ISE and Google Business Home). Honest practitioner framing: builds governed data products *inside* Swisscom's Data Mesh; role *authored* an enterprise framework — real level stretch, never fabricated authorship. **Atlassian Compass closed the catalogue-tool gap** (74→79). Standing gaps if a similar req appears: framework authorship, no energy domain, AWS vs their Microsoft/Cognite stack, **zero verified metrics**. **Cohort slot stays consumed** (evidence-first-2026-01, Adjacent 1/2 — a rejection does not free a slot; cohort remains 4/10). **The Norway lane stays OPEN and selective** — NATO JWC Stavanger is still live, and Equinor/Telenor and other strong Norwegian employers remain in scope per the user's standing instruction. Never frame this lane as closed.",
|
||||
"legacy_next_action": "Done — cohort rejection recorded; do not react to this single outcome with positioning changes (`application_strategy.md` §38/§74)"
|
||||
},
|
||||
{
|
||||
"type": "applied",
|
||||
"date": "2026-07-29"
|
||||
},
|
||||
{
|
||||
"type": "rejected_no_interview",
|
||||
"date": "2026-08-27"
|
||||
},
|
||||
{
|
||||
"type": "record_correction",
|
||||
"date": "2026-09-11",
|
||||
"details": "Application date CONFIRMED BY THE USER as 2026-07-29, settling the one-day conflict between the cohort record (07-29) and the CLAUDE.md session cell (07-30). The legacy import event above still quotes 07-30; it is preserved verbatim as the historical text and is not edited."
|
||||
}
|
||||
],
|
||||
"cohort_id": "evidence-first-2026-01",
|
||||
"fit_override_reason": "Recorded Adjacent although Evidence Fit 79 with a passing hard gate would score Core under the numeric rubric. The original rationale is NOT RECOVERABLE: the user was asked on 2026-09-11 and does not remember, and judged it immaterial because the role is closed and rejected. Deliberately NOT reclassified to Core - that would be the silent reclassification the review objected to, and it would rewrite a historical judgement to make the arithmetic tidy. The contemporaneous note points at a real reason rather than an error: the title-defining responsibility (authoring an enterprise framework) was only Adjacent, and application_strategy.md says a defining responsibility that is only Adjacent pushes a role down a class. Treated as a judgement recorded under the pre-2026-09-05 rubric, not as a data error. No future record may cite this one as precedent without stating its own reason.",
|
||||
"rubric_version": "pre-2026-09-05-cohort",
|
||||
"classification_note_for_stats": "Fit-class counts that include this row mix one pre-2026-09-05 judgement with post-rubric entries. Immaterial for a closed role; state it if the distribution is ever used as evidence."
|
||||
},
|
||||
{
|
||||
"company": "Google",
|
||||
"role": "Software Engineer III, Business Home",
|
||||
"application_date": "2026-07-27",
|
||||
"fit_class": "core",
|
||||
"evidence_fit": 89.0,
|
||||
"hard_gate": "pass",
|
||||
"channel": "weak",
|
||||
"outcome": "rejected_no_interview",
|
||||
"id": "app-767097db424a",
|
||||
"label": "Google - Software Engineer III, Business Home, Zurich (req 93922217108087494)",
|
||||
"next_action": "Closed; no pending application action. Read recorded history before reopening.",
|
||||
"current_summary": "CLOSED - NOT PROCEEDING 2026-07-28",
|
||||
"events": [
|
||||
{
|
||||
"type": "legacy_status_import",
|
||||
"recorded_at": "2026-09-11",
|
||||
"source": "CLAUDE.md / application_cohort.json",
|
||||
"details": "**CLOSED - NOT PROCEEDING 2026-07-28** (submitted 2026-07-27; Core, Evidence Fit 89/100, Document Quality 94/100; no interview). Rapid early-screen disposition; known risks were Mid-level versus current Staff scope, data/platform versus product-SWE positioning, preferred algorithms/accessibility gaps, and a cold channel.",
|
||||
"legacy_next_action": "Done - cohort rejection recorded; do not treat this outcome alone as a document-quality failure"
|
||||
},
|
||||
{
|
||||
"type": "applied",
|
||||
"date": "2026-07-27"
|
||||
},
|
||||
{
|
||||
"type": "rejected_no_interview",
|
||||
"date": "2026-07-28"
|
||||
}
|
||||
],
|
||||
"cohort_id": "evidence-first-2026-01"
|
||||
},
|
||||
{
|
||||
"id": "app-4b478d0db972",
|
||||
"label": "Microsoft — Principal Forward Deployed Engineer, SWE (German Speaking), Zürich (req 200043897)",
|
||||
"company": "Microsoft",
|
||||
"role": "Microsoft — Principal Forward Deployed Engineer, SWE (German Speaking), Zürich (req 200043897)",
|
||||
"outcome": "applied",
|
||||
"next_action": "Done — await response",
|
||||
"current_summary": "SUBMITTED 2026-07-27",
|
||||
"events": [
|
||||
{
|
||||
"type": "legacy_status_import",
|
||||
"recorded_at": "2026-09-11",
|
||||
"source": "CLAUDE.md / application_cohort.json",
|
||||
"details": "**SUBMITTED 2026-07-27** (84.2/100 Pass 2; finalized 2-page resume + 1-page cover letter). Strong native-German, Staff progression, production ownership and enterprise-data-readiness case; honest gaps remain in end-to-end LLM delivery, Azure AI and strategic-account FDE experience.",
|
||||
"legacy_next_action": "Done — await response"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "app-7c94f6a9d318",
|
||||
"label": "BIS Basel — Senior Data & Analytics Engineer, AI (jr100429, 3-yr term)",
|
||||
"company": "BIS Basel",
|
||||
"role": "BIS Basel — Senior Data & Analytics Engineer, AI (jr100429, 3-yr term)",
|
||||
"outcome": "rejected_no_interview",
|
||||
"next_action": "Abgeschlossen: Absage erhalten; keine weitere Aktion offen.",
|
||||
"current_summary": "Absage am 2026-09-11 vom Nutzer gemeldet. Im bisherigen Verlauf ist kein Interview dokumentiert; ein Absagegrund wurde nicht genannt.",
|
||||
"events": [
|
||||
{
|
||||
"type": "legacy_status_import",
|
||||
"recorded_at": "2026-09-11",
|
||||
"source": "CLAUDE.md / application_cohort.json",
|
||||
"details": "**SENT 2026-07-10** (80.5/100; deadline 2026-07-24; hybrid Basel, English-working intl org). Critique flags LLM-depth probe (integration/config vs. ownership) as the screening risk — prep honest answer before any call",
|
||||
"legacy_next_action": "Prep interview brief when screening lands"
|
||||
},
|
||||
{
|
||||
"type": "rejected_no_interview",
|
||||
"date": "2026-09-11",
|
||||
"note": "Absage am 2026-09-11 vom Nutzer gemeldet. Im bisherigen Verlauf ist kein Interview dokumentiert; ein Absagegrund wurde nicht genannt.",
|
||||
"outcome": "rejected_no_interview"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "app-b6b86e70c1c1",
|
||||
"label": "NATO JWC Stavanger — Staff Officer, AI Engineer (2030 Digitalisation, G15, 3-yr PLN)",
|
||||
"company": "NATO JWC Stavanger",
|
||||
"role": "NATO JWC Stavanger — Staff Officer, AI Engineer (2030 Digitalisation, G15, 3-yr PLN)",
|
||||
"outcome": "rejected_no_interview",
|
||||
"next_action": "Abgeschlossen: Absage erhalten; keine weitere Aktion offen.",
|
||||
"current_summary": "Absage am 2026-10-05 erhalten, vom Nutzer am 2026-10-06 gemeldet. Im bisherigen Verlauf ist kein Interview dokumentiert; ein Absagegrund wurde nicht genannt.",
|
||||
"events": [
|
||||
{
|
||||
"type": "legacy_status_import",
|
||||
"recorded_at": "2026-09-11",
|
||||
"source": "CLAUDE.md / application_cohort.json",
|
||||
"details": "**SENT 2026-07-10** (77.5/100; deadline 2026-08-09; final interviews 2nd half Oct 2026). Borderline screen: Azure-cert \"or equivalent\", LLM depth, no current clearance; German national + officer service are the legibility assets. Tax-free NOK 93,933/mo + allowances",
|
||||
"legacy_next_action": "Await screening; no action until contact"
|
||||
},
|
||||
{
|
||||
"type": "rejected_no_interview",
|
||||
"date": "2026-10-05",
|
||||
"note": "Absage am 2026-10-05 erhalten, vom Nutzer am 2026-10-06 gemeldet. Im bisherigen Verlauf ist kein Interview dokumentiert; ein Absagegrund wurde nicht genannt.",
|
||||
"outcome": "rejected_no_interview"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "app-767a898d5119",
|
||||
"label": "Microsoft — Senior SWE, Industry Solutions Engineering (ISE), Zürich (req 200040836)",
|
||||
"company": "Microsoft",
|
||||
"role": "Microsoft — Senior SWE, Industry Solutions Engineering (ISE), Zürich (req 200040836)",
|
||||
"outcome": "rejected_no_interview",
|
||||
"next_action": "Closed; no pending application action. Read recorded history before reopening.",
|
||||
"current_summary": "CLOSED — REJECTED 2026-08-11",
|
||||
"events": [
|
||||
{
|
||||
"type": "legacy_status_import",
|
||||
"recorded_at": "2026-09-11",
|
||||
"source": "CLAUDE.md / application_cohort.json",
|
||||
"details": "**CLOSED — REJECTED 2026-08-11** (submitted 2026-07-03, 85.8/100 Pass 2; 2pp resume + 1pp CL; verbatim Eightfold JD; IC4 base CHF 146.2–245.9k; applied ~7 days after posting). No interview, ~39 days to disposition. Cold-channel application; does not implicate document quality on its own. The separate Microsoft **Principal FDE** req 200043897 is a different pipeline and remains open",
|
||||
"legacy_next_action": "Done — cohort rejection recorded"
|
||||
},
|
||||
{
|
||||
"type": "rejected_no_interview",
|
||||
"date": "2026-08-11"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "app-54a40d825b99",
|
||||
"label": "Kraken (Payward) — SRE, AI Agents (remote, CH-eligible)",
|
||||
"company": "Kraken (Payward)",
|
||||
"role": "Kraken (Payward) — SRE, AI Agents (remote, CH-eligible)",
|
||||
"outcome": "rejected_no_interview",
|
||||
"next_action": "Closed; no pending application action. Read recorded history before reopening.",
|
||||
"current_summary": "CLOSED — REJECTED 2026-06-17",
|
||||
"events": [
|
||||
{
|
||||
"type": "legacy_status_import",
|
||||
"recorded_at": "2026-09-11",
|
||||
"source": "CLAUDE.md / application_cohort.json",
|
||||
"details": "**CLOSED — REJECTED 2026-06-17** (applied 2026-06-15 ~87.2/100, no interview). Honest gaps (NO Terraform/SRE-title/LangGraph) likely the filter; 4th Kraken req declined/rejected to date",
|
||||
"legacy_next_action": "Done"
|
||||
},
|
||||
{
|
||||
"type": "rejected_no_interview",
|
||||
"date": "2026-06-17"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "app-cca2669274dd",
|
||||
"label": "Google — Senior Data Engineer (Merchant Data Science), Zürich/MV",
|
||||
"company": "Google",
|
||||
"role": "Google — Senior Data Engineer (Merchant Data Science), Zürich/MV",
|
||||
"outcome": "rejected_no_interview",
|
||||
"next_action": "Closed; no pending application action. Read recorded history before reopening.",
|
||||
"current_summary": "CLOSED — NOT PROCEEDING 2026-07-24",
|
||||
"events": [
|
||||
{
|
||||
"type": "legacy_status_import",
|
||||
"recorded_at": "2026-09-11",
|
||||
"source": "CLAUDE.md / application_cohort.json",
|
||||
"details": "**CLOSED — NOT PROCEEDING 2026-07-24** (applied 2026-06-15, 85.5/100; passed Google Hiring Assessment 2026-06-20, no interview). Assessment pass remains recorded separately. The official 90-day wait applies only to reapplying for the same job; different Google roles remain eligible, subject to 3 applications per rolling 30 days.",
|
||||
"legacy_next_action": "Done — target a different strong-fit Google req"
|
||||
},
|
||||
{
|
||||
"type": "rejected_no_interview",
|
||||
"date": "2026-07-24"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "app-c86f83521a8f",
|
||||
"label": "Snowflake — Sr SWE, Enterprise (Observe by Snowflake), Zürich",
|
||||
"company": "Snowflake",
|
||||
"role": "Snowflake — Sr SWE, Enterprise (Observe by Snowflake), Zürich",
|
||||
"outcome": "closed_no_response",
|
||||
"next_action": "Closed; no pending application action. Read recorded history before reopening.",
|
||||
"current_summary": "CLOSED — NO RESPONSE 2026-08-25",
|
||||
"events": [
|
||||
{
|
||||
"type": "legacy_status_import",
|
||||
"recorded_at": "2026-09-11",
|
||||
"source": "CLAUDE.md / application_cohort.json",
|
||||
"details": "**CLOSED — NO RESPONSE 2026-08-25** (sent 2026-06-06, ~86/100; 2pp resume + 1pp CL; real Ashby JD; comp CHF 176–253k base; NO C++ gate). Closed by user decision at **80 days silent** — past the longest real disposition in the log (Equinor, 79 days). **No rejection was ever received: this is a presumed-dead call, not a rejection — do not count it in rejection statistics or treat it as a document-quality signal.** Cold channel. Pre-dates the evidence-first-2026-01 cohort (started 2026-07-27), so **no cohort slot freed**. Highest-scoring package in the log at ~86 and it drew no reply at all — the strongest single argument in the log for the channel problem over the document problem. **Unblocks the Snowflake Observe Metrics Platform req** (`db4f0492`), paused 2026-07-28 solely to avoid stacking a second cold application on the same org while this one was open",
|
||||
"legacy_next_action": "Done — if Snowflake is still wanted, the Metrics Platform req is now open to pursue, but route it through a recruiter rather than another cold submit"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "app-899a050e07df",
|
||||
"label": "Isovalent (Cisco) Sr Data Engineer, Observability",
|
||||
"company": "Isovalent (Cisco) Sr Data Engineer, Observability",
|
||||
"role": "Isovalent (Cisco) Sr Data Engineer, Observability",
|
||||
"outcome": "role_closed",
|
||||
"next_action": "Closed; no pending application action. Read recorded history before reopening.",
|
||||
"current_summary": "CLOSED — role pulled",
|
||||
"events": [
|
||||
{
|
||||
"type": "legacy_status_import",
|
||||
"recorded_at": "2026-09-11",
|
||||
"source": "CLAUDE.md / application_cohort.json",
|
||||
"details": "**CLOSED — role pulled** (live Cisco scrape 2026-06-02: not on board; Recruitee link dead). Package finalized ~86/100, SHELVED for reuse",
|
||||
"legacy_next_action": "Done — retarget PDFs to next live data-eng req (QuantCo/Grafana/Confluent)"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "app-7331db5903c0",
|
||||
"label": "Google Zürich Sr SWE Infrastructure (Data Pipeline)",
|
||||
"company": "Google Zürich Sr SWE Infrastructure (Data Pipeline)",
|
||||
"role": "Google Zürich Sr SWE Infrastructure (Data Pipeline)",
|
||||
"outcome": "not_proceeding",
|
||||
"next_action": "Closed; no pending application action. Read recorded history before reopening.",
|
||||
"current_summary": "CLOSED — DROPPED + DELETED 2026-06-02",
|
||||
"events": [
|
||||
{
|
||||
"type": "legacy_status_import",
|
||||
"recorded_at": "2026-09-11",
|
||||
"source": "CLAUDE.md / application_cohort.json",
|
||||
"details": "**CLOSED — DROPPED + DELETED 2026-06-02** (poor fit). Live JD = Core infra/systems SWE with **C++ as a MINIMUM qual**, off-thesis vs `user_positioning`. Output folder deleted (was built on a fabricated JD).",
|
||||
"legacy_next_action": "Done — do not reattempt this req"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "app-d2c54a5d0a90",
|
||||
"label": "Kraken AI Infrastructure",
|
||||
"company": "Kraken AI Infrastructure",
|
||||
"role": "Kraken AI Infrastructure",
|
||||
"outcome": "rejected_no_interview",
|
||||
"next_action": "Closed; no pending application action. Read recorded history before reopening.",
|
||||
"current_summary": "CLOSED — REJECTED",
|
||||
"events": [
|
||||
{
|
||||
"type": "legacy_status_import",
|
||||
"recorded_at": "2026-09-11",
|
||||
"source": "CLAUDE.md / application_cohort.json",
|
||||
"details": "**CLOSED — REJECTED** (applied, no interview)",
|
||||
"legacy_next_action": "Done"
|
||||
},
|
||||
{
|
||||
"type": "rejected_no_interview",
|
||||
"date": null
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "app-56b2e2bf9319",
|
||||
"label": "Infineon Doctoral",
|
||||
"company": "Infineon Doctoral",
|
||||
"role": "Infineon Doctoral",
|
||||
"outcome": "withdrawn_by_candidate",
|
||||
"next_action": "Closed; no pending application action. Read recorded history before reopening.",
|
||||
"current_summary": "CLOSED — withdrew",
|
||||
"events": [
|
||||
{
|
||||
"type": "legacy_status_import",
|
||||
"recorded_at": "2026-09-11",
|
||||
"source": "CLAUDE.md / application_cohort.json",
|
||||
"details": "**CLOSED — withdrew** (got interview invite, declined: no relocation to Germany)",
|
||||
"legacy_next_action": "Done"
|
||||
},
|
||||
{
|
||||
"type": "interview_invited",
|
||||
"date": null
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "app-e559939c6a59",
|
||||
"label": "Infineon AI Engineer",
|
||||
"company": "Infineon AI Engineer",
|
||||
"role": "Infineon AI Engineer",
|
||||
"outcome": "not_proceeding",
|
||||
"next_action": "Closed; no pending application action. Read recorded history before reopening.",
|
||||
"current_summary": "CLOSED — not applied",
|
||||
"events": [
|
||||
{
|
||||
"type": "legacy_status_import",
|
||||
"recorded_at": "2026-09-11",
|
||||
"source": "CLAUDE.md / application_cohort.json",
|
||||
"details": "**CLOSED — not applied** (no relocation to Germany)",
|
||||
"legacy_next_action": "Done"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "app-3f0d4f280d47",
|
||||
"label": "Apple Data Engineer (ISE, Zurich)",
|
||||
"company": "Apple Data Engineer (ISE, Zurich)",
|
||||
"role": "Apple Data Engineer (ISE, Zurich)",
|
||||
"outcome": "rejected_no_interview",
|
||||
"next_action": "Closed; no pending application action. Read recorded history before reopening.",
|
||||
"current_summary": "CLOSED — REJECTED",
|
||||
"events": [
|
||||
{
|
||||
"type": "legacy_status_import",
|
||||
"recorded_at": "2026-09-11",
|
||||
"source": "CLAUDE.md / application_cohort.json",
|
||||
"details": "**CLOSED — REJECTED** (no interview)",
|
||||
"legacy_next_action": "Done"
|
||||
},
|
||||
{
|
||||
"type": "rejected_no_interview",
|
||||
"date": null
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "app-78b71cc7208c",
|
||||
"label": "Google FDE GenAI (Zurich)",
|
||||
"company": "Google FDE GenAI (Zurich)",
|
||||
"role": "Google FDE GenAI (Zurich)",
|
||||
"outcome": "paused",
|
||||
"next_action": "Likely abandon",
|
||||
"current_summary": "PAUSED — GenAI evidence gap too large; redirecting to data-eng/MLOps roles",
|
||||
"events": [
|
||||
{
|
||||
"type": "legacy_status_import",
|
||||
"recorded_at": "2026-09-11",
|
||||
"source": "CLAUDE.md / application_cohort.json",
|
||||
"details": "PAUSED — GenAI evidence gap too large; redirecting to data-eng/MLOps roles",
|
||||
"legacy_next_action": "Likely abandon"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "app-0e0744827fda",
|
||||
"label": "Equinor — Manager / AI Architect, Agentic systems (Stavanger/Oslo/Rotvoll/Sandsli; req JR106747)",
|
||||
"company": "Equinor",
|
||||
"role": "Equinor — Manager / AI Architect, Agentic systems (Stavanger/Oslo/Rotvoll/Sandsli; req JR106747)",
|
||||
"outcome": "rejected_no_interview",
|
||||
"next_action": "Closed; no pending application action. Read recorded history before reopening.",
|
||||
"current_summary": "CLOSED — REJECTED 2026-08-14",
|
||||
"events": [
|
||||
{
|
||||
"type": "legacy_status_import",
|
||||
"recorded_at": "2026-09-11",
|
||||
"source": "CLAUDE.md / application_cohort.json",
|
||||
"details": "**CLOSED — REJECTED 2026-08-14** (submitted 2026-05-27, ~80/100; posting deadline 05.06.2026). No interview, **79 days** to disposition — the longest turnaround recorded. Cold channel. This was a **Manager** req, not a pure IC architect role, so level/scope stretch compounds the standing Norway per-role gates (norsk working-language, no NO clearance — **not** comp: the 180k bar is CH-only and does not apply to Norway). **Pre-dates the evidence-first-2026-01 cohort (started 2026-07-27) — does not free a cohort slot.** **The Norway lane stays OPEN but selective** — Equinor, Telenor and NATO JWC remain in the scout; the user has explicitly said he still wants to reach out for very good Norwegian roles, Equinor included, after this rejection. Never frame this lane as closed.",
|
||||
"legacy_next_action": "Done — cohort-external rejection recorded"
|
||||
},
|
||||
{
|
||||
"type": "rejected_no_interview",
|
||||
"date": "2026-08-14"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "app-2bf0a4c5a55f",
|
||||
"label": "QuantCo Cloud Engineer (Europe/Zürich)",
|
||||
"company": "QuantCo Cloud Engineer (Europe/Zürich)",
|
||||
"role": "QuantCo Cloud Engineer (Europe/Zürich)",
|
||||
"outcome": "rejected_no_interview",
|
||||
"next_action": "Closed; no pending application action. Read recorded history before reopening.",
|
||||
"current_summary": "CLOSED — REJECTED",
|
||||
"events": [
|
||||
{
|
||||
"type": "legacy_status_import",
|
||||
"recorded_at": "2026-09-11",
|
||||
"source": "CLAUDE.md / application_cohort.json",
|
||||
"details": "**CLOSED — REJECTED** (applied 2026-06-01 ~82/100, no interview; rejection 2026-06-15)",
|
||||
"legacy_next_action": "Done"
|
||||
},
|
||||
{
|
||||
"type": "rejected_no_interview",
|
||||
"date": null
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "app-535c5bfb3f94",
|
||||
"company": "Swisscom (Schweiz) AG",
|
||||
"role": "Data Engineer - Geo Platform, Bern/Worblaufen (internal, req R-0006447)",
|
||||
"label": "Swisscom (Schweiz) AG — Data Engineer - Geo Platform, Bern/Worblaufen (internal, req R-0006447)",
|
||||
"application_date": "2026-09-15",
|
||||
"fit_class": "no-go",
|
||||
"evidence_fit": 78.0,
|
||||
"hard_gate": "fail",
|
||||
"channel": "moderate",
|
||||
"outcome": "interviewing",
|
||||
"cohort_id": "evidence-first-2026-01",
|
||||
"job_id": "R-0006447",
|
||||
"url": null,
|
||||
"fit_override_reason": "User override 2026-09-15 after seeing the ArcGIS/FME hard gate (required, never used). Internal move with no change to level or conditions; hiring manager Marianne Temerowski encouraged the application.",
|
||||
"rubric_version": "critique-framework-2026-09-11",
|
||||
"next_action": "Swisscom-Rueckmeldung zwischen 2026-10-08 und 2026-10-15 abwarten; internen Aufgabenwechsel separat bewerten. Externe Suche unabhaengig vom Ausgang aktiv fortsetzen, auch bei erfolgreichem internem Wechsel.",
|
||||
"current_summary": "SUBMITTED 2026-09-15 via the internal Swisscom Workday posting (R-0006447): 2-page English resume (Dennis_Thiessen_Resume.pdf), no cover letter (internal). Evidence Fit 78, hard gate FAIL (ArcGIS/FME) overridden by the user, Document Quality 89, channel Moderate (hiring manager Marianne Temerowski encouraged the application).",
|
||||
"events": [
|
||||
{
|
||||
"type": "open",
|
||||
"date": "2026-09-15"
|
||||
},
|
||||
{
|
||||
"type": "contact_conversation",
|
||||
"date": "2026-09-15",
|
||||
"note": "Contacted hiring manager Marianne Temerowski before applying; she encouraged the application. She signed his Swisscom Zwischenzeugnis (Oct 2025). Whether ArcGIS/FME was discussed is not recorded. First application in the log where the named contact was used."
|
||||
},
|
||||
{
|
||||
"type": "applied",
|
||||
"date": "2026-09-15",
|
||||
"note": "SUBMITTED 2026-09-15 via the internal Swisscom Workday posting (R-0006447): 2-page English resume (Dennis_Thiessen_Resume.pdf), no cover letter (internal). Evidence Fit 78, hard gate FAIL (ArcGIS/FME) overridden by the user, Document Quality 89, channel Moderate (hiring manager Marianne Temerowski encouraged the application).",
|
||||
"outcome": "applied"
|
||||
},
|
||||
{
|
||||
"type": "interview_invited",
|
||||
"date": null,
|
||||
"recorded_at": "2026-09-28",
|
||||
"scheduled_for": "2026-10-01",
|
||||
"source": "user update 2026-09-28"
|
||||
},
|
||||
{
|
||||
"type": "interview_held",
|
||||
"date": "2026-10-01",
|
||||
"note": "Interview held 2026-10-01. User says it went fairly well. Response expected in 1-2 weeks. User perceives a possible mismatch: team may seek a more junior or AI-native candidate. No employer feedback or decision yet."
|
||||
},
|
||||
{
|
||||
"type": "note",
|
||||
"date": "2026-10-06",
|
||||
"note": "Nutzer-Klarstellung: Der interne Wechsel aendert nur den Aufgabenbereich, nicht Position oder Senioritaet und nicht wesentlich das Gehalt. Separater interner Aufgabenwechsel; die externe Suche bleibt unveraendert und laeuft auch bei erfolgreichem internen Wechsel weiter."
|
||||
}
|
||||
],
|
||||
"interview": {
|
||||
"scheduled": "2026-10-01",
|
||||
"date_precision": "day"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "app-google-commerce-140594136896938694",
|
||||
"company": "Google",
|
||||
"role": "Senior Software Engineer, Full Stack, Commerce, Zürich",
|
||||
"label": "Google — Senior Software Engineer, Full Stack, Commerce, Zürich",
|
||||
"application_date": null,
|
||||
"fit_class": "no-go",
|
||||
"evidence_fit": 73.0,
|
||||
"hard_gate": "fail",
|
||||
"channel": "weak",
|
||||
"outcome": "open",
|
||||
"cohort_id": "evidence-first-2026-01",
|
||||
"job_id": "140594136896938694",
|
||||
"url": "https://www.google.com/about/careers/applications/jobs/results/140594136896938694-senior-software-engineer-full-stack-commerce?location=Switzerland",
|
||||
"fit_override_reason": null,
|
||||
"rubric_version": "critique-framework-2026-09-11",
|
||||
"next_action": "No action - superseded by the Staff Shopping Graph package (output/Google_Staff_SWE_Shopping_Graph/). Reopen only if the user explicitly overrides the frontend gap.",
|
||||
"current_summary": "Preparation held: frontend experience denied; Full Stack title-defining gap. Not submitted.",
|
||||
"events": [
|
||||
{
|
||||
"type": "open",
|
||||
"date": "2026-10-03",
|
||||
"note": "User selected Google Commerce from scout shortlist. Preparation only; this is not an application submission."
|
||||
},
|
||||
{
|
||||
"type": "note",
|
||||
"date": "2026-10-03",
|
||||
"note": "User confirmed current data-product modelling/design/implementation and denied frontend experience. Full Stack is title-defining: project fit-policy no-go; no separate explicit frontend minimum claimed. Design duration still unconfirmed. Preparation held; not submitted and not user-withdrawn."
|
||||
},
|
||||
{
|
||||
"type": "note",
|
||||
"date": "2026-10-21",
|
||||
"note": "Superseded 2026-10-21: the user chose Google Staff SWE, Shopping Graph (Feeds Infra) as the single Google application after comparing all live Zurich reqs (job_scout/reports/2026-10-20.triage.md addendum). Commerce stays unsubmitted; frontend gap unchanged."
|
||||
}
|
||||
],
|
||||
"session": "output/Google_Senior_SWE_Commerce/session_google_senior_swe_commerce.md",
|
||||
"evidence_fit_status": "73 is the initial provisional score, not reassessed after clarification; confirmed title-defining gap overrides it"
|
||||
},
|
||||
{
|
||||
"id": "app-59d425526499",
|
||||
"company": "Kongsberg Discovery (Seatex)",
|
||||
"role": "Lead Engineer, DevOps and Test Infrastructure, Trondheim",
|
||||
"label": "Kongsberg Discovery (Seatex) — Lead Engineer, DevOps and Test Infrastructure, Trondheim",
|
||||
"application_date": "2026-10-08",
|
||||
"fit_class": "no-go",
|
||||
"evidence_fit": 69.0,
|
||||
"hard_gate": "fail",
|
||||
"channel": "weak",
|
||||
"outcome": "applied",
|
||||
"cohort_id": "evidence-first-2026-01",
|
||||
"job_id": "easycruit-3663291",
|
||||
"url": "https://www.kongsberg.com/careers/vacancies/lead-engineer-devops-and-test-infrastructure/",
|
||||
"fit_override_reason": "User override 2026-10-08 after seeing the hard gate: required 'Experience working with embedded SW and Linux' - Linux Direct, embedded academic-only (ED-1 coursework, none since studies); clearance ('may be required') unresolved; on-site Trondheim with relocation deferred to offer stage by user. Named contact Are B. Willumsen published but deliberately NOT contacted (user decision) - a deliberate cold submit. Document Quality 84; Tier 2 fixes declined.",
|
||||
"rubric_version": "critique-framework-2026-09-11",
|
||||
"next_action": "Wait for Kongsberg response. Screen prep: embedded targets/HIL question, recency of DevOps/test work (2015-22), relocation to Trondheim, clearance eligibility as German citizen resident in Switzerland, on-site expectations. Package: output/Kongsberg_Lead_Engineer_DevOps_Test_Infra/.",
|
||||
"current_summary": "applied",
|
||||
"events": [
|
||||
{
|
||||
"type": "applied",
|
||||
"date": "2026-10-08"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "app-bis-jr100498",
|
||||
"company": "BIS (Bank for International Settlements)",
|
||||
"role": "Senior/Lead Data & Analytics Engineer, MED IT, Basel (jr100498, 3-yr term)",
|
||||
"label": "BIS (Bank for International Settlements) — Senior/Lead Data & Analytics Engineer, MED IT, Basel (jr100498, 3-yr term)",
|
||||
"application_date": "2026-10-15",
|
||||
"fit_class": "core",
|
||||
"evidence_fit": 78.0,
|
||||
"hard_gate": "pass",
|
||||
"channel": "weak",
|
||||
"outcome": "applied",
|
||||
"cohort_id": "evidence-first-2026-01",
|
||||
"job_id": "jr100498",
|
||||
"url": "https://www.bis.org/vacancy/jr100498",
|
||||
"fit_override_reason": null,
|
||||
"rubric_version": "critique-framework-2026-09-11",
|
||||
"next_action": "Await BIS response. If contacted: ask office days and total package; weigh the 3-year fixed term against the permanent Swisscom post. Interview prep is in the critique: SDMX answer, Swisscom dashboard tool (not in KB), attributed schedule example for project planning, Lead story.",
|
||||
"current_summary": "Submitted 2026-10-15 via the BIS portal by the user. Package: Dennis_Thiessen_Resume.pdf + Dennis_Thiessen_Cover_Letter.pdf (dated 15 October 2026) + four portal free-text answers (international/public-sector experience, SDMX/XBRL, data-application example, requirements example); answers saved in output/BIS_Lead_Data_Analytics_MED/portal_answers_bis_jr100498.md. Core 78, hard gate PASS, Document Quality 88, channel Weak (no warm contact recorded before submission).",
|
||||
"events": [
|
||||
{
|
||||
"type": "open",
|
||||
"date": "2026-10-14"
|
||||
},
|
||||
{
|
||||
"type": "note",
|
||||
"date": "2026-10-14",
|
||||
"note": "User selected BIS jr100498 from the 2026-10-14 scout triage. Preparation only; not submitted. KB clarified the same day: no SDMX; junior-developer onboarding/mentoring at Bosch and Swisscom (BS-9, SW-10); Spotfire registered."
|
||||
},
|
||||
{
|
||||
"type": "note",
|
||||
"date": "2026-10-15",
|
||||
"note": "Package finalized 2026-10-15: resume (Document Quality 86, Tier 2 polish applied) + cover letter dated 15 October 2026; submission copies Dennis_Thiessen_Resume.pdf / Dennis_Thiessen_Cover_Letter.pdf in output/BIS_Lead_Data_Analytics_MED/. NOT submitted yet."
|
||||
},
|
||||
{
|
||||
"type": "applied",
|
||||
"date": "2026-10-15",
|
||||
"note": "Submitted 2026-10-15 via the BIS portal by the user. Package: Dennis_Thiessen_Resume.pdf + Dennis_Thiessen_Cover_Letter.pdf (dated 15 October 2026) + four portal free-text answers (international/public-sector experience, SDMX/XBRL, data-application example, requirements example); answers saved in output/BIS_Lead_Data_Analytics_MED/portal_answers_bis_jr100498.md. Core 78, hard gate PASS, Document Quality 88, channel Weak (no warm contact recorded before submission).",
|
||||
"outcome": "applied"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "app-google-staff-shopping-graph-102064172115600070",
|
||||
"company": "Google",
|
||||
"role": "Staff Software Engineer, Shopping Graph (Feeds Infra), Zürich",
|
||||
"label": "Google — Staff Software Engineer, Shopping Graph (Feeds Infra), Zürich",
|
||||
"application_date": "2026-10-21",
|
||||
"fit_class": "stretch",
|
||||
"evidence_fit": 70.0,
|
||||
"hard_gate": "pass",
|
||||
"channel": "weak",
|
||||
"outcome": "applied",
|
||||
"cohort_id": "evidence-first-2026-01",
|
||||
"job_id": "102064172115600070",
|
||||
"url": "https://www.google.com/about/careers/applications/jobs/results/102064172115600070-staff-software-engineer-shopping-graph?location=Switzerland",
|
||||
"fit_override_reason": "Stretch by definition (Staff-level technical leadership only Adjacent); all five minimums met; user chose it as the single Google application 2026-10-21.",
|
||||
"rubric_version": "critique-framework-2026-09-11",
|
||||
"next_action": "Await Google response. Google limit: next Google application window counts this submit (3 per rolling 30 days). At first contact clarify level (L6 vs L5), Zurich hybrid days vs current 3 homeoffice days, and total package. Interview prep: SW-4 prototype story as the technical-direction example, plus one concrete Staff-level example the user names; Java currency; end-to-end system design with scale and trade-offs. Package: output/Google_Staff_SWE_Shopping_Graph/.",
|
||||
"current_summary": "applied",
|
||||
"events": [
|
||||
{
|
||||
"type": "applied",
|
||||
"date": "2026-10-21"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "app-b13ee50001fc",
|
||||
"company": "NVIDIA",
|
||||
"role": "Senior Production Engineer, DGX Cloud, Switzerland Remote (JR2027105)",
|
||||
"label": "NVIDIA — Senior Production Engineer, DGX Cloud, Switzerland Remote (JR2027105)",
|
||||
"application_date": "2026-10-22",
|
||||
"fit_class": "stretch",
|
||||
"evidence_fit": 65.0,
|
||||
"hard_gate": "pass",
|
||||
"channel": "weak",
|
||||
"outcome": "applied",
|
||||
"cohort_id": "evidence-first-2026-01",
|
||||
"job_id": "JR2027105",
|
||||
"url": "https://nvidia.wd5.myworkdayjobs.com/en-US/NVIDIAExternalCareerSite/job/Switzerland-Remote/Senior-Production-Engineer----DGX-Cloud_JR2027105",
|
||||
"fit_override_reason": "Stretch: required SRE line (SLIs, SLOs, error budgets) only Adjacent; hard gate PASS. User chose it 2026-10-22 over the alternatives (remote CH, NVIDIA rating 4.4); prior NVIDIA req JR2024256 pulled, so no stacking.",
|
||||
"rubric_version": "critique-framework-2026-09-11",
|
||||
"next_action": "Await response. Send the LinkedIn note to an NVIDIA recruiter or DGX Cloud engineer (draft in session). Interview prep: incident debugged end to end (SW-2/SW-11); safe model rollout in the fab (BS-1, rollout mechanics not in KB); Kubernetes recency; distributed systems at scale; vLLM/SGLang/Dynamo not used. Package: output/NVIDIA_ProdEng_DGX_Cloud/.",
|
||||
"current_summary": "applied",
|
||||
"events": [
|
||||
{
|
||||
"type": "applied",
|
||||
"date": "2026-10-22"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"targeting_notes": [
|
||||
"SBB Niveau K/L is SBB-specific. The reported approximate CHF 145k K ceiling is not a salary anchor for other employers.",
|
||||
"Assess headroom and total package: working time, holidays, office days, commute and verified benefits. Never decline a Thun-area role on salary band alone.",
|
||||
"Childcare-cost coverage at the Swiss Army/Kdo Cy remains unverified; confirm before pricing it.",
|
||||
"Norway remains open selectively; the Swiss compensation threshold does not automatically apply there.",
|
||||
"An interview does not prove how an ATS or recruiter evaluated the application. No causal inference from a single conversion.",
|
||||
"User clarification 2026-10-06: current baseline is 3 homeoffice days/week. Fewer days are acceptable only for a clear overall improvement over the current role; assess total package and commute early, with no automatic rejection based on office days alone. User expects such improvements mainly at FAANG or comparable employers, without restricting the search to them."
|
||||
]
|
||||
}
|
||||
+646
-44
@@ -146,13 +146,6 @@
|
||||
"note": "TOP CANDIDATE 2026-07-03 run. ISE = MSFT forward-deployed org (ex-CSE): co-engineering with strategic customers. IC4, published base CHF 146.2-245.9k clears bar; German explicitly beneficial; travel up to 25%; AI/LLM reqs are integration-side (RAG, prompt eng, model monitoring) not model-building. Zürich hybrid from Bern. | SENT 2026-07-03 (resume+CL finalized, 85.8/100). REJECTED 2026-08-11, no interview (~39 days after submission). Separate Microsoft req 200043897 (Principal FDE, German-speaking, Zürich) remains open and is unaffected.",
|
||||
"date": "2026-07-03"
|
||||
},
|
||||
"https://jobs.ruag.ch/offene-stellen/senior-devops-engineer-c5i/3b3093ab-badc-4e95-8166-0f6ee32c18d0": {
|
||||
"company": "RUAG (Thun/Bern)",
|
||||
"title": "Senior DevOps Engineer C5I",
|
||||
"decision": "shortlist",
|
||||
"note": "Bern-local WLB-exception tier. English-first (German a plus); Linux/Docker+K8s/Python/GitLab CI/Prometheus-Grafana-ELK = core DevOps lane; analytics-platform ops for Army Cyber Command (C5I, 260p unit, DevSecOps). No citizenship gate in JD (only criminal-record/debt excerpts) but verify clearance as German citizen. Comp likely lateral (market + 13th month) — local tier has relaxed bar. Contact: recruiting-c5i@ruag.ch.",
|
||||
"date": "2026-07-03"
|
||||
},
|
||||
"https://job-boards.greenhouse.io/gitlab/jobs/8522408002": {
|
||||
"company": "GitLab",
|
||||
"title": "Forward Deployed Engineer - Germany (Staff)",
|
||||
@@ -468,13 +461,6 @@
|
||||
"note": "Claude judgment 2026-07-06: trading-desk dealer role; you want platform/data-eng inside trading, not the trading seat",
|
||||
"date": "2026-07-06"
|
||||
},
|
||||
"https://www.bis.org/careers/vacancies/jr100429.htm": {
|
||||
"company": "BIS (Basel)",
|
||||
"title": "Senior Data & Analytics Engineer – Artificial Intelligence",
|
||||
"decision": "applied",
|
||||
"note": "Applied 2026-07-10 (80.5/100 package). Was shortlisted 2026-07-06: core data-eng + spelled-out AI angle; BIS Basel is an explicit international-org lane in your target list",
|
||||
"date": "2026-07-10"
|
||||
},
|
||||
"https://job.bkw.com/offene-stellen/business-controller-energy-mobility-telecom-m-w-d/447ae323-707b-4145-bbbe-91f8d4b32f7b": {
|
||||
"company": "BKW (Bern)",
|
||||
"title": "Business Controller Energy, Mobility & Telecom (m/w/d)",
|
||||
@@ -1140,13 +1126,6 @@
|
||||
"note": "Claude judgment 2026-07-06: GPU networking research specialization",
|
||||
"date": "2026-07-06"
|
||||
},
|
||||
"https://nvidia.wd5.myworkdayjobs.com/job/Switzerland-Zurich/Senior-Software-Developer_JR2008695": {
|
||||
"company": "NVIDIA",
|
||||
"title": "Senior Software Developer",
|
||||
"decision": "maybe",
|
||||
"note": "Claude judgment 2026-07-06: generic title, no domain signal from the title alone - worth a quick JD read",
|
||||
"date": "2026-07-06"
|
||||
},
|
||||
"https://nvidia.wd5.myworkdayjobs.com/job/Switzerland-Zurich/Senior-Software-Developer--AI-Networking_JR2016186": {
|
||||
"company": "NVIDIA",
|
||||
"title": "Senior Software Developer, AI Networking",
|
||||
@@ -1518,13 +1497,6 @@
|
||||
"note": "Claude judgment 2026-07-06: Senior SWE with practical AI/ML experience (not research-depth), local tier",
|
||||
"date": "2026-07-06"
|
||||
},
|
||||
"https://jobs.ruag.ch/offene-stellen/software-engineer-c5i/ec08db9a-3b4f-4aad-8eb5-6134c5e87458": {
|
||||
"company": "RUAG (Thun/Bern)",
|
||||
"title": "Software Engineer C5I m/f/d",
|
||||
"decision": "maybe",
|
||||
"note": "Claude judgment 2026-07-06: same C5I domain as the DevOps req but a non-senior/generic SWE variant",
|
||||
"date": "2026-07-06"
|
||||
},
|
||||
"https://careers.roche.com/global/en/job/202603-108151/Sr-Scientist-Computational-Biology-Neuroscience-Rare-Diseases": {
|
||||
"company": "Roche",
|
||||
"title": "Sr. Scientist - Computational Biology - Neuroscience & Rare Diseases",
|
||||
@@ -1567,13 +1539,6 @@
|
||||
"note": "Claude judgment 2026-07-06: internship",
|
||||
"date": "2026-07-06"
|
||||
},
|
||||
"https://career2.successfactors.eu/sfcareer/jobreqcareer?jobId=1476&locale=en_US&company=Swissgrid": {
|
||||
"company": "Swissgrid (Aarau)",
|
||||
"title": "(Senior) Cloud Security Engineer (80-100%)",
|
||||
"decision": "maybe",
|
||||
"note": "Claude judgment 2026-07-06: cloud is a core skill, security specialization a partial gap, local tier",
|
||||
"date": "2026-07-06"
|
||||
},
|
||||
"https://career2.successfactors.eu/sfcareer/jobreqcareer?jobId=912&locale=de_DE&company=Swissgrid": {
|
||||
"company": "Swissgrid (Aarau)",
|
||||
"title": "Bachelor's- & Master's thesis",
|
||||
@@ -1831,18 +1796,11 @@
|
||||
"note": "REJECTED 2026-09-10, 14 days after the 2026-08-27 submission, no interview. Form letter from Besarta Mehmeti with no diagnostic content. Was Core, Evidence Fit 79, hard gate PASS, Document Quality 92, channel weak. Marcel Matthey-Doret's published line was never called. Kdo Cy had 11 roles open on the portal at submission time, so the ORGANISATION is not closed - only this req. Submitted 2026-08-27. Ref JRQ$540-19848, Zimmerwald. Core, Evidence Fit 79, Document Quality 92, hard gate PASS, channel weak. German 2-page CV plus 1-page motivation letter; the six-year Bundeswehr officer career is included as military-context and motivation evidence. User explicitly accepted the critique's remaining BS-1 wording issue ('ohne manuellen Eingriff') as good enough and submitted without the proposed correction. Honest gaps at submission: physical datacenter work, Pull-GitOps as a named practice, GPGPU, ClickHouse and second Swiss official language. Lohnklasse and Engineer-III level were not recorded as clarified.",
|
||||
"date": "2026-09-10"
|
||||
},
|
||||
"https://jobs.ruag.ch/offene-stellen/senior-devops-kubernetes-engineer-c5i/2eef27f6-9546-499d-8492-c1cec22f548a": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "shortlist",
|
||||
"note": "Rank 1 and the only Core-classifiable target in the log. Re-verified live on the board 2026-09-04. Every required line has canonical evidence: Kubernetes SW-3/SW-7, Linux BS-6/PP-3, GitLab CI-CD SW-5/VZ-1, Ansible BS-6. Only von-Vorteil items missing (VMware/Nutanix/Proxmox, 0 canonical). JD states militärische Karriere als höherer Unteroffizier oder Offizier von Vorteil, so BW-1 scores. Gated on the Frank Haugwitz call (comp, PSP eligibility, whether a second C5I application is welcome while 18027 is pending).",
|
||||
"date": "2026-09-04"
|
||||
},
|
||||
"https://jobs.ruag.ch/offene-stellen/senior-data-engineer-mssql-mit-data-lakehouse-perspektive/96da2356-d9f4-45da-a0ed-caa1acbe8ef9": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "JD read 2026-09-04. Repost of the pulled Data Lakehouse / Senior Data Platform Engineer req with the disqualifier moved into the title. Required: mehrjährige Erfahrung im Aufbau und Betrieb von ON PREMISE Data Warehouse Lösungen, plus MSSQL, Talend, SAP S/4HANA. claims.json has 0 for MSSQL, Talend and SAP; his stack is AWS cloud-native. Settles the 2026-08-31 downgrade.",
|
||||
"note": "JD read 2026-09-04. Repost of the pulled Data Lakehouse / Senior Data Platform Engineer req with the disqualifier moved into the title. Required: mehrjährige Erfahrung im Aufbau und Betrieb von ON PREMISE Data Warehouse Lösungen, plus MSSQL, Talend, SAP S/4HANA. claims.json has 0 for MSSQL, Talend and SAP; his stack is AWS cloud-native. Settles the 2026-08-31 downgrade. *** REASONING CORRECTED 2026-09-11 - THE DECISION STANDS, TWO OF ITS PREMISES DID NOT. *** Reading the primary Arbeitszeugnisse showed: (1) 'MSSQL 0 canonical' was WRONG - Fraunhofer's SCEDAS ran on MICROSOFT SQL SERVER with C# and Entity Framework (Arbeitszeugnis 31.10.2019); (2) 'his stack is AWS cloud-native' was too narrow - the Swisscom Zwischenzeugnis (Okt 2025) documents KOMPONENTENVERANTWORTUNG for the ETL pipelines that load business-critical Fulfillment data into the TERADATA DATA WAREHOUSE (DWH), which is data-warehouse operation, and Teradata is typically on-premise. What genuinely remains 0 is TALEND and SAP S/4HANA, and the required line is 'Aufbau UND Betrieb' - he has documented Betrieb, not Aufbau. The skip is therefore still defensible, but it was better than its written justification. RULE FOR FUTURE DWH POSTINGS: he HAS documented data-warehouse experience (Teradata, as component owner) and MSSQL exposure. Do not repeat 'no DWH' or 'MSSQL 0'. Screen such roles on Aufbau-vs-Betrieb and on the named vendor stack instead.",
|
||||
"date": "2026-09-04"
|
||||
},
|
||||
"https://www.bis.org/vacancy/jr100472": {
|
||||
@@ -1933,7 +1891,7 @@
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "STALE SHORTLIST from 2026-07-06, cleared 2026-09-04. The req was pulled from the board between the 08-31 and 09-04 scrapes and reposted as Senior Data Engineer (MSSQL) mit Data Lakehouse Perspektive. The 07-06 shortlist was a title-match prior; the JD is on-prem MSSQL/Talend/SAP S/4HANA, 0 canonical each. See the successor req's own decision row.",
|
||||
"note": "STALE SHORTLIST from 2026-07-06, cleared 2026-09-04. The req was pulled from the board between the 08-31 and 09-04 scrapes and reposted as Senior Data Engineer (MSSQL) mit Data Lakehouse Perspektive. The 07-06 shortlist was a title-match prior; the JD is on-prem MSSQL/Talend/SAP S/4HANA, 0 canonical each. See the successor req's own decision row. *** REASONING CORRECTED 2026-09-11 - THE DECISION STANDS, TWO OF ITS PREMISES DID NOT. *** Reading the primary Arbeitszeugnisse showed: (1) 'MSSQL 0 canonical' was WRONG - Fraunhofer's SCEDAS ran on MICROSOFT SQL SERVER with C# and Entity Framework (Arbeitszeugnis 31.10.2019); (2) 'his stack is AWS cloud-native' was too narrow - the Swisscom Zwischenzeugnis (Okt 2025) documents KOMPONENTENVERANTWORTUNG for the ETL pipelines that load business-critical Fulfillment data into the TERADATA DATA WAREHOUSE (DWH), which is data-warehouse operation, and Teradata is typically on-premise. What genuinely remains 0 is TALEND and SAP S/4HANA, and the required line is 'Aufbau UND Betrieb' - he has documented Betrieb, not Aufbau. The skip is therefore still defensible, but it was better than its written justification. RULE FOR FUTURE DWH POSTINGS: he HAS documented data-warehouse experience (Teradata, as component owner) and MSSQL exposure. Do not repeat 'no DWH' or 'MSSQL 0'. Screen such roles on Aufbau-vs-Betrieb and on the named vendor stack instead.",
|
||||
"date": "2026-09-04"
|
||||
},
|
||||
"https://nvidia.wd5.myworkdayjobs.com/en-US/NVIDIAExternalCareerSite/job/Switzerland-Zurich/Senior-DevOps-Engineer_JR2024256": {
|
||||
@@ -2418,5 +2376,649 @@
|
||||
"decision": "skip",
|
||||
"note": "USER DECISION 2026-09-10: requires networking knowledge he does not have. Consistent with the standing canonical gap - Netzwerk 0, Firewall 0 - which also ruled out RUAG Principal System Engineering C5I, RUAG System Engineer C5I and failed the NVIDIA Senior DevOps hard gate. Not a JD read by Claude; the user read it and made the call. Deadline was 2026-09-16.",
|
||||
"date": "2026-09-10"
|
||||
},
|
||||
"https://jobs.admin.ch/offene-stellen/ict-system-engineer-devsecops-platform-automation/2924a114-9fa7-4037-afa0-5f0c59eefbc5": {
|
||||
"company": "Schweizer Armee - Kdo Cy",
|
||||
"title": "ICT-System Engineer (DevSecOps / Platform Automation), Bern",
|
||||
"decision": "skip",
|
||||
"note": "USER DECISION 2026-09-11: overqualified. The requirement floor is HF/FH or Techniker HF - no university degree is asked for at all - and he holds an M.Eng. EVIDENCE FOR THE LEVEL READ, from Kdo Cy own postings on the same board: LK 24 roles all require a Hochschul-/Fachhochschul-/Universitaetsabschluss (ICT-Architekt III, Cyber Security Advisor, Portfolio-Manager, Systemingenieur elektronische Operationen), LK 26 requires a Studium at FH/UNI/ETH, and LK 18 roles require an Informatik-EFZ. This posting sits between EFZ and the degree tier, so roughly LK 20-22; its own Lohnklasse field said \"Keine Angabe\". Against ~135k that is very likely a pay cut - EPA Lohntabelle 2026 maxima: LK 20 131,870 / LK 21 137,341 / LK 22 142,832, and those are CEILINGS, not entry salaries. NOT A CAPABILITY REJECTION - the opposite. Technically this was the cleanest fit in the log for a DevOps/platform role: Ansible required (BS-6 intensive, incl. self-written plugins), Kubernetes, CI/CD, IaC, observability with Prometheus/Grafana/ELK (BS-4) - and NO networking line, the gap that killed RUAG Principal System Engineering, RUAG System Engineer C5I and the NVIDIA hard gate. The gaps were vendor substitutions only: RHEL vs Debian, OpenShift vs Kubernetes, AAP vs Ansible. IF A SIMILAR POSTING APPEARS AT A HIGHER LEVEL, TAKE IT SERIOUSLY. Screen jobs.admin.ch roles on the education floor first: it predicts the Lohnklasse better than the title does. Kdo Cy as an organisation is NOT closed - the DevOps Engineer III rejection of 2026-09-10 and this skip are two reqs, not a verdict on the employer. Deadline was 2026-10-14.",
|
||||
"date": "2026-09-11"
|
||||
},
|
||||
"https://www.bis.org/careers/vacancies/jr100429.htm": {
|
||||
"company": "BIS (Basel)",
|
||||
"title": "Senior Data & Analytics Engineer – Artificial Intelligence",
|
||||
"decision": "rejected",
|
||||
"note": "Applied 2026-07-10. Rejection received 2026-09-11, reported by user. No interview recorded; rejection reason not provided. Application closed.",
|
||||
"date": "2026-09-11"
|
||||
},
|
||||
"https://job.bkw.com/offene-stellen/senior-data-engineer-alle/f6eff0f7-01bf-4a5b-b62b-cb2a079992c8": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "USER DECISION 2026-10-03: Do not pursue. User reviewed Glassdoor salary entries and found hardly any above his current salary; considers BKW unlikely to offer a competitive package and chooses Google instead. This is the users assessment from salary entries, not a verified BKW band or formal offer.",
|
||||
"date": "2026-10-03"
|
||||
},
|
||||
"https://www.kongsberg.com/careers/vacancies/lead-engineer-devops-and-test-infrastructure/": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "applied",
|
||||
"note": "SUBMITTED 2026-10-08 via EasyCruit (cold, by user decision - named contact Are B. Willumsen not contacted). Evidence Fit 69, hard gate FAIL (embedded academic-only; clearance unresolved), user override. Document Quality 84. Package: output/Kongsberg_Lead_Engineer_DevOps_Test_Infra/.",
|
||||
"date": "2026-10-08"
|
||||
},
|
||||
"https://www.google.com/about/careers/applications/jobs/results/134588982343148230-senior-forward-deployed-engineer-genai-google-cloud?location=Switzerland": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "TRIAGE 2026-10-08 (JD read): required 5 yrs shipping production AI solutions, RAG/vector-DB pipelines and AI systems on GCP - all Gap (SW-8 is configured LLM assistants; GCP forbidden). Same gap that paused Google FDE GenAI earlier.",
|
||||
"date": "2026-10-08"
|
||||
},
|
||||
"https://www.google.com/about/careers/applications/jobs/results/111514322084995782-staff-forward-deployed-engineer-genai-google-cloud?location=Switzerland": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "TRIAGE 2026-10-08 (JD read): as Senior FDE GenAI but 8 yrs shipping production AI solutions; RAG/vector DB and GCP AI systems required - Gap.",
|
||||
"date": "2026-10-08"
|
||||
},
|
||||
"https://www.google.com/about/careers/applications/jobs/results/139113133389030086-senior-staff-forward-deployed-engineer-genai-google-cloud?location=Switzerland": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "TRIAGE 2026-10-08 (JD read): production AI solutions on GCP and RAG/vector-DB pipelines required - Gap; Senior Staff level.",
|
||||
"date": "2026-10-08"
|
||||
},
|
||||
"https://www.google.com/about/careers/applications/jobs/results/106113082882695878-forward-deployed-engineer-iii-applied-ai?location=Switzerland": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "TRIAGE 2026-10-08 (JD read): required 2 yrs GenAI techniques and 'developing and deploying multilingual NLP models' - Gap (FC-2 ARTUS was a contribution, no model ownership).",
|
||||
"date": "2026-10-08"
|
||||
},
|
||||
"https://www.google.com/about/careers/applications/jobs/results/81427103366423238-staff-software-engineer-generative-ai-commerce?location=Switzerland": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "TRIAGE 2026-10-08 (JD read): required 5 yrs leading ML design/ML infrastructure and agentic tool-calling systems - Gap.",
|
||||
"date": "2026-10-08"
|
||||
},
|
||||
"https://jobs.ashbyhq.com/kraken.com/7d6a3e1a-79ef-4bd5-a759-7bd6f9628e9e": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "TRIAGE 2026-10-08 (JD read): required enterprise SaaS administration at 1,000+ seats plus Okta/SCIM/SSO identity work - user-confirmed NOT performed 2026-09-18 (claims.json: enterprise SaaS/SSO administration forbidden).",
|
||||
"date": "2026-10-08"
|
||||
},
|
||||
"https://jobs.postfinance.ch/PostFinance/job/DevOps-Engineer-%28wmd%29/74805-de_DE": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "TRIAGE 2026-10-08 (JD read): Zofingen (not Bern) / homeoffice, CHF 130-145k = lateral vs current ~135k in band to 160k; required GitOps with ArgoCD and IaC with Kustomize/Helm/Terraform - GitOps and Terraform are forbidden/unverified.",
|
||||
"date": "2026-10-08"
|
||||
},
|
||||
"https://jobs.admin.ch/offene-stellen/ict-system-engineer-senior-devsecops-gis/f39c122b-cefb-4ce4-a008-991cf75dc70f": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "TRIAGE 2026-10-08 (JD read): required practical ArcGIS (user-confirmed never used), Red Hat OpenShift and RHEL (0 canonical), and a second official language (FR/IT) - he has DE+EN only. Ref JRQ$540-20505.",
|
||||
"date": "2026-10-08"
|
||||
},
|
||||
"https://jobs.admin.ch/offene-stellen/devops-engineer-iii-data-platform/0ba9d9e3-dc66-478b-a7ca-deca45f50083": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "rejected",
|
||||
"note": "Same requisition JRQ$540-19848 he applied to and was rejected without interview (see applications.json); this URL is a repost UUID. NOTE 2026-10-08: posting requires 'Aktive Kenntnisse einer zweiten Amtssprache' - plausible, unproven factor in the rejection.",
|
||||
"date": "2026-10-08"
|
||||
},
|
||||
"https://www.google.com/about/careers/applications/jobs/results/110222556983632582-software-engineer-iii-site-reliability-engineering-prod-ai?location=Switzerland": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "maybe",
|
||||
"note": "TRIAGE 2026-10-08 (JD read), NOT a user decision. Google SWE III SRE, Prod AI, Zurich (Mid). Min quals: degree + 2 yrs software dev - Direct. Preferred 2 yrs designing/troubleshooting large-scale distributed systems - Adjacent. SRE ops evidence strong (SW-2 on-call, BS-6 Linux/Ansible, BS-1 24/7 ML inference). User accepts mid FAANG (memory). Practical: Thun-Zurich ~1h50 - FAANG comp is his named exception. Google 3-per-30-days: no Google submit since 2026-07-27.",
|
||||
"date": "2026-10-08"
|
||||
},
|
||||
"https://www.google.com/about/careers/applications/jobs/results/86715874555110086-senior-software-engineer-site-reliability-engineering?location=Switzerland": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "maybe",
|
||||
"note": "TRIAGE 2026-10-08 (JD read), NOT a user decision. Google Senior SWE SRE (Technical Infrastructure), Zurich. Min quals: 5 yrs software dev Direct; 3 yrs designing/troubleshooting large-scale distributed systems Adjacent; 2 yrs leading projects/technical leadership Adjacent (Component Owner SW-2, Application Owner BS-3, BDD introduction GN-1). Level-matched alternative to the SRE III Prod AI req.",
|
||||
"date": "2026-10-08"
|
||||
},
|
||||
"https://jobs.admin.ch/offene-stellen/devsecops-ict-ingenieur-in-professional/9db3251b-9f5c-4836-914e-388112908b93\r": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "TRIAGE 2026-10-08 (JD read): requires active second official language (DE+EN only); Payerne/Meiringen. Ref JRQ$540-20434.",
|
||||
"date": "2026-10-08"
|
||||
},
|
||||
"https://jobs.admin.ch/offene-stellen/ict-system-ingenieur-in-senior-backend-services-communication-services/05e1d041-cd48-43f0-bf22-87670490836e\r": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "TRIAGE 2026-10-08 (JD read): no language line, but required OpenShift (0), broad security-services depth (COMSEC/TRANSEC key management, PKI, IAM/PAM) and ServiceNow ITSM operation, plus leading external DevSecOps engineers - security-services core is a Gap. Ref JRQ$540-20501.",
|
||||
"date": "2026-10-08"
|
||||
},
|
||||
"https://jobs.admin.ch/offene-stellen/devsecops-ict-ingenieur-in-junior/bcab683d-4647-488b-badb-57f92e835ce6\r": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "TRIAGE 2026-10-08 (JD read): junior level; requires active second official language. Ref JRQ$540-20435.",
|
||||
"date": "2026-10-08"
|
||||
},
|
||||
"https://jobs.admin.ch/offene-stellen/ict-test-manager-in-senior/d98cd6a4-bd19-4135-84cf-bb1195378440\r": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "TRIAGE 2026-10-08 (JD read): requires 'Gute aktive Kenntnisse mindestens einer zweiten Amtssprache' - he has DE+EN only (see memory project_federal_second_language_gate). Ref JRQ$540-20616.",
|
||||
"date": "2026-10-08"
|
||||
},
|
||||
"https://jobs.ruag.ch/offene-stellen/senior-data-scientist-c5i/c7a39d90-1a8d-4b69-929b-cbd304b94373": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "TRIAGE 2026-10-08 on TITLE/FAMILY, JD NOT read: data-scientist = model-building, off-thesis per user_positioning; RUAG AI Engineer C5I was rejected after interview 2026. Re-open only if the user asks.",
|
||||
"date": "2026-10-08"
|
||||
},
|
||||
"https://www.amazon.jobs/en/jobs/10570651/sr-software-engineer-devops-rivr": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "maybe",
|
||||
"note": "TRIAGE 2026-10-08 (JD read), NOT a user decision. AWS/Amazon RIVR (delivery robots) mid-level DevOps, Zurich. Direct: CI/CD (Jenkins, GitLab), Docker/Kubernetes, Git, degree, 3+ yrs DevOps-related. REQUIRED 'C++ build tools (CMake)' - unknown, ask user. Preferred robotics (ED-1 coursework only), Terraform (forbidden), ROS2 (0). PRACTICAL, UNVERIFIED: check Amazon's office-attendance policy for this team before any effort - Thun-Zurich ~1h50 each way.",
|
||||
"date": "2026-10-08"
|
||||
},
|
||||
"https://jobs.ashbyhq.com/snowflake/1a751b80-26d5-4305-81ff-04ed9136f195": {
|
||||
"company": "Snowflake",
|
||||
"title": "Senior Software Engineer, Enterprise, CH-Zurich-Observe",
|
||||
"decision": "maybe",
|
||||
"note": "Claude judgment 2026-10-14, JD read (reports/2026-10-14-fit-sources/snowflake_sr_swe_enterprise.txt). TITLE/BODY MISMATCH: listed as 'Senior Software Engineer, Enterprise' but the body hires a 'Senior Software Engineer, Engineering Productivity' (CI/CD, build systems, test infra, release automation, AI agent dev workflows). NOT the applied req 3eea87fa (closed no response 2026-08-25). Required: 'Proven experience building and maintaining CI/CD systems, build orchestration tools (e.g., Bazel, Nix, Go build tooling), and test automation infrastructure' - partial: Jenkins/GitLab CI/CD (GN-1, FC-1, BS-6), test suites as CI quality gates (VZ-2), unit testing (SW-9); Bazel/Nix/Go absent; SW-3 GitLab is 'used, not built'; DevOps/test focus is 2015-2022, not current. Stretch. Kongsberg DevOps/Test package is the reusable base. Per the closed Snowflake record: route through a recruiter, not another cold submit.",
|
||||
"date": "2026-10-14"
|
||||
},
|
||||
"https://www.google.com/about/careers/applications/jobs/results/79730131723002566-software-engineer-iii-shopping-graph-feeds-infrastructure?location=Switzerland": {
|
||||
"company": "Google",
|
||||
"title": "Software Engineer III, Shopping Graph Feeds Infrastructure, Zürich, Switzerland",
|
||||
"decision": "maybe",
|
||||
"note": "Claude judgment 2026-10-14, JD read (reports/2026-10-14-fit-sources/google_shopping_graph_feeds.txt). Mid level (SWE III), Zurich. Feeds infrastructure + Shopping Graph data quality - data-engineering shaped. Minimums: 2y Java or C++ (Java allowed-with-context), 2y using AI tools for efficiency (SW-8 Copilot/Kiro). Level-down vs current scope; compensation unpublished. Belongs with the open Google choice (Shopping Ads SWE III; Commerce full-stack held) and the 2026-10-08 Google maybes - Google caps at 3 applications per rolling 30 days, so pick among them. No Google application in the last 30 days.",
|
||||
"date": "2026-10-14"
|
||||
},
|
||||
"https://www.metacareers.com/profile/job_details/1277398403727586": {
|
||||
"company": "Meta",
|
||||
"title": "Software Engineer, Infrastructure, Zurich, Switzerland",
|
||||
"decision": "maybe",
|
||||
"note": "Claude judgment 2026-10-14, JD read (reports/2026-10-14-fit-sources/meta_swe_infra.txt). Generic evergreen Meta req (Zurich +1). Minimums are broad: driving change and leading complex technical projects, programming, data-driven analysis. Preferred: large-scale infrastructure applications, C/C++/Java, Python. Low specificity means a referral matters more than the document; interview loop is coding-heavy. Low priority.",
|
||||
"date": "2026-10-14"
|
||||
},
|
||||
"https://roche.wd3.myworkdayjobs.com/roche-ext/job/Basel/AI-Engineer_202610-125889-1/apply": {
|
||||
"company": "Roche",
|
||||
"title": "AI Engineer, Basel, Basel-City, Switzerland",
|
||||
"decision": "skip",
|
||||
"note": "Claude judgment 2026-10-14, JD read (reports/2026-10-14-fit-sources/roche_ai_engineer.txt). Required: 'Hands-on experience with modern agent frameworks and harnesses such as DeepAgents, LangGraph, LangChain, or equivalent technologies' - LangChain/LangGraph are forbidden (never used) and SW-8 forbids agent orchestration and formal LLM evaluation, which the role centres on (eval harnesses, RAG, agent lifecycle). KEEP IN MIND: 'industrial, manufacturing ... regulated environments strongly preferred' matches the Bosch 24/7 fab (BS-1/BS-2) - a less agent-heavy Roche PT role would be worth a read. Deadline 2026-10-30, no relocation support.",
|
||||
"date": "2026-10-14"
|
||||
},
|
||||
"https://telenornorway.teamtailor.com/jobs/8529988-lead-platform-engineer": {
|
||||
"company": "Telenor Norge",
|
||||
"title": "Lead Platform Engineer, Fornebu, Norway | Trondheim, Norway",
|
||||
"decision": "skip",
|
||||
"note": "Claude judgment 2026-10-14, JD read (reports/2026-10-14-fit-sources/telenor_lead_platform.txt). Fails THIS req's gates, not the Norway lane: 'Du maa kunne kommunisere godt, baade skriftlig og muntlig, paa norsk og engelsk' (he is A2) and 'Stillingen krever sikkerhetsklarering' by Norwegian authorities. Also GitOps/Argo CD/Terraform/Go stack (GitOps and Terraform forbidden) and mobile-core telecom domain. Fornebu (Oslo) or Trondheim. Contact Torgeir Haukvik published; deadline 2026-10-26.",
|
||||
"date": "2026-10-14"
|
||||
},
|
||||
"https://careers.axpo.com/jobs/8542224-data-lead-grid-w-m-d": {
|
||||
"company": "Axpo",
|
||||
"title": "Data Lead Grid (w/m/d), Baden, Switzerland",
|
||||
"decision": "skip",
|
||||
"note": "Claude judgment 2026-10-14, JD read (reports/2026-10-14-fit-sources/axpo_data_lead_grid.txt). No hard-gate failure (Python/PySpark/SQL, 5y data, project lead all met; PowerBI/Databricks are 'z. B.'). Skipped on the recorded user rule: Baden from Thun (~90 min) needs BIS tax-free or FAANG money, and this is a divisional data-steward/community role (Grid, not trading), lateral at best. Reopen if the user wants the energy domain regardless.",
|
||||
"date": "2026-10-14"
|
||||
},
|
||||
"https://career2.successfactors.eu/sfcareer/jobreqcareer?jobId=1653&locale=de_DE&company=Swissgrid": {
|
||||
"company": "Swissgrid (Aarau)",
|
||||
"title": "Senior ICT Architect (80-100%), Aarau Switzerland",
|
||||
"decision": "skip",
|
||||
"note": "Claude judgment 2026-10-14, JD read (reports/2026-10-14-fit-sources/swissgrid_ict_architect.txt). Architecture GOVERNANCE for BU Market (domain architectures, target pictures, roadmaps, EA alignment), the authoring-vs-building shape of BIS jr100472 and Aker BP. Required: 'Mehrjaehrige Berufserfahrung in der Planung, Entwicklung und im Bau von bereichsuebergreifenden IT-Architekturen' - his titles are Component/Application Owner. Aarau, 42h week.",
|
||||
"date": "2026-10-14"
|
||||
},
|
||||
"https://jobs.ruag.ch/offene-stellen/ict-architect-consulting/b0939b54-0bfc-4d2d-83f6-8e46f85dd045": {
|
||||
"company": "RUAG (Thun/Bern)",
|
||||
"title": "ICT Architect Consulting m/f/d, Switzerland",
|
||||
"decision": "skip",
|
||||
"note": "Claude judgment 2026-10-14, JD read (reports/2026-10-14-fit-sources/ruag_ict_architect_consulting.txt). Consulting architecture modelling. Required: 'Praxiserprobte Anwendung von ArchiMate sowie Erfahrung mit BPMN oder UML sowie Kenntnisse in Architektur-Frameworks (z. B. TOGAF, arc42)' - ArchiMate/TOGAF not in claims.json. Documents and workshops, not building.",
|
||||
"date": "2026-10-14"
|
||||
},
|
||||
"https://jobs.ruag.ch/offene-stellen/data-scientist-sensors/eb4da0ef-56d9-4f08-804d-916a2afe0a8a": {
|
||||
"company": "RUAG (Thun/Bern)",
|
||||
"title": "Data Scientist Sensors m/f/d, Switzerland",
|
||||
"decision": "skip",
|
||||
"note": "Claude judgment 2026-10-14, JD read (reports/2026-10-14-fit-sources/ruag_data_scientist_sensors.txt). Radar signal-processing data science. Required: 'Experte fuer mathematisches und numerisches Modellieren komplexer, dynamischer Systeme' and 'Praktische Kenntnisse von Machine-Learning-Frameworks (TensorFlow, PyTorch)' - both certification-context-only; thesis is a methods prototype. Air-gapped environment implies onsite-heavy work, the home-office issue that ended RUAG AI Engineer C5I.",
|
||||
"date": "2026-10-14"
|
||||
},
|
||||
"https://jobs.smartrecruiters.com/CERN/744000155189459": {
|
||||
"company": "CERN (Geneva)",
|
||||
"title": "Distributed Storage Engineer (IT-SD-GSS-2026-96-LD), Geneva, GENEVA, Switzerland CH Hybrid",
|
||||
"decision": "skip",
|
||||
"note": "Claude judgment 2026-10-14, JD read (reports/2026-10-14-fit-sources/cern_distributed_storage.txt). Required: 'Demonstrated experience in C++ software development of distributed storage systems' (Ceph). C++ is allowed-with-context only and must not be oversold. Geneva.",
|
||||
"date": "2026-10-14"
|
||||
},
|
||||
"https://jobs.smartrecruiters.com/CERN/744000155419365": {
|
||||
"company": "CERN (Geneva)",
|
||||
"title": "Software and Infrastructure Engineer (IT-CA-OSI-2026-213-GRAE), Geneva, GENEVA, Switzerland CH Hybrid",
|
||||
"decision": "skip",
|
||||
"note": "Claude judgment 2026-10-14, JD read (reports/2026-10-14-fit-sources/cern_sw_infra.txt). Ineligible: graduate programme, 'maximum of two years of professional experience since graduation'. PHP/Laravel/OJS.",
|
||||
"date": "2026-10-14"
|
||||
},
|
||||
"https://jobs.smartrecruiters.com/CERN/744000155462920": {
|
||||
"company": "CERN (Geneva)",
|
||||
"title": "Software Engineer (IT-CA-CET-2026-210-LD), Geneva, GENEVA, Switzerland CH Hybrid",
|
||||
"decision": "skip",
|
||||
"note": "Claude judgment 2026-10-14, JD read (reports/2026-10-14-fit-sources/cern_sw_eng_cet.txt). Deputy service manager for CERN email (AD/Entra ID/Exchange Online, M365 groups). Domain is email/identity/groupware; Geneva needs relocation, which is not on the table yet.",
|
||||
"date": "2026-10-14"
|
||||
},
|
||||
"https://www.google.com/about/careers/applications/jobs/results/142200254949663430-senior-software-engineer-search-ads-in-ai-experiences?location=Switzerland": {
|
||||
"company": "Google",
|
||||
"title": "Senior Software Engineer, Search Ads in AI Experiences, Zürich, Switzerland",
|
||||
"decision": "skip",
|
||||
"note": "Claude judgment 2026-10-14, JD read (reports/2026-10-14-fit-sources/google_search_ads_ai.txt). Required: '5 years of experience with software development in C++ and Python' and '3 years of experience with ... deep learning, reinforcement learning, generative AI' plus model training. Core-ML role; positioning is platform/infra, not model-building.",
|
||||
"date": "2026-10-14"
|
||||
},
|
||||
"https://www.google.com/about/careers/applications/jobs/results/82521418083771078-staff-data-scientist?location=Switzerland": {
|
||||
"company": "Google",
|
||||
"title": "Staff Data Scientist, Zürich, Switzerland",
|
||||
"decision": "skip",
|
||||
"note": "Claude judgment 2026-10-14, JD read (reports/2026-10-14-fit-sources/google_staff_ds.txt). Ads Metrics statistical DS: experiment design, causal inference, hierarchical models. Not his positioning (data/platform engineer).",
|
||||
"date": "2026-10-14"
|
||||
},
|
||||
"https://jobs.ashbyhq.com/snowflake/a3a54f6d-2fb6-4962-8001-0732b890a859": {
|
||||
"company": "Snowflake",
|
||||
"title": "Software Engineer Observe Team, CH-Zurich-Observe",
|
||||
"decision": "skip",
|
||||
"note": "Claude judgment 2026-10-14, JD read (reports/2026-10-14-fit-sources/snowflake_swe_observe.txt). Body is the Enterprise backend role at '2 - 5 years of professional software engineering experience' - below his level. The senior sibling 1a751b80 is actually Engineering Productivity (logged maybe).",
|
||||
"date": "2026-10-14"
|
||||
},
|
||||
"https://www.amazon.jobs/en/jobs/10575544/senior-database-specialist-solutions-architect-germany-ags-specialist-team-emea-central": {
|
||||
"company": "Amazon / AWS",
|
||||
"title": "Senior Database Specialist Solutions Architect, Germany, AGS Specialist Team EMEA Central, Zurich, Zurich, CHE",
|
||||
"decision": "skip",
|
||||
"note": "Claude judgment 2026-10-14, JD read (reports/2026-10-14-fit-sources/aws_db_specialist_sa.txt). Pre-sales DB specialist SA. Required: 'Experience in Database Administration and strong troubleshooting skills (tuning and optimization, deadlocks, schema design)' - DBA is not established (Oracle/MSSQL use is developer/analyst side; BS-8 tuning is query performance). Same reason BIS jr100420 was not pursued. Reopen only if the user confirms real DBA work.",
|
||||
"date": "2026-10-14"
|
||||
},
|
||||
"https://jobs.postfinance.ch/PostFinance/job/Solution-Team-Lead-Customer-Order-Process-Automation-%28wmd%29/74923-de_DE": {
|
||||
"company": "PostFinance (Bern)",
|
||||
"title": "Solution Team Lead Customer Order Process Automation (w/m/d), 80–100% in Bern / Homeoffice",
|
||||
"decision": "skip",
|
||||
"note": "Claude judgment 2026-10-14, JD read (reports/2026-10-14-fit-sources/postfinance_order_automation_lead.txt). Line manager of a ~100-person Solution Team. Required: 'Mehrjaehrige Erfahrung in einer Fuehrungsposition, beispielsweise als Linien-Fuehrungsperson' - not his profile.",
|
||||
"date": "2026-10-14"
|
||||
},
|
||||
"https://www.bis.org/vacancy/jr100491": {
|
||||
"company": "BIS (Basel)",
|
||||
"title": "Data Scientist / Research Analyst, Basel, Switzerland",
|
||||
"decision": "skip",
|
||||
"note": "Claude judgment 2026-10-14, JD read (reports/2026-10-14-fit-sources/bis_data_scientist_research.txt). Hong Kong (BIS Asia office), research support for economists - NOT Basel. SCOUT DEFECT: the BIS RSS adapter stamps default_location 'Basel, Switzerland' on every BIS vacancy, so non-Basel BIS posts pass the location filter.",
|
||||
"date": "2026-10-14"
|
||||
},
|
||||
"https://www.bis.org/vacancy/jr100498": {
|
||||
"company": "BIS (Basel)",
|
||||
"title": "Senior/Lead Data & Analytics Engineer, Basel, Switzerland",
|
||||
"decision": "applied",
|
||||
"note": "Submitted 2026-10-15 by the user via the BIS portal (tracker app-bis-jr100498; package output/BIS_Lead_Data_Analytics_MED/). Core 78, hard gate PASS, Document Quality 88, channel Weak. MED IT, a different unit from the rejected jr100429. Deadline was 2026-11-02.",
|
||||
"date": "2026-10-15"
|
||||
},
|
||||
"https://www.google.com/about/careers/applications/jobs/results/111782570709918406-senior-software-engineer-site-reliability-engineering-youtube-ml?location=Switzerland": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "maybe",
|
||||
"note": "TRIAGE 2026-10-20 (JD read, reports/2026-10-20-fit-sources/google_sre_youtube_ml.txt), NOT a user decision. Google Senior SWE, SRE, YouTube ML (MSCA org), Zurich. Min quals identical to the 10-08 Senior SRE (Technical Infrastructure) req: 5 yrs software dev - Direct; 3 yrs designing/analyzing/troubleshooting large-scale distributed systems - Adjacent; 2 yrs leading projects/technical leadership - Adjacent (Component Owner SW-2, Application Owner BS-3). ML-serving SRE sits closer to his AI-platform positioning than the TI req; BS-1 (containerized ML inference in a 24/7 fab) is the bridge. Apply to ONE of the two Senior SRE reqs, not both. Google 3-per-30-days: no Google submit since 2026-07-27.",
|
||||
"date": "2026-10-20"
|
||||
},
|
||||
"https://roche.wd3.myworkdayjobs.com/roche-ext/job/Basel/Senior-Engineer---Machine-Learning---AI-Enablement_202610-125361-1/apply": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "Claude triage 2026-10-20, JD read (reports/2026-10-20-fit-sources/roche_ml_ai_enablement.txt). Core duty: 'Lead technical design, architecture, and hands-on implementation of agentic AI solutions' - SW-8 forbids claiming agent orchestration. Required breadth line: 'from GPU optimization and model performance to backend systems and cloud-native architecture (e.g., Kubernetes, AWS) with solid knowledge of statistics and ML theory' - backend/AWS/K8s Direct, GPU/model performance Gap, ML theory certification-level only. Stretch at best; user may override. Not the regulated-manufacturing Roche role the 10-14 note hoped for.",
|
||||
"date": "2026-10-20"
|
||||
},
|
||||
"https://roche.wd3.myworkdayjobs.com/roche-ext/job/Basel/Senior--AI-Engineer----Imaging-_202610-126099-2/apply": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "Claude triage 2026-10-20, JD read (reports/2026-10-20-fit-sources/roche_ai_engineer_imaging.txt). Required: 'Deep expertise in computer vision algorithms (e.g., CNNs, Vision Transformers, UNet, SAM/Segment Anything, Cellpose)' and 'Expert knowledge of machine learning theory, image processing fundamentals' on microscopy/pathology imaging. CV model-building; BS-1 establishes inference integration, not model development.",
|
||||
"date": "2026-10-20"
|
||||
},
|
||||
"https://roche.wd3.myworkdayjobs.com/roche-ext/job/Basel/Sr-Scientist---Computational---Applied-AI_202610-125552-1/apply": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "Claude triage 2026-10-20, JD read (reports/2026-10-20-fit-sources/roche_sr_scientist_applied_ai.txt). Drug-discovery scientist: '3+ years ... of post-doctoral or biopharmaceutical industry experience delivering applied AI and data science solutions in a drug-discovery setting'; causal inference, GNNs, biological foundation models. Not his lane.",
|
||||
"date": "2026-10-20"
|
||||
},
|
||||
"https://roche.wd3.myworkdayjobs.com/roche-ext/job/Kaiseraugst/Data---AI-Excellence-Lead---RDT-Data-Management---Governance_202610-126529/apply": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "Claude triage 2026-10-20, JD read (reports/2026-10-20-fit-sources/roche_data_ai_excellence_lead.txt). '10+ years of direct experience leading data and/or AI culture, change management, governance, or digital transformation' - an organizational-change and policy-adoption role, not engineering. Data-mesh/data-product vocabulary matches SW-7, the job does not. Kaiseraugst, no relocation.",
|
||||
"date": "2026-10-20"
|
||||
},
|
||||
"https://jobs.sbb.ch/v2/offene-stellen/data-engineer-m-w-d/5eb1bd60-9853-4ae5-b801-c178de4823c2": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "Claude triage 2026-10-20, JD read (reports/2026-10-20-fit-sources/sbb_data_engineer.txt). Applies the USER's SBB rule. Job ID 104409, Team Ampere, Digital Solution Energie (generation, Energiehandel, rail grid supply) on the Snowflake-based EAP - the energy-trading domain is the draw. But: 'Diese Stelle befindet sich im Anforderungsniveau J' - below Niveau K, which the user ruled too low on 2026-09-11 (withdrawal from Job 103755: aim at L and/or Kader). Required 'Python, Java und TypeScript sowie den dazugehoerigen Frameworks (dbt, Spring Boot, Angular)' - TypeScript forbidden; Snowflake and ArcGIS/FME (nice-to-have) forbidden. Named contact: Nisanthan Ratnasingam (personelle Fuehrung).",
|
||||
"date": "2026-10-20"
|
||||
},
|
||||
"https://jobs.admin.ch/offene-stellen/ict-system-engineer-senior-application-mcx-platform/b146f208-dfad-4a85-b76f-bee88b33aacb": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "Claude triage 2026-10-20, JD read (reports/2026-10-20-fit-sources/kdocy_sys_eng_app_mcx_platform.txt). Gate: 'Gute aktive Kenntnisse einer zweiten Amtssprache' - DE+EN only. Also 'Fundierte Erfahrung mit Kommunikations- und Kollaborationsplattformen sowie mit Real-Time-Communication- und Telco-Architekturen' - Gap (Swisscom work is data, not telco architecture). LK 23, Bern, Pikett, deadline 2026-11-19.",
|
||||
"date": "2026-10-20"
|
||||
},
|
||||
"https://jobs.admin.ch/offene-stellen/product-owner-senior/c2dd357c-7f11-4139-b80e-5d8319b787f5": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "Claude triage 2026-10-20, JD read (reports/2026-10-20-fit-sources/kdocy_product_owner_senior.txt). Gate: 'Gute Kenntnisse mindestens einer zweiten Amtssprache'. Also 'Mehrjaehrige Erfahrung als Product Owner sowie in der Leitung komplexer ICT- und Telekommunikationsvorhaben' and Mobilfunk/Festnetz/Netzwerktechnik - Gap. LK 23.",
|
||||
"date": "2026-10-20"
|
||||
},
|
||||
"https://jobs.admin.ch/offene-stellen/ict-system-engineer-senior-network-transport/f40ed236-f5b8-41e4-8b29-ef1c2fa1e000": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "Claude triage 2026-10-20, JD read (reports/2026-10-20-fit-sources/kdocy_sys_eng_network.txt). Gate: 'Gute aktive Kenntnisse einer zweiten Amtssprache'. Also 'Sehr gute Kenntnisse von IP- und Layer-3-Architekturen, Routing, Segment Routing, VPN, QoS' - network engineering, Gap. LK 23.",
|
||||
"date": "2026-10-20"
|
||||
},
|
||||
"https://jobs.admin.ch/offene-stellen/ict-system-engineer-senior-device-user-environment/edcf3381-ed33-4463-a9b0-560e1239d0e6": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "Claude triage 2026-10-20, JD read (reports/2026-10-20-fit-sources/kdocy_sys_eng_device_user_env.txt). Gate: 'Gute aktive Kenntnisse einer zweiten Amtssprache'. Also 'Fundierte Kenntnisse im Mobile Device Management und Unified Endpoint Management sowie in Android Enterprise, iOS/iPadOS' - Gap. LK 23.",
|
||||
"date": "2026-10-20"
|
||||
},
|
||||
"https://www.bis.org/vacancy/jr100471": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "Claude triage 2026-10-20, JD read (reports/2026-10-20-fit-sources/bis_infra_architect.txt). Required: 'Demonstrated expertise in designing and architecting hybrid infrastructure environments across on-premises data centers, private and public cloud, including compute, virtualization, containers, networks, storage and platforms' - Gap (PP-3 is explicitly not datacenter evidence); OpenShift Gap. Architecture-governance role (policies, design authority), same shape as the Swissgrid ICT Architect skip. jr100498 is pending at BIS: no second cold application to the same org. Deadline 2026-11-05.",
|
||||
"date": "2026-10-20"
|
||||
},
|
||||
"https://jobs.careers.microsoft.com/global/en/job/200060867": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "Claude triage 2026-10-20, JD read via https://apply.careers.microsoft.com/careers/job/1970393557027202 (reports/2026-10-20-fit-sources/ms_senior_csa.txt) - the report URL redirects to a generic search page. Partner-facing Data & AI pre-sales (Cloud & AI Partner Architects DACH), measured on Azure consumption. Required: 'Proven experience in technical consulting, solution architecture, or technical pre-sales' - Gap; preferred Fabric/Foundry/Azure - Azure forbidden; '10+ years of experience in customer-facing or partner-facing technical roles' - Gap. IC5, CH base CHF 154.0-300.2k. Principal FDE 200043897 is still pending: no stacking.",
|
||||
"date": "2026-10-20"
|
||||
},
|
||||
"https://job-boards.greenhouse.io/gitlab/jobs/8860196002": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "Claude triage 2026-10-20, JD read (reports/2026-10-20-fit-sources/gitlab_staff_sa_ai.txt). Location gate: 'Remote, France; Remote, Germany; Remote, Netherlands; Remote, Spain; Remote, United Kingdom' - CH not listed (scout passed it on 'EMEA'). Also a pre-sales SME measured on 'technical win rate and bookings'; 'Substantial experience in technical pre-sales' - Gap.",
|
||||
"date": "2026-10-20"
|
||||
},
|
||||
"https://www.amazon.jobs/en/jobs/10578467/senior-delivery-consultant-ai-ml-specialist-telecommunications-aws-professional-services": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "Claude triage 2026-10-20, JD read (reports/2026-10-20-fit-sources/aws_proserve_aiml_telco.txt). Basic quals: '3+ years of customer-facing work, engaging with customer executives, technologists or partners' - Gap (internal enterprise roles only); '5+ years of machine learning, statistical modeling, data mining, and analytics techniques experience' - ML Gap, analytics Adjacent. ProServe executive-advisory role.",
|
||||
"date": "2026-10-20"
|
||||
},
|
||||
"https://jobs.smartrecruiters.com/CERN/744000155986767": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "Claude triage 2026-10-20, JD read (reports/2026-10-20-fit-sources/cern_fullstack_java.txt). Graduate programme: 'a maximum of two years of professional experience since graduation' - ineligible. Fully onsite, Geneva.",
|
||||
"date": "2026-10-20"
|
||||
},
|
||||
"https://www.google.com/about/careers/applications/jobs/results/108203660361507526-software-engineer-iii-youtube-trust-and-safety-automation?location=Switzerland": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "Claude triage 2026-10-20, JD read (reports/2026-10-20-fit-sources/google_swe3_yt_tns.txt). 'Build classifiers for YouTube videos and livestreams using various modalities' - multimodal ML model-building, outside positioning; '1 year of experience with end-to-end Machine Learning' only partly via BS-1. Mid level; a Google slot is better spent on the SRE / Shopping Graph set.",
|
||||
"date": "2026-10-20"
|
||||
},
|
||||
"https://www.google.com/about/careers/applications/jobs/results/97084041571771078-infotasks-productivity-agents-deepmind?location=Switzerland": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "Claude triage 2026-10-20, JD read (reports/2026-10-20-fit-sources/google_deepmind_infotasks.txt). DeepMind agent research engineering: 'Build and optimize multi-agent hierarchical pipelines', automated evaluation raters, training environments; preferred 'training GenAI models'. SW-8 forbids agent orchestration and formal LLM evaluation; top-lab model work is outside positioning.",
|
||||
"date": "2026-10-20"
|
||||
},
|
||||
"https://careers.axpo.com/jobs/8566126-ai-adoption-specialist-f-m-d": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "Claude triage 2026-10-20, JD read (reports/2026-10-20-fit-sources/axpo_ai_adoption.txt). L&D / change-management role: '2-4 years of experience in technology enablement, digital adoption, technical training, learning & development or change management' - not engineering, level-down. Baden commute rule (user 2026-08-27).",
|
||||
"date": "2026-10-20"
|
||||
},
|
||||
"https://jobs.ruag.ch/offene-stellen/ict-application-manager/8c4dd1c6-75a9-4ae5-96d0-32ac614faa50": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "Claude triage 2026-10-20, JD read (reports/2026-10-20-fit-sources/ruag_ict_app_manager.txt). Key-user application management (accounts, licences, incidents); 'Abgeschlossene Berufslehre, vorzugsweise in der Informatik' - level-down. Emmen/Thun.",
|
||||
"date": "2026-10-20"
|
||||
},
|
||||
"https://jobs.bfh.ch/offene-stellen/leiter-in-innovationsfeld-und-wissenschaftliche-r-mitarbeiter-in-co-leitung-moeglich/a31835a2-d42b-428d-9aa2-aff2f1130948": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "Claude triage 2026-10-20, JD read (reports/2026-10-20-fit-sources/bfh_innovationsfeld.txt). Nursing research lead: 'Masterstudium in Pflege- oder Gesundheitswissenschaften mit Doktorat' - out of field.",
|
||||
"date": "2026-10-20"
|
||||
},
|
||||
"https://telenornorway.teamtailor.com/jobs/8550341-tech-lead-fullstack-utvikler": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "Claude triage 2026-10-20, JD read (reports/2026-10-20-fit-sources/telenor_techlead_fullstack.txt). Norwegian-language posting (working language Norwegian; he is A2), Oslo/Fornebu. 'Erfaring med Java/Kotlin og Spring Boot, samt TypeScript/JavaScript og moderne frontend-rammeverk. Hos oss bruker vi Vue.' - TypeScript forbidden, frontend Gap. This req only; the Norway lane stays open.",
|
||||
"date": "2026-10-20"
|
||||
},
|
||||
"https://jobs.ruag.ch/offene-stellen/head-of-engineering/ab919c1d-8283-4896-a5f8-f5d36366bb1a": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "Claude triage 2026-10-20, JD read (reports/2026-10-20-fit-sources/ruag_head_eng_a.txt + ruag_head_eng_b.txt). ONE row for TWO live postings of the same req: EN 559b77da and DE ab919c1d share the slug, so the slug fallback in find_decision_url resolves both here. Wangen, Sensors & Electronic Warfare. Division head: 'Proven experience in managing a division', 'cost centre responsibility', 'sensor technology and reconnaissance systems; knowledge of radar systems' - Gap.",
|
||||
"date": "2026-10-20"
|
||||
},
|
||||
"https://www.google.com/about/careers/applications/jobs/results/136295776576774854-software-engineer-iii-youtube-viewcount-and-aggregations?location=Switzerland": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "Claude triage 2026-10-21, JD read (reports/2026-10-20-fit-sources/g_swe3_yt_viewcount_aggregations.txt). Min qual '2 years of experience with software development in C++' - C++ is production-historical-limited (do not oversell C++). CONTENT is the closest Google match on the board (batch and streaming pipelines over billions of daily events, monitoring/alerting/data validation for metric quality), so revisit only if the C++ line is ever relaxed. Mid level.",
|
||||
"date": "2026-10-21"
|
||||
},
|
||||
"https://www.google.com/about/careers/applications/jobs/results/79119194099983046-software-engineer-iii-merchant-shopping-intelligence-and-agents?location=Switzerland": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "Claude triage 2026-10-21, JD read (reports/2026-10-20-fit-sources/g_swe3_merchant_shopping_agents.txt). Builds Gemini/ADK merchant agents: 'Implement automated evaluations, guardrails, and prompt engineering strategies' - SW-8 forbids agent orchestration and formal LLM evaluation. Mid level.",
|
||||
"date": "2026-10-21"
|
||||
},
|
||||
"https://www.google.com/about/careers/applications/jobs/results/104587629684499142-software-engineer-iii-data-protection-acceleration?location=Switzerland": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "Claude triage 2026-10-21, JD read (reports/2026-10-20-fit-sources/g_swe3_data_protection_accel.txt). Core team privacy/policy-enforcement infrastructure; generic mid-level minimums, off-thesis next to the Shopping Graph and SRE options.",
|
||||
"date": "2026-10-21"
|
||||
},
|
||||
"https://www.google.com/about/careers/applications/jobs/results/118334068726080198-staff-software-engineer-site-reliability-engineering-connections?location=Switzerland": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "Claude triage 2026-10-21, JD read (reports/2026-10-20-fit-sources/g_staff_sre_connections.txt). Staff SRE (Cloud TI): 8 yrs software dev Direct, but '3 years of experience leading projects' and '3 years ... designing, analyzing, and troubleshooting distributed systems' are both Adjacent - a double reach (level and SRE depth). The Senior SRE reqs cover the SRE lane at the right level.",
|
||||
"date": "2026-10-21"
|
||||
},
|
||||
"https://www.google.com/about/careers/applications/jobs/results/102064172115600070-staff-software-engineer-shopping-graph?location=Switzerland": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "applied",
|
||||
"note": "USER DECISION: SUBMITTED 2026-10-21 via Google Careers, cold (no referral). Evidence Fit 70, fit class Stretch, hard gate PASS, Document Quality ~86 (post-edit estimate; critique scored 84 before the last edit). Package: output/Google_Staff_SWE_Shopping_Graph/. Registry id app-google-staff-shopping-graph-102064172115600070.",
|
||||
"date": "2026-10-21"
|
||||
},
|
||||
"https://jobs.ruag.ch/offene-stellen/senior-devops-engineer-c5i/cd0c7781-211e-46db-bfba-3fa3c2dd50e4": {
|
||||
"company": "RUAG (Thun/Bern)",
|
||||
"title": "Senior DevOps Engineer C5I",
|
||||
"decision": "skip",
|
||||
"note": "Claude triage 2026-10-22, JD read (reports/2026-10-22-fit-sources/ruag_senior_devops_c5i.txt). DIFFERENT ROLE from the 2026-07-03 shortlisted req of the same title (3b3093ab, analytics-platform ops, since closed): this one runs self-hosted email/groupware/collaboration services on an on-prem private cloud (LDAP/OIDC, Terraform+Ansible, Kubernetes), Bern. Hard gate: 'Swiss citizenship required' - he is a German citizen. Also 'Experience with self-hosted email, groupware or collaboration platforms' is personal-only (PP-3 mail/Nextcloud server) and Terraform is forbidden. Superseded row note (July): shortlist, Bern-local WLB tier, Linux/Docker/K8s/Python/GitLab/Prometheus-Grafana-ELK DevOps lane, no citizenship gate in THAT JD.",
|
||||
"date": "2026-10-22"
|
||||
},
|
||||
"https://careers.nordicsemi.com/jobs/8483837-embedded-software-test-automation-engineer": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "maybe",
|
||||
"note": "TRIAGE 2026-10-22 (JD read, reports/2026-10-22-fit-sources/nordic_embedded_sw_test_automation.txt), NOT a user decision. Nordic Semiconductor, Oslo or Trondheim; English working language ('communication and presentation skills in English'); employer rated GOOD (Glassdoor 4.0/103). CI/CD for a multi-platform Bluetooth stack: Python strong - Direct; Jenkins + Docker + CI/CD pipelines - Direct (FC-1, BS-6, VZ-2, SW-3 historical); Grafana/monitoring + database - Adjacent (BS-4 PoC); Bash tooling Direct; Groovy named in duties - forbidden. HARD GATE: required 'Experience in embedded software development, especially within Bluetooth stack or other wireless protocol projects' and 'embedded development kits' - ED-1 coursework only. Same gate the user overrode for Kongsberg Seatex (2026-10-08). User's call.",
|
||||
"date": "2026-10-22"
|
||||
},
|
||||
"https://careers.nordicsemi.com/jobs/8411130-ate-test-engineer": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "Claude triage 2026-10-22, JD read (reports/2026-10-22-fit-sources/nordic_ate_test_engineer.txt). Chip production test: 'Proven track record in high frequency, mixed-signal, digital and analog test development and execution' and 'Automated Test Equipment (ATE) Test Development in high volume manufacturing' - Gap. Bosch fab data analysis is adjacent domain, not ATE test development.",
|
||||
"date": "2026-10-22"
|
||||
},
|
||||
"https://jobs.apple.com/en-us/details/200634821-4170/aiml-senior-ml-rl-training-infrastructure-engineer-afm?team=MLAI": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "TRIAGE 2026-10-22 (JD read, reports/2026-10-22-fit-sources/apple_afm_training_infra.txt). Apple Core Foundation Models, Zurich: RL training infra on TPU/JAX. Minimums 'Hands-on experience designing, building, or maintaining large-scale ML training infrastructure' and 'Strong proficiency with PyTorch or JAX and experience running training workloads on GPUs/TPUs' are Gap: BS-1 is inference integration, PyTorch is certification-context-only, JAX/TPU absent. Model-training infra at a top lab, outside the AI-platform overlap (user_positioning).",
|
||||
"date": "2026-10-22"
|
||||
},
|
||||
"https://jobs.apple.com/en-us/details/200680814-4170/staff-machine-learning-engineer-siri-runtime-systems-and-interaction?team=MLAI": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "TRIAGE 2026-10-22 (JD read, apple_siri_runtime_staff.txt). Despite the 'Runtime Systems' title the role leads audio/video GENERATION: minimum 'Deep hands-on experience with generative audio and/or video architectures (e.g., diffusion models, autoregressive models, GANs, VAEs...)' - Gap. Model-building.",
|
||||
"date": "2026-10-22"
|
||||
},
|
||||
"https://jobs.apple.com/en-us/details/200687930-4170/hid-algorithms-software-engineer?team=HRDWR": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "TRIAGE 2026-10-22 (JD read, apple_hid_algorithms.txt). HID sensor-algorithm frameworks with firmware teams. Minimum 'Strong C/C++ programming' - C++ is not a strength (feedback_cpp_emphasis); embedded preferred (ED-1 coursework only). SW architecture minimum would be Adjacent (BS-1/BS-2/SW-7), but the language gate decides.",
|
||||
"date": "2026-10-22"
|
||||
},
|
||||
"https://jobs.apple.com/en-us/details/200634000-4170/applied-machine-learning-engineer-security?team=SFTWR": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "TRIAGE 2026-10-22 (JD read, apple_applied_ml_security.txt). SEAR offensive security research. Minimums 'Expertise in ML, especially large language models and generative modeling' and offensive-security experience - both Gap (SW-8 is configured assistants; SW-5 Security Champion is a team role).",
|
||||
"date": "2026-10-22"
|
||||
},
|
||||
"https://jobs.sbb.ch/v2/offene-stellen/projektleiter-in-datenmanagement/9eb0bb3e-89c7-4d3e-a892-8c6f587e0624": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "TRIAGE 2026-10-22 (JD read, sbb_projektleiter_datenmanagement.txt). Job ID 104238, Olten. 'Diese Stelle befindet sich im Anforderungsniveau H' - below Niveau K, which the user ruled too low (2026-09-11). Project coordination of RIS/BIM inventory data capture and external suppliers, not engineering.",
|
||||
"date": "2026-10-22"
|
||||
},
|
||||
"https://career2.successfactors.eu/sfcareer/jobreqcareer?jobId=1476&locale=de_DE&company=Swissgrid": {
|
||||
"company": "Swissgrid (Aarau)",
|
||||
"title": "(Senior) Cloud Security Engineer (80-100%)",
|
||||
"decision": "skip",
|
||||
"note": "TRIAGE 2026-10-22 (JD read, reports/2026-10-22-fit-sources/swissgrid_cloud_security.txt); resolves the 07-06 title-only maybe. Azure cloud-security role in Platform Services, Aarau. Required 'Mehrjaehrige Erfahrung in Cyber Security Rollen mit Fokus auf Cloud Security', 'Erfahrung in Offensive Security (Security Auditing, Pentesting, CTF...)', Azure services and Terraform/GitHub Actions - Gap (Azure and Terraform forbidden; SW-5 Security Champion is a team role).",
|
||||
"date": "2026-10-22"
|
||||
},
|
||||
"https://jobs.ruag.ch/offene-stellen/software-engineer-c5i/d4cff80d-97d5-4ef7-8460-fc72c54eb3be": {
|
||||
"company": "RUAG (Thun/Bern)",
|
||||
"title": "Software Engineer C5I m/f/d",
|
||||
"decision": "skip",
|
||||
"note": "TRIAGE 2026-10-22 (JD read, ruag_software_engineer_c5i.txt); resolves the 07-06 title-only maybe. Thun, Fuehrungsinformationssysteme, non-senior. Required 'Sehr gute Kenntnisse von .NET Framework (C#), Visual Studio (ganzer Technologie Stack) sowie in SCRUM' - C#/.NET is limited/secondary (Fraunhofer only). Technical contact Cedric Wyss, Principal Software Engineering C5I.",
|
||||
"date": "2026-10-22"
|
||||
},
|
||||
"https://arbeidsplassen.nav.no/stillinger/stilling/b17ef550-ab1f-44bf-b2c3-1adc9de1a54a": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "TRIAGE 2026-10-22 (JD read, reports/2026-10-22-fit-sources/nav_kredittbanken_data.txt). Kredittbanken Data Engineer, Trondheim. Requirement sentence 'God skriftlig og muntlig fremstillingsevne paa norsk og engelsk' = Norwegian required (A2); the scout read ENGLISH OK from the NAV 'Arbeidsspraak Engelsk eller norsk' field, a classifier defect. Stack is Azure Synapse/Power BI/DAX (Azure forbidden).",
|
||||
"date": "2026-10-22"
|
||||
},
|
||||
"https://arbeidsplassen.nav.no/stillinger/stilling/a1ce9d86-a95a-495e-9653-e1db8d67c100": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "TRIAGE 2026-10-22 (JD read, reports/2026-10-22-fit-sources/nav_kongsberg_norcontrol_devops.txt). Kongsberg Norcontrol DevOps & Test Engineer, Horten. Function fits (CI/CD, test automation, Docker/K8s), but requirement 'Kommunisere tydelig paa norsk og engelsk' = Norwegian required; scout read ENGLISH OK from the Arbeidsspraak field (classifier defect). Clearance required (not a gate). Kongsberg Seatex application pending.",
|
||||
"date": "2026-10-22"
|
||||
},
|
||||
"https://arbeidsplassen.nav.no/stillinger/stilling/f9753f42-1af7-4282-9161-d3e52a8d1c62": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "TRIAGE 2026-10-22 (JD read, reports/2026-10-22-fit-sources/nav_kd_fullstack_positioning.txt). Kongsberg Discovery HiPOS full-stack, Horten; English only. Required 'application development using technologies such as C++, C#' and 'Real-time programming, real time operating systems' - Gap. Same company as the pending Seatex application; deadline 2026-10-23.",
|
||||
"date": "2026-10-22"
|
||||
},
|
||||
"https://arbeidsplassen.nav.no/stillinger/stilling/9c0de8f3-3c34-47f7-aac3-b9cc359aea33": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "TRIAGE 2026-10-22 (JD read, reports/2026-10-22-fit-sources/nav_norwegian_fullstack.txt). Norwegian Air Shuttle Fullstack, Bodoe. 'Good communication skills, in Norwegian and English' = Norwegian required (scout read ENGLISH OK from the Arbeidsspraak field). Java/Kotlin/C# web and app development.",
|
||||
"date": "2026-10-22"
|
||||
},
|
||||
"https://arbeidsplassen.nav.no/stillinger/stilling/cab34bc3-7ba6-48f6-b71c-5446a659a916": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "TRIAGE 2026-10-22 (JD read, reports/2026-10-22-fit-sources/nav_reitan_dataplattform.txt). Reitan Eiendom data engineer, Trondheim; function fits (DWH, ETL/ELT, Python, Databricks/Snowflake-type), but 'god muntlig og skriftlig fremstillingsevne paa norsk' = Norwegian required.",
|
||||
"date": "2026-10-22"
|
||||
},
|
||||
"https://arbeidsplassen.nav.no/stillinger/stilling/3a90f1b5-2b87-4907-a82d-64411d58964a": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "TRIAGE 2026-10-22 (JD read, reports/2026-10-22-fit-sources/nav_norautron_dataplattform.txt). Norautron AI & Data Engineer, Horten: Microsoft Fabric/Azure/Power BI/Boomi platform - Azure forbidden, Fabric/Boomi absent. Language unstated (Norwegian ad).",
|
||||
"date": "2026-10-22"
|
||||
},
|
||||
"https://arbeidsplassen.nav.no/stillinger/stilling/7b71105c-1e7a-468b-aece-b03012651374": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "TRIAGE 2026-10-22 (JD read, reports/2026-10-22-fit-sources/nav_slb_software.txt). SLB Rig Equipment Software Development Engineer, Kristiansand; English only. Core stack 'C#, .NET, WPF, WinUI' desktop/equipment software - C#/.NET is secondary (Fraunhofer only). The sibling Data Scientist req is the better SLB fit.",
|
||||
"date": "2026-10-22"
|
||||
},
|
||||
"https://arbeidsplassen.nav.no/stillinger/stilling/0edf3ca5-e911-4bbc-84e6-3f7ccb0c1131": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "TRIAGE 2026-10-22 (JD read, reports/2026-10-22-fit-sources/nav_kongsberg_maritime_senior_dev.txt). Kongsberg Maritime Drives R&D, Bergen: 'Strong understanding of drive control systems, power electronics, electric motors' - electrical/control engineering, not software.",
|
||||
"date": "2026-10-22"
|
||||
},
|
||||
"https://arbeidsplassen.nav.no/stillinger/stilling/ba3282b1-f394-4c95-85ac-38611d2f277e": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "maybe",
|
||||
"note": "TRIAGE 2026-10-22 (JD read, reports/2026-10-22-fit-sources/nav_mazemap_senior.txt), NOT a user decision. MazeMap Senior Product Development Engineer, Trondheim; 'Fluent English Communication' only (Arbeidsspraak Engelsk). 8+ yrs IC building scalable backend - Direct/Adjacent (11 yrs; scale unquantified). 'Python Mastery: Deep, hands-on Python expertise (AsyncIO, performance tuning, microservices)' - Python Direct, AsyncIO specifics not in KB, ask. Java working knowledge (allowed-with-context), C++ exposure. AI dev tools - SW-8 (Copilot/Kiro). 'spatial data, graph algorithms, mathematical modeling' - BS-8 SDO_GEOMETRY + CRS transforms is a genuine bridge. ~21-person SaaS; reputation UNCHECKED (Glassdoor 1 review).",
|
||||
"date": "2026-10-22"
|
||||
},
|
||||
"https://arbeidsplassen.nav.no/stillinger/stilling/6c3365ed-adb8-4c64-8508-804d98df1037": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "maybe",
|
||||
"note": "TRIAGE 2026-10-22 (JD read, reports/2026-10-22-fit-sources/nav_kda_platform.txt), NOT a user decision. KDA Defence Systems (NASAMS) platform developer, Kongsberg (travel Asker/Moss). Required: CI/CD and build/test/deploy automation (GN-1, FC-1, BS-6 Jenkins/GitLab), IaC and environment standardisation (BS-6 Ansible), Linux (BS-6, PP-3) - Direct. Preferred GitLab, containers (SW-3/BS-1), observability (BS-4 PoC only), CMake (unknown), embedded/Ada (ED-1 coursework). Clearance-eligible required (not a gate). LANGUAGE UNCLEAR: Norwegian ad, no requirement sentence, NAV tag norsk - ask the recruiter. Same group as the pending Kongsberg Seatex application (different business area) - stacking is the user's call. Kongsberg verdict OK (no Glassdoor; Indeed 3.8/101).",
|
||||
"date": "2026-10-22"
|
||||
},
|
||||
"https://arbeidsplassen.nav.no/stillinger/stilling/80658525-2197-4705-8d34-8f1b7535a5a8": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "maybe",
|
||||
"note": "TRIAGE 2026-10-22 (JD read, reports/2026-10-22-fit-sources/nav_sparebank1_ai.txt), NOT a user decision. SpareBank 1 Nord-Norge KI-ingenioer, Tromsoe. Required lines are generic dev (systems development, APIs/integrations, version control/testing, production lifecycle, security/privacy) - Direct. GenAI/agents/Azure/Copilot Studio are advantages only ('Erfaring med KI-utvikling er en fordel, men ikke et krav'); SW-8 forbids agent-orchestration claims. LANGUAGE UNCLEAR (Norwegian ad, no sentence, NAV tag norsk; a regional bank likely works in Norwegian). Tromsoe is far north. Reputation UNCHECKED.",
|
||||
"date": "2026-10-22"
|
||||
},
|
||||
"https://jobs.ruag.ch/offene-stellen/senior-devops-kubernetes-engineer-c5i/4767c36f-2816-463f-846d-4f0283dc7c15": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "parked",
|
||||
"note": "USER DECISION 2026-10-22: not applying for now - 'there homeoffice rules are not good' (same C5I unit rejected 18027 after interview over home office). Keep it visible in the scout: 'maybe i need it later'. Fit unchanged (Sept estimate 86; JD re-fetched 2026-10-22, still live, no citizenship line).",
|
||||
"date": "2026-10-22"
|
||||
},
|
||||
"https://arbeidsplassen.nav.no/stillinger/stilling/d2560ea2-eef6-45e7-babe-f94f9f236b6b": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "skip",
|
||||
"note": "USER DECISION 2026-10-22: 'SLB doesn't attract me at the moment'. Fit was real (data-engineering body, English only, Glassdoor 3.9); deadline 2026-10-29. Not a Norway-lane closure.",
|
||||
"date": "2026-10-22"
|
||||
},
|
||||
"https://nvidia.wd5.myworkdayjobs.com/en-US/NVIDIAExternalCareerSite/job/Switzerland-Zurich/Senior-Software-Developer_JR2008695": {
|
||||
"company": "NVIDIA",
|
||||
"title": "Senior Software Developer",
|
||||
"decision": "skip",
|
||||
"note": "Claude triage 2026-10-22, JD read (reports/2026-10-22-fit-sources/nvidia_senior_software_developer.txt): AI networking acceleration library; requires '8 years experience in modern C++ / C / Rust development' and 'Deep knowledge of the TCP/IP network stack' - both Gap (C++ is secondary per feedback_cpp_emphasis; networking 0 canonical).",
|
||||
"date": "2026-10-22"
|
||||
},
|
||||
"https://nvidia.wd5.myworkdayjobs.com/en-US/NVIDIAExternalCareerSite/job/Switzerland-Remote/Senior-Production-Engineer----DGX-Cloud_JR2027105": {
|
||||
"company": "",
|
||||
"title": "",
|
||||
"decision": "applied",
|
||||
"note": "SUBMITTED 2026-10-22 via Workday. Evidence Fit 65 Stretch, hard gate PASS, Document Quality 85 (pre-edit; Edit 1 applied, not re-measured), channel Weak/cold, no cover letter. Package: output/NVIDIA_ProdEng_DGX_Cloud/.",
|
||||
"date": "2026-10-22"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,811 @@
|
||||
{
|
||||
"description": "Employer reputation lookups for job_scout (user requirement 2026-10-22: only recommend roles at employers with a good reputation as a place to work). Glassdoor blocks direct access (HTTP 403), so every figure here is a dated lookup from search results, not live data. Verdicts are computed by scout.reputation_verdict() from the thresholds below unless verdict_override is set. Entries older than 365 days show as STALE and must be re-checked. An employer missing from this file is UNCHECKED: look it up before recommending a role there.",
|
||||
"thresholds": {
|
||||
"good_min_rating": 3.8,
|
||||
"good_min_reviews": 50,
|
||||
"ok_min_rating": 3.5,
|
||||
"rule": "good: Glassdoor >= 3.8 with >= 50 reviews. ok: 3.5-3.79, or >= 3.8 on fewer than 50 reviews backed by a second source, or no Glassdoor page but a solid second source. avoid: below 3.5 unless the user overrides. excluded: user decision. A second source with a score (secondary_rating) must itself be >= 3.5 to back a thin or missing Glassdoor rating; below that the verdict is avoid. Glassdoor and kununu are both primary sources; whichever has more reviews decides (kununu is often far better populated for Swiss employers).",
|
||||
"approved": "user, 2026-10-22"
|
||||
},
|
||||
"employers": {
|
||||
"Vizrt": {
|
||||
"aliases": [],
|
||||
"verdict_override": "excluded",
|
||||
"note": "User decision 2026-10-22: worked there (Bergen, 2017-18) and does not want to work there again. Roles are hidden from reports.",
|
||||
"checked": "2026-10-22"
|
||||
},
|
||||
"Arm": {
|
||||
"aliases": [
|
||||
"Arm Norway",
|
||||
"ARM Norway"
|
||||
],
|
||||
"glassdoor": {
|
||||
"rating": 4.5,
|
||||
"reviews": 2633,
|
||||
"scope": "company-wide"
|
||||
},
|
||||
"note": "Trondheim-specific reviews are mixed: recent ones positive, a 2023 one criticised local middle management for engineers relocating from abroad.",
|
||||
"sources": [
|
||||
"https://static.glassdoor.at/Reviews/Arm-Reviews-E7834_P800.htm",
|
||||
"https://static-pc.glassdoor.fr/Reviews/Employee-Review-Arm-E7834-RVW80607582.htm"
|
||||
],
|
||||
"checked": "2026-10-22"
|
||||
},
|
||||
"Nordic Semiconductor": {
|
||||
"aliases": [
|
||||
"Nordic Semi"
|
||||
],
|
||||
"glassdoor": {
|
||||
"rating": 4.0,
|
||||
"reviews": 103,
|
||||
"recommend_pct": 83,
|
||||
"scope": "company-wide"
|
||||
},
|
||||
"secondary": "TrueUp 82% recommend (100+ reviews)",
|
||||
"sources": [
|
||||
"https://www.glassdoor.com/Overview/X-EI_IE681660.htm",
|
||||
"https://www.trueup.io/co/nordic-semi"
|
||||
],
|
||||
"checked": "2026-10-22"
|
||||
},
|
||||
"Equinor": {
|
||||
"aliases": [],
|
||||
"glassdoor": {
|
||||
"rating": 4.3,
|
||||
"reviews": 769,
|
||||
"recommend_pct": 87,
|
||||
"scope": "company-wide"
|
||||
},
|
||||
"secondary": "Indeed 4.0 (299); Universum: top student employer in engineering/business/technology 2024",
|
||||
"sources": [
|
||||
"https://www.glassdoor.co.uk/Reviews/Equinor-Reviews-E10408.htm",
|
||||
"https://uk.indeed.com/cmp/Equinor/reviews"
|
||||
],
|
||||
"checked": "2026-10-22"
|
||||
},
|
||||
"Kongsberg": {
|
||||
"aliases": [
|
||||
"Kongsberg Gruppen",
|
||||
"Kongsberg Maritime",
|
||||
"Kongsberg Digital",
|
||||
"Kongsberg Defence",
|
||||
"Kongsberg Discovery",
|
||||
"Kongsberg Satellite Services",
|
||||
"KSAT",
|
||||
"Kongsberg Norcontrol",
|
||||
"Kongsberg Seatex"
|
||||
],
|
||||
"not_aliases": [
|
||||
"Kongsberg Automotive"
|
||||
],
|
||||
"glassdoor": {
|
||||
"rating": null,
|
||||
"reviews": null
|
||||
},
|
||||
"secondary": "No Glassdoor page found; Indeed 3.8 (101 reviews, group); Universum 2025 professionals: 3rd in IT, 2nd in Engineering",
|
||||
"note": "Ratings vary by division; Kongsberg Maritime JobStreet sample is small (7). Kongsberg Automotive is an unrelated company and is NOT covered by this entry.",
|
||||
"sources": [
|
||||
"https://uk.indeed.com/cmp/Kongsberg-1",
|
||||
"https://www.kongsberg.com/news/stories/2025/11/Professionals-place-KONGSBERG-among-Norways-top-employers-in-Universum/"
|
||||
],
|
||||
"checked": "2026-10-22",
|
||||
"secondary_rating": 3.8
|
||||
},
|
||||
"DNV": {
|
||||
"aliases": [
|
||||
"DNV AS"
|
||||
],
|
||||
"glassdoor": {
|
||||
"rating": 4.2,
|
||||
"reviews": 94,
|
||||
"recommend_pct": 82,
|
||||
"scope": "company-wide (CA/NZ snapshot; UK page 3.9 on 47)"
|
||||
},
|
||||
"secondary": "Indeed 3.8 (444 reviews, Feb 2026)",
|
||||
"note": "Praised for flexibility and people; common complaints are pay and slow progression.",
|
||||
"sources": [
|
||||
"https://www.glassdoor.ca/Reviews/DNV-Reviews-E6648554.htm",
|
||||
"https://uk.indeed.com/cmp/Dnv/reviews"
|
||||
],
|
||||
"checked": "2026-10-22"
|
||||
},
|
||||
"SINTEF": {
|
||||
"aliases": [],
|
||||
"glassdoor": {
|
||||
"rating": 4.0,
|
||||
"reviews": 62,
|
||||
"recommend_pct": 81,
|
||||
"scope": "company-wide"
|
||||
},
|
||||
"note": "Autonomy and good people; salary on the lower end, some bureaucracy for project leads.",
|
||||
"sources": [
|
||||
"https://www.glassdoor.co.in/Reviews/SINTEF-Reviews-E458950.htm"
|
||||
],
|
||||
"checked": "2026-10-22"
|
||||
},
|
||||
"Telenor": {
|
||||
"aliases": [
|
||||
"Telenor Norge",
|
||||
"Telenor ASA"
|
||||
],
|
||||
"glassdoor": {
|
||||
"rating": 3.8,
|
||||
"reviews": 1305,
|
||||
"recommend_pct": 65,
|
||||
"scope": "company-wide, not Norway-specific"
|
||||
},
|
||||
"secondary": "Indeed 4.1 (311)",
|
||||
"note": "Exactly at the threshold. Good work-life balance; complaints about limited growth and frequently changing strategy.",
|
||||
"sources": [
|
||||
"https://www.glassdoor.com/Reviews/Telenor-Reviews-E11282.htm"
|
||||
],
|
||||
"checked": "2026-10-22"
|
||||
},
|
||||
"Microsoft": {
|
||||
"aliases": [
|
||||
"Microsoft Norge",
|
||||
"Microsoft Development Center Norway"
|
||||
],
|
||||
"glassdoor": {
|
||||
"rating": 4.0,
|
||||
"reviews": 54474,
|
||||
"recommend_pct": 76,
|
||||
"scope": "company-wide"
|
||||
},
|
||||
"sources": [
|
||||
"https://static-pc.glassdoor.fr/Reviews/Microsoft-Reviews-E1651.htm"
|
||||
],
|
||||
"checked": "2026-10-22"
|
||||
},
|
||||
"NATO": {
|
||||
"aliases": [
|
||||
"NATO JWC",
|
||||
"Joint Warfare Centre"
|
||||
],
|
||||
"glassdoor": {
|
||||
"rating": 4.0,
|
||||
"reviews": 240,
|
||||
"recommend_pct": 93,
|
||||
"scope": "all NATO bodies"
|
||||
},
|
||||
"note": "Pay, benefits, international setting; heavy workload, bureaucracy, rigid military structure. Reviews do not separate civilian staff.",
|
||||
"sources": [
|
||||
"https://www.glassdoor.com/Reviews/NATO-Reviews-E22846.htm"
|
||||
],
|
||||
"checked": "2026-10-22"
|
||||
},
|
||||
"Nammo": {
|
||||
"aliases": [],
|
||||
"glassdoor": {
|
||||
"rating": 3.9,
|
||||
"reviews": 21,
|
||||
"recommend_pct": 56,
|
||||
"scope": "company-wide"
|
||||
},
|
||||
"secondary": "Indeed 3.2 (87 reviews)",
|
||||
"note": "Thin and mixed: Glassdoor 3.9 on only 21 reviews with 56% recommending; the larger Indeed sample is 3.2, below the 3.5 line. A 2026 review alleges production pressure compromising safety. User may override.",
|
||||
"sources": [
|
||||
"https://www.glassdoor.co.nz/Reviews/Nammo-Reviews-E4444878.htm",
|
||||
"https://www.indeed.com/cmp/Nammo"
|
||||
],
|
||||
"checked": "2026-10-22",
|
||||
"secondary_rating": 3.2
|
||||
},
|
||||
"Kitron": {
|
||||
"aliases": [],
|
||||
"glassdoor": {
|
||||
"rating": 3.1,
|
||||
"reviews": 15,
|
||||
"recommend_pct": 34,
|
||||
"scope": "company-wide"
|
||||
},
|
||||
"note": "Below threshold on a thin sample: limited growth, pay, unclear strategy.",
|
||||
"sources": [
|
||||
"https://www.glassdoor.co.uk/Reviews/Kitron-Reviews-E311133.htm"
|
||||
],
|
||||
"checked": "2026-10-22"
|
||||
},
|
||||
"Google": {
|
||||
"glassdoor": {
|
||||
"rating": 4.4,
|
||||
"reviews": 48616,
|
||||
"scope": "company-wide",
|
||||
"recommend_pct": 87
|
||||
},
|
||||
"sources": [
|
||||
"https://static.glassdoor.ca/Reviews/Google-Reviews-E9079.htm"
|
||||
],
|
||||
"aliases": [],
|
||||
"checked": "2026-10-22"
|
||||
},
|
||||
"NVIDIA": {
|
||||
"glassdoor": {
|
||||
"rating": 4.4,
|
||||
"reviews": 5486,
|
||||
"scope": "company-wide",
|
||||
"recommend_pct": 91
|
||||
},
|
||||
"sources": [
|
||||
"https://static.glassdoor.at/Reviews/NVIDIA-Reviews-E7633_P92.htm"
|
||||
],
|
||||
"aliases": [],
|
||||
"checked": "2026-10-22"
|
||||
},
|
||||
"Roche": {
|
||||
"glassdoor": {
|
||||
"rating": 4.1,
|
||||
"reviews": 6459,
|
||||
"scope": "company-wide",
|
||||
"recommend_pct": 82
|
||||
},
|
||||
"note": "Recurring: job-security worries during transformation, slow progression; experience varies by team.",
|
||||
"sources": [
|
||||
"https://static.glassdoor.fr/Reviews/Roche-Reviews-E3480_P90.htm"
|
||||
],
|
||||
"aliases": [],
|
||||
"checked": "2026-10-22"
|
||||
},
|
||||
"Novartis": {
|
||||
"glassdoor": {
|
||||
"rating": 4.0,
|
||||
"reviews": 9050,
|
||||
"scope": "company-wide",
|
||||
"recommend_pct": 80
|
||||
},
|
||||
"note": "Recurring: slow advancement, restructuring.",
|
||||
"sources": [
|
||||
"https://static.glassdoor.ch/Reviews/Novartis-Reviews-E6667_P33.htm"
|
||||
],
|
||||
"aliases": [],
|
||||
"checked": "2026-10-22"
|
||||
},
|
||||
"Apple": {
|
||||
"glassdoor": {
|
||||
"rating": 4.1,
|
||||
"reviews": 43100,
|
||||
"scope": "company-wide",
|
||||
"recommend_pct": 79
|
||||
},
|
||||
"sources": [
|
||||
"https://static.glassdoor.de/Reviews/Apple-Reviews-E1138_P159.htm"
|
||||
],
|
||||
"aliases": [],
|
||||
"checked": "2026-10-22"
|
||||
},
|
||||
"OpenAI": {
|
||||
"glassdoor": {
|
||||
"rating": 4.1,
|
||||
"reviews": 100,
|
||||
"scope": "company-wide",
|
||||
"recommend_pct": 74
|
||||
},
|
||||
"note": "High pace and workload; culture said to have become more top-down.",
|
||||
"sources": [
|
||||
"https://www.glassdoor.com.au/Reviews/OpenAI-Reviews-E2210885.htm"
|
||||
],
|
||||
"aliases": [],
|
||||
"checked": "2026-10-22"
|
||||
},
|
||||
"Anthropic": {
|
||||
"glassdoor": {
|
||||
"rating": 4.2,
|
||||
"reviews": 30,
|
||||
"scope": "company-wide",
|
||||
"recommend_pct": 86
|
||||
},
|
||||
"secondary": "JobsByCulture aggregate 4.4 (222 Glassdoor reviews, Mar 2026)",
|
||||
"note": "Glassdoor's own page is thin (27-34 reviews); main complaint is workload.",
|
||||
"sources": [
|
||||
"https://www.glassdoor.co.in/Reviews/Anthropic-Reviews-E8109027.htm",
|
||||
"https://makerstations.io/anthropic-employee-statistics"
|
||||
],
|
||||
"aliases": [],
|
||||
"checked": "2026-10-22"
|
||||
},
|
||||
"Kraken": {
|
||||
"aliases": [
|
||||
"Payward"
|
||||
],
|
||||
"glassdoor": {
|
||||
"rating": 4.4,
|
||||
"reviews": 216,
|
||||
"scope": "company-wide",
|
||||
"recommend_pct": 91
|
||||
},
|
||||
"note": "No HR function by design; pay not top of market.",
|
||||
"sources": [
|
||||
"https://static.glassdoor.es/Reviews/Kraken-Reviews-E8860582.htm"
|
||||
],
|
||||
"checked": "2026-10-22"
|
||||
},
|
||||
"Databricks": {
|
||||
"glassdoor": {
|
||||
"rating": 4.0,
|
||||
"reviews": 1620,
|
||||
"scope": "company-wide",
|
||||
"recommend_pct": 76
|
||||
},
|
||||
"sources": [
|
||||
"https://static.glassdoor.ch/Reviews/Databricks-Reviews-E954734_P7.htm"
|
||||
],
|
||||
"aliases": [],
|
||||
"checked": "2026-10-22"
|
||||
},
|
||||
"Snowflake": {
|
||||
"glassdoor": {
|
||||
"rating": 3.7,
|
||||
"reviews": 1087,
|
||||
"scope": "company-wide",
|
||||
"recommend_pct": 66
|
||||
},
|
||||
"note": "Below the good line: KPI pressure, more corporate/political.",
|
||||
"sources": [
|
||||
"https://static.glassdoor.de/Reviews/Snowflake-Reviews-E928471.htm"
|
||||
],
|
||||
"aliases": [],
|
||||
"checked": "2026-10-22"
|
||||
},
|
||||
"Palantir": {
|
||||
"glassdoor": {
|
||||
"rating": 3.7,
|
||||
"reviews": 886,
|
||||
"scope": "company-wide",
|
||||
"recommend_pct": 65
|
||||
},
|
||||
"note": "Work-life balance weak (aggregator 2.8); long hours.",
|
||||
"sources": [
|
||||
"https://static.glassdoor.co.uk/Reviews/Palantir-Technologies-Reviews-E236375.htm"
|
||||
],
|
||||
"aliases": [],
|
||||
"checked": "2026-10-22"
|
||||
},
|
||||
"Amazon": {
|
||||
"aliases": [
|
||||
"AWS",
|
||||
"Amazon Web Services",
|
||||
"Amazon / AWS"
|
||||
],
|
||||
"glassdoor": {
|
||||
"rating": 3.6,
|
||||
"reviews": 13935,
|
||||
"scope": "AWS",
|
||||
"recommend_pct": 62
|
||||
},
|
||||
"note": "Work-life balance 3.0.",
|
||||
"sources": [
|
||||
"https://static.glassdoor.at/Reviews/Amazon-Web-Services-Reviews-E7470741_P74.htm"
|
||||
],
|
||||
"checked": "2026-10-22"
|
||||
},
|
||||
"Meta": {
|
||||
"glassdoor": {
|
||||
"rating": 3.6,
|
||||
"reviews": 17952,
|
||||
"scope": "company-wide",
|
||||
"recommend_pct": 55
|
||||
},
|
||||
"sources": [
|
||||
"https://www.glassdoor.co.uk/metacareers"
|
||||
],
|
||||
"aliases": [],
|
||||
"checked": "2026-10-22"
|
||||
},
|
||||
"GitLab": {
|
||||
"glassdoor": {
|
||||
"rating": 3.6,
|
||||
"reviews": 735,
|
||||
"scope": "company-wide",
|
||||
"recommend_pct": 58
|
||||
},
|
||||
"note": "Mixed (3.3-3.6 across snapshots): leadership and culture shifts.",
|
||||
"sources": [
|
||||
"https://www.glassdoor.com/Reviews/GitLab-Reviews-E1296544.htm"
|
||||
],
|
||||
"aliases": [],
|
||||
"checked": "2026-10-22"
|
||||
},
|
||||
"Grafana Labs": {
|
||||
"aliases": [
|
||||
"Grafana"
|
||||
],
|
||||
"glassdoor": {
|
||||
"rating": 4.1,
|
||||
"reviews": 215,
|
||||
"scope": "company-wide",
|
||||
"recommend_pct": 79
|
||||
},
|
||||
"note": "Frequent leadership changes. Geo-fenced pay (see scout memory).",
|
||||
"sources": [
|
||||
"https://www.glassdoor.com/Reviews/Grafana-Labs-Reviews-E2300269.htm"
|
||||
],
|
||||
"checked": "2026-10-22"
|
||||
},
|
||||
"Datadog": {
|
||||
"glassdoor": {
|
||||
"rating": 4.0,
|
||||
"reviews": 1630,
|
||||
"scope": "company-wide",
|
||||
"recommend_pct": 75
|
||||
},
|
||||
"note": "3 office days/week, no remote.",
|
||||
"sources": [
|
||||
"https://static.glassdoor.it/Reviews/Datadog-Reviews-E762009.htm"
|
||||
],
|
||||
"aliases": [],
|
||||
"checked": "2026-10-22"
|
||||
},
|
||||
"Elastic": {
|
||||
"glassdoor": {
|
||||
"rating": 3.7,
|
||||
"reviews": 880,
|
||||
"scope": "company-wide",
|
||||
"recommend_pct": 68
|
||||
},
|
||||
"note": "Snapshots range 3.6-3.9; layoffs and reorgs.",
|
||||
"sources": [
|
||||
"https://www.glassdoor.co.uk/Reviews/Elastic-Reviews-E751551.htm"
|
||||
],
|
||||
"aliases": [],
|
||||
"checked": "2026-10-22"
|
||||
},
|
||||
"Fivetran": {
|
||||
"glassdoor": {
|
||||
"rating": 3.6,
|
||||
"reviews": 440,
|
||||
"scope": "company-wide",
|
||||
"recommend_pct": 66
|
||||
},
|
||||
"secondary": "Blind 3.5 (103)",
|
||||
"note": "Leadership and layoffs criticised.",
|
||||
"sources": [
|
||||
"https://www.glassdoor.com.au/Reviews/Fivetran-Reviews-E1415980.htm"
|
||||
],
|
||||
"aliases": [],
|
||||
"checked": "2026-10-22"
|
||||
},
|
||||
"Cisco": {
|
||||
"aliases": [
|
||||
"Isovalent",
|
||||
"Splunk"
|
||||
],
|
||||
"glassdoor": {
|
||||
"rating": 4.1,
|
||||
"reviews": 33605,
|
||||
"scope": "company-wide",
|
||||
"recommend_pct": 82
|
||||
},
|
||||
"note": "Recurring layoffs.",
|
||||
"sources": [
|
||||
"https://static.glassdoor.com.mx/Reviews/Cisco-Reviews-E1425_P51.htm"
|
||||
],
|
||||
"checked": "2026-10-22"
|
||||
},
|
||||
"IBM": {
|
||||
"aliases": [
|
||||
"Confluent",
|
||||
"Confluent (IBM)",
|
||||
"HashiCorp"
|
||||
],
|
||||
"glassdoor": {
|
||||
"rating": 3.9,
|
||||
"reviews": 107347,
|
||||
"scope": "company-wide",
|
||||
"recommend_pct": 78
|
||||
},
|
||||
"note": "IBM rating; Confluent has been IBM since 2026-03-17.",
|
||||
"sources": [
|
||||
"https://static.glassdoor.it/Reviews/IBM-Reviews-E354_P4.htm"
|
||||
],
|
||||
"checked": "2026-10-22"
|
||||
},
|
||||
"Axpo": {
|
||||
"glassdoor": {
|
||||
"rating": 3.9,
|
||||
"reviews": 91,
|
||||
"scope": "company-wide",
|
||||
"recommend_pct": 82
|
||||
},
|
||||
"sources": [
|
||||
"https://www.glassdoor.com/Reviews/Axpo-Reviews-E755157.htm"
|
||||
],
|
||||
"aliases": [],
|
||||
"checked": "2026-10-22"
|
||||
},
|
||||
"CERN": {
|
||||
"glassdoor": {
|
||||
"rating": 4.3,
|
||||
"reviews": 854,
|
||||
"scope": "company-wide",
|
||||
"recommend_pct": 91
|
||||
},
|
||||
"note": "Pay low for Switzerland; short-term contracts.",
|
||||
"sources": [
|
||||
"https://www.glassdoor.com/Reviews/CERN-Reviews-E150483.htm"
|
||||
],
|
||||
"aliases": [],
|
||||
"checked": "2026-10-22"
|
||||
},
|
||||
"MET Group": {
|
||||
"aliases": [
|
||||
"METGroup"
|
||||
],
|
||||
"glassdoor": {
|
||||
"rating": 3.7,
|
||||
"reviews": 34,
|
||||
"scope": "company-wide, 2024 snapshot",
|
||||
"recommend_pct": 70
|
||||
},
|
||||
"note": "Thin and dated (24-34 reviews, 2024).",
|
||||
"sources": [
|
||||
"https://www.glassdoor.ie/Reviews/Met-Group-Reviews-E734317.htm"
|
||||
],
|
||||
"checked": "2026-10-22"
|
||||
},
|
||||
"BIS": {
|
||||
"aliases": [
|
||||
"Bank for International Settlements",
|
||||
"BIS (Basel)"
|
||||
],
|
||||
"glassdoor": {
|
||||
"rating": 2.9,
|
||||
"reviews": 56,
|
||||
"scope": "company-wide",
|
||||
"recommend_pct": 42
|
||||
},
|
||||
"note": "BELOW threshold: 42% recommend, 33% CEO approval (page may list an outdated CEO). Thin but 56 reviews. NB: an application (jr100498) is pending there.",
|
||||
"sources": [
|
||||
"https://www.glassdoor.com/Overview/X-EI_IE10670.htm"
|
||||
],
|
||||
"checked": "2026-10-22"
|
||||
},
|
||||
"RUAG": {
|
||||
"aliases": [
|
||||
"RUAG (Thun/Bern)"
|
||||
],
|
||||
"not_aliases": [
|
||||
"RUAG International"
|
||||
],
|
||||
"glassdoor": {
|
||||
"rating": null,
|
||||
"reviews": null
|
||||
},
|
||||
"secondary": "Indeed CH 3.1 (sample size not shown)",
|
||||
"note": "kununu group 3.5 on 523 reviews (73% recommend, last 2 years) replaces the thin Indeed 3.1. Subsidiaries vary: RUAG Aviation 3.1 (26), RUAG Ammotec 3.0 (17); RUAG International (2.8) is a different entity. Industry average 3.4.",
|
||||
"sources": [
|
||||
"https://ch.indeed.com/cmp/Ruag/reviews",
|
||||
"https://www.kununu.com/ch/ruag"
|
||||
],
|
||||
"checked": "2026-10-22",
|
||||
"kununu": {
|
||||
"rating": 3.5,
|
||||
"reviews": 523,
|
||||
"recommend_pct": 73,
|
||||
"scope": "RUAG Schweiz group profile"
|
||||
}
|
||||
},
|
||||
"SBB": {
|
||||
"glassdoor": {
|
||||
"rating": null,
|
||||
"reviews": null
|
||||
},
|
||||
"secondary": "Indeed CH 4.2 (46); kununu 3.46 (289) in 2015, dated",
|
||||
"sources": [
|
||||
"https://ch.indeed.com/cmp/Sbb-Ag/reviews",
|
||||
"https://www.netzwoche.ch/news/2015-02-05/top-10-der-schweizer-arbeitgeber-ausgezeichnet",
|
||||
"https://www.kununu.com/ch/sbbcffffs/kommentare"
|
||||
],
|
||||
"aliases": [],
|
||||
"checked": "2026-10-22",
|
||||
"kununu": {
|
||||
"rating": 3.8,
|
||||
"reviews": 1808,
|
||||
"scope": "SBB CFF FFS"
|
||||
},
|
||||
"note": "Praised: atmosphere, pay and benefits, home office; criticised: leadership and communication. An older SBB Informatik review is notably critical."
|
||||
},
|
||||
"Swissgrid": {
|
||||
"aliases": [
|
||||
"Swissgrid (Aarau)"
|
||||
],
|
||||
"glassdoor": {
|
||||
"rating": 4.2,
|
||||
"reviews": 6,
|
||||
"scope": "6 visible of 45",
|
||||
"recommend_pct": 91
|
||||
},
|
||||
"secondary": "jobs.ch 15 reviews, mostly positive",
|
||||
"note": "Snapshots range 3.5-3.9 (135-209 reviews). Pension fund, pay, varied work; leadership (3.5) and workload criticised; many external contractors.",
|
||||
"sources": [
|
||||
"https://www.glassdoor.ca/Reviews/Swissgrid-Reviews-E673595.htm",
|
||||
"https://www.jobs.ch/en/companies/7621-swissgrid-ag/reviews/",
|
||||
"https://www.kununu.com/ch/swissgrid"
|
||||
],
|
||||
"checked": "2026-10-22",
|
||||
"kununu": {
|
||||
"rating": 3.6,
|
||||
"reviews": 146
|
||||
}
|
||||
},
|
||||
"PostFinance": {
|
||||
"aliases": [
|
||||
"PostFinance (Bern)"
|
||||
],
|
||||
"glassdoor": {
|
||||
"rating": 4.1,
|
||||
"reviews": 16,
|
||||
"scope": "company-wide",
|
||||
"recommend_pct": 79
|
||||
},
|
||||
"secondary": "Indeed CH 3.6 (25)",
|
||||
"note": "Colleagues 4.1, communication 3.3; promotion criticised; an Oct 2026 comment reports a recent decline in atmosphere and work-life balance.",
|
||||
"sources": [
|
||||
"https://www.glassdoor.com/Reviews/PostFinance-Reviews-E602813.htm",
|
||||
"https://ch.indeed.com/cmp/Postfinance-Ag/reviews",
|
||||
"https://www.kununu.com/ch/postfinance6/kommentare"
|
||||
],
|
||||
"checked": "2026-10-22",
|
||||
"kununu": {
|
||||
"rating": 3.8,
|
||||
"reviews": 497,
|
||||
"recommend_pct": 76
|
||||
}
|
||||
},
|
||||
"BFH": {
|
||||
"aliases": [
|
||||
"Berner Fachhochschule",
|
||||
"BFH (Bern)"
|
||||
],
|
||||
"glassdoor": {
|
||||
"rating": null,
|
||||
"reviews": null
|
||||
},
|
||||
"secondary": "Indeed CH 3.5; Glassdoor career-opportunities sub-score 3.9 (64); Swiss Arbeitgeber Award 2022 top-3 large employer",
|
||||
"sources": [
|
||||
"https://ch.indeed.com/cmp/Berner-Fachhochschule",
|
||||
"https://www.plattformj.ch/artikel/204982/",
|
||||
"https://www.kununu.com/ch/berner-fachhochschule"
|
||||
],
|
||||
"checked": "2026-10-22",
|
||||
"kununu": {
|
||||
"rating": 3.3,
|
||||
"reviews": 132,
|
||||
"recommend_pct": 52
|
||||
},
|
||||
"note": "Below the education-sector average (3.6): communication 2.6, leadership 2.8; interesting work 3.8."
|
||||
},
|
||||
"BKW": {
|
||||
"aliases": [
|
||||
"BKW (Bern)",
|
||||
"BKW Energie"
|
||||
],
|
||||
"not_aliases": [
|
||||
"BKW Management"
|
||||
],
|
||||
"glassdoor": {
|
||||
"rating": null,
|
||||
"reviews": null
|
||||
},
|
||||
"note": "Interesting work and conditions; communication (3.2) and leadership criticised.",
|
||||
"sources": [
|
||||
"https://www.glassdoor.com/Reviews/BKW-Reviews-E40434.htm",
|
||||
"https://www.kununu.com/ch/bkwag"
|
||||
],
|
||||
"checked": "2026-10-22",
|
||||
"kununu": {
|
||||
"rating": 3.7,
|
||||
"reviews": 345,
|
||||
"recommend_pct": 70,
|
||||
"scope": "BKW AG"
|
||||
}
|
||||
},
|
||||
"Schweizer Armee": {
|
||||
"aliases": [
|
||||
"Kdo Cy",
|
||||
"Kommando Cyber",
|
||||
"Schweizer Armee - Kdo Cy",
|
||||
"Bundesverwaltung"
|
||||
],
|
||||
"glassdoor": {
|
||||
"rating": null,
|
||||
"reviews": null
|
||||
},
|
||||
"note": "Federal administration profile (no Kdo-Cy-specific profile): varied work, pay and benefits praised; career progression, communication and leadership criticised; slow hiring processes. Below the public-administration average (3.5).",
|
||||
"sources": [
|
||||
"https://www.jobs.ch/en/companies/70645-bundesverwaltung/reviews/",
|
||||
"https://www.kununu.com/ch/vbs-schweizer-armee"
|
||||
],
|
||||
"checked": "2026-10-22",
|
||||
"kununu": {
|
||||
"rating": 3.4,
|
||||
"reviews": 997,
|
||||
"recommend_pct": 63,
|
||||
"scope": "Bundesverwaltung / VBS profile"
|
||||
}
|
||||
},
|
||||
"QuantCo": {
|
||||
"glassdoor": {
|
||||
"rating": null,
|
||||
"reviews": null
|
||||
},
|
||||
"note": "Thin (18 reviews, German entity); pay and benefits 5.0. Not to be confused with Quant Qualitaetssicherung.",
|
||||
"aliases": [],
|
||||
"checked": "2026-10-22",
|
||||
"kununu": {
|
||||
"rating": 4.3,
|
||||
"reviews": 18,
|
||||
"recommend_pct": 94,
|
||||
"scope": "QuantCo Germany (Rodgau)"
|
||||
},
|
||||
"sources": [
|
||||
"https://www.kununu.com/de/quantco6"
|
||||
]
|
||||
},
|
||||
"Bitcoin Suisse": {
|
||||
"glassdoor": {
|
||||
"rating": null,
|
||||
"reviews": null
|
||||
},
|
||||
"note": "Thin (14-18 reviews); leadership said to have worsened after a management change.",
|
||||
"sources": [
|
||||
"https://trueup.io/co/bitcoin-suisse",
|
||||
"https://www.kununu.com/ch/bitcoin-suisse1"
|
||||
],
|
||||
"aliases": [],
|
||||
"checked": "2026-10-22",
|
||||
"kununu": {
|
||||
"rating": 3.8,
|
||||
"reviews": 18,
|
||||
"recommend_pct": 77
|
||||
}
|
||||
},
|
||||
"SLB": {
|
||||
"aliases": [
|
||||
"Schlumberger",
|
||||
"SLB OneSubsea",
|
||||
"OneSubsea"
|
||||
],
|
||||
"glassdoor": {
|
||||
"rating": 3.9,
|
||||
"reviews": 15113,
|
||||
"recommend_pct": 73,
|
||||
"scope": "company-wide"
|
||||
},
|
||||
"note": "Work-life balance 3.4 (lowest sub-rating), culture 3.9, career 3.8; praise for training and international mobility, criticism of long hours and management. Industry average 3.7.",
|
||||
"sources": [
|
||||
"https://static.glassdoor.com.br/Reviews/SLB-Reviews-E588_P3871.htm"
|
||||
],
|
||||
"checked": "2026-10-22"
|
||||
},
|
||||
"MazeMap": {
|
||||
"aliases": [
|
||||
"Mazemap As",
|
||||
"MazeMap AS"
|
||||
],
|
||||
"glassdoor": {
|
||||
"rating": null,
|
||||
"reviews": null
|
||||
},
|
||||
"verdict_override": "unchecked",
|
||||
"note": "Glassdoor page exists with a single review (3.0, March 2024: good colleagues and office; no full remote, sales over engineering). One review is no signal, so the verdict stays unchecked. ~21 employees (OpenCorporates). Do not confuse with 'Maze' (E4132839).",
|
||||
"sources": [
|
||||
"https://www.glassdoor.com/Reviews/MazeMap-Reviews-E4814325.htm",
|
||||
"https://opencorporates.com/companies/no/912197905"
|
||||
],
|
||||
"checked": "2026-10-22"
|
||||
},
|
||||
"SpareBank 1 Nord-Norge": {
|
||||
"aliases": [
|
||||
"SpareBank 1 Nord Norge",
|
||||
"Sparebanken Nord-Norge"
|
||||
],
|
||||
"glassdoor": {
|
||||
"rating": null,
|
||||
"reviews": null
|
||||
},
|
||||
"verdict_override": "unchecked",
|
||||
"note": "No Glassdoor, Great Place to Work or Universum entry found 2026-10-22. Bytt.no's 2.5 is a CUSTOMER rating, not an employee one, and must not be used.",
|
||||
"sources": [],
|
||||
"checked": "2026-10-22"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,118 @@
|
||||
{
|
||||
"agent_sections": {
|
||||
"AGENTS.md": "\n\n_Update this section when starting/finishing a JD._\n\n| Session | Status | Next Command |\n|---------|--------|-------------|\n| NVIDIA - **Senior DevOps Engineer**, **Zürich** (req JR2024256) | **SUBMITTED 2026-09-05.** Evidence Fit **64/100**, fit class **Stretch**, hard gate **FAIL x2**, channel **Weak** (7th consecutive cold submit; this posting published no named contact). 2pp resume 13 bullets + 1pp cover letter 279 words; both validators PASS 0 warnings, 0 boxes, 0 Tier 1 findings open. Measured Document Quality **82/100 pre-edit**; both Tier 1 findings were then closed, so it is better than 82 but **not re-measured - never quote a post-edit estimate as a score**. Submitted on an explicit user override. ⚠ **Hybrid vs 5-day onsite was never resolved before sending** - now a live screening topic, not pre-cleared. Thun→Zürich is ~1h50 each way. Comp is *not* a risk (levels.fyi Greater Zürich IC3 median ≈ CHF 204k). Honest gaps named in the letter: on-prem networking (0 canonical) and that employer-side Linux/Ansible ended Dec 2022, with only the personal `PP-3` server carrying currency. | Await response. **Raise the working model at first contact** - a 5-day-onsite seat would be a late no. |\n| SBB - **Data Engineer (m/w/d)**, Asset Management Infrastrukturanlagen, **Bern** (Job ID 103755) | ⭐ **INTERVIEW INVITED 2026-08-28 - 9. September 2026, 08:30, 45 Min, MS Teams. The only live interview in the log.** Stage **2 of 4** per the posting: *\"Virtuelles Kennenlernen mit HR und Fuehrungskraft\"*, so **HR together with Andri Wienandts**, not a pure HR screen. Brief: `output/SBB_DataEngineer_AssetMgmt/interview_brief_sbb_2026-09-09.md`. **First conversion of the evidence-first cohort** (6 applications, 2 rejections) and it came from a **COLD submit** - the warm contact printed on the posting was never called. The resume never contained **Snowflake, dbt or Power BI**, the literals an ATS screen would key on, and it still got through: a human read it and the honest-substitution framing held. One data point, do not over-read it. Submitted 2026-08-25, Core, Evidence Fit **79/100**, hard gate PASS, Document Quality **92/100**, no cover letter (SBB waives it). Best practical fit in the log: Bern, German-language, no relocation, EU + B permit. **Four unresolved items, now live call topics:** Anforderungsniveau **K** band (capped GAV, not public, likely below the 180k bar); the seat reads **lateral or below** current Staff + Component Owner scope (the declined-BKW shape); **RAMSI** Java/Spring Boot/Angular is a full responsibility line on a historical/absent stack; Kidz Care scales on gross household income. Gaps to answer honestly: Snowflake, dbt, Argo, Helm, Power BI, Spring Boot, Angular - survivable only because the JD says \"z. B.\". Thesis stays a **methods prototype**: no operational data, no accuracy figures, PSO surveyed only. | **Decide before 9.9.:** what he does if K lands at 130-150k, if architecture is set elsewhere, or if RAMSI is heavily Angular. Any one can be a no - better decided in advance than improvised on camera. |\n| RUAG C5I - **AI Engineer C5I**, **Thun** (application ID 18027) | **SUBMITTED 2026-08-27** via jobs.ruag.ch (portal only). Evidence Fit **74/100**, fit class **Stretch**, hard gate **FAIL** (R1/R2, the title-defining responsibilities, are Adjacent not Direct), Document Quality **93/100** after a critique-and-fix round, channel **Weak/cold**. German CV 2 pages/13 bullets + motivation letter 1 page/295 words; validators PASS, 0 boxes, visual QA clean. (Cohort slot language here is historical: the **7/2/1 caps were dropped 2026-09-05** - see `application_strategy.md`.) Positioning is his canonical title Staff Data, Analytics & AI Engineer; `PP-3` carries current Linux/hardening evidence and `SW-5` ties DevSecOps to C5I's stated model. The letter names the AI-platform gap in one sentence. Honest gaps: no AI/LLM platform, no compute/GPU cluster, no RAG/retrieval, ML/AI frameworks certification-context only. **Compensation, PSP/project eligibility and level were never resolved and are now live screening topics.** Marco Heinzen's published direct line was never used. **If rejected, do not drop RUAG** - **Senior DevOps Engineer C5I** is shortlisted and fits better (still live on the board 2026-09-04). The **Data Lakehouse / Senior Data Platform Engineer** req was a title-match prior the JD does not support: reposted 2026-09-04 as **Senior Data Engineer (MSSQL)**, requiring on-prem MSSQL/Talend/SAP S/4HANA - 0 canonical each - and **ruled out**. | Await response; optional calls to Marco Heinzen (scope/level) and Frank Haugwitz (comp/PSP). |\n| Schweizer Armee - **Kommando Cyber (Kdo Cy)**, DevOps Engineer III (Data Platform), **Zimmerwald** (Ref JRQ$540-19848) | **SUBMITTED 2026-08-27.** Evidence Fit **79/Core**, hard gate **PASS**, Document Quality **92/100**, channel **Weak**. German 2-page CV plus 1-page motivation letter; validators PASS, 0 boxes, Line truncated
|
||||
"CLAUDE.md": "\n\n_Update this section when starting/finishing a JD._\n\n| Session | Status | Next Command |\n|---------|--------|-------------|\n| NVIDIA - **Senior DevOps Engineer**, **Zürich** (req JR2024256) | **SUBMITTED 2026-09-05.** Recorded in the application record (now 7 entries) and in the scout decision log. ⚠ **Hybrid vs 5-day onsite was never resolved before sending**, so the working model is now a **live screening topic**, not a pre-cleared one - the same pattern as RUAG's comp/PSP. Thun→Zürich is ~1h50 each way; a 5-day-onsite answer is the main disqualifier to watch for. Comp is *not* a risk (levels.fyi Greater Zürich IC3 median ≈ CHF 204k, IC4 ≈ CHF 379k). Channel **Weak - the 7th consecutive cold submit**, though this posting published no named contact, so cold was the only option available. Submission PDFs `Dennis_Thiessen_Resume.pdf` and `Dennis_Thiessen_Cover_Letter.pdf` exist and are MD5-verified against source; letter recompiled so its date reads 5 Sep 2026. ⚠ **The letter carries `\today` and the submission copies are copies, not build targets - if it is sent on a later day, recompile the letter and refresh both copies first** (`config.md` Output Rules). Submitted despite the hard-gate failures on an explicit user override, the same shape as RUAG AI Engineer C5I. Resume 2pp/13 bullets + 1pp cover letter (279 body words), both validators PASS 0 warnings, 0 boxes, visually inspected. Measured **Document Quality 82/100** at critique; **both Tier 1 findings were fixed 2026-09-05** - `Ubuntu` removed from the skills line (0 canonical; `PP-3` is Debian only, and the Debian→Ubuntu transfer argument belongs in an interview answer, not a skills line) and `security hardening` now marked *(personal server)* per the explicit `claims.json` instruction. Four honest ATS terms were added from existing evidence (configuration management, service reliability, container orchestration, observability), lifting JD term coverage **50%→61%**; no bullet was touched, so the budget stayed at 13 and cadence could not regress. **The critique is now STALE BY DESIGN - the document is better than 82 but that number was not re-measured, so never quote a post-edit estimate as a score.** The headline reorder was deliberately NOT applied: it is a positioning call for the user and `\\headline` sits in the FIXED header block. Cover-letter hook is first-party verified (NVIDIA's own live Zürich posting JR2022878); **a hook was DROPPED at verification** - the Phase 0 plan's \"Alps / Swiss AI Initiative with ETH Zürich and EPFL\" is **not** supported by the first-party NVIDIA newsroom release, which mentions neither EPFL nor any Swiss AI Initiative; that came from secondary coverage. The letter names **both** honest gaps out loud - on-prem networking, and that employer-side Linux/Ansible ended Dec 2022 with only a personal server carrying currency. **⚠ BLOCKING: the working model is still unresolved and no document fix changes that.** Session `output/NVIDIA_SrDevOps_Zurich/session_nvidia_sr_devops.md`; JD scraped live via Playwright and saved verbatim (posted ~2026-09-01, very fresh). Evidence Fit **64/100**, fit class **Stretch**, **hard gate FAIL on two counts**: (1) required line *\"Strong expertise in on-premises networking and compute infrastructure\"* is a **Gap** - networking is 0 canonical and is not substitutable from data-platform work; (2) **hybrid vs onsite is UNRESOLVED** and the JD is silent - Thun→Zürich is ~1h50 each way. Required tally **3 Direct / 3 Adjacent / 1 Gap**. Recorded as an override rather than a passing gate, the same shape as RUAG AI Engineer C5I. (At the time this also had no free cohort slot; **that constraint no longer exists** - caps dropped 2026-09-05.) **Correction to the same day's scout triage: it called two required lines Gaps; only Q5b networking is one. Q2 (10+ yrs DevOps) is Adjacent and defensible** - a continuous CI/CD/automation thread runs Generali 2015 → today across five employers; the honest weakness is that those roles were titled data/test/research engineer, not DevOps. **The finding that changes the calculus: comp.** levels.fyi Greater Zürich puts NVIDIA IC3 median ≈ CHF 204k and IC4 ≈ CHF 379k, the highest-paying SWE employer in the city - the first role in the log where comp is a reason to *accept* a long commute rather than decline. Caveat: self-reported and equity-heavy after an extraordinary NVDA run; treat base as the reliable part. Strongest match is **R3, CI/CD pipelines for R&D engineering teams** - literally his career shape (`FC-1` Jenkins at a Fraunhofer institute, `BS-6` Ansible/Jenkins for fab analytics teams, `SW-3` Kubernetes + GitLab today). Zürich is NVIDIA's HPC/AI infrastructure-software R&D hub - first-party verified from NVIDIA's own live Zürich posting JR2022878 (*\"building the next generation of scalable AI infrastructure ... distributed training, real-time inference, and communication efficiency across large sLine truncated
|
||||
},
|
||||
"cohort": {
|
||||
"cohort_id": "evidence-first-2026-01",
|
||||
"status": "active (log, not a capped cohort)",
|
||||
"started": "2026-07-27",
|
||||
"target_mix": {
|
||||
"core": 7,
|
||||
"adjacent": 2,
|
||||
"stretch": 1
|
||||
},
|
||||
"definitions": {
|
||||
"core": "Evidence Fit 75+ and no hard-gate failure",
|
||||
"adjacent": "Evidence Fit 60-74, no required Gap, normally at most one serious preferred gap",
|
||||
"stretch": "Evidence Fit below 60 or a defining responsibility is only Adjacent"
|
||||
},
|
||||
"policy_change_2026_09_05": "Slot caps (7 core / 2 adjacent / 1 stretch) DROPPED by user decision. target_mix is retained only as a record of the original design and is no longer read by cohort_tracker.py or enforced anywhere. This file continues as a durable application log. Channel is now the rationed variable: no application goes out cold when a named contact is published and reachable. See resume_builder/reference/application_strategy.md.",
|
||||
"applications": [
|
||||
{
|
||||
"company": "Google",
|
||||
"role": "Software Engineer III, Business Home",
|
||||
"application_date": "2026-07-27",
|
||||
"fit_class": "core",
|
||||
"evidence_fit": 89.0,
|
||||
"hard_gate": "pass",
|
||||
"channel": "weak",
|
||||
"outcome": "rejected_no_interview"
|
||||
},
|
||||
{
|
||||
"company": "Aker BP ASA",
|
||||
"role": "Data Product Architect - AI-ready Data Products",
|
||||
"application_date": "2026-07-29",
|
||||
"fit_class": "adjacent",
|
||||
"evidence_fit": 79.0,
|
||||
"hard_gate": "pass",
|
||||
"channel": "weak",
|
||||
"outcome": "rejected_no_interview",
|
||||
"submitted": "2026-07-29",
|
||||
"rejection_date": "2026-08-27"
|
||||
},
|
||||
{
|
||||
"company": "SBB",
|
||||
"role": "Data Engineer (m/w/d), Asset Management Infrastrukturanlagen, Bern",
|
||||
"job_id": "103755",
|
||||
"application_date": "2026-08-25",
|
||||
"fit_class": "core",
|
||||
"evidence_fit": 79.0,
|
||||
"hard_gate": "pass",
|
||||
"channel": "weak",
|
||||
"outcome": "withdrawn_by_candidate",
|
||||
"submitted": "2026-08-25",
|
||||
"open_risk": "Anforderungsniveau K is a capped GAV band, figures not public; seat may read lateral or below current Staff + Component Owner scope.",
|
||||
"interview": {
|
||||
"stage": "Stage 2 of 4 - Virtuelles Kennenlernen mit HR und Fuehrungskraft",
|
||||
"invited": "2026-08-28",
|
||||
"scheduled": "2026-09-09 08:30",
|
||||
"duration_min": 45,
|
||||
"format": "Microsoft Teams",
|
||||
"held": "2026-09-09",
|
||||
"result": "Held 2026-09-09 (HR + Scrum Master). Candidate WITHDREW 2026-09-11 after SBB confirmed there was no room to move on the Einstufung.",
|
||||
"user_read": "User reported 'ein paar Red Flags' and judged that the Rahmenbedingungen do not compensate for them. The specific red flags were NOT captured while fresh - if this is reopened, ask before relying on memory. Leaning negative but explicitly undecided as of 2026-09-10; he asked to leave it open pending SBB's feedback."
|
||||
},
|
||||
"note": "FIRST interview invitation in the evidence-first cohort. Converted from a COLD submit - the published warm contact (Andri Wienandts, +41 79 364 62 53) was never called. The resume never contained Snowflake, dbt or Power BI, the three literals an ATS keyword screen would have keyed on, so a human read the dossier.",
|
||||
"comp_datapoint": "HARD FIGURES, from the interview - supersedes the earlier +10% estimate. Anforderungsniveau K TOPS OUT AT ~CHF 145k. His own position: ~CHF 135k today inside a Swisscom band that runs to ~CHF 160k. So the decisive point was NOT the absolute number but the HEADROOM: he would have had to enter K at its ceiling just to break even, with nothing left above. First hard calibration of a Swiss public-sector band and the reference point for the whole Bern/Thun tier (RUAG, Swissgrid, BKW, BFH, PostFinance).",
|
||||
"withdrawn": "2026-09-11",
|
||||
"why_withdrawn": "Total package was a net DOWNGRADE on four counts: 41h vs 40h week; 25 days holiday + Brueckentage vs 28 + 5 from Zeitautonomie; 3 office days vs 2; and the band ceiling above. Plus a qualitative red flag: he spoke only to HR and the Scrum Master and perceived DIFFICULTIES IN THE TEAM. That one is not fixable by a salary offer - note it if SBB or a similar Bern-tier seat comes back.",
|
||||
"lesson": "SBB-SPECIFIC targeting rule (user 2026-09-11): at SBB, Anforderungsniveau K is too low - aim at Niveau L and/or Kader. NARROWED the same day at the user's instruction: Anforderungsniveau is SBB's OWN system (https://company.sbb.ch/de/jobs-karriere/arbeitgeberin/lohn.html) and does NOT generalise - jobs.admin.ch uses Lohnklassen, RUAG its own scheme, PostFinance per-posting bands. ~145k is an SBB ceiling, not a tier anchor. THUN-AREA EMPLOYERS (RUAG, Kdo Cy) ARE EXPLICITLY OUT of this reasoning: near-zero commute plus benefits a band does not show - he named childcare-cost coverage at the Schweizer Armee/Kdo Cy as potentially far more generous (UNVERIFIED - ask). Never decline a Thun-area role on band alone. What DOES generalise: judge by headroom in the band, and price the total package (working time, holiday, office days), not the entry number."
|
||||
},
|
||||
{
|
||||
"company": "Citadel Securities",
|
||||
"role": "Platform Engineer, Research Platform Engineering (Zurich/NY/Miami)",
|
||||
"application_date": "2026-08-26",
|
||||
"fit_class": "adjacent",
|
||||
"evidence_fit": 71.0,
|
||||
"hard_gate": "pass",
|
||||
"channel": "weak",
|
||||
"outcome": "applied"
|
||||
},
|
||||
{
|
||||
"company": "Schweizer Armee - Kommando Cyber",
|
||||
"role": "DevOps Engineer III (Data Platform)",
|
||||
"application_date": "2026-08-27",
|
||||
"fit_class": "core",
|
||||
"evidence_fit": 79.0,
|
||||
"hard_gate": "pass",
|
||||
"channel": "weak",
|
||||
"outcome": "rejected_no_interview",
|
||||
"submitted": "2026-08-27",
|
||||
"rejection_date": "2026-09-10",
|
||||
"days_to_disposition": 14,
|
||||
"note": "Form-letter rejection from Besarta Mehmeti, no interview, 14 days to disposition - the fastest in the log after Google Business Home. The letter is boilerplate ('Profil und unsere Kriterien nicht in allen Punkten uebereinstimmen') and carries ZERO diagnostic content, so it is not a signal about the package and is no reason to re-audit it. Same disposition class as Microsoft ISE, Google Business Home and Aker BP: a cold-channel no-interview rejection does not implicate document quality on its own. WORTH WATCHING, NOT CONCLUDING: this row and the SBB row are identical on every recorded dimension - core, Evidence Fit 79, hard gate pass, Document Quality 92, channel weak - and they went opposite ways (SBB converted to an interview, this died in 14 days). That shows the fit score did not discriminate; it does NOT show what did. n=1 on each side. Do not react with positioning changes (application_strategy.md 38/74). Channel note: Marcel Matthey-Doret (+41 58 46 78409) was published and never called - the fourth published, reachable contact left unused after Heinzen (RUAG), Wienandts (SBB) and Marthinsen (Aker BP). Consistent with the 2026-09-05 channel policy, but NOT evidence for it: the single interview in this log came from a cold submit."
|
||||
},
|
||||
{
|
||||
"company": "RUAG MRO Holding AG (Business Area C5I)",
|
||||
"role": "AI Engineer C5I (w/m/d), Thun",
|
||||
"application_date": "2026-08-27",
|
||||
"fit_class": "stretch",
|
||||
"evidence_fit": 74.0,
|
||||
"hard_gate": "fail",
|
||||
"channel": "weak",
|
||||
"outcome": "applied"
|
||||
},
|
||||
{
|
||||
"company": "NVIDIA",
|
||||
"role": "Senior DevOps Engineer, Zurich (JR2024256)",
|
||||
"application_date": "2026-09-05",
|
||||
"fit_class": "stretch",
|
||||
"evidence_fit": 64.0,
|
||||
"hard_gate": "fail",
|
||||
"channel": "weak",
|
||||
"outcome": "applied"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
# Python frameworks and enterprise SaaS/SSO — user clarification
|
||||
|
||||
Source: direct user message, 2026-09-18, in response to the job scout fit review.
|
||||
|
||||
Verbatim:
|
||||
|
||||
> i used django, flask and fastAPI for private/hobby projects but not professionally. And i did not administer enterprise SaaS/SSO
|
||||
|
||||
Established facts:
|
||||
|
||||
- Django, Flask and FastAPI have been used in private/hobby projects.
|
||||
- None of these three frameworks has been used professionally.
|
||||
- Enterprise SaaS/SSO administration has not been performed.
|
||||
|
||||
Not established: framework-project names, dates, depth, individual ownership scope, scale, deployment status, or whether OAuth/SCIM/Okta were encountered outside enterprise administration. Do not associate framework use with an existing named project without confirmation.
|
||||
|
||||
Canonical destination: PP-4 and the matching skill entries in `resume_builder/canonical/claims.json`. This user clarification supersedes the earlier unverified-framework classification in `thiessen_cv_master_profile.md`; that historical extraction remains unchanged.
|
||||
@@ -0,0 +1,16 @@
|
||||
# Data-product design and frontend — user clarification
|
||||
|
||||
Source: direct user message, 2026-10-03, during the Google Commerce fit check.
|
||||
|
||||
Verbatim:
|
||||
|
||||
> NAja, Data Modelling in der aktuellen Position, also entwurf data product und umsetzung. Frontend: Nein
|
||||
|
||||
Established facts:
|
||||
|
||||
- The current Swisscom position includes data modelling, design of data products and their implementation (SW-7).
|
||||
- The user answered no to frontend experience. Do not claim frontend/UI-development experience or position him as a Full Stack specialist on the basis of backend JavaScript, UI testing, a thesis title or a personal dashboard.
|
||||
|
||||
Not established: the exact duration of design work, the date it began, broader software-architecture scope, or particular frontend technologies. The answer does not erase historical JavaScript backend development or Selenium UI-test automation.
|
||||
|
||||
Canonical destination: SW-7, relational data modelling, and the frontend-development exclusion in `resume_builder/canonical/claims.json`.
|
||||
@@ -0,0 +1,21 @@
|
||||
# Embedded coursework and current unit testing — user clarification
|
||||
|
||||
Source: direct user messages, 2026-10-08, during the Kongsberg Seatex *Lead Engineer, DevOps and Test Infrastructure* fit check.
|
||||
|
||||
Verbatim:
|
||||
|
||||
> no embedded work since my studies. But nevertheless, lets try
|
||||
|
||||
Answering *"What embedded work did you do during your studies? Course or project, language, hardware?"* and *"Do you write tests today? ... Which frameworks, such as pytest?"*:
|
||||
|
||||
> 1. Embedded Systems - Using C / C++ and VHDL (with an ARM platform). We also had Robotics. 2. Unit Tests, yes - pytest is known.
|
||||
|
||||
Established facts:
|
||||
|
||||
- During his studies at Universität der Bundeswehr München he took **Embedded Systems**, working in **C/C++ and VHDL** with an **ARM platform**, and had **Robotics** as a subject.
|
||||
- He has done **no embedded work since his studies** — there is no professional embedded experience.
|
||||
- He **writes unit tests** today (the question asked about current practice at Swisscom), and he knows **pytest**.
|
||||
|
||||
Not established: which degree (B.Eng. or M.Eng.) the courses belonged to; whether they were lectures, labs or a project; the specific board, FPGA or toolchain; any grade or outcome; whether pytest is the framework used at Swisscom (he named it as known, in answer to "which frameworks"); test scope, coverage or CI integration of the Swisscom unit tests.
|
||||
|
||||
Canonical destination: claims ED-1 and SW-9, skills `embedded systems (coursework)`, `VHDL`, `robotics (coursework)`, `pytest`, `unit testing` in `resume_builder/canonical/claims.json`.
|
||||
@@ -0,0 +1,43 @@
|
||||
# Junior mentoring, Spotfire and SDMX — user clarification
|
||||
|
||||
Source: direct user message, 2026-10-14, during the scout triage of BIS Basel jr100498 *Senior/Lead Data & Analytics Engineer* (MED IT).
|
||||
|
||||
Questions asked: (a) SDMX / official-statistics experience? (b) anything stronger than the Bosch student supervision (BS-7) for the JD line *"Experience providing general supervision and task-specific guidance to junior colleagues"*? (c) register Spotfire as a canonical skill?
|
||||
|
||||
Verbatim:
|
||||
|
||||
> a. no experience with sdmx b. i did onboarding & mentoring of junior developers at Bosch and Swisscmo c. ok, add it.
|
||||
|
||||
("Swisscmo" is a typo for Swisscom.)
|
||||
|
||||
Established facts:
|
||||
|
||||
- **No SDMX experience.** SDMX (Statistical Data and Metadata eXchange) has not been used.
|
||||
- He **onboarded and mentored junior developers** at **Bosch** (2020-2022) and at **Swisscom** (2023-present). This is separate from, and in addition to, the student/thesis supervision already recorded in BS-7.
|
||||
- **TIBCO Spotfire** is to be registered as a canonical skill. The evidence already exists in BS-5 (co-owned the Spotfire environment, technical Application Owner, C# extensions, TAF 2022 co-presentation) and BS-8 (spatial wafer-data visualization with Spotfire map charts). Like Jenkins and GitLab CI/CD on 2026-10-08, it was evidenced in claim scopes but absent from the `skills` array, so no skills line could cite it.
|
||||
|
||||
Not established: how many junior developers; whether mentoring was a formal assignment (buddy/mentor programme) or informal; which Swisscom unit (ART B2B or ART DPT) the Swisscom mentoring belongs to, so whether it is current; the content of the onboarding (codebase, tooling, domain); any outcome. None of this is people management or line responsibility.
|
||||
|
||||
Canonical destination: new claims **BS-9** (Bosch) and **SW-10** (Swisscom), one per employer to keep the ID-prefix employer attribution; skill `TIBCO Spotfire` (`production-historical`, `allowed`); skill `SDMX` (`none`, `forbidden`) in `resume_builder/canonical/claims.json`.
|
||||
|
||||
## Follow-up, same day: project planning
|
||||
|
||||
Question asked (for the JD line *"Ability to plan and manage small project assignments within agreed cost, time, and quality parameters"*): *"Have you planned or run a bounded project with a schedule, budget or quality target - e.g. the ELK PoC, the Bosch ML rollout, or a Swisscom migration workstream? Any steering-committee or status reporting?"*
|
||||
|
||||
Verbatim answer:
|
||||
|
||||
> 1. schedule yes, budget no
|
||||
|
||||
Established: he has planned and run bounded project work against a **schedule**. He has had **no budget responsibility**.
|
||||
|
||||
Not established: which project(s) or employer this refers to; quality targets; steering-committee or status reporting (not answered). Because no employer or project is attached, this is **not** recorded as a canonical claim and is not written into any bullet. Ask which project before using it.
|
||||
|
||||
## Follow-up, 2026-10-15: requirements with differing stakeholders (BIS portal question)
|
||||
|
||||
Asked for a specific example of translating requirements while managing differing stakeholder perspectives. Verbatim answer:
|
||||
|
||||
> 1. Swisscom B2B data product 2. Business (b2b), Architects, Engineers 3. If requirements cant be completed I like to make a prototype and propose that. Than iterate on my prototype instead of waiting to completely find an agreement / finish requirements. 4. needed some more iterations but in my opinion the result was achieved much faster
|
||||
|
||||
Established: on a Swisscom B2B data product (SW-4 context, ART B2B, past), the stakeholders were B2B business, architects and engineers, and the requirements could not be completed up front. His approach was to build a prototype, propose it, and iterate on it rather than wait for full agreement or finished requirements. It took more iterations, but in his assessment the result was reached much faster.
|
||||
|
||||
Not established: which data product; what exactly the stakeholders disagreed about; any measured time saving ("much faster" is his opinion).
|
||||
@@ -0,0 +1,41 @@
|
||||
# Software design and architecture at Bosch and Swisscom — user clarification
|
||||
|
||||
Source: direct user message, 2026-10-21, during the Google *Staff Software Engineer, Shopping Graph*
|
||||
fit check. The posting's minimum qualification under test was *"3 years of experience with software
|
||||
design and architecture."*
|
||||
|
||||
Question asked: since when he has done software design or architecture work, e.g. how long he designed
|
||||
services and integrations at Bosch and since when he has designed data products at Swisscom.
|
||||
|
||||
Verbatim:
|
||||
|
||||
> Yeah, I mean... Software Design and Architecture (for Data Products, for ingestion/inference scripts at Bosch) were part and my work at Swisscom and Bosch can consider this.
|
||||
|
||||
Established facts:
|
||||
|
||||
- **Bosch (2020-02 to 2022-12):** software design and architecture were part of his work, for the
|
||||
**ingestion and inference scripts** he built. "Scripts" is his word; the statement does not extend
|
||||
`designed` to the Bosch data services in general. This pairs with BS-1 (the Zeugnis's
|
||||
*"Erarbeitung und Durchfuehrung von Integrationsstrategien"* for ML models in the 24/7 fab) and BS-2
|
||||
(data services in Python/Java/C# over Oracle and Hadoop/Impala).
|
||||
- **Swisscom (2023-10 to present):** software design and architecture were part of his work, for
|
||||
**data products** (SW-7; the 2026-10-03 clarification already established design of data products as
|
||||
current work).
|
||||
- The user states that his work at both employers can be counted toward a "years of software design and
|
||||
architecture" requirement. Bosch alone spans 2 years 11 months (elapsed time). Together with the
|
||||
Swisscom data-product design, the total exceeds three years.
|
||||
|
||||
Not established:
|
||||
|
||||
- The date design work began at Swisscom. The ART B2B / ART DPT switch date stays deliberately unrecorded,
|
||||
so never date it.
|
||||
- Any architecture role or title, any company-wide or cross-organisation architecture authority, and any
|
||||
architecture-governance or design-authority function. Design is scoped to **his own** ingestion and
|
||||
inference scripts, the inference integration (BS-1) and his data products.
|
||||
- The architecture of shared platforms (the Data Mesh, ODP-Flow, the Bosch fab IT architecture). Scope
|
||||
Discipline still applies: he designed his components inside them, never the platforms themselves.
|
||||
- Full-time-equivalent years. The year count is elapsed time, consistent with the D3 ruling on Bosch
|
||||
part-time.
|
||||
|
||||
Canonical destination: BS-1, BS-2 and SW-7 scope notes, plus `designed` as an allowed verb on BS-1 and
|
||||
BS-2 for his own scripts only, in `resume_builder/canonical/claims.json`.
|
||||
@@ -0,0 +1,66 @@
|
||||
# On-duty alerting, networking and Bosch GPUs — user clarification
|
||||
|
||||
Source: direct user message, 2026-10-22, during the NVIDIA *Senior Production Engineer, DGX Cloud*
|
||||
(JR2027105) fit check. Three questions were asked because the KB has repeatedly under-recorded
|
||||
ordinary operations work (Ansible, Linux, Bash, Kotlin, Jenkins/GitLab).
|
||||
|
||||
## Questions and verbatim answers
|
||||
|
||||
1. *Monitoring in your current Swisscom unit: do you monitor or get alerted on your Glue/Airflow
|
||||
pipelines (CloudWatch alarms, failure alerts, dashboards)? Is there on-call in your current team?*
|
||||
|
||||
> Yes, we get alerted ... we are using opsgenie and we have a engineer on duty role which rotates.
|
||||
> Bugs and Alerts also automatically create Jira issue tickets which we dann asign an fix.
|
||||
|
||||
2. *Networking at work: any AWS VPC, security group or private-endpoint work at Swisscom, or firewall,
|
||||
DNS, proxy or load-balancer work at Bosch?*
|
||||
|
||||
> No, not really - probably only my AWS solution architect cert covers AWS network topics... but day
|
||||
> to day work is using automated landing zones.
|
||||
|
||||
3. *GPUs at Bosch: did the ML inference containers run on GPUs?*
|
||||
|
||||
> The ML inference did ran on NVIDIA GPUs (using CUDA for performance boost - but i never did much
|
||||
> configuration there)
|
||||
|
||||
## Follow-up questions and verbatim answers (same day)
|
||||
|
||||
4. *Bosch monitoring PoC: your earlier CV says it also included Grafana, Prometheus and Loki; the Bosch
|
||||
reference letter only mentions ELK. Correct?* and 5. *Do you also write or adjust the alerts for your
|
||||
own pipelines, or only respond to them?*
|
||||
|
||||
> 1. both are correct 2. yes, i wrote e.g. thresholds for data quality etc....
|
||||
|
||||
## Established facts
|
||||
|
||||
- **BS-4 stack:** the Bosch PoC covered ELK and Kafka plus monitoring and alerting with Grafana,
|
||||
Prometheus and Loki. It is still a proof of concept.
|
||||
- **SW-11 alert definitions:** he defines alert thresholds for his own pipelines; data-quality
|
||||
thresholds are the named example. Other alert types are not established.
|
||||
|
||||
- **Current on-duty (new claim SW-11):** his current Swisscom team uses Opsgenie for alerting and has a
|
||||
rotating engineer-on-duty role that he takes part in. Bugs and alerts automatically create Jira
|
||||
tickets, which the team assigns and fixes. This is the current counterpart of the past SW-2 on-call
|
||||
at ART B2B.
|
||||
- **Networking (skill `networking`, certification context only):** no professional network
|
||||
configuration. AWS networking is covered by the AWS Certified Solutions Architect – Associate
|
||||
(26 Sep 2024, active). At work he uses automated AWS landing zones that the platform provides.
|
||||
- **Bosch GPUs (BS-1 scope):** the containerized ML inference he integrated ran on NVIDIA GPUs, with
|
||||
CUDA used for acceleration. He did little CUDA or GPU configuration himself.
|
||||
|
||||
## Not established
|
||||
|
||||
- Who built or configured the alerting, the Opsgenie routing or the Jira automation.
|
||||
- Which metrics or logs feed the alerts; SLIs, SLOs or error budgets at Swisscom.
|
||||
- Incident counts, response times, MTTR or availability figures.
|
||||
- Whether the on-duty role covers nights and weekends (do not write 24/7).
|
||||
- Any professional VPC, security-group, firewall, DNS, proxy or load-balancer work.
|
||||
- Building or designing landing zones or network topology.
|
||||
- CUDA programming or configuration, GPU tuning or GPU performance analysis. GPU model, count and
|
||||
serving framework at Bosch.
|
||||
|
||||
## Canonical destination
|
||||
|
||||
`claims.json`: new claim **SW-11**; **BS-1** scope and forbidden list; skills **Opsgenie**
|
||||
(allowed-with-context), **CUDA** (forbidden; system context only) and **networking**
|
||||
(certification-context-only).
|
||||
@@ -1,5 +1,10 @@
|
||||
# Session: Bank for International Settlements — Senior Data & Analytics Engineer – Artificial Intelligence
|
||||
|
||||
> **Abgeschlossen – Absage erhalten am 11.09.2026**, vom Nutzer gemeldet.
|
||||
> Kein Interview im bisherigen Verlauf dokumentiert; Absagegrund nicht genannt.
|
||||
> Aktueller Status: `job_scout/state/applications.json`, Eintrag `app-7c94f6a9d318`.
|
||||
> Die folgenden Angaben dokumentieren die damalige Bewerbungsvorbereitung.
|
||||
|
||||
## JD Info
|
||||
|
||||
- **File:** JDs/bis_senior_data_analytics_ai.txt
|
||||
|
||||
@@ -0,0 +1,111 @@
|
||||
Senior/Lead Data & Analytics Engineer - Basel, Switzerland
|
||||
Employer: Bank for International Settlements (BIS), Monetary and Economic Department (MED), MED IT unit / MED Data Engineering
|
||||
Requisition: jr100498
|
||||
URL: https://www.bis.org/vacancy/jr100498
|
||||
Retrieved: 2026-10-14 via headless Chromium (job_scout .venv Playwright), rendered page text. Verbatim body below; site navigation and footer removed, nothing else changed.
|
||||
Posting status: LIVE on 2026-10-14 (posted 12 Oct 2026, deadline 02 Nov 2026 end of day)
|
||||
-----
|
||||
|
||||
Application deadline: 02 Nov 2026
|
||||
Senior/Lead Data & Analytics Engineer - Basel, Switzerland
|
||||
Apply now
|
||||
|
||||
|
||||
|
||||
GEOGRAPHICAL LOCATION
|
||||
|
||||
Basel, Switzerland
|
||||
|
||||
LOCATION
|
||||
|
||||
BIS Headquarters Basel
|
||||
|
||||
DEPARTMENT
|
||||
|
||||
MED Data Engineering
|
||||
|
||||
DATE POSTED
|
||||
|
||||
12 Oct 2026
|
||||
|
||||
APPLICATION DEADLINE
|
||||
|
||||
02 Nov 2026
|
||||
|
||||
CONTRACT DURATION
|
||||
|
||||
3 years
|
||||
|
||||
The Bank for International Settlements (BIS) is hiring a Senior/Lead Data & Analytics Engineer within the Monetary and Economic Department, MED IT unit.
|
||||
|
||||
Application deadline: Please note that the deadline for applications is Monday 2 November 2026 at the end of day.
|
||||
|
||||
Please note that this role is offered as a three-year fixed term contract.
|
||||
|
||||
This role is based in Basel, Switzerland; however, thanks to our status as an international organization, we can hire globally and welcome applications from candidates of all nationalities and located anywhere in the world. Relocation support is available for the successful candidate and their dependent family members.
|
||||
|
||||
|
||||
|
||||
Purpose of the job:
|
||||
|
||||
The mission of the BIS is to support central banks' pursuit of monetary and financial stability through international cooperation, and to act as a bank for central banks.
|
||||
|
||||
The Monetary Economic Department (MED) supports this mission by gathering and analysing a large array of data and statistics on global financial systems and macro-/micro-economic activity. From this, we generate a variety of insights that are used and relied upon by central banks, financial regulatory institutions, and other stakeholders around the world. Indeed, some of the source data sets we work with and the ways in which we combine them are unique to our organisation.
|
||||
|
||||
But we know that our full potential is yet to be achieved. Our aim is to collect a wider variety of data and harness new technology to generate more powerful insights. This is a chance to be involved in a step change in our capability.
|
||||
|
||||
|
||||
|
||||
By joining the MED IT team, you will:
|
||||
|
||||
Directly contribute to our mission as a part of a collaborative team who are solving a range of complex data and software challenges, including data management, advanced analytics, and business intelligence.
|
||||
Lead the design and delivery of data and analytics applications, platforms, interfaces, and services that support the Bank’s strategic objectives.
|
||||
Shape data-driven solutions by translating complex business needs into effective architectures, insights, and technology improvements.
|
||||
Help us explore and exploit cutting-edge technologies, including AI and Machine Learning, Lakehouse engineering, high-performance computing, Kubernetes ecosystems, and big data platforms.
|
||||
Find yourself looking outwards and collaborating; not just among the team but with expert economists, technologists, data scientists and statisticians – and counterparts in other international organisations and central banks.
|
||||
|
||||
|
||||
|
||||
Principal Accountabilities:
|
||||
|
||||
Partner with MED stakeholders to define and implement the IT strategy and target architecture for statistical and analytical applications, ensuring alignment with security, IT governance, and data management standards.
|
||||
Gather business requirements and translate into IT solutions.
|
||||
Lead the design and implementation of data and analytics applications, interfaces, and services.
|
||||
Support official-statistics data collection and dissemination programmes, international data standards, particularly the Bank’s SDMx activities.
|
||||
Oversee data collection mechanisms and their alignment with data architecture, working with internal and external stakeholders to maintain data quality and accuracy.
|
||||
Apply advanced, responsible AI/ML methodologies to streamline, automate, and enhance business operations and processes (e.g., document processing, anomaly detection, forecasting).
|
||||
Provide technical guidance and end-user support, oversee production support activities, and ensure timely resolution of issues.
|
||||
Support IT project and product management, including resource planning, delivery tracking, and preparation of materials for IT steering committees.
|
||||
Maintain effective stakeholder relationships, support junior colleagues, and represent the BIS at external events when required.
|
||||
Maintain professional knowledge of data and analytics engineering, technology, regulation, and industry best practice through ongoing development and external engagement.
|
||||
|
||||
|
||||
|
||||
Qualifications, skills and experience:
|
||||
|
||||
Bachelor’s degree or equivalent qualification.
|
||||
More than six years’ relevant experience, including substantial experience in data and analytics engineering or a related field.
|
||||
Experience providing general supervision and task-specific guidance to junior colleagues.
|
||||
Advanced ability to acquire, organise, protect, process, and analyse data, identifying patterns, trends, and insights to support decision-making.
|
||||
Proficiency in querying databases, using database reporting and business intelligence tools, and working with query languages and data conversion techniques.
|
||||
Experience analysing, modelling, and documenting data flows, state changes, processes, requirements, use cases, and user stories.
|
||||
Ability to design architectures that incorporate system and service requirements and to develop software using relevant programming languages.
|
||||
Ability to plan and manage small project assignments within agreed cost, time, and quality parameters.
|
||||
Ability to interpret and apply policies and procedures in alignment with organisational strategy and objectives.
|
||||
Strong stakeholder-management, communication, problem-solving, and technical-support skills.
|
||||
|
||||
Please note that the BIS's corporate language is English, which is used for all internal and external communication.
|
||||
|
||||
|
||||
|
||||
Who we are:
|
||||
|
||||
Internationalism is at the core of our identity and the best representation of this is our workforce. With employees from over 66 countries and offices in nine locations, the BIS is a global organisation with a truly international workforce. By joining us, you will work in a unique, highly rewarding, and international work environment. We are committed to equal opportunities at the BIS and aim to build a workforce that reflects our global membership. We strive to attract the best talent and foster an inclusive environment. We welcome applications from all qualified candidates, including those with a breadth of professional experience. You can discover more about our inclusive working environment here.
|
||||
|
||||
|
||||
|
||||
What the BIS offers:
|
||||
|
||||
We want your time at BIS to be a rewarding and career-enriching experience. We offer an agile and flexible working environment with hybrid working opportunities including home office and working from abroad days. To support our international applicants, we offer relocation support that extends to your dependent family members. In addition, we offer a competitive compensation and benefits package, including support for working families including childcare and education allowances (where applicable). Finally, we offer a genuinely unique international working environment, which will give you exposure to the global financial system and the opportunity to collaborate with passionate experts from all over the world.
|
||||
|
||||
#LI-FC1
|
||||
+145
@@ -0,0 +1,145 @@
|
||||
# Critique: BIS Basel — Senior/Lead Data & Analytics Engineer (MED IT, jr100498)
|
||||
|
||||
Date: 2026-10-14. Rubric: `critique_framework.md` (2026-09-11).
|
||||
Documents: `e2e_bis_senior_lead_data_analytics_engineer_resume.tex/.pdf`, `e2e_bis_senior_lead_data_analytics_engineer_cover_letter.tex/.pdf`.
|
||||
JD: `JD_bis_senior_lead_data_analytics_engineer.txt`, verbatim, live on 2026-10-14.
|
||||
|
||||
> **Self-review caveat.** This critique was written in the same session that produced the documents. Treat its leniency with suspicion. The claim audit below was done line by line against `claims.json`, not against the session plan.
|
||||
|
||||
## 1. Fit verdict and hard gates
|
||||
|
||||
**Core. Hard gate PASS.** No required qualification is a Gap.
|
||||
|
||||
| Gate check | Result |
|
||||
|---|---|
|
||||
| Minimum/required qualification a Gap? | No. Nine of ten Direct. Q8 (*"plan and manage small project assignments within agreed cost, time, and quality parameters"*) is Adjacent: the user confirmed schedule responsibility but **no budget responsibility**, and no project is attributed, so nothing on the page shows it. |
|
||||
| Title-defining capability not Direct? | No. Data and analytics engineering is Direct (SW-1/2/4/7, BS-2/3/8). |
|
||||
| Level needs absent scope? | No. "Lead" asks for supervision and guidance of juniors, not line management. BS-9/SW-10 (onboarding and mentoring) plus BS-7 cover it, though unquantified. |
|
||||
| Location / authorization / relocation unresolved? | No. Basel is about 90 min from Thun, and memory accepts the commute for BIS tax-free pay. Office days are not stated, so ask at first contact. The 3-year fixed term against his permanent Swisscom post is a real trade-off for the user to weigh, not a gate. |
|
||||
|
||||
## 2. Evidence Fit — 78/100 (Core)
|
||||
|
||||
| Dimension | Weight | Score | Reason |
|
||||
|---|---:|---:|---|
|
||||
| Required qualifications | 35 | 31 | Direct: degree, >6 yrs, junior guidance, data handling, querying + BI, modelling/documenting flows and user stories, design + development, policies, stakeholders/support. Adjacent: project planning (no cost/budget). |
|
||||
| Core responsibilities | 25 | 18 | Direct: lead design/delivery within his scope, requirements → solutions, data collection and quality, production support, external events (TAF 2022). Gap: SDMX / official-statistics programmes. Adjacent: IT strategy and target architecture for MED, steering-committee material, AI/ML (integration and a PoC, not model work). |
|
||||
| Level and ownership | 15 | 11 | Staff title, component and application owner, mentors juniors. Design authority beyond his own data products is not established. |
|
||||
| Recency and depth | 10 | 8 | Lakehouse data-product work is current. BI evidence is 2020–22 (Spotfire) and ART B2B (dashboards); both are past. |
|
||||
| Domain/tool transfer | 10 | 6 | Central-bank / official-statistics domain is new. SDMX and HPC absent. Python/SQL/lakehouse/Kubernetes transfer directly. |
|
||||
| Practical constraints | 5 | 4 | Commute workable; office days unknown; fixed term. |
|
||||
|
||||
Unchanged from the session's pre-critique score. Nothing in the documents changes the fit.
|
||||
|
||||
## 3. Document Quality — 86/100 (resume)
|
||||
|
||||
| Dimension | Weight | Score | Reason |
|
||||
|---|---:|---:|---|
|
||||
| Truth and provenance | 25 | 24 | Every bullet traces to a canonical claim within scope (audit in §6). −1: the skills block lists historical tools (Kafka, Kubernetes, Ansible) without a recency mark while the Programming line marks Java/C#/Kotlin "historical". This is inconsistent, and a reader may take Kafka/Kubernetes as current. The 2026-09-15 log specifically warns against presenting Swisscom Kubernetes/Kafka as current. |
|
||||
| Information hierarchy | 20 | 17 | Clean employer/title/date hierarchy, with promotions shown at Swisscom and Bosch. Experience starts at 45.8% of page 1, which is fine. The skills block renders at 9 lines, just over the 4–8 guide. The Bosch entry splits 3/2 across pages, which is acceptable. The header-only Bundeswehr line reads as intentional. |
|
||||
| Bullet evidence and impact | 20 | 15 | Specific and scoped, with systems, data types and responsibilities named. No outcomes or metrics anywhere, correctly, since none are verified. The cost is that a "Lead" reader sees activity rather than results. BS-1 is the only bullet with a stated consequence. |
|
||||
| Relevance and terminology | 15 | 12 | Covers data and analytics engineering, BI (Spotfire), data quality, requirements, backlog/user-story work, modelling, lakehouse, Kubernetes, ML and anomaly detection, junior guidance and an external talk. Statistics/SDMX/central-bank vocabulary is honestly absent. "Business intelligence" appears only as "BI". |
|
||||
| Skills evidence | 10 | 9 | All canonical. `pytest` is `allowed-with-context`; its context (unit tests at Swisscom) is carried only by "unit-tested" in the SW-1 bullet, which is acceptable but thin. |
|
||||
| Mechanics/readability | 10 | 9 | Compiles, 2 pages, 0 box warnings, parses in order, validator 0 cadence warnings. Triples are in about 5 of 13 bullets, under half. −1: three bullets open with "Developed" (BS-2, FC-1, VZ-2), and the FC-1/VZ-2 pair is adjacent in reading order. |
|
||||
|
||||
## 4. Channel Strength — Weak
|
||||
|
||||
Tailored cold application. No named contact is published; the only lead is the `#LI-FC1` LinkedIn recruiter tag. BIS says it hires globally, so a cold pool will be large. The last BIS cold submit (jr100429) was rejected without interview.
|
||||
|
||||
Warm actions, in order of cost:
|
||||
1. Search LinkedIn for BIS talent acquisition with initials F.C. (the `#LI-FC1` tag) and send a 3-line note naming jr100498.
|
||||
2. Search LinkedIn for "Bank for International Settlements" + "MED" / "Monetary and Economic Department" + data engineer, to find a team member for a short question about the role.
|
||||
3. Check for former Swisscom, Bosch or Fraunhofer colleagues now at BIS.
|
||||
|
||||
## 5. Competitive read and reader sequence
|
||||
|
||||
- **Obvious-fit competitor:** a data engineer from a central bank, statistical office or regulator, with SDMX collection/dissemination work and BI for economists.
|
||||
- **Dennis's real advantage:** the modern lakehouse stack the posting wants to explore, in current hands-on use; production ownership with governance and on-call; relational modelling of governed data products with metadata and lineage; a demonstrated habit of building close to domain specialists (fab engineers).
|
||||
- **Competitor's real advantage:** SDMX and statistics-domain fluency; a central-bank network; experience with economists as users. A bridge is not worth as much as that direct evidence.
|
||||
|
||||
| Reader | Verdict | Reason / first challenge |
|
||||
|---|---|---|
|
||||
| Parser/ATS | Pass | Clean text extraction. Plain-text mode groups "employer + title" then "dates + location", which is normal for this template. Core terms present; SDMX absent (true). |
|
||||
| Recruiter glance | Forward | 11 years visible, Staff title, "Data, Analytics & AI Engineer" maps to the req title, Swiss-based, English. |
|
||||
| Hiring manager (MED IT) | Maybe → Interview | Strong engineering and stack. Doubts: no statistics/central-bank domain; "Lead" evidence is mentoring rather than leading delivery for a business unit. |
|
||||
| Technical reviewer | Credible | Likely first challenges: how the Glue jobs are unit-tested; what data-quality controls the Teradata ETL had; which tool the Swisscom dashboards were built in (**not recorded in the KB, so prepare an answer**); what the coordinate-system normalisation actually involved. |
|
||||
|
||||
## 6. Claim audit
|
||||
|
||||
| Claim | Canonical ID | Direct/Adjacent | Safe? | Fix |
|
||||
|---|---|---|---|---|
|
||||
| Headline "Staff Data, Analytics & AI Engineer" | SWISSCOM `display_title` | Direct | Yes | — |
|
||||
| Headline "AWS Lakehouse & BI" | SW-1/SW-7; BS-5 | Direct (BI historical) | Yes | Optional: BI is not current work (Tier 2) |
|
||||
| "over ten years in software and data engineering" | Visible record May 2015 → about 11.4 yrs | Direct | Yes | — |
|
||||
| "Currently designs and builds governed relational data products on AWS (Glue, Iceberg, Athena)" | SW-7, SW-1 | Direct | Yes | — |
|
||||
| "technical Application Owner for the fab's Spotfire analytics environment" | BS-5, BS-3 | Direct | Yes | — |
|
||||
| Skills: Kafka, Kubernetes, Ansible unmarked | skills (production-historical) | Direct, historical | Yes, but recency is ambiguous | Tier 2 #1 |
|
||||
| Skills: Oracle Database, Teradata, Hadoop/Impala, Spotfire | skills, registered 2026-10-14 from SW-2/BS-2/BS-5/BS-8 | Direct, historical | Yes | — |
|
||||
| Skills: pytest | skills (allowed-with-context, SW-9) | Direct | Yes (context via SW-1 bullet) | — |
|
||||
| SW-7 bullet | SW-7 | Direct | Yes; "within Swisscom's company-wide Data Mesh" keeps scope | — |
|
||||
| SW-1 bullet: "in owned domains … contributing to Swisscom's wider cloud migration" | SW-1, SW-6, SW-9 | Direct | Yes | — |
|
||||
| SW-2 bullet (past tense) | SW-2 | Direct | Yes | — |
|
||||
| SW-4 bullet: "Translated … requirements into data products and dashboards; shaped and prioritised backlog items" | SW-4, SW-3 | Direct | Yes (both ART B2B, past) | Prepare: dashboard tool name |
|
||||
| "Onboarded and mentored junior developers" (Swisscom) | SW-10 | Direct | Yes; past tense because phase not recorded | — |
|
||||
| BS-3/5 bullet, "co-owned TIBCO Spotfire environment" | BS-3, BS-5 | Direct | Yes | — |
|
||||
| BS-2 bullet | BS-2 | Direct | Yes | — |
|
||||
| BS-8 bullet: "including performance tuning; co-presented … TIBCO Analytics Forum 2022" | BS-8, BS-5 | Direct | Yes. Tuning stated at canonical level, no query/index claim | — |
|
||||
| BS-1/4 bullet: failure-consequence wording; "proof of concept" | BS-1, BS-4 | Direct | Yes. No model-training claim; PoC labelled | — |
|
||||
| BS-9/7 bullet: "one Bachelor thesis" | BS-9, BS-7 | Direct | Yes; not pluralised | — |
|
||||
| FC-1 bullet (no quality-gate claim) | FC-1 | Direct | Yes | — |
|
||||
| VZ-2 bullet | VZ-2 | Direct | Yes | Tier 2 #3 (verb) |
|
||||
| GN-1 bullet | GN-1 | Direct | Yes | — |
|
||||
| Bundeswehr header line | BW-1 | Context only | Yes; no command or clearance claim | — |
|
||||
| Capgemini | document_exclusions | — | Correctly absent | — |
|
||||
|
||||
Forbidden-term scan: validator PASS (no SDMX, LangChain, GitOps, Terraform, Snowflake or global forbidden patterns).
|
||||
|
||||
## 7. Fixes
|
||||
|
||||
**Tier 1 (truth/fit): none.**
|
||||
|
||||
**Tier 2 (presentation, optional):**
|
||||
1. **Skills recency.** Mark historical tools consistently, e.g. "Kafka (historical)" and "Kubernetes, Ansible (historical)", or drop the "historical" label from the Programming line. Recommended: add the marks. It costs no extra line on the Data engineering line; check the Platform line wrap.
|
||||
2. **Headline "AWS Lakehouse & BI".** BI is 2020–22 and ART B2B work. Defensible as identity, but a "Data Quality" or "Data Governance" third term would be current. Low priority.
|
||||
3. **Opening-verb repetition.** VZ-2 directly follows FC-1 and both open "Developed". Reshape VZ-2, e.g. "Automated product testing with test suites wired into the CI/CD pipeline as quality gates."
|
||||
|
||||
**Interview preparation (not document changes):**
|
||||
- Name the Swisscom dashboard tool (SW-4); the KB does not record it.
|
||||
- Have one attributed example for "schedule yes, budget no" (Q8). Recording which project it was would also let it enter `claims.json`.
|
||||
- Prepare an honest SDMX answer: never used; how data collection, validation and metadata work in SW-2/SW-7 maps to it; how you would learn the standard.
|
||||
- Prepare a "Lead" story: a design you drove end to end within your own data products, plus how you guide juniors.
|
||||
- Decide in advance how you weigh a 3-year fixed term against the permanent Swisscom post.
|
||||
|
||||
## 8. Cover letter
|
||||
|
||||
- **Should it exist?** Yes. BIS is a mission-led international institution, the portal accepted a letter for jr100429, and the letter adds motivation the resume cannot show.
|
||||
- **Adds information:** yes. It explains why MED (data central banks and regulators rely on), and a working style built close to domain specialists, tied to MED's economists and statisticians. Paragraph 1 was rewritten before review because the first draft reworded two resume bullets.
|
||||
- **Hooks:** only the posting itself (first-party, saved verbatim). No unverified programme, product or statistic.
|
||||
- **Claims:** all present in both `claims.json` and the resume; "co-owned" Spotfire kept; mentoring tense-safe.
|
||||
- **Weaknesses:** "Dear Hiring Team" is unavoidable without a contact. The Lead dimension is carried only by mentoring. The literal date must be updated at submission.
|
||||
- **Would deleting it improve the application?** No.
|
||||
- Length: 237 words, one page, 0 box warnings.
|
||||
|
||||
## 9. Mechanical verification
|
||||
|
||||
- `validate_resume_system.py --document <resume> --document <letter>`: PASS, 0 errors, 0 warnings.
|
||||
- MiKTeX pdflatex, 2 passes each: resume 2 pages, letter 1 page, 0 overfull/underfull boxes.
|
||||
- PDF metadata: Title/Author empty; Producer MiKTeX pdfTeX; no generator-term leakage.
|
||||
- `pdftotext`: header → summary → skills → experience in reverse chronology → Bundeswehr → education; employer/title/date order intact; no LaTeX leaking into text.
|
||||
- `page_metrics.py`: experience starts at 45.8% of page 1; 52 text lines, 408 words on page 1.
|
||||
- Visual: both resume pages and the letter inspected at 80 dpi; no clipping, overlap or isolated headings.
|
||||
|
||||
## Verdict
|
||||
|
||||
**Recommended for submission after a warm-channel attempt**, with or without the three Tier 2 polish items. Core 78, hard gate PASS, Document Quality 86, channel Weak.
|
||||
|
||||
## Re-report after fixes (2026-10-15)
|
||||
|
||||
User: "apply the polish items and finalize".
|
||||
|
||||
| Tier 2 item | Outcome |
|
||||
|---|---|
|
||||
| 1. Skills recency | **Fixed.** "Kafka (historical)"; Platform line now reads "AWS, CloudFormation, Docker; Kubernetes, GitLab CI/CD, Linux, Ansible (historical)". GitLab CI/CD (SW-3/BS-6, both past) and Linux (professional side ended 2022) were moved into the historical group too. pytest moved to the Programming line, where it keeps the Platform line to one rendered line without a hyphenated "(his-torical)". |
|
||||
| 2. Headline | **Fixed.** Now "Staff Data, Analytics & AI Engineer \| Governed Data Products & Pipelines \| AWS Lakehouse": current work only (SW-7, SW-1). |
|
||||
| 3. Opening-verb repetition | **Fixed.** VZ-2 now reads "Automated testing through test suites connected to the CI/CD pipeline as quality gates." |
|
||||
|
||||
Post-fix verification: validator PASS on resume + letter (0 errors, 0 warnings); MiKTeX compile 0 box warnings; resume 2 pages, experience starts at 45.8% of page 1; letter 1 page, date set to 15 October 2026; both inspected at 80 dpi. Document Quality is re-rated **88/100**: truth/provenance +1 (recency now explicit), mechanics +1 (verb repetition gone). Evidence Fit unchanged at 78 (Core); channel unchanged (Weak).
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
% BIS Basel - Senior/Lead Data & Analytics Engineer, MED IT (jr100498). Cover letter.
|
||||
% Claims used: SW-7, SW-2, BS-3/BS-5, BS-2, BS-8, BS-9/SW-10 - all present in the resume.
|
||||
% Employer hook: the posting itself (https://www.bis.org/vacancy/jr100498, saved verbatim in this folder).
|
||||
|
||||
\documentclass[11pt,a4paper]{article}
|
||||
\usepackage[utf8]{inputenc}
|
||||
\usepackage[T1]{fontenc}
|
||||
\usepackage{lmodern}
|
||||
\usepackage[a4paper,left=0.85in,right=0.85in,top=0.7in,bottom=0.7in]{geometry}
|
||||
\usepackage{parskip}
|
||||
\usepackage{xcolor}
|
||||
\usepackage{hyperref}
|
||||
\hypersetup{hidelinks}
|
||||
\pagestyle{empty}
|
||||
\setlength{\parindent}{0pt}
|
||||
|
||||
\begin{document}
|
||||
|
||||
{\Large\bfseries Dennis Thiessen, M.Eng.}\par
|
||||
Bern, Switzerland $\vert$
|
||||
\href{mailto:dennis@thiessen.io}{dennis@thiessen.io} $\vert$ +41 795 955 585 $\vert$
|
||||
\href{https://linkedin.com/in/dennis-thiessen}{LinkedIn}
|
||||
|
||||
\vspace{1.5em}
|
||||
Bank for International Settlements\\
|
||||
Monetary and Economic Department, MED IT\\
|
||||
Basel, Switzerland
|
||||
|
||||
\vspace{1em}
|
||||
% Literal date, set at finalization. Update to the actual sending date if it differs (deadline 2 Nov 2026).
|
||||
15 October 2026
|
||||
|
||||
\vspace{1em}
|
||||
\textbf{Application for Senior/Lead Data \& Analytics Engineer (jr100498)}
|
||||
|
||||
\vspace{0.8em}
|
||||
Dear Hiring Team,
|
||||
|
||||
Your posting describes MED's aim to collect a wider variety of data and use newer technology, including lakehouse engineering, for a step change in capability. That is close to my current work: at Swisscom I build data products on an AWS lakehouse stack with Iceberg and Athena, after owning ETL components that kept business-critical data flowing into a warehouse. The appeal of MED is applying that experience to data that central banks and financial regulators rely on.
|
||||
|
||||
My most useful work has been done close to the specialists who use the data. At Bosch I was technical Application Owner for the co-owned Spotfire environment and the defect management system used by fab engineers, and I built data services for their analysis teams. One of the hardest parts was normalising spatial wafer data across the different coordinate systems of the fab's tools so that it could be analysed together at all. Combining sources that were never designed to fit, for economists and statisticians who depend on the result, is the kind of problem I want to work on.
|
||||
|
||||
I have worked in Germany, Norway and Switzerland and enjoy international teams. At Bosch and Swisscom I have also onboarded and mentored junior developers, which I see as part of a senior role rather than an extra. I would welcome a conversation about how I could contribute to MED's data and analytics engineering.
|
||||
|
||||
Kind regards,
|
||||
|
||||
\vspace{1.5em}
|
||||
Dennis Thiessen
|
||||
|
||||
\end{document}
|
||||
+85
@@ -0,0 +1,85 @@
|
||||
% BIS Basel - Senior/Lead Data & Analytics Engineer, MED IT (jr100498).
|
||||
% International Tech profile, English. Generated 2026-10-14 from claims.json and the
|
||||
% experience files; no historical output used as a source.
|
||||
|
||||
\documentclass{resume}
|
||||
\usepackage[utf8]{inputenc}
|
||||
\usepackage[T1]{fontenc}
|
||||
\usepackage{lmodern}
|
||||
\usepackage[a4paper,left=0.65in,right=0.65in,top=0.55in,bottom=0.55in]{geometry}
|
||||
\usepackage{xcolor}
|
||||
\usepackage{hyperref}
|
||||
\hypersetup{hidelinks}
|
||||
\usepackage[version=4]{mhchem}
|
||||
\usepackage{fancyhdr}
|
||||
\hyphenation{semiconductor}
|
||||
\pagestyle{fancy}
|
||||
\fancyhf{}
|
||||
\renewcommand{\headrulewidth}{0pt}
|
||||
\fancyfoot[R]{\small \thepage/\pageref{LastPage}}
|
||||
|
||||
\name{Dennis Thiessen, M.Eng.}
|
||||
\headline{Staff Data, Analytics \& AI Engineer $\vert$ Governed Data Products \& Pipelines $\vert$ AWS Lakehouse}
|
||||
\contactline{Bern, Switzerland $\vert$ \href{mailto:dennis@thiessen.io}{dennis@thiessen.io} $\vert$ +41 795 955 585 $\vert$ \href{https://linkedin.com/in/dennis-thiessen}{LinkedIn}}
|
||||
|
||||
\begin{document}
|
||||
|
||||
\begin{rSection}{Summary}
|
||||
{\sloppy Data and analytics engineer with over ten years in software and data engineering across telecom, semiconductor manufacturing, research and insurance. Currently designs and builds governed relational data products on AWS (Glue, Iceberg, Athena). Previously at Bosch: technical Application Owner for the fab's Spotfire analytics environment and ML inference integration in 24/7 production.\par}
|
||||
\end{rSection}
|
||||
|
||||
\begin{rSection}{Skills}
|
||||
\skillline{Programming}{Python, SQL, pytest; Java, C\# and Kotlin (professional, historical)}
|
||||
\skillline{Data engineering}{PySpark, Airflow, AWS Glue, Apache Iceberg, Athena, Redshift, Kafka (historical); relational data modelling}
|
||||
\skillline{Databases and BI}{Oracle Database, Teradata data warehouse, Hadoop/Impala; TIBCO Spotfire}
|
||||
\skillline{Platform}{AWS, CloudFormation, Docker; Kubernetes, GitLab CI/CD, Linux, Ansible (historical)}
|
||||
\skillline{Certifications}{AWS Certified Solutions Architect -- Associate; Data Engineering with AWS (Udacity); IBM AI Engineering; iSAQB CPSA-F; ITIL Foundation}
|
||||
\skillline{Languages}{German (native), English (fluent)}
|
||||
\end{rSection}
|
||||
|
||||
\begin{rSection}{Professional Experience}
|
||||
|
||||
\begin{rSubsection}{Swisscom (Schweiz) AG}{Oct 2023 -- Present}{Staff Data, Analytics \& AI Engineer (promoted from Senior, Apr 2025)}{Bern, Switzerland}
|
||||
\item Design and build governed data products within Swisscom's company-wide Data Mesh on AWS: logical and physical relational models, source onboarding, and metadata and lineage in Atlassian Compass.
|
||||
\item Migrated legacy ETL pipelines in owned domains to AWS as unit-tested Python/PySpark Glue jobs on Apache Iceberg, Athena and Airflow, contributing to Swisscom's wider cloud migration.
|
||||
\item Owned the ETL components that loaded business-critical Fulfillment data from Oracle into the Teradata data warehouse. Accountable for data quality and data-protection compliance, root-cause analysis, and 2nd/3rd-level support with on-call duty.
|
||||
\item Translated internal B2B stakeholders' requirements into data products and dashboards; shaped and prioritised backlog items with the Product Owner.
|
||||
\item Onboarded and mentored junior developers.
|
||||
\end{rSubsection}
|
||||
|
||||
\begin{rSubsection}{Robert Bosch Semiconductor Manufacturing Dresden GmbH}{Feb 2020 -- Dec 2022}{Senior Data Engineer, Data Analysis (promoted from Data Engineer, Jan 2021)}{Dresden, Germany}
|
||||
\item Served as technical Application Owner for the KLA Defect Management System and the co-owned TIBCO Spotfire environment, defining SLOs, working with vendors and internal customers, and delivering user training and documentation.
|
||||
\item Developed data services and analysis applications in Python, Java and C\# (including Spotfire extensions) over Oracle and Hadoop/Impala, serving defect-management, wafer-inspection and PCM electrical-parameter data to fab analysis teams.
|
||||
\item Normalised spatial wafer data across the differing coordinate systems of fab tools for analysis in Oracle (SDO\_GEOMETRY) and Spotfire, including performance tuning; co-presented the wafer-map work at TIBCO Analytics Forum 2022.
|
||||
\item Integrated containerised ML inference for image-based defect classification into the continuously operating fab, where a software defect could have halted production; built an ELK/Kafka anomaly-detection proof of concept.
|
||||
\item Mentored junior developers through onboarding, and served as supervisor and second examiner for one Bachelor thesis.
|
||||
\end{rSubsection}
|
||||
|
||||
\begin{rSubsection}{Fraunhofer-Center for Maritime Logistics and Services CML}{Sep 2018 -- Oct 2019}{Research Software Engineer}{Hamburg, Germany}
|
||||
\item Developed C\# crew-scheduling software on Microsoft SQL Server and introduced Jenkins with build jobs for automated deployment.
|
||||
\end{rSubsection}
|
||||
|
||||
\begin{rSubsection}{Vizrt}{Jul 2017 -- May 2018}{Test Automation / DevOps Engineer}{Bergen, Norway}
|
||||
\item Automated testing through test suites connected to the CI/CD pipeline as quality gates.
|
||||
\end{rSubsection}
|
||||
|
||||
\begin{rSubsection}{Generali Deutschland Informatik Services GmbH}{May 2015 -- Jun 2017}{IT Consultant}{Hamburg, Germany}
|
||||
\item Introduced behaviour-driven test automation through a proof of concept, then held technical responsibility for the suite and trained project members to work with it.
|
||||
\end{rSubsection}
|
||||
|
||||
% Header-only entry by user decision 2026-10-14 (BW-1: organisational context only).
|
||||
\Needspace{3\baselineskip}%
|
||||
{\bfseries Bundeswehr (German Armed Forces)}\hfill{\small Jul 2008 -- Nov 2014}\par
|
||||
{\itshape Officer Candidate / Officer (Second Lieutenant at separation)}\hfill{\itshape Germany}\par
|
||||
|
||||
\end{rSection}
|
||||
|
||||
\begin{rSection}{Education}
|
||||
\compactentry{M.Eng. Computer Aided Engineering}{Apr 2012 -- Oct 2013}
|
||||
Universität der Bundeswehr München; focus Software Design \& Engineering.
|
||||
|
||||
\compactentry{B.Eng. Information and Telecommunication Technologies}{Oct 2009 -- Oct 2012}
|
||||
Universität der Bundeswehr München.
|
||||
\end{rSection}
|
||||
|
||||
\end{document}
|
||||
@@ -0,0 +1,41 @@
|
||||
# BIS jr100498 — portal free-text answers
|
||||
|
||||
Submitted 2026-10-15 with the resume and cover letter. These are the answers **as drafted in the session**. The user pasted them into the portal and may have edited them; treat this as the best available record, not a verbatim copy of the submission.
|
||||
|
||||
Sources: `claims.json` (GN-1/GN-3, FC-1..3, BW-1, VZ, EDU-MENG, SW-1/2/3/4/7, BS-1/2/3/5/6) and the user clarifications of 2026-10-14/15 (`knowledge_base/extractions/2026-10-14_mentoring_spotfire_sdmx_clarification.md`).
|
||||
|
||||
## Q1. Have you previously worked in an international organisation, financial institution, central bank or other public authority (eg NSO)? Please describe your experience.
|
||||
|
||||
Not in an international organisation, central bank or national statistics office. The closest experience: from 2015 to 2017 I was an IT consultant at Generali Deutschland Informatik Services, the IT services company of the Generali insurance group, working on Java development and test automation for a workflow application. From 2018 to 2019 I worked at Fraunhofer CML, a publicly funded applied-research institute, where I developed software for research projects. Before that I served six years in the Bundeswehr as officer candidate and officer, leaving as Second Lieutenant, and earned both of my degrees at the Bundeswehr University Munich. I have also worked internationally, in Norway at Vizrt, and wrote my master's thesis at Tongji University in Shanghai.
|
||||
|
||||
## Q2. Do you have previous experience working with the SDMX, XBRL or other relevant standards? Please provide details.
|
||||
|
||||
I have no experience with SDMX or XBRL. The closest work is at Swisscom, where I model governed data products as logical and physical relational models and document their metadata and lineage in a data catalogue (Atlassian Compass). Our lakehouse tables use the open Apache Iceberg table format. SDMX keeps data structures and metadata separate, which is familiar from that work, but the standard itself is something I would need to learn on the job.
|
||||
|
||||
> Note: SDMX "never used" is user-confirmed (2026-10-14). XBRL was never asked about; "no XBRL" was flagged to the user for confirmation before pasting.
|
||||
|
||||
## Q3. Please describe your experience designing and implementing data or analytics applications, interfaces, or services. Include an example of a solution you delivered, outlining your role, the technologies used, and the outcome.
|
||||
|
||||
At Swisscom I design and build governed data products on AWS, and I migrated legacy ETL pipelines in my domains to Python/PySpark Glue jobs on Iceberg, Athena and Airflow. At Bosch I built data services over Oracle and Hadoop/Impala for the fab's analysis teams, and I was technical Application Owner for Spotfire and the defect management system.
|
||||
|
||||
Example: ML inference service in a 24/7 semiconductor fab (Bosch, 2020–2022).
|
||||
|
||||
Role: I devised and executed the strategy for integrating an image-based defect-classification model into production. The model itself was developed by others.
|
||||
|
||||
Technologies: Python, Docker, Kubernetes and Ansible, on Linux servers I administered.
|
||||
|
||||
Constraint: the fab runs continuously, and a software defect could in the worst case have halted production.
|
||||
|
||||
Outcome: defect classification was automated in production, which reduced manual classification work for the engineers. The reduction was not quantified.
|
||||
|
||||
## Q4. Please describe your experience gathering and translating business requirements into technical solutions through stakeholder interviews, workshops, or workflow analysis. Include a specific example, explaining how you managed differing stakeholder perspectives and ensured that the solution met business needs.
|
||||
|
||||
At Swisscom I worked with internal B2B stakeholders and product owners to turn their requirements into data products, dashboards and analyses, and I shaped and prioritised the resulting backlog items with the Product Owner. Today I design and model governed data products on AWS, from the relational model to source onboarding and documented metadata and lineage. At Bosch I was technical Application Owner for the defect management system and the Spotfire environment, and I handled communication between the software vendors and the fab's internal users, defined SLOs, trained users and wrote documentation. Earlier, at Generali, I gathered requirements for new automated test cases and introduced behaviour-driven development, where tests are written as business-readable scenarios.
|
||||
|
||||
A specific example is a data product I delivered for B2B stakeholders at Swisscom. The B2B business side, the architects and the engineers each brought their own requirements, and these could not be fully settled up front. Rather than waiting for complete agreement or a finished specification, I built a prototype, proposed it to all three groups and then iterated on it with their feedback. The prototype gave everyone something concrete to react to, and each iteration brought it closer to what the business needed. It took more iterations than a fully specified approach would have, but in my judgement we reached the result much faster than if we had waited for agreement first.
|
||||
|
||||
## Interview follow-ups these answers invite
|
||||
|
||||
- Q2: be ready to explain how you would learn SDMX, and what "data structures and metadata separate" means in your Compass/relational-model work.
|
||||
- Q3: the integration strategy. What made it safe in a fab where a defect could halt production? How was the rollout done?
|
||||
- Q4: which B2B data product this was; what the business, architects and engineers each wanted; how many iterations; what "much faster" was compared with.
|
||||
@@ -0,0 +1,59 @@
|
||||
\ProvidesClass{resume}[2026/07/27 Evidence-first professional resume]
|
||||
\LoadClass[11pt,a4paper]{article}
|
||||
|
||||
\RequirePackage{enumitem}
|
||||
\RequirePackage{ifthen}
|
||||
\RequirePackage{lastpage}
|
||||
\RequirePackage{parskip}
|
||||
\RequirePackage{needspace}
|
||||
|
||||
\pagestyle{empty}
|
||||
\setlength{\parindent}{0pt}
|
||||
|
||||
\def\@resumename{}
|
||||
\def\@resumeheadline{}
|
||||
\def\@resumecontact{}
|
||||
|
||||
\newcommand{\name}[1]{\def\@resumename{#1}}
|
||||
\newcommand{\headline}[1]{\def\@resumeheadline{#1}}
|
||||
\newcommand{\contactline}[1]{\def\@resumecontact{#1}}
|
||||
|
||||
\newcommand{\printresumeheader}{%
|
||||
{\LARGE\bfseries \@resumename}\par
|
||||
\vspace{0.15em}
|
||||
\ifthenelse{\equal{\@resumeheadline}{}}{}{\@resumeheadline\par}
|
||||
\vspace{0.1em}
|
||||
{\small \@resumecontact}\par
|
||||
\vspace{0.45em}
|
||||
}
|
||||
|
||||
\AtBeginDocument{\printresumeheader}
|
||||
|
||||
\newenvironment{rSection}[1]{%
|
||||
\vspace{0.35em}
|
||||
{\bfseries #1}\par
|
||||
\vspace{0.1em}\hrule\vspace{0.35em}
|
||||
}{%
|
||||
\vspace{0.2em}
|
||||
}
|
||||
|
||||
% Arguments: employer, dates, formal title, location.
|
||||
\newenvironment{rSubsection}[4]{%
|
||||
\Needspace{6\baselineskip}%
|
||||
{\bfseries #1}\hfill{\small #2}\par
|
||||
{\itshape #3}\hfill{\itshape #4}\par
|
||||
\vspace{0.1em}
|
||||
\begin{itemize}[leftmargin=1.25em,label=\textbullet,itemsep=0.18em,topsep=0.15em,parsep=0pt,partopsep=0pt]
|
||||
}{%
|
||||
\end{itemize}
|
||||
\vspace{0.25em}
|
||||
}
|
||||
|
||||
\newcommand{\skillline}[2]{%
|
||||
\textbf{#1:} #2\par
|
||||
\vspace{0.08em}
|
||||
}
|
||||
|
||||
\newcommand{\compactentry}[2]{%
|
||||
\textbf{#1}\hfill #2\par
|
||||
}
|
||||
+152
@@ -0,0 +1,152 @@
|
||||
# Session: Bank for International Settlements (BIS) — Senior/Lead Data & Analytics Engineer (MED IT, jr100498)
|
||||
|
||||
## JD Integrity
|
||||
- File/source: `JD_bis_senior_lead_data_analytics_engineer.txt` (this folder); https://www.bis.org/vacancy/jr100498
|
||||
- Retrieval method and date: headless Chromium via the job_scout `.venv` Playwright, rendered page text, 2026-10-14. Raw render kept at `job_scout/reports/2026-10-14-fit-sources/bis_lead_data_analytics_eng.txt`.
|
||||
- Verbatim posting: YES (only site navigation and footer removed)
|
||||
- Posting status: LIVE 2026-10-14. Posted 12 Oct 2026; deadline **Monday 2 Nov 2026, end of day**. 3-year fixed-term contract, Basel HQ, MED IT unit (department field: MED Data Engineering).
|
||||
|
||||
## Application Decision
|
||||
- Audience profile: International Tech (English is BIS's corporate language; international organisation, not a traditional Swiss employer). 2 pages, no photo.
|
||||
- Evidence Fit: **78/100**
|
||||
- Fit class: **Core**
|
||||
- Hard gate: **PASS**. No required qualification is a Gap. Junior supervision moved from Partial to Direct after the 2026-10-14 user clarification (BS-9, SW-10). Project planning is Adjacent, not a Gap.
|
||||
- Channel Strength: Weak (tailored cold application)
|
||||
- Channel plan: no named contact is published, only the `#LI-FC1` LinkedIn recruiter tag. Before submitting, find the BIS talent-acquisition recruiter (initials FC) or a MED IT engineer on LinkedIn and send a short note. The last BIS cold submit (jr100429, Banking Technology) was rejected without interview on 2026-09-11.
|
||||
- Named contact published? NO
|
||||
- Prior BIS history: jr100429 *Senior Data & Analytics Engineer – AI* (Banking Technology), applied 2026-07-10, rejected 2026-09-11 with no interview; closed, so stacking does not apply. **Different department:** this req is MED IT, and its emphasis is data and analytics engineering rather than applied AI.
|
||||
- Decision: PROCEED (plan confirmed by the user 2026-10-14: "go")
|
||||
|
||||
## Requirements
|
||||
| # | Requirement | Required/preferred | Direct/Adjacent/Gap/Constraint | Canonical evidence | Gate? |
|
||||
|---|---|---|---|---|---|
|
||||
| Q1 | Bachelor's degree or equivalent | Required | Direct | EDU-BENG, EDU-MENG | Yes |
|
||||
| Q2 | More than six years' relevant experience, substantial data & analytics engineering | Required | Direct | SWISSCOM 2023–present (SW-1/2/4/7), BOSCH 2020–22 (BS-2/3/8); visible record since 2015 | Yes |
|
||||
| Q3 | General supervision and task-specific guidance to junior colleagues | Required | Direct (unquantified) | **BS-9**, **SW-10** (onboarded and mentored junior developers, user-confirmed 2026-10-14), BS-7 (students; one thesis as Zweitpruefer), GN-1 (trained project members in BDD) | Yes |
|
||||
| Q4 | Acquire, organise, protect, process and analyse data | Required | Direct | SW-2 (quality, security, data protection, compliance), SW-1, SW-6, BS-2, BS-8 | Yes |
|
||||
| Q5 | Querying databases, database reporting and BI tools, query languages, data conversion techniques | Required | Direct | SQL; Oracle, Teradata DWH (SW-2), Athena/Iceberg (SW-1), Hadoop/Impala (BS-2); **TIBCO Spotfire** (BS-5, registered 2026-10-14); CRS normalisation and transformation (BS-8) | Yes |
|
||||
| Q6 | Analyse, model and document data flows, state changes, processes, requirements, use cases, user stories | Required | Direct | SW-7 (relational logical/physical models, design, metadata and lineage in Compass), SW-3 (shaped and prioritised backlog with PO), SW-4 | Yes |
|
||||
| Q7 | Design architectures incorporating system and service requirements; develop software | Required | Direct (scoped) | SW-7 (design of his data products), BS-1 (designed and executed integration strategy), BS-2, FC-3; iSAQB CPSA-F | Yes |
|
||||
| Q8 | Plan and manage small project assignments within cost, time and quality | Required | Adjacent | BS-3 (Application Owner: SLOs, vendors, training), BS-4 (PoC), GN-1 (estimation for new test cases). No formal project-management role | Yes |
|
||||
| Q9 | Interpret and apply policies and procedures | Required | Direct | SW-2 (Security and Data Governance compliance), SW-5 (not used) | Yes |
|
||||
| Q10 | Stakeholder management, communication, problem-solving, technical support | Required | Direct | SW-2 (2nd/3rd-level support, on-call, root cause), SW-4, BS-3 (vendors, internal customers) | Yes |
|
||||
| A1 | Define IT strategy and target architecture for statistical/analytical applications | Accountability | Adjacent | SW-7 design is scoped to his data products; no strategy ownership | No |
|
||||
| A2 | Gather business requirements, translate into IT solutions | Accountability | Direct | SW-4, SW-3 backlog | No |
|
||||
| A3 | Lead design and implementation of data and analytics applications, interfaces, services | Accountability | Direct (scoped) | SW-7, BS-2, BS-3/BS-5 | No |
|
||||
| A4 | Official-statistics collection/dissemination, international data standards, **SDMX** | Accountability | **Gap** | none; SDMX user-confirmed never used, registered `forbidden` 2026-10-14 | No |
|
||||
| A5 | Oversee data collection mechanisms; data quality and accuracy | Accountability | Direct | SW-2, SW-7 (source onboarding) | No |
|
||||
| A6 | Responsible AI/ML for document processing, anomaly detection, forecasting | Accountability | Adjacent | BS-1 (ML inference integration, not model development), BS-4 (ELK/Kafka anomaly-detection PoC), FC-2 (contribution) | No |
|
||||
| A7 | Technical guidance, end-user support, oversee production support | Accountability | Direct | SW-2, BS-3 | No |
|
||||
| A8 | Support IT project/product management, materials for IT steering committees | Accountability | Adjacent | SW-3 backlog with PO; no steering-committee evidence | No |
|
||||
| A9 | Support junior colleagues; represent the BIS at external events | Accountability | Direct | BS-9, SW-10; BS-5 (co-presented at TIBCO Analytics Forum 2022) | No |
|
||||
| T1 | Explore AI/ML, Lakehouse engineering, HPC, Kubernetes ecosystems, big data platforms | Context | Lakehouse Direct (Iceberg/Athena/Glue, current); Kubernetes Direct-historical (SW-3, BS-1); big data Direct (PySpark, Hadoop/Impala); HPC Gap; AI/ML Adjacent | SW-1, SW-6, SW-3, BS-1, BS-2 | No |
|
||||
| C1 | Basel, hybrid incl. home office and working-from-abroad days; 3-year fixed term | Constraint | Workable | ~90 min from Thun; memory accepts BIS tax-free pay for that commute. Office-day count NOT stated - ask at first contact | No |
|
||||
| C2 | English corporate language | Constraint | Direct | English fluent | No |
|
||||
|
||||
### Evidence Fit — 78/100
|
||||
| Dimension | Weight | Score | Reason |
|
||||
|---|---:|---:|---|
|
||||
| Required qualifications | 35 | 31 | Nine of ten Direct; project planning Adjacent |
|
||||
| Core responsibilities | 25 | 18 | Design/delivery, requirements, data quality and production support Direct; SDMX/official statistics Gap; IT strategy and steering committees Adjacent |
|
||||
| Level and ownership | 15 | 11 | Staff engineer, component and application owner, mentors juniors; "Lead" design authority beyond his own data products is not established |
|
||||
| Recency and depth | 10 | 8 | Current AWS lakehouse data products; BI/Spotfire and dashboards are historical (2022 / ART B2B) |
|
||||
| Domain/tool transfer | 10 | 6 | Central-bank/official-statistics domain is new; SDMX absent; HPC absent; core tools transfer |
|
||||
| Practical constraints | 5 | 4 | Commute and office days to confirm |
|
||||
|
||||
## Competitive Read
|
||||
- Obvious-fit candidate: a data engineer from a central bank, statistical office or financial regulator, with SDMX and official-statistics collection experience plus BI.
|
||||
- Dennis's advantage: a current, hands-on lakehouse stack (Iceberg, Athena, Glue, PySpark, Airflow) of the kind the posting wants to explore; production component and application ownership with governance and on-call; relational modelling of governed data products with metadata and lineage; ML integration in a 24/7 regulated-adjacent industrial environment.
|
||||
- Their advantage: SDMX and statistics-domain fluency; existing central-bank network; experience working with economists.
|
||||
- Level/scope comparison: matches Senior; "Lead" will probe architecture ownership and steering-committee exposure.
|
||||
|
||||
## Framing Strategy
|
||||
- Professional identity: Staff data, analytics and AI engineer who designs and builds governed data products and the pipelines behind them, and has owned the analytics applications that business users depend on.
|
||||
- Strongest proof points: SW-7 (relational data-product design on AWS lakehouse, metadata/lineage); SW-2 (DWH ETL component ownership with governance and support); BS-3/BS-5 (application owner for Spotfire and DMS); BS-8 (data conversion across coordinate systems); BS-9/SW-10 (junior mentoring).
|
||||
- Honest adjacent bridges: Spotfire → BI tools generally; BS-1/BS-4 → applied ML for operations; BS-3 → small-project ownership.
|
||||
- Explicit gaps: SDMX/official statistics; HPC; formal project management; IT strategy ownership. Do not paper over any of these in the resume.
|
||||
- User directives: none beyond the 2026-10-14 clarifications.
|
||||
|
||||
## Resume Plan (confirmed 2026-10-14)
|
||||
- Summary: 2–3 lines.
|
||||
- Skills: ~5 lines (Programming; Data engineering; Databases and BI; Platform and delivery; Certifications), plus spoken languages.
|
||||
- Swisscom (5): SW-7 lead, SW-1 (+SW-6, SW-9), SW-2 (past), SW-4 (past, + SW-3 backlog), SW-10 (short).
|
||||
- Bosch (5): BS-3+BS-5 (Application Owner), BS-2, BS-8 (+TAF 2022 from BS-5), BS-1, BS-9+BS-7 (short).
|
||||
- Earlier experience: Fraunhofer FC-1 (1); Vizrt VZ-2 (1); Generali GN-1 (1). Bundeswehr header-only line (BW-1) by user decision 2026-10-14. Capgemini omitted.
|
||||
- Total bullets: 12–13.
|
||||
- Impact evidence still needed: none required. No verified metrics exist for any selected claim; none invented.
|
||||
- Q8 follow-up (2026-10-14): user answered "schedule yes, budget no" to bounded-project planning. No project or employer named, so it is recorded in the clarification note only, not as a claim, and is not in any bullet. Q8 stays Adjacent; ask which project if an interview probes it.
|
||||
|
||||
## Cover Letter Decision
|
||||
- YES (proposed with the plan; user replied "go")
|
||||
- Reason: mission-led international organisation where motivation is material; the letter can explain the move into central-bank statistics and why MED's data work fits.
|
||||
- Information it adds beyond resume: motivation for MED (data that central banks and regulators rely on) and a working style built close to domain specialists. SDMX deliberately OMITTED (registered forbidden 2026-10-14; simplest not to raise it).
|
||||
- Verified hook sources: the posting itself, https://www.bis.org/vacancy/jr100498, saved verbatim as `JD_bis_senior_lead_data_analytics_engineer.txt` (retrieved 2026-10-14). No other hook used.
|
||||
|
||||
## Output Files
|
||||
- Resume: `e2e_bis_senior_lead_data_analytics_engineer_resume.tex` + `.pdf` (compiled here)
|
||||
- Cover letter: `e2e_bis_senior_lead_data_analytics_engineer_cover_letter.tex` + `.pdf`
|
||||
- Critique: `critique_bis_senior_lead_data_analytics_engineer.md`
|
||||
|
||||
## Critique Summary
|
||||
- Critique: `critique_bis_senior_lead_data_analytics_engineer.md`, 2026-10-14 (self-review in the generating session)
|
||||
- Evidence Fit: 78/100, Core
|
||||
- Hard gate: PASS
|
||||
- Document Quality: 86/100 at critique; 88/100 after the Tier 2 fixes (2026-10-15)
|
||||
- Channel Strength: Weak
|
||||
- Tier 1 fixes: none
|
||||
- Tier 2: all three applied 2026-10-15 on user instruction (skills recency marks, headline without historical BI, VZ-2 verb)
|
||||
- Interview prep: Swisscom dashboard tool (not in KB), attributed Q8 schedule example, SDMX answer, Lead story, fixed-term trade-off
|
||||
|
||||
## Status
|
||||
- Fit gate: DONE 2026-10-14, Core 78, hard gate PASS
|
||||
- Resume: DONE 2026-10-14; user proceeded to /make-cl (taken as approval)
|
||||
- Cover letter: DONE 2026-10-14, awaiting user approval (update the literal date at submission)
|
||||
- Critique: DONE 2026-10-14 (EF 78 Core, gate PASS, DQ 86, channel Weak, no Tier 1)
|
||||
- Application/outcome: **SUBMITTED 2026-10-15** via the BIS portal (tracker app-bis-jr100498, outcome `applied`, channel Weak)
|
||||
- Package: FINALIZED 2026-10-15. Submission copies: `Dennis_Thiessen_Resume.pdf`, `Dennis_Thiessen_Cover_Letter.pdf` (byte-identical to the e2e builds). NOT submitted.
|
||||
- Next: await BIS response. At first contact ask office days and total package; weigh the 3-year fixed term against the permanent Swisscom post. Interview prep: critique §7 and `portal_answers_bis_jr100498.md`.
|
||||
|
||||
## KB changes made this session (2026-10-14)
|
||||
- `claims.json`: new claims BS-9, SW-10; skills `TIBCO Spotfire` (allowed) and `SDMX` (forbidden).
|
||||
- `knowledge_base/extractions/2026-10-14_mentoring_spotfire_sdmx_clarification.md`.
|
||||
- `CLAUDE.md` corrections log entry 2026-10-14.
|
||||
|
||||
## As-built resume (2026-10-14)
|
||||
- Profile: International Tech, English (British spelling), 2 pages A4, no photo. Contact line Bern.
|
||||
- Headline: Staff Data, Analytics & AI Engineer | Data Products & Pipelines | AWS Lakehouse & BI
|
||||
- Summary: 3 rendered lines.
|
||||
- Skills: 6 skill lines (Programming, Data engineering, Databases and BI, Platform, Certifications, Languages), 9 rendered lines. Experience starts at about 46% of page 1 (visual estimate; `page_metrics.py` failed because Git's pdftotext lacks `-bbox`). A first build carried a separate "Data management" line and rendered 11 lines; it was cut because SW-7/SW-2 bullets prove the same content.
|
||||
- Bullets: 13. Swisscom 5 (SW-7, SW-1/6/9, SW-2, SW-4/3, SW-10); Bosch 5 (BS-3/5, BS-2, BS-8/5, BS-1/4, BS-9/7); Fraunhofer FC-1; Vizrt VZ-2; Generali GN-1. Bundeswehr header only.
|
||||
- Page break: Swisscom and the first three Bosch bullets on page 1; remaining Bosch bullets, earlier roles, Bundeswehr and Education on page 2. Page 2 is about half full; no filler added.
|
||||
- Validator: `validate_resume_system.py --document` PASS, 0 errors, 0 warnings (cadence included).
|
||||
- Compile: MiKTeX pdflatex, 2 passes, 2 pages, no overfull/underfull boxes. Both pages inspected at 80 dpi; `pdftotext -layout` order is header, summary, skills, then employer/title/date blocks in reverse chronology.
|
||||
- Scope checks applied by hand: SW-2/SW-4/SW-3 in past tense (ART B2B); SW-1 scoped to "owned domains" plus "contributing to Swisscom's wider cloud migration"; SW-7 "within Swisscom's company-wide Data Mesh"; ODP-Flow omitted (external employer); BS-1 written as a failure consequence, no model-training claim; BS-4 labelled proof of concept; BS-7 exactly one thesis; FC-1 without any quality-gate claim; no metrics; no SDMX, LangChain or other forbidden term.
|
||||
- Post-review revisions (same day, before presenting):
|
||||
- BS-8: "and tuned the queries behind it" changed to "including performance tuning". BS-8 records tuning as a main difficulty but not what was tuned, and spatial indexes and operators are unconfirmed. The `Oracle Database` skill note in claims.json was corrected the same way.
|
||||
- Cadence: SW-4 became a single-object bullet ("Translated internal B2B stakeholders' requirements into data products and dashboards; ..."). BS-9/7 became "Mentored junior developers through onboarding, and served as supervisor and second examiner for one Bachelor thesis."
|
||||
- Employer string corrected to the canonical "Fraunhofer-Center for Maritime Logistics and Services CML".
|
||||
- `\hyphenation{semiconductor}` keeps the term whole for ATS parsing. The summary is set `\sloppy` to absorb the resulting overfull box.
|
||||
- Final: validator PASS (0 warnings), 2 pages, no overfull/underfull boxes. `page_metrics.py` (MiKTeX pdftotext on PATH) measures experience starting at 45.8% of page 1, with 52 text lines and 408 words on page 1.
|
||||
|
||||
## Cover letter as built (2026-10-14)
|
||||
- The user moved to `/make-cl` after the resume was presented; that is taken as resume approval.
|
||||
- File: `e2e_bis_senior_lead_data_analytics_engineer_cover_letter.tex` + `.pdf`. One A4 page, 3 paragraphs, 237 words after revision (salutation to sign-off). British spelling.
|
||||
- What it adds beyond the resume: motivation for MED (who the data is for, economists and statisticians) and a working style built close to domain specialists. These are the two evidence themes: (1) governed data products and DWH data quality (SW-7, SW-2); (2) combining sources never designed to fit (BS-3/BS-5, BS-2, BS-8).
|
||||
- Employer hook: the posting itself only. Its text says MED aims "to collect a wider variety of data and harness new technology" for "a step change in our capability", and names "Lakehouse engineering". Source: https://www.bis.org/vacancy/jr100498, saved verbatim as `JD_bis_senior_lead_data_analytics_engineer.txt`, retrieved 2026-10-14. No other BIS programme, product or statistic is named, so nothing else needed verifying.
|
||||
- Claim checks: every work claim is also in the resume. "co-owned Spotfire" kept. Mentoring is written as "At Bosch and Swisscom I have also onboarded and mentored", because SW-10's phase is not recorded. SW-2 is past tense. "Worked in Germany, Norway and Switzerland" matches the resume locations. "Enjoy international teams" is the user's stated motivation (memory: international mobility). SDMX, the prior BIS application and the 3-year term are deliberately not mentioned. Recipient address limited to "Basel, Switzerland" (street address not verified).
|
||||
- Date: literal "14 October 2026". **At submission: update it to the sending date, recompile, and refresh `Dennis_Thiessen_Cover_Letter.pdf` (config.md Output Rules), so the attached copy does not carry the old date.**
|
||||
- Validator: PASS on resume + letter together (0 warnings). Compile: MiKTeX, no overfull/underfull boxes, page inspected at 80 dpi.
|
||||
- Status: cover letter DONE, awaiting user approval. Next: `/critique`.
|
||||
- Revision before presenting (2026-10-14): paragraph 1 was rewritten. The first draft reworded the SW-7 and SW-2 resume bullets (artefact list, plus an unsupported 'for each product'). It now states the connection (the lakehouse stack named in the posting, plus the operating side of warehouse ETL) and the motivation (data that central banks and financial regulators rely on, paraphrased from the JD). The 'not the analysis but' contrast in paragraph 2 was dropped.
|
||||
|
||||
## Finalization (2026-10-15)
|
||||
- User approved: "apply the polish items and finalize".
|
||||
- Tier 2 polish applied (see critique re-report). Skills: Programming "Python, SQL, pytest; Java, C# and Kotlin (professional, historical)"; Data engineering "... Kafka (historical); relational data modelling"; Platform "AWS, CloudFormation, Docker; Kubernetes, GitLab CI/CD, Linux, Ansible (historical)". Headline "Staff Data, Analytics & AI Engineer | Governed Data Products & Pipelines | AWS Lakehouse". VZ-2 reworded.
|
||||
- Cover letter date set to 15 October 2026.
|
||||
- Shared-ops finalization checks: session, resume source/PDF, critique and cover-letter source/PDF exist; validator PASS on both submitted documents; submission copies created and verified identical with `cmp`. Application registered in `job_scout/state/applications.json` (app-bis-jr100498, outcome `open`, application_date null until submission); the cohort projection already carries it, so no separate `cohort_tracker.py add` was run.
|
||||
|
||||
## Submission (2026-10-15)
|
||||
- Submitted by the user via the BIS portal: `Dennis_Thiessen_Resume.pdf`, `Dennis_Thiessen_Cover_Letter.pdf` (dated 15 October 2026, matching the sending date) and four portal free-text answers.
|
||||
- Portal answers: `portal_answers_bis_jr100498.md` (as drafted; the user may have edited them in the portal). They introduced one new canonical fact, the prototype-and-iterate approach on a Swisscom B2B data product (recorded in the SW-4 scope and the clarification note on 2026-10-15). XBRL was flagged for the user to confirm before pasting.
|
||||
- Channel: no warm contact was recorded before submission, so Weak/cold.
|
||||
- Recorded in `job_scout/state/applications.json` (outcome `applied`, application_date 2026-10-15; views re-rendered and checked) and `job_scout/state/decisions.json` (`applied`).
|
||||
@@ -0,0 +1,6 @@
|
||||
Senior Software Engineer, Full Stack, Commerce
|
||||
Google — Zürich, Switzerland
|
||||
Source: https://www.google.com/about/careers/applications/jobs/results/140594136896938694-senior-software-engineer-full-stack-commerce?location=Switzerland
|
||||
Retrieved: 2026-10-03 via direct public employer HTTP GET; posting body verbatim, whitespace normalized.
|
||||
|
||||
Minimum qualifications: Bachelor’s degree or equivalent practical experience. 5 years of experience with software development in one or more programming languages. 3 years of experience testing, maintaining, or launching software products. 1 year of experience with software design and architecture. Experience in coding with Java or C++, and SQL. Preferred qualifications: Master's degree or PhD in Computer Science or a related technical field. 5 years of experience with data structures and algorithms. 1 year of experience in a technical leadership role. Experience with Data Analysis and Data Processing. Experience developing accessible technologies. About the job Google's software engineers develop the next-generation technologies that change how billions of users connect, explore, and interact with information and one another. Our products need to handle information at massive scale, and extend well beyond web search. We're looking for engineers who bring fresh ideas from all areas, including information retrieval, distributed computing, large-scale system design, networking and data storage, security, artificial intelligence, natural language processing, UI design and mobile; the list goes on and is growing every day. As a software engineer, you will work on a specific project critical to Google’s needs with opportunities to switch teams and projects as you and our fast-paced business grow and evolve. We need our engineers to be versatile, display leadership qualities and be enthusiastic to take on new problems across the full-stack as we continue to push technology forward. People shop on Google more than a billion times a day - and the Commerce team is responsible for building the experiences that serve these users. The mission for Google Commerce is to be an essential part of the shopping journey for consumers - from inspiration to to a simple and secure checkout experience - and the best place for retailers/merchants to connect with consumers. We support and partner with the commerce ecosystem, from large retailers to small local merchants, to give them the tools, technology and scale to thrive in today’s digital world. Responsibilities Write and test product or system development code. Participate in, or lead design reviews with peers and stakeholders to decide amongst available technologies. Review code developed by other developers and provide feedback to ensure best practices (e.g., style guidelines, checking code in, accuracy, testability, and efficiency). Contribute to existing documentation or educational content and adapt content based on product/program updates and user feedback. Triage product or system issues and debug/track/resolve by analyzing the sources of issues and the impact on hardware, network, or service operations and quality.
|
||||
@@ -0,0 +1,111 @@
|
||||
# Session: Google — Senior Software Engineer, Full Stack, Commerce
|
||||
|
||||
## JD Integrity
|
||||
- Source: https://www.google.com/about/careers/applications/jobs/results/140594136896938694-senior-software-engineer-full-stack-commerce?location=Switzerland
|
||||
- Requisition: 140594136896938694; Zürich, Switzerland.
|
||||
- Retrieval method/date: direct public employer HTTP GET, 2026-10-03, HTTP 200. Substantive requirements and responsibilities verified.
|
||||
- Verbatim posting: YES, posting body preserved with whitespace normalized in `jd_google_senior_swe_commerce_2026-10-03.txt`; full employer HTML also saved.
|
||||
- Posting status: accessible and active in employer search on retrieval; no recruiter confirmation of hiring activity.
|
||||
- Prior applications: no application to this requisition in the registry. Last dated Google submission in registry is 2026-07-27. A distinct FDE GenAI record remains paused, not silently withdrawn. Registry has no recorded Google submissions in the past 30 days; portal history must be checked before actual submission.
|
||||
|
||||
## Application Decision
|
||||
- User directive, 2026-10-03: pursue Google from the scout shortlist. The assistant initially selected Senior Commerce; the user did not explicitly choose that requisition over SWE III Shopping Ads.
|
||||
- Audience: International Tech, English, two pages.
|
||||
- Evidence Fit: **73/100 initial provisional score**, before the user's clarification; not reassessed or promoted after the confirmed gap.
|
||||
- Fit class: **NO-GO under project fit policy**. The confirmed title-defining Full Stack gap overrides the initial score.
|
||||
- Hard gate: **FAIL (project title-defining capability rule)**. User denied frontend experience on 2026-10-03. This is our interpretation of the Full Stack title, not an assertion that Google lists a separate frontend minimum. Current data-product modelling, design and implementation are confirmed; the required one-year design/architecture duration is still not explicitly established.
|
||||
- Practical constraints: Swiss authorization Direct (German/EU citizen, Swiss B permit, no sponsorship). Zürich office requirement/travel pattern and Swiss compensation are unpublished and unresolved. User selected this opportunity after these uncertainties were surfaced in the scout; preparation is authorized, no claim that the practical gate is cleared.
|
||||
- Channel Strength: Weak/unestablished. No named recruiter or hiring manager on the retrieved posting. Before submission look for an existing Google connection/referral; no messages authorized or sent.
|
||||
- Decision: HOLD Commerce drafting. Alternative Shopping Ads has directly supported stated minimum qualifications but is Mid-level; user asked to select that alternative, further Google Senior research, or an explicit override of the Commerce gap. No override received.
|
||||
- No application submitted; no submission date recorded.
|
||||
|
||||
## Initial Evidence Fit breakdown — before user clarification
|
||||
| Dimension | Maximum | Provisional score | Reason |
|
||||
|---|---:|---:|---|
|
||||
| Required qualifications | 35 | 29 | Degree, software tenure, production/testing and Java/SQL are Direct. Design work is evidenced, required duration pending. |
|
||||
| Core responsibilities | 25 | 18 | Development, testing, incident diagnosis and documentation Direct; formal code-review/design-review practice and frontend depth unconfirmed. |
|
||||
| Level and ownership | 15 | 11 | Staff promotion, component/application ownership and technical test responsibility. Senior product SWE function is a transfer from current data engineering. |
|
||||
| Recency and depth | 10 | 7 | Current Python/SQL delivery; professional Java historical, latest Bosch work ended 2022. |
|
||||
| Domain/tool transfer | 10 | 6 | Professional backend and data-processing evidence; no Commerce domain or Google-scale product ownership claimed. |
|
||||
| Practical constraints | 5 | 2 | Swiss location, authorization and English Direct; office requirement and acceptable package unknown. |
|
||||
| Total | 100 | 73 | Provisional assessment; hard gates override the number. |
|
||||
|
||||
## Requirements
|
||||
| # | Requirement | Priority | Assessment | Canonical evidence | Gate |
|
||||
|---|---|---|---|---|---|
|
||||
| Q1 | Bachelor's degree or equivalent | Required | Direct | EDU-BENG, EDU-MENG | Pass |
|
||||
| Q2 | Five years software development | Required | Direct across professional roles; no FTE-year claim | GN-3, VZ-1, FC-1/FC-3, BS-2, SW-1/SW-3 | Pass |
|
||||
| Q3 | Three years testing, maintaining or launching software | Required | Direct cumulative professional testing/maintenance and production operation | GN-1/GN-3, VZ-2, FC-1, BS-3, SW-2 | Pass |
|
||||
| Q4 | One year software design/architecture | Required | Current data-product modelling/design/implementation confirmed 2026-10-03; explicit duration still unconfirmed | GN-3 design contributions; BS-1 integration strategies; SW-7 scoped data-product design | Unknown |
|
||||
| Q5 | Coding with Java or C++, and SQL | Required | Direct professional Java/SQL; historical Java stated explicitly. Limited C++ supplementary only | GN-3, BS-2, SW-2/SW-7, VZ-1 | Pass |
|
||||
| P1 | Master's/PhD related field | Preferred | Direct | EDU-MENG, Software Design & Engineering focus | — |
|
||||
| P2 | Five years data structures and algorithms | Preferred | Gap in documented duration/depth; no invented duration from ordinary coding | No explicit canonical evidence for five years | — |
|
||||
| P3 | One year technical leadership | Preferred | Adjacent; test-suite responsibility and student supervision are genuine, exact duration/scope pending | GN-1, BS-7 | — |
|
||||
| P4 | Data analysis/data processing | Preferred | Direct | SW-1/SW-6/SW-7, BS-2/BS-5/BS-8 | — |
|
||||
| P5 | Accessible technologies | Preferred | Gap | No canonical accessibility evidence | — |
|
||||
| R1 | Write/test product or system code | Core duty | Direct | GN-3, VZ-1/VZ-2, FC-1, BS-2, SW-1/SW-3 | — |
|
||||
| R2 | Participate in or lead design reviews | Core duty | Adjacent; architecture contributions evidenced, formal review practice not explicit | GN-3, BS-1 | Clarify |
|
||||
| R3 | Review colleagues' code | Core duty | Unrecorded; no code-review claim inferred from seniority | None explicit | Clarify before claiming |
|
||||
| R4 | Documentation/educational content | Core duty | Direct | BS-3, GN-1, SW-7 | — |
|
||||
| R5 | Triage/debug software/system issues | Core duty | Direct | GN-3, FC-1, SW-2 | — |
|
||||
| R6 | Full Stack versatility | Title/core function | Gap: user denied frontend experience 2026-10-03. FC-3 backend JavaScript, GN-1 UI tests and PP-1 dashboard do not establish frontend development | Direct user clarification; canonical frontend-development exclusion | Fail under project title-defining rule |
|
||||
| C1 | Work authorization/location | Practical | Swiss work authorization Direct; office days/commute not verified | Canonical identity | Partial |
|
||||
|
||||
## Competitive Read
|
||||
- Obvious-fit competitor: recent Java/C++ product developer with demonstrated design/code reviews, UI integration and algorithm interview readiness.
|
||||
- Dennis's strengths: Python/SQL/data-processing depth, technical production ownership, genuine software-testing experience and historical Java delivery; promoted at Swisscom and Bosch.
|
||||
- Competitor advantages: recent product/fullstack/Commerce experience and closer stack/algorithm match.
|
||||
- Do not equate Swisscom Staff title with a Google level. Google-scale users are employer context, never personal impact.
|
||||
|
||||
## Framing Strategy
|
||||
- Identity: Staff Data, Analytics & AI Engineer with production software, testing and backend/data engineering experience.
|
||||
- Headline proposal: `Software & Data Engineering | Python, SQL | Production Systems` — a professional focus, not an invented historical title.
|
||||
- Short summary: current Staff role, professional software-delivery breadth and application/component accountability. Do not label Dennis a Full Stack specialist; user denied frontend experience.
|
||||
- Java in a historical professional context; current Python/SQL named plainly. Avoid using limited Vizrt C++ as the main qualification path.
|
||||
- Put development/test/design evidence forward within reverse chronological employers. Omit Security Champion, finance/trading project, ML-training claims, grades and military service as low relevance.
|
||||
- No verified numerical outcome metrics; do not add estimates.
|
||||
|
||||
## Initial Resume Plan — retained for review, drafting held
|
||||
Google preparation was authorized; this assistant-selected requisition now has a confirmed title-defining gap. The initial content plan below is retained as preparation history, not approved for generation. Under the make-resume fit rule, proceeding with Commerce requires an explicit user override of the stated gap. Choosing another role requires a fresh role-specific fit and content plan.
|
||||
|
||||
| Role/order | Proposed content | Canonical IDs | Evidence and scope | Role relevance |
|
||||
|---|---|---|---|---|
|
||||
| Swisscom 1 | Implement Python/PySpark migration work for pipelines in the Fulfillment and Product Analysis domains on AWS Glue, contributing to Swisscom's wider programme. | SW-1, SW-6 | Professional/current; owned-domain implementation, not company-wide migration lead | Current development |
|
||||
| Swisscom 2 | Design and implement governed data products through logical/physical relational modelling, and onboard source data within Swisscom's shared Data Mesh. | SW-7 | Professional/current; scoped data-product design confirmed 2026-10-03, not mesh/framework ownership; exact design duration unconfirmed | Data processing/design |
|
||||
| Swisscom 3 | Built and operated Python applications on Kubernetes, deployed through automated GitLab CI/CD pipelines across multiple environments. | SW-3 | Professional/historical; did not build CI/CD automation | Software delivery |
|
||||
| Swisscom 4 | Served as Component Owner for Fulfillment ETL into Teradata, covering incident root-cause analysis and second-/third-level support with on-call responsibility. | SW-2 | Professional/historical; component scope only | Debugging/production ownership |
|
||||
| Swisscom 5 | Delivered data products and analyses with internal B2B stakeholders and product owners. | SW-4 | Professional/historical; internal collaboration | Product/stakeholder relevance |
|
||||
| Bosch 1 | Developed data services in Python and Java over Oracle and Hadoop/Impala for semiconductor analysis teams. | BS-2 | Professional/historical; Python primary, Java genuine but historical | Java/backend/SQL evidence |
|
||||
| Bosch 2 | Integrated containerized ML inference into continuously operating semiconductor production using Docker, Kubernetes and Ansible. | BS-1 | Professional/historical; integration strategy and execution, not model training | Design-to-operation lifecycle |
|
||||
| Bosch 3 | Served as Application Owner for analytics software, with SLO definition, user documentation and coordination with vendors/internal customers. | BS-3 | Professional/historical; own applications, not shared enterprise platform | Operation/documentation |
|
||||
| Bosch 4 | Developed Ansible extensions, including a credential-caching plugin that reduced password-keystore lookups. | BS-6 | Professional/historical; individual extension, unquantified impact | Specific software engineering |
|
||||
| Fraunhofer 1 | Developed and maintained crew-scheduling software in C#/Entity Framework/SQL Server and introduced Jenkins build jobs for automated deployment. | FC-1 | Professional/historical; individual development/CI setup | Software lifecycle |
|
||||
| Vizrt 1 | Contributed Python/C++ work to a distributed transcoding backend; developed automated test suites integrated as CI/CD quality gates. | VZ-1, VZ-2 | Backend contributor; test-suite ownership; no broadcaster-delivery claim | Development/testing |
|
||||
| Generali 1 | Developed Java/J2EE workflow features and fixes, contributed to service design/architecture decisions and held technical responsibility for BDD automation. | GN-3, GN-1 | Individual development/testing; contributing architecture scope only | Java/design/test evidence |
|
||||
|
||||
- Total: approximately 12 bullets, with content-driven line lengths.
|
||||
- Generali may receive a second bullet separating Java/design from BDD if combining them hurts readability; older-role allocation is a guide, not a truth/fit rule.
|
||||
- Skills: Python/SQL; Java historical with role context; backend/data processing and relational databases; Git/GitLab/Jenkins/testing; AWS/container delivery selected compactly.
|
||||
- Credentials: iSAQB CPSA-F and AWS SAA once, preferably at the end. Education from canonical dates, overlapping degrees preserved.
|
||||
- Impact evidence still needed: no numerical metric requested; omit all unverified quantities.
|
||||
|
||||
## Cover Letter Decision
|
||||
- **NO**, unless the actual application portal makes it mandatory.
|
||||
- Reason: International Tech role; no additional verified Commerce motivation or personal connection beyond the resume. A generic letter would repeat professional evidence.
|
||||
|
||||
## Output Files
|
||||
- JD: `jd_google_senior_swe_commerce_2026-10-03.txt` and full HTML.
|
||||
- Session: this file.
|
||||
- Resume source/PDF: not generated; Commerce has a confirmed title-defining frontend gap.
|
||||
- Cover letter: intentionally omitted.
|
||||
- Critique: not yet applicable; no document produced.
|
||||
|
||||
## Status
|
||||
- Canonical preflight: PASS, zero advisory warnings, 2026-10-03.
|
||||
- JD: live body retrieved and saved.
|
||||
- Fit: NO-GO for Commerce under the project title-defining capability rule; frontend denied, scoped data-product design confirmed, exact design duration unknown.
|
||||
- Content plan: complete, from canonical evidence and selected experience files; no historical resume used.
|
||||
- Resume/visual QA: pending; do not claim finished.
|
||||
- Application/outcome: open/preparation, not submitted.
|
||||
- Next: await role choice (Shopping Ads Mid-level, further Google Senior research, or explicit Commerce gap override). No unsupported frontend or duration claims may be added. JD comparison is in `job_scout/reports/2026-10-03-google-role-comparison.md`.
|
||||
- Workflow: make-resume, shared instructions. User's instruction to pursue Google covers preparation and routine drafting choices; no extra content-plan permission gate is imposed. Evidence gaps must not be filled by assumption.
|
||||
@@ -0,0 +1,144 @@
|
||||
# Critique: Google — Staff Software Engineer, Shopping Graph (Feeds Infra), Zürich
|
||||
|
||||
> **STALE (2026-10-21):** the resume was edited after this critique (leadership framing, SW-8, BS-1, trims). See the
|
||||
> session Edit History. Evidence Fit (70, Stretch, gate PASS) is unaffected; Document Quality needs a re-score.
|
||||
|
||||
Date: 2026-10-21. Document: `e2e_google_staff_swe_shopping_graph_resume.tex` / `.pdf` (2 pages).
|
||||
JD: `jd_google_staff_swe_shopping_graph_2026-10-21.txt`, a verbatim Playwright render of the live posting,
|
||||
retrieved 2026-10-21. Cover letter: intentionally omitted (session decision NO).
|
||||
|
||||
## 1. Fit verdict and hard-gate audit
|
||||
|
||||
**Verdict: STRETCH, hard gate PASS.** Every minimum qualification is met, so nothing disqualifies the
|
||||
application. It is a Stretch because the role's defining responsibility, Staff-level technical leadership,
|
||||
is only Adjacent (`application_strategy.md`: "a defining responsibility is only Adjacent").
|
||||
|
||||
| Minimum qualification | Class | Evidence on the page | Risk |
|
||||
|---|---|---|---|
|
||||
| Bachelor's or equivalent | Direct | B.Eng., M.Eng. | none |
|
||||
| 8 yrs programming in C++/Java/Python/Kotlin/Go | Direct, tight | Generali Java 2015-17, Vizrt Python/C++ 2017-18, Bosch Python/Java 2020-22, Swisscom Python/PySpark 2023- (about 8.8 yrs; 8.0 without Vizrt). Fraunhofer was C#/JS and does not count | A recruiter who discounts Vizrt (a *contribution*) lands exactly on 8 |
|
||||
| 5 yrs testing and launching software | Direct | GN-1, VZ-2, FC-1, BS-1, SW-1, SW-9 | none |
|
||||
| 3 yrs software design and architecture | Direct, scoped | SW-7 (present), BS-2 scripts, BS-1 integration, GN-3 contribution; iSAQB CPSA-F | Design is component-scale. A Staff reader expects system design of large services |
|
||||
| GenAI / LLM interfaces integrated into workflows | Direct, modest | SW-8 bullet; LiteLLM, Copilot, Kiro | Configuration/integration level only. Expect "what did you build with it?" |
|
||||
|
||||
No level-based NO-GO trigger applies: the role is an IC tech lead, not people management, external-account
|
||||
ownership or company-wide architecture authority.
|
||||
|
||||
## 2. Evidence Fit — 70 / 100 (Stretch by definition)
|
||||
|
||||
Scored independently of the provisional 73 in the session. It comes out stricter on responsibilities and
|
||||
level, as seen from the hiring manager's chair.
|
||||
|
||||
| Dimension | Weight | Score | Reason |
|
||||
|---|--:|--:|---|
|
||||
| Required qualifications | 35 | 31 | All five Direct; two are tight or modest (8 yrs, GenAI) |
|
||||
| Core responsibilities | 25 | 15 | Design/build/test/deploy and ingestion with data quality are Direct. Four of the five responsibility lines are leadership or coordination, and those are Adjacent |
|
||||
| Level and ownership | 15 | 7 | Component Owner, Application Owner and mentoring; no recorded project-team lead or technical direction set for others |
|
||||
| Recency and depth | 10 | 8 | Current Python/PySpark/AWS ingestion and data-product design |
|
||||
| Domain/tool transfer | 10 | 6 | Ingestion and data quality transfer well. Web crawling and the commerce domain are gaps. Java is historical (Google Feeds Infra is likely Java/C++-heavy). Google's internal stack is new to every external candidate |
|
||||
| Practical constraints | 5 | 3 | Zürich hybrid against a 3-homeoffice-day baseline, plus the Thun–Zürich commute. Acceptable only for a clear overall improvement; clarify at first contact |
|
||||
| **Total** | 100 | **70** | Numerically Adjacent. **Classified Stretch** because a defining responsibility is only Adjacent |
|
||||
|
||||
## 3. Document Quality — 84 / 100
|
||||
|
||||
| Dimension | Weight | Score | Reason |
|
||||
|---|--:|--:|---|
|
||||
| Truth and provenance | 25 | 24 | Every claim traces to `claims.json` (audit below). One framing nit: the SW-8 bullet puts the domain-grounded assistants inside "development workflows", but their recorded use is Q&A and domain tasks |
|
||||
| Information hierarchy | 20 | 16 | Employer/title/dates are clean. Page 1 carries only Swisscom, and the Bosch design and ingestion evidence that backs the 3-yr design minimum sits on page 2. About a quarter of page 1 is white space (acceptable, not padding) |
|
||||
| Bullet evidence and impact | 20 | 14 | Specific and scoped, but almost no outcomes: only "reduced manual image classification". No verified scale or impact numbers exist, and none was invented. For a Staff screen the leadership evidence is thin on the page |
|
||||
| Relevance and terminology | 15 | 12 | Ingestion, data quality, design, architecture, testing, GenAI and matrixed work are all covered. The JD's "launching" has no visible counterpart; "technical direction" is absent (correctly, since it is unrecorded) |
|
||||
| Skills evidence | 10 | 9 | Every skill is canonical and interview-ready; 8 rendered lines, at the top of the range |
|
||||
| Mechanics/readability | 10 | 8 | 2 pages, no overfull/underfull boxes, validator 0 warnings, cadence within range. Three bullets run to about 35-37 words (SW-2, BS-2, Generali). Minor hyphenation: *Spot-fire*, *exam-iner*, *mod-els* |
|
||||
| **Total** | 100 | **84** | |
|
||||
|
||||
Truth/provenance is 24/25, above the automatic-failure line.
|
||||
|
||||
## 4. Channel Strength — Weak
|
||||
|
||||
Cold submit through Google Careers. The user has no referral, and Google postings name no contact. The last
|
||||
three cold Google applications drew no interview; no cause is inferred from that. Optional warm action: a short
|
||||
LinkedIn note to a Google Zürich Commerce/Shopping technical recruiter after submitting. It does not upgrade
|
||||
the channel unless it produces a conversation.
|
||||
|
||||
## 5. Competitive read and reader sequence
|
||||
|
||||
- **Obvious-fit competitor:** a senior/staff backend engineer from a large-scale ingestion or catalog team,
|
||||
current in Java/C++, who has tech-led several engineers.
|
||||
- **Dennis's real advantage:** a decade of ingestion and data-quality work across very different sources (fab
|
||||
sensor/process data, telco fulfillment data), current data-product design on AWS, and production
|
||||
integration under a hard failure constraint (24/7 fab).
|
||||
- **Competitor's real advantage:** Google-scale distributed systems, current Java/C++, and a recorded
|
||||
tech-lead role. Do not value the bridge as highly as their direct evidence.
|
||||
|
||||
| Reader | Verdict | Reason |
|
||||
|---|---|---|
|
||||
| Parser/ATS | Pass | Single column; text extracts in employer, dates, title, location order; core JD terms present |
|
||||
| Recruiter glance | **Borderline** | Minimums visibly met, but no Staff-level tech-lead signal. The recruiter may consider a lower level or pass |
|
||||
| Hiring manager | Maybe | Ingestion and data quality are directly relevant; scale and team leadership are not shown |
|
||||
| Technical reviewer | Credible | First challenges: "a system you designed end to end, its scale and trade-offs"; "how you set direction for other engineers"; Java currency |
|
||||
|
||||
## 6. Claim audit
|
||||
|
||||
| Claim | Canonical | D/A | Safe? | Fix |
|
||||
|---|---|---|---|---|
|
||||
| Summary: over ten years of software engineering | GENERALI 2015-05 → present (Capgemini omitted) | Direct | yes | — |
|
||||
| Summary/BS: designed ingestion scripts and the ML-inference integration | BS-2, BS-1 (2026-10-21) | Direct | yes | — |
|
||||
| Design and build governed data products ... Atlassian Compass | SW-7 | Direct | yes, scoped to "within company-wide Data Mesh" | — |
|
||||
| Migrated legacy ETL for owned domains ... Glue/PySpark/Iceberg/Airflow, pytest, part of company-wide programme | SW-1, SW-6, SW-9 | Direct | yes, scope hedged | — |
|
||||
| Owned ETL component, Oracle → Teradata, quality/security/compliance, on-call | SW-2 (past) | Direct | yes, past tense | — |
|
||||
| Integrated LLM tooling into development workflows; configured assistants; LiteLLM, Copilot, Kiro | SW-8 | Direct (modest) | yes; framing nit | Tier 2 #3 |
|
||||
| Onboarded and mentored junior developers; prototype-and-iterate with stakeholders | SW-10, SW-4 | Direct | yes, past tense | — |
|
||||
| Data services in Python and Java over Oracle and Hadoop/Impala; defect/image/PCM data | BS-2 | Direct | yes | — |
|
||||
| Normalized spatial wafer data (SDO_GEOMETRY) across CRS; tuned performance | BS-8 | Direct | yes; transformation location not asserted | — |
|
||||
| ML inference integration; defect could have halted production; reduced manual classification | BS-1 | Direct | yes; approved wording, qualitative result | — |
|
||||
| Technical Application Owner, KLA DMS and Spotfire; TAF 2022 co-presentation | BS-3, BS-5 | Direct | yes | — |
|
||||
| Guided juniors; one Bachelor thesis as second examiner | BS-9, BS-7 | Direct | yes, not pluralised | — |
|
||||
| Fraunhofer: C#/SQL Server, Jenkins build jobs; Express.js/Docker microservices | FC-1, FC-3 | Direct | yes ("set up", no quality-gate claim) | — |
|
||||
| Vizrt: test suites as CI/CD quality gates; contributed Python/C++ | VZ-2, VZ-1 | Direct / contribution | yes | — |
|
||||
| Generali: Java/J2EE services, contributed to design; introduced BDD, trained team | GN-3, GN-1 | Direct | yes | — |
|
||||
| Skills: all listed; Kafka and Kubernetes historical but `allowed` | skills array | — | yes | — |
|
||||
| Certifications: AWS SAA 2024-2027; iSAQB CPSA-F 2016; IBM AI Engineering 2020 | thiessen_certifications.md | — | yes; IBM not shown as academic | — |
|
||||
|
||||
Forbidden-term scan (validator): clean. No Capgemini, no LangChain, no Terraform/GCP/Flume, and no unverified
|
||||
metric.
|
||||
|
||||
## 7. Fixes
|
||||
|
||||
**Tier 1 (truth/fit, blocks approval): none.** Validator PASS, and every claim is canonical. The Stretch
|
||||
classification is a fit finding the user already knows about, not a document defect.
|
||||
|
||||
**Tier 2 (presentation, optional, ranked by expected effect):**
|
||||
1. **Leadership evidence: ask, don't write.** This is the decisive gap for a Staff screen. If true, the most
|
||||
valuable addition would be one recorded instance of setting technical direction for other engineers. For
|
||||
example: a data-product design pattern or modelling convention others adopted, design reviews he ran, or
|
||||
coordinating his domains' migration with other teams. It can only be added after the user confirms it and
|
||||
it is recorded in `claims.json`.
|
||||
2. **Scale.** Any verifiable count (data products designed, source systems onboarded, pipelines migrated, data
|
||||
volumes) would answer the "large-scale" question. Same rule: only from the user, recorded first.
|
||||
3. **SW-8 framing.** "Integrated LLM tooling into development workflows, configuring domain-grounded
|
||||
assistants..." links the assistants to development work, which is not recorded. Safer: "Configured
|
||||
domain-grounded LLM assistants by selecting models and supplying curated knowledge; use LiteLLM APIs,
|
||||
Copilot and Kiro in development."
|
||||
4. **A launch signal.** BS-1 allows `deployed`: "Designed the integration of containerized ML inference ...
|
||||
and deployed it into a continuously operating semiconductor fab, where ..." puts the JD's
|
||||
testing-and-launching sense into words without a new claim.
|
||||
5. **Trim the three ~35-37-word bullets** (SW-2, BS-2, Generali) by a clause each. Optional; they parse fine.
|
||||
|
||||
## 8. Cover letter
|
||||
|
||||
Decision NO stands: not requested, the screen is driven by minimum qualifications, and a letter would add no
|
||||
transition, relocation or personal-connection context. Not penalised.
|
||||
|
||||
## 9. Mechanical verification
|
||||
|
||||
- `validate_resume_system.py --document`: PASS, 0 warnings.
|
||||
- Fresh scratch compile: 2 pages, no overfull/underfull boxes. Its text matches the delivered PDF except the
|
||||
single-pass page footer.
|
||||
- `pdftotext`: employer, dates, title, location in order for all five roles; 648 words.
|
||||
- PDF metadata: empty Title and Author; Producer MiKTeX pdfTeX.
|
||||
- Contact line: Bern, B permit, email, phone, LinkedIn. No personal data. No Capgemini.
|
||||
- `page_metrics.py` could not run (Git's `pdftotext` lacks `-bbox`). Visually, experience starts at about 45%
|
||||
of page 1.
|
||||
|
||||
**Status:** not submit-ready until the user approves this critique and decides on the Tier 2 items. Fit class
|
||||
Stretch; hard gate PASS.
|
||||
@@ -0,0 +1,89 @@
|
||||
% Google - Staff Software Engineer, Shopping Graph (Feeds Infra), Zurich.
|
||||
% International Tech profile. Generated 2026-10-21 from resume_builder/canonical/claims.json
|
||||
% and the experience files; no historical output used as a source.
|
||||
% Session: session_google_staff_swe_shopping_graph.md
|
||||
|
||||
\documentclass{resume}
|
||||
\usepackage[utf8]{inputenc}
|
||||
\usepackage[T1]{fontenc}
|
||||
\usepackage{lmodern}
|
||||
\usepackage[a4paper,left=0.65in,right=0.65in,top=0.55in,bottom=0.55in]{geometry}
|
||||
\usepackage{xcolor}
|
||||
\usepackage{hyperref}
|
||||
\hypersetup{hidelinks}
|
||||
\usepackage[version=4]{mhchem}
|
||||
\usepackage{fancyhdr}
|
||||
\pagestyle{fancy}
|
||||
\fancyhf{}
|
||||
\renewcommand{\headrulewidth}{0pt}
|
||||
\fancyfoot[R]{\small \thepage/\pageref{LastPage}}
|
||||
|
||||
\name{Dennis Thiessen, M.Eng.}
|
||||
\headline{Staff Data Engineer $\vert$ Data Ingestion, Data Products, Data Quality $\vert$ Python, PySpark, AWS}
|
||||
\contactline{Bern, Switzerland (Swiss B permit) $\vert$ \href{mailto:dennis@thiessen.io}{dennis@thiessen.io} $\vert$ +41 795 955 585 $\vert$ \href{https://linkedin.com/in/dennis-thiessen}{LinkedIn}}
|
||||
|
||||
\begin{document}
|
||||
|
||||
\begin{rSection}{Summary}
|
||||
Staff data engineer with over ten years of software engineering. At Swisscom, sets the technical direction for the data products of his domains and designs and builds them on AWS; at Bosch, designed the ingestion scripts and the ML-inference integration for a continuously operating semiconductor fab.
|
||||
\end{rSection}
|
||||
|
||||
\begin{rSection}{Technical Skills}
|
||||
\skillline{Languages}{Python, SQL, Bash; Java and Kotlin (earlier roles)}
|
||||
\skillline{Data processing}{PySpark, AWS Glue, Apache Airflow, Apache Iceberg, Athena, Redshift, Kafka, Oracle, Teradata, Hadoop/Impala; relational data modelling}
|
||||
\skillline{Platform}{AWS, CloudFormation, Docker, Kubernetes, GitLab CI/CD, Jenkins, Ansible, Linux}
|
||||
\skillline{Testing}{Unit testing with pytest; automated test suites as CI/CD quality gates; BDD test automation}
|
||||
\skillline{AI tooling}{LiteLLM, domain-grounded LLM assistants, Copilot, Kiro}
|
||||
\skillline{Certifications}{AWS Solutions Architect -- Associate (2024--2027); iSAQB \mbox{CPSA-F} software architecture (2016); IBM AI Engineering (2020)}
|
||||
\end{rSection}
|
||||
|
||||
\begin{rSection}{Professional Experience}
|
||||
|
||||
\begin{rSubsection}{Swisscom (Schweiz) AG}{Oct 2023 -- Present}{Staff Data, Analytics \& AI Engineer (promoted from Senior, Apr 2025)}{Bern, Switzerland}
|
||||
\item Design and build governed data products on AWS within Swisscom's company-wide Data Mesh: logical and physical relational models, source onboarding, and metadata and lineage documented in Atlassian Compass.
|
||||
\item Set the technical direction for a B2B data product whose requirements could not be fixed up front: built a prototype, proposed it to business stakeholders, architects and engineers, and iterated on it with them. Onboarded and mentored junior developers.
|
||||
\item As primary engineer for the owned data domains, migrated their legacy ETL pipelines to AWS as Python and PySpark Glue jobs on Apache Iceberg tables, orchestrated with Airflow and unit-tested with pytest, within the company-wide migration programme.
|
||||
\item Component Owner for the ETL that loaded business-critical Fulfillment data from Oracle into the Teradata data warehouse; responsible for its data quality and governance compliance through to on-call support.
|
||||
\item Integrated GenAI tools and LLM interfaces into workflows: configured domain-grounded assistants with curated knowledge and called models through LiteLLM APIs; develop with Copilot and Kiro.
|
||||
\end{rSubsection}
|
||||
\end{rSection}
|
||||
|
||||
% Keep the current role on page 1 and start Bosch, the second major evidence block, on page 2.
|
||||
\newpage
|
||||
|
||||
\begin{rSection}{Professional Experience (continued)}
|
||||
\begin{rSubsection}{Robert Bosch Semiconductor Manufacturing Dresden GmbH}{Feb 2020 -- Dec 2022}{Senior Data Engineer, Data Analysis (promoted from Data Engineer, Jan 2021)}{Dresden, Germany}
|
||||
\item Designed and built ingestion scripts and developed Python and Java data services over Oracle and Hadoop/Impala, serving fab analysis teams with defect records, wafer inspection images and PCM electrical parameters.
|
||||
\item Normalized spatial wafer data (Oracle SDO\_GEOMETRY) across the different coordinate reference systems of fab tools and systems and transformed it between them; tuned its performance.
|
||||
\item Designed the integration of containerized ML inference (Docker, Kubernetes, Ansible) and deployed it into a continuously operating semiconductor fab, where a software defect could have halted production; it reduced manual image classification.
|
||||
\item Served as technical Application Owner for the KLA Defect Management System and TIBCO Spotfire, defining their SLOs and handling vendor communication; co-presented wafer-map analytics at TIBCO Analytics Forum 2022.
|
||||
\item Guided junior developers and supervised student work, including one Bachelor thesis as second examiner.
|
||||
\end{rSubsection}
|
||||
|
||||
\begin{rSubsection}{Fraunhofer Center for Maritime Logistics and Services CML}{Sep 2018 -- Oct 2019}{Research Software Engineer}{Hamburg, Germany}
|
||||
\item Developed C\# crew-scheduling software on Microsoft SQL Server and set up Jenkins build jobs for its automated deployment; built microservices for a research data-exchange platform with Express.js and Docker.
|
||||
\end{rSubsection}
|
||||
|
||||
\begin{rSubsection}{Vizrt}{Jul 2017 -- May 2018}{Test Automation / DevOps Engineer}{Bergen, Norway}
|
||||
\item Developed automated test suites and connected them to the CI/CD pipeline as quality gates; contributed Python and C++ engineering to a distributed video-transcoding backend.
|
||||
\end{rSubsection}
|
||||
|
||||
\begin{rSubsection}{Generali Deutschland Informatik Services GmbH}{May 2015 -- Jun 2017}{IT Consultant}{Hamburg, Germany}
|
||||
\item Developed Java/J2EE workflow services and contributed to their design and architecture; introduced Behaviour-Driven Development and trained the project team in it, with technical responsibility for its test automation.
|
||||
\end{rSubsection}
|
||||
|
||||
\end{rSection}
|
||||
|
||||
\begin{rSection}{Education}
|
||||
\compactentry{M.Eng. Computer Aided Engineering}{Apr 2012 -- Oct 2013}
|
||||
Universität der Bundeswehr München; Software Design \& Engineering.
|
||||
|
||||
\compactentry{B.Eng. Information and Telecommunication Technologies}{Oct 2009 -- Oct 2012}
|
||||
Universität der Bundeswehr München.
|
||||
\end{rSection}
|
||||
|
||||
\begin{rSection}{Languages}
|
||||
German (native), English (fluent)
|
||||
\end{rSection}
|
||||
|
||||
\end{document}
|
||||
+208
@@ -0,0 +1,208 @@
|
||||
URL: https://www.google.com/about/careers/applications/jobs/results/102064172115600070-staff-software-engineer-shopping-graph?location=Switzerland
|
||||
FINAL: https://www.google.com/about/careers/applications/jobs/results/102064172115600070-staff-software-engineer-shopping-graph?location=Switzerland
|
||||
|
||||
google.com/about/careers/applications uses cookies to deliver and enhance the quality of its services and to analyze traffic. If you agree, cookies are also used to serve advertising and to personalize the content and advertisements that you see. Learn more
|
||||
|
||||
Agree
|
||||
No thanks
|
||||
Careers
|
||||
Skip navigation links
|
||||
home
|
||||
Home
|
||||
Home
|
||||
work_outline
|
||||
Jobs
|
||||
Jobs
|
||||
noogler_hat
|
||||
Students
|
||||
Students
|
||||
google
|
||||
How we work
|
||||
How we work
|
||||
handyman
|
||||
How we hire
|
||||
How we hire
|
||||
person_outline
|
||||
Your career
|
||||
Your career
|
||||
|
||||
help_outline
|
||||
Help link
|
||||
feedback
|
||||
Send feedback
|
||||
Sign in
|
||||
Job Details
|
||||
arrow_back
|
||||
Back to jobs search
|
||||
Jobs Search Results
|
||||
AI Strategic Pursuit Lead, Automotive Agent, Google Cloud EMEA
|
||||
|
||||
London, UK; Zürich, Switzerland; +1 more
|
||||
|
||||
Staff Forward Deployed Engineer, GenAI, Google Cloud
|
||||
|
||||
Zürich, Switzerland
|
||||
|
||||
Software Engineer III, Shopping Ads
|
||||
|
||||
Zürich, Switzerland
|
||||
|
||||
Solution Architect, Capital Markets and Exchanges, Google Cloud
|
||||
|
||||
Frankfurt am Main, Germany; Zürich, Switzerland; +2 more
|
||||
|
||||
Staff Software Engineer, Generative AI, Commerce
|
||||
|
||||
Zürich, Switzerland
|
||||
|
||||
Senior Forward Deployed Engineer, GenAI, Google Cloud
|
||||
|
||||
Zürich, Switzerland
|
||||
|
||||
AI Outcome Customer Engineer, Google Cloud
|
||||
|
||||
Zürich, Switzerland
|
||||
|
||||
Research Scientist, User Signals from Agentic Logs, DeepMind
|
||||
|
||||
Zürich, Switzerland
|
||||
|
||||
Software Engineer III, Search Ads, Quality and AI
|
||||
|
||||
Zürich, Switzerland
|
||||
|
||||
Student Researcher, 2027
|
||||
|
||||
Zürich, Switzerland; Berlin, Germany; +7 more
|
||||
|
||||
Staff Research Engineer, Generative AI, Cloud AI Research, Co-Scientist
|
||||
|
||||
Zürich, Switzerland
|
||||
|
||||
Data Cloud Partner Specialist, Google Cloud
|
||||
|
||||
London, UK; Zürich, Switzerland; +3 more
|
||||
|
||||
Software Engineering PhD Intern, 2027
|
||||
|
||||
Zürich, Switzerland
|
||||
|
||||
Data Scientist Product MS Intern, 2027
|
||||
|
||||
Zürich, Switzerland
|
||||
|
||||
Software Engineer III, YouTube Viewcount and Aggregations
|
||||
|
||||
Zürich, Switzerland
|
||||
|
||||
Software Engineer III, Site Reliability Engineering, Prod AI
|
||||
|
||||
Zürich, Switzerland
|
||||
|
||||
Staff Research Data Scientist, Ads Metrics
|
||||
|
||||
Zürich, Switzerland
|
||||
|
||||
Staff Software Engineer, Site Reliability Engineering, Google Cloud
|
||||
|
||||
Munich, Germany; Zürich, Switzerland
|
||||
|
||||
Senior Staff Software Engineer, Site Reliability Engineering, Privacy, Security and Safety
|
||||
|
||||
Zürich, Switzerland
|
||||
|
||||
Software Engineer III, AI/ML YouTube Shopping Creator
|
||||
|
||||
Zürich, Switzerland
|
||||
|
||||
Showing 1 to 20 of 59 rows
|
||||
1‑20 of 59
|
||||
navigate_next
|
||||
Go to next page
|
||||
Staff Software Engineer, Shopping Graph
|
||||
share
|
||||
Share Staff Software Engineer, Shopping Graph
|
||||
corporate_fare
|
||||
Google
|
||||
place
|
||||
Zürich, Switzerland
|
||||
bar_chart
|
||||
Advanced
|
||||
Apply
|
||||
info_outline
|
||||
X
|
||||
In most instances, this position requires in-person interviews as part of the hiring process.
|
||||
|
||||
|
||||
Minimum qualifications:
|
||||
Bachelor's degree or equivalent practical experience.
|
||||
|
||||
8 years of experience programming in C++, Java, Python, Kotlin or Go.
|
||||
5 years of experience testing, and launching software products.
|
||||
|
||||
3 years of experience with software design and architecture.
|
||||
Experience integrating generative AI tools or LLM interfaces into workflows.
|
||||
|
||||
|
||||
Preferred qualifications:
|
||||
Master’s degree or PhD in Engineering, Computer Science, or a related technical field.
|
||||
|
||||
8 years of experience with data structures/algorithms.
|
||||
3 years of experience in a technical leadership role leading project teams and setting technical direction.
|
||||
|
||||
3 years of experience working in a complex, matrixed organization involving cross-functional, or cross-business projects.
|
||||
About the job
|
||||
|
||||
Google's software engineers develop the next-generation technologies that change how billions of users connect, explore, and interact with information and one another. Our products need to handle information at massive scale, and extend well beyond web search. We're looking for engineers who bring fresh ideas from all areas, including information retrieval, distributed computing, large-scale system design, networking and data storage, security, artificial intelligence, natural language processing, UI design and mobile; the list goes on and is growing every day. As a software engineer, you will work on a specific project critical to Google’s needs with opportunities to switch teams and projects as you and our fast-paced business grow and evolve. We need our engineers to be versatile, display leadership qualities and be enthusiastic to take on new problems across the full-stack as we continue to push technology forward.
|
||||
|
||||
The Shopping Graph is Google's comprehensive dataset of commercial information. It powers shopping experiences across all of Google, including Search, YouTube, Ads, and next-generation AI experiences like Gemini and AI Overviews. The Data Acquisition team is responsible for acquiring this high-quality commerce data. Our vision is to make it effortless for merchants to submit and enhance their product information, ensuring the Shopping Graph maintains extensive coverage and data quality.
|
||||
|
||||
As a core pillar within Data Acquisition, the Feeds Infra team builds and owns the foundational infrastructure that ingests data into the Shopping Graph via files, APIs, and web crawling. Beyond ingestion, we empower merchants and downstream teams to continuously improve product data quality, meeting the rigorous demands and rising bar of Agentic Commerce.
|
||||
|
||||
|
||||
People shop on Google more than a billion times a day - and the Commerce team is responsible for building the experiences that serve these users. The mission for Google Commerce is to be an essential part of the shopping journey for consumers - from inspiration to to a simple and secure checkout experience - and the best place for retailers/merchants to connect with consumers. We support and partner with the commerce ecosystem, from large retailers to small local merchants, to give them the tools, technology and scale to thrive in today’s digital world.
|
||||
|
||||
Responsibilities
|
||||
Provide technical leadership on high-impact projects.
|
||||
|
||||
Influence and coach a distributed team of engineers.
|
||||
|
||||
Facilitate alignment and clarity across teams on goals, outcomes, and timelines.
|
||||
|
||||
Manage project priorities, deadlines, and deliverables.
|
||||
|
||||
Design, develop, test, deploy, maintain, and enhance large-scale software solutions.
|
||||
|
||||
|
||||
Information collected and processed as part of your Google Careers profile, and any job applications you choose to submit is subject to Google's Applicant and Candidate Privacy Policy.
|
||||
|
||||
Google is proud to be an equal opportunity and affirmative action employer. We are committed to building a workforce that is representative of the users we serve, creating a culture of belonging, and providing an equal employment opportunity regardless of race, creed, color, religion, gender, sexual orientation, gender identity/expression, national origin, disability, age, genetic information, veteran status, marital status, pregnancy or related condition (including breastfeeding), expecting or parents-to-be, criminal histories consistent with legal requirements, or any other basis protected by law. See also Google's EEO Policy, Know your rights: workplace discrimination is illegal, Belonging at Google, and How we hire.
|
||||
|
||||
If you have a need that requires accommodation, please let us know by completing our Accommodations for Applicants form.
|
||||
|
||||
Google is a global company and, in order to facilitate efficient collaboration and communication globally, English proficiency is a requirement for all roles unless stated otherwise in the job posting.
|
||||
|
||||
To all recruitment agencies: Google does not accept agency resumes. Please do not forward resumes to our jobs alias, Google employees, or any other organization location. Google is not responsible for any fees related to unsolicited resumes.
|
||||
|
||||
Equity is granted exclusively and discretionarily by Alphabet Inc. on the basis of an agreement concluded between you and Alphabet Inc. Alphabet Inc. is your sole contractual partner with respect to equity grants. GSU grants are not guaranteed, are discretionary, are subject to approval by the Alphabet Inc. board of directors or its delegate, the terms of the relevant Alphabet Inc. stock plan, and your grant agreement. They have no impact on statutory payments. Current or past grants do not confer an acquired right.
|
||||
|
||||
Follow Life at Google on
|
||||
More about us
|
||||
About usopen_in_new
|
||||
Contact usopen_in_new
|
||||
Pressopen_in_new
|
||||
Related Information
|
||||
Investor relationsopen_in_new
|
||||
Blogopen_in_new
|
||||
Equal Opportunity
|
||||
|
||||
Google is proud to be an equal opportunity and affirmative action employer. We are committed to building a workforce that is representative of the users we serve, creating a culture of belonging, and providing an equal employment opportunity regardless of race, creed, color, religion, gender, sexual orientation, gender identity/expression, national origin, disability, age, genetic information, veteran status, marital status, pregnancy or related condition (including breastfeeding), expecting or parents-to-be, criminal histories consistent with legal requirements, or any other basis protected by law. See also Google's EEO Policy, Know your rights: workplace discrimination is illegal, Belonging at Google, and How we hire.
|
||||
|
||||
Privacyopen_in_new
|
||||
Applicant & Candidate Privacyopen_in_new
|
||||
Termsopen_in_new
|
||||
Manage cookies
|
||||
helpHelpopen_in_new
|
||||
language
|
||||
English
|
||||
Info In most instances, this position requires in-person interviews as part of the hiring process.
|
||||
@@ -0,0 +1,59 @@
|
||||
\ProvidesClass{resume}[2026/07/27 Evidence-first professional resume]
|
||||
\LoadClass[11pt,a4paper]{article}
|
||||
|
||||
\RequirePackage{enumitem}
|
||||
\RequirePackage{ifthen}
|
||||
\RequirePackage{lastpage}
|
||||
\RequirePackage{parskip}
|
||||
\RequirePackage{needspace}
|
||||
|
||||
\pagestyle{empty}
|
||||
\setlength{\parindent}{0pt}
|
||||
|
||||
\def\@resumename{}
|
||||
\def\@resumeheadline{}
|
||||
\def\@resumecontact{}
|
||||
|
||||
\newcommand{\name}[1]{\def\@resumename{#1}}
|
||||
\newcommand{\headline}[1]{\def\@resumeheadline{#1}}
|
||||
\newcommand{\contactline}[1]{\def\@resumecontact{#1}}
|
||||
|
||||
\newcommand{\printresumeheader}{%
|
||||
{\LARGE\bfseries \@resumename}\par
|
||||
\vspace{0.15em}
|
||||
\ifthenelse{\equal{\@resumeheadline}{}}{}{\@resumeheadline\par}
|
||||
\vspace{0.1em}
|
||||
{\small \@resumecontact}\par
|
||||
\vspace{0.45em}
|
||||
}
|
||||
|
||||
\AtBeginDocument{\printresumeheader}
|
||||
|
||||
\newenvironment{rSection}[1]{%
|
||||
\vspace{0.35em}
|
||||
{\bfseries #1}\par
|
||||
\vspace{0.1em}\hrule\vspace{0.35em}
|
||||
}{%
|
||||
\vspace{0.2em}
|
||||
}
|
||||
|
||||
% Arguments: employer, dates, formal title, location.
|
||||
\newenvironment{rSubsection}[4]{%
|
||||
\Needspace{6\baselineskip}%
|
||||
{\bfseries #1}\hfill{\small #2}\par
|
||||
{\itshape #3}\hfill{\itshape #4}\par
|
||||
\vspace{0.1em}
|
||||
\begin{itemize}[leftmargin=1.25em,label=\textbullet,itemsep=0.18em,topsep=0.15em,parsep=0pt,partopsep=0pt]
|
||||
}{%
|
||||
\end{itemize}
|
||||
\vspace{0.25em}
|
||||
}
|
||||
|
||||
\newcommand{\skillline}[2]{%
|
||||
\textbf{#1:} #2\par
|
||||
\vspace{0.08em}
|
||||
}
|
||||
|
||||
\newcommand{\compactentry}[2]{%
|
||||
\textbf{#1}\hfill #2\par
|
||||
}
|
||||
@@ -0,0 +1,182 @@
|
||||
# Session: Google — Staff Software Engineer, Shopping Graph (Feeds Infra)
|
||||
|
||||
## JD Integrity
|
||||
- File/source: `jd_google_staff_swe_shopping_graph_2026-10-21.txt` (this folder). Employer posting:
|
||||
https://www.google.com/about/careers/applications/jobs/results/102064172115600070-staff-software-engineer-shopping-graph?location=Switzerland
|
||||
- Retrieval method and date: Playwright render of the employer page (job_scout `.venv`), 2026-10-21. Also present in
|
||||
the 2026-10-08, 10-14 and 10-20 scout runs.
|
||||
- Verbatim posting: YES (full rendered page text; page chrome kept, unedited).
|
||||
- Posting status: LIVE on 2026-10-21. Location Zürich only. Google level label "Advanced". No salary range shown.
|
||||
*"In most instances, this position requires in-person interviews."*
|
||||
|
||||
## Application Decision
|
||||
- Audience profile: International Tech
|
||||
- Evidence Fit: 73 (provisional, pre-critique)
|
||||
- Fit class: **Stretch.** The score alone would read Adjacent, but `application_strategy.md` defines Stretch as
|
||||
"a defining responsibility is only Adjacent", and on a Staff req technical leadership is defining (rows 8, 10,
|
||||
11 are Adjacent). The comparison alternative, Senior SWE SRE YouTube ML, would also be Stretch (pure SRE is a
|
||||
listed Stretch target; its distributed-systems and leadership minimums are Adjacent), so the pick stands.
|
||||
Fit class is a preparation signal, not a spend limit: expect the leadership questions.
|
||||
- Hard gate: PASS. All five minimum qualifications are Direct; the design/architecture line became Direct with the
|
||||
user's 2026-10-21 clarification.
|
||||
- Channel Strength: Weak
|
||||
- Channel plan: cold submit via Google Careers. The user has no referral (2026-10-21). Optional warm action after
|
||||
submitting: a short LinkedIn note to a Google Zürich Commerce/Shopping technical recruiter.
|
||||
- Named contact published? NO (Google postings name no contact).
|
||||
- Decision: PROCEED (user chose this req 2026-10-21 as the single Google application)
|
||||
- Google limits: 3 applications per rolling 30 days; last Google submit 2026-07-27 (SWE III Business Home). Not a role
|
||||
he applied to before, so the 90-day same-role wait does not apply.
|
||||
- Prior Google record (context, no causal inference): SWE III Business Home, Senior Data Engineer (Merchant DS) and
|
||||
Sr SWE Infrastructure (Data Pipeline) went cold and drew no interview.
|
||||
|
||||
## Requirements
|
||||
| # | Requirement | Required/preferred | Direct/Adjacent/Gap/Constraint | Canonical evidence | Gate? |
|
||||
|---|---|---|---|---|---|
|
||||
| 1 | Bachelor's degree or equivalent | Required | Direct | EDU-BENG, EDU-MENG | yes |
|
||||
| 2 | 8 yrs programming in C++, Java, Python, Kotlin or Go | Required | Direct but TIGHT: ~8.0 yrs elapsed without Vizrt (Generali Java 2015-17, Bosch Python/Java/Kotlin 2020-22, Swisscom Python 2023-), ~8.8 with Vizrt Python (VZ-1 rests on a user statement the reference letter does not corroborate); Fraunhofer C#/JS not counted. Name the language in each role's bullet so a recruiter can count | GN-3, VZ-1, BS-2, SW-1, SW-6 | yes |
|
||||
| 3 | 5 yrs testing and launching software products | Required | Direct | GN-1, VZ-2, FC-1, BS-1, BS-2, SW-1, SW-9 | yes |
|
||||
| 4 | 3 yrs software design and architecture | Required | Direct, scoped to own components (Bosch 2020-22 + Swisscom data products; user-confirmed 2026-10-21) | BS-1, BS-2, SW-7, GN-3 (contribution) | yes |
|
||||
| 5 | Integrating GenAI tools or LLM interfaces into workflows | Required | Direct, modest depth (configuration/integration level only) | SW-8; LiteLLM, Copilot, Kiro | yes |
|
||||
| 6 | Master's/PhD in Engineering or CS | Preferred | Direct | EDU-MENG (Software Design & Engineering focus) | no |
|
||||
| 7 | 8 yrs data structures/algorithms | Preferred | Adjacent (practised, not separately recorded; interview-tested) | general | no |
|
||||
| 8 | 3 yrs technical leadership leading project teams, setting technical direction | Preferred | Adjacent: component/application ownership, BDD introduction, mentoring; no project-team lead recorded | SW-2, BS-3, GN-1, BS-9, SW-10 | no |
|
||||
| 9 | 3 yrs complex matrixed org, cross-functional projects | Preferred | Direct | SWISSCOM (SAFe ART, company-wide Data Mesh), BOSCH (fab teams, vendors) | no |
|
||||
| 10 | Technical leadership on high-impact projects; influence and coach a distributed team | Responsibility | Adjacent | SW-2, BS-3, BS-9, SW-10 | no |
|
||||
| 11 | Facilitate cross-team alignment; manage priorities, deadlines, deliverables | Responsibility | Adjacent | SW-4 (prototype-and-iterate with stakeholders/architects), SW-3 (backlog with PO) | no |
|
||||
| 12 | Design, develop, test, deploy, maintain large-scale software | Responsibility | Direct for the function; Google scale is Adjacent | SW-1, SW-7, BS-1, BS-2 | no |
|
||||
| 13 | Feeds infrastructure: ingestion via files, APIs, web crawling; product data quality | Domain | Direct for ingestion and data quality; web crawling Gap; commerce/merchant domain Gap | SW-2, SW-1, SW-7, BS-2, BS-8 | no |
|
||||
| 14 | Zürich onsite/hybrid, in-person interviews | Constraint | Constraint: Thun–Zürich commute and fewer than his 3 homeoffice days; acceptable only for a clear overall improvement (config Job-change Preferences). Clarify at first contact | config.md | no |
|
||||
|
||||
Evidence Fit (critique_framework.md): required 32/35 · responsibilities 17/25 · level/ownership 8/15 ·
|
||||
recency/depth 7/10 · domain/tool transfer 6/10 · practical 3/5 = **73**. Class **Stretch** by definition (defining
|
||||
responsibility only Adjacent), not by score. Serious gap: Staff-level technical leadership (rows 8, 10, 11).
|
||||
|
||||
## Competitive Read
|
||||
- Obvious-fit candidate: a senior/staff backend engineer from a large-scale ingestion or catalog team (Google
|
||||
internal, Amazon catalog, a marketplace), current in Java/C++, who has tech-led a team of engineers.
|
||||
- Dennis's advantage: over a decade of end-to-end ingestion and data-quality work across very different sources (fab
|
||||
sensor/process data, telco fulfillment data), current design of governed data products on AWS, production
|
||||
integration under a hard failure constraint (24/7 fab), and long work inside matrixed enterprises.
|
||||
- Their advantage: Google-scale distributed systems, current Java/C++, a recorded tech-lead role, and fluency in
|
||||
the data-structures/algorithms interview.
|
||||
- Level/scope comparison: Staff (L6) asks for project-team leadership he has only as component/application owner
|
||||
and mentor. Present that honestly; do not inflate it.
|
||||
|
||||
## Framing Strategy
|
||||
- Professional identity: Staff data engineer who designs and builds data ingestion and data products.
|
||||
- Strongest proof points: SW-7 (design of governed data products, current), SW-2 (owned ingestion component with
|
||||
data quality and on-call), BS-2/BS-1 (designed ingestion services and the ML-inference integration at Bosch).
|
||||
- Honest adjacent bridges: Glue/PySpark/Airflow ingestion as a bridge to Feeds Infra; Bosch normalization across
|
||||
coordinate systems (BS-8) as a data-quality story; SW-8 as the GenAI-in-workflows minimum.
|
||||
- Explicit gaps: web crawling, commerce domain, Google internal stack (Flume/Spanner/Bigtable are forbidden as
|
||||
claims), technical leadership of a team, current Java.
|
||||
- User directives: none beyond the role choice.
|
||||
|
||||
## Resume Plan
|
||||
- Summary: 2 lines.
|
||||
- Skills: about 5 rendered lines plus certifications (see the plan presented 2026-10-21).
|
||||
- Swisscom: SW-7, SW-1+SW-6+SW-9, SW-8, SW-2, SW-10+SW-4 (5 bullets; mentoring leads the last one).
|
||||
- Bosch: BS-2 ("designed" covers the ingestion scripts only), BS-1, BS-8, BS-3+BS-5+BS-9 (4 bullets); BS-6 held in
|
||||
reserve.
|
||||
- Earlier experience: Fraunhofer FC-1+FC-3, Vizrt VZ-2+VZ-1, Generali GN-1+GN-3 (1 each; GN-1 shows introducing BDD,
|
||||
presenting it and training the project).
|
||||
- Leadership evidence, allowed verbs only (owned, served, onboarded, mentored, guided, introduced, trained): SW-2,
|
||||
BS-3, SW-10, BS-9, GN-1. Never "led" or "managed".
|
||||
- Total bullets: 12.
|
||||
- Impact evidence still needed: none claimed. All metrics are unverified and omitted.
|
||||
- Open wording check: SW-8 "migration and data-mapping" detail rests on `experience_swisscom.md` (user-confirmed
|
||||
2026-07-10), not on canonical SW-8 scope. Ask before using it.
|
||||
|
||||
## Cover Letter Decision
|
||||
- YES/NO: NO
|
||||
- Reason: not requested; Google's screen is minimum-qualification driven, and there is no transition, relocation or
|
||||
personal connection a letter would add. If the portal offers an optional field, leave it empty.
|
||||
- Information it adds beyond resume: none material.
|
||||
- Verified hook sources: n/a
|
||||
|
||||
## As Built (2026-10-21)
|
||||
- Plan confirmed by the user 2026-10-21 ("i confirm, go on"). The SW-8 "migration and data-mapping" detail was
|
||||
NOT answered, so it is omitted (accuracy default).
|
||||
- 13 bullets: Swisscom 5 (SW-7; SW-1+SW-6+SW-9; SW-2; SW-8; SW-10+SW-4), Bosch 5 (BS-2; BS-8; BS-1; BS-3+BS-5;
|
||||
BS-9+BS-7), Fraunhofer 1 (FC-1+FC-3), Vizrt 1 (VZ-2+VZ-1), Generali 1 (GN-3+GN-1). The Bosch mentoring line was
|
||||
split into its own short bullet (cadence and the two-accomplishment limit).
|
||||
- Self-audit fixes before presenting: Kotlin removed from the BS-2 data-services bullet (the services were
|
||||
Python/Java/C#; Kotlin was backend, Ansible plugins and extensions); "team workflows" changed to "development
|
||||
workflows" (team adoption is not recorded); "maritime" removed from FC-3 (not recorded for the platform); BS-8 reworded so it no longer says the coordinate
|
||||
transformation ran inside Oracle (BS-8 establishes SDO_GEOMETRY data and CRS transformation as separate facts;
|
||||
spatial operators are not confirmed) - caught by the advisor review.
|
||||
- Layout: Swisscom on page 1, Bosch starts page 2 (template default), "Professional Experience (continued)".
|
||||
Skills 6 rendered categories / 8 lines. Certifications on one entry; iSAQB CPSA-F kept unbroken with \mbox.
|
||||
- Validation: `validate_resume_system.py --document` PASS, 0 warnings (an initial cadence WARN, 8/13 triples,
|
||||
was fixed by reshaping the SW-8 and Generali sentences). pdflatex: 2 pages, no overfull/underfull boxes.
|
||||
pdftotext order: employer, dates, title, location for every role. PDF metadata: empty Title/Author.
|
||||
`page_metrics.py` could not run (Git's pdftotext rejects `-bbox`); page-1 weighting checked visually instead:
|
||||
experience starts at roughly 45% of page 1.
|
||||
|
||||
## Edit History
|
||||
### 2026-10-21 — post-critique edit (user: "apply improvements which you think are important")
|
||||
- **User directive:** make acceptable stretches to maximise interview chances, including saying he set technical
|
||||
direction. Verbatim context: *"I'm a staff engineer at Swisscom - of course that is my day to day responsibility
|
||||
but i cant think of something concrete right now. Dont add it to the KB."*
|
||||
- **Declined part:** inventing a concrete technical-direction incident he could not name. Reason: Google loops ask
|
||||
for the story behind every line, and a fabricated specific is the likeliest thing to fail there.
|
||||
- **What was done instead:**
|
||||
1. New Swisscom bullet 2 frames the recorded SW-4 prototype-and-iterate episode as setting technical direction
|
||||
(he built a prototype, proposed it to business, architects and engineers, and iterated). This is an existing
|
||||
canonical fact, reframed, and the interview story behind the line. SW-10 mentoring stays in it.
|
||||
2. Summary: "sets the technical direction for the data products of his domains". **Source: the user's
|
||||
2026-10-21 statement above. NOT in `claims.json`, at the user's request.** Scoped to his own domains' data
|
||||
products; no artefact, adoption count or cross-team authority is claimed. Treat it as application-specific
|
||||
wording, not reusable evidence.
|
||||
3. SW-1 bullet opens "As primary engineer for the owned data domains" (SW-1 scope wording).
|
||||
4. SW-2 bullet leads with the Component Owner title.
|
||||
5. SW-8 reframed to mirror the JD minimum ("Integrated GenAI tools and LLM interfaces into workflows") without
|
||||
tying the assistants to development work.
|
||||
6. BS-1: "Designed the integration ... and deployed it" (allowed verbs), a launch signal.
|
||||
7. Headline adds "Data Quality". Trimmed BS-2, BS-3 (user training/documentation dropped) and Generali; GN-1
|
||||
training kept as leadership evidence.
|
||||
- **Before → after:** validator PASS/0 warnings → PASS/0 warnings (two intermediate cadence WARNs fixed by
|
||||
reshaping); 2 → 2 pages; 13 → 13 bullets; no overfull/underfull boxes; employer/title/date order unchanged.
|
||||
- **Estimated Document Quality after edit: ~86** (leadership now visible on page 1; provenance −1 for the
|
||||
user-sourced summary line). The critique is STALE: re-run `/critique` for a scored figure. Evidence Fit is
|
||||
unchanged at 70 Stretch; writing cannot change fit.
|
||||
|
||||
## Output Files
|
||||
- Resume: `e2e_google_staff_swe_shopping_graph_resume.tex` (source of truth) + `.pdf`
|
||||
- Cover letter: intentionally omitted
|
||||
- Critique: `critique_google_staff_swe_shopping_graph.md` (not yet)
|
||||
|
||||
## Critique Summary (2026-10-21, `critique_google_staff_swe_shopping_graph.md`)
|
||||
- Evidence Fit: 70 (critique rescore; provisional was 73). Class **Stretch**: the defining responsibility,
|
||||
Staff-level technical leadership, is only Adjacent.
|
||||
- Hard gate: PASS (all five minimums Direct; 8 yrs programming and GenAI are tight/modest)
|
||||
- Document Quality: 84
|
||||
- Channel Strength: Weak (cold, no referral)
|
||||
- Tier 1 fixes: none
|
||||
- Tier 2: (1) ask for one recorded instance of setting technical direction for other engineers; (2) ask for
|
||||
any verifiable scale count; (3) SW-8 framing; (4) BS-1 "deployed" as a launch signal; (5) trim three long
|
||||
bullets.
|
||||
|
||||
## Status
|
||||
- Fit gate: DONE 2026-10-21 (Adjacent, PASS)
|
||||
- Resume: GENERATED, validated and compiled 2026-10-21; awaiting user approval
|
||||
- Cover letter: NO
|
||||
- Critique: DONE 2026-10-21 (Evidence Fit 70 Stretch, gate PASS, Document Quality 84, channel Weak, no Tier 1).
|
||||
**STALE after the 2026-10-21 post-critique edit** (see Edit History).
|
||||
- Application/outcome: not submitted. At submission: copy the PDF to `Dennis_Thiessen_Resume.pdf`, add the
|
||||
application with `application_tracker.py add` (date = submission date), and set the decision-log row to `applied`.
|
||||
- **FINALIZED 2026-10-21** on user approval ("na, finalize it"). Validator PASS / 0 warnings; PDF newer than `.tex`;
|
||||
`Dennis_Thiessen_Resume.pdf` is a byte-identical copy (2 pages, empty metadata). No cover letter (decision NO).
|
||||
The critique on file predates the last edit (marked stale); the user approved without a re-score.
|
||||
- **SUBMITTED 2026-10-21** via Google Careers, cold (user-confirmed "submitted just now"). Recorded in
|
||||
`job_scout/state/applications.json` as `app-google-staff-shopping-graph-102064172115600070` (stretch, 70, weak,
|
||||
gate pass, applied); decision-log row set to `applied`; `current_applications.md` regenerated.
|
||||
- Google limit: this is the first Google submit since 2026-07-27, so 2 slots remain in the rolling 30 days to
|
||||
2026-11-20.
|
||||
- Next: await Google's response. At first contact clarify the level (L6 vs L5), Zürich hybrid days and the total
|
||||
package. Interview prep: SW-4 prototype story; one concrete Staff example named by the user; Java currency;
|
||||
end-to-end system design with scale and trade-offs. Optional before that: a re-run of `/critique` for a fresh score.
|
||||
Interview prep: have the SW-4 prototype story ready as the "technical direction" answer, plus one day-to-day
|
||||
Staff example he can name himself.
|
||||
- KB changes this session: `knowledge_base/extractions/2026-10-21_software_design_architecture_clarification.md`;
|
||||
`claims.json` BS-1, BS-2 (+`designed` verb), SW-7 scope; `config.md` data-product design row.
|
||||
+123
@@ -0,0 +1,123 @@
|
||||
# Critique: Kongsberg Discovery (Seatex) — Lead Engineer, DevOps and Test Infrastructure
|
||||
|
||||
- Date: 2026-10-08
|
||||
- Documents: `e2e_kongsberg_devops_test_infra_resume.tex` (2 pages), `e2e_kongsberg_devops_test_infra_cover_letter.tex` (1 page, 244 words) + `.txt` paste version
|
||||
- JD: `jd_kongsberg_devops_test_infra.md` — verbatim, live-scraped 2026-10-08, NAV-confirmed (Engelsk, deadline 11.10.2026)
|
||||
- Validator: PASS on both documents, 0 advisory warnings
|
||||
|
||||
## 1. Fit Verdict and Hard Gates
|
||||
|
||||
**Hard gate: FAIL (strict reading), knowingly overridden by the user on 2026-10-08.**
|
||||
|
||||
- *"Experience working with embedded SW and Linux"* (required): Linux **Direct** (BS-6, PP-3). Embedded is **academic only** (ED-1: Embedded Systems coursework in C/C++ and VHDL with an ARM platform, about 13 years ago; none since). Coursework is real but is not the experience the line asks for, so the half-gap stands.
|
||||
- Security clearance: the JD says it *"may"* be required. **Unresolved**, and with no contact planned it stays unresolved until a screen.
|
||||
- On-site Trondheim: the user deferred the relocation decision to offer stage. That is not treated as a pre-apply blocker, but a recruiter will ask.
|
||||
|
||||
**This package is not "recommended for submission" by the gate rules.** It is a deliberate override application with the gap disclosed honestly. That is a legitimate choice. Record it as such so the feedback loop can read the outcome correctly.
|
||||
|
||||
## 2. Evidence Fit — 69 / 100 (Adjacent by number; hard gate overrides)
|
||||
|
||||
| Dimension | Weight | Score | Basis |
|
||||
|---|---:|---:|---|
|
||||
| Required qualifications | 35 | 26 | Degree, DevOps+testing, SW development, Linux, applied AI and Docker are Direct. Embedded is academic only (ED-1). |
|
||||
| Core responsibilities | 25 | 18 | Built test and delivery environments (FC-1, VZ-2, GN-1) and Linux automation (BS-6), and enabled developers (GN-1 training). "Develop SW for products" on embedded products is unproven. |
|
||||
| Level and ownership | 15 | 11 | Senior IC, decide-and-implement scope. Component Owner (SW-2) and Application Owner (BS-3) show ownership. No people management is claimed or needed. |
|
||||
| Recency and depth | 10 | 6 | The test-automation core is 2015–2018 and the infrastructure automation runs to 2022. Current unit testing (SW-9) adds a little. Swisscom CI/CD was used, not built (SW-3). |
|
||||
| Domain/tool transfer | 10 | 6 | Maritime research (FC-1..3) and prior Norway employment. The embedded toolchain (cross-compilation, HIL, Yocto-type builds) is unknown. |
|
||||
| Practical constraints | 5 | 2 | English working language and EEA free movement are fine. Clearance is open; relocation is deferred. |
|
||||
|
||||
Up from 67 at triage, because coursework (ED-1) and current unit testing (SW-9) are now recorded.
|
||||
|
||||
## 3. Document Quality — 84 / 100
|
||||
|
||||
| Dimension | Weight | Score | Basis |
|
||||
|---|---:|---:|---|
|
||||
| Truth and provenance | 25 | 22 | Every claim traces to a canonical ID with allowed verbs (audit below). −3: the unit-test clause and pytest are pending confirmation, and the past-phase Swisscom lead bullet can read as current. |
|
||||
| Information hierarchy | 20 | 18 | Employer/dates then title/location, verified in `pdftotext`. Swisscom and all of Bosch are on page 1. Experience starts about mid-page after a 7-line profile and an 8-line skills block, within guidance. |
|
||||
| Bullet evidence and impact | 20 | 14 | Specific and scoped (credential-caching plugin, "a defect could have stopped production"). No verified outcomes exist, so most bullets describe work rather than results, which is honest but limits impact. |
|
||||
| Relevance and terminology | 15 | 12 | DevOps, Linux, Docker, CI/CD, Jenkins, GitLab, test automation, AI and Python all appear naturally. "Embedded" appears only in coursework, which is accurate and the unavoidable cost. |
|
||||
| Skills evidence | 10 | 9 | All skills are canonical; historical tools are labelled. pytest is pending. The AI line's "Containerized ML inference in production" is Bosch-historical but unlabelled. |
|
||||
| Mechanics/readability | 10 | 9 | 2 pages, 0 overfull boxes, clean parse, cadence warnings 0. Some page-2 white space; no filler, which is correct. |
|
||||
|
||||
Truth/provenance is 22/25 (8.8/10), above the 8/10 failure line.
|
||||
|
||||
## 4. Channel Strength — Weak
|
||||
|
||||
Cold submission through EasyCruit. A named, reachable contact is published (Are B. Willumsen, Group manager SW Architects, email and phone). **User decision 2026-10-08: no email will be sent.** That overrides the standing channel rule in `application_strategy.md` for this application. It is recorded as a deliberate cold submit, which keeps the warm-vs-cold comparison clean.
|
||||
|
||||
## 5. Competitive Read and Reader Sequence
|
||||
|
||||
- **Obvious-fit competitor:** a Trondheim DevOps/test engineer from an embedded shop (NTNU pool, Nordic Semiconductor, Kongsberg itself). They would have cross-compilation, HIL/test-rig and firmware-in-CI experience, speak Norwegian and need no relocation.
|
||||
- **Dennis's real advantage:** the full test → CI → Linux automation → production-ML path. That includes production AI integration (a named requirement most embedded DevOps candidates lack), Ansible extension development, ten years of personal Linux operation and prior Norway employment.
|
||||
- **Their real advantage:** embedded targets, and they are local. That is the decisive line for a team whose products are sensors and positioning hardware. Do not value the coursework bridge like their direct experience.
|
||||
|
||||
| Reader | Verdict | Reason |
|
||||
|---|---|---|
|
||||
| Parser/ATS (EasyCruit) | Pass | Single-column text extracts in order; key terms present. The form re-parses into structured fields, so check them by hand. |
|
||||
| Recruiter glance | **Borderline** | The current title reads "Data, Analytics & AI", with a Swiss address and no relocation statement. Page 1 recovers this with the DevOps/test profile and the Bosch infrastructure bullets. |
|
||||
| Hiring manager | **Maybe** | Strong if the next step is CI/test-environment engineering on Linux. No if the test infrastructure is mostly embedded targets and HIL rigs. |
|
||||
| Technical reviewer | Credible, with two challenges | (1) "What have you done on embedded targets: cross-compiling, flashing, HIL?" (2) "Your test automation is from 2015–18 and you used Swisscom's CI/CD rather than built it. What DevOps tooling have you designed recently?" Best answers: the Bosch Ansible extensions and Linux automation (2020–22), current unit testing, and honest coursework framing. |
|
||||
|
||||
**Likely screen questions with no email sent:** relocation to Trondheim (he decides at offer, so say he is open to it if the role fits), clearance eligibility as a German citizen living in Switzerland, and on-site expectations.
|
||||
|
||||
## 6. Claim Audit
|
||||
|
||||
| Claim | Canonical ID/evidence | Direct/Adjacent | Safe? | Fix |
|
||||
|---|---|---|---|---|
|
||||
| Headline "Software Engineer \| Test Automation, CI/CD and Linux Infrastructure \| Production ML Integration" | Umbrella identity over GN/VZ/FC/BS/SW | Direct | Yes | — |
|
||||
| "EU citizen (no Norwegian work permit needed)" | identity.citizenship; EEA free movement | Direct | Yes | — |
|
||||
| "Over ten years in production software, starting in test automation" | Visible record from Generali 2015-05; GN-1 | Direct | Yes. "Starting in" slightly simplifies Generali, which also included Java development (GN-3) | Optional: "with roots in test automation" |
|
||||
| KQ: BDD at Generali, quality gates at Vizrt, Jenkins at Fraunhofer | GN-1, VZ-2, FC-1 | Direct | Yes | — |
|
||||
| KQ: "administered the Bosch fab-analytics Linux estate with Ansible and developed custom Ansible extensions" | BS-6 | Direct | Yes. "Administered", not "owned"; BS-6 forbidden list respected | — |
|
||||
| KQ: "self-hosted Debian server run and hardened for about ten years" | PP-3 | Direct (personal) | Yes, labelled private | — |
|
||||
| KQ: ML inference in a 24/7 fab; LLM assistants and AI coding tools | BS-1, SW-8 | Direct | Yes | — |
|
||||
| Skills: all lines | skills array (incl. Jenkins and GitLab CI/CD registered 2026-10-08) | Direct | Yes. Historical tools labelled | AI line: label ML inference as earlier role |
|
||||
| Skills: "Unit testing (pytest)" | SW-9, pytest skill | Direct / **pending** | **Pending.** User said "pytest is known"; Swisscom use not confirmed | **Tier 1: confirm** |
|
||||
| SW: "Deployed and operated Python applications on Kubernetes through automated GitLab CI/CD pipelines spanning multiple environments" | SW-3 (past, ART B2B) | Direct | Yes. Past tense, "through" not "built" | Tier 2: make the past phase visible |
|
||||
| SW: Component Owner, Fulfillment ETL into Teradata, 2nd/3rd-level and on-call | SW-2 (past) | Direct | Yes | — |
|
||||
| SW: "Migrating the ETL pipelines of owned data domains to AWS within the company-wide programme … with unit tests for the pipeline code" | SW-1, SW-6, SW-9 | Direct / **pending** | Migration is scoped correctly. **The unit-test clause attaches tests to pipeline code, which SW-9 does not establish** | **Tier 1: confirm or drop the clause** |
|
||||
| SW: LLM assistants, selecting models and supplying curated knowledge | SW-8 | Direct | Yes. No "built/deployed LLM systems" | — |
|
||||
| BS: Linux server estate, Ansible in Git, run from Jenkins/GitLab | BS-6 | Direct | Yes. No GitOps | — |
|
||||
| BS: credential plugin with local caching to cut lookup volume | BS-6 | Direct | Yes. No figure | — |
|
||||
| BS: containerized ML inference, defect could have stopped production | BS-1 | Direct | Yes. Failure-consequence wording as required; no model-training claim | — |
|
||||
| BS: technical Application Owner, KLA DMS and Spotfire | BS-3, BS-5 | Direct | Yes | — |
|
||||
| FC: Jenkins build jobs for automatic deployment; Docker microservices | FC-1, FC-3 | Direct | Yes. No "quality gates" or "first" (experience-file overclaims avoided) | — |
|
||||
| VZ: test suites as CI/CD quality gates; Python and C++ to transcoding backend | VZ-2, VZ-1 | Direct / contributor | Yes. "Contributed", no broadcaster names | — |
|
||||
| GN: introduced BDD, technical responsibility, Jenkins jobs, trained, presented | GN-1 | Direct | Yes | — |
|
||||
| Bundeswehr: officer training, six years, Second Lieutenant | BW-1 | Direct | Yes. No clearance, NATO or command implied | — |
|
||||
| Education: thesis line | EDU-MENG thesis_title, thesis_methods | Direct | Yes. Described as a system, no accuracy claims | — |
|
||||
| Education: "Coursework: Embedded Systems (C/C++ and VHDL with an ARM platform); Robotics" | ED-1 | Academic | Yes. Labelled coursework and unattributed to a degree, as ED-1 requires | Attach to a degree once the user says which |
|
||||
| Capgemini | document_exclusions | — | Absent, correct | Check EasyCruit's parsed fields |
|
||||
|
||||
## 7. Fixes
|
||||
|
||||
### Tier 1 — truth (must be resolved before submission)
|
||||
1. **Unit-test scope and pytest.** Ask: does he unit-test the Glue/pipeline code at Swisscom, and with pytest? If yes, keep both and update SW-9. If no, drop "with unit tests for the pipeline code" from the Swisscom bullet and change the skill to "Unit testing (Python)".
|
||||
|
||||
### Tier 2 — presentation
|
||||
1. **Make the Swisscom lead bullet's phase visible.** It is past-phase (ART B2B) but leads a "Present" role, so a reader may take Kubernetes as current work. Suggested: *"On the earlier B2B platform, deployed and operated Python applications on Kubernetes through automated GitLab CI/CD pipelines spanning multiple environments."* No unit dates, consistent with the org_history rule.
|
||||
2. **AI skills line consistency:** "Containerized ML inference in production (earlier role); LLM assistants, LiteLLM, Copilot, Kiro".
|
||||
3. **Coursework attribution:** move the line under the right degree once the user says which.
|
||||
4. **Optional:** "starting in test automation" → "with roots in test automation".
|
||||
|
||||
### Portal (not document) checks
|
||||
- EasyCruit re-parses the CV and offers a LinkedIn import into structured Work experience/Education fields. **Make sure Capgemini does not appear there.**
|
||||
- Gender and date of birth are optional; leave them blank (standing preference). "Where did you first find out": Kongsberg.com or Nav.no.
|
||||
- Paste the letter from the `.txt` file into the Cover letter box.
|
||||
|
||||
## 8. Cover Letter
|
||||
|
||||
- **Should it exist?** Yes. The portal has a dedicated field, a letter is the norm for Norway (`cl_reference.md`), and it carries a transition explanation the resume cannot.
|
||||
- **Does it add information?** Partly. Paragraph 1 frames the JD's own *"investigate options, decide on solutions, implement"* as his working pattern, but the three examples in it are resume bullets restated. Paragraph 2 adds what the resume cannot: the honest embedded bridge, the personal-Linux motivation and the AI link. Paragraph 3 adds the Norway connection.
|
||||
- **Claims:** all trace (GN-1, FC-1, BS-6, BS-1, SW-8, ED-1, PP-3, VIZRT). The post-review wording "the infrastructure side that embedded teams rely on" correctly avoids implying embedded CI experience.
|
||||
- **Risk:** opening a gap sentence with "I will be straightforward about the gap" is a choice. It is short and evidence-led, and the reader will see the gap anyway, so it is kept. There is no relocation statement, as the user wants, so expect the question at the screen.
|
||||
- **Optional Tier 2:** cut one of the three paragraph-1 examples (Fraunhofer is the weakest) to reduce overlap with the resume.
|
||||
- Date is a literal 9 October 2026; change it if submitted on the 10th or 11th.
|
||||
|
||||
## 9. Mechanical Verification
|
||||
|
||||
- Validator: PASS (resume + letter), 0 advisory warnings, cadence clean.
|
||||
- Resume: 2 pages, 0 overfull boxes, page break falls after Bosch, footer page numbers present.
|
||||
- Letter: 1 page, 244 words.
|
||||
- `pdftotext`: employer → dates, title → location on every entry; reverse-chronological; certifications appear once; contact line complete; no Capgemini, no LOC or test counts, no unverified metrics.
|
||||
- Hyphenation: English patterns, no bad breaks found on visual inspection.
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
% Kongsberg Discovery / Seatex -- Lead Engineer, DevOps and Test Infrastructure
|
||||
% Cover Letter Decision: YES (session_kongsberg_devops_test_infra.md). Portal: EasyCruit
|
||||
% plain-text "Cover letter" field -- paste the body from the matching .txt file.
|
||||
% Claims used: GN-1, FC-1, BS-6, BS-1, SW-8, ED-1, PP-3, VIZRT employment. All appear on the resume.
|
||||
|
||||
\documentclass[11pt,a4paper]{article}
|
||||
\usepackage[utf8]{inputenc}
|
||||
\usepackage[T1]{fontenc}
|
||||
\usepackage{lmodern}
|
||||
\usepackage[a4paper,left=0.85in,right=0.85in,top=0.7in,bottom=0.7in]{geometry}
|
||||
\usepackage{parskip}
|
||||
\usepackage{xcolor}
|
||||
\usepackage{hyperref}
|
||||
\hypersetup{hidelinks}
|
||||
\pagestyle{empty}
|
||||
\setlength{\parindent}{0pt}
|
||||
|
||||
\begin{document}
|
||||
|
||||
{\Large\bfseries Dennis Thiessen, M.Eng.}\par
|
||||
Bern, Switzerland $\vert$
|
||||
\href{mailto:dennis@thiessen.io}{dennis@thiessen.io} $\vert$ +41 795 955 585 $\vert$
|
||||
\href{https://linkedin.com/in/dennis-thiessen}{LinkedIn}
|
||||
|
||||
\vspace{1.5em}
|
||||
Are B. Willumsen, Group Manager SW Architects\\
|
||||
Kongsberg Discovery -- Seatex\\
|
||||
Pirsenteret, Havnegata 9, 7010 Trondheim, Norway
|
||||
|
||||
\vspace{1em}
|
||||
9 October 2026
|
||||
|
||||
\vspace{1em}
|
||||
\textbf{Application for Lead Engineer, DevOps and Test Infrastructure}
|
||||
|
||||
\vspace{0.8em}
|
||||
Dear Are Willumsen,
|
||||
|
||||
Your posting describes the job as investigating options, deciding on solutions and implementing them, then helping developers make good use of what was built. That matches how I have worked on test and delivery tooling before. At Generali I introduced behaviour-driven test automation with a proof of concept, took technical responsibility for the suite and trained the project team to work with it. At Fraunhofer I introduced Jenkins and set up the jobs that deployed our software automatically. At Bosch I administered and automated the Linux servers behind the fab's analytics and ML workloads with Ansible, including extensions I developed myself.
|
||||
|
||||
I will be straightforward about the gap: my embedded experience comes from my studies, where I worked in C/C++ and VHDL with an ARM platform, not from industry. What I bring is the infrastructure side that embedded teams rely on -- Linux, containers, CI pipelines and test automation -- and practical AI experience, from integrating ML inference into a 24/7 semiconductor fab to using LLM tools in my current work at Swisscom. Linux infrastructure is also what I do in my spare time: I have run and hardened my own Debian server for about ten years.
|
||||
|
||||
I have worked in Norway before, at Vizrt in Bergen, and I value working across Norwegian, German and Swiss teams. I would welcome a conversation about where you want to take Seatex's DevOps and test infrastructure next.
|
||||
|
||||
Kind regards,
|
||||
|
||||
\vspace{1.5em}
|
||||
Dennis Thiessen
|
||||
|
||||
\end{document}
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
Dear Are Willumsen,
|
||||
|
||||
Your posting describes the job as investigating options, deciding on solutions and implementing them, then helping developers make good use of what was built. That matches how I have worked on test and delivery tooling before. At Generali I introduced behaviour-driven test automation with a proof of concept, took technical responsibility for the suite and trained the project team to work with it. At Fraunhofer I introduced Jenkins and set up the jobs that deployed our software automatically. At Bosch I administered and automated the Linux servers behind the fab's analytics and ML workloads with Ansible, including extensions I developed myself.
|
||||
|
||||
I will be straightforward about the gap: my embedded experience comes from my studies, where I worked in C/C++ and VHDL with an ARM platform, not from industry. What I bring is the infrastructure side that embedded teams rely on - Linux, containers, CI pipelines and test automation - and practical AI experience, from integrating ML inference into a 24/7 semiconductor fab to using LLM tools in my current work at Swisscom. Linux infrastructure is also what I do in my spare time: I have run and hardened my own Debian server for about ten years.
|
||||
|
||||
I have worked in Norway before, at Vizrt in Bergen, and I value working across Norwegian, German and Swiss teams. I would welcome a conversation about where you want to take Seatex's DevOps and test infrastructure next.
|
||||
|
||||
Kind regards,
|
||||
Dennis Thiessen
|
||||
+41 795 955 585 | dennis@thiessen.io
|
||||
+89
@@ -0,0 +1,89 @@
|
||||
% Kongsberg Discovery / Seatex -- Lead Engineer, DevOps and Test Infrastructure (Trondheim)
|
||||
% Audience profile: Norway (English posting). Generated 2026-10-08 from claims.json only.
|
||||
% Session: session_kongsberg_devops_test_infra.md
|
||||
|
||||
\documentclass{resume}
|
||||
\usepackage[utf8]{inputenc}
|
||||
\usepackage[T1]{fontenc}
|
||||
\usepackage{lmodern}
|
||||
\usepackage[a4paper,left=0.65in,right=0.65in,top=0.55in,bottom=0.55in]{geometry}
|
||||
\usepackage{xcolor}
|
||||
\usepackage{hyperref}
|
||||
\hypersetup{hidelinks}
|
||||
\usepackage[version=4]{mhchem}
|
||||
\usepackage{fancyhdr}
|
||||
\pagestyle{fancy}
|
||||
\fancyhf{}
|
||||
\renewcommand{\headrulewidth}{0pt}
|
||||
\fancyfoot[R]{\small \thepage/\pageref{LastPage}}
|
||||
|
||||
\name{Dennis Thiessen, M.Eng.}
|
||||
\headline{Software Engineer $\vert$ Test Automation, CI/CD and Linux Infrastructure $\vert$ Production ML Integration}
|
||||
\contactline{Bern, Switzerland $\vert$ \href{mailto:dennis@thiessen.io}{dennis@thiessen.io} $\vert$ +41 795 955 585 $\vert$ \href{https://linkedin.com/in/dennis-thiessen}{LinkedIn} $\vert$ EU citizen (no Norwegian work permit needed)}
|
||||
|
||||
\begin{document}
|
||||
|
||||
\begin{rSection}{Key Qualifications}
|
||||
\begin{itemize}[leftmargin=1.25em,label=\textbullet,itemsep=0.12em,topsep=0.1em,parsep=0pt,partopsep=0pt]
|
||||
\item Over ten years in production software, starting in test automation: introduced BDD test automation at Generali, integrated test suites into CI/CD quality gates at Vizrt in Bergen, and set up Jenkins deployment jobs at Fraunhofer.
|
||||
\item Linux and automation: administered the Bosch fab-analytics Linux estate with Ansible and developed custom Ansible extensions; privately, a self-hosted Debian server run and hardened for about ten years.
|
||||
\item Applied AI: integrated ML inference into a 24/7 semiconductor fab; work with LLM assistants and AI coding tools at Swisscom.
|
||||
\end{itemize}
|
||||
\end{rSection}
|
||||
|
||||
\begin{rSection}{Technical Skills}
|
||||
\raggedright
|
||||
\skillline{Languages}{Python, Bash, SQL; Java, Kotlin and C\# (earlier roles); C++ (limited)}
|
||||
\skillline{DevOps and infrastructure}{Linux administration, Docker, AWS, CloudFormation; Ansible, Jenkins, GitLab CI/CD and Kubernetes (earlier roles)}
|
||||
\skillline{Testing}{Unit testing (pytest); BDD (Serenity-BDD, JBehave), Selenium and CI/CD quality gates (earlier roles)}
|
||||
\skillline{AI}{Containerized ML inference in production; LLM assistants, LiteLLM, Copilot, Kiro}
|
||||
\skillline{Certifications}{\mbox{AWS Solutions Architect -- Associate}; \mbox{IBM AI Engineering}; \mbox{iSAQB CPSA-F}; \mbox{ITIL Foundation}}
|
||||
\skillline{Spoken languages}{German (native), English (fluent), Norwegian (basic)}
|
||||
\end{rSection}
|
||||
|
||||
\begin{rSection}{Professional Experience}
|
||||
|
||||
\begin{rSubsection}{Swisscom (Schweiz) AG}{Oct 2023 -- Present}{Staff Data, Analytics \& AI Engineer (promoted from Senior, Apr 2025)}{Bern, Switzerland}
|
||||
\item Deployed and operated Python applications on Kubernetes through automated GitLab CI/CD pipelines spanning multiple environments.
|
||||
\item As Component Owner, operated the Fulfillment ETL pipelines into the Teradata data warehouse and carried their 2nd/3rd-level support and on-call duty.
|
||||
\item Migrating the ETL pipelines of owned data domains to AWS within the company-wide programme, as Python and PySpark Glue jobs orchestrated by Airflow, with unit tests for the pipeline code.
|
||||
\item Configured domain-grounded LLM assistants in an internal Swisscom web interface, selecting the models and supplying curated domain knowledge.
|
||||
\end{rSubsection}
|
||||
|
||||
\begin{rSubsection}{Robert Bosch Semiconductor Manufacturing Dresden GmbH}{Feb 2020 -- Dec 2022}{Senior Data Engineer, Data Analysis (promoted from Data Engineer, Jan 2021)}{Dresden, Germany}
|
||||
\item Administered and automated the Linux server estate behind fab analytics and ML workloads (ML platform hosts, Docker hosts, backend services), with Ansible playbooks versioned in Git and executed from Jenkins and GitLab pipelines.
|
||||
\item Developed Ansible extensions, among them a credential plugin that fetched secrets from a password keystore and cached them locally to cut lookup volume.
|
||||
\item Integrated containerized ML inference for image-based defect classification into a continuously operating fab, where a software defect could have stopped production; deployed on Kubernetes with Ansible.
|
||||
\item Served as technical Application Owner for the KLA Defect Management System and TIBCO Spotfire, working with the vendors and training their users.
|
||||
\end{rSubsection}
|
||||
|
||||
\begin{rSubsection}{Fraunhofer-Center for Maritime Logistics and Services CML}{Sep 2018 -- Oct 2019}{Research Software Engineer}{Hamburg, Germany}
|
||||
\item Set up Jenkins and the build jobs for automatic deployment of a maritime crew-scheduling system (C\#, SQL Server), and developed Docker-based microservices for a maritime data-exchange research platform.
|
||||
\end{rSubsection}
|
||||
|
||||
\begin{rSubsection}{Vizrt}{Jul 2017 -- May 2018}{Test Automation / DevOps Engineer}{Bergen, Norway}
|
||||
\item Developed automated test suites and integrated them into the CI/CD pipeline as quality gates, to shorten the feedback loop on new features and code changes.
|
||||
\item Contributed Python and C++ to a distributed video-transcoding backend.
|
||||
\end{rSubsection}
|
||||
|
||||
\begin{rSubsection}{Generali Deutschland Informatik Services GmbH}{May 2015 -- Jun 2017}{IT Consultant}{Hamburg, Germany}
|
||||
\item Introduced Behaviour-Driven Development through a proof of concept, then held technical responsibility for the test automation suite (Serenity-BDD, Selenium, JBehave) and its Jenkins build jobs; trained project members and presented BDD to the Java community.
|
||||
\end{rSubsection}
|
||||
|
||||
\begin{rSubsection}{Bundeswehr (German Armed Forces)}{Jul 2008 -- Nov 2014}{Officer Candidate / Officer (Second Lieutenant at separation)}{Germany}
|
||||
\item Completed officer candidate training and officer school during six years of service.
|
||||
\end{rSubsection}
|
||||
|
||||
\end{rSection}
|
||||
|
||||
\begin{rSection}{Education}
|
||||
\compactentry{M.Eng. Computer Aided Engineering}{Apr 2012 -- Oct 2013}
|
||||
Universität der Bundeswehr München; Software Design \& Engineering. Thesis at Tongji University, \mbox{Shanghai}: a web-based remote fault-diagnosis system for vibration-sensor data from CNC machine tools.
|
||||
|
||||
\compactentry{B.Eng. Information and Telecommunication Technologies}{Oct 2009 -- Oct 2012}
|
||||
Universität der Bundeswehr München.
|
||||
|
||||
Coursework: Embedded Systems (C/C++ and VHDL with an ARM platform); Robotics.
|
||||
\end{rSection}
|
||||
|
||||
\end{document}
|
||||
@@ -0,0 +1,99 @@
|
||||
# JD — Kongsberg Discovery / Seatex: Lead Engineer, DevOps and Test Infrastructure
|
||||
|
||||
- Source: https://www.kongsberg.com/careers/vacancies/lead-engineer-devops-and-test-infrastructure/
|
||||
- Retrieved: 2026-10-08, headless Chromium (job_scout .venv Playwright), HTTP 200, posting live
|
||||
- Cross-check: NAV arbeidsplassen uuid b1e1a258-4b23-4ecd-a606-3dd95a76b729 — workLanguage Engelsk, applicationdue 11.10.2026, city TRONDHEIM
|
||||
- Verbatim body below (site navigation and cookie banner stripped)
|
||||
|
||||
---
|
||||
|
||||
```text
|
||||
Lead Engineer, DevOps and Test Infrastructure
|
||||
|
||||
We are looking for the right person to take our DevOps and Test Infrastructure to the next level. This position is a perfect opportunity if you want to be(come) an expert, investigate options, decide on solutions, and implement them. All while relying on expert colleagues across KONGSBERG for discussion and support.
|
||||
|
||||
The position is part of the SW Architects group, which is responsible for all SW activities common across Seatex products and projects.
|
||||
|
||||
What you will be doing
|
||||
|
||||
Drive further development and maintenance of our DevOps and testing environments
|
||||
Collaborate with IT and DevOps colleagues across KONGSBERG
|
||||
Develop SW for products and infrastructure
|
||||
Support SW developers on DevOps and testing challenges, and promote effective use of our SW infrastructure
|
||||
|
||||
What we’re looking for
|
||||
|
||||
Bachelor’s or Master’s degree in a relevant technical discipline, or equivalent practical experience
|
||||
Proven experience with DevOps and testing
|
||||
Strong SW development skills
|
||||
Experience working with embedded SW and Linux
|
||||
An interest in, and practical experience with, applying AI to solve problems
|
||||
Familiarity with Docker or similar technologies
|
||||
|
||||
What you bring
|
||||
|
||||
A practical approach to supporting SW developers and solving problems
|
||||
The ability to identify improvements and drive them forward
|
||||
Strong collaboration and knowledge-sharing skills
|
||||
A sense of ownership of the SW development infrastructure
|
||||
Confidence in contributing ideas and challenging existing ways of working
|
||||
|
||||
|
||||
|
||||
Pre-employment check and security clearance
|
||||
|
||||
This employment may require a pre-employment check procedure and security clearance in accordance with company security standards, role or site requirements. Please note that this might affect the offer process or employment.
|
||||
|
||||
|
||||
Diversity statement
|
||||
|
||||
At KONGSBERG, we believe that diversity fuels innovation. We encourage you to apply, even if you do not meet every requirement. Your unique perspective is valuable to us. Your skills, attitude and perspective could be exactly what we are looking for!
|
||||
|
||||
|
||||
Why join us
|
||||
|
||||
Work with world-leading experts, products, and technology
|
||||
Be part of a collaborative culture where people support and learn from each other
|
||||
Join a large international company with opportunities both nationally and internationally
|
||||
Enjoy a positive working environment
|
||||
Benefit from excellent insurance, welfare, and pension schemes
|
||||
|
||||
|
||||
|
||||
Where you will be working
|
||||
You will be working at the Seatex’s offices at Pirsenteret in Trondheim.
|
||||
|
||||
|
||||
Interested in knowing more?
|
||||
|
||||
Contact: Are B. Willumsen, Group manager SW Architects, are.b.willumsen@kd.kongsberg.com, +4799203912
|
||||
|
||||
|
||||
About KONGSBERG
|
||||
|
||||
KONGSBERG protects people and critical infrastructure – from deep sea to space.
|
||||
|
||||
We deliver advanced ocean and space technologies – from autonomous marine systems to satellites and data services – supporting sustainability, climate monitoring, infrastructure protection, and security. KONGSBERG also develop innovative technologies for defence, security, and surveillance markets, combining military and civilian expertise. Our defence and security solutions span missiles, weapon stations, air defence, command and control, and digital towers.
|
||||
|
||||
Today, we have more than 7,500 employees in about 20 countries. The company is listed on the Oslo Stock Exchange and the Norwegian government controls about 50.01 percent of the shares.
|
||||
|
||||
|
||||
About Discovery
|
||||
|
||||
The Discovery division develops technologies for sustainable ocean resource management, climate monitoring, critical infrastructure protection, and national security. Its technology platforms and solutions support offshore operations, fisheries, ocean research, maritime operations, sea-based energy production, and naval defence. Products include sonars, underwater communication equipment, satellites, surveillance and positioning systems, and autonomous vehicles. Customers span offshore, fisheries, marine research, maritime, energy, surveillance, defence, and naval sectors.
|
||||
|
||||
Apply now
|
||||
Job type
|
||||
Permanent
|
||||
Working hours
|
||||
Full-time
|
||||
Application deadline
|
||||
11/10/2026
|
||||
Company homepage
|
||||
http://www.kongsberg.com
|
||||
Office address
|
||||
|
||||
Havnegata 9, Pirsenteret
|
||||
|
||||
7010 Trondheim
|
||||
```
|
||||
@@ -0,0 +1,59 @@
|
||||
\ProvidesClass{resume}[2026/07/27 Evidence-first professional resume]
|
||||
\LoadClass[11pt,a4paper]{article}
|
||||
|
||||
\RequirePackage{enumitem}
|
||||
\RequirePackage{ifthen}
|
||||
\RequirePackage{lastpage}
|
||||
\RequirePackage{parskip}
|
||||
\RequirePackage{needspace}
|
||||
|
||||
\pagestyle{empty}
|
||||
\setlength{\parindent}{0pt}
|
||||
|
||||
\def\@resumename{}
|
||||
\def\@resumeheadline{}
|
||||
\def\@resumecontact{}
|
||||
|
||||
\newcommand{\name}[1]{\def\@resumename{#1}}
|
||||
\newcommand{\headline}[1]{\def\@resumeheadline{#1}}
|
||||
\newcommand{\contactline}[1]{\def\@resumecontact{#1}}
|
||||
|
||||
\newcommand{\printresumeheader}{%
|
||||
{\LARGE\bfseries \@resumename}\par
|
||||
\vspace{0.15em}
|
||||
\ifthenelse{\equal{\@resumeheadline}{}}{}{\@resumeheadline\par}
|
||||
\vspace{0.1em}
|
||||
{\small \@resumecontact}\par
|
||||
\vspace{0.45em}
|
||||
}
|
||||
|
||||
\AtBeginDocument{\printresumeheader}
|
||||
|
||||
\newenvironment{rSection}[1]{%
|
||||
\vspace{0.35em}
|
||||
{\bfseries #1}\par
|
||||
\vspace{0.1em}\hrule\vspace{0.35em}
|
||||
}{%
|
||||
\vspace{0.2em}
|
||||
}
|
||||
|
||||
% Arguments: employer, dates, formal title, location.
|
||||
\newenvironment{rSubsection}[4]{%
|
||||
\Needspace{6\baselineskip}%
|
||||
{\bfseries #1}\hfill{\small #2}\par
|
||||
{\itshape #3}\hfill{\itshape #4}\par
|
||||
\vspace{0.1em}
|
||||
\begin{itemize}[leftmargin=1.25em,label=\textbullet,itemsep=0.18em,topsep=0.15em,parsep=0pt,partopsep=0pt]
|
||||
}{%
|
||||
\end{itemize}
|
||||
\vspace{0.25em}
|
||||
}
|
||||
|
||||
\newcommand{\skillline}[2]{%
|
||||
\textbf{#1:} #2\par
|
||||
\vspace{0.08em}
|
||||
}
|
||||
|
||||
\newcommand{\compactentry}[2]{%
|
||||
\textbf{#1}\hfill #2\par
|
||||
}
|
||||
+111
@@ -0,0 +1,111 @@
|
||||
# Session: Kongsberg Discovery (Seatex) — Lead Engineer, DevOps and Test Infrastructure
|
||||
|
||||
## JD Integrity
|
||||
- File/source: `jd_kongsberg_devops_test_infra.md` (this folder); https://www.kongsberg.com/careers/vacancies/lead-engineer-devops-and-test-infrastructure/
|
||||
- Retrieval method and date: headless Chromium via `job_scout/.venv` Playwright, 2026-10-08, HTTP 200. Cross-checked on NAV arbeidsplassen (uuid b1e1a258-4b23-4ecd-a606-3dd95a76b729).
|
||||
- Verbatim posting: YES
|
||||
- Posting status: LIVE. **Deadline 11.10.2026 (Sunday)** per NAV `applicationdue`. Work language: Engelsk (NAV). Location: Seatex offices, Pirsenteret, Havnegata 9, 7010 Trondheim. Permanent, full-time.
|
||||
|
||||
## Application Decision
|
||||
- Audience profile: **Norway** (Norwegian employer, English posting; no employer-specific format). 2 pages, short Key Qualifications block, motivation letter normally prepared.
|
||||
- Evidence Fit: **67** (provisional at triage; unchanged after the embedded answer)
|
||||
- Fit class: Adjacent by number; **hard gate FAIL overrides** (see below)
|
||||
- Hard gate: **FAIL** — required line "Experience working with embedded SW and Linux": Linux Direct, **embedded SW = Gap** (user, 2026-10-08: "no embedded work since my studies"). Clearance: JD says *"may require"* security clearance — unresolved, to ask the contact. Relocation: on-site Trondheim; **user deferred the relocation decision to offer stage** (2026-10-08), so it is not treated as an unresolved pre-apply constraint.
|
||||
- **User override, 2026-10-08:** shown the strict-gate reading ("a confirmed no makes it a required-line gap, which is a no-go under the gate"), the user answered *"no embedded work since my studies. But nevertheless, lets try"*. The override licenses generation; it does **not** change the fit classification.
|
||||
- Channel Strength: **Weak** (cold, as of now)
|
||||
- Channel plan: **cold submit by user decision 2026-10-08 ("no email will be sent")** — overrides the standing channel rule for this application; record as a deliberate cold submit.
|
||||
- Named contact published? **YES** — Are B. Willumsen, Group manager SW Architects, are.b.willumsen@kd.kongsberg.com, +47 99 20 39 12. **Not contacted — user decision 2026-10-08.**
|
||||
- Decision: **PROCEED (user override)**
|
||||
|
||||
## Requirements
|
||||
| # | Requirement | Required/preferred | Direct/Adjacent/Gap/Constraint | Canonical evidence | Gate? |
|
||||
|---|---|---|---|---|---|
|
||||
| 1 | Bachelor's/Master's in relevant technical discipline | Required | Direct | EDU-BENG (Information and Telecommunication Technologies), EDU-MENG (Computer Aided Engineering) | — |
|
||||
| 2 | Proven experience with DevOps and testing | Required | Direct (historical) | GN-1 BDD test automation + Jenkins; VZ-2 test suites as CI/CD quality gates; FC-1 Jenkins build/deploy jobs; BS-6 Linux/Ansible from Git via Jenkins/GitLab; BS-1 containerized ML inference; SW-3 Python on Kubernetes via GitLab CI/CD (past, used not built) | — |
|
||||
| 3 | Strong SW development skills | Required | Direct (Python, Java); C++ limited | BS-2, SW-1, SW-6, GN-3, VZ-1 | — |
|
||||
| 4 | Embedded SW **and** Linux | Required | Linux **Direct** (BS-6, PP-3); embedded **Gap** | none for embedded | **YES — overridden** |
|
||||
| 5 | Interest in and practical experience applying AI | Required | Direct | BS-1 production ML inference; SW-8 LLM assistants, LiteLLM, Kiro, Copilot; IBM AI Engineering cert | — |
|
||||
| 6 | Docker or similar | Required | Direct | BS-1, BS-6, FC-3, Docker skill | — |
|
||||
| 7 | Drive development/maintenance of DevOps and testing environments | Responsibility | Direct (historical) | FC-1, VZ-2, GN-1, BS-6 | — |
|
||||
| 8 | Collaborate with IT and DevOps colleagues | Responsibility | Direct | BS-3 vendor/internal coordination; BS-6 | — |
|
||||
| 9 | Develop SW for products and infrastructure | Responsibility | Infrastructure Direct; **product SW for embedded products Adjacent** | BS-6 Ansible extensions; VZ-1 | — |
|
||||
| 10 | Support SW developers, promote effective use of SW infrastructure | Responsibility | Direct | GN-1 trained colleagues, presented BDD to Java community; BS-3 training/docs; BS-7 supervision | — |
|
||||
| 11 | Security clearance "may" be required | Conditional | **Constraint — open** | BW-1 forbids claiming any clearance | Ask contact |
|
||||
| 12 | On-site Trondheim | Practical | Constraint — deferred to offer stage by user | — | No (user decision) |
|
||||
|
||||
### Evidence Fit breakdown (67)
|
||||
| Dimension | Weight | Score | Basis |
|
||||
|---|---:|---:|---|
|
||||
| Required qualifications | 35 | 25 | 5 of 6 Direct; embedded half-line Gap |
|
||||
| Core responsibilities | 25 | 18 | DevOps/test environments, developer enablement Direct; embedded product SW unproven |
|
||||
| Level and ownership | 15 | 11 | Senior IC decide-and-implement scope matches Engineer IV / Component Owner / Application Owner |
|
||||
| Recency and depth | 10 | 5 | Test/DevOps core is 2015–2022; Swisscom CI/CD used, not built (SW-3) |
|
||||
| Domain/tool transfer | 10 | 6 | Maritime research (FC-1..3), prior Norway employment; embedded toolchain unknown |
|
||||
| Practical constraints | 5 | 2 | English, EEA free movement OK; clearance open; relocation deferred |
|
||||
|
||||
## Competitive Read
|
||||
- Obvious-fit candidate: Trondheim-based DevOps/test engineer from an embedded shop (NTNU graduate pool; Nordic Semiconductor and Kongsberg itself), with cross-compilation, HIL/test-bench and Yocto/Buildroot-style experience, Norwegian-speaking.
|
||||
- Dennis's advantage: breadth across the whole test → CI → infrastructure → production-ML path; real production AI integration (a named requirement most embedded DevOps candidates lack); Linux depth (Bosch estate + 10 years self-hosted); prior employment in Norway; maritime research background.
|
||||
- Their advantage: embedded toolchain and hardware-test experience; current (not historical) DevOps title; local, no relocation risk; Norwegian.
|
||||
- Level/scope comparison: comparable senior IC; "Lead Engineer" here is technical lead of infrastructure, not people management — do not claim people management.
|
||||
|
||||
## Framing Strategy
|
||||
- Professional identity: software engineer whose career runs test automation → CI/CD and Linux infrastructure → production ML and cloud data engineering. Headline must be demonstrated identity, not the target title.
|
||||
- Strongest proof points: BS-6 (Linux + Ansible automation from Git via Jenkins/GitLab), VZ-2 (test suites as CI/CD quality gates, Bergen), GN-1 (introduced BDD, technical responsibility, trained colleagues), BS-1 (ML inference in a 24/7 fab where a defect could halt production), FC-1 (introduced Jenkins).
|
||||
- Honest adjacent bridges: maritime domain via Fraunhofer CML; sensor data via M.Eng. thesis (vibration sensors, CNC) and BS-2 (fab sensor/process data) — context only, never embedded claims.
|
||||
- Explicit gaps: embedded SW (none since studies); Kubernetes and Kafka historical; C++ limited; no Terraform, no GitOps.
|
||||
- User directives: apply despite embedded gap; relocation decided at offer stage; not interested in Oslo alternatives.
|
||||
|
||||
## Portal
|
||||
- EasyCruit (Visma): https://kongsberg.easycruit.com/vacancy/application/3663291/252845 — probed 2026-10-08 up to step 2, nothing submitted.
|
||||
- Fields: CV upload; structured Education / Work experience / Language sections; **plain-text "Cover letter" textarea**; only position-specific question is "Where did you first find out about the position?" (answer: Nav.no or Kongsberg.com). Optional demographics (gender, date of birth) — leave blank per standing preference.
|
||||
|
||||
## Resume Plan (presented 2026-10-08; approved by the user's answers the same day)
|
||||
- Header headline: Software Engineer | Test Automation, CI/CD and Linux Infrastructure | Production ML Integration. Contact line: Bern, Switzerland + "EU/EEA citizen, no work permit needed in Norway". No relocation statement.
|
||||
- Key Qualifications (Norway profile): 3–4 short bullets, ~5 rendered lines — tenure (over ten years, measured from May 2015), test/CI path (GN-1, VZ-2, FC-1), Linux/automation (BS-6, PP-3), applied AI (BS-1, SW-8).
|
||||
- Skills (~5 rendered lines): Languages (Python, Bash, SQL; Java, Kotlin, C# historical; C++ limited) · DevOps/infra (Linux administration, Docker, Ansible, Jenkins, GitLab CI/CD, Kubernetes historical, AWS, CloudFormation) · Testing (BDD with Serenity-BDD/JBehave, Selenium, CI/CD quality gates) · AI (ML inference integration; LLM assistants, LiteLLM, Copilot, Kiro) · Certifications once · Languages DE/EN/NO basic.
|
||||
- Swisscom (4): SW-3 lead (past), SW-2 (past), SW-1 (current), SW-8.
|
||||
- Bosch (4): BS-6 Linux/Ansible lead, BS-6 credential plugin, BS-1, BS-3.
|
||||
- Fraunhofer (1): FC-1 + FC-3. Vizrt (2): VZ-2, VZ-1. Generali (1): GN-1.
|
||||
- Bundeswehr: one compact BW-1 line — recommended (defence group), user to confirm.
|
||||
- Education: M.Eng. with thesis line (vibration-sensor fault diagnosis, Tongji); B.Eng. — embedded coursework only if user supplies specifics and it is recorded in claims.json first.
|
||||
- Total bullets: 12. No forced page break: Bosch must start on page 1 (check with `page_metrics.py`).
|
||||
- Impact evidence still needed: none — no metrics will be used.
|
||||
- KB change made: Jenkins and GitLab CI/CD registered as canonical skills (production-historical) from GN-1/FC-1/BS-6/SW-3 scopes, 2026-10-08.
|
||||
- Do-not-carry list (experience files overclaim vs claims.json): FC-1 "quality gates/independently/first"; VZ-1 primary-developer + broadcaster names; BS-4 Grafana/Prometheus/Loki; template's present-tense Kafka/Teradata/Kubernetes.
|
||||
|
||||
## Cover Letter Decision
|
||||
- YES/NO: **YES (proposed)**
|
||||
- Reason: the portal has a dedicated cover-letter field; Norway convention (`cl_reference.md`); and a career-direction explanation the resume cannot carry (data engineering now → back to DevOps/test infrastructure). Deliver as `.tex` source plus a plain-text paste version for the textarea.
|
||||
- Information it adds beyond resume: why this function, the Norway connection (Vizrt, Bergen), honest framing of how he would close the embedded gap. No relocation statement unless the user confirms one.
|
||||
- Verified hook sources: JD only (SW Architects group, Seatex products). Verify any product name before use.
|
||||
|
||||
## Output Files
|
||||
- Resume: `e2e_kongsberg_devops_test_infra_resume.tex` + `.pdf` (2 pages, 0 overfull boxes, validator PASS, 0 cadence warnings)
|
||||
- Cover letter: `e2e_kongsberg_devops_test_infra_cover_letter.tex` + `.pdf` (1 page, 244 words, validator PASS) and `e2e_kongsberg_devops_test_infra_cover_letter.txt` (paste version for the EasyCruit textarea). Letter date is literal **9 October 2026** - change it if sent later.
|
||||
- Critique: `critique_kongsberg_devops_test_infra.md` (pending)
|
||||
|
||||
## As-Built (2026-10-08)
|
||||
- User answers 2026-10-08: embedded = coursework only (Embedded Systems in C/C++ and VHDL with an ARM platform; Robotics), nothing since studies; writes unit tests today, "pytest is known"; Bundeswehr line YES; cover letter YES.
|
||||
- KB changes this session: `claims.json` + ED-1 (coursework), SW-9 (unit tests), skills pytest, unit testing, embedded systems (coursework), VHDL, robotics (coursework), Jenkins, GitLab CI/CD. Source note: `knowledge_base/extractions/2026-10-08_embedded_coursework_testing_clarification.md`.
|
||||
- Post-review fixes (advisor, 2026-10-08): skills line now labels Ansible, Jenkins, GitLab CI/CD, Kubernetes, BDD, Selenium and CI/CD quality gates as earlier roles; cover letter reworded to "the infrastructure side that embedded teams rely on" so it cannot read as embedded CI experience.
|
||||
- Portal warning: EasyCruit parses the CV / offers LinkedIn import into structured Work experience fields - check that Capgemini does not appear there (standing omission rule).
|
||||
- Layout: Key Qualifications 3 bullets (7 lines); skills block ragged-right (8 rendered lines); Swisscom and all of Bosch on page 1; page 2 = Fraunhofer, Vizrt, Generali, Bundeswehr, Education. No forced page break.
|
||||
- Bullets: Swisscom 4 (SW-3 lead, SW-2, SW-1+SW-9, SW-8), Bosch 4 (BS-6, BS-6 plugin, BS-1, BS-3), Fraunhofer 1 (FC-1+FC-3), Vizrt 2 (VZ-2, VZ-1), Generali 1 (GN-1), Bundeswehr 1 (BW-1) = 13.
|
||||
- **Open for user review:** (1) **Combined question:** does he unit-test the Glue/pipeline code at Swisscom, and with pytest? The Swisscom bullet says "with unit tests for the pipeline code" and the Testing line says "Unit testing (pytest)"; SW-9 does not establish which code is covered. If no: drop the bullet clause and change the skill to "Unit testing (Python)". (2) Which degree the embedded coursework belonged to - currently a separate unattributed "Coursework:" line under Education. (3) Contact line says "EU citizen (no Norwegian work permit needed)" - EEA free-movement fact, not a claim about him.
|
||||
|
||||
## Critique Summary (2026-10-08, `critique_kongsberg_devops_test_infra.md`)
|
||||
- Evidence Fit: **69** — Adjacent by number; hard gate overrides
|
||||
- Hard gate: **FAIL** (strict) — embedded is academic only (ED-1); clearance unresolved. User override recorded.
|
||||
- Document Quality: **84**
|
||||
- Channel Strength: **Weak** (cold by user decision)
|
||||
- Tier 1 fixes: unit-test/pytest wording — **resolved 2026-10-08**: user approved the package as written ("i think its ok how it is") after being asked directly; recorded in claims.json SW-9 and the pytest skill note.
|
||||
- Tier 2 (**declined by user 2026-10-08, package kept as is**): show the past phase on the Swisscom lead bullet ("On the earlier B2B platform, …"); label ML inference as earlier role in the AI line; attach coursework to its degree; optional letter trim.
|
||||
|
||||
## Status
|
||||
- Fit gate: done 2026-10-08 - hard gate FAIL (embedded), user override to proceed
|
||||
- Resume: **APPROVED as is 2026-10-08**; final validator PASS; `Dennis_Thiessen_Resume.pdf` copied (byte-identical)
|
||||
- Cover letter: **APPROVED as is 2026-10-08**; final validator PASS; `Dennis_Thiessen_Cover_Letter.pdf` copied; paste text in `e2e_kongsberg_devops_test_infra_cover_letter.txt`
|
||||
- Critique: done 2026-10-08 — Tier 1 resolved, Tier 2 declined
|
||||
- Application/outcome: **SUBMITTED 2026-10-08** via EasyCruit (user-confirmed "sent out right now"). Cold by user decision. Recorded: `cohort_tracker.py add` (no-go / 69 / weak / fail, override reason, outcome applied) and `scout.py --decide ... applied`.
|
||||
- Next: wait for Kongsberg. Screen prep: embedded targets/HIL, recency of DevOps/test work (2015-22), relocation to Trondheim (decide at offer), clearance eligibility as a German citizen living in Switzerland, on-site expectations.
|
||||
@@ -0,0 +1,97 @@
|
||||
Source: https://nvidia.wd5.myworkdayjobs.com/en-US/NVIDIAExternalCareerSite/job/Switzerland-Remote/Senior-Production-Engineer----DGX-Cloud_JR2027105
|
||||
Retrieved: 2026-10-22; HTTP 200; Playwright rendered
|
||||
|
||||
Skip to main content
|
||||
CAREERS AT NVIDIA
|
||||
Sign In
|
||||
Home
|
||||
Search for Jobs
|
||||
Senior Production Engineer - DGX Cloud page is loaded
|
||||
Senior Production Engineer - DGX Cloud
|
||||
Apply
|
||||
locations
|
||||
Switzerland, Remote
|
||||
Switzerland, Zurich
|
||||
time type
|
||||
Full time
|
||||
posted on
|
||||
Posted 16 Days Ago
|
||||
job requisition id
|
||||
JR2027105
|
||||
|
||||
NVIDIA DGX Cloud delivers AI services and endpoints for research and production workloads. We are looking for a Senior Production Engineer to build software and automation that make those services reliable, scalable, and safe to operate. The Production Engineering team works on large-scale distributed systems spanning internal and external model endpoints; regional control plane services that orchestrate workloads and route requests; and the GPU/CPU compute infrastructure where inference and agentic workloads run. Our work spans Kubernetes clusters across AWS, Azure, Google Cloud, other partner cloud environments, and on-premises deployments.
|
||||
|
||||
|
||||
|
||||
|
||||
What you’ll be doing:
|
||||
|
||||
Build and operate production software, automation, and tooling for control plane services, model deployments, and inference and agentic workloads across DGX Cloud environments.
|
||||
Improve the reliability of inference and agentic platforms and services, including NVIDIA Cloud Functions, SGLang- and vLLM-based endpoints, and inference services built with NVIDIA Dynamo, through health validation, safer rollouts, observability, and recovery.
|
||||
Improve endpoint availability, inference routing, capacity management, and service health to maintain predictable performance as workloads and demand change.
|
||||
Use infrastructure as code and GitOps to deploy, configure, validate, upgrade, and recover services consistently across environments.
|
||||
Build workflows for service enablement, model releases, handoff, deprecation, and ongoing operations; replace repeatable manual work with reliable automation.
|
||||
Define and instrument SLIs and SLOs for inference and control plane services, including availability and latency, use error budgets to guide reliability improvements, and make production health visible to partner teams.
|
||||
Participate in on-call and incident response, troubleshoot failures across routing, model runtimes, software, and infrastructure, and turn recurring issues into automation and durable fixes.
|
||||
Collaborate with model, platform, storage, networking, security, and GPU infrastructure teams to design and operate services safely at scale.
|
||||
|
||||
|
||||
|
||||
What we need to see:
|
||||
|
||||
8+ years of experience building or operating production services and large-scale distributed systems, including hands-on automation.
|
||||
Strong programming skills in Python, Go, or a comparable language, with experience developing tools for production operations.
|
||||
Experience with infrastructure as code, configuration management, or GitOps, and with building automation for repeatable service deployments and changes.
|
||||
Strong knowledge of Linux, Kubernetes, containers, cloud infrastructure, distributed systems, and networking fundamentals; ability to diagnose failures in production.
|
||||
Understanding of Production Engineering principles, including SLIs, SLOs, error budgets, incident response, and reducing operational toil.
|
||||
Experience instrumenting services and using metrics, logs, and traces to understand system behavior and improve reliability.
|
||||
Clear technical communication and ability to work across engineering teams.
|
||||
BS/MS in Computer Science or equivalent practical experience.
|
||||
|
||||
|
||||
|
||||
Ways to stand out from the crowd:
|
||||
|
||||
Familiarity with technologies such as vLLM, SGLang, PyTorch, TensorRT-LLM, NVIDIA Dynamo, CUDA, or NCCL, and with GPU performance analysis.
|
||||
Experience building Kubernetes operators, controllers, workload orchestration services, fleet management systems, or self-healing automation.
|
||||
Experience with Terraform, Argo CD, CI/CD, policy validation, or safe deployment and rollback systems.
|
||||
Background with developing with AI tools and agents.
|
||||
Experience with production AI inference or agentic workloads, including debugging issues across models, runtimes, Kubernetes, and hardware.
|
||||
|
||||
|
||||
|
||||
NVIDIA is leading the way in groundbreaking developments in Artificial Intelligence, High-Performance Computing and Visualization. The GPU, our invention, serves as the visual cortex of modern computers and is at the heart of our products and services. We have some of the most forward-thinking and hard-working people on the planet working for us. If you're creative, hard-working and self-motivated, we want to hear from you!
|
||||
|
||||
Similar Jobs (4)
|
||||
Senior Software Engineer, JAX
|
||||
locations
|
||||
2 Locations
|
||||
time type
|
||||
Full time
|
||||
posted on
|
||||
Posted 3 Days Ago
|
||||
Senior AI Compute Engineer
|
||||
locations
|
||||
4 Locations
|
||||
time type
|
||||
Full time
|
||||
posted on
|
||||
Posted 30+ Days Ago
|
||||
Senior Software Architect, GPU Networking Research
|
||||
locations
|
||||
2 Locations
|
||||
time type
|
||||
Full time
|
||||
posted on
|
||||
Posted 30+ Days Ago
|
||||
View All 4 Jobs
|
||||
|
||||
NVIDIA pioneered accelerated computing. Today, our AI infrastructure powers global intelligence, transforming every industry.
|
||||
|
||||
|
||||
|
||||
Learn more about NVIDIA.
|
||||
|
||||
Follow Us
|
||||
Applicant Privacy Policy
|
||||
© 2026 Workday, Inc. All rights reserved.
|
||||
@@ -0,0 +1,96 @@
|
||||
# Critique: NVIDIA — Senior Production Engineer, DGX Cloud (JR2027105)
|
||||
|
||||
> **STALE as of Edit 1 (2026-10-22):** Tier 1 #1 and Tier 2 #1–#4 were applied (see the session's Edit History). The Document Quality score of 85 measures the pre-edit document and was not re-measured.
|
||||
|
||||
Date: 2026-10-22. Documents: `e2e_nvidia_prod_eng_dgx_cloud_resume.tex` / `.pdf` (2 pages). No cover letter (session decision NO).
|
||||
JD: `JD_nvidia_prod_eng_dgx_cloud_jr2027105.txt`, verbatim Playwright render 2026-10-22, live.
|
||||
|
||||
## 1. Fit verdict and hard gates
|
||||
|
||||
- **Fit class: Stretch.** **Hard gate: PASS.** No required line is a Gap; location (Switzerland Remote), language and authorization are resolved.
|
||||
- Stretch because required Q5 (SLIs, SLOs, error budgets, incident response, toil), the SRE core of the title, is only Adjacent: SLOs (BS-3) and incident response (SW-2 past, SW-11 current) are evidenced; SLIs and error budgets are not.
|
||||
- Likeliest screen rejection: Q1 *"8+ years of experience building or operating production services and large-scale distributed systems"*. The years hold (visible record from 2015-05); the large-scale distributed systems do not at NVIDIA's scale.
|
||||
|
||||
## 2. Evidence Fit — 65/100 (scored before reading the prose; unchanged from the session)
|
||||
|
||||
| Dimension | Weight | Score | Basis |
|
||||
|---|---:|---:|---|
|
||||
| Required qualifications | 35 | 26 | 4 Direct (Q2 Python/tools, Q3 IaC/config mgmt, Q7 communication, Q8 degree); 4 Adjacent (Q1 scale, Q4 networking, Q5 SLIs/error budgets, Q6 instrumenting beyond alert thresholds + PoC) |
|
||||
| Core responsibilities | 25 | 12 | On-call/incident Direct and now current (SW-11); inference integration Adjacent (BS-1); routing/capacity Gap |
|
||||
| Level and ownership | 15 | 11 | Senior IC vs Staff title; component and application ownership |
|
||||
| Recency and depth | 10 | 6 | Current: on-duty, alert thresholds, AWS/CloudFormation, Python. Past: Ansible/Linux (2022), Kubernetes, GitLab |
|
||||
| Domain/tool transfer | 10 | 5 | Production inference on NVIDIA GPUs is a real bridge; vLLM/SGLang/Dynamo, K8s operators, Terraform, Argo CD do not transfer |
|
||||
| Practical constraints | 5 | 5 | Remote CH, English, EU/B permit |
|
||||
| **Total** | | **65** | |
|
||||
|
||||
## 3. Document Quality — 85/100
|
||||
|
||||
| Dimension | Weight | Score | Note |
|
||||
|---|---:|---:|---|
|
||||
| Truth and provenance | 25 | 23 | Every claim traces to canonical scope; one over-generalisation ("set **the** alert thresholds", Tier 1 #1) |
|
||||
| Information hierarchy | 20 | 17 | Clear headers; NVIDIA-GPU bullet on page 1; experience starts ~44% down page 1. The Swisscom tense switch (present → past for ART B2B work) is unexplained to a reader |
|
||||
| Bullet evidence and impact | 20 | 15 | Specific and scoped, no invented metrics (none exist). Two dense bullets: Swisscom #1 (38 words, "alerts" twice) and Bosch #1 ("GPU-backed" and "on NVIDIA GPUs" in one sentence) |
|
||||
| Relevance and terminology | 15 | 12 | Honest coverage of IaC, configuration management, Linux, Kubernetes, containers, AWS, SLOs, incident response, on-call, alerting, CI/CD, inference, GPU. Absent: "observability" (honestly available for the BS-4 PoC); SLIs, error budgets, networking, Terraform, GitOps, CUDA correctly absent |
|
||||
| Skills evidence | 10 | 9 | All canonical; Kubernetes is listed without a recency cue (bullets show it as past) |
|
||||
| Mechanics/readability | 10 | 9 | Validator PASS, 0 cadence warnings, 0 boxes, 2 pages, parse order correct |
|
||||
|
||||
## 4. Channel Strength — Weak
|
||||
|
||||
Cold portal application; no contact published. The warm action (LinkedIn note to an NVIDIA recruiter or a DGX Cloud Production Engineering engineer in Switzerland) is the cheapest improvement available and is not yet done.
|
||||
|
||||
## 5. Competitive read and reader sequence
|
||||
|
||||
- **Obvious-fit competitor:** an SRE/production engineer from a hyperscaler, GPU cloud or ML-serving company with vLLM/Triton-style endpoints on Kubernetes, operators, Terraform/Argo CD and formal SLO/error-budget practice.
|
||||
- **Dennis's real advantage:** ML inference on NVIDIA GPUs integrated into a fab where a defect could have stopped production; Ansible depth including his own extensions; on-call across two Swisscom units, current with alert thresholds he writes; current AWS IaC; ten years of automation across five employers.
|
||||
- **Competitor's real advantage:** inference-serving stack, Kubernetes at scale and current, SRE formalism, networking. Do not value the GPU bridge as highly as their direct serving experience.
|
||||
- **Parser/ATS:** extracts cleanly; strong on IaC/config mgmt/Linux/K8s/AWS/SLO/on-call/alert/GPU literals; no "distributed systems" phrase beyond "distributed processing" and "distributed video-transcoding".
|
||||
- **Recruiter glance: Borderline.** Data-engineer identity in the title line against a production-engineering req; the on-duty bullet and the GPU line are what carry it past a skim.
|
||||
- **Hiring manager: Maybe.** Real production operations and automation, real GPU inference in a harsh environment; no serving stack, Kubernetes not current.
|
||||
- **Technical reviewer — likely first challenges:** (1) "Walk me through a production incident you debugged end to end" (SW-2/SW-11); (2) "How did you roll out a new model version safely in the fab?" (BS-1 — the KB records the failure-consequence constraint, not the rollout mechanics; prepare the honest answer); (3) "When did you last run Kubernetes, and how would you debug a failing pod?"; (4) distributed systems at scale; (5) vLLM/SGLang/Dynamo — say plainly you have not used them.
|
||||
|
||||
## 6. Claim audit
|
||||
|
||||
| Claim | Canonical ID/evidence | Direct/Adjacent | Safe? | Fix |
|
||||
|---|---|---|---|---|
|
||||
| "over ten years in production software and its automation" | Employment from Generali 2015-05; Capgemini excluded | Direct | Yes | — |
|
||||
| Integrated containerized ML inference on NVIDIA GPUs into a continuously operating fab (summary + Bosch #1) | BS-1 incl. 2026-10-22 hardware note | Direct | Yes; no CUDA/GPU-tuning claim | Tier 2 #3 (redundancy) |
|
||||
| Builds AWS data pipelines with CloudFormation | SW-1, SW-7; CloudFormation production-current | Direct | Yes | Be ready to describe templates he wrote |
|
||||
| Serves in the engineer-on-duty rotation; Opsgenie; auto-created Jira tickets | SW-11 | Direct | Yes | — |
|
||||
| "set **the** alert thresholds, including data-quality checks" | SW-11 ("i wrote e.g. thresholds for data quality") | Direct | **Over-generalised** | Tier 1 #1 |
|
||||
| Migrated Fulfillment and Product Analysis domains' ETL to AWS as Python Glue jobs, Airflow, CloudFormation, contributing to wider migration | SW-1 (scoped object, hedged contribution) | Direct | Yes | — |
|
||||
| Design and build governed data products within the company-wide Data Mesh, unit tests | SW-7, SW-6, SW-9 | Direct | Yes; mesh not claimed | — |
|
||||
| Built and operated Python applications on Kubernetes via automated GitLab CI/CD, multiple environments | SW-3 (past; worked with CI/CD, did not build it) | Direct (past) | Yes | Tier 2 #1 (tense cue) |
|
||||
| Owned Fulfillment ETL components, on-call, 2nd/3rd-level support, RCA | SW-2 (past tense) | Direct (past) | Yes | — |
|
||||
| Administered and automated Linux servers; Git-versioned Ansible run from Jenkins/GitLab | BS-6 (no GitOps) | Direct (past) | Yes | — |
|
||||
| Ansible credential plugin caching keystore secrets | BS-6 | Direct | Yes; unquantified | — |
|
||||
| Technical Application Owner for KLA DMS and Spotfire; defined SLOs | BS-3, BS-5 | Direct | Yes | — |
|
||||
| ELK/Kafka PoC with Prometheus, Grafana, Loki | BS-4 incl. 2026-10-22 confirmation | Adjacent (PoC) | Yes; PoC label kept | Tier 2 #4 (observability literal) |
|
||||
| Jenkins build jobs for automatic deployment (Fraunhofer) | FC-1 | Direct | Yes | — |
|
||||
| Test suites as CI/CD quality gates; contributed Python to distributed transcoding backend | VZ-2, VZ-1 (contributor; no customer names) | Direct | Yes | — |
|
||||
| XLDeploy migration; BDD test automation responsibility, Jenkins | GN-3, GN-1 | Direct | Yes | — |
|
||||
| Skills: PyTorch/TensorFlow inside certificate line | certification-context-only | — | Yes (validator) | — |
|
||||
| Contact: EU citizen, Swiss B permit | identity | — | Yes | — |
|
||||
|
||||
## 7. Fixes
|
||||
|
||||
### Tier 1 — truth/fit
|
||||
1. **Swisscom #1:** "set **the** alert thresholds" → "set alert thresholds". He named data-quality thresholds as an example; "the" implies he defines all of them.
|
||||
|
||||
### Tier 2 — presentation
|
||||
1. **Swisscom tense switch:** prefix the two past bullets (Kubernetes/GitLab; Fulfillment ETL on-call) with "Earlier in the role," so the present → past change reads as intentional. No dates or unit names (never date the ART units).
|
||||
2. **Add a one-line personal-infrastructure entry (PP-3):** "Personal: self-host and harden a Debian server (~10 years) running nginx, a mail server, a VPN, Docker services and Bitwarden." It is the only current Linux evidence and the only networking-fundamentals evidence (reverse proxy, VPN, mail). Page 2 has room. PP-3 rules: personal label, no uptime/scale figure, never production/enterprise, never datacenter.
|
||||
3. **Tighten the two dense bullets:** Swisscom #1 (38 words, "alerts" twice) and Bosch #1 ("GPU-backed … deployed on NVIDIA GPUs" says GPU twice; keep "on NVIDIA GPUs").
|
||||
4. **Optional:** add the word "observability" to the BS-4 bullet ("observability proof of concept: …"), keeping the PoC label. It is the JD's own term and honest for that PoC.
|
||||
|
||||
## 8. Cover letter
|
||||
|
||||
Session decision NO: Workday portal, no letter requested, nothing the resume cannot show. Absence not penalised. The warm LinkedIn note has more information value than a letter.
|
||||
|
||||
## 9. Mechanical verification
|
||||
|
||||
- `validate_resume_system.py --document`: **PASS**, 0 warnings (cadence included).
|
||||
- MiKTeX pdflatex: **2 pages**, 0 overfull/underfull boxes. Both pages inspected at 80 dpi: no clipping or overlap; the BS-1 GPU bullet sits on page 1; page 2 ends about half-way (no filler added, by rule).
|
||||
- `pdftotext -layout`: header → Summary → Skills → Experience (Swisscom, Bosch, Fraunhofer, Vizrt, Generali, each employer/date then title/location) → Education. No Capgemini. No Go, Terraform, GitOps, CUDA or networking claim in the text.
|
||||
- Not run: `page_metrics.py` (its `pdftotext -bbox` call fails with the Git-for-Windows binary; page-1 experience start estimated visually at ~44%).
|
||||
|
||||
**Not submit-ready until Tier 1 #1 is applied.** After that the package is a sound Stretch application, still Weak-channel.
|
||||
@@ -0,0 +1,82 @@
|
||||
% NVIDIA -- Senior Production Engineer, DGX Cloud (JR2027105), Switzerland Remote / Zurich.
|
||||
% International Tech profile. Written 2026-10-22 from resume_builder/canonical/claims.json
|
||||
% (incl. SW-11 and the BS-1/BS-4 additions of 2026-10-22); no historical output used as a source.
|
||||
|
||||
\documentclass{resume}
|
||||
\usepackage[utf8]{inputenc}
|
||||
\usepackage[T1]{fontenc}
|
||||
\usepackage{lmodern}
|
||||
\usepackage[a4paper,left=0.65in,right=0.65in,top=0.55in,bottom=0.55in]{geometry}
|
||||
\usepackage{xcolor}
|
||||
\usepackage{hyperref}
|
||||
\hypersetup{hidelinks}
|
||||
\usepackage[version=4]{mhchem}
|
||||
\usepackage{fancyhdr}
|
||||
\pagestyle{fancy}
|
||||
\fancyhf{}
|
||||
\renewcommand{\headrulewidth}{0pt}
|
||||
\fancyfoot[R]{\small \thepage/\pageref{LastPage}}
|
||||
|
||||
\name{Dennis Thiessen, M.Eng.}
|
||||
\headline{Staff Data \& AI Engineer $\vert$ Production Automation and Operations $\vert$ AWS $\cdot$ ML Inference}
|
||||
\contactline{Bern, Switzerland $\vert$ EU citizen, Swiss B permit $\vert$ \href{mailto:dennis@thiessen.io}{dennis@thiessen.io} $\vert$ +41 795 955 585 $\vert$ \href{https://linkedin.com/in/dennis-thiessen}{LinkedIn}}
|
||||
|
||||
\begin{document}
|
||||
|
||||
\begin{rSection}{Summary}
|
||||
Engineer with over ten years in production software and its automation. At Bosch, integrated containerized ML inference on NVIDIA GPUs into a continuously operating semiconductor fab; at Swisscom, builds AWS data pipelines with CloudFormation and serves in the engineer-on-duty rotation.
|
||||
\end{rSection}
|
||||
|
||||
\begin{rSection}{Technical Skills}
|
||||
\skillline{Languages}{Python, SQL, Bash}
|
||||
\skillline{Infrastructure}{AWS, infrastructure as code (CloudFormation), configuration management (Ansible), Linux administration, Docker, Kubernetes, Jenkins, GitLab CI/CD}
|
||||
\skillline{Operations and data}{On-duty incident response, alert thresholds, SLOs, root-cause analysis, unit testing (pytest); PySpark (distributed processing), Kafka, Apache Iceberg}
|
||||
\skillline{AI tooling}{AI-assisted development with Kiro and Copilot}
|
||||
\skillline{Certifications}{AWS Certified Solutions Architect -- Associate (2024); IBM AI Engineering Professional Certificate, incl.\ PyTorch and TensorFlow courses (2020)}
|
||||
\end{rSection}
|
||||
|
||||
\begin{rSection}{Professional Experience}
|
||||
|
||||
\begin{rSubsection}{Swisscom (Schweiz) AG}{Oct 2023 -- Present}{Staff Data, Analytics \& AI Engineer (promoted from Senior, Apr 2025)}{Bern, Switzerland}
|
||||
\item Serve in the team's rotating engineer-on-duty role, responding to Opsgenie alerts and resolving issues through auto-created Jira tickets; set alert thresholds, including data-quality checks, for owned pipelines.
|
||||
\item Migrated the Fulfillment and Product Analysis domains' legacy ETL pipelines to AWS as Python Glue jobs orchestrated with Airflow and provisioned with CloudFormation, contributing to the wider company migration.
|
||||
\item Design and build governed data products on AWS (PySpark, Glue, Athena, Apache Iceberg) within Swisscom's company-wide Data Mesh, with unit tests for the pipeline code.
|
||||
\item Earlier in the role, owned the Fulfillment ETL components that moved business-critical data from Oracle into the Teradata data warehouse, including on-call duty, 2nd/3rd-level support and root-cause analysis.
|
||||
\item Built and operated Python applications on Kubernetes in the same period, deployed through automated GitLab CI/CD pipelines across multiple environments.
|
||||
\end{rSubsection}
|
||||
|
||||
\begin{rSubsection}{Robert Bosch Semiconductor Manufacturing Dresden GmbH}{Feb 2020 -- Dec 2022}{Senior Data Engineer, Data Analysis (promoted from Data Engineer, Jan 2021)}{Dresden, Germany}
|
||||
\item Designed and executed the integration of containerized ML inference on NVIDIA GPUs (Docker, Kubernetes, Ansible) into a continuously operating semiconductor fab, where a software defect could have halted production; reduced manual image-based defect classification.
|
||||
\item Administered and automated the Linux servers behind fab analytics and ML workloads with Git-versioned Ansible playbooks run from Jenkins and GitLab pipelines.
|
||||
\item Developed Ansible extensions, including a credential plugin that cached keystore secrets locally to cut lookup volume.
|
||||
\item Served as technical Application Owner for the KLA Defect Management System and TIBCO Spotfire, defining SLOs and handling vendor communication, user training and documentation.
|
||||
\item Built an observability proof of concept for log management and anomaly detection on ELK and Kafka, with monitoring and alerting in Prometheus, Grafana and Loki.
|
||||
\end{rSubsection}
|
||||
|
||||
\begin{rSubsection}{Fraunhofer Center for Maritime Logistics and Services CML}{Sep 2018 -- Oct 2019}{Research Software Engineer}{Hamburg, Germany}
|
||||
\item Set up Jenkins, including the build jobs for automatic deployment of a C\# and SQL Server crew-scheduling application.
|
||||
\end{rSubsection}
|
||||
|
||||
\begin{rSubsection}{Vizrt}{Jul 2017 -- May 2018}{Test Automation / DevOps Engineer}{Bergen, Norway}
|
||||
\item Developed automated test suites wired into the CI/CD pipeline as quality gates, and contributed Python to a distributed video-transcoding backend.
|
||||
\end{rSubsection}
|
||||
|
||||
\begin{rSubsection}{Generali Deutschland Informatik Services GmbH}{May 2015 -- Jun 2017}{IT Consultant}{Hamburg, Germany}
|
||||
\item Migrated web services to a new XLDeploy deployment procedure and held technical responsibility for BDD test automation (Serenity-BDD, JBehave), with its build jobs administered in Jenkins.
|
||||
\end{rSubsection}
|
||||
|
||||
\end{rSection}
|
||||
|
||||
\begin{rSection}{Personal Infrastructure}
|
||||
Self-host and harden a personal Debian server, run for about ten years: nginx, a mail server, a VPN server, Docker services and Bitwarden.
|
||||
\end{rSection}
|
||||
|
||||
\begin{rSection}{Education}
|
||||
\compactentry{M.Eng. Computer Aided Engineering}{Apr 2012 -- Oct 2013}
|
||||
Universität der Bundeswehr München; Software Design \& Engineering.
|
||||
|
||||
\compactentry{B.Eng. Information and Telecommunication Technologies}{Oct 2009 -- Oct 2012}
|
||||
Universität der Bundeswehr München.
|
||||
\end{rSection}
|
||||
|
||||
\end{document}
|
||||
@@ -0,0 +1,59 @@
|
||||
\ProvidesClass{resume}[2026/07/27 Evidence-first professional resume]
|
||||
\LoadClass[11pt,a4paper]{article}
|
||||
|
||||
\RequirePackage{enumitem}
|
||||
\RequirePackage{ifthen}
|
||||
\RequirePackage{lastpage}
|
||||
\RequirePackage{parskip}
|
||||
\RequirePackage{needspace}
|
||||
|
||||
\pagestyle{empty}
|
||||
\setlength{\parindent}{0pt}
|
||||
|
||||
\def\@resumename{}
|
||||
\def\@resumeheadline{}
|
||||
\def\@resumecontact{}
|
||||
|
||||
\newcommand{\name}[1]{\def\@resumename{#1}}
|
||||
\newcommand{\headline}[1]{\def\@resumeheadline{#1}}
|
||||
\newcommand{\contactline}[1]{\def\@resumecontact{#1}}
|
||||
|
||||
\newcommand{\printresumeheader}{%
|
||||
{\LARGE\bfseries \@resumename}\par
|
||||
\vspace{0.15em}
|
||||
\ifthenelse{\equal{\@resumeheadline}{}}{}{\@resumeheadline\par}
|
||||
\vspace{0.1em}
|
||||
{\small \@resumecontact}\par
|
||||
\vspace{0.45em}
|
||||
}
|
||||
|
||||
\AtBeginDocument{\printresumeheader}
|
||||
|
||||
\newenvironment{rSection}[1]{%
|
||||
\vspace{0.35em}
|
||||
{\bfseries #1}\par
|
||||
\vspace{0.1em}\hrule\vspace{0.35em}
|
||||
}{%
|
||||
\vspace{0.2em}
|
||||
}
|
||||
|
||||
% Arguments: employer, dates, formal title, location.
|
||||
\newenvironment{rSubsection}[4]{%
|
||||
\Needspace{6\baselineskip}%
|
||||
{\bfseries #1}\hfill{\small #2}\par
|
||||
{\itshape #3}\hfill{\itshape #4}\par
|
||||
\vspace{0.1em}
|
||||
\begin{itemize}[leftmargin=1.25em,label=\textbullet,itemsep=0.18em,topsep=0.15em,parsep=0pt,partopsep=0pt]
|
||||
}{%
|
||||
\end{itemize}
|
||||
\vspace{0.25em}
|
||||
}
|
||||
|
||||
\newcommand{\skillline}[2]{%
|
||||
\textbf{#1:} #2\par
|
||||
\vspace{0.08em}
|
||||
}
|
||||
|
||||
\newcommand{\compactentry}[2]{%
|
||||
\textbf{#1}\hfill #2\par
|
||||
}
|
||||
@@ -0,0 +1,162 @@
|
||||
# Session: NVIDIA — Senior Production Engineer, DGX Cloud (Switzerland Remote / Zurich)
|
||||
|
||||
## JD Integrity
|
||||
- **File/source:** `output/NVIDIA_ProdEng_DGX_Cloud/JD_nvidia_prod_eng_dgx_cloud_jr2027105.txt` — req **JR2027105**
|
||||
(`https://nvidia.wd5.myworkdayjobs.com/en-US/NVIDIAExternalCareerSite/job/Switzerland-Remote/Senior-Production-Engineer----DGX-Cloud_JR2027105`)
|
||||
- **Retrieval method and date:** headless Playwright render via `job_scout/.venv` (Workday SPA), **2026-10-22**, HTTP 200.
|
||||
Same text first read in the 2026-10-08 scout triage.
|
||||
- **Verbatim posting:** YES — saved unedited.
|
||||
- **Posting status:** LIVE. *"Posted 16 Days Ago"* on 2026-10-22, so posted ~2026-10-06. Locations: **Switzerland, Remote** and Switzerland, Zurich.
|
||||
|
||||
## Application Decision
|
||||
- **Audience profile:** International Tech (US-tech, English).
|
||||
- **Evidence Fit: 63/100** (dimension table below). The 2026-10-08 triage said "~68 provisional"; this is the full scoring and it is lower.
|
||||
- **Fit class: Stretch.** The score sits in the Adjacent band, but `application_strategy.md` makes a role Stretch when a defining
|
||||
responsibility is only Adjacent, and `config.md`'s decision tree marks SRE as Stretch when it is a required qualification.
|
||||
Required line Q5 (SLIs, SLOs, error budgets, incident response, toil) is the SRE core of a Production Engineer title, and only
|
||||
part of it is evidenced. Judgment recorded: the function itself (operating and automating production services: SW-2, BS-1, BS-6)
|
||||
is Direct, so this is Stretch, not a title-defining Gap / No-go. A strict reading of `critique_framework.md` §1 ("title-defining
|
||||
capability is not Direct") would flag it harder.
|
||||
- **Hard gate: PASS.** No required line is a Gap. Two required lines are only Adjacent and carry the screening risk:
|
||||
Q1 ("8+ years ... large-scale distributed systems") — **the likeliest recruiter-screen rejection** — and Q4 (networking fundamentals).
|
||||
- **Practical constraints: resolved.** Remote from Switzerland is stated in the posting (user baseline is 3 home-office days; fully remote
|
||||
is acceptable when comp and role are strong). Comp: levels.fyi Greater Zurich NVIDIA IC3 median ~CHF 204k (recorded 2026-09-04 in
|
||||
`output/NVIDIA_SrDevOps_Zurich/session_nvidia_sr_devops.md`; self-reported, equity-heavy). English only. EU citizen, B permit.
|
||||
- **Stacking:** NVIDIA Senior DevOps JR2024256 (applied 2026-09-05) was last listed in the 2026-09-18 scrape, absent since 2026-09-23,
|
||||
page "doesn't exist" on 2026-10-22, no response. The req is pulled, so no open NVIDIA posting to stack against (recorded in the tracker).
|
||||
- **Channel Strength: Weak** (cold portal application).
|
||||
- **Channel plan:** no contact is published. Warm action: a short LinkedIn note to an NVIDIA recruiter or a DGX Cloud Production Engineering
|
||||
engineer in Switzerland/Zurich, before or right after submitting.
|
||||
- **Named contact published?** NO.
|
||||
- **Decision: PROCEED (Stretch), 2026-10-22.** Fit gate presented; the user answered the evidence questions and confirmations and kept the instruction to prepare the CV. Recorded as Stretch, not upgraded by the go-ahead.
|
||||
|
||||
### Evidence Fit — dimension table
|
||||
| Dimension | Weight | Score | Basis |
|
||||
|---|---:|---:|---|
|
||||
| Required qualifications | 35 | 26 | 4 Direct (Q2, Q3, Q7, Q8), 4 Adjacent (Q1, Q4, Q5, Q6), 0 Gap |
|
||||
| Core responsibilities | 25 | 12 | 1 Direct (on-call/incident, SW-2), 6 Adjacent, 1 Gap (inference routing/capacity) |
|
||||
| Level and ownership | 15 | 11 | Senior IC vs current Staff title; component/application ownership (SW-2, BS-3); distributed-systems scale is the weak part |
|
||||
| Recency and depth | 10 | 5 | The ops core is past: Ansible/Linux at Bosch to 2022; Kubernetes, GitLab CI/CD and on-call at ART B2B. Current: AWS, CloudFormation, Python/PySpark, Docker, personal Linux (PP-3) |
|
||||
| Domain/tool transfer | 10 | 4 | IaC and CI/CD transfer; vLLM/SGLang/Dynamo/NVCF, GPU, Kubernetes operators, Terraform, Argo CD do not |
|
||||
| Practical constraints | 5 | 5 | Remote CH, English, authorization |
|
||||
| **Total** | 100 | **63** | |
|
||||
|
||||
## Requirements
|
||||
|
||||
### Required — "What we need to see"
|
||||
| # | Requirement | Class | Canonical evidence (currency) | Gate? |
|
||||
|---|---|---|---|---|
|
||||
| Q1 | 8+ years building or operating production services and large-scale distributed systems, including hands-on automation | **Adjacent** | Years: ~9.8 years of visible employment (Generali 2015-05 onward, Capgemini excluded), each with production software plus automation: GN-1, VZ-1/VZ-2, FC-1, BS-1/BS-6, SW-1/SW-2/SW-3. "Large-scale distributed systems": SW-1/SW-6 Glue/PySpark/Athena on AWS (current, managed distributed processing); SW-3 Kubernetes and Kafka (past); VZ-1 contributor to a distributed transcoding backend. Not NVIDIA-scale | **Screen risk** |
|
||||
| Q2 | Strong programming in Python, Go or comparable; tools for production operations | **Direct** | Python production-current; BS-6 Ansible extensions incl. credential-caching plugin (past); SW-1 migration automation as Python Glue jobs (current) | — |
|
||||
| Q3 | IaC, configuration management, or GitOps; automation for repeatable service deployments and changes | **Direct** | Ansible BS-6 (past, intensive); CloudFormation production-current; FC-1 Jenkins build jobs for automatic deployment; SW-3 deployed through automated GitLab CI/CD across multiple environments (past, worked with, did not build). **GitOps forbidden (BS-6)** — the "or" is met without it | — |
|
||||
| Q4 | Strong knowledge of Linux, Kubernetes, containers, cloud, distributed systems, networking fundamentals; diagnose production failures | **Adjacent** | Linux BS-6 (past) + PP-3 (current, personal); Kubernetes SW-3/BS-1 (past only); Docker current; AWS current; distributed systems as Q1; **networking: PP-3 personal only (nginx, VPN, mail) — open question**; diagnosis SW-2 root-cause analysis, 2nd/3rd-level support (past) | Watch |
|
||||
| Q5 | Production Engineering principles: SLIs, SLOs, error budgets, incident response, reducing toil | **Adjacent** | SLOs BS-3 (past); on-call and incident handling SW-2 (past); toil reduction through automation BS-6, SW-1, SW-3. **SLIs and error budgets not established.** BS-6 forbids an SRE role or title claim | Defines Stretch |
|
||||
| Q6 | Instrumenting services; metrics, logs, traces | **Adjacent** | BS-4 ELK/Kafka PoC plus monitoring (past, PoC — never a platform). **Current monitoring at Swisscom unknown — open question** | — |
|
||||
| Q7 | Clear technical communication; work across engineering teams | **Direct** | SW-4 stakeholders/architects/engineers; BS-3 vendors and internal customers; BS-5 TAF 2022 co-presentation; GN-1 presenting BDD; BS-9/SW-10 onboarding juniors | — |
|
||||
| Q8 | BS/MS in Computer Science or equivalent | **Direct** | EDU-MENG (Software Design & Engineering focus), EDU-BENG | — |
|
||||
|
||||
### Core responsibilities — "What you'll be doing"
|
||||
| # | Responsibility | Class | Evidence |
|
||||
|---|---|---|---|
|
||||
| R1 | Build/operate production software, automation, tooling for control plane, model deployments, inference and agentic workloads | Adjacent | BS-1 designed and executed containerized ML inference integration in a 24/7 fab (past). Control plane and agentic: none (SW-8 forbids agent orchestration) |
|
||||
| R2 | Reliability of inference platforms (NVCF, SGLang/vLLM, Dynamo): health validation, safer rollouts, observability, recovery | Adjacent | BS-1 failure-consequence constraint (a defect could have stopped production) is real safe-rollout motivation; serving stacks are Gap |
|
||||
| R3 | Endpoint availability, inference routing, capacity management | Gap | — |
|
||||
| R4 | IaC and GitOps to deploy/configure/validate/upgrade/recover across environments | Adjacent | IaC Direct (Q3); GitOps never |
|
||||
| R5 | Workflows for service enablement, model releases, handoff, deprecation; automate manual work | Adjacent | SW-1 migration automation; SW-7 onboarding sources and data products; BS-1 |
|
||||
| R6 | Define/instrument SLIs and SLOs, error budgets, visible production health | Adjacent | BS-3 SLOs |
|
||||
| R7 | On-call, incident response, troubleshooting; recurring issues into automation | **Direct** | SW-2 (past) |
|
||||
| R8 | Collaborate with model, platform, storage, networking, security, GPU teams | Adjacent | Cross-team work Direct (Q7); these specific teams not |
|
||||
|
||||
### Preferred — "Ways to stand out"
|
||||
| # | Item | Class |
|
||||
|---|---|---|
|
||||
| P1 | vLLM, SGLang, PyTorch, TensorRT-LLM, Dynamo, CUDA, NCCL; GPU performance analysis | Gap (PyTorch is certification-context only) |
|
||||
| P2 | Kubernetes operators/controllers, workload orchestration, fleet management, self-healing automation | Gap (BS-6 Linux-estate automation is not fleet management at this level) |
|
||||
| P3 | Terraform, Argo CD, CI/CD, policy validation, safe deployment and rollback | Partial: CI/CD Direct (Jenkins FC-1/GN-1, GitLab SW-3/BS-6), VZ-2 quality gates; Terraform and Argo CD Gap (Terraform forbidden) |
|
||||
| P4 | Developing with AI tools and agents | Direct-ish: Kiro, Copilot, LiteLLM, custom GPTs (SW-8 limits apply) |
|
||||
| P5 | Production AI inference or agentic workloads, debugging across models, runtimes, Kubernetes, hardware | Adjacent: BS-1 |
|
||||
|
||||
## Open Evidence Questions (asked 2026-10-22, per the recurring DevOps/SRE lesson)
|
||||
1. **Current ops at Swisscom (ART DPT):** monitoring/alerting on his Glue/Airflow pipelines (CloudWatch alarms, failure alerts, dashboards)? On-call in the current unit? Decides whether Q5/Q6 have current evidence.
|
||||
2. **Networking:** AWS VPC, security groups, private endpoints at Swisscom; firewall, DNS, proxy or load-balancer work at Bosch? Would move Q4 networking from personal-only (PP-3) to professional.
|
||||
3. **Bosch inference hardware:** did the inference containers run on GPUs? If yes, it licenses "deployed GPU-backed inference containers" only, never CUDA or GPU performance work.
|
||||
|
||||
## Competitive Read
|
||||
- **Obvious-fit candidate:** an SRE/production engineer from a hyperscaler, GPU cloud or ML-serving company who has run vLLM/Triton-style
|
||||
endpoints on Kubernetes at scale, written operators, and works in Terraform/Argo CD with formal SLOs and error budgets.
|
||||
- **Dennis's advantage:** production ML inference integrated into a continuously running semiconductor fab where a defect could have stopped
|
||||
production (BS-1); Ansible depth beyond use, including extensions (BS-6); component ownership with on-call and root-cause work (SW-2);
|
||||
current AWS IaC (CloudFormation) and Python automation; a ~10-year automation thread across five employers; current AI dev tooling.
|
||||
- **Their advantage:** inference-serving stack, GPU, Kubernetes at scale and currently, SRE formalism (SLIs/error budgets), networking.
|
||||
- **Level/scope:** NVIDIA Senior against Swisscom Staff — not a level problem; comp upside is clear.
|
||||
|
||||
## Framing Strategy (draft — confirmed in Phase 2)
|
||||
- **Professional identity:** engineer who builds and operates the automation and delivery layer under production services, including ML
|
||||
inference in a 24/7 environment. Never "SRE" as a title.
|
||||
- **Strongest proof points:** BS-1, BS-6, SW-2, SW-1 + CloudFormation, SW-3 (past), BS-3 SLOs, BS-4 (PoC).
|
||||
- **Explicit gaps:** inference-serving stack, GPU, current Kubernetes, SLIs/error budgets, networking, large-scale distributed systems.
|
||||
- **User directives:** none yet.
|
||||
|
||||
### Answers received 2026-10-22 (recorded in claims.json; extraction `knowledge_base/extractions/2026-10-22_oncall_networking_gpu_clarification.md`)
|
||||
1. Current on-duty: Opsgenie alerting, rotating engineer-on-duty role, alerts and bugs auto-create Jira tickets the team assigns and fixes → **new claim SW-11** (current).
|
||||
2. Networking: no professional configuration; automated AWS landing zones; AWS SAA cert covers AWS networking → skill `networking`, **certification context only**. Q4 stays Adjacent.
|
||||
3. Bosch inference ran on **NVIDIA GPUs** with CUDA; he did little CUDA/GPU configuration → BS-1 scope; **CUDA registered forbidden** as a skill.
|
||||
|
||||
**Re-score after answers: Evidence Fit 65** (Recency 5→6: current on-duty; Domain 4→5: production inference on NVIDIA GPUs). Class unchanged: **Stretch** — Q5 still lacks SLIs and error budgets. Hard gate PASS.
|
||||
|
||||
## Resume Plan (proposed 2026-10-22, awaiting approval)
|
||||
- **Profile:** International Tech, 2 pages. Contact line Bern, Switzerland, plus "EU citizen, Swiss B permit" (remote-CH role, so residency/authorization is worth one line).
|
||||
- **Summary (2-3 lines):** over ten years building and operating production software and its automation; GPU-backed ML inference integrated into a continuously running fab (BS-1); today AWS pipelines with CloudFormation and a seat in the on-duty rotation (SW-1, SW-11). No "12+ years" (template claim is open in the KB log).
|
||||
- **Skills (~5 rendered lines):** Python, SQL, Bash · AWS (Glue, Athena, S3, Airflow), CloudFormation, Ansible, Docker, Kubernetes, Linux administration, Jenkins, GitLab CI/CD · on-duty incident response (Opsgenie, Jira), SLOs, root-cause analysis, unit testing (pytest) · PySpark, Kafka, Apache Iceberg · AI dev tools: Kiro, Copilot, LiteLLM · Certs line: AWS SA Associate (2024), IBM AI Engineering (PyTorch, TensorFlow; 2020), ITIL Foundation (2016). Never: CUDA, GitOps, Terraform, SRE title, networking as a skill.
|
||||
- **Swisscom (5):** (1) SW-11 on-duty rotation, Opsgenie alerts, Jira-tracked fixes — current; (2) SW-1 + CloudFormation: his domains' ETL migrated to AWS as Python Glue jobs, IaC, Airflow — contributor to the wider programme; (3) SW-7 + SW-6 + SW-9: design and build governed data products (PySpark, Glue, Athena, Iceberg) inside the company-wide Data Mesh, unit-tested with pytest; (4) SW-3 past: built and operated Python applications on Kubernetes, deployed through automated GitLab CI/CD across multiple environments; (5) SW-2 past: owned the Fulfillment ETL components into Teradata with on-call, 2nd/3rd-level support and root-cause analysis.
|
||||
- **Bosch (4):** (1) BS-1 lead: designed and executed integration of containerized ML inference on NVIDIA GPUs into a continuously operating fab where a software defect could have halted production (Docker, Kubernetes, Ansible), reducing manual defect classification; (2) BS-6: administered and automated the Linux estate behind fab analytics and ML (Ansible from Git, run from Jenkins/GitLab), incl. the credential-caching Ansible plugin; (3) BS-3/BS-5: technical Application Owner for KLA DMS and Spotfire, defined SLOs, vendors, user training; (4) BS-4: ELK/Kafka log-management and anomaly-detection PoC with monitoring (PoC label kept).
|
||||
- **Earlier (1 each):** Fraunhofer FC-1 (Jenkins jobs for automatic SCEDAS deployment); Vizrt VZ-2 + VZ-1 (test suites as CI/CD quality gates; contributed Python to a distributed transcoding backend; no customer names); Generali GN-3 + GN-1 (web services onto a new XLDeploy deployment procedure; technical responsibility for BDD test automation in Jenkins).
|
||||
- **Total bullets:** 12.
|
||||
- **Open confirmations before generation:** (a) BS-4 — did the PoC include Grafana/Prometheus/Loki? Source is only the user's earlier CV (`thiessen_cv_master_profile.md`), not the Zeugnis or claims.json; omitted unless confirmed. (b) SW-11 — does he also write or adjust the alerts for his own pipelines? If not, the bullet says "respond to" only.
|
||||
- **Impact evidence still needed:** none quotable; every claim is metrics-unverified.
|
||||
|
||||
## Cover Letter Decision
|
||||
- **NO.** Workday portal, no letter requested; no transition, relocation or language issue to explain; the GPU and on-duty evidence fits in the resume. The warm action (LinkedIn note) has more information value than a letter.
|
||||
|
||||
### Confirmations received 2026-10-22 (recorded in claims.json)
|
||||
- (a) BS-4 included Grafana, Prometheus and Loki (PoC). (b) He writes alert thresholds for his own pipelines, e.g. data-quality thresholds (SW-11).
|
||||
- Generation started on the user's instruction "prepare the cv for nvidia" plus these answers; no plan objection was raised. Any plan change is an `/edit-resume` pass.
|
||||
|
||||
## As Built (2026-10-22)
|
||||
- **Header:** headline "Staff Data & AI Engineer | Production Automation and Operations | AWS · ML Inference"; contact line Bern, Switzerland | EU citizen, Swiss B permit.
|
||||
- **Summary:** 3 rendered lines (trimmed from 4 to meet config.md's 2-3); "over ten years in production software and its automation" (measured from Generali 2015-05).
|
||||
- **Skills:** 5 categories, 8 rendered lines (trimmed from 9; cut what bullets prove: Opsgenie/Jira, ELK/Prometheus/Grafana/Loki, AWS service list, LiteLLM, ITIL). Literals for required Q3 restored after the headline cut dropped them: "infrastructure as code (CloudFormation)", "configuration management (Ansible)"; Q1 support: "PySpark (distributed processing)". PyTorch/TensorFlow only inside the IBM certificate line (validator rule). No CUDA, GitOps, Terraform, networking or SRE title.
|
||||
- **Bullets: 13** — Swisscom 5 (SW-11, SW-1, SW-7/SW-6/SW-9, SW-3 past, SW-2 past); Bosch 5 (BS-1 with NVIDIA GPUs, BS-6 estate, BS-6 plugin, BS-3/BS-5, BS-4 PoC); Fraunhofer FC-1; Vizrt VZ-2/VZ-1; Generali GN-3/GN-1. Deviation from plan: the BS-6 credential plugin became its own short bullet (Bosch 5 instead of 4) for readability.
|
||||
- **Layout:** the template's forced page break after Swisscom was removed so the Bosch NVIDIA-GPU bullet sits on page 1. Page 2 ends about half-way; no filler added.
|
||||
- **Validation:** `validate_resume_system.py --document` PASS, 0 warnings (first run failed on PyTorch without certification context; fixed). MiKTeX pdflatex: 2 pages, 0 overfull/underfull boxes. Both pages inspected visually at 80 dpi. `pdftotext -layout`: heading/employer/title/date order correct; no Capgemini.
|
||||
|
||||
## Output Files
|
||||
- Resume: `e2e_nvidia_prod_eng_dgx_cloud_resume.tex` (source of truth) + `.pdf`
|
||||
- Cover letter: intentionally omitted (decision NO above)
|
||||
- Critique: `critique_nvidia_prod_eng_dgx_cloud.md` (2026-10-22)
|
||||
|
||||
## Critique Summary (2026-10-22)
|
||||
- Evidence Fit: **65/100 — Stretch**
|
||||
- Hard gate: **PASS** (Q1 large-scale distributed systems is the likeliest screen rejection)
|
||||
- Document Quality: **85/100**
|
||||
- Channel Strength: **Weak** (warm LinkedIn note not yet sent)
|
||||
- Tier 1 fixes: (1) Swisscom #1 "set the alert thresholds" → "set alert thresholds". Tier 2: tense cue on the two past Swisscom bullets; one-line PP-3 personal-infrastructure entry; tighten Swisscom #1 and Bosch #1; optional "observability" on BS-4.
|
||||
|
||||
## Status
|
||||
- Fit gate: Stretch, Evidence Fit 63 initial → 65 after the 2026-10-22 answers; hard gate PASS
|
||||
- Resume: generated and validated 2026-10-22; awaiting user review
|
||||
- Cover letter: NO
|
||||
- Critique: done 2026-10-22 — DQ 85 measured BEFORE Edit 1; **stale after Edit 1** (not re-measured; never quote a post-edit estimate as a score)
|
||||
- Application/outcome: **SUBMITTED 2026-10-22** via Workday (user-confirmed). Tracker row added (applied, stretch, 65, hard gate pass, channel weak); scout decision `applied`. Channel still Weak until the LinkedIn note is sent.
|
||||
- **Finalized 2026-10-22 on user instruction ("finalize").** Checks: session, `.tex`, `.pdf`, critique and JD present; PDF newer than `.tex`; validator PASS, 0 warnings; 2 pages; PDF metadata clean (empty Title/Author, MiKTeX pdfTeX). Submission copy `Dennis_Thiessen_Resume.pdf` created, byte-identical to `e2e_nvidia_prod_eng_dgx_cloud_resume.pdf`. No cover letter (decision NO).
|
||||
- Next: user submits via Workday → then `application_tracker.py add` (outcome applied, fit stretch, evidence-fit 65, hard-gate pass, channel weak, job-id JR2027105) and regenerate views. Not added before submission, because `add` stamps `application_date`. Warm action: LinkedIn note to an NVIDIA recruiter or DGX Cloud engineer (draft given to the user 2026-10-22). **Refresh `Dennis_Thiessen_Resume.pdf` on any recompile.**
|
||||
|
||||
## Edit History
|
||||
|
||||
### Edit 1 (2026-10-22): critique Tier 1 + all Tier 2, user-approved ("apply fixes and improvements as you recommend")
|
||||
- **Tier 1 #1 (truth):** Swisscom #1 "set the alert thresholds" → "set alert thresholds" (SW-11: data-quality thresholds were an example, not all thresholds).
|
||||
- **Tier 2 #1:** the two past Swisscom bullets now read "Earlier in the role, owned the Fulfillment ETL components …" and "Built and operated Python applications on Kubernetes in the same period …" (SW-2 moved before SW-3 so the two do not open identically). No dates, no unit names.
|
||||
- **Tier 2 #2:** new section **Personal Infrastructure** (PP-3): "Self-host and harden a personal Debian server, run for about ten years: nginx, a mail server, a VPN server, Docker services and Bitwarden." Personal label in the heading and the sentence; no uptime/scale figure; not presented as employer, production or datacenter work.
|
||||
- **Tier 2 #3:** Swisscom #1 tightened ("alerts" once; "resolving issues through auto-created Jira tickets"); Bosch #1 now names the GPUs once: "containerized ML inference on NVIDIA GPUs (Docker, Kubernetes, Ansible)".
|
||||
- **Tier 2 #4:** BS-4 now "Built an observability proof of concept for log management and anomaly detection on ELK and Kafka …" (PoC label kept).
|
||||
- **Verification:** validator PASS, 0 warnings; MiKTeX 2 pages, 0 overfull/underfull boxes; both pages inspected at 80 dpi (Bosch NVIDIA-GPU bullet still on page 1; Personal Infrastructure sits between Experience and Education on page 2; page 2 ends a little past half-way); `pdftotext -layout` order: Summary → Skills → Experience (Swisscom, Bosch, Fraunhofer, Vizrt, Generali) → Personal Infrastructure → Education. Bullets: 13 experience bullets unchanged in count, plus the one-line personal entry. (copy to `Dennis_Thiessen_Resume.pdf`, tracker `add`). Warm action before/after submit: LinkedIn note to an NVIDIA recruiter or DGX Cloud engineer.
|
||||
@@ -0,0 +1,383 @@
|
||||
\documentclass[11pt,a4paper]{article}
|
||||
\usepackage[utf8]{inputenc}
|
||||
\usepackage[T1]{fontenc}
|
||||
\usepackage[ngerman]{babel}
|
||||
\usepackage{lmodern,microtype}
|
||||
\usepackage[margin=23mm]{geometry}
|
||||
\usepackage{enumitem,booktabs,tabularx,longtable,array}
|
||||
\usepackage[hidelinks]{hyperref}
|
||||
\usepackage{xurl}
|
||||
\usepackage[version=4]{mhchem}
|
||||
\setlength{\parindent}{0pt}
|
||||
\setlength{\parskip}{5pt}
|
||||
\setlist{nosep,leftmargin=1.4em}
|
||||
\emergencystretch=2em
|
||||
\widowpenalty=10000
|
||||
\clubpenalty=10000
|
||||
\newcommand{\file}[1]{{\small\nolinkurl{#1}}}
|
||||
\newcommand{\finding}[2]{\subsection*{#1 --- #2}}
|
||||
\newcommand{\source}[2]{\footnote{#1. Quelle #2 im Quellenverzeichnis; abgerufen am 11.09.2026.}}
|
||||
\begin{document}
|
||||
\begin{center}{\LARGE Projektreview und Markttauglichkeit der Bewerbungsunterlagen}\end{center}
|
||||
|
||||
\section{Gesamturteil und Prüfgrundlage}
|
||||
|
||||
Die aktuellen Bewerbungsunterlagen haben eine solide Basis für den Schweizer und europäischen Tech-Arbeitsmarkt: gut lesbare, einspaltige A4-Dokumente, nachvollziehbare Berufschronologie, konkrete technische Arbeit und deutlich bessere Abgrenzung eigener Verantwortung als in älteren Paketen. Ein grundlegender Designwechsel ist nicht erforderlich. Die grössten Verbesserungsmöglichkeiten liegen in der Konsistenz des Generierungssystems, der Verlässlichkeit seiner Prüfungen und der Gewichtung der ersten Lebenslaufseite.
|
||||
|
||||
\textbf{Das System ist derzeit weniger zuverlässig, als seine PASS-Meldungen und detaillierten Bewertungszahlen nahelegen.} Zwei Agenten können unterschiedliche Anweisungen erhalten. Bereits aufgehobene Regeln wirken weiter im Code. Der Validator akzeptiert nachweislich Aussagen, die den zentralen Evidenzregeln widersprechen. Im Job-Scout können passende Stellen verschwinden, bevor eine inhaltliche Bewertung stattfindet.
|
||||
|
||||
Die Recherche stützt das bestehende Grundformat, aber keinen Anspruch auf ein wissenschaftlich nachgewiesenes Erfolgsoptimum. Für die Schweiz, Dänemark und Norwegen existieren unterschiedliche Bewerbungskonventionen; Arbeitgebervorgaben können diese wiederum übersteuern. Besonders die generelle Behandlung von Anschreiben und die starke Orientierung an einem US-Tech-Kurzformat sollten länderspezifischer werden.
|
||||
|
||||
\textbf{Stand: 11. September 2026.} Geprüft wurden Projektanweisungen, Konfiguration, Skills beider Agentenverzeichnisse, Referenzen, kanonische Claims, aktive Wissensbasis und Rollen-Bundles, die fünf projektspezifischen Python-Dateien einschliesslich Tests sowie generierte Dokumente und Tracking-Dateien. Historische Rohquellen wurden zur Einordnung herangezogen; eine erneute Extraktion sämtlicher Originaldokumente war nicht Teil dieses Reviews.
|
||||
|
||||
\begin{tabularx}{\linewidth}{@{}p{.34\linewidth}X@{}}
|
||||
\toprule Prüfung & Ergebnis und Aussagegrenze\\\midrule
|
||||
Vorhandene Tests & 9 Tests bestanden mit \file{python -m unittest discover -s tests -v}. Das deckt die neu gefundenen Fehler nicht ab.\\
|
||||
Systemvalidator & Standardlauf PASS, 0 Warnungen. Zusätzliche Gegenproben zeigen erhebliche Lücken.\\
|
||||
LaTeX-Build & 43 vorhandene Output-Quellen plus zwei professionelle Templates: 43 von 45 erfolgreich, zwei Fehler. Je zwei Durchläufe mit pdfLaTeX, ohne Shell-Escape, Build-Produkte im temporären Verzeichnis.\\
|
||||
Visuelle Stichprobe & SBB, NVIDIA, RUAG, Aker BP: je beide CV-Seiten; zusätzlich NVIDIA- und RUAG-Anschreiben. Insgesamt zehn Seiten geprüft.\\
|
||||
Scout & 37 konfigurierte Unternehmen, 18 Adaptertypen. Statische Prüfung und gezielte Mock-Gegenproben; kein vollständiger Live-Funktionstest aller Portale.\\
|
||||
Änderungsumfang & Keine Bewerbungen, Claims, Produktionsskripte oder eingereichten Archive geändert. Bericht und temporäre Prüfarbeitsdateien erstellt.\\\bottomrule
|
||||
\end{tabularx}
|
||||
|
||||
\textbf{Prioritäten:} P1 bezeichnet Risiken für Wahrheitsgehalt, Stellenauswahl oder verbindliche Entscheidungen. P2 umfasst Reproduzierbarkeit, Wartbarkeit und wirksame Dokumentverbesserungen. P3 bezeichnet kleinere Bereinigungen. Die Einstufung ist eine Review-Priorisierung, kein berechneter Risikoscore.
|
||||
|
||||
\section{Widersprüche in Regeln, Zustand und Workflow}
|
||||
|
||||
\finding{F01 / P1}{Die Agenten verwenden unterschiedliche Bewerbungsprozesse}
|
||||
|
||||
\textbf{Fundstellen:} \file{.agents/skills/} und \file{.claude/skills/}, besonders jeweils \file{make-resume/SKILL.md} und \file{critique/SKILL.md}.
|
||||
|
||||
Alle sechs korrespondierenden Skills unterscheiden sich inhaltlich. Die Claude-Fassung von \file{make-resume} verlangt weiterhin feste Bullet-Zeilenvarianten und Zeichenbudgets; die neuere Fassung setzt auf natürliche Länge, Claims und Evidenz. Auch die Behandlung eines fehlenden Anschreibens, geschützter Abschnitte und der Bewertung unterscheidet sich. Damit hängt das Ergebnis vom verwendeten Agenten ab, obwohl beide dasselbe Projekt bearbeiten.
|
||||
|
||||
\textbf{Folge:} Veraltete Regeln können wieder eingeführt werden, ohne dass ein Codefehler nötig ist. Besonders problematisch sind alte Schreibanweisungen, die neuere Genauigkeitskontrollen umgehen oder Relevanz zugunsten eines Seitenfüllziels verschieben.
|
||||
|
||||
\textbf{Empfehlung:} Ein gemeinsamer, versionierter Prozess mit kleinen agentenspezifischen Einstiegspunkten. Die Einstiegspunkte sollen dieselben Referenzen laden, nicht vollständige Kopien enthalten. Ein Konsistenztest sollte diese Referenzen und die gültige Prozessversion prüfen. Die Dateikarte in \file{AGENTS.md} verweist ausserdem auf \file{.Codex/skills/}, während die tatsächlich verwendeten Skills anderswo liegen.
|
||||
|
||||
\finding{F02 / P1}{Bewerbungsstatus ist mehrfach und widersprüchlich gespeichert}
|
||||
|
||||
\textbf{Fundstellen:} aktive Sessions in \file{AGENTS.md}, \file{CLAUDE.md}, Kohortenstatus und Scout-Entscheidungen.
|
||||
|
||||
SBB steht in AGENTS noch als bevorstehendes Interview am 9. September; die aktuelleren Einträge dokumentieren das Gespräch und den Rückzug am 11. September. Kdo Cy steht dort noch als eingereicht, obwohl der neuere Tracker eine Absage am 10. September enthält. Auch Microsoft ISE und Equinor haben in CLAUDE bereits Absagen, während AGENTS auf Antwort wartet.
|
||||
|
||||
Das ist operativ relevant: Ein neuer Agent könnte eine Vorbereitung für ein abgeschlossenes Gespräch anbieten, falsche Conversion-Zahlen nennen oder eine Stelle erneut priorisieren. Lange Session-Zellen mischen zudem aktuelle Erkenntnisse, frühere Schätzungen und inzwischen überholte nächste Schritte. Die SBB-Gehaltskenntnis darf beispielsweise nicht auf andere Arbeitgeber in Bern oder Thun verallgemeinert werden.
|
||||
|
||||
\textbf{Empfehlung:} Eine strukturierte Bewerbung pro Requisition, mit aktuellem Zustand und separatem Ereignisverlauf. AGENTS- und CLAUDE-Übersichten daraus erzeugen. Ein Rückzug nach einem Interview muss zugleich \emph{aktueller Status: zurückgezogen} und \emph{Interview erreicht: ja} ausdrücken können. Historische Notizen erhalten, aber aus der aktuellen Handlungsanweisung entfernen.
|
||||
|
||||
\finding{F03 / P1}{Die aufgehobene Quote blockiert weiterhin Bewerbungen}
|
||||
|
||||
\textbf{Fundstelle:} \file{resume_builder/helpers/cohort_tracker.py:59}, insbesondere Zeile 61; ausserdem README und ältere Skill-Anweisungen.
|
||||
|
||||
Seit dem 5. September gelten keine Bewerbungsquoten mehr. Der Tracker verweigert dennoch die elfte Bewerbung mit \emph{cohort already contains ten applications}. Diese Sperre wurde mit einem synthetischen Datensatz reproduziert. Auch Hinweise auf volle Fit-Kategorien sind noch vorhanden.
|
||||
|
||||
\textbf{Empfehlung:} Die operative Obergrenze entfernen; historische Kohortenbezeichnungen dürfen bestehen bleiben. Zugleich eindeutige Bewerbungs-IDs, gültige Datumswerte, Score-Bereiche und idempotente Updates prüfen. Der aktuelle Schreibweg schützt weder ausreichend vor Duplikaten noch vor widersprüchlichen Nachträgen. Eine atomare Speicherung allein löst dabei keine konkurrierenden Updates.
|
||||
|
||||
\textbf{Weitere Bewertungsinkonsistenz:} Aker BP wird trotz 79 Punkten und bestandenem Hard Gate als Adjacent geführt, obwohl die numerische Einteilung Core nahelegt. Das kann eine sachlich gewollte Entscheidung sein. Es braucht dann einen expliziten Override-Grund und eine Rubrikversion, keine stillschweigende Umklassifizierung.
|
||||
|
||||
\finding{F04 / P2}{Regelhierarchie und Auslieferungsauftrag sind nicht eindeutig}
|
||||
|
||||
AGENTS verlangt ausschliesslich TEX-Ausgaben und lokale Kompilierung durch Dennis, fordert an anderer Stelle aber selbst Kompilierung und Sichtprüfung; Konfiguration und Skills beschreiben PDF-Auslieferungen. Alte und neue Referenzen widersprechen sich zudem bei Capgemini, der Bedeutung von Zeichenbudgets und verpflichtenden Bildungsdetails.
|
||||
|
||||
\textbf{Empfehlung:} Drei Ebenen unterscheiden: unveränderliche Evidenzregeln, aktuelle persönliche Präferenzen und markt-/arbeitgeberspezifische Darstellung. Technische QA und auszuliefernde Dateitypen separat festlegen. Dieser Review liefert entsprechend der TEX-Vorgabe den Bericht als TEX; die eigene Kompilierung dient ausschliesslich der QA.
|
||||
|
||||
\section{Evidenzprüfung und Wissensbasis}
|
||||
|
||||
\finding{F05 / P1}{PASS ist keine belastbare Wahrheitsprüfung}
|
||||
|
||||
\textbf{Fundstelle:} \file{resume_builder/helpers/validate_resume_system.py:121}, Funktion \file{scan_document}.
|
||||
|
||||
Der Dokumentcheck sucht im Wesentlichen globale verbotene Textmuster, bestimmte Skill-Namen und wenige Titelmuster. Er prüft nicht systematisch die erlaubten Verben und Verbote jedes einzelnen Claims, Eigentumsumfang, Zertifikatskontext, Arbeitgeberdaten, Identität, Zahlen oder die Zuordnung zwischen Bullet und Claim.
|
||||
|
||||
Folgende absichtlich falschen beziehungsweise unzulässigen Gegenproben bestanden ohne Fehler:
|
||||
\begin{itemize}
|
||||
\item vollständiger Besitz einer Data-Mesh-Plattform und des gesamten ML-Lebenszyklus;
|
||||
\item Capgemini trotz ausdrücklicher persönlicher Ausschlussregel;
|
||||
\item produktives Training mit PyTorch und TensorFlow trotz begrenzter kanonischer Evidenz;
|
||||
\item produktive Arbeit mit nicht entsprechend belegten Skills wie Groovy und Snowflake;
|
||||
\item falsche E-Mail, falscher Beginn der Staff-Rolle und eine erfundene Kostensenkung;
|
||||
\item ein stehengebliebener \file{[GENERATE: Bullet]}-Platzhalter.
|
||||
\end{itemize}
|
||||
|
||||
Das sind Tests des Validators, keine Behauptung, alle diese Fehler stünden in aktuellen Lebensläufen. Sie zeigen, dass sein grünes Ergebnis den zentralen Qualitätsanspruch nicht absichert.
|
||||
|
||||
\textbf{Empfehlung:} Jedes Dokument bekommt ein strukturiertes Inhaltsmanifest mit Claim-IDs, Skill-Evidenz und beabsichtigter Formulierung. Deterministisch prüfbar sind Identität, Daten, bekannte Metriken, Pflichtkontext, ausgeschlossene Inhalte und Referenzintegrität. Die semantische Frage, ob ein Satz unzulässige Gesamtverantwortung suggeriert, braucht weiterhin eine gesonderte inhaltliche Prüfung. Beide Resultate getrennt ausgeben; keinen automatischen Wahrheitsnachweis versprechen.
|
||||
|
||||
\finding{F06 / P2}{Der Textscan erzeugt Fehlalarme und sprachabhängige Lücken}
|
||||
|
||||
Ein Kommentar wie \file{\% Never claim Terraform experience} wird als unzulässiger Skill gewertet. Dasselbe gilt für die ehrliche Aussage, keine Terraform-Erfahrung zu haben. Umgekehrt umgeht ein durch LaTeX-Auszeichnung aufgeteilter Skillname den Stringvergleich. In einer SBB-Quelldatei wird bereits davor gewarnt, verbotene Namen auch nur in Kommentaren zu erwähnen: Der Workflow arbeitet um den Prüfer herum.
|
||||
|
||||
Die Bullet-Analyse verarbeitet nur bestimmte einzeilige Quellmuster. Die Dreierlisten-Heuristik in Zeile 140 erkennt englisches \emph{and}, nicht das entsprechende deutsche \emph{und}. Gegenproben zeigen diesen Unterschied; andere Warnungen wie wiederholte Verben funktionieren teilweise auch deutsch. Daraus folgt kein allgemeines Urteil, der gesamte Prüfer könne kein Deutsch.
|
||||
|
||||
\textbf{Empfehlung:} Kommentare und sichtbaren Text unterscheiden, LaTeX normalisieren und die relevanten Strukturen robust extrahieren. Verneinungen benötigen Kontext oder manuelle Freigabe. Stilheuristiken als unverbindliche Hinweise ausgeben. Für eine Grenze von ungefähr 50 Prozent Dreierlisten als Qualitäts- oder KI-Erkennungsregel wurde keine belastbare externe Grundlage gefunden. Belegte Verben und natürliche Sprache sind wichtiger als künstliche Variation.
|
||||
|
||||
Die Schema-Prüfung hat zusätzliche Lücken: Eine fehlende Identität führt nach der Fehlermeldung zu einem \file{KeyError}; ein unmögliches Datum wie \file{2035-99} und ein nicht existierender Quellenverweis wurden akzeptiert. Hier sind kleine negative Regressionstests besonders wirksam.
|
||||
|
||||
\finding{F07 / P1}{Korrekturen fehlen in aktiven Schreibquellen}
|
||||
|
||||
\begin{longtable}{@{}p{.30\linewidth}p{.64\linewidth}@{}}
|
||||
\toprule Fundstelle & Widerspruch und notwendige Behandlung\\\midrule
|
||||
\endhead
|
||||
\file{bundles/bundle_ml_ai_engineer.md:74,81} & PyTorch wird unter aufzunehmenden Skills genannt; weiter unten steht korrekt, dass der Zertifikatskontext nötig ist. Die generische Liste kann genau diesen Kontext verlieren.\\
|
||||
\file{experience/experience_swisscom.md:166--189} & Retrieval-Begriffe stehen als Skills/Keywords und Evaluation als Schreibempfehlung, obwohl Retrieval-Implementierung und breitere LLM-Evaluationsverantwortung nicht belegt sind. Datenbereitschaft und konfigurierte Agenten enger beschreiben.\\
|
||||
\file{bundles/bundle_data_platform.md:69} & Aus kontinuierlichem Fabrikbetrieb wird eine Zero-Downtime-Deployment-Anforderung abgeleitet. Das ist ohne zusätzlichen Beleg eine stärkere Behauptung.\\
|
||||
\file{experience/experience_bosch.md}, BS-1 & Vollständiges Ersetzen manueller Waferinspektion und unbeaufsichtigter Betrieb reichen weiter als die kanonisch belegte Bildklassifikation und qualitative Reduktion manueller Arbeit. Varianten zurück auf den bestätigten Umfang führen.\\
|
||||
\file{reference/resume_reference.md:62} und Capgemini-Erfahrungsdatei & Bedingtes Aufnehmen von Capgemini widerspricht der persönlichen Ausschlussregel. Rohhistorie erhalten, aktive Auswahlregeln korrigieren.\\
|
||||
\file{experience/experience_bosch.md} und Plattform-Bundle & Die neuere BS-6-Evidenz zu Linux/Ansible ist nicht vollständig in den normalen Auswahlpfaden angekommen. Das System verliert dadurch echte Stärken.\\
|
||||
\file{support/skills_taxonomy.md} & Veralteter Hinweis auf unbekanntes IBM-Abschlussjahr trotz vorhandener verifizierter Datierung; unterschiedliche Einordnung von PyTorch. Auch Linux/Bash fehlen in der erwarteten systematischen Abbildung.\\
|
||||
\bottomrule
|
||||
\end{longtable}
|
||||
|
||||
Alle verkürzten Pfade in dieser Tabelle liegen unter \file{resume_builder/}. Die kritische Beobachtung ist die Richtung des Fehlers: Es entstehen sowohl Übertreibungen als auch unnötige Unterbewertungen. Das NVIDIA-Anschreiben spricht beispielsweise davon, dass die Produktionslinie für ein Deployment nicht gestoppt werden konnte; RUAG verwendet eine ähnliche Stillstandsaussage. Diese Aussagen sind aus dem bisher kanonisch dokumentierten 24/7-Kontext allein nicht ableitbar. Sie sollten bestätigt oder enger formuliert werden, nicht vorschnell als nachweislich falsch gelten.
|
||||
|
||||
Weitere Widersprüche betreffen die Priorität des Plattform-Bundles und die Platzierung des Security-Champion-Themas. Solche Prioritäten sollten aus einer gemeinsamen Rollenmatrix kommen. Nach einer Claim-Korrektur ist ein gezielter Abhängigkeitslauf über alle aktiven Varianten sinnvoll; unveränderliche Originalquellen und bereits versandte Dokumente dürfen dabei nicht stillschweigend umgeschrieben werden.
|
||||
|
||||
\finding{F08 / P2}{Das Evidenzmodell ist noch nicht durchgehend maschinenprüfbar}
|
||||
|
||||
Von 26 kanonischen Claims besitzt nur einer die jeweils geprüften strukturierten Felder \file{source}, \file{last_verified} und \file{ownership}. Andere Claims enthalten durchaus Evidenz und Einschränkungen in Freitext; die Zählung bedeutet ausdrücklich nicht, dass 25 Claims unbelegt seien. Sie erklärt aber, weshalb automatische Referenz- und Aktualitätsprüfungen derzeit schwer möglich sind.
|
||||
|
||||
Auch Skills, die innerhalb bestätigter Tätigkeiten vorkommen, sind nicht vollständig als eigenständige Skill-Einträge normalisiert. Das kollidiert mit der Regel, jeder ausgegebene Skill müsse vorher kanonisch registriert sein. Ein sinnvoller nächster Schritt ist ein kleines Schema für Quellenanker, Gültigkeitszeitraum, Kontext, Eigentumsumfang und erlaubte Ableitungen. Die Claim-ID verbindet die Daten; zusätzliche parallele Freitextregister würden den Pflegeaufwand weiter erhöhen.
|
||||
|
||||
\finding{F09 / P1}{Vorlagen enthalten bereits riskante Aussagen}
|
||||
|
||||
\textbf{Fundstelle:} \file{resume_builder/templates/resume_template.tex:36}. Die fest eingetragene Aussage \emph{12+ years of production software experience} folgt nicht aus der dargestellten Chronologie. Mai 2015 bis September 2026 sind rund elf Jahre und vier Monate verstrichene Zeit; daraus darf ohnehin nicht ungeprüft eine lückenlose Netto-Berufserfahrung berechnet werden.
|
||||
|
||||
\textbf{Empfehlung:} Die Jahreszahl entfernen oder aus bestätigten, nicht doppelt gezählten Zeiträumen ableiten. Auch eine automatisch gesetzte Thesis-Note und unveränderliche Bildungsdetails sollten keine allgemeine Industrievorlage steuern. Die ältere akademische \file{cv_template.tex} enthält weiterhin mehrseitige Zielvorgaben, feste Zeilenbudgets und unaufgelöste Platzhalter-/Asset-Erwartungen. Sie sollte als akademischer Legacy-Pfad klar abgegrenzt oder aktualisiert werden. Ein europäischer beruflicher CV ist nicht automatisch ein akademischer Lang-CV.
|
||||
|
||||
\finding{F10 / P2}{Die US-GPA-Umrechnung ist kein universeller Karrierefakt}
|
||||
|
||||
\textbf{Fundstelle:} \file{resume_builder/canonical/claims.json}, Bildungsangaben mit \emph{US = 5 -- G}. Die daraus resultierenden GPA-Werte setzen ein bestimmtes Zielnotensystem voraus. Die angeführte modifizierte bayerische Formel wird beispielsweise von der TUM für die Umrechnung ausländischer Noten in das deutsche System erläutert; auch dort ist der Rechner nur eine Orientierung. Daraus folgt keine allgemein akzeptierte inverse US-Umrechnung.\source{Technische Universität München: Bayerische Formel}{Q16}
|
||||
|
||||
\textbf{Empfehlung:} Bestätigte deutsche Originalnoten mit Skalenkontext verwenden. Nur wenn ein konkreter Empfänger eine Umrechnung verlangt, dessen Methode dokumentieren. Keine pauschale US-GPA als gleichrangigen kanonischen Abschlussfakt führen. Für die primären europäischen Zielmärkte bringt diese Umrechnung ohnehin wenig.
|
||||
|
||||
\section{Job-Scout: Fehler mit Einfluss auf die Stellenauswahl}
|
||||
|
||||
\finding{F11 / P1}{Titel-Deduplizierung entfernt verschiedene Requisitionen}
|
||||
|
||||
\textbf{Fundstelle:} \file{job_scout/scout.py:2168}, innerhalb \file{_process_company}. Pro Unternehmen wird auf dem normalisierten Titel vor dem ersten senkrechten Strich dedupliziert. Zwei verschiedene Requisitionen namens Senior Data Engineer in Bern und Zürich ergaben in der Gegenprobe nur einen Treffer. Auch unterschiedliche Teams mit demselben Titel sind betroffen.
|
||||
|
||||
Der Wunsch, mehrfach veröffentlichte Remote-Standorte zusammenzuführen, ist sinnvoll. Der Titel beweist aber keine Identität. \textbf{Lösung:} Arbeitgeber plus stabile Requisitions-ID als Primärschlüssel; mehrere Standorte nur bei derselben Requisition zusammenführen. Titelähnlichkeit darf einen Hinweis auf mögliche Duplikate erzeugen, keine irreversible Entfernung.
|
||||
|
||||
\finding{F12 / P1}{Ortsfilter verlieren Schweizer Stellen und erkennen falsche Remote-Eignung}
|
||||
|
||||
\textbf{Fundstelle:} \file{job_scout/scout.py:1728}, \file{location_eligibility}, sowie Adapter-Normalisierung.
|
||||
|
||||
Die isolierte Filterfunktion akzeptiert Bern, lehnt aber unter anderem Thun, Zimmerwald, Baar und Olten ohne Länderzusatz ab. Bernau in Deutschland wird wegen des Teilstrings Bern akzeptiert. Texte mit Europe können als Remote eingeordnet werden, obwohl London/Onsite oder eine Beschränkung auf Deutschland danebensteht. Aarhus und Odense werden ebenfalls nicht wie Kopenhagen erkannt.
|
||||
|
||||
Nicht jeder Adapter ist gleich betroffen: Manche ergänzen das Land. Ein konkreter Mock des SmartRecruiters-Pfads zeigt jedoch, dass \file{city=Baar, country=CH} auf den String Baar reduziert und danach verworfen wird. Damit ist das Problem mehr als eine abstrakte Schwäche des Ortsvokabulars.
|
||||
|
||||
\textbf{Lösung:} Länderkennung, Ort, Arbeitsmodell, erlaubte Beschäftigungsländer und Umzugspflicht als getrennte Felder erhalten. Unbekanntes Arbeitsmodell bleibt unbekannt. Europa-Remote allein belegt keine Anstellungsmöglichkeit in der Schweiz. Norwegen ist derzeit nur über ausgewählte Unternehmens-Overrides abgedeckt; die gewollten Ausnahmen sollten als explizite Suchpräferenz gepflegt werden.
|
||||
|
||||
\finding{F13 / P2}{Entscheidungs-IDs und Wiedererkennung sind nicht einheitlich}
|
||||
|
||||
\textbf{Fundstelle:} \file{job_scout/scout.py:1873}, \file{_decision_key}, sowie RUAG-Fallback und Report-Index.
|
||||
|
||||
Der generische Fallback verliert Query-Parameter: Zwei URLs \file{/vacancy?job=1} und \file{/vacancy?job=2} ergeben denselben Schlüssel. Bei gemeinsam genutzten ATS-Hosts fehlt teilweise der Arbeitgeber im Namensraum; eine Kollision wäre möglich, falls IDs nicht global eindeutig sind. Das ist ein strukturelles Risiko, kein Nachweis einer bereits eingetretenen SmartRecruiters-Kollision.
|
||||
|
||||
Für RUAG erkennt die interaktive Entscheidungssuche in der Gegenprobe einen bekannten Slug mit neuer UUID wieder; der Report-Lookup findet die alte Entscheidung nicht. \textbf{Lösung:} Ein gemeinsamer Identitätsresolver für Schreiben und Lesen. Neue Requisitionen mit ähnlichem Slug als verwandt markieren; nicht automatisch alte Ablehnungen übertragen, da eine Neuausschreibung sachlich anders sein kann.
|
||||
|
||||
\finding{F14 / P1}{Der Scout nennt Keyword-Interesse fälschlich Fit}
|
||||
|
||||
\textbf{Fundstelle:} \file{job_scout/scout.py:1790}, \file{score_job}, und Report-Kategorien.
|
||||
|
||||
Im Titeltest erreicht Senior Data Engineer drei Punkte, Senior AI Engineer mit Generative AI, LLM und RAG dagegen zwölf. Senior Dateningenieur erreicht nur einen Punkt. Das entspricht weder automatisch Dennis' stärkster Evidenz noch einer belastbaren Eignungsbewertung. Bei vorgefilterten Boards wird teilweise nur der Titel gewertet; harte Anforderungen im JD können so unberücksichtigt bleiben.
|
||||
|
||||
\textbf{Lösung:} Den Wert ehrlich als Suchrelevanz kennzeichnen. Anschliessend separate Signale für Evidenz, zwingende Anforderungen, Sprache, Standort, Niveau und praktische Attraktivität berechnen beziehungsweise als unbekannt markieren. Deutsche Berufsbezeichnungen ergänzen. Die verbindliche Fit-Prüfung bleibt am vollständigen JD; ein höheres Keyword-Ergebnis darf keine bevorzugte Bewerbung suggerieren.
|
||||
|
||||
\finding{F15 / P2}{Datums- und Kontaktinformationen verlieren ihre Bedeutung}
|
||||
|
||||
\textbf{Fundstellen:} Taleo-Parser ab \file{job_scout/scout.py:1110}, Datumsparser und Ergebnisobjekt in \file{_process_company}.
|
||||
|
||||
Der Taleo-Parser schreibt in der Gegenprobe eine Bewerbungsfrist vom 30. September in \file{posted}. Dadurch kann eine Stelle fälschlich als besonders frisch erscheinen. Andere Adapter liefern relative Daten oder Aktualisierungszeitpunkte, die nicht einheitlich mit Veröffentlichungsdaten vergleichbar sind.
|
||||
|
||||
Der Prospective-Pfad liest nützliche Angaben wie Einheit, Lohnklasse und Ansprechpartner in die Beschreibung ein. Der finale Ergebnisdatensatz verwirft die Beschreibung und führt diese Angaben nicht strukturiert fort. Damit gehen genau die Informationen verloren, die für Niveau, Gehalt und den Kontaktansatz wichtig sind.
|
||||
|
||||
\textbf{Lösung:} \file{published_at}, \file{updated_at}, \file{deadline} und \file{first_seen_at} trennen, inklusive Rohwert und Herkunft. Ansprechpartner, Vergütungshinweis und Organisationseinheit als eigene Felder führen; JD-Inhalt oder einen stabilen lokalen Verweis mitsamt Abrufdatum erhalten.
|
||||
|
||||
\finding{F16 / P2}{Report- und Zustandswrites können Informationen verlieren}
|
||||
|
||||
\textbf{Fundstellen:} \file{job_scout/scout.py:2202--2340}, Speicherroutinen und breite Exception-Behandlung in Adaptern.
|
||||
|
||||
Alle Läufe desselben Tages schreiben auf denselben Markdown-/JSON-Namen. Ein eingeschränkter Lauf mit \file{--only} oder \file{--new-only} kann damit den vollständigen Tagesreport überschreiben. Gesehen-Markierungen werden gespeichert, bevor der Report erfolgreich geschrieben ist. Bei einem Schreibfehler kann ein Wiederholungslauf mit New-only deshalb gerade die noch nicht ausgelieferten Treffer ausblenden.
|
||||
|
||||
Ein fester temporärer Dateiname bei atomaren Writes verhindert keine konkurrierenden Schreibkonflikte. Breite \file{except Exception: continue}-Blöcke können einzelne kaputte Karten stillschweigend auslassen; Pagination-Limits und vollständige Abdeckung sind nicht überall erkennbar.
|
||||
|
||||
\textbf{Lösung:} Eindeutige Run-ID mit Suchumfang, unveränderliche Reports und erst nach erfolgreicher Report-Erstellung committed Seen-State. Konkurrenzschutz oder bewusst nur ein schreibender Prozess. Pro Adapter Mengen, Abbruchgrund und Vollständigkeitsstatus ausgeben. Die rund 2.400 Zeilen Scout-Code nach Adapter, Normalisierung, Matching und Persistenz aufzuteilen wäre anschliessend sinnvoll; ein grosses neues Framework ist dafür unnötig.
|
||||
|
||||
\section{Builds, historische Pakete und sichtbarer Output}
|
||||
|
||||
\finding{F17 / P2}{Nicht alle Pakete sind aus den vorhandenen Quellen reproduzierbar}
|
||||
|
||||
\begin{itemize}
|
||||
\item \file{output/NATO_AI_ENGINEER/e2e_nato_ai_engineer_resume.tex}: Build scheitert wegen fehlender \file{resume.cls}. Ein vorhandenes PDF verdeckt die unvollständige Quelldistribution.
|
||||
\item \file{output/Infineon_AI_Engineer/e2e_infineon_ai_engineer_cover_letter.tex}: Im geprüften pdfLaTeX-Setup Fehler bei der Schriftexpansion, weil eine verwendete Schrift nicht skalierbar ist.
|
||||
\item Microsoft-ISE-Resume: Overfull-Box von rund 25,3 pt; Isovalent-Resume: kleine Overfull-Box von rund 0,88 pt. Die vier aktuellen Stichproben bauten ohne solche Boxen.
|
||||
\end{itemize}
|
||||
|
||||
Historische Klassenkopien sind nicht automatisch schädliche Duplikate: Sie können den damaligen Build einfrieren. Sie sollten über eine Version oder einen Hash nachvollziehbar sein. Beim NATO-Paket einfach die neueste Klasse hineinzukopieren wäre keine sichere Reparatur, weil alte Makros abweichen können.
|
||||
|
||||
Mehrere PDF-Kopien unterscheiden sich binär. Bei Kdo Cy ist der extrahierte Text dennoch identisch; das ist kein belegter Inhaltsfehler. Beim NATO-Resume unterscheiden sich dagegen die Skills und die enthaltenen Stationen zwischen E2E- und Abgabe-PDF. Es fehlt ein eindeutig maschinenlesbarer Verweis, welche Quelle die tatsächlich eingereichte Fassung erzeugt hat. Keine dieser historischen Fassungen sollte stillschweigend ersetzt werden.
|
||||
|
||||
\textbf{Empfehlung:} Pro Abgabe ein Manifest mit Requisition, Dokumenttyp, Quellen-/Klassenhash, festem Datum, finalem Dateinamen und Status. \file{\today} in historischen Anschreiben macht den erneuten Build datumsabhängig und sollte bei neuen Paketen durch das explizite Bewerbungsdatum ersetzt werden. Das Wiederverwendungsregister klassifiziert 14 Pakete, während 21 Bewerbungsordner vorhanden sind; unbekannte Pakete benötigen einen klaren Revalidierungsdefault.
|
||||
|
||||
\finding{F18 / P2}{Die erste Seite zeigt zu spät die stärksten Belege}
|
||||
|
||||
Die vier visuell geprüften Lebensläufe sind gut lesbar, technisch ruhig und ohne Überlappungen. Das A4-Format, die Schriftgrösse und die klare Chronologie funktionieren. Die Textausleitung zeigte in diesen PDFs keine Ersatzzeichen und eine nachvollziehbare Reihenfolge. Das ist ein nützlicher technischer Check, aber keine Zertifizierung für jedes ATS.
|
||||
|
||||
\begin{tabularx}{\linewidth}{@{}lrrX@{}}
|
||||
\toprule Paket & Seiten & Beginn Erfahrung & Beobachtung\\\midrule
|
||||
SBB & 2 & 50,6\% & Viel Platz für Profil/Skills; lange Bildungszeile.\\
|
||||
NVIDIA & 2 & 55,4\% & Bosch/Linux-Evidenz erst auf Seite zwei.\\
|
||||
RUAG & 2 & 50,3\% & Bildungsblock bereits besser aufgeteilt.\\
|
||||
Aker BP & 2 & 50,5\% & Starker Skills-Vorlauf vor Berufserfahrung.\\\bottomrule
|
||||
\end{tabularx}
|
||||
|
||||
Die Prozentwerte bezeichnen die vertikale Position der Überschrift zur Berufserfahrung relativ zur Seitenhöhe, nicht ein wissenschaftliches Layoutziel. Sie machen das gemeinsame Problem sichtbar: Der erste konkrete Berufseintrag beginnt erst etwa auf halber Seite. Fünf oder sechs Skills-Kategorien entsprechen durch Umbrüche wesentlich mehr gedruckten Zeilen. Eine Regel für vier bis sechs Quellmakros kontrolliert daher nicht die tatsächliche Dichte.
|
||||
|
||||
\textbf{Empfehlung:} Skills auf die entscheidenden belegten Anforderungen reduzieren und Wiederholungen zu den Experience-Bullets entfernen. Direkt nach dem kurzen Profil entweder die Erfahrung oder einen sehr kompakten Kompetenzblock zeigen. Die Belegreihenfolge innerhalb einer Station nach der Zielrolle priorisieren; die Arbeitgeberchronologie beibehalten. Kein fixes Pixelziel und kein erzwungenes Auffüllen der zweiten Seite.
|
||||
|
||||
\finding{F19 / P2}{Einige Formulierungen und Details schwächen die Wirkung}
|
||||
|
||||
Die langen Bildungszeilen mit Abschluss, Institution und rechtsbündigem Datum erzeugen bei SBB, NVIDIA und Aker BP auffällige Wortabstände beziehungsweise Umbrüche. Die RUAG-Variante mit getrennten Angaben ist ein brauchbares Vorbild. Abschlussnote und Thesis sollten bei erfahrenen Industrieprofilen nur bleiben, wenn sie konkrete Relevanz tragen.
|
||||
|
||||
Bei NVIDIA nimmt die Erklärung fehlender Erfahrung relativ viel Raum im Anschreiben ein. Eine klar benannte, entscheidende Lücke mit anschliessender belastbarer Anschlussfähigkeit wäre meist wirksamer als ein eigener längerer Defizitblock. Ehrlichkeit bleibt verbindlich; sie erfordert keine vorgezogene Selbstabsage. Bei RUAG könnten die echte Verbindung zu Thun und der Offiziershintergrund früher erscheinen. Deutsche Bullets sollten eine konsistente Perspektive erhalten; eine Mischung aus drittpersonalen Verbformen und anderen Stilen wirkt unnötig distanziert.
|
||||
|
||||
Ein enger, evidenztreuer Formulierungsrahmen wäre beispielsweise: \emph{Governed data products within Swisscom's company-wide Data Mesh} statt eines ganzen selbst gebauten Data Mesh. Bei Bosch sollte die konkret bestätigte Bildklassifikation beziehungsweise Integration beschrieben werden, statt die gesamte Waferinspektion als ersetzt darzustellen. Diese Beispiele sind Richtungen für eine spätere Bearbeitung, keine neu validierten Ersatzbullets.
|
||||
|
||||
Die Metadaten zur Wortzahl sind nicht überall reproduzierbar: NVIDIA nennt 279, während eine einfache Whitespace-Zählung des extrahierten Briefkörpers etwa 300 Wörter ergibt; RUAG liegt mit rund 299 nahe an den dokumentierten 295. Unterschiedliche Zählregeln können kleine Abweichungen erklären. Der relevante Befund ist fehlende Zählkonvention, nicht ein Verstoss gegen eine universelle optimale Wortzahl. Beide Briefe passen auf eine gut lesbare Seite.
|
||||
|
||||
\section{Vertiefte Recherche: Was passt zu den Zielmärkten?}
|
||||
|
||||
\subsection{Evidenzstärke und sinnvolle Grenzen}
|
||||
|
||||
Für die Frage nach dem grössten Bewerbungserfolg sind drei Quellenarten zu unterscheiden: Arbeitgebervorgaben zeigen, was ein konkreter Prozess akzeptiert oder verlangt. Nationale Arbeitsmarktstellen und Berufsverbände beschreiben verbreitete Konventionen. Experimente können Wirkungen untersuchen, gelten aber nur eingeschränkt ausserhalb ihrer untersuchten Population.
|
||||
|
||||
Die recherchierten Quellen liefern keine belastbare Rangfolge, mit der eine bestimmte Schrift, eine exakt zweizeilige Zusammenfassung oder ein fester Bullet-Rhythmus Dennis' Interviewwahrscheinlichkeit maximiert. Solche Regeln können gute redaktionelle Hilfen sein; als wissenschaftliches Erfolgsversprechen wären sie überzogen. Der Bericht empfiehlt deshalb einen gut begründeten Standard mit wenigen situativen Varianten.
|
||||
|
||||
\subsection{Schweiz: Das bestehende Grundformat beibehalten}
|
||||
|
||||
SECO/arbeit.swiss empfiehlt einen klaren, umgekehrt chronologischen Lebenslauf und nennt bis zu drei Seiten. Ein Foto ist dort eine mögliche Ergänzung. Das unterstützt einen zweiseitigen CV für das vorliegende Erfahrungsprofil; es begründet weder eine Pflicht zur dritten Seite noch einen starren Einseiter.\source{SECO: Bewerbungstipps}{Q1}
|
||||
|
||||
Für Schweizer Industrie-, Infrastruktur- und öffentliche Arbeitgeber sollten konkrete Verantwortung, Betriebsumfeld, Zusammenarbeit und verständliche Rollenbezeichnungen schnell erkennbar sein. Die tatsächlichen Component-/Application-Owner-Titel sind dabei wertvoll, müssen aber durch den eigenen Umfang erklärt werden. Arbeitsort, wahrheitsgemässe Sprachangaben und vorhandener Aufenthaltsstatus können praktische Einordnung erleichtern. Diese Gewichtung ist eine aus Quellen und Profil abgeleitete Empfehlung, keine allgemeine rechtliche Dokumentpflicht.
|
||||
|
||||
\textbf{Die Arbeitgeberregel hat Vorrang.} SBB erklärt das Motivationsschreiben ausdrücklich für freiwillig und bevorzugt PDFs. Der Lebenslauf soll separat und mit möglichst wenig Grafikelementen hochgeladen werden; weitere Unterlagen können gebündelt werden. Das SBB-Paket ohne Anschreiben war deshalb prozessgerecht.\source{SBB: Bewerbungstipps}{Q2}
|
||||
|
||||
Wo ein Anschreiben sinnvoll ist, empfiehlt die UZH eine Seite mit konkretem Bezug zur Stelle und nachvollziehbarer Motivation, statt den Lebenslauf zu wiederholen. Für Dennis kann das bei einem Branchenwechsel, einem besonderen Bezug zum Arbeitgeber oder einer erklärungsbedürftigen Anschlussfähigkeit echten Nutzen haben.\source{Universität Zürich: Anschreiben}{Q3}
|
||||
|
||||
Bei persönlichen Daten widersprechen sich selbst seriöse Schweizer Ratgeber. Der ETH-Welcome-Center-Leitfaden führt traditionelle Angaben zu Geburtsdatum und Familie auf, bezeichnet das Foto aber als optional; arbeit.swiss formuliert weniger eng. Das sind Konventionsempfehlungen, kein Beweis, dass mehr private Angaben bessere Chancen erzeugen. Die bewusste Präferenz gegen Geburtsdatum, Familienstand und Kinder sollte bestehen bleiben. Ein Foto ist ebenfalls kein notwendiger Standard.\source{ETH Zürich: How to apply for a job}{Q4}
|
||||
|
||||
Für international rekrutierende Tech-Unternehmen in der Schweiz bleibt das International-Tech-Profil passend: belegte technische Beiträge, klare Ergebnisse, wenig administrative Zusatzinformation. Die Sprache sollte sich nach Ausschreibung, Team und ausdrücklicher Vorgabe richten. Das englische SBB-Dokument war eine bewusste Entscheidung und wird deshalb nicht allein wegen des deutschen JDs als Fehler bewertet.
|
||||
|
||||
\subsection{Dänemark: Kurzprofil und Motivation systematisch mitdenken}
|
||||
|
||||
Workindenmark empfiehlt ein zugeschnittenes persönliches Profil von etwa vier bis acht Zeilen mit den wichtigsten Kompetenzen. Für internationale Bewerbende kann die Motivation für Dänemark relevant sein. Eine globale Zwei-bis-drei-Zeilen-Regel sollte deshalb kein hartes Hindernis sein.\source{Workindenmark: A Good Personal Profile Counts, aktualisiert 25.03.2026}{Q5}
|
||||
|
||||
Die gleiche staatliche Plattform rät dazu, unbekannte Arbeitgeber und die tatsächliche Funktion verständlich einzuordnen und Verantwortung, Zusammenarbeit sowie Ergebnisse zu beschreiben. Das passt gut zu Dennis' Laufbahn: Schweizer Unternehmensnamen und interne Owner-Titel erklären sich im Ausland nicht von selbst. Ein knapper Kontextsatz ist oft wertvoller als zusätzliche Technologiebegriffe.\source{Workindenmark: Work Experience, aktualisiert 12.03.2026}{Q6}
|
||||
|
||||
Das Anschreiben wird dort als häufig ebenso wichtig wie der CV beschrieben: höchstens eine Seite, individuell, mit Motivation und Beispielen fachlicher und sozialer Kompetenz. Für eine dänische Bewerbung sollte deshalb der Standard lauten: den erwarteten Bewerbungsumfang prüfen und ein spezifisches Schreiben ernsthaft einplanen. Die bestehende globale Tendenz zum Weglassen eines optionalen Briefs ist hier zu grob. Eine ausdrückliche Arbeitgebervorgabe gegen Anschreiben übersteuert diesen Standard.\source{Workindenmark: Your Cover Letter, aktualisiert 12.03.2026}{Q7}
|
||||
|
||||
Der Ingenieurverband IDA empfiehlt in seinem aktuellen Ratgeber gewöhnlich ein bis zwei Seiten und ein klares, angepasstes Kompetenzprofil. Das stützt zwei Seiten als brauchbaren Ausgangspunkt für diese technische Laufbahn.\source{IDA: How to make a good CV}{Q8}
|
||||
|
||||
Workindenmark beschreibt persönliche Informationen und Interessen als üblich. Daraus folgt keine Notwendigkeit, die persönliche Datenschutzpräferenz aufzugeben. Falls zutreffend, können eine konkrete Dänemark-Motivation, reale Sprachlernbemühungen oder relevante Interessen die persönliche Anschlussfähigkeit zeigen, ohne Familienangaben einzuführen. Relocation-Bereitschaft darf nur genannt werden, wenn sie tatsächlich besteht.\source{Workindenmark: Personal Details in Your CV, aktualisiert 12.03.2026}{Q9}
|
||||
|
||||
\subsection{Norwegen: Fachliches Profil und spezifische Bewerbung}
|
||||
|
||||
NAV empfiehlt eine übersichtliche Berufschronologie, genaue Tätigkeits- und Zeitangaben und verständliche Sprachkenntnisse. Die aktuelle Darstellung ist damit grundsätzlich vereinbar. Referenzen können auf Anfrage verfügbar sein; Namen sollten nicht ohne vorherige Abstimmung veröffentlicht werden.\source{NAV/Arbeidsplassen: Slik skriver du en god CV}{Q10}
|
||||
|
||||
Für technische Profile ist Tekna besonders einschlägig. Der Verband empfiehlt ein zugeschnittenes Kompetenzprofil von ungefähr vier bis sechs Zeilen, konkrete Verantwortung und Ergebnisse, umgekehrte Chronologie und im Regelfall maximal zwei Seiten. Foto ist eine persönliche Entscheidung; weniger relevante ältere Erfahrung darf zusammengefasst werden. Das spricht für eine kleine Norwegen-Variante des bestehenden CVs, nicht für ein völlig neues Design.\source{Tekna: How to write a good CV}{Q11}
|
||||
|
||||
NAV beschreibt das Bewerbungsschreiben als kurze, spezifische Begründung mit passenden Beispielen, vorzugsweise innerhalb einer Seite. Auch hier ist ein pauschaler internationaler Skip-Default zu wenig differenziert. Ein Anruf ist sinnvoll, wenn echte offene Fragen bestehen; Fragen, die schon in der Anzeige beantwortet sind, rechtfertigen ihn nicht.\source{NAV/Arbeidsplassen: Tips til jobbsøknaden}{Q12}
|
||||
|
||||
Für Aker BP, Equinor oder NATO sollten tatsächliche Motivation, Arbeitssprache und Standortmodell jeweils separat geprüft werden. Eine internationale Organisation in Norwegen kann ein eigenes Bewerbungsformat haben. Norwegische Marktgewohnheiten ersetzen dann nicht deren Portalvorgaben. Ungeklärte Umzugsbereitschaft ist eine offene praktische Frage, kein automatisch vorhandener Vorteil.
|
||||
|
||||
\subsection{Empfohlene Profilmatrix}
|
||||
|
||||
\begin{tabularx}{\linewidth}{@{}>{\raggedright\arraybackslash}p{.22\linewidth}>{\raggedright\arraybackslash}X>{\raggedright\arraybackslash}X@{}}
|
||||
\toprule Kontext & Standard & Bewusste Abweichung\\\midrule
|
||||
Schweiz, internationaler Tech-Arbeitgeber & Zwei Seiten, belegte technische Ergebnisse, kompakte Skills, Englisch sofern passend. & Brief nur bei Anforderung oder konkretem Mehrwert.\\
|
||||
Schweiz, lokale Industrie und Infrastruktur & Zwei Seiten, verständliche Verantwortung, Sprachen und praktische Einordnung. & Dossier und Brief nach Arbeitgeber; dritte Seite nur bei relevantem Bedarf.\\
|
||||
Dänemark & Zwei Seiten, stärkeres persönliches Fachprofil, Arbeitgeberkontext und Zusammenarbeit. & Individuellen Brief und Landesmotivation prüfen; Arbeitgeberausnahmen beachten.\\
|
||||
Norwegen & Zwei Seiten, klare Schlüsselqualifikationen, Aufgaben und belegte Ergebnisse. & Kurzes spezifisches Schreiben; internationaler Arbeitgeber kann eigene Regeln haben.\\
|
||||
Akademische Bewerbung & Separater akademischer CV-Prozess. & Publikationen und Lehre nach Anforderung, keine Industrie-Seitenregel erzwingen.\\\bottomrule
|
||||
\end{tabularx}
|
||||
|
||||
\subsection{ATS: Textstruktur und Portalprüfung sind wichtiger als Mythen}
|
||||
|
||||
Greenhouse nennt komplexe Tabellen, Spalten, Grafiken und Informationen in Kopf-/Fusszeilen als mögliche Ursachen unvollständiger Verarbeitung. Der Anbieter nennt ausserdem eine Grenze von 2,5 MB für das Parsing. Ein Parsingfehler bedeutet laut Dokumentation nicht automatisch Ablehnung: Das Dokument kann angehängt bleiben und Daten müssen manuell korrigiert werden.\source{Greenhouse: Unsuccessful resume parse, aktualisiert 02.03.2026}{Q13}
|
||||
|
||||
Die aktuellen einspaltigen, textbasierten PDFs sind daher ein vernünftiger Standard. Eine LaTeX-Kontaktzeile im normalen Dokumentkörper ist dabei nicht mit einer Word-Kopfzeile gleichzusetzen. Die vorhandene Schrift ist kein nachgewiesenes ATS-Problem. Ein Wechsel zu einer anderen Schrift allein verspricht keinen belegten Vorteil.
|
||||
|
||||
Microsoft verlangt ausdrücklich, die aus dem CV übernommenen Profilinformationen zu prüfen und gegebenenfalls zu korrigieren. Eine kurze Kontrolle der Portal-Felder vor der Abgabe ist deshalb konkreter und verlässlicher als ein selbst vergebener ATS-Score.\source{Microsoft Careers: Hiring FAQs}{Q14}
|
||||
|
||||
\textbf{Empfohlene QA:} sichtbaren PDF-Text kopieren, Reihenfolge und Sonderzeichen prüfen, Kontaktinformationen und Datumszuordnung kontrollieren, Links testen und im tatsächlichen Portal die extrahierten Felder ansehen. DOCX nur dann zusätzlich erzeugen, wenn ein Arbeitgeber es verlangt oder das konkrete Portal mit dem PDF Probleme hat. Keywords müssen aus belegten Tätigkeiten stammen; unbekannte Technologien werden durch Aufnahme in eine Skills-Liste nicht zu Erfahrung.
|
||||
|
||||
\section{Was tatsächlich mehr Erfolg verspricht}
|
||||
|
||||
\subsection{Formulierungsqualität hilft; feste Stilrezepte sind nicht belegt}
|
||||
|
||||
Eine grosse randomisierte Studie von Wiles, Munyikwa und Horton untersuchte algorithmische Schreibunterstützung bei knapp 500.000 Neueintritten auf einem Online-Arbeitsmarkt. Die unterstützte Gruppe wurde relativ rund acht Prozent häufiger eingestellt; die Arbeitgeberzufriedenheit sank nicht. Das ist relevante Evidenz dafür, dass verständlichere Darstellung die Erkennung vorhandener Fähigkeiten verbessern kann. Es ist keine Prognose von acht Prozentpunkten mehr Erfolg für einen Schweizer Staff Engineer und kein Test eines bestimmten CV-Layouts.\source{Wiles, Munyikwa und Horton: Algorithmic Writing Assistance on Jobseekers' Resumes Increases Hires; NBER 30886, später Management Science 2025}{Q15}
|
||||
|
||||
Für die Formulierung folgt daraus als redaktionelle Empfehlung: klare Handlung, eigenes Objekt beziehungsweise eigener Umfang, technischer oder organisatorischer Kontext und ein bestätigtes Ergebnis. Nicht jeder Bullet braucht jede Komponente oder eine Zahl. Ein glaubwürdiges qualitatives Ergebnis ist besser als eine erfundene Prozentzahl. Zusammenarbeit und begrenzte Verantwortung können gerade im Grossunternehmen Kompetenz zeigen.
|
||||
|
||||
Bei einem Staff-Profil sollten vorhandene Belege für Entscheidungen, Standards, Abstimmung über Schnittstellen und dauerhafte Verantwortung sichtbarer werden. Der aktuelle Technologieumfang allein erklärt den Staff-Mehrwert nicht immer. Fehlende Nachweise hierfür sollten gezielt erhoben werden; sie dürfen nicht aus dem Titel hergeleitet werden.
|
||||
|
||||
\subsection{Kontaktstrategie: sinnvoll, aber keine Erfolgsgarantie}
|
||||
|
||||
Randomisierte LinkedIn-Experimente zu schwächeren beruflichen Verbindungen liefern Evidenz, dass Netzwerkstruktur berufliche Mobilität beeinflussen kann. Sie testen jedoch Empfehlungen neuer Verbindungen, nicht die Behauptung, ein Anruf bei jeder veröffentlichten Kontaktperson sei zwingend besser als eine direkte Bewerbung.\source{MIT-Bericht zur Science-Studie von Rajkumar et al., veröffentlicht 15.09.2022}{Q17}
|
||||
|
||||
Die neue projektinterne Kontaktpriorität ist als Arbeitsstrategie nachvollziehbar: Offene Fragen zu Lohnklasse, Scope, Präsenz und Team können früh geklärt werden. Ein kurzer Kaltanruf ist aber noch keine Empfehlung und macht den Kanal nicht automatisch stark. Als Verbesserungsvorschlag sollten Kontaktversuch, tatsächliches Gespräch, hilfreiche Information und echte Empfehlung getrennt erfasst werden. Vergebliche Kontaktversuche sollten eine passende Bewerbung kurz vor Fristende nicht unbegrenzt blockieren; eine solche Ausnahme wäre eine ausdrücklich zu beschliessende Strategieänderung, keine bereits umgesetzte Regel.
|
||||
|
||||
Die eigene Kohorte erlaubt noch keine belastbaren kausalen Aussagen: sieben erfasste Bewerbungen, durchgehend schwacher Kanal, unterschiedliche Rollen und teilweise noch offene Ergebnisse. SBB erreichte ein Interview und endete später durch Rückzug. Diese Beobachtung darf weder als Beweis für optimale Dokumente noch als Beweis gegen Kontaktaufnahme gelten. Der Rückzug ist zudem eine andere Ergebnisart als eine Arbeitgeberabsage.
|
||||
|
||||
\subsection{Fit, praktische Attraktivität und Ungewissheit auseinanderhalten}
|
||||
|
||||
Die getrennte Betrachtung von Evidence Fit, Document Quality und Channel Strength ist ein klarer Fortschritt und sollte bleiben. Die Zahlen sind aber interne Rubrikergebnisse, keine kalibrierten Einstellungswahrscheinlichkeiten. Unterschiede wie 92 versus 93 sind ohne nachvollziehbare Einzelbewertung und stabile Rubrik kaum entscheidungsrelevant.
|
||||
|
||||
Zusätzlich sollten bekannte Ausschlussgründe, ungeklärte Bedingungen und Präferenzen getrennt werden. Ein bestätigtes zwingendes Kriterium ohne passende Evidenz bleibt ein echtes Gate. Eine noch unbekannte Lohnklasse oder Präsenzregel ist zunächst eine zu klärende Frage. Ein formaler Titel unter Staff kann je nach tatsächlichem Scope unterschiedlich attraktiv sein; weder automatisch verwerfen noch schönrechnen.
|
||||
|
||||
Der stärkste operative Hebel ist wahrscheinlich, vor viel Dokumentarbeit die tatsächliche Passung bei Verantwortung, Vergütung, Arbeitsort und zwingenden Anforderungen zu klären. Das ist eine aus dem Projektverlauf abgeleitete Einschätzung, kein experimentell gemessener Effekt. Die bislang dokumentierten Absagen erlauben insbesondere keine sichere Zuschreibung an Schriftart, ATS oder einzelne fehlende Keywords.
|
||||
|
||||
\section{Umsetzungsreihenfolge und Abnahmekriterien}
|
||||
|
||||
\textbf{Zuerst die Verlässlichkeit reparieren.} Vor einer grossen optischen Überarbeitung sollten die folgenden kleinen, klar abgrenzbaren Änderungen erfolgen:
|
||||
|
||||
\begin{enumerate}
|
||||
\item \textbf{Regel- und Statusbereinigung:} gemeinsame Skill-Referenzen, aktuelle Session-Ansicht, keine operative Zehn-Bewerbungen-Sperre. Abnahme: beide Agenteneinstiege laden dieselbe Prozessversion; eine elfte Bewerbung lässt sich ohne Quote erfassen.
|
||||
\item \textbf{Konkrete Evidenzlecks schliessen:} 12+-Jahre-Text entfernen, Capgemini-Ausschluss konsistent machen, PyTorch-Kontext sichern, Zero-Downtime-/Inspektionsvarianten prüfen, BS-6 in Auswahlpfade aufnehmen. Abnahme: jede aktive Variante verweist auf ihren gültigen Claim; historische Abgaben bleiben erhalten.
|
||||
\item \textbf{Negative Validator-Tests ergänzen:} falsche Identität, erfundene Metrik, Zertifikatskontext, Kommentare, Verneinungen, LaTeX-Auszeichnung und ungültige Datumswerte. Abnahme: eindeutige Fehler werden erkannt, erlaubte Gegenbeispiele nicht blockiert; semantisch offene Punkte erscheinen gesondert.
|
||||
\item \textbf{Scout-Verluste verhindern:} Requisitions-ID statt Titel, Länderfelder erhalten, Remote-Ungewissheit respektieren, Datumsarten trennen. Abnahme: beide gleichnamigen Teststellen bleiben sichtbar; Baar/CH bleibt zulässig, Bernau/DE wird nicht als Schweiz erkannt.
|
||||
\item \textbf{Dokumentgewichtung verbessern:} Skills kürzen, Berufserfahrung früher zeigen, Bildungszeilen sauber trennen, Länderprofil wählen. Abnahme: gerenderte Sichtprüfung und Textausleitung; keine neue Behauptung nur zur schöneren Seitengestaltung.
|
||||
\end{enumerate}
|
||||
|
||||
\textbf{Danach die strukturellen Verbesserungen:} ein kleines Claim-/Dokumentschema, Bewerbung als Zustand plus Ereignisse, reproduzierbare Abgabemanifeste, robuste Scout-Persistenz und gezielte Adaptertests. Ein leichter automatisierter Check sollte mindestens die vorhandenen Tests, Schemas, Referenzintegrität und einen Build der gepflegten professionellen Templates ausführen. Die dafür benötigte Python-/TeX-Umgebung gehört dokumentiert.
|
||||
|
||||
\textbf{Erst danach breiter optimieren:} zusätzliche belegte Auswirkungen und Staff-Verantwortung sammeln, die Länderprofile verfeinern und den Bewerbungstrichter nach Ergebnisarten auswerten. Dabei nicht auf eine neue Quote oder auf immer mehr eigene Scores ausweichen. Eine kleine Anzahl überprüfbarer Regeln ist nützlicher als viele überlappende Dokumente mit Ausnahmen.
|
||||
|
||||
\textbf{Bewusst beibehalten:} Genauigkeit vor Wirkung; keine erfundenen Kennzahlen; keine Skills aus reiner Keyword-Nachfrage; kanonische Eigentumsgrenzen; zwei gut lesbare Seiten als Standard; konditionales Anschreiben mit Länder-/Arbeitgeberkontext; keine automatischen privaten Zusatzangaben; unveränderte Archive bereits versandter Bewerbungen.
|
||||
|
||||
\section{Reproduktionshinweise und Quellen}
|
||||
|
||||
Die Prüfarbeitsdateien liegen unter \file{tmp/project_review/}. \file{probe.py} enthält die isolierten Gegenproben; \file{probe_results.json} deren Resultate. \file{supplement.py} und \file{supplement_results.json} enthalten zusätzliche Adapter- und PDF-Prüfungen. \file{build_review.py}, \file{build_results.json} und \file{copy_comparisons.json} dokumentieren die isolierten Builds und Kopienvergleiche. Diese temporären Dateien gehören nicht zum Bewerbungsoutput und sind kein neuer kanonischer Evidenzbestand.
|
||||
|
||||
Der technische Review belegt die beschriebenen lokalen Gegenbeispiele. Er ersetzt weder einen vollständigen Live-Test aller Jobportale noch eine erneute Quellenprüfung jedes historischen Resume-Satzes. Die Recherche priorisierte Behörden, Arbeitgeber, Berufsverbände, Hochschulen und Originalforschung. Undatierte Ratgeber werden als aktuelle abrufbare Empfehlungen behandelt, nicht als neu publizierte Studien. Nicht zugängliche oder inzwischen leere Stellenseiten wurden nicht als tragende Evidenz verwendet.
|
||||
|
||||
\small
|
||||
\begin{enumerate}[label=Q\arabic*.,leftmargin=2.7em,itemsep=6pt]
|
||||
\item SECO / arbeit.swiss. \emph{Bewerbungstipps}. Schweizer Arbeitsmarktverwaltung; Konventionen und Dossieraufbau. \url{https://www.arbeit.swiss/de/stellensuchende/bewerbungstipps}
|
||||
\item SBB. \emph{Bewerbungstipps}. Direkte Arbeitgebervorgaben, einschliesslich freiwilligem Motivationsschreiben und Upload-Struktur. \url{https://company.sbb.ch/de/jobs-karriere/jobs/bewerbungstipps.html}
|
||||
\item Universität Zürich, Career Services. \emph{Anschreiben}. Hochschulberatung; Inhalt, Umfang und Nutzen. \url{https://www.careerservices.uzh.ch/de/ratgeber/bewerbung/bewerbungsdossier/Anschreiben.html}
|
||||
\item ETH Zürich, Welcome Center. \emph{How to apply for a job}. Undatierte, teilweise traditionelle Dossierempfehlungen; im Bericht als widersprechende Konvention eingeordnet. \url{https://ethz.ch/en/the-eth-zurich/working-teaching-and-research/welcome-center/job-search-and-application/how-to-apply-for-a-job.html}
|
||||
\item Workindenmark. \emph{A Good Personal Profile Counts}. Aktualisiert 25.03.2026. \url{https://www.workindenmark.dk/job-search-in-denmark/your-cv/a-good-personal-profile-counts}
|
||||
\item Workindenmark. \emph{Work Experience}. Aktualisiert 12.03.2026. \url{https://www.workindenmark.dk/job-search-in-denmark/your-cv/work-experience}
|
||||
\item Workindenmark. \emph{Your Cover Letter}. Aktualisiert 12.03.2026. \url{https://www.workindenmark.dk/job-search-in-denmark/your-cover-letter}
|
||||
\item IDA. \emph{How to make a good CV}. Dänischer Ingenieurverband; berufsspezifische Beratung, keine kausale Wirkungsstudie. \url{https://ida.dk/en/career-and-legal-advice/job-search/how-to-make-a-good-cv}
|
||||
\item Workindenmark. \emph{Personal Details in Your CV}. Aktualisiert 12.03.2026. \url{https://www.workindenmark.dk/job-search-in-denmark/your-cv/personal-details-in-your-cv}
|
||||
\item NAV / Arbeidsplassen. \emph{Slik skriver du en god CV}. Norwegische Arbeitsmarktverwaltung. \url{https://arbeidsplassen.nav.no/slik-skriver-du-en-god-cv}
|
||||
\item Tekna. \emph{How to write a good CV}. Norwegischer technisch-wissenschaftlicher Berufsverband. \url{https://www.tekna.no/en/career/cv-and-cover-letter/how-to-write-a-good-cv/}
|
||||
\item NAV / Arbeidsplassen. \emph{Tips til jobbsøknaden}. Hinweise zu Schreiben und sinnvoller Kontaktaufnahme. \url{https://arbeidsplassen.nav.no/tips-til-jobbsoknaden}
|
||||
\item Greenhouse Support. \emph{Unsuccessful resume parse}. Aktualisiert 02.03.2026. Technische Herstellerdokumentation; nicht stellvertretend für alle ATS. \url{https://support.greenhouse.io/hc/en-us/articles/200989175-Unsuccessful-resume-parse}
|
||||
\item Microsoft Careers. \emph{Hiring FAQs}. Direkte Information zur Prüfung und Korrektur extrahierter Bewerberdaten. \url{https://careers.microsoft.com/v2/global/en/hiringfaqs.html}
|
||||
\item Wiles, Emma; Munyikwa, Zanele; Horton, John J. \emph{Algorithmic Writing Assistance on Jobseekers' Resumes Increases Hires}. NBER Working Paper 30886 (2023, Revision Oktober 2023); veröffentlichte Fassung Management Science 71(12), 2025, S. 10144--10164. \url{https://www.nber.org/papers/w30886}
|
||||
\item Technische Universität München. \emph{Bayerische Formel}. Zweck, Eingangsparameter und nicht verbindlicher Rechner. \url{https://www.tum.de/studium/bewerbung/infoportal-bewerbung/bayerische-formel}
|
||||
\item MIT News, Peter Dizikes. \emph{A causal test of the strength of weak ties}. 15.09.2022; institutioneller Bericht zur randomisierten LinkedIn-Studie von Rajkumar et al. in Science, DOI 10.1126/science.abl4476. \url{https://news.mit.edu/2022/weak-ties-linkedin-employment-0915}
|
||||
\end{enumerate}
|
||||
\end{document}
|
||||
@@ -0,0 +1,65 @@
|
||||
View Job Posting Details
|
||||
|
||||
08:40
|
||||
15.09.2026 Page 1 of 3
|
||||
|
||||
Data Engineer - Geo Platform
|
||||
Data Engineer - Geo Platform
|
||||
Your future starts here
|
||||
Du arbeitest im Geo‑Umfeld mit Karten, Geodaten und standortbezogenen Informationen und integrierst neue Quellen in unsere Cloud‑Architektur. Als Bindeglied zwischen Fachbereichen und Datenliefernden entwickelst und betreust du robuste Datenprodukte sowie Geo‑Services für Analysen und Anwendungen. Du automatisierst Datenverarbeitung und Migrationen mit Python und stellst die zuverlässige, skalierbare Bereitstellung sicher. Gemeinsam betreiben wir die Swisscom Geo Platform mit Monitoring, Security und Deployments über mehrere Umgebungen.
|
||||
• Betrieb und Weiterentwicklung der Swisscom Geo Platform • Entwicklung und Betrieb von Geo‑Datenpipelines für Integration und Transformation • Automatisierung von Datenprozessen und Migrationen mit Python • Bereitstellung von Karten‑ und Geodatendiensten für diverse Nutzergruppen • Monitoring, Fehleranalyse und kontinuierliche Verbesserung in Zusammenarbeit mit
|
||||
Stakeholdern
|
||||
Deine Skills
|
||||
• Abschluss (ETH/Uni/FH) in Informatik, Geomatik oder Wirtschaftsinformatik oder gleichwertiger Abschluss
|
||||
• Mehrjährige Erfahrung im Data Engineering mit Fokus auf Datenpipelines und relationalen Datenmodellen
|
||||
• Fundierte Praxis mit ArcGIS und FME in der Umsetzung und im Betrieb von Geo‑Workflows
|
||||
• Sichere Entwicklung mit Python sowie Erfahrung in Automatisierung und Scripting • Strukturiert, eigenverantwortlich und zuverlässig, du dokumentierst Lösungen und
|
||||
verantwortest deine Themen • Kommunikativ, du erklärst Technik verständlich und pflegst den Austausch mit
|
||||
Anwenderinnen, Anwendern und Stakeholdern • Teamorientiert, neugierig und lernbereit, du holst aktiv Feedback ein und treibst
|
||||
gemeinsame Ziele voran • Sehr gutes Deutsch oder sehr gutes Englisch, weitere Landessprachen von Vorteil
|
||||
Bei uns hast du die Möglichkeit, in einem unserer Offices in der Schweiz oder im Homeoffice zu arbeiten. Dabei kommst du mit agilen Arbeitsmethoden und den neuesten Technologien in Kontakt. Wir bieten eine flexible Arbeitszeitgestaltung, um deinen persönlichen Bedürfnissen gerecht zu werden. Als Mitarbeitende*r von Swisscom kannst du dich auf eine Vielzahl von attraktiven Leistungen freuen, die deine Arbeitserfahrung bereichern werden. Dazu gehören ein angenehmes Arbeitsumfeld, finanzielle Vorteile und spannende Möglichkeiten zur beruflichen Weiterentwicklung. Benefits.
|
||||
|
||||
For authorised use only
|
||||
|
||||
View Job Posting Details
|
||||
|
||||
Is it a match? Apply now.
|
||||
Discover your possibilities
|
||||
Any questions?
|
||||
Here you'll find answers to the most important and frequently asked questions.
|
||||
|
||||
Contact person
|
||||
Femi Hoti Talent Acquisition Manager +41 (76) 4107654
|
||||
|
||||
Your homebase
|
||||
Swisscom (Schweiz) AG
|
||||
|
||||
Alte Tiefenaustrasse 6, 3048 Worblaufen
|
||||
|
||||
Officevideo_alle_Standorte_2025_V02.mp4
|
||||
|
||||
Job Details Job Requisition ID Spotlight Job Remote Type Location
|
||||
Additional Locations Posting Date Job Family Time Type Job Type
|
||||
Supervisory Organization
|
||||
|
||||
R-0006447 Yes 80-100% Bern Zurich 14.09.2026 - 1 day ago Data Analysis Full time Employees who are subject to the CEC SCS-INI-DNA-DL
|
||||
|
||||
08:40
|
||||
15.09.2026 Page 2 of 3
|
||||
|
||||
For authorised use only
|
||||
|
||||
Hiring Team Recruiter
|
||||
|
||||
View Job Posting Details
|
||||
|
||||
Hiring Manager
|
||||
|
||||
Femi Hoti Marianne Temerowski
|
||||
|
||||
08:40
|
||||
15.09.2026 Page 3 of 3
|
||||
|
||||
For authorised use only
|
||||
|
||||
|
||||
+143
@@ -0,0 +1,143 @@
|
||||
# Critique — Swisscom (Schweiz) AG, Data Engineer - Geo Platform
|
||||
|
||||
**Date:** 2026-09-15 · **Req:** R-0006447 (internal posting) · **Package:** 2-page English resume, no cover letter (user decision: internal application)
|
||||
**Document reviewed:** `e2e_swisscom_data_engineer_geo_platform_resume.tex` → `.pdf` (2 pages; PDF built 10:25:28, after the last source change at 10:25:16)
|
||||
**JD:** `JD_swisscom_data_engineer_geo_platform.pdf` / `.txt` — user-supplied PDF export of the live internal Workday posting (15.09.2026 08:40), extracted verbatim. **JD integrity: PASS.**
|
||||
**Canonical state:** `claims.json` as of 2026-09-15, including BS-8 (geospatial), the SW-1/SW-3/SW-7 confirmations and the ART B2B / ART DPT phase split. Validator PASS.
|
||||
|
||||
---
|
||||
|
||||
## 1. Fit verdict and hard-gate audit
|
||||
|
||||
**Hard gate: FAIL.** Required line *"Fundierte Praxis mit ArcGIS und FME in der Umsetzung und im Betrieb von Geo-Workflows"* — both named tools are user-confirmed never used (2026-09-15). Geo is title-defining and R1/R2/R4 are Adjacent, not Direct.
|
||||
|
||||
**Classification: No-go on the gate — overridden by the user 2026-09-15.** The override does not change the classification, and no document edit can remove the gate. This critique therefore does **not** describe the package as framework-recommended for submission. What has changed in practice: the hiring manager, Marianne Temerowski, knows Dennis's work first-hand (she signed his Oct 2025 Zwischenzeugnis) and told him to apply. That lowers the practical risk of the gate a great deal. It does not make ArcGIS or FME evidence exist, and the first technical conversation will test it.
|
||||
|
||||
**No unresolved practical constraint:** internal move, same building, level and conditions unchanged by the user's own statement.
|
||||
|
||||
## 2. Evidence Fit: 78/100 (unchanged)
|
||||
|
||||
| Dimension | Weight | Score | Basis |
|
||||
|---|---:|---:|---|
|
||||
| Required qualifications | 35 | 25 | 7 of 8 Direct; the ArcGIS/FME line is the only role-specific technical requirement and it is a Gap |
|
||||
| Core responsibilities | 25 | 19 | R3 migrations/automation with Python, R5 troubleshooting, R6 cloud sources and deployments Direct; R1 platform operation, R2 geo pipelines (strong via BS-8), R4 map/geo services Adjacent |
|
||||
| Level and ownership | 15 | 14 | Component and Application Owner history meets "verantwortest deine Themen"; internal move at his level |
|
||||
| Recency and depth | 10 | 8 | Current ART DPT work carries Python/PySpark pipelines and relational data products; operations/on-call evidence is ART B2B (past); spatial evidence ended 2022 |
|
||||
| Domain/tool transfer | 10 | 7 | SDO_GEOMETRY and multi-CRS transformation transfer directly; ArcGIS and FME have no substitute claim |
|
||||
| Practical constraints | 5 | 5 | Same employer and site; German native; no change to level or conditions |
|
||||
| **Total** | **100** | **78** | Would sit in the Core band absent the gate |
|
||||
|
||||
## 3. Document Quality: 89/100
|
||||
|
||||
| Dimension | Weight | Score | Assessment |
|
||||
|---|---:|---:|---|
|
||||
| Truth and provenance | 25 | **24** | Every bullet traces to a canonical ID with its allowed verbs and scope (claim audit, section 6). The present-tense ownership error of the first build is fixed: ART B2B work is past tense, ART DPT work present. ODP-Flow is used, never authored. Minus one for the summary's "after owning ETL pipelines", which is slightly broader than *Komponentenverantwortung* for specific pipeline components. |
|
||||
| Information hierarchy | 20 | **19** | Employer bold first, dates on the same line, official internal title and promotion second, unit labels clearly subordinate. Experience starts at **38.4%** of page 1 (F18 review range was 45–55%). All Swisscom and Bosch evidence on page 1. Minus one: the headline carries four segments and runs long. |
|
||||
| Bullet evidence and impact | 20 | **15** | Specific, scoped and distinctive — B1 (CRS normalization and transformation, SDO_GEOMETRY) is the strongest single line against this JD. But **no quantified outcome anywhere** (every canonical metric is unverified, so this is the correct call) and few bullets say why the work mattered. D2 lists six technologies and reads partly as a stack inventory. |
|
||||
| Relevance and terminology | 15 | **11** | Strong on pipelines (7), data products (5), AWS (7), relational (3), Python (3), migration (2), security, deployments across environments, documentation, stakeholders, spatial/CRS. **Missing:** "monitoring" (0; the JD names it twice), "platform" (0), and automation appears only in pre-Swisscom bullets (the JD's R3 is "Automatisierung ... mit Python"). ArcGIS and FME cannot honestly appear. The English document against a German JD means German keywords (Geodaten, Karten, Datenpipelines) will not match literally — accepted by user directive; the posting allows English. |
|
||||
| Skills evidence | 10 | **10** | Five compact lines, every entry canonical and interview-ready; historical skills are grouped with the warehouse/operations line rather than the current AWS line; spatial skills labelled "(Bosch)". |
|
||||
| Mechanics and readability | 10 | **10** | Validator PASS with 0 advisory warnings (cadence included); 0 overfull/underfull boxes; exactly 2 pages; clean extraction; no clipping or overlap. Page 2 is half empty — acceptable, no filler. |
|
||||
| **Total** | **100** | **89** | Truth/provenance well above the 8/10 automatic-failure line |
|
||||
|
||||
## 4. Channel Strength: **Moderate**
|
||||
|
||||
The hiring manager was contacted before submission and encouraged the application — the first time in the log that a published named contact was actually used. Not Strong: there is no separate referral or internal sponsor beyond the hiring-team contact. Her prior knowledge of his work (she signed his Zwischenzeugnis) makes this an unusually good Moderate. Whether ArcGIS/FME was discussed is not recorded.
|
||||
|
||||
## 5. Competitive read and reader sequence
|
||||
|
||||
**Obvious-fit competitor:** a Geomatik or GIS engineer with years of ArcGIS Enterprise and FME workbench delivery, possibly already near the geo team.
|
||||
- **Dennis's real advantage:** stronger general data engineering (current AWS data-product migration in Python/PySpark with ODP-Flow; past DWH component ownership with on-call); genuine spatial-data and coordinate-transformation experience; internal context, zero onboarding friction, and a hiring manager who knows his work.
|
||||
- **Competitor's real advantage:** the two named tools on day one; geographic/geodetic CRS fluency (datums, projections, LV95); map and OGC service delivery.
|
||||
- **Do not value the bridge as highly as direct evidence:** wafer coordinate systems are real CRS work, but not geodesy.
|
||||
|
||||
| Reader | Verdict | Reason |
|
||||
|---|---|---|
|
||||
| Parser/ATS (Workday) | Clean extraction; weak literal match on the geo line | ArcGIS, FME and German geo vocabulary absent; mitigated by the hiring-manager channel |
|
||||
| Recruiter glance (Femi Hoti) | **Forward** | Internal candidate the hiring manager asked to apply; would be Borderline cold because of ArcGIS/FME |
|
||||
| Hiring manager (Marianne Temerowski) | **Interview** | Already encouraged the application; B1, D2 and P1 map to her geo pipelines, migrations and operations lines |
|
||||
| Technical reviewer (geo team) | **Maybe** | Credible data engineer; first challenge will be ArcGIS/FME depth, second will be which coordinate systems and how the transformations were done |
|
||||
|
||||
## 6. Claim audit
|
||||
|
||||
| Claim in document | Canonical ID / evidence | Direct/Adjacent | Safe? | Fix |
|
||||
|---|---|---|---|---|
|
||||
| Headline "Data, Analytics & AI Engineer IV" | SWISSCOM `official_title` (Zwischenzeugnis Okt 2025; user 2026-09-15) | Direct | Yes | — |
|
||||
| Summary "over ten years of software experience" | Visible record from Generali 2015-05 (Capgemini omitted) = 11+ years | Direct | Yes | — |
|
||||
| Summary "builds relational data products on AWS within the company-wide Data Mesh" | SW-7 (scope: within the mesh; relational confirmed 2026-09-15) | Direct | Yes | — |
|
||||
| Summary "after owning ETL pipelines into the Teradata data warehouse" | SW-2 (component ownership, ART B2B, past) | Direct | Yes, slightly broad | T3: "owning ETL pipeline components" |
|
||||
| Summary "worked extensively with geospatial wafer data across coordinate reference systems" | BS-8 (user's words) | Adjacent to JD | Yes | T2-1: consider "spatial" |
|
||||
| Skills: Python, PySpark, SQL, Bash, Java, C# | skills: production-current / historical-with-context | Direct | Yes | T3: PySpark is a framework, not a language |
|
||||
| Skills: Glue, Athena, Iceberg, Airflow, relational data modeling, Compass | SW-1, SW-7, skills (Iceberg and relational modelling confirmed 2026-09-15) | Direct | Yes | — |
|
||||
| Skills: Oracle, Teradata, Kafka, Kubernetes, GitLab CI/CD, Ansible | SW-2, SW-3, BS-6; Kafka/Kubernetes `production-historical` | Direct | Yes — no currency implied | — |
|
||||
| Skills: Oracle SDO_GEOMETRY, CRS transformation, Spotfire map charts (Bosch) | BS-8, BS-5; skills allowed-with-context | Direct (historical) | Yes | — |
|
||||
| Certifications: AWS SAA, Data Engineering with AWS, ITIL Foundation | `thiessen_certifications.md` #7, #2, #1 (SAA active to Sep 2027) | Direct | Yes | — |
|
||||
| D1 Onboard sources, model relational data products, document metadata/lineage in Compass | SW-7 (verbs onboard/model/document; practitioner Compass) | Direct | Yes | — |
|
||||
| D2 Migrate legacy ETL pipelines to AWS as data products with Python/PySpark, Glue, Iceberg, Athena, Airflow, ODP-Flow; contribute to wider migration | SW-1 + SW-6 (ART DPT, current; ODP-Flow used, not built) | Direct | Yes — scoped by the unit label and "contribute" | T2-4: thin the stack list |
|
||||
| P1 Owned Fulfillment ETL components Oracle → Teradata; quality, security/compliance, RCA, 2nd/3rd-level, on-call | SW-2 (Zwischenzeugnis; ART B2B, past-tense verbs) | Direct | Yes | — |
|
||||
| P2 Built/operated Python apps on Kubernetes; GitLab CI/CD across multiple environments | SW-3 (Zwischenzeugnis; multi-env confirmed; ART B2B) | Direct | Yes | T2-2: say "automated" |
|
||||
| P3 Dashboards and analyses for internal B2B stakeholders; refined backlog with PO | SW-4 + SW-3 backlog scope (Zwischenzeugnis item 8) | Direct | Yes | — |
|
||||
| B1 Normalized/transformed spatial wafer data between CRSs of fab tools; Oracle SDO_GEOMETRY + Spotfire; performance tuning | BS-8 (user-confirmed 2026-09-15; no datum/projection/EPSG wording) | Adjacent to JD | Yes | T2-1 |
|
||||
| B2 C# extensions and map-chart visualizations; co-owned Spotfire; co-presented TAF 2022 | BS-5 (TAF article verified 2026-06-15) | Adjacent to JD | Yes — co-ownership and co-presentation preserved | — |
|
||||
| B3 Technical Application Owner KLA DMS and Spotfire; SLOs, vendors, training, documentation | BS-3 (Arbeitszeugnis; named systems user-confirmed) | Direct | Yes | — |
|
||||
| B4 Linux servers with version-controlled Ansible from Jenkins/GitLab; credential plugin with keystore caching | BS-6 (no GitOps, no figures) | Direct | Yes | — |
|
||||
| F1 SCEDAS in C# on MS SQL Server; Jenkins build jobs | FC-1 (Arbeitszeugnis) | Direct | Yes | — |
|
||||
| V1 Automated test suites as CI/CD quality gates | VZ-2 (Reference Letter) | Direct | Yes | — |
|
||||
| G1 Introduced BDD via PoC; technical responsibility; trained project members | GN-1 (Arbeitszeugnis) | Direct | Yes | — |
|
||||
| Absent by design | ArcGIS, FME, QGIS, PostGIS, GeoServer, GDAL (forbidden); Capgemini (excluded); metrics (none verified) | — | Correct | — |
|
||||
|
||||
## 7. Fixes
|
||||
|
||||
### Tier 1 — truth and fit
|
||||
- **Document: none.** Validator PASS, and the claim audit found no scope, verb, currency or provenance breach.
|
||||
- **Fit: the ArcGIS/FME hard gate.** Not fixable in writing and not to be papered over with vocabulary. Prepare the interview answer instead (below).
|
||||
|
||||
### Tier 2 — presentation (optional, each evidence-safe)
|
||||
1. **"geospatial wafer data" → "spatial wafer data"** in the summary and B1, keeping "coordinate reference systems" and SDO_GEOMETRY. A Geomatik reader takes *geospatial* to mean Earth-referenced data; wafer coordinates are not. *Spatial* is exact, is the TAF talk's own word ("Spatial Variability"), claims less than BS-8 allows, and removes the easiest challenge without losing any of the CRS evidence.
|
||||
2. **P2: add the automation the Zwischenzeugnis records** — e.g. "Built and operated Python applications on Kubernetes and automated their CI/CD in GitLab across multiple environments." SW-3 scope is verbatim "automation of CI/CD processes in GitLab"; it brings "automation" into the Swisscom block, where the JD's R3 wants it.
|
||||
3. **"Monitoring" is absent (0) although the JD names it twice.** No current canonical monitoring evidence exists for Swisscom; the only honest monitoring evidence is the Bosch ELK/Grafana/Prometheus **PoC** (BS-4), which would cost page-1 space. Recommended action is a **question, not an edit:** did the on-call/RCA work at ART B2B, or the AWS work at ART DPT, include monitoring or alerting, and with which tools? If yes, record it and add a clause; if not, leave it.
|
||||
4. **D2 stack density:** six technologies in one bullet read as an inventory, and Iceberg, Athena and Airflow are already in the skills block. Option: "…implement them as data products in Python/PySpark on AWS Glue with Swisscom's internal ODP-Flow framework; contribute to the wider company migration." Keep as-is if you want the internal reader to see the full stack in context.
|
||||
|
||||
### Tier 3 — nits
|
||||
- Summary "after owning ETL pipelines" → "after owning ETL pipeline components" (precision to *Komponentenverantwortung*).
|
||||
- PySpark sits under Languages; it is a framework. Harmless for this reader.
|
||||
- "PO" is fine internally; spell out "Product Owner" if this document is ever reused externally.
|
||||
|
||||
### Interview preparation (from the reader sequence)
|
||||
- **ArcGIS / FME:** say plainly that neither has been used. Anchor on what transfers: ETL and pipeline design, Python automation, spatial data types, coordinate-system normalization and transformation. Any learning plan must be real — none is recorded, so do not improvise one in the room.
|
||||
- **Coordinate reference systems:** be ready to name the actual coordinate systems of the fab tools and how the normalization and transformations were implemented. Expect a follow-up on geographic systems (WGS84, LV95, datum shifts), which is new ground and should be said so.
|
||||
- **Operating a platform (Monitoring, Security, Deployments):** P1 on-call and RCA, P2 multi-environment deployments, B3 SLOs, B4 automation and credential handling.
|
||||
- **Why move:** more interesting work in a domain he has touched before, internally, with no change in conditions.
|
||||
|
||||
## 8. Cover letter
|
||||
|
||||
**Decision NO (user, internal application) — not penalized.** The resume stands alone. The one thing a letter would have carried, the ArcGIS/FME gap, was instead covered by talking to the hiring manager directly, which was the stronger choice. If the internal Workday flow asks motivation questions, answer them there rather than writing a letter.
|
||||
|
||||
## 9. Mechanical verification
|
||||
|
||||
| Check | Result |
|
||||
|---|---|
|
||||
| `validate_resume_system.py --document` | PASS, 0 advisory warnings |
|
||||
| Canonical validator | PASS |
|
||||
| Compile (MiKTeX pdfTeX) | 0 overfull/underfull boxes; PDF newer than source |
|
||||
| Page count | 2 |
|
||||
| `page_metrics.py` | experience starts at 38.4% of page 1 |
|
||||
| `pdftotext -enc UTF-8` | header → summary → skills → Swisscom (title, unit labels, bullets) → Bosch → earlier roles → education in order; en-dashes and umlauts clean |
|
||||
| Visual | page 1 inspected after edit round 1; page 2 text verified unchanged |
|
||||
| Metadata | Author and Title empty; producer MiKTeX |
|
||||
| Forbidden terms | ArcGIS, FME, QGIS, PostGIS, GeoServer, GDAL, GitOps absent |
|
||||
|
||||
**Status:** critique complete. Tier 1: none in the document; hard gate FAIL stands (overridden).
|
||||
|
||||
## Addendum — user decisions and post-critique edits (2026-09-15)
|
||||
|
||||
| Item | Decision | Result |
|
||||
|---|---|---|
|
||||
| Tier 2-1 "geospatial" → "spatial" | Applied | Summary and B1 now say "spatial wafer data"; "geospatial" appears 0 times in the rendered text |
|
||||
| Tier 2-2 automation in P2 | Applied, narrowed by the user | "deployed through automated GitLab CI/CD pipelines across multiple environments" — he **worked with** the automation and did not build it. `claims.json` SW-3 now forbids claiming the automation, so the edit narrows the claim rather than adding one. |
|
||||
| Tier 2-3 monitoring | Declined — do not ask further | "Monitoring" stays absent; relevance score unchanged |
|
||||
| Tier 2-4 D2 stack list | Declined | Unchanged |
|
||||
| Tier 3 nits | Not applied | — |
|
||||
|
||||
**Re-verification after the edits:** validator PASS with 0 advisory warnings; 0 overfull/underfull boxes; 2 pages; experience at 38.4% of page 1; page 1 re-inspected visually. The scores stand: both edits were this critique's own recommendations and neither adds a claim, so the critique is **not stale**.
|
||||
|
||||
**Finalization:** submission copy `Dennis_Thiessen_Resume.pdf` (MD5-identical to the build). Recorded in the tracker as `app-535c5bfb3f94`, outcome **open** until the user reports the submission. Per the workflow this package is not described as framework-recommended for submission, because the hard gate fails. Submitting it is the user's own decision, made through the override and backed by the hiring manager's encouragement.
|
||||
+85
@@ -0,0 +1,85 @@
|
||||
% Swisscom (Schweiz) AG - Data Engineer - Geo Platform (R-0006447), internal application.
|
||||
% Audience: Swiss/DACH, written in English (user directive 2026-09-15). English document,
|
||||
% so no babel[ngerman]. Generated fresh from claims.json + experience files; no historical output used.
|
||||
% Swisscom is split into its two units (ART DPT current, ART B2B past) WITHOUT unit dates - user decision.
|
||||
|
||||
\documentclass{resume}
|
||||
\usepackage[utf8]{inputenc}
|
||||
\usepackage[T1]{fontenc}
|
||||
\usepackage{lmodern}
|
||||
\usepackage[a4paper,left=0.65in,right=0.65in,top=0.55in,bottom=0.55in]{geometry}
|
||||
\usepackage{xcolor}
|
||||
\usepackage{hyperref}
|
||||
\hypersetup{hidelinks}
|
||||
\usepackage[version=4]{mhchem}
|
||||
\usepackage{fancyhdr}
|
||||
\pagestyle{fancy}
|
||||
\fancyhf{}
|
||||
\renewcommand{\headrulewidth}{0pt}
|
||||
\fancyfoot[R]{\small \thepage/\pageref{LastPage}}
|
||||
% Keep product names whole: TeX's English patterns broke "Ter-adata".
|
||||
\hyphenation{Teradata keystore}
|
||||
\frenchspacing
|
||||
% Unit label inside one employer entry: an unbulleted line aligned with the employer text.
|
||||
\newcommand{\unitline}[1]{\item[]\hspace*{-1.25em}{\small\bfseries #1}}
|
||||
|
||||
\name{Dennis Thiessen, M.Eng.}
|
||||
\headline{Data, Analytics \& AI Engineer IV $\vert$ AWS Data Products $\vert$ Pipeline Ownership \& Spatial Data}
|
||||
\contactline{Bern, Switzerland $\vert$ \href{mailto:dennis@thiessen.io}{dennis@thiessen.io} $\vert$ +41 795 955 585 $\vert$ \href{https://linkedin.com/in/dennis-thiessen}{LinkedIn}}
|
||||
|
||||
\begin{document}
|
||||
|
||||
\begin{rSection}{Summary}
|
||||
Data engineer with over ten years of software experience. At Swisscom, builds relational data products on AWS within the company-wide Data Mesh, after owning ETL pipelines into the Teradata data warehouse. At Bosch, worked extensively with spatial wafer data across coordinate reference systems.
|
||||
\end{rSection}
|
||||
|
||||
\begin{rSection}{Technical Skills}
|
||||
\skillline{Languages}{Python, PySpark, SQL, Bash; Java and C\# (professional, historical)}
|
||||
\skillline{AWS data products}{Glue, Athena, Iceberg, Airflow, relational data modeling, Atlassian Compass}
|
||||
\skillline{Warehouse and operations}{Oracle, Teradata, Apache Kafka, Kubernetes, GitLab CI/CD, Ansible}
|
||||
\skillline{Spatial data (Bosch)}{Oracle SDO\_GEOMETRY, CRS transformation, Spotfire map charts}
|
||||
\skillline{Certifications}{AWS Solutions Architect -- Associate; Data Engineering with AWS; ITIL Foundation}
|
||||
\end{rSection}
|
||||
|
||||
\begin{rSection}{Professional Experience}
|
||||
|
||||
\begin{rSubsection}{Swisscom (Schweiz) AG}{Oct 2023 -- Present}{Data, Analytics \& AI Engineer IV (promoted from III, Apr 2025)}{Bern, Switzerland}
|
||||
\unitline{ART DPT, Team Offering}
|
||||
\item Onboard source systems onto Swisscom's company-wide Data Mesh and model their data products as relational models; document metadata and lineage in Atlassian Compass.
|
||||
\item Migrate legacy ETL pipelines to AWS and implement them as data products with Python/PySpark, AWS Glue, Apache Iceberg, Athena, Airflow and Swisscom's internal ODP-Flow framework; contribute to the wider company migration.
|
||||
\unitline{ART B2B}
|
||||
\item Owned the ETL pipeline components that loaded business-critical Fulfillment data from Oracle into the Teradata data warehouse, covering data quality, security and compliance, root-cause analysis, second- and third-level support and on-call duty.
|
||||
\item Built and operated Python applications on Kubernetes, deployed through automated GitLab CI/CD pipelines across multiple environments.
|
||||
\item Delivered dashboards and analyses for internal B2B stakeholders; refined the backlog with the PO.
|
||||
\end{rSubsection}
|
||||
|
||||
\begin{rSubsection}{Robert Bosch Semiconductor Manufacturing Dresden GmbH}{Feb 2020 -- Dec 2022}{Senior Data Engineer, Data Analysis (promoted from Data Engineer, Jan 2021)}{Dresden, Germany}
|
||||
\item Normalized and transformed spatial wafer data between the different coordinate reference systems used by fab tools and systems. Worked with that data in Oracle (SDO\_GEOMETRY) and TIBCO Spotfire to locate and analyze wafers, including performance tuning.
|
||||
\item Built C\# extensions and map-chart visualizations of wafer spatial variability for fab engineers in the co-owned TIBCO Spotfire environment; co-presented the work at TIBCO Analytics Forum 2022.
|
||||
\item Served as technical Application Owner for the KLA Defect Management System and Spotfire, responsible for SLOs, vendor communication, user training and documentation.
|
||||
\item Administered and automated the Linux servers behind fab analytics and ML workloads with version-controlled Ansible run from Jenkins/GitLab pipelines; developed a credential plugin that retrieved secrets from a password keystore with local caching.
|
||||
\end{rSubsection}
|
||||
|
||||
\begin{rSubsection}{Fraunhofer CML}{Sep 2018 -- Oct 2019}{Research Software Engineer}{Hamburg, Germany}
|
||||
\item Developed the SCEDAS crew-scheduling software in C\# on Microsoft SQL Server and set up Jenkins build jobs for its automated deployment.
|
||||
\end{rSubsection}
|
||||
|
||||
\begin{rSubsection}{Vizrt}{Jul 2017 -- May 2018}{Test Automation / DevOps Engineer}{Bergen, Norway}
|
||||
\item Integrated automated test suites into the CI/CD pipeline as quality gates.
|
||||
\end{rSubsection}
|
||||
|
||||
\begin{rSubsection}{Generali Deutschland Informatik Services GmbH}{May 2015 -- Jun 2017}{IT Consultant}{Hamburg, Germany}
|
||||
\item Introduced behavior-driven development through a proof of concept, then held technical responsibility for the test automation and trained project members to work with it.
|
||||
\end{rSubsection}
|
||||
|
||||
\end{rSection}
|
||||
|
||||
\begin{rSection}{Education}
|
||||
\compactentry{M.Eng. Computer Aided Engineering}{Apr 2012 -- Oct 2013}
|
||||
Universität der Bundeswehr München; Software Design \& Engineering.
|
||||
|
||||
\compactentry{B.Eng. Information and Telecommunication Technologies}{Oct 2009 -- Oct 2012}
|
||||
Universität der Bundeswehr München.
|
||||
\end{rSection}
|
||||
|
||||
\end{document}
|
||||
@@ -0,0 +1,59 @@
|
||||
\ProvidesClass{resume}[2026/07/27 Evidence-first professional resume]
|
||||
\LoadClass[11pt,a4paper]{article}
|
||||
|
||||
\RequirePackage{enumitem}
|
||||
\RequirePackage{ifthen}
|
||||
\RequirePackage{lastpage}
|
||||
\RequirePackage{parskip}
|
||||
\RequirePackage{needspace}
|
||||
|
||||
\pagestyle{empty}
|
||||
\setlength{\parindent}{0pt}
|
||||
|
||||
\def\@resumename{}
|
||||
\def\@resumeheadline{}
|
||||
\def\@resumecontact{}
|
||||
|
||||
\newcommand{\name}[1]{\def\@resumename{#1}}
|
||||
\newcommand{\headline}[1]{\def\@resumeheadline{#1}}
|
||||
\newcommand{\contactline}[1]{\def\@resumecontact{#1}}
|
||||
|
||||
\newcommand{\printresumeheader}{%
|
||||
{\LARGE\bfseries \@resumename}\par
|
||||
\vspace{0.15em}
|
||||
\ifthenelse{\equal{\@resumeheadline}{}}{}{\@resumeheadline\par}
|
||||
\vspace{0.1em}
|
||||
{\small \@resumecontact}\par
|
||||
\vspace{0.45em}
|
||||
}
|
||||
|
||||
\AtBeginDocument{\printresumeheader}
|
||||
|
||||
\newenvironment{rSection}[1]{%
|
||||
\vspace{0.35em}
|
||||
{\bfseries #1}\par
|
||||
\vspace{0.1em}\hrule\vspace{0.35em}
|
||||
}{%
|
||||
\vspace{0.2em}
|
||||
}
|
||||
|
||||
% Arguments: employer, dates, formal title, location.
|
||||
\newenvironment{rSubsection}[4]{%
|
||||
\Needspace{6\baselineskip}%
|
||||
{\bfseries #1}\hfill{\small #2}\par
|
||||
{\itshape #3}\hfill{\itshape #4}\par
|
||||
\vspace{0.1em}
|
||||
\begin{itemize}[leftmargin=1.25em,label=\textbullet,itemsep=0.18em,topsep=0.15em,parsep=0pt,partopsep=0pt]
|
||||
}{%
|
||||
\end{itemize}
|
||||
\vspace{0.25em}
|
||||
}
|
||||
|
||||
\newcommand{\skillline}[2]{%
|
||||
\textbf{#1:} #2\par
|
||||
\vspace{0.08em}
|
||||
}
|
||||
|
||||
\newcommand{\compactentry}[2]{%
|
||||
\textbf{#1}\hfill #2\par
|
||||
}
|
||||
+171
@@ -0,0 +1,171 @@
|
||||
# Session: Swisscom (Schweiz) AG — Data Engineer - Geo Platform
|
||||
|
||||
## JD Integrity
|
||||
- File/source: `JDs/Swisscom_DE_Geo.pdf` (user-supplied), copied to `JD_swisscom_data_engineer_geo_platform.pdf`; verbatim text in `JD_swisscom_data_engineer_geo_platform.txt` (pdftotext)
|
||||
- Retrieval method and date: PDF export of the internal Swisscom Workday posting view, stamped 15.09.2026 08:40; saved 2026-09-15
|
||||
- Verbatim posting: YES
|
||||
- Posting status: live - posted 14.09.2026, Job Requisition ID **R-0006447**, Spotlight Job
|
||||
- Job details: Location Bern (homebase Alte Tiefenaustrasse 6, 3048 Worblaufen), additional location Zurich; Remote Type "80-100%" (meaning not stated - do not interpret); Job Family Data Analysis; Full time; Job Type "Employees who are subject to the CEC"; Supervisory Organization SCS-INI-DNA-DL
|
||||
- Named contacts: Recruiter **Femi Hoti**, Talent Acquisition Manager, +41 (76) 4107654; Hiring Manager **Marianne Temerowski**
|
||||
- No level, band or seniority is stated. Title is bare "Data Engineer".
|
||||
|
||||
## Application Decision
|
||||
- Audience profile: **Swiss/DACH, written in ENGLISH** (user directive 2026-09-15). Swiss employer, Bern hiring team, internal transfer - so Swiss conventions, not International Tech framing. English document: **no `babel[ngerman]`** (the German-hyphenation rule does not apply; do not re-raise it). No photo. No work-authorization line (internal candidate). **Official internal title** used (internal application).
|
||||
- Evidence Fit: **78** (re-scored 2026-09-15 after BS-8 was confirmed; first provisional read was ~71)
|
||||
- Fit class: **No-go on the gate** - a required qualification is a Gap and geo is title-defining with R1/R2/R4 only Adjacent (`application_strategy.md`). The 78 would sit in the Core band absent the gate; the override below does not change this classification.
|
||||
- Hard gate: **FAIL** - required *"Fundierte Praxis mit ArcGIS und FME in der Umsetzung und im Betrieb von Geo-Workflows"*: user-confirmed 2026-09-15 that neither tool was ever used. The geo *substance* is real evidence (BS-8, BS-5); the two named tools are not.
|
||||
- **User override: YES, 2026-09-15** - shown the gate, the user replied "plan the resume (but it should be in english)".
|
||||
- Practical constraint: **RESOLVED** - internal move, user-confirmed 2026-09-15: "nothing changes here" on level and conditions; accepted for more interesting work, minimal friction (same building). External no-lateral-move rule does not apply (recorded in memory `user_comp_bar`).
|
||||
- Channel Strength: **Moderate** (2026-09-15) - the user contacted hiring manager Marianne Temerowski and **she told him to apply**. Framework: known hiring manager = Moderate; Strong would additionally need a separate referral/internal sponsor. Context: she signed his Swisscom Zwischenzeugnis (20.10.2025) as Leader for Organisations, Data Analytics III, so she knows his work first-hand. Whether ArcGIS/FME came up in that conversation is not recorded.
|
||||
- Channel plan: done - HM contacted before submitting (first application in the log where the named contact was actually used)
|
||||
- Named contact published? YES -- Marianne Temerowski (HM) contacted 2026-09-15, encouraged the application; Femi Hoti (recruiter) not contacted
|
||||
- Decision: **PROCEED (user override)** - package finalized 2026-09-15; submission pending
|
||||
|
||||
## Requirements
|
||||
| # | Requirement | Required/preferred | Direct/Adjacent/Gap/Constraint | Canonical evidence | Gate? |
|
||||
|---|---|---|---|---|---|
|
||||
| Q1 | Abschluss (ETH/Uni/FH) Informatik, Geomatik, Wirtschaftsinformatik oder gleichwertig | Required | Direct | EDU-BENG (Information and Telecommunication Technologies), EDU-MENG (Computer Aided Engineering, Software Design & Engineering) | |
|
||||
| Q2 | Mehrjährige Erfahrung Data Engineering, Fokus Datenpipelines und relationale Datenmodelle | Required | Direct | SW-1 + SW-7 (current, ART DPT: AWS data products, relational models), SW-2 (past, ART B2B: Oracle -> Teradata DWH ETL), BS-2, FC-1 (MS SQL Server) | |
|
||||
| Q3 | Fundierte Praxis mit **ArcGIS und FME**, Umsetzung und Betrieb von Geo-Workflows | Required | **Gap** for both named tools (user-confirmed); geo-workflow substance Adjacent | BS-8 (Oracle SDO_GEOMETRY, multi-CRS normalization and transformation, performance tuning), BS-5 (Spotfire map charts, TAF 2022). ArcGIS/FME: none | **YES** |
|
||||
| Q4 | Sichere Entwicklung mit Python, Automatisierung und Scripting | Required | Direct | SW-1/SW-6 (current: Python/PySpark, Glue), SW-3 (past: Python on Kubernetes, worked with automated GitLab CI/CD), BS-6 (Ansible, Linux automation), skills Python, Bash | |
|
||||
| Q5 | Strukturiert, eigenverantwortlich, dokumentiert, verantwortet Themen | Required | Direct | SW-2 Komponentenverantwortung, SW-7 (documents metadata/lineage in Compass), BS-3 Application Owner incl. documentation | |
|
||||
| Q6 | Kommunikativ, erklärt Technik, Austausch mit Anwendern und Stakeholdern | Required | Direct | SW-4, BS-3 (vendors, internal customers, training), GN-1 (trained project members) | |
|
||||
| Q7 | Teamorientiert, neugierig, lernbereit | Required | Direct (soft) | BS-7 supervision; Staff-level guiding | |
|
||||
| Q8 | Sehr gutes Deutsch oder Englisch | Required | Direct | German native, English fluent | |
|
||||
| R1 | Betrieb und Weiterentwicklung der Swisscom Geo Platform | Core | Adjacent | Operating function Direct (SW-2 on-call, 2nd/3rd level; SW-3; BS-3); the Geo Platform itself new | |
|
||||
| R2 | Entwicklung und Betrieb von Geo-Datenpipelines (Integration, Transformation) | Core | Adjacent (strong) | Pipelines Direct (SW-1, SW-2, SW-7 source onboarding); spatial transformation BS-8; FME Gap | |
|
||||
| R3 | Automatisierung von Datenprozessen und Migrationen mit Python | Core | Direct | SW-1 (current migration in Python/PySpark, Glue, ODP-Flow), SW-3 | |
|
||||
| R4 | Bereitstellung von Karten- und Geodatendiensten für diverse Nutzergruppen | Core | Adjacent | BS-5 map visualizations for engineers, BS-8, SW-4 dashboards for internal users; published geo services (ArcGIS Enterprise, OGC) Gap | |
|
||||
| R5 | Monitoring, Fehleranalyse, kontinuierliche Verbesserung mit Stakeholdern | Core | Direct | SW-2 root-cause analysis and on-call, BS-4 monitoring PoC | |
|
||||
| R6 | (Intro) neue Quellen in Cloud-Architektur integrieren; Monitoring, Security, Deployments über mehrere Umgebungen | Core | Direct | SW-7 source onboarding on AWS (current), SW-3 automated GitLab CI/CD across multiple environments (past, ART B2B) | |
|
||||
|
||||
## Evidence Fit
|
||||
| Dimension | Weight | Score | Basis |
|
||||
|---|---:|---:|---|
|
||||
| Required qualifications | 35 | 25 | 7 of 8 Direct; the one Gap is the only role-specific technical line, now with real geo substance behind it |
|
||||
| Core responsibilities | 25 | 19 | R3, R5, R6 Direct; R1, R2, R4 Adjacent (R2 strong via BS-8) |
|
||||
| Level and ownership | 15 | 14 | Component/Application Owner scope meets "verantwortest deine Themen"; internal move at his level per user |
|
||||
| Recency and depth | 10 | 8 | Python/PySpark pipeline and AWS data-product evidence current (ART DPT); operations/on-call evidence past (ART B2B); spatial evidence ends 2022 |
|
||||
| Domain/tool transfer | 10 | 7 | Spatial data types and CRS transformation transfer directly; ArcGIS and FME are named tools with no substitute claim |
|
||||
| Practical constraints | 5 | 5 | Same employer, same building, German, no level or conditions change |
|
||||
| **Total** | 100 | **78** | Hard-gate FAIL overrides the number |
|
||||
|
||||
History: provisional ~71 before BS-8 was confirmed. The first read wrongly assumed wafer coordinates carry no CRS; corrected by the user 2026-09-15 (CLAUDE.md KB log). The ART B2B/DPT split moved operations evidence from current to past but did not change the score: the current DPT work still carries Python, pipelines and relational models.
|
||||
|
||||
## Resolved Questions (2026-09-15)
|
||||
1. Oracle `SDO_GEOMETRY`: yes. Multiple coordinate reference systems across tools and systems; normalization and transformation was the biggest pain point, performance tuning the other. -> BS-8 in `claims.json`.
|
||||
2. ArcGIS, FME, QGIS, PostGIS, GeoServer, GDAL, shapefile/GeoJSON/GeoTIFF, swisstopo: none. -> registered `forbidden` where they are tools.
|
||||
3. Internal move; nothing changes on level or conditions; accepted for more interesting work.
|
||||
4. SW-1 migration written in Python as AWS Glue jobs, together with **ODP-Flow** (Swisscom-internal data-product framework) -> `claims.json` SW-1 + new skill `ODP-Flow` (allowed-with-context; he uses it, did not build it).
|
||||
5. SW-3 GitLab CI/CD deploys across multiple environments -> `claims.json` SW-3.
|
||||
6. SW-7 data-product modelling is relational (logical and physical) -> `claims.json` SW-7 + new skill `relational data modelling`.
|
||||
7. B4 choice delegated to Claude -> BS-6 (Linux/Ansible automation).
|
||||
8. Cover letter: not needed for internal applications (user) -> NO.
|
||||
9. Official internal title **Data, Analytics & AI Engineer IV**, previously **III** (to the Apr 2025 promotion) -> `claims.json` SWISSCOM `official_title` + `internal_title_history`.
|
||||
10. Two units: **ART B2B** (first part, PAST: legacy Teradata DWH - SW-2, SW-3 Kubernetes/GitLab CI/CD, SW-4 dashboards, Kafka) and **ART DPT, Team Offering** (CURRENT: AWS data products - AWS, ODP-Flow, PySpark/Python, Glue, Iceberg, Athena, Airflow; SW-1, SW-6, SW-7) -> `claims.json` SWISSCOM `org_history`, phase notes on SW-1/2/3/4/6/7, Kafka and Kubernetes downgraded to `production-historical`, Apache Iceberg added.
|
||||
11. Switch date: unknown and **not relevant** - never date the two units.
|
||||
12. Offering domain also covers Fulfillment and Product data; not needed on the document. "ART"/"Art" (SAFe) both fine.
|
||||
13. Critique Tier 2 (2026-09-15): item 1 **yes** ("spatial" instead of "geospatial"); item 2 **reworded** - he *worked with* automated GitLab CI/CD, did not build the automation -> `claims.json` SW-3 scope + forbidden, `experience_swisscom.md` SW-3 correction, CLAUDE.md log; item 3 (monitoring) **leave out, do not ask further**; item 4 **no change**; no other fixes.
|
||||
|
||||
## Competitive Read
|
||||
- Obvious-fit candidate: Geomatik/GIS engineer with years of ArcGIS Enterprise and FME workbench delivery, likely already near the geo team
|
||||
- Dennis's advantage: stronger general data engineering (current AWS data products and migration in Python/PySpark; past DWH component ownership with on-call); real spatial-data and CRS-transformation experience (BS-8); internal Swisscom context, zero onboarding friction, and a hiring manager who knows his work and encouraged the application
|
||||
- Their advantage: the two named tools on day one; geographic/geodetic CRS fluency (LV95); OGC/map-service delivery
|
||||
- Level/scope comparison: his current scope meets or exceeds the seat
|
||||
- Likely first challenges: (1) ArcGIS/FME depth - answer honestly, point to spatial SQL and CRS work as the transferable core; (2) geographic CRS specifics (LV95, projections) - his CRS work was on wafer coordinate systems
|
||||
|
||||
## Framing Strategy
|
||||
- Professional identity: data engineer with current AWS data-product work, past pipeline ownership and hands-on spatial-data experience
|
||||
- Strongest proof points: SW-7, SW-1 (current); SW-2, SW-3 (past); BS-8 + BS-5; BS-3; BS-6
|
||||
- Honest adjacent bridges: Oracle SDO_GEOMETRY and multi-CRS normalization/transformation of wafer data -> geo-data pipelines; Spotfire map charts for engineers -> map/geodata services for user groups
|
||||
- Explicit gaps: ArcGIS, FME, geodetic CRS specifics, OGC map services - none appear on the resume in any form
|
||||
- User directives: **English language**; **no cover letter**; **official internal title**; **Swisscom split into ART DPT / ART B2B without unit dates**; **"spatial", not "geospatial"**; **worked with (not built) automated GitLab CI/CD** (all 2026-09-15)
|
||||
- **Bundle deviation, stated:** `bundle_data_engineer.md` and `achievement_reframing_guide.md` rate BS-5 LOW ("omit from resume"). For this JD it sits in the Bosch block behind BS-8, per `resume_reference.md` ("within a position, lead with the bullet closest to the target role"). The bundles predate BS-8 and cannot see it.
|
||||
- **BS-2 dropped deliberately:** it would spend a second Bosch slot on Oracle next to BS-8.
|
||||
|
||||
## Resume As Built (final, 2026-09-15, after edit round 2)
|
||||
|
||||
**File:** `e2e_swisscom_data_engineer_geo_platform_resume.tex` (source of truth) + compiled `e2e_swisscom_data_engineer_geo_platform_resume.pdf`; submission copy `Dennis_Thiessen_Resume.pdf`. Template `resume_template.tex` + `resume.cls`; fresh content, no historical output used. Local macro `\unitline` renders the two unit labels inside the Swisscom entry.
|
||||
|
||||
**Header:** Dennis Thiessen, M.Eng. | `Data, Analytics & AI Engineer IV | AWS Data Products | Pipeline Ownership & Spatial Data` | Bern, Switzerland, email, phone, LinkedIn.
|
||||
|
||||
**Summary (3 rendered lines):** data engineer, over ten years of software experience (measured from Generali, May 2015); at Swisscom builds relational data products on AWS within the company-wide Data Mesh, after owning ETL pipelines into the Teradata DWH; at Bosch, spatial wafer data across coordinate reference systems.
|
||||
|
||||
**Skills (5 rendered lines):** Languages (Python, PySpark, SQL, Bash; Java and C# historical) / AWS data products (Glue, Athena, Iceberg, Airflow, relational data modeling, Atlassian Compass) / Warehouse and operations (Oracle, Teradata, Apache Kafka, Kubernetes, GitLab CI/CD, Ansible) / Spatial data (Bosch) (Oracle SDO_GEOMETRY, CRS transformation, Spotfire map charts) / Certifications (AWS SAA; Data Engineering with AWS; ITIL Foundation).
|
||||
|
||||
**Swisscom (Schweiz) AG | Oct 2023 - Present | Data, Analytics & AI Engineer IV (promoted from III, Apr 2025) | Bern, Switzerland**
|
||||
|
||||
| # | Unit | ID | As-built bullet (short form) |
|
||||
|---|---|---|---|
|
||||
| D1 | ART DPT, Team Offering | SW-7 | Onboard source systems onto the company-wide Data Mesh; model data products as relational models; document metadata and lineage in Atlassian Compass |
|
||||
| D2 | ART DPT, Team Offering | SW-1 + SW-6 | Migrate legacy ETL pipelines to AWS and implement them as data products with Python/PySpark, AWS Glue, Apache Iceberg, Athena, Airflow and Swisscom's internal ODP-Flow framework; contribute to the wider company migration |
|
||||
| P1 | ART B2B | SW-2 | Owned ETL pipeline components Oracle -> Teradata DWH: data quality, security and compliance, RCA, second- and third-level support, on-call |
|
||||
| P2 | ART B2B | SW-3 | Built and operated Python applications on Kubernetes, deployed through automated GitLab CI/CD pipelines across multiple environments |
|
||||
| P3 | ART B2B | SW-4 + SW-3 | Delivered dashboards and analyses for internal B2B stakeholders; refined the backlog with the PO |
|
||||
|
||||
**Bosch and earlier roles:**
|
||||
|
||||
| # | ID | As-built bullet (short form) |
|
||||
|---|---|---|
|
||||
| B1 | BS-8 | Normalized and transformed spatial wafer data between the CRSs of fab tools and systems; worked with it in Oracle (SDO_GEOMETRY) and TIBCO Spotfire to locate and analyze wafers, including performance tuning |
|
||||
| B2 | BS-5 | Built C# extensions and map-chart visualizations of wafer spatial variability in the co-owned Spotfire environment; co-presented at TIBCO Analytics Forum 2022 |
|
||||
| B3 | BS-3 | Technical Application Owner for KLA DMS and Spotfire: SLOs, vendor communication, user training, documentation |
|
||||
| B4 | BS-6 | Administered and automated the Linux servers with version-controlled Ansible run from Jenkins/GitLab; developed a credential plugin retrieving keystore secrets with local caching |
|
||||
| F1 | FC-1 | SCEDAS in C# on Microsoft SQL Server; set up Jenkins build jobs for automated deployment |
|
||||
| V1 | VZ-2 | Integrated automated test suites into CI/CD as quality gates |
|
||||
| G1 | GN-1 | Introduced BDD via PoC; technical responsibility for the test automation; trained project members |
|
||||
|
||||
**12 bullets.** No metrics (none verified). Capgemini, Bundeswehr, thesis and grades omitted. S3, Redshift and CloudFormation are not on the document: the user's current ART DPT stack list did not name them, and removing a skill makes no claim.
|
||||
|
||||
## Edit History
|
||||
- **2026-09-15, edit round 1 (user feedback).** Classification: **truth/provenance correction** + employer-specific presentation.
|
||||
- Truth: the first build wrote SW-2 (Teradata component ownership) and SW-3/SW-4 in **present tense** and the summary said "Owns ... Teradata". Those duties belong to ART B2B and are past. Now past tense under an ART B2B label; current work (SW-1, SW-6, SW-7) under ART DPT, Team Offering, in present tense.
|
||||
- Presentation: official internal title `Data, Analytics & AI Engineer IV (promoted from III, Apr 2025)` in the Swisscom header and headline; "Staff" removed from headline and summary; unit labels without dates; domain names (Fulfillment, Product Analysis) removed from the migration bullet per user.
|
||||
- Skills regrouped into current AWS data-product stack vs warehouse/operations; PySpark and Iceberg added (current, confirmed); S3, Redshift, CloudFormation dropped from the document.
|
||||
- Canonical: `claims.json` SWISSCOM title/org history and phase notes; Kafka and Kubernetes `production-historical`; Apache Iceberg added. CLAUDE.md KB log entry added.
|
||||
- Fit: no change to Evidence Fit 78, hard gate FAIL or classification.
|
||||
- **2026-09-15, edit round 2 (critique Tier 2, user decisions).** Classification: **fit/framing** + **truth/provenance** (scope).
|
||||
- Summary and B1: "geospatial wafer data" -> **"spatial wafer data"** (a Geomatik reader takes *geospatial* to mean Earth-referenced). `claims.json` BS-8 records the wording rule.
|
||||
- P2: "with GitLab CI/CD pipelines deploying across multiple environments" -> **"deployed through automated GitLab CI/CD pipelines across multiple environments"** - user clarified he worked with the automation and did not build it. `claims.json` SW-3 scope + forbidden ("built the CI/CD automation", "designed the CI/CD pipelines"); `experience_swisscom.md` SW-3 overclaiming variants flagged; CLAUDE.md log row extended.
|
||||
- Tier 2 items 3 (monitoring) and 4 (D2 stack list) declined by the user; no Tier 3 fixes applied.
|
||||
- Not material to the critique scores: both edits were the critique's own recommendations and narrow claims rather than add them.
|
||||
|
||||
## Validation and QA (final, 2026-09-15)
|
||||
- `validate_resume_system.py --document`: **PASS, 0 advisory warnings**; canonical system validator PASS
|
||||
- Compile: MiKTeX pdfTeX, **0 overfull/underfull boxes**, **2 pages**; PDF Author/Title empty
|
||||
- `page_metrics.py`: experience starts at **38.4%** of page 1 (run with MiKTeX's pdftotext on PATH - Git's mingw pdftotext fails on `-bbox`)
|
||||
- `pdftotext -enc UTF-8`: header, employer/title/date and unit-label order correct; en-dashes and umlauts extract cleanly; "geospatial" 0 occurrences
|
||||
- Visual inspection: page 1 re-inspected after edit round 2 - clean, both edits rendered, all Swisscom and Bosch evidence on page 1. Page 2 (Fraunhofer, Vizrt, Generali, Education) text verified unchanged
|
||||
- Submission copy: `Dennis_Thiessen_Resume.pdf` MD5 `cdb32ccac76255163717f7db96fff224`, identical to the build
|
||||
|
||||
## Document Quality
|
||||
- **89/100** (critique 2026-09-15): truth 24/25, hierarchy 19/20, bullet evidence 15/20, relevance 11/15, skills 10/10, mechanics 10/10. See `critique_swisscom_data_engineer_geo_platform.md`. Tier 2 items 1-2 applied afterwards; not re-scored.
|
||||
|
||||
## Cover Letter Decision
|
||||
- YES/NO: **NO**
|
||||
- Reason: user decision 2026-09-15 - not needed for internal applications. The ArcGIS/FME explanation belongs in the conversation with Marianne Temerowski (already contacted; she encouraged the application).
|
||||
|
||||
## Output Files
|
||||
- Resume: `e2e_swisscom_data_engineer_geo_platform_resume.tex` / `.pdf`
|
||||
- Submission copy: `Dennis_Thiessen_Resume.pdf`
|
||||
- Cover letter: intentionally omitted (user decision)
|
||||
- Critique: `critique_swisscom_data_engineer_geo_platform.md` (2026-09-15)
|
||||
|
||||
## Critique Summary
|
||||
- Date/status: **complete, 2026-09-15**, against the edit-round-1 build; Tier 2 items 1-2 applied afterwards (see Edit History)
|
||||
- Evidence Fit: **78** - classification **No-go on the gate, overridden by the user**; not described as framework-recommended for submission
|
||||
- Hard gate: **FAIL** - ArcGIS and FME required, never used
|
||||
- Document Quality: **89/100**
|
||||
- Channel Strength: **Moderate** (hiring manager contacted, encouraged the application)
|
||||
- Tier 1 fixes: **none in the document**; the hard gate is a fit issue, not fixable in writing
|
||||
- Tier 2 decisions: (1) applied; (2) applied as "worked with automated GitLab CI/CD"; (3) declined; (4) declined
|
||||
- Tier 3: not applied
|
||||
|
||||
## Status
|
||||
- Fit gate: **FAIL, overridden by user 2026-09-15** (classification unchanged: No-go on the gate)
|
||||
- Resume: **final** - edit round 2 applied, validated, compiled and inspected 2026-09-15
|
||||
- Cover letter: NO (user decision)
|
||||
- Critique: complete 2026-09-15 - Document Quality 89, no Tier 1
|
||||
- Finalization: **done 2026-09-15** - package files verified, validator re-run, submission copy created, application recorded in the tracker as **`app-535c5bfb3f94`** (outcome **open**, fit class no-go with override reason, Evidence Fit 78, hard gate fail, channel moderate, `contact_conversation` event for the Temerowski call); `current_applications.md` and `application_cohort.json` regenerated
|
||||
- Application/outcome: **SUBMITTED 2026-09-15** via the internal Swisscom Workday posting R-0006447 (user-reported) - tracker `app-535c5bfb3f94` updated to **applied**
|
||||
- Next: await response. Interview prep is in the critique, section 7 (ArcGIS/FME plainly unused; Bosch coordinate systems and transformations; geographic CRS as new ground).
|
||||
@@ -12,6 +12,8 @@
|
||||
|
||||
**Promotion signal to use:** "Promoted from Senior to Staff Engineer (Engineer IV) at Swisscom, April 2025."
|
||||
|
||||
**Current design evidence (SW-7, user-confirmed 2026-10-03):** Relational data modelling, design and implementation of scoped data products are Direct. Do not equate this with company-wide architecture or a confirmed duration of software design. Frontend experience was denied in the same clarification; backend JavaScript and UI testing do not support Full Stack positioning.
|
||||
|
||||
### Priority Matrix
|
||||
|
||||
| Priority | Achievement IDs | Rationale |
|
||||
@@ -122,3 +124,36 @@ Python, Kafka, AWS (S3 · Glue · Athena · Redshift · Airflow · CloudFormatio
|
||||
- Listing all tools in paragraph form
|
||||
- Mentioning Bundeswehr unless specifically relevant (leadership angle for management-adjacent roles)
|
||||
- Overplaying test automation background
|
||||
|
||||
## Infrastructure and Linux operations (BS-6) — added 2026-09-11, review F07
|
||||
|
||||
BS-6 was absent from every bundle although it has been canonical since 2026-08-27, so genuine strengths never reached the selection paths.
|
||||
|
||||
- **Linux administration and automation at Bosch (2020–2022):** Linux servers carried the ML platform, Docker hosts, backend services and the Ansible control path.
|
||||
- **Ansible beyond a single project:** configuration management and infrastructure automation, including self-written extensions (a credential plugin with local caching).
|
||||
- **Use it when** the JD names Linux, Ansible, configuration management, IaC or platform operations — exactly the DevOps/SRE-flavoured reqs where this profile reads thin without it.
|
||||
- **Currency limit, always state it:** employer-side Linux/Ansible ended Dec 2022; `PP-3` carries the current half and is a **personal** self-hosted Debian server. Never present PP-3 as employer work or as physical-datacenter evidence.
|
||||
- **GitOps remains forbidden:** playbooks lived in Git but ran push-based from Jenkins/GitLab with no reconciliation agent. The substance is writable as “version-controlled infrastructure automation with Ansible from Git, executed through Jenkins/GitLab pipelines”.
|
||||
|
||||
## Data-warehouse and mentoring evidence (added 2026-09-11 from the Arbeitszeugnisse)
|
||||
|
||||
Both were documented all along and reached no bundle, so the selection paths could not see them.
|
||||
Same failure mode as BS-6 (Linux/Ansible), found the same week.
|
||||
|
||||
- **Data warehouse (SW-2).** The Swisscom Zwischenzeugnis documents *Komponentenverantwortung* for
|
||||
the ETL pipelines that load business-critical Fulfillment data from Oracle into the **Teradata
|
||||
Data Warehouse (DWH)**. Use this whenever a JD names data warehousing — it was previously
|
||||
screened as absent, which cost a correct answer on at least one posting.
|
||||
**Scope limit:** this is documented **Betrieb** (operation) of a DWH, not **Aufbau**
|
||||
(construction). A required line saying *"Aufbau und Betrieb von Data-Warehouse-Lösungen"* is only
|
||||
half met — say which half.
|
||||
- **Microsoft SQL Server (FC-1).** Fraunhofer's SCEDAS ran on MSSQL with C# and Entity Framework.
|
||||
Historical and single-project; do not present it as data-platform depth.
|
||||
- **Mentoring (BS-7).** *"Fachliche Betreuung von Studierenden, auch im Rahmen von
|
||||
Abschlussarbeiten"* — documented technical supervision, including thesis supervision. He also
|
||||
served as **Zweitprüfer (second examiner) and supervisor for one Bachelor thesis** at Bosch
|
||||
(user-confirmed 2026-09-11) — a formal role carrying assessment responsibility, which is
|
||||
materially stronger than the team-role evidence the profile otherwise falls back on. Use it when
|
||||
a JD asks about developing other engineers (SBB asked explicitly and the answer had to fall back
|
||||
on Security Champion and the Java community). **Technical supervision and formal examining, NOT
|
||||
people management. Exactly one thesis as second examiner — do not pluralise.**
|
||||
@@ -66,9 +66,10 @@
|
||||
| SW-3 | K8s + GitLab | **Lead bullet** — "Deployed and operated Python data applications on Kubernetes with GitLab CI/CD; drove infrastructure automation in agile DevOps team" | K8s + CI/CD ownership = core platform signal |
|
||||
| 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-1 | ML inference | "Containerized and orchestrated ML inference (Docker, K8s, Ansible) into a continuously operating 24/7 semiconductor production environment" | Production-grade containerization in a continuously operating fab where a software defect could halt production. This is a failure consequence, not a deployment-window restriction. **Do not write *zero-downtime*** — canonical BS-1 evidences integration into continuous production, not a measured zero-downtime deployment property |
|
||||
| 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-6 | Linux/Ansible | "Administered and automated Linux servers carrying the ML platform, Docker hosts and backend services at Bosch; wrote Ansible extensions including a credential plugin with local caching" | **Infrastructure-as-Code and Linux operations evidence.** Added 2026-09-11 (review F07): BS-6 existed in `claims.json` and `experience_bosch.md` since 2026-08-27 but appeared in NO bundle, so the selection paths could not see it. Currency limit: employer-side Linux/Ansible ended Dec 2022; `PP-3` (personal Debian server) carries the current half and must be named as personal. GitOps stays forbidden — execution was push-based from Jenkins/GitLab, not agent-reconciled |
|
||||
| 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 |
|
||||
| FC-1 | CI/CD initiative | "Independently introduced Jenkins CI/CD pipeline with quality gates at Fraunhofer CML — first build automation adopted by the research team" | Initiative: built CI/CD from zero |
|
||||
@@ -140,3 +141,26 @@ Kubernetes, Docker, AWS (S3 · Glue · Athena · Redshift · CloudFormation), Ka
|
||||
- Claiming SRE/pure DevOps title (you were a data engineer with platform ownership)
|
||||
- Overstating Terraform/Helm experience (not confirmed — do not claim)
|
||||
- Mentioning SCEDAS, maritime research, BDD, or RPA
|
||||
|
||||
## Data-warehouse and mentoring evidence (added 2026-09-11 from the Arbeitszeugnisse)
|
||||
|
||||
Both were documented all along and reached no bundle, so the selection paths could not see them.
|
||||
Same failure mode as BS-6 (Linux/Ansible), found the same week.
|
||||
|
||||
- **Data warehouse (SW-2).** The Swisscom Zwischenzeugnis documents *Komponentenverantwortung* for
|
||||
the ETL pipelines that load business-critical Fulfillment data from Oracle into the **Teradata
|
||||
Data Warehouse (DWH)**. Use this whenever a JD names data warehousing — it was previously
|
||||
screened as absent, which cost a correct answer on at least one posting.
|
||||
**Scope limit:** this is documented **Betrieb** (operation) of a DWH, not **Aufbau**
|
||||
(construction). A required line saying *"Aufbau und Betrieb von Data-Warehouse-Lösungen"* is only
|
||||
half met — say which half.
|
||||
- **Microsoft SQL Server (FC-1).** Fraunhofer's SCEDAS ran on MSSQL with C# and Entity Framework.
|
||||
Historical and single-project; do not present it as data-platform depth.
|
||||
- **Mentoring (BS-7).** *"Fachliche Betreuung von Studierenden, auch im Rahmen von
|
||||
Abschlussarbeiten"* — documented technical supervision, including thesis supervision. He also
|
||||
served as **Zweitprüfer (second examiner) and supervisor for one Bachelor thesis** at Bosch
|
||||
(user-confirmed 2026-09-11) — a formal role carrying assessment responsibility, which is
|
||||
materially stronger than the team-role evidence the profile otherwise falls back on. Use it when
|
||||
a JD asks about developing other engineers (SBB asked explicitly and the answer had to fall back
|
||||
on Security Champion and the Java community). **Technical supervision and formal examining, NOT
|
||||
people management. Exactly one thesis as second examiner — do not pluralise.**
|
||||
@@ -71,14 +71,16 @@
|
||||
## S4: Skills Guide
|
||||
|
||||
**Bold tools (resume Technical Skills section):**
|
||||
Python, Kubernetes, Docker, AWS (S3 · Glue · Athena · Airflow), Kafka, PyTorch · Scikit-learn
|
||||
Python, Kubernetes, Docker, AWS (S3 · Glue · Athena · Airflow), Kafka, Scikit-learn
|
||||
*(PyTorch and TensorFlow/Keras are **certification-context-only** in `claims.json` — list them only beside the IBM AI Engineering certificate, never as production tooling.)*
|
||||
|
||||
**Must-include skills (ATS match):**
|
||||
- Python, MLOps, ML inference deployment
|
||||
- Docker, Kubernetes, Ansible
|
||||
- AWS (S3, Glue, Athena, Redshift, Airflow), Apache Iceberg
|
||||
- Apache Kafka
|
||||
- PyTorch, Scikit-learn, Pandas, NumPy
|
||||
- Scikit-learn, Pandas, NumPy
|
||||
- PyTorch / TensorFlow **only with certification context** — see the note above; a bare ATS listing is the exact way the context gets lost
|
||||
- CI/CD (GitLab, Jenkins)
|
||||
|
||||
**Nice-to-have (include if JD mentions):**
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -2,22 +2,68 @@
|
||||
"schema_version": 1,
|
||||
"policy": "Generated output is never a source for a new application. Regenerate from canonical claims and normalized experience files.",
|
||||
"unsafe_do_not_reuse": [
|
||||
{"folder": "output/Apple_Data_Engineer", "reasons": ["fabricated LangChain", "unsupported petabyte scale", "overstated platform and agentic ownership"]},
|
||||
{"folder": "output/Infineon_AI_Engineer", "reasons": ["fabricated LangChain"]},
|
||||
{"folder": "output/Equinor_AI_Manager", "reasons": ["unsupported model serving and evaluation", "inflated responsible-AI and security ownership"]},
|
||||
{"folder": "output/Microsoft_ISE_Senior_SWE", "reasons": ["unsupported model-evaluation skill", "customer-delivery framing exceeds verified evidence"]},
|
||||
{"folder": "output/Kraken_SRE_AI_Agents", "reasons": ["Security Champion scope inflation", "stretch-role framing requires complete regeneration"]},
|
||||
{"folder": "output/Kraken_AI_Infrastructure", "reasons": ["pre-canonical package", "agent-infrastructure bridges require revalidation"]}
|
||||
{
|
||||
"folder": "output/Apple_Data_Engineer",
|
||||
"reasons": [
|
||||
"fabricated LangChain",
|
||||
"unsupported petabyte scale",
|
||||
"overstated platform and agentic ownership"
|
||||
]
|
||||
},
|
||||
{
|
||||
"folder": "output/Infineon_AI_Engineer",
|
||||
"reasons": [
|
||||
"fabricated LangChain"
|
||||
]
|
||||
},
|
||||
{
|
||||
"folder": "output/Equinor_AI_Manager",
|
||||
"reasons": [
|
||||
"unsupported model serving and evaluation",
|
||||
"inflated responsible-AI and security ownership"
|
||||
]
|
||||
},
|
||||
{
|
||||
"folder": "output/Microsoft_ISE_Senior_SWE",
|
||||
"reasons": [
|
||||
"unsupported model-evaluation skill",
|
||||
"customer-delivery framing exceeds verified evidence"
|
||||
]
|
||||
},
|
||||
{
|
||||
"folder": "output/Kraken_SRE_AI_Agents",
|
||||
"reasons": [
|
||||
"Security Champion scope inflation",
|
||||
"stretch-role framing requires complete regeneration"
|
||||
]
|
||||
},
|
||||
{
|
||||
"folder": "output/Kraken_AI_Infrastructure",
|
||||
"reasons": [
|
||||
"pre-canonical package",
|
||||
"agent-infrastructure bridges require revalidation"
|
||||
]
|
||||
}
|
||||
],
|
||||
"historical_revalidate": [
|
||||
"output/Google_Senior_Data_Engineer",
|
||||
"output/Snowflake_Observe_Enterprise",
|
||||
"output/QuantCo_Cloud_Engineer",
|
||||
"output/NATO_AI_ENGINEER",
|
||||
"output/AkerBP_Data_Product_Architect",
|
||||
"output/BIS",
|
||||
"output/Isovalent_DataEngineer",
|
||||
"output/CitadelSecurities_PlatformEngineer",
|
||||
"output/Google_Business_Home",
|
||||
"output/Google_Senior_Data_Engineer",
|
||||
"output/Infineon",
|
||||
"output/Microsoft_Principal_FDE_SWE"
|
||||
"output/Isovalent_DataEngineer",
|
||||
"output/KdoCy_DevOps_Data_Platform",
|
||||
"output/Microsoft_Principal_FDE_SWE",
|
||||
"output/NATO_AI_ENGINEER",
|
||||
"output/NVIDIA_SrDevOps_Zurich",
|
||||
"output/QuantCo_Cloud_Engineer",
|
||||
"output/RUAG_AI_Engineer_C5I",
|
||||
"output/SBB_DataEngineer_AssetMgmt",
|
||||
"output/Snowflake_Observe_Enterprise"
|
||||
],
|
||||
"paused_no_package": ["output/Google_FDE_GenAI"]
|
||||
"paused_no_package": [
|
||||
"output/Google_FDE_GenAI"
|
||||
],
|
||||
"classification_default": "Any package folder NOT listed in this file defaults to historical_revalidate: never reuse a bullet from it without re-checking the claim against claims.json first. Recorded 2026-09-11 (review finding F17), which found 8 unclassified folders against 14 classified ones. The seven application packages among them were added to historical_revalidate; being recent is not the same as being verified, and none of them was re-read for this classification."
|
||||
}
|
||||
@@ -0,0 +1,527 @@
|
||||
{
|
||||
"schema_version": 2,
|
||||
"generated_note": "Generated by package_manifest.py (review finding F17). A PDF in a folder is not evidence that the package is reproducible. Source and class hashes detect edits; optional pdf_artifacts are observations, not verified source-to-PDF mappings. Absent PDFs are allowed; present PDFs must match their recorded hash. Nothing here authorises rewriting a submitted document.",
|
||||
"packages": {
|
||||
"AkerBP_Data_Product_Architect": {
|
||||
"sources": {
|
||||
"e2e_akerbp_data_product_architect_cover_letter.tex": "922759ac4bc7a52c",
|
||||
"e2e_akerbp_data_product_architect_resume.tex": "d0a0f9942a882567"
|
||||
},
|
||||
"class_files": {
|
||||
"resume.cls": "b3a032a850cd0d6d"
|
||||
},
|
||||
"requires_class": [
|
||||
"article",
|
||||
"resume"
|
||||
],
|
||||
"uses_today": [],
|
||||
"problems": [],
|
||||
"pdf_artifacts": {
|
||||
"Dennis_Thiessen_Cover_Letter.pdf": "76c7dacfb00b5df3",
|
||||
"Dennis_Thiessen_Resume.pdf": "0023acf689a8b4e7",
|
||||
"e2e_akerbp_data_product_architect_cover_letter.pdf": "76c7dacfb00b5df3",
|
||||
"e2e_akerbp_data_product_architect_resume.pdf": "0023acf689a8b4e7"
|
||||
},
|
||||
"reuse_classification": "recorded"
|
||||
},
|
||||
"Apple_Data_Engineer": {
|
||||
"sources": {
|
||||
"e2e_apple_data_engineer_cover_letter.tex": "34abad48e3a82634",
|
||||
"e2e_apple_data_engineer_resume.tex": "c3594ddcb32131da"
|
||||
},
|
||||
"class_files": {
|
||||
"resume.cls": "721ed8d5e80fcc54"
|
||||
},
|
||||
"requires_class": [
|
||||
"moderncv",
|
||||
"resume"
|
||||
],
|
||||
"uses_today": [
|
||||
"e2e_apple_data_engineer_cover_letter.tex"
|
||||
],
|
||||
"problems": [
|
||||
"rebuild is date-dependent: e2e_apple_data_engineer_cover_letter.tex use \\today, so recompiling a historical package silently restamps it with the current date. New packages must carry the explicit application date instead."
|
||||
],
|
||||
"pdf_artifacts": {
|
||||
"e2e_apple_data_engineer_cover_letter.pdf": "06ee82291bbc9a4c",
|
||||
"e2e_apple_data_engineer_resume.pdf": "37aeb66d208346f5"
|
||||
},
|
||||
"reuse_classification": "recorded"
|
||||
},
|
||||
"BIS": {
|
||||
"sources": {
|
||||
"e2e_bis_senior_data_analytics_ai_cover_letter.tex": "4f037d7fcfd1ccfc",
|
||||
"e2e_bis_senior_data_analytics_ai_resume.tex": "4ecc6a98ab82ea2b"
|
||||
},
|
||||
"class_files": {
|
||||
"resume.cls": "721ed8d5e80fcc54"
|
||||
},
|
||||
"requires_class": [
|
||||
"moderncv",
|
||||
"resume"
|
||||
],
|
||||
"uses_today": [
|
||||
"e2e_bis_senior_data_analytics_ai_cover_letter.tex"
|
||||
],
|
||||
"problems": [
|
||||
"rebuild is date-dependent: e2e_bis_senior_data_analytics_ai_cover_letter.tex use \\today, so recompiling a historical package silently restamps it with the current date. New packages must carry the explicit application date instead."
|
||||
],
|
||||
"pdf_artifacts": {
|
||||
"Dennis_Thiessen_Cover_Letter.pdf": "c584d131e37899fa",
|
||||
"Dennis_Thiessen_Resume.pdf": "5b554ae2e658d960",
|
||||
"e2e_bis_senior_data_analytics_ai_cover_letter.pdf": "c584d131e37899fa",
|
||||
"e2e_bis_senior_data_analytics_ai_resume.pdf": "5b554ae2e658d960"
|
||||
},
|
||||
"reuse_classification": "recorded"
|
||||
},
|
||||
"CitadelSecurities_PlatformEngineer": {
|
||||
"sources": {
|
||||
"e2e_citadel_securities_platform_engineer_cover_letter.tex": "4f2bf629635d3413",
|
||||
"e2e_citadel_securities_platform_engineer_resume.tex": "5f2ac36737162b29"
|
||||
},
|
||||
"class_files": {
|
||||
"resume.cls": "b3a032a850cd0d6d"
|
||||
},
|
||||
"requires_class": [
|
||||
"article",
|
||||
"resume"
|
||||
],
|
||||
"uses_today": [],
|
||||
"problems": [],
|
||||
"pdf_artifacts": {
|
||||
"Dennis_Thiessen_Cover_Letter.pdf": "e95631c56fd02a71",
|
||||
"Dennis_Thiessen_Resume.pdf": "cb7a13b2215796f2",
|
||||
"e2e_citadel_securities_platform_engineer_cover_letter.pdf": "e95631c56fd02a71",
|
||||
"e2e_citadel_securities_platform_engineer_resume.pdf": "cb7a13b2215796f2"
|
||||
},
|
||||
"reuse_classification": "recorded"
|
||||
},
|
||||
"Equinor_AI_Manager": {
|
||||
"sources": {
|
||||
"e2e_equinor_ai_manager_cover_letter.tex": "390a7ea37836a93d",
|
||||
"e2e_equinor_ai_manager_resume.tex": "f57087d53a777328"
|
||||
},
|
||||
"class_files": {
|
||||
"resume.cls": "721ed8d5e80fcc54"
|
||||
},
|
||||
"requires_class": [
|
||||
"moderncv",
|
||||
"resume"
|
||||
],
|
||||
"uses_today": [
|
||||
"e2e_equinor_ai_manager_cover_letter.tex"
|
||||
],
|
||||
"problems": [
|
||||
"rebuild is date-dependent: e2e_equinor_ai_manager_cover_letter.tex use \\today, so recompiling a historical package silently restamps it with the current date. New packages must carry the explicit application date instead."
|
||||
],
|
||||
"pdf_artifacts": {
|
||||
"Dennis_Thiessen_Cover_Letter.pdf": "224303daba825066",
|
||||
"Dennis_Thiessen_Resume.pdf": "634e207667086dd7",
|
||||
"e2e_equinor_ai_manager_cover_letter.pdf": "224303daba825066",
|
||||
"e2e_equinor_ai_manager_resume.pdf": "634e207667086dd7"
|
||||
},
|
||||
"reuse_classification": "recorded"
|
||||
},
|
||||
"Google_Business_Home": {
|
||||
"sources": {
|
||||
"e2e_google_software_engineer_iii_business_home_cover_letter.tex": "c68e33850a6baf42",
|
||||
"e2e_google_software_engineer_iii_business_home_cover_letter_v2.tex": "2fe40e60a2defb12",
|
||||
"e2e_google_software_engineer_iii_business_home_resume.tex": "f47788e596d87529",
|
||||
"e2e_google_software_engineer_iii_business_home_resume_v2.tex": "d895021d7b5850cb"
|
||||
},
|
||||
"class_files": {
|
||||
"resume.cls": "b3a032a850cd0d6d"
|
||||
},
|
||||
"requires_class": [
|
||||
"article",
|
||||
"resume"
|
||||
],
|
||||
"uses_today": [],
|
||||
"problems": [],
|
||||
"pdf_artifacts": {
|
||||
"Dennis_Thiessen_Cover_Letter.pdf": "57c111039dc2c4ee",
|
||||
"Dennis_Thiessen_Resume.pdf": "e9fe51e4661fc36c",
|
||||
"e2e_google_software_engineer_iii_business_home_cover_letter.pdf": "e3643f9d623e404d",
|
||||
"e2e_google_software_engineer_iii_business_home_cover_letter_v2.pdf": "57c111039dc2c4ee",
|
||||
"e2e_google_software_engineer_iii_business_home_resume.pdf": "c4cb40153f7af748",
|
||||
"e2e_google_software_engineer_iii_business_home_resume_v2.pdf": "e9fe51e4661fc36c"
|
||||
},
|
||||
"reuse_classification": "recorded"
|
||||
},
|
||||
"Google_Senior_Data_Engineer": {
|
||||
"sources": {
|
||||
"e2e_google_senior_data_engineer_cover_letter.tex": "966fd9ff789fb4a4",
|
||||
"e2e_google_senior_data_engineer_resume.tex": "1e3e56ab426172ab"
|
||||
},
|
||||
"class_files": {
|
||||
"resume.cls": "721ed8d5e80fcc54"
|
||||
},
|
||||
"requires_class": [
|
||||
"moderncv",
|
||||
"resume"
|
||||
],
|
||||
"uses_today": [
|
||||
"e2e_google_senior_data_engineer_cover_letter.tex"
|
||||
],
|
||||
"problems": [
|
||||
"rebuild is date-dependent: e2e_google_senior_data_engineer_cover_letter.tex use \\today, so recompiling a historical package silently restamps it with the current date. New packages must carry the explicit application date instead."
|
||||
],
|
||||
"pdf_artifacts": {
|
||||
"Dennis_Thiessen_Cover_Letter.pdf": "c826c22521359372",
|
||||
"Dennis_Thiessen_Resume.pdf": "25121fee8915acd3",
|
||||
"e2e_google_senior_data_engineer_cover_letter.pdf": "c826c22521359372",
|
||||
"e2e_google_senior_data_engineer_resume.pdf": "25121fee8915acd3"
|
||||
},
|
||||
"reuse_classification": "recorded"
|
||||
},
|
||||
"Infineon": {
|
||||
"sources": {
|
||||
"e2e_infineon_doctoral_cover_letter.tex": "4149a4a2ed2f619f",
|
||||
"e2e_infineon_doctoral_resume.tex": "090946510d744691"
|
||||
},
|
||||
"class_files": {
|
||||
"resume.cls": "721ed8d5e80fcc54"
|
||||
},
|
||||
"requires_class": [
|
||||
"moderncv",
|
||||
"resume"
|
||||
],
|
||||
"uses_today": [
|
||||
"e2e_infineon_doctoral_cover_letter.tex"
|
||||
],
|
||||
"problems": [
|
||||
"rebuild is date-dependent: e2e_infineon_doctoral_cover_letter.tex use \\today, so recompiling a historical package silently restamps it with the current date. New packages must carry the explicit application date instead."
|
||||
],
|
||||
"pdf_artifacts": {
|
||||
"Dennis_Thiessen_Cover_Letter.pdf": "5d785ca3c4b1a903",
|
||||
"Dennis_Thiessen_Resume.pdf": "a445f2351982b735",
|
||||
"e2e_infineon_doctoral_cover_letter.pdf": "5d785ca3c4b1a903",
|
||||
"e2e_infineon_doctoral_resume.pdf": "a445f2351982b735"
|
||||
},
|
||||
"reuse_classification": "recorded"
|
||||
},
|
||||
"Infineon_AI_Engineer": {
|
||||
"sources": {
|
||||
"e2e_infineon_ai_engineer_cover_letter.tex": "a8cccec6b8d685b9",
|
||||
"e2e_infineon_ai_engineer_resume.tex": "b7957e35ee342bca"
|
||||
},
|
||||
"class_files": {
|
||||
"resume.cls": "721ed8d5e80fcc54"
|
||||
},
|
||||
"requires_class": [
|
||||
"moderncv",
|
||||
"resume"
|
||||
],
|
||||
"uses_today": [
|
||||
"e2e_infineon_ai_engineer_cover_letter.tex"
|
||||
],
|
||||
"problems": [
|
||||
"rebuild is date-dependent: e2e_infineon_ai_engineer_cover_letter.tex use \\today, so recompiling a historical package silently restamps it with the current date. New packages must carry the explicit application date instead."
|
||||
],
|
||||
"pdf_artifacts": {
|
||||
"e2e_infineon_ai_engineer_resume.pdf": "810ec7007a8bfe8e"
|
||||
},
|
||||
"reuse_classification": "recorded"
|
||||
},
|
||||
"Isovalent_DataEngineer": {
|
||||
"sources": {
|
||||
"e2e_isovalent_data_engineer_cover_letter.tex": "33c6a2943f288893",
|
||||
"e2e_isovalent_data_engineer_resume.tex": "b8edf89223ef8fb2"
|
||||
},
|
||||
"class_files": {
|
||||
"resume.cls": "721ed8d5e80fcc54"
|
||||
},
|
||||
"requires_class": [
|
||||
"moderncv",
|
||||
"resume"
|
||||
],
|
||||
"uses_today": [
|
||||
"e2e_isovalent_data_engineer_cover_letter.tex"
|
||||
],
|
||||
"problems": [
|
||||
"rebuild is date-dependent: e2e_isovalent_data_engineer_cover_letter.tex use \\today, so recompiling a historical package silently restamps it with the current date. New packages must carry the explicit application date instead."
|
||||
],
|
||||
"pdf_artifacts": {
|
||||
"Dennis_Thiessen_Cover_Letter.pdf": "546364b3102d00b7",
|
||||
"Dennis_Thiessen_Resume.pdf": "f35745cc987473fc",
|
||||
"e2e_isovalent_data_engineer_cover_letter.pdf": "546364b3102d00b7",
|
||||
"e2e_isovalent_data_engineer_resume.pdf": "f35745cc987473fc"
|
||||
},
|
||||
"reuse_classification": "recorded"
|
||||
},
|
||||
"KdoCy_DevOps_Data_Platform": {
|
||||
"sources": {
|
||||
"e2e_kdocy_devops_data_platform_cover_letter.tex": "29d114255a1310cc",
|
||||
"e2e_kdocy_devops_data_platform_resume.tex": "de3fcb42d1c5c478"
|
||||
},
|
||||
"class_files": {
|
||||
"resume.cls": "b3a032a850cd0d6d"
|
||||
},
|
||||
"requires_class": [
|
||||
"article",
|
||||
"resume"
|
||||
],
|
||||
"uses_today": [
|
||||
"e2e_kdocy_devops_data_platform_cover_letter.tex"
|
||||
],
|
||||
"problems": [
|
||||
"rebuild is date-dependent: e2e_kdocy_devops_data_platform_cover_letter.tex use \\today, so recompiling a historical package silently restamps it with the current date. New packages must carry the explicit application date instead."
|
||||
],
|
||||
"pdf_artifacts": {
|
||||
"Dennis_Thiessen_Lebenslauf.pdf": "ec9fbeb6864a43da",
|
||||
"Dennis_Thiessen_Motivationsschreiben.pdf": "53be036b3ce12148",
|
||||
"e2e_kdocy_devops_data_platform_cover_letter.pdf": "55d7aa1fd97b2eb6",
|
||||
"e2e_kdocy_devops_data_platform_resume.pdf": "4929981906919523"
|
||||
},
|
||||
"reuse_classification": "recorded"
|
||||
},
|
||||
"Kraken_AI_Infrastructure": {
|
||||
"sources": {
|
||||
"e2e_kraken_ai_infra_cover_letter.tex": "32eb97aedefb1702",
|
||||
"e2e_kraken_ai_infra_resume.tex": "14350c33e1dbc18e"
|
||||
},
|
||||
"class_files": {
|
||||
"resume.cls": "721ed8d5e80fcc54"
|
||||
},
|
||||
"requires_class": [
|
||||
"moderncv",
|
||||
"resume"
|
||||
],
|
||||
"uses_today": [
|
||||
"e2e_kraken_ai_infra_cover_letter.tex"
|
||||
],
|
||||
"problems": [
|
||||
"rebuild is date-dependent: e2e_kraken_ai_infra_cover_letter.tex use \\today, so recompiling a historical package silently restamps it with the current date. New packages must carry the explicit application date instead."
|
||||
],
|
||||
"pdf_artifacts": {
|
||||
"Dennis_Thiessen_Cover_Letter.pdf": "10d0deb132c3ecd8",
|
||||
"Dennis_Thiessen_Resume.pdf": "0ff9a52ceb6521a3",
|
||||
"e2e_kraken_ai_infra_cover_letter.pdf": "10d0deb132c3ecd8",
|
||||
"e2e_kraken_ai_infra_resume.pdf": "0ff9a52ceb6521a3",
|
||||
"Senior Software Engineer – AI Infrastructure @ Kraken.pdf": "716232dd1d83cbfc"
|
||||
},
|
||||
"reuse_classification": "recorded"
|
||||
},
|
||||
"Kraken_SRE_AI_Agents": {
|
||||
"sources": {
|
||||
"e2e_kraken_sre_ai_agents_cover_letter.tex": "bf215661bc0e6936",
|
||||
"e2e_kraken_sre_ai_agents_resume.tex": "b8d1a3cfae03186a"
|
||||
},
|
||||
"class_files": {
|
||||
"resume.cls": "721ed8d5e80fcc54"
|
||||
},
|
||||
"requires_class": [
|
||||
"moderncv",
|
||||
"resume"
|
||||
],
|
||||
"uses_today": [
|
||||
"e2e_kraken_sre_ai_agents_cover_letter.tex"
|
||||
],
|
||||
"problems": [
|
||||
"rebuild is date-dependent: e2e_kraken_sre_ai_agents_cover_letter.tex use \\today, so recompiling a historical package silently restamps it with the current date. New packages must carry the explicit application date instead."
|
||||
],
|
||||
"pdf_artifacts": {
|
||||
"Dennis_Thiessen_Cover_Letter.pdf": "a08cff46ef5f4653",
|
||||
"Dennis_Thiessen_Resume.pdf": "9c04ea9735e8611a",
|
||||
"e2e_kraken_sre_ai_agents_cover_letter.pdf": "a08cff46ef5f4653",
|
||||
"e2e_kraken_sre_ai_agents_resume.pdf": "9c04ea9735e8611a"
|
||||
},
|
||||
"reuse_classification": "recorded"
|
||||
},
|
||||
"Microsoft_ISE_Senior_SWE": {
|
||||
"sources": {
|
||||
"e2e_microsoft_ise_cover_letter.tex": "72ea729b7bd5c8da",
|
||||
"e2e_microsoft_ise_resume.tex": "f61845e8087b5696"
|
||||
},
|
||||
"class_files": {
|
||||
"resume.cls": "721ed8d5e80fcc54"
|
||||
},
|
||||
"requires_class": [
|
||||
"moderncv",
|
||||
"resume"
|
||||
],
|
||||
"uses_today": [
|
||||
"e2e_microsoft_ise_cover_letter.tex"
|
||||
],
|
||||
"problems": [
|
||||
"rebuild is date-dependent: e2e_microsoft_ise_cover_letter.tex use \\today, so recompiling a historical package silently restamps it with the current date. New packages must carry the explicit application date instead."
|
||||
],
|
||||
"pdf_artifacts": {
|
||||
"Dennis_Thiessen_Cover_Letter.pdf": "7f6df9105f06f572",
|
||||
"Dennis_Thiessen_Resume.pdf": "8c4f308234298916",
|
||||
"e2e_microsoft_ise_cover_letter.pdf": "7f6df9105f06f572",
|
||||
"e2e_microsoft_ise_resume.pdf": "8c4f308234298916"
|
||||
},
|
||||
"reuse_classification": "recorded"
|
||||
},
|
||||
"Microsoft_Principal_FDE_SWE": {
|
||||
"sources": {
|
||||
"e2e_microsoft_principal_fde_swe_cover_letter.tex": "8095827a769ece44",
|
||||
"e2e_microsoft_principal_fde_swe_resume.tex": "5be341c9dcccca28"
|
||||
},
|
||||
"class_files": {
|
||||
"resume.cls": "721ed8d5e80fcc54"
|
||||
},
|
||||
"requires_class": [
|
||||
"moderncv",
|
||||
"resume"
|
||||
],
|
||||
"uses_today": [
|
||||
"e2e_microsoft_principal_fde_swe_cover_letter.tex"
|
||||
],
|
||||
"problems": [
|
||||
"rebuild is date-dependent: e2e_microsoft_principal_fde_swe_cover_letter.tex use \\today, so recompiling a historical package silently restamps it with the current date. New packages must carry the explicit application date instead."
|
||||
],
|
||||
"pdf_artifacts": {
|
||||
"Dennis_Thiessen_Cover_Letter.pdf": "bf00c589a7742547",
|
||||
"Dennis_Thiessen_Resume.pdf": "9a95e3452e2e3539",
|
||||
"e2e_microsoft_principal_fde_swe_cover_letter.pdf": "bf00c589a7742547",
|
||||
"e2e_microsoft_principal_fde_swe_resume.pdf": "9a95e3452e2e3539"
|
||||
},
|
||||
"reuse_classification": "recorded"
|
||||
},
|
||||
"NATO_AI_ENGINEER": {
|
||||
"sources": {
|
||||
"e2e_nato_ai_engineer_cover_letter.tex": "863c590ea8a987c1",
|
||||
"e2e_nato_ai_engineer_resume.tex": "e3b80997712dd9d7"
|
||||
},
|
||||
"class_files": {},
|
||||
"requires_class": [
|
||||
"moderncv",
|
||||
"resume"
|
||||
],
|
||||
"uses_today": [],
|
||||
"problems": [
|
||||
"source distribution incomplete: requires resume.cls, which is not in the folder. A build here only succeeds if a copy happens to exist elsewhere on the machine. Do NOT repair by copying the newest class in - the repo carries several class variants and older macros differ."
|
||||
],
|
||||
"pdf_artifacts": {
|
||||
"Dennis_Thiessen_Cover_Letter.pdf": "0239a9ca995cb825",
|
||||
"Dennis_Thiessen_Resume.pdf": "3d96a1e30b0adb64",
|
||||
"e2e_nato_ai_engineer_resume.pdf": "428e242a2ca7b453"
|
||||
},
|
||||
"reuse_classification": "recorded"
|
||||
},
|
||||
"NVIDIA_SrDevOps_Zurich": {
|
||||
"sources": {
|
||||
"e2e_nvidia_sr_devops_cover_letter.tex": "2252b98f7a7e0ca0",
|
||||
"e2e_nvidia_sr_devops_resume.tex": "69787364df7d6f02"
|
||||
},
|
||||
"class_files": {
|
||||
"resume.cls": "b3a032a850cd0d6d"
|
||||
},
|
||||
"requires_class": [
|
||||
"article",
|
||||
"resume"
|
||||
],
|
||||
"uses_today": [
|
||||
"e2e_nvidia_sr_devops_cover_letter.tex"
|
||||
],
|
||||
"problems": [
|
||||
"rebuild is date-dependent: e2e_nvidia_sr_devops_cover_letter.tex use \\today, so recompiling a historical package silently restamps it with the current date. New packages must carry the explicit application date instead."
|
||||
],
|
||||
"pdf_artifacts": {
|
||||
"Dennis_Thiessen_Cover_Letter.pdf": "275a8a10fb9bb9eb",
|
||||
"Dennis_Thiessen_Resume.pdf": "03ea1f4fe89d6fbf",
|
||||
"e2e_nvidia_sr_devops_cover_letter.pdf": "275a8a10fb9bb9eb",
|
||||
"e2e_nvidia_sr_devops_resume.pdf": "03ea1f4fe89d6fbf"
|
||||
},
|
||||
"reuse_classification": "recorded"
|
||||
},
|
||||
"QuantCo_Cloud_Engineer": {
|
||||
"sources": {
|
||||
"e2e_quantco_cloud_engineer_cover_letter.tex": "f8ef588da7fe1232",
|
||||
"e2e_quantco_cloud_engineer_resume.tex": "a8ebc1b56f623949"
|
||||
},
|
||||
"class_files": {
|
||||
"resume.cls": "721ed8d5e80fcc54"
|
||||
},
|
||||
"requires_class": [
|
||||
"moderncv",
|
||||
"resume"
|
||||
],
|
||||
"uses_today": [
|
||||
"e2e_quantco_cloud_engineer_cover_letter.tex"
|
||||
],
|
||||
"problems": [
|
||||
"rebuild is date-dependent: e2e_quantco_cloud_engineer_cover_letter.tex use \\today, so recompiling a historical package silently restamps it with the current date. New packages must carry the explicit application date instead."
|
||||
],
|
||||
"pdf_artifacts": {
|
||||
"Dennis_Thiessen_Cover_Letter.pdf": "484a41d552102b4f",
|
||||
"Dennis_Thiessen_Resume.pdf": "564338361852073f",
|
||||
"e2e_quantco_cloud_engineer_cover_letter.pdf": "484a41d552102b4f",
|
||||
"e2e_quantco_cloud_engineer_resume.pdf": "564338361852073f"
|
||||
},
|
||||
"reuse_classification": "recorded"
|
||||
},
|
||||
"RUAG_AI_Engineer_C5I": {
|
||||
"sources": {
|
||||
"e2e_ruag_ai_engineer_c5i_cover_letter.tex": "2b3d966dc0590b08",
|
||||
"e2e_ruag_ai_engineer_c5i_resume.tex": "2cf799344c3d91c6"
|
||||
},
|
||||
"class_files": {
|
||||
"resume.cls": "b52a6f7123ae9067"
|
||||
},
|
||||
"requires_class": [
|
||||
"article",
|
||||
"resume"
|
||||
],
|
||||
"uses_today": [
|
||||
"e2e_ruag_ai_engineer_c5i_cover_letter.tex"
|
||||
],
|
||||
"problems": [
|
||||
"rebuild is date-dependent: e2e_ruag_ai_engineer_c5i_cover_letter.tex use \\today, so recompiling a historical package silently restamps it with the current date. New packages must carry the explicit application date instead."
|
||||
],
|
||||
"pdf_artifacts": {
|
||||
"Dennis_Thiessen_Lebenslauf.pdf": "f29ab6445b4e7ff5",
|
||||
"Dennis_Thiessen_Motivationsschreiben.pdf": "336d54ed07f205c7",
|
||||
"e2e_ruag_ai_engineer_c5i_cover_letter.pdf": "336d54ed07f205c7",
|
||||
"e2e_ruag_ai_engineer_c5i_resume.pdf": "f29ab6445b4e7ff5"
|
||||
},
|
||||
"reuse_classification": "recorded"
|
||||
},
|
||||
"SBB_DataEngineer_AssetMgmt": {
|
||||
"sources": {
|
||||
"e2e_sbb_data_engineer_asset_mgmt_resume.tex": "cd4e8a18fa0a235a"
|
||||
},
|
||||
"class_files": {
|
||||
"resume.cls": "b3a032a850cd0d6d"
|
||||
},
|
||||
"requires_class": [
|
||||
"resume"
|
||||
],
|
||||
"uses_today": [],
|
||||
"problems": [],
|
||||
"pdf_artifacts": {
|
||||
"e2e_sbb_data_engineer_asset_mgmt_resume.pdf": "669fedaa340a89c7"
|
||||
},
|
||||
"reuse_classification": "recorded"
|
||||
},
|
||||
"Snowflake_Observe_Enterprise": {
|
||||
"sources": {
|
||||
"e2e_snowflake_observe_enterprise_cover_letter.tex": "f0d01764e943776f",
|
||||
"e2e_snowflake_observe_enterprise_resume.tex": "cde2a2326fa2913e"
|
||||
},
|
||||
"class_files": {
|
||||
"cv.cls": "30bf0ca5b3d0b718",
|
||||
"resume.cls": "721ed8d5e80fcc54"
|
||||
},
|
||||
"requires_class": [
|
||||
"moderncv",
|
||||
"resume"
|
||||
],
|
||||
"uses_today": [
|
||||
"e2e_snowflake_observe_enterprise_cover_letter.tex"
|
||||
],
|
||||
"problems": [
|
||||
"rebuild is date-dependent: e2e_snowflake_observe_enterprise_cover_letter.tex use \\today, so recompiling a historical package silently restamps it with the current date. New packages must carry the explicit application date instead."
|
||||
],
|
||||
"pdf_artifacts": {
|
||||
"Dennis_Thiessen_Cover_Letter.pdf": "555ece186371a9ef",
|
||||
"Dennis_Thiessen_Resume.pdf": "122dab5f5e5ec70d",
|
||||
"e2e_snowflake_observe_enterprise_cover_letter.pdf": "555ece186371a9ef",
|
||||
"e2e_snowflake_observe_enterprise_resume.pdf": "122dab5f5e5ec70d"
|
||||
},
|
||||
"reuse_classification": "recorded"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -26,7 +26,7 @@ Dennis worked across multiple data domains within the fab — these are domain s
|
||||
|
||||
This domain expertise is rare in data engineering candidates and is a strong differentiator for semiconductor company JDs (ASML, Infineon, TSMC, GlobalFoundries, etc.). Flag this domain when targeting semi roles.
|
||||
|
||||
**CL framing:** "At Bosch Semiconductor in Dresden, I worked at the intersection of data engineering and semiconductor manufacturing analytics — owning the data pipelines and applications that drove defect management, parameter testing analysis, and process optimization across 300mm wafer production. My most impactful project was containerizing ML inference for automated image-based defect classification, turning a manual quality inspection process into a fully automated, 24/7 production system."
|
||||
**CL framing:** "At Bosch Semiconductor in Dresden, I worked at the intersection of data engineering and semiconductor manufacturing analytics — owning the data pipelines and applications that drove defect management, parameter testing analysis, and process optimization across 300mm wafer production. My most impactful project was containerizing ML inference for automated image-based defect classification, substantially reducing a manual quality-inspection workload in a 24/7 production environment." *(Do not write “fully automated” or “eliminated”: canonical BS-1 supports a qualitative reduction in manual classification, exact amount unverified.)*
|
||||
|
||||
---
|
||||
|
||||
@@ -36,11 +36,24 @@ This domain expertise is rare in data engineering candidates and is a strong dif
|
||||
**User's role:** Primary developer / strategy owner ("Erarbeitung und Durchführung" = designed AND executed)
|
||||
**Status:** Deployed to production
|
||||
|
||||
**Context:** 300mm semiconductor fab runs continuously. Manual image classification for wafer defect detection created a bottleneck for line engineers in the Defect Management domain. Dennis designed and implemented the strategy to containerize and orchestrate ML inference into the live production pipeline — enabling fully automated defect classification with no manual intervention.
|
||||
> **RESOLVED 2026-09-11 by the user** (was an open item from review F07). The real constraint is
|
||||
> a FAILURE CONSEQUENCE, not a deployment window: *"Bei einem Fehler (also Defekt in der Software)
|
||||
> kann es zu einem Produktionsstopp im worst-case kommen, was natürlich nie passieren darf."*
|
||||
>
|
||||
> The submitted NVIDIA cover letter says *"a production line that could not be stopped for a
|
||||
> deployment"* — that is a **different and inaccurate** claim. It describes a scheduling
|
||||
> constraint; the truth is about the blast radius of a bug. **That exact phrasing is now
|
||||
> `forbidden` on BS-1** and must not be reused. The letter itself is not rewritten (F17).
|
||||
>
|
||||
> **Write it as:** "integrated containerized ML inference into a continuously operating
|
||||
> semiconductor fab, where a software defect could have halted production" — which is a stronger
|
||||
> statement than the one that was sent, and true.
|
||||
|
||||
**Context:** 300mm semiconductor fab runs continuously. Manual image classification for wafer defect detection created a bottleneck for line engineers in the Defect Management domain. Dennis designed and implemented the strategy to containerize and orchestrate ML inference into the live production pipeline, automating image-based defect classification and substantially reducing manual inspection work. **Scope limit (canonical BS-1):** the reduction is source-backed but its size is unverified — do not claim elimination, “no manual intervention” or unattended operation, and never claim model development.
|
||||
|
||||
**Bullet variants:**
|
||||
- **2L:** Containerized and orchestrated ML inference (Docker, Kubernetes, Ansible) into 24/7 semiconductor production pipelines, enabling fully automated image-based defect classification and significantly reducing manual inspection workload for line engineers.
|
||||
- **3L:** Designed and executed the ML inference integration strategy for Bosch's 24/7 semiconductor fab — containerizing defect-detection models with Docker, orchestrating via Kubernetes and Ansible, and embedding automated image classification into the Defect Management pipeline; eliminated manual wafer inspection bottleneck and enabled continuous, unattended quality monitoring across active 300mm production lines.
|
||||
- **2L:** Containerized and orchestrated ML inference (Docker, Kubernetes, Ansible) into 24/7 semiconductor production pipelines, automating image-based defect classification and reducing manual inspection workload for line engineers.
|
||||
- **3L:** Designed and executed the ML inference integration strategy for Bosch's 24/7 semiconductor fab — containerizing defect-detection models with Docker, orchestrating via Kubernetes and Ansible, and embedding automated image classification into the Defect Management pipeline; reduced the manual wafer-inspection bottleneck on active 300mm production lines. *(Earlier wording said “eliminated” and “unattended” — both exceed canonical BS-1.)*
|
||||
- **1L:** Containerized ML inference (Docker, K8s, Ansible) for automated image-based defect classification in 24/7 semiconductor fab.
|
||||
|
||||
**Key skills:** Docker, Kubernetes, Ansible, ML deployment, ML inference, containerization, MLOps, image classification, defect detection, production ML, semiconductor manufacturing
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
### Cross-Position Section
|
||||
|
||||
**Career arc framing:** Capgemini was Dennis's first professional role after the Bundeswehr — a 6-month consulting engagement in the Technology Services APPS division, working on test automation for a transport logistics client. Despite its brevity, the Zeugnis rates performance as "sehr gut" (vollsten Zufriedenheit — top tier), and the employer deeply regrets departure. This role anchors the test automation thread that runs through Generali and Vizrt. Typically omitted from 2-page resumes; included in full CV for timeline completeness.
|
||||
**Career arc framing:** Capgemini was Dennis's first professional role after the Bundeswehr — a 6-month consulting engagement in the Technology Services APPS division, working on test automation for a transport logistics client. Despite its brevity, the Zeugnis rates performance as "sehr gut" (vollsten Zufriedenheit — top tier), and the employer deeply regrets departure. This role anchors the test automation thread that runs through Generali and Vizrt. Historical record only. Standing user preference: omit from all resumes, CVs and cover letters; do not fill or explain the intentional gap.
|
||||
|
||||
**Resume recommendation:** Omit from 2-page resume unless targeting roles where test automation breadth from earliest career adds value. Include on full CV (5-page) under early career section.
|
||||
|
||||
@@ -38,5 +38,5 @@
|
||||
|
||||
**Resume inclusion guidance:**
|
||||
- 2-page resume: **Omit entirely**
|
||||
- 5-page CV: Include as single condensed bullet under "Early Career" or within timeline continuity section
|
||||
- Any CV, including academic: **Omit entirely**, per standing user preference.
|
||||
- Cover letter: Not relevant to mention
|
||||
@@ -59,6 +59,8 @@
|
||||
|
||||
### Achievement SW-3: Python Applications on Kubernetes + GitLab CI/CD
|
||||
|
||||
> **CORRECTED 2026-09-15 (user).** (1) **Phase:** this was the legacy B2B system at **ART B2B**, the first part of the Swisscom tenure - it is **past**; the current ART DPT stack is AWS-native (see `claims.json` SWISSCOM `org_history`). Write it in past tense. (2) **Scope:** he **worked with** automated GitLab CI/CD pipelines; he did not build or design the CI/CD automation. The variants below ("automated the full CI/CD lifecycle", "GitLab-managed quality gates and rollback controls") overstate his part and must not be reused. Safe form: *"Built and operated Python applications on Kubernetes, deployed through automated GitLab CI/CD pipelines across multiple environments."*
|
||||
|
||||
**Source:** thiessen_swisscom_zwischenzeugnis.md, thiessen_linkedin_profile.md
|
||||
**User's role:** Primary developer / operator
|
||||
**Status:** Active / ongoing
|
||||
@@ -154,6 +156,8 @@
|
||||
**User's role:** Builds and models governed data products and onboards sources within Swisscom's company-wide Data Mesh; does not own or architect the shared company-wide mesh.
|
||||
**Status:** Active / ongoing (current emphasis)
|
||||
|
||||
**Design clarification (user-confirmed 2026-10-03):** Current work includes data modelling, design of data products and their implementation. Scope design claims to his data products. The exact duration is not confirmed; do not automatically claim one year of software architecture from this clarification. See `knowledge_base/extractions/2026-10-03_data_product_design_frontend_clarification.md` and canonical SW-7.
|
||||
|
||||
**Context:** Current Staff-level work builds reusable governed **data products**, active metadata and source onboarding within Swisscom's shared Data Mesh on AWS (Glue, Athena, CloudFormation, AWS CLI, CI/CD). These products can support downstream analytics and AI use cases. Do not convert this into ownership of agent architecture, MCP tooling or the company-wide platform.
|
||||
|
||||
**Bullet variants:**
|
||||
@@ -163,8 +167,9 @@
|
||||
|
||||
**Metadata/catalogue platform (user-confirmed 2026-07-29):** Swisscom uses **Atlassian Compass** as the metadata platform for data products, including lineage. Dennis uses it as a practitioner to document data-product metadata and lineage. **Do NOT claim** he administers, rolled out or owns Compass. This is a genuine named catalogue/lineage tool and satisfies "or similar metadata/catalogue platform" JD phrasing — but it is **not** a substitute claim for Purview, Collibra or Alation, which remain unevidenced and forbidden.
|
||||
|
||||
**Key skills:** Data Mesh, data products, metadata management, data lineage, Atlassian Compass, data catalog, data governance, AWS, Glue, Athena, CloudFormation, AWS CLI, CI/CD, agentic data foundation, grounded retrieval
|
||||
**ATS keywords:** Data Mesh, data products, metadata management, AWS, Glue, Athena, CloudFormation, CI/CD, data governance, grounded retrieval, agentic AI foundation
|
||||
**Key skills:** Data Mesh, data products, metadata management, data lineage, Atlassian Compass, data catalog, data governance, AWS, Glue, Athena, CloudFormation, AWS CLI, CI/CD, agentic data foundation
|
||||
**NOT a skill here:** *grounded retrieval* was listed until 2026-09-11 but no retrieval implementation is evidenced — SW-8 records it as explicitly unknown. Describe the data side (governed, documented, lineage-tracked data that agents can consume), never retrieval work.
|
||||
**ATS keywords:** Data Mesh, data products, metadata management, AWS, Glue, Athena, CloudFormation, CI/CD, data governance, agentic AI foundation
|
||||
**Reframing notes:**
|
||||
- ML/AI: MED — evidence for data readiness and grounded enterprise data, not agent architecture or retrieval ownership
|
||||
- Data Platform/Infra: HIGH — Data Mesh + metadata + AWS IaC is core platform signal
|
||||
@@ -186,7 +191,7 @@
|
||||
**Key skills:** LLM application configuration, model selection, AI agents, domain knowledge bases, question answering, migration assistance, data mapping
|
||||
**ATS keywords:** LLM-powered applications, AI agents, model selection, knowledge grounding, question answering, workflow automation, data mapping
|
||||
**Reframing notes:**
|
||||
- ML/AI: HIGH for LLM-specific roles; lead with applied LLM delivery, then connect reliable data foundations and evaluation discipline.
|
||||
- ML/AI: HIGH for LLM-specific roles; lead with applied LLM *configuration*, then connect reliable data foundations. **Do not invoke evaluation discipline** — no LLM evaluation responsibility is evidenced and *formal model evaluation* is a globally forbidden pattern.
|
||||
- Accuracy: Never say “trained an LLM” unless model weights were fine-tuned. Prefer “grounded,” “configured,” or “provided with a domain-specific knowledge base.”
|
||||
- Production: Use “internal” or “prototype” only if true; otherwise omit deployment-status language until verified.
|
||||
|
||||
|
||||
@@ -0,0 +1,140 @@
|
||||
"""Authoritative application state and generated, read-only projections.
|
||||
|
||||
Run with --check to detect stale views, or --render after editing the registry.
|
||||
Outcome events describe what happened; current outcome never erases an interview.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
from contextlib import contextmanager
|
||||
from datetime import date
|
||||
import json
|
||||
import math
|
||||
import os
|
||||
import tempfile
|
||||
from pathlib import Path
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[2]
|
||||
REGISTRY = ROOT / "job_scout/state/applications.json"
|
||||
VIEW = ROOT / "resume_builder/reference/current_applications.md"
|
||||
COHORT = ROOT / "job_scout/state/application_cohort.json"
|
||||
OUTCOMES = {"open", "applied", "paused", "not_proceeding", "role_closed", "closed_no_response", "withdrawn_by_candidate", "rejected_no_interview", "rejected_after_interview", "interviewing", "offer", "accepted"}
|
||||
|
||||
|
||||
def valid_date(value: str) -> str:
|
||||
if not isinstance(value, str) or date.fromisoformat(value).isoformat() != value:
|
||||
raise ValueError("expected ISO date YYYY-MM-DD")
|
||||
return value
|
||||
|
||||
|
||||
def validate(data: dict) -> None:
|
||||
ids = set()
|
||||
for record in data["applications"]:
|
||||
identifier = record.get("id")
|
||||
if not identifier or identifier in ids:
|
||||
raise ValueError("application IDs must be nonempty and unique")
|
||||
ids.add(identifier)
|
||||
if record.get("outcome") not in OUTCOMES:
|
||||
raise ValueError(f"{identifier}: invalid outcome")
|
||||
for key in ("application_date", "rejection_date", "withdrawn"):
|
||||
if record.get(key):
|
||||
valid_date(record[key])
|
||||
for event in record.get("events", []):
|
||||
if event.get("date"):
|
||||
valid_date(event["date"])
|
||||
score = record.get("evidence_fit")
|
||||
if score is not None and (isinstance(score, bool) or not isinstance(score, (float, int)) or not math.isfinite(score) or not 0 <= score <= 100):
|
||||
raise ValueError(f"{identifier}: evidence_fit must be finite and between 0 and 100")
|
||||
if record.get("hard_gate") == "fail" and record.get("fit_class") not in {"stretch", "no-go"}:
|
||||
raise ValueError(f"{identifier}: failed gate requires Stretch or No-go")
|
||||
if score is not None and record.get("hard_gate") == "pass" and record.get("fit_class") in {"core", "adjacent"}:
|
||||
expected = "core" if score >= 75 else "adjacent" if score >= 60 else "stretch"
|
||||
if record["fit_class"] != expected and not record.get("fit_override_reason"):
|
||||
raise ValueError(f"{identifier}: classification differs from score; record fit_override_reason")
|
||||
|
||||
|
||||
@contextmanager
|
||||
def transaction():
|
||||
"""Serialize local writers; fail clearly rather than overwrite another update."""
|
||||
lock = REGISTRY.with_suffix(".lock")
|
||||
try:
|
||||
descriptor = os.open(lock, os.O_CREAT | os.O_EXCL | os.O_WRONLY)
|
||||
except FileExistsError as exc:
|
||||
raise ValueError(f"Application registry is locked: {lock}. Check for an active writer before removing a stale lock.") from exc
|
||||
try:
|
||||
with os.fdopen(descriptor, "w") as stream:
|
||||
stream.write(str(os.getpid()))
|
||||
data = load()
|
||||
yield data
|
||||
validate(data)
|
||||
atomic_write(REGISTRY, json.dumps(data, indent=2, ensure_ascii=False) + "\n")
|
||||
render(data)
|
||||
finally:
|
||||
lock.unlink(missing_ok=True)
|
||||
|
||||
|
||||
def atomic_write(path: Path, text: str) -> None:
|
||||
path.parent.mkdir(parents=True, exist_ok=True)
|
||||
descriptor, temporary = tempfile.mkstemp(dir=path.parent, prefix=path.name + ".", suffix=".tmp")
|
||||
try:
|
||||
with os.fdopen(descriptor, "w", encoding="utf-8", newline="\n") as stream:
|
||||
stream.write(text)
|
||||
stream.flush()
|
||||
os.fsync(stream.fileno())
|
||||
os.replace(temporary, path)
|
||||
finally:
|
||||
Path(temporary).unlink(missing_ok=True)
|
||||
|
||||
|
||||
def load() -> dict:
|
||||
return json.loads(REGISTRY.read_text(encoding="utf-8"))
|
||||
|
||||
|
||||
def interview_reached(record: dict) -> bool:
|
||||
return bool(record.get("interview")) or any(
|
||||
event.get("type") in {"interview_invited", "interview_held"}
|
||||
for event in record.get("events", [])
|
||||
)
|
||||
|
||||
|
||||
def projections(data: dict) -> dict[Path, str]:
|
||||
lines = ["# Current applications", "", "Generated from `job_scout/state/applications.json`; do not edit this view.",
|
||||
"Use current outcome and next action below. Imported legacy notes are historical, not current instructions.", "",
|
||||
"| Application | Current outcome | Interview reached | Next action |", "|---|---|---|---|"]
|
||||
for record in data["applications"]:
|
||||
cells = [record["label"], record["outcome"], "yes" if interview_reached(record) else "not recorded", record["next_action"]]
|
||||
lines.append("| " + " | ".join(str(cell).replace("|", " / ").replace("\n", " ") for cell in cells) + " |")
|
||||
lines.extend(["", "## Current targeting notes", "", *["- " + note for note in data.get("targeting_notes", [])], ""])
|
||||
cohort = dict(data["cohort_metadata"])
|
||||
cohort["generated_from"] = "job_scout/state/applications.json"
|
||||
cohort["applications"] = [record for record in data["applications"] if record.get("cohort_id") == cohort["cohort_id"]]
|
||||
return {VIEW: "\n".join(lines), COHORT: json.dumps(cohort, indent=2, ensure_ascii=False) + "\n"}
|
||||
|
||||
|
||||
def render(data: dict, check: bool = False) -> list[str]:
|
||||
validate(data)
|
||||
stale = []
|
||||
for path, expected in projections(data).items():
|
||||
if not path.exists() or path.read_text(encoding="utf-8") != expected:
|
||||
stale.append(str(path.relative_to(ROOT)))
|
||||
if not check:
|
||||
atomic_write(path, expected)
|
||||
return stale
|
||||
|
||||
|
||||
def main() -> int:
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
mode = parser.add_mutually_exclusive_group(required=True)
|
||||
mode.add_argument("--check", action="store_true")
|
||||
mode.add_argument("--render", action="store_true")
|
||||
args = parser.parse_args()
|
||||
stale = render(load(), check=args.check)
|
||||
if args.check and stale:
|
||||
print("STALE: " + ", ".join(stale))
|
||||
return 1
|
||||
print("Application views are current.")
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
@@ -0,0 +1,119 @@
|
||||
"""Record applications without quotas; preserve outcome events and interview history."""
|
||||
from __future__ import annotations
|
||||
import argparse
|
||||
import hashlib
|
||||
import application_records as records
|
||||
|
||||
FIT_CLASSES = ("core", "adjacent", "stretch", "no-go")
|
||||
CHANNELS = ("strong", "moderate", "weak")
|
||||
|
||||
|
||||
def summary(data: dict, all_applications: bool = False) -> None:
|
||||
cohort_id = data["cohort_metadata"]["cohort_id"]
|
||||
applications = [row for row in data["applications"] if all_applications or row.get("cohort_id") == cohort_id]
|
||||
print(f"Application record: {'all' if all_applications else cohort_id} ({len(applications)} applications; no quota)")
|
||||
for field, values in (("fit_class", FIT_CLASSES), ("channel", CHANNELS)):
|
||||
for value in values:
|
||||
print(f" {field} {value}: {sum(row.get(field) == value for row in applications)}")
|
||||
unknown = sum(row.get(field) is None for row in applications)
|
||||
if unknown:
|
||||
print(f" {field} unrecorded: {unknown}")
|
||||
outcomes = sorted({row["outcome"] for row in applications})
|
||||
print(" outcomes: " + ", ".join(f"{value}={sum(row['outcome'] == value for row in applications)}" for value in outcomes))
|
||||
print(f" interview reached (including later withdrawal/rejection): {sum(records.interview_reached(row) for row in applications)}")
|
||||
|
||||
|
||||
def add_application(data: dict, args: argparse.Namespace) -> None:
|
||||
records.valid_date(args.date)
|
||||
identity = args.id or "app-" + hashlib.sha256(f"{args.company.casefold()}|{args.job_id or args.role.casefold()}|{args.date}".encode()).hexdigest()[:12]
|
||||
candidate = {
|
||||
"id": identity, "company": args.company, "role": args.role,
|
||||
"label": f"{args.company} — {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,
|
||||
"cohort_id": data["cohort_metadata"]["cohort_id"], "job_id": args.job_id,
|
||||
"url": args.url, "fit_override_reason": args.fit_override_reason,
|
||||
"rubric_version": args.rubric_version,
|
||||
"next_action": args.next_action, "current_summary": args.outcome,
|
||||
"events": [{"type": args.outcome, "date": args.date}],
|
||||
}
|
||||
for existing in data["applications"]:
|
||||
same_job = args.job_id and existing.get("job_id") == args.job_id and existing["company"].casefold() == args.company.casefold()
|
||||
same_url = args.url and existing.get("url") == args.url
|
||||
same_application = existing["company"].casefold() == args.company.casefold() and existing["role"].casefold() == args.role.casefold() and existing.get("application_date") == args.date
|
||||
if existing["id"] == identity or same_job or same_url or same_application:
|
||||
if all(existing.get(key) == value for key, value in candidate.items() if key not in {"events", "id", "current_summary", "next_action", "outcome"}):
|
||||
return
|
||||
raise ValueError(f"Application already exists ({existing['id']}); use update instead")
|
||||
data["applications"].append(candidate)
|
||||
records.validate(data)
|
||||
|
||||
|
||||
def update_application(data: dict, args: argparse.Namespace) -> None:
|
||||
records.valid_date(args.date)
|
||||
matches = [row for row in data["applications"] if row["id"] == args.id]
|
||||
if not matches:
|
||||
raise ValueError(f"Unknown application ID: {args.id}")
|
||||
row = matches[0]
|
||||
if row.get("application_date") and args.date < row["application_date"]:
|
||||
raise ValueError("event date precedes application date")
|
||||
outcome_dates = [event["date"] for event in row.get("events", [])
|
||||
if (event.get("outcome") or event.get("type") in records.OUTCOMES) and event.get("date")]
|
||||
outcome_dates.extend(row[key] for key in ("withdrawn", "rejection_date") if row.get(key))
|
||||
if args.outcome and outcome_dates and args.date < max(outcome_dates):
|
||||
raise ValueError("older outcome cannot replace current state; record it as a historical note")
|
||||
event = {"type": args.event or args.outcome or "note", "date": args.date}
|
||||
if args.note:
|
||||
event["note"] = args.note
|
||||
if args.outcome:
|
||||
event["outcome"] = args.outcome
|
||||
if event not in row.setdefault("events", []):
|
||||
row["events"].append(event)
|
||||
if args.outcome:
|
||||
row["outcome"] = args.outcome
|
||||
row["current_summary"] = args.note or args.outcome
|
||||
row["next_action"] = args.next_action or ("Await response." if args.outcome in {"applied", "interviewing", "open"} else "Review recorded outcome before further action.")
|
||||
elif args.next_action:
|
||||
row["next_action"] = args.next_action
|
||||
|
||||
|
||||
def main() -> None:
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
commands = parser.add_subparsers(dest="command", required=True)
|
||||
view = commands.add_parser("summary")
|
||||
view.add_argument("--all", action="store_true")
|
||||
add = commands.add_parser("add")
|
||||
for field in ("company", "role", "date"):
|
||||
add.add_argument("--" + field, required=True)
|
||||
add.add_argument("--id")
|
||||
add.add_argument("--job-id")
|
||||
add.add_argument("--url")
|
||||
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", "unknown"), required=True)
|
||||
add.add_argument("--outcome", choices=sorted(records.OUTCOMES), default="applied")
|
||||
add.add_argument("--fit-override-reason")
|
||||
add.add_argument("--rubric-version", default="critique-framework-2026-09-11")
|
||||
add.add_argument("--next-action", default="Await response.")
|
||||
update = commands.add_parser("update")
|
||||
update.add_argument("--id", required=True)
|
||||
update.add_argument("--date", required=True, help="Date of this event")
|
||||
update.add_argument("--outcome", choices=sorted(records.OUTCOMES))
|
||||
update.add_argument("--event", choices=("interview_invited", "interview_held", "assessment_passed", "contact_attempted", "contact_conversation", "referral_received", "note"))
|
||||
update.add_argument("--note")
|
||||
update.add_argument("--next-action")
|
||||
args = parser.parse_args()
|
||||
try:
|
||||
if args.command == "summary":
|
||||
summary(records.load(), args.all)
|
||||
return
|
||||
with records.transaction() as data:
|
||||
(add_application if args.command == "add" else update_application)(data, args)
|
||||
summary(data)
|
||||
except (ValueError, OSError) as error:
|
||||
parser.exit(2, f"ERROR: {error}\n")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -1,81 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Record and summarize the controlled ten-application cohort."""
|
||||
"""Compatibility entry point; application_tracker owns the uncapped registry workflow."""
|
||||
from application_tracker import main
|
||||
|
||||
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__":
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@@ -0,0 +1,172 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Build a reproducibility manifest for every application package (review finding F17).
|
||||
|
||||
A package folder that contains a PDF looks finished. It is not necessarily reproducible:
|
||||
`output/NATO_AI_ENGINEER/` ships no `resume.cls` at all and only builds on a machine where
|
||||
one happens to be installed elsewhere, and its submitted PDF differs in content from the
|
||||
e2e source's PDF. The existing PDF hid both problems.
|
||||
|
||||
Records source/class content hashes. Optional PDF snapshots detect changed local artifacts;
|
||||
missing PDFs are allowed because generated PDFs are deliberately not tracked in Git.
|
||||
Filename association is not proof that a PDF was built from the current source.
|
||||
|
||||
python resume_builder/helpers/package_manifest.py # write the manifest
|
||||
python resume_builder/helpers/package_manifest.py --check # fail if it is stale
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import hashlib
|
||||
import json
|
||||
import re
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[2]
|
||||
OUTPUT = ROOT / "output"
|
||||
MANIFEST = ROOT / "resume_builder" / "canonical" / "package_manifest.json"
|
||||
REGISTER = ROOT / "resume_builder" / "canonical" / "historical_outputs.json"
|
||||
TODAY_MACRO = re.compile(r"\\today")
|
||||
# Ship with MiKTeX/TeX Live, so their absence from a package folder is not a missing file.
|
||||
# Only project-local classes (resume.cls, cv.cls) have to travel with the package.
|
||||
CTAN_CLASSES = {"article", "report", "book", "letter", "moderncv", "scrartcl", "scrlttr2",
|
||||
"memoir", "extarticle", "europasscv", "europecv", "altacv"}
|
||||
|
||||
|
||||
def digest(path: Path) -> str:
|
||||
# Git/Windows may change line endings without changing the TeX source.
|
||||
data = path.read_text(encoding="utf-8").encode("utf-8") if path.suffix in {".tex", ".cls"} else path.read_bytes()
|
||||
return hashlib.sha256(data).hexdigest()[:16]
|
||||
|
||||
|
||||
def describe(folder: Path, record_pdfs: bool = False) -> dict:
|
||||
sources = {p.name: digest(p) for p in sorted(folder.glob("*.tex"))}
|
||||
classes = {p.name: digest(p) for p in folder.glob("*.cls")}
|
||||
needs = set()
|
||||
uses_today = []
|
||||
for name in sources:
|
||||
text = (folder / name).read_text(encoding="utf-8", errors="replace")
|
||||
text = re.sub(r"(?<!\\)%.*$", "", text, flags=re.M)
|
||||
match = re.search(r"\\documentclass(?:\[[^\]]*\])?\{([^}]+)\}", text)
|
||||
if match:
|
||||
needs.add(match.group(1))
|
||||
if TODAY_MACRO.search(text):
|
||||
uses_today.append(name)
|
||||
|
||||
problems = []
|
||||
for required in sorted(needs):
|
||||
# Classes that ship with a TeX distribution are not part of the package's own source
|
||||
# distribution; only project-local classes (resume.cls, cv.cls) have to travel with it.
|
||||
if required in CTAN_CLASSES:
|
||||
continue
|
||||
if f"{required}.cls" not in classes:
|
||||
problems.append(
|
||||
f"source distribution incomplete: requires {required}.cls, which is not in the "
|
||||
f"folder. A build here only succeeds if a copy happens to exist elsewhere on the "
|
||||
f"machine. Do NOT repair by copying the newest class in - the repo carries "
|
||||
f"several class variants and older macros differ.")
|
||||
if uses_today:
|
||||
problems.append(
|
||||
f"rebuild is date-dependent: {', '.join(uses_today)} use \\today, so recompiling a "
|
||||
f"historical package silently restamps it with the current date. New packages must "
|
||||
f"carry the explicit application date instead.")
|
||||
entry = {
|
||||
"sources": sources,
|
||||
"class_files": classes,
|
||||
"requires_class": sorted(needs),
|
||||
"uses_today": uses_today,
|
||||
"problems": problems,
|
||||
}
|
||||
if record_pdfs:
|
||||
entry["pdf_artifacts"] = {p.name: digest(p) for p in sorted(folder.glob("*.pdf"))}
|
||||
return entry
|
||||
|
||||
|
||||
def build(record_pdfs: bool = False) -> dict:
|
||||
register = json.loads(REGISTER.read_text(encoding="utf-8"))
|
||||
classified = set()
|
||||
for key in ("unsafe_do_not_reuse", "historical_revalidate", "paused_no_package"):
|
||||
for item in register.get(key, []):
|
||||
classified.add(item["folder"] if isinstance(item, dict) else item)
|
||||
|
||||
packages = {}
|
||||
for folder in sorted(OUTPUT.iterdir()):
|
||||
if not folder.is_dir() or not any(folder.glob("*.tex")):
|
||||
continue
|
||||
# Only APPLICATION packages. A folder holding a report or analysis document is not a
|
||||
# submission and has nothing to classify for reuse.
|
||||
if not any(folder.glob("*resume*.tex")) and not any(folder.glob("*cover*letter*.tex")):
|
||||
continue
|
||||
entry = describe(folder, record_pdfs)
|
||||
entry["reuse_classification"] = (
|
||||
"recorded" if f"output/{folder.name}" in classified else "UNCLASSIFIED")
|
||||
if f"output/{folder.name}" not in classified:
|
||||
entry["problems"].append(
|
||||
"not classified in historical_outputs.json. Default until someone classifies "
|
||||
"it: treat as historical_revalidate - never reuse a bullet from it without "
|
||||
"re-checking the claim against claims.json first.")
|
||||
packages[folder.name] = entry
|
||||
|
||||
return {
|
||||
"schema_version": 2,
|
||||
"generated_note": (
|
||||
"Generated by package_manifest.py (review finding F17). A PDF in a folder is not "
|
||||
"evidence that the package is reproducible. Source and class hashes detect edits; "
|
||||
"optional pdf_artifacts are observations, not verified source-to-PDF mappings. "
|
||||
"Absent PDFs are allowed; present PDFs must match their recorded hash. "
|
||||
"Nothing here authorises rewriting a "
|
||||
"submitted document."),
|
||||
"packages": packages,
|
||||
}
|
||||
|
||||
|
||||
def check_manifest(recorded: dict, current: dict, output: Path = OUTPUT) -> list[str]:
|
||||
# Compare the portable source inventory separately from optional local build products.
|
||||
baseline = json.loads(json.dumps(recorded))
|
||||
errors = []
|
||||
for name, entry in baseline.get("packages", {}).items():
|
||||
for filename, expected in entry.pop("pdf_artifacts", {}).items():
|
||||
path = output / name / filename
|
||||
if path.exists() and digest(path) != expected:
|
||||
errors.append(f"changed PDF artifact: {name}/{filename}; inspect before recording a new baseline")
|
||||
if baseline != current:
|
||||
errors.append("source manifest is stale; inspect changes, then run package_manifest.py")
|
||||
return errors
|
||||
|
||||
|
||||
def main() -> int:
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("--check", action="store_true", help="fail if the manifest is stale")
|
||||
parser.add_argument("--record-pdfs", action="store_true", help="explicitly snapshot current local PDF hashes (not proof of source association)")
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.check and args.record_pdfs:
|
||||
parser.error("--check cannot refresh PDF baselines")
|
||||
recorded = json.loads(MANIFEST.read_text(encoding="utf-8")) if MANIFEST.exists() else {}
|
||||
manifest = build(record_pdfs=args.record_pdfs)
|
||||
if args.check:
|
||||
errors = check_manifest(recorded, manifest)
|
||||
if errors:
|
||||
for error in errors:
|
||||
print("ERROR: " + error)
|
||||
return 1
|
||||
print("Package manifest is current.")
|
||||
return 0
|
||||
|
||||
if not args.record_pdfs:
|
||||
for name, entry in manifest["packages"].items():
|
||||
old = recorded.get("packages", {}).get(name, {})
|
||||
if "pdf_artifacts" in old:
|
||||
entry["pdf_artifacts"] = old["pdf_artifacts"]
|
||||
MANIFEST.write_text(json.dumps(manifest, indent=2, ensure_ascii=False) + "\n", encoding="utf-8")
|
||||
flagged = {name: entry for name, entry in manifest["packages"].items() if entry["problems"]}
|
||||
print(f"{len(manifest['packages'])} packages described, {len(flagged)} with findings\n")
|
||||
for name, entry in flagged.items():
|
||||
print(f" {name}")
|
||||
for problem in entry["problems"]:
|
||||
print(f" - {problem[:150]}")
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
@@ -0,0 +1,59 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""Measure where the first real employment evidence starts on page one (review finding F18).
|
||||
|
||||
Usage: python resume_builder/helpers/page_metrics.py <resume.pdf> [more.pdf ...]
|
||||
Requires pdftotext (ships with MiKTeX).
|
||||
|
||||
The review reported ~50-55% for four packages. This reproduces that measurement from the
|
||||
compiled PDF so a change can be checked rather than asserted. The percentage is a diagnostic,
|
||||
never a target: no pixel goal, no forced page-two filling.
|
||||
"""
|
||||
import re
|
||||
import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
import tempfile
|
||||
from pathlib import Path
|
||||
|
||||
HEADINGS = ("professional experience", "berufserfahrung", "experience")
|
||||
|
||||
|
||||
def measure(pdf: Path) -> dict:
|
||||
executable = shutil.which("pdftotext")
|
||||
if not executable:
|
||||
raise RuntimeError("pdftotext is required on PATH (Poppler or MiKTeX)")
|
||||
with tempfile.TemporaryDirectory() as work:
|
||||
out = Path(work) / "bbox.xml"
|
||||
subprocess.run([executable, "-bbox", "-f", "1", "-l", "1", str(pdf), str(out)],
|
||||
capture_output=True, check=True)
|
||||
xml = out.read_text(encoding="utf-8", errors="replace")
|
||||
page = re.search(r'<page width="([\d.]+)" height="([\d.]+)"', xml)
|
||||
if page is None:
|
||||
raise ValueError("No page geometry found in pdftotext output")
|
||||
height = float(page.group(2))
|
||||
words = [(float(m.group(2)), m.group(5).lower())
|
||||
for m in re.finditer(
|
||||
r'<word xMin="([\d.]+)" yMin="([\d.]+)" xMax="([\d.]+)" yMax="([\d.]+)">([^<]*)</word>',
|
||||
xml)]
|
||||
rows = {}
|
||||
for y, text in words:
|
||||
rows.setdefault(round(y, 1), []).append(text)
|
||||
first_y = next((y for y, row in sorted(rows.items()) if " ".join(row).strip() in HEADINGS), None)
|
||||
lines = len(rows)
|
||||
return {
|
||||
"height": height,
|
||||
"experience_y": first_y,
|
||||
"experience_pct": round(100 * first_y / height, 1) if first_y else None,
|
||||
"page1_text_lines": lines,
|
||||
"page1_words": len(words),
|
||||
}
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
for argument in sys.argv[1:]:
|
||||
pdf = Path(argument)
|
||||
data = measure(pdf)
|
||||
pct = data["experience_pct"]
|
||||
print(f"{pdf.parent.name:<34} experience starts at "
|
||||
f"{pct if pct is not None else '?':>5}% of page 1 | "
|
||||
f"{data['page1_text_lines']:>3} text lines, {data['page1_words']:>4} words")
|
||||
@@ -12,6 +12,7 @@ import argparse
|
||||
import json
|
||||
import re
|
||||
import sys
|
||||
from functools import lru_cache
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
@@ -50,6 +51,16 @@ def canonical_checks(claims: dict, history: dict) -> tuple[list[str], list[str]]
|
||||
if duplicates:
|
||||
errors.append(f"duplicate {collection} ids: {', '.join(duplicates)}")
|
||||
|
||||
for collection in ("education", "employment"):
|
||||
for item in claims.get(collection, []):
|
||||
for period in [item, *item.get("title_history", [])]:
|
||||
for field in ("start", "end"):
|
||||
value = period.get(field)
|
||||
if value == "present" and field == "end":
|
||||
continue
|
||||
if value is not None and (not isinstance(value, str) or not re.fullmatch(r"\d{4}-(?:0[1-9]|1[0-2])", value)):
|
||||
errors.append(f"{item.get('id')}: invalid {field} date {value!r}; expected YYYY-MM")
|
||||
|
||||
skills = claims.get("skills", [])
|
||||
skill_names = [item.get("name") for item in skills]
|
||||
duplicates = sorted({item for item in skill_names if skill_names.count(item) > 1})
|
||||
@@ -87,11 +98,46 @@ def canonical_checks(claims: dict, history: dict) -> tuple[list[str], list[str]]
|
||||
if duplicates:
|
||||
errors.append(f"historical output folders classified twice: {', '.join(duplicates)}")
|
||||
|
||||
if claims["identity"].get("swiss_permit", "").startswith("UNVERIFIED"):
|
||||
# F08: evidence-metadata coverage is reported, never gated. "unrecorded" means nobody
|
||||
# wrote it down - it does NOT mean the claim is unevidenced, and failing on it would
|
||||
# push someone to invent dates to get a green run.
|
||||
claim_list = claims.get("claims", [])
|
||||
missing_block = [c.get("id") for c in claim_list if not c.get("evidence")]
|
||||
if missing_block:
|
||||
errors.append("claims without an evidence block: " + ", ".join(map(str, missing_block)))
|
||||
for claim in claim_list:
|
||||
evidence = claim.get("evidence")
|
||||
if not isinstance(evidence, dict):
|
||||
errors.append(f"{claim.get('id')}: evidence must be an object")
|
||||
continue
|
||||
for field in ("source", "ownership"):
|
||||
if not isinstance(evidence.get(field), str) or not evidence[field].strip():
|
||||
errors.append(f"{claim.get('id')}: evidence.{field} must be a nonempty string (or 'unrecorded')")
|
||||
source = evidence.get("source", "")
|
||||
if isinstance(source, str) and re.fullmatch(r"[\w./-]+\.(?:md|pdf|tex|json|txt)", source) and not (ROOT / source).is_file():
|
||||
errors.append(f"{claim.get('id')}: evidence source file does not exist: {source}")
|
||||
undated = [c.get("id") for c in claim_list
|
||||
if isinstance(c.get("evidence"), dict) and c["evidence"].get("last_verified") == "unrecorded"]
|
||||
if undated:
|
||||
warnings.append(
|
||||
f"{len(undated)} of {len(claim_list)} claims have last_verified 'unrecorded' "
|
||||
f"({', '.join(map(str, undated[:6]))}{', ...' if len(undated) > 6 else ''}). "
|
||||
"Record a real date when one is confirmed; never infer one to clear this hint.")
|
||||
|
||||
if (claims.get("identity") or {}).get("swiss_permit", "").startswith("UNVERIFIED"):
|
||||
warnings.append("Swiss permit type remains unverified; generators must ask before naming it")
|
||||
return errors, warnings
|
||||
|
||||
|
||||
UNCHECKED = (
|
||||
"whether a sentence implies ownership or scale beyond the evidence (Scope Discipline)",
|
||||
"whether each bullet is actually supported by the claim it was planned from",
|
||||
"whether a number in the document is real - unverified metrics look identical to real ones",
|
||||
"whether tone, emphasis and ordering suit this employer",
|
||||
"anything in a language or phrasing the pattern lists do not cover",
|
||||
)
|
||||
|
||||
|
||||
def workflow_checks() -> list[str]:
|
||||
errors: list[str] = []
|
||||
checks = {
|
||||
@@ -105,7 +151,7 @@ def workflow_checks() -> list[str]:
|
||||
"<= 3 lines white space",
|
||||
"20-21 variable bullets",
|
||||
],
|
||||
ROOT / ".agents" / "skills" / "critique" / "SKILL.md": [
|
||||
ROOT / "resume_builder" / "reference" / "workflows" / "critique.md": [
|
||||
"Publications 10%",
|
||||
"Eight-Dimension Scoring",
|
||||
],
|
||||
@@ -118,18 +164,188 @@ def workflow_checks() -> list[str]:
|
||||
return errors
|
||||
|
||||
|
||||
def scan_document(path: Path, claims: dict) -> list[str]:
|
||||
_COMMENT = re.compile(r"(?<!\\)%.*$", re.M)
|
||||
_MARKUP = re.compile(r"\\[a-zA-Z@]+\s*(?:\[[^\]]*\])?")
|
||||
_PLACEHOLDER = re.compile(r"\[GENERATE[^\]]*\]|\bTODO\b|\bFIXME\b|\bXXX\b|\bLOREM IPSUM\b|<<[^>]*>>", re.I)
|
||||
# "no Terraform experience", "keine Terraform-Erfahrung", "not worked with Terraform"
|
||||
_NEGATION = re.compile(
|
||||
r"\b(?:(?:no|without|keine?|keinerlei|ohne)\s+(?:(?:experience|erfahrung)\s+(?:with|in|mit)\s+)?"
|
||||
r"|(?:not|never)\s+(?:used|worked with)\s+|nicht\s+(?:mit\s+)?)$", re.I)
|
||||
_INLINE = re.compile(r"\\(?:textbf|textit|textnormal|textrm|textsf|texttt|emph|underline)\{([^{}]*)\}")
|
||||
|
||||
|
||||
# LaTeX accent macros: \"a, 'e, \`e, \^o, \~n, plus \ss. German documents use these instead
|
||||
# of literal umlauts, and leaving them in made "Universit\"at der Bundeswehr" unmatchable.
|
||||
_ACCENT = re.compile(r"""\\["'`^~=.]\s*\{?([a-zA-Z])\}?""")
|
||||
_SSHARP = re.compile(r"\\ss\b")
|
||||
|
||||
|
||||
def _deaccent(raw: str) -> str:
|
||||
"""Fold LaTeX accent macros to their base letter.
|
||||
|
||||
German packages write Universit\\"at der Bundeswehr M\\"unchen rather than literal
|
||||
umlauts. Without this the employer/education comparison could not see the institution
|
||||
name at all, which produced a false positive on several correct resumes.
|
||||
"""
|
||||
return _SSHARP.sub("ss", _ACCENT.sub(r"\1", raw))
|
||||
|
||||
|
||||
def visible_text(raw: str) -> str:
|
||||
"""Document text as a reader sees it.
|
||||
|
||||
Three fixes for the scanner, all from review finding F06:
|
||||
* LaTeX COMMENTS are dropped. A line such as `% never claim Terraform` is a note to
|
||||
the author, not a claim, and flagging it taught the workflow to write around the
|
||||
checker instead of fixing the document.
|
||||
* MARKUP is removed but its argument text kept, so `\\textbf{Snow}flake` can no longer
|
||||
smuggle a forbidden skill past a plain substring comparison.
|
||||
* Whitespace is collapsed so a term split across a line break still matches.
|
||||
"""
|
||||
text = _deaccent(_COMMENT.sub("", raw))
|
||||
while _INLINE.search(text):
|
||||
text = _INLINE.sub(r"\1", text)
|
||||
text = _MARKUP.sub(" ", text)
|
||||
text = text.replace("{", " ").replace("}", " ").replace("~", " ")
|
||||
return re.sub(r"\s+", " ", text)
|
||||
|
||||
|
||||
@lru_cache(maxsize=512)
|
||||
def _forbidden_phrase(phrase: str) -> re.Pattern:
|
||||
"""Forbidden wording, tolerant of inserted qualifiers.
|
||||
|
||||
The canonical lists are literal ("built a Data Mesh"), but the regression this rule
|
||||
exists to stop was worded "Built a decentralized Data Mesh" - one adjective defeated the
|
||||
substring test. Allow up to two extra words between tokens. A false positive here costs
|
||||
a rewording; a false negative ships a scope claim the evidence does not support.
|
||||
"""
|
||||
tokens = [re.escape(token) for token in phrase.lower().split()]
|
||||
return re.compile(r"(?<!\w)" + r"\W+(?:\w+\W+){0,2}".join(tokens), re.I)
|
||||
|
||||
|
||||
_FOLD = str.maketrans({"ä": "a", "ö": "o", "ü": "u", "ß": "ss",
|
||||
"Ä": "a", "Ö": "o", "Ü": "u", "é": "e", "è": "e"})
|
||||
|
||||
|
||||
def fold(text: str) -> str:
|
||||
"""Umlaut-insensitive form. claims.json stores 'Universitat der Bundeswehr Munchen'
|
||||
while documents render 'Universitaet der Bundeswehr Muenchen', and that mismatch made an
|
||||
education institution look like the Bundeswehr employment entry on three correct resumes."""
|
||||
return text.translate(_FOLD).lower()
|
||||
|
||||
|
||||
def _mentions(haystack: str, term: str) -> bool:
|
||||
return re.search(r"(?<!\w)" + re.escape(term.lower()) + r"(?!\w)", haystack) is not None
|
||||
|
||||
|
||||
def _negated(haystack: str, term: str) -> bool:
|
||||
"""True when every mention of the term sits behind a negation."""
|
||||
hits = list(re.finditer(r"(?<!\w)" + re.escape(term.lower()) + r"(?!\w)", haystack))
|
||||
return bool(hits) and all(_NEGATION.search(haystack[max(0, hit.start() - 70):hit.start()]) for hit in hits)
|
||||
|
||||
|
||||
def _employer_mention(text: str, name: str) -> bool:
|
||||
"""Narrow exception for a company name, never for a bare technology list."""
|
||||
if name.lower() != "snowflake":
|
||||
return False
|
||||
hits = list(re.finditer(r"\bsnowflake\b", text))
|
||||
return bool(hits) and all(
|
||||
re.search(r"\b(?:application to|applying to|position at|role at|bewerbung bei|bewerbung an)\s*$", text[max(0, hit.start()-60):hit.start()])
|
||||
or re.match(r"\s+(?:inc\b|incorporated\b)", text[hit.end():])
|
||||
for hit in hits)
|
||||
|
||||
|
||||
def scan_document(path: Path, claims: dict, template: bool = False) -> list[str]:
|
||||
"""Deterministic, mechanically checkable properties of a generated document.
|
||||
|
||||
This is NOT a truth check and must never be reported as one. It cannot judge whether a
|
||||
sentence implies ownership the evidence does not support; that stays a reading task.
|
||||
See `UNCHECKED` and the summary printed by main().
|
||||
"""
|
||||
errors: list[str] = []
|
||||
text = read_text(path)
|
||||
raw = read_text(path)
|
||||
text = visible_text(raw)
|
||||
lowered = text.lower()
|
||||
# Keep context local to a sentence, bullet or skills row.
|
||||
contexts = [visible_text(part).lower() for part in re.split(
|
||||
r"\\(?:item|skillline|compactentry)\b|[.!?;]\s+|\n\s*\n", _COMMENT.sub("", raw))]
|
||||
|
||||
for pattern in claims.get("global_forbidden_output_patterns", []):
|
||||
if pattern.lower() in lowered:
|
||||
errors.append(f"{path}: forbidden output pattern: {pattern}")
|
||||
|
||||
# Per-claim forbidden wording. 14 of 26 claims carry a `forbidden` list and NONE of it
|
||||
# was enforced before: exactly the gap that let "owned the full ML lifecycle" pass.
|
||||
for claim in claims.get("claims", []):
|
||||
for phrase in claim.get("forbidden", []):
|
||||
if not isinstance(phrase, str) or len(phrase) < 8:
|
||||
continue # too short to match safely as a substring
|
||||
if _forbidden_phrase(phrase).search(lowered):
|
||||
errors.append(f"{path}: {claim.get('id','?')} forbidden wording: {phrase}")
|
||||
|
||||
for skill in claims.get("skills", []):
|
||||
if skill.get("output") == "forbidden" and skill["name"].lower() in lowered:
|
||||
errors.append(f"{path}: forbidden or unverified skill: {skill['name']}")
|
||||
if "\\begin{rsubsection}" in lowered:
|
||||
for line_number, line in enumerate(text.splitlines(), 1):
|
||||
name, output = skill["name"], skill.get("output")
|
||||
mentions = [part for part in contexts if _mentions(part, name)]
|
||||
if output == "forbidden" and any(not _negated(part, name) and not _employer_mention(part, name) for part in mentions):
|
||||
errors.append(f"{path}: forbidden or unverified skill: {name}")
|
||||
if output == "certification-context-only":
|
||||
if any(not _negated(part, name) and not re.search(r"certificat|zertifik|coursera|nanodegree|\bkurs\b|course|weiterbildung", part) for part in mentions):
|
||||
errors.append(
|
||||
f"{path}: {name} is certification-context-only and appears without that context")
|
||||
|
||||
for term in (exclusion["term"] for exclusion in claims.get("document_exclusions", [])):
|
||||
if _mentions(lowered, term):
|
||||
errors.append(f"{path}: excluded from all documents by standing user preference: {term}")
|
||||
|
||||
# Scan the comment-stripped RAW text: _MARKUP treats "\item [GENERATE: x]" as a command
|
||||
# with an optional argument and would swallow the placeholder whole.
|
||||
# Templates are EXEMPT: an unfilled placeholder is what makes a template a template. The
|
||||
# defect is a placeholder surviving into a generated document.
|
||||
for match in ([] if template else _PLACEHOLDER.finditer(_COMMENT.sub("", raw))):
|
||||
errors.append(f"{path}: unresolved placeholder left in the document: {match.group(0)!r}")
|
||||
|
||||
identity = claims.get("identity", {})
|
||||
for field in ("email", "phone"):
|
||||
value = identity.get(field)
|
||||
if not value:
|
||||
continue
|
||||
compact = re.sub(r"[\s()-]", "", lowered)
|
||||
if re.sub(r"[\s()-]", "", value.lower()) not in compact:
|
||||
kind = "e-mail" if field == "email" else "phone number"
|
||||
errors.append(f"{path}: canonical {kind} not found ({value}); check for a wrong contact line")
|
||||
|
||||
# Anchor the date check on the EMPLOYER NAME, never on the job title: titles collide
|
||||
# across employers ("Research Software Engineer" contains "Software Engineer") and that
|
||||
# produced a false positive on two real resumes. Employers excluded from documents are
|
||||
# skipped outright - their absence is the point, not a defect.
|
||||
# Employment dates belong on a CV. A cover letter naming an employer in prose is not
|
||||
# claiming a date, so requiring one there is a false positive.
|
||||
is_cv = "resume" in path.name.lower() or "cv" in path.name.lower() or "lebenslauf" in path.name.lower()
|
||||
excluded = {item["term"].lower() for item in claims.get("document_exclusions", [])}
|
||||
schooling_removed = fold(lowered)
|
||||
for school in claims.get("education", []):
|
||||
for key in ("institution", "thesis_institution"):
|
||||
institution = fold(school.get(key) or "")
|
||||
if len(institution) > 5:
|
||||
schooling_removed = schooling_removed.replace(institution, " ")
|
||||
for employer in (claims.get("employment", []) if is_cv else []):
|
||||
name = (employer.get("employer") or "").lower()
|
||||
if not name or any(term in name for term in excluded):
|
||||
continue
|
||||
short = re.split(r"\s*\(|,| gmbh| ag| asa", name)[0].strip()
|
||||
# Education institutions are removed first: "Universitaet der Bundeswehr Muenchen" is a
|
||||
# school, not the Bundeswehr employment entry, and matching it flagged three real
|
||||
# resumes that were entirely correct.
|
||||
if len(short) < 4 or not _mentions(schooling_removed, fold(short)):
|
||||
continue
|
||||
start = employer.get("start", "")
|
||||
year = start.split("-")[0] if start else ""
|
||||
if year and year not in text:
|
||||
errors.append(
|
||||
f"{path}: {employer.get('id','?')} ({employer.get('employer')}) appears but its "
|
||||
f"canonical start year {year} is absent; verify the dates")
|
||||
|
||||
if "\\begin{rsubsection}" in raw.lower():
|
||||
for line_number, line in enumerate(raw.splitlines(), 1):
|
||||
if "\\begin{rSubsection}" not in line:
|
||||
continue
|
||||
if re.search(r"Production Ownership|AI-Ready|Customer-Embedded|Shipping ML", line, re.I):
|
||||
@@ -137,7 +353,10 @@ def scan_document(path: Path, claims: dict) -> list[str]:
|
||||
return errors
|
||||
|
||||
|
||||
TRIPLE = re.compile(r"\w+, [^,]{3,45}, [^,]{3,45} and |\w+, [^,]{3,45} and ")
|
||||
# Advisory only. German documents use "und"; without it the cadence hint silently
|
||||
# did nothing on every German package. No external evidence supports a hard ~50% limit,
|
||||
# so this stays a hint and never an error (F06).
|
||||
TRIPLE = re.compile(r"\w+, [^,]{3,45}, [^,]{3,45} (?:and|und) |\w+, [^,]{3,45} (?:and|und) ")
|
||||
|
||||
|
||||
def _bullet_blocks(text: str) -> list[list[str]]:
|
||||
@@ -217,14 +436,21 @@ def main() -> int:
|
||||
errors.extend(scan_document(path, claims))
|
||||
warnings.extend(cadence_checks(path))
|
||||
|
||||
if args.document:
|
||||
print("Mechanical checks only. NOT verified automatically:")
|
||||
for item in UNCHECKED:
|
||||
print(f" - {item}")
|
||||
print()
|
||||
for warning in warnings:
|
||||
print(f"WARN: {warning}")
|
||||
print(f"WARN (advisory, never a gate): {warning}")
|
||||
for error in errors:
|
||||
print(f"ERROR: {error}")
|
||||
if errors:
|
||||
print(f"FAIL: {len(errors)} error(s), {len(warnings)} warning(s)")
|
||||
return 1
|
||||
print(f"PASS: canonical system valid ({len(warnings)} warning(s))")
|
||||
scope = "mechanical checks passed" if args.document else "canonical system valid"
|
||||
print(f"PASS: {scope} ({len(warnings)} advisory warning(s)). "
|
||||
"This is not a truth certificate - see the unchecked list above.")
|
||||
return 0
|
||||
|
||||
|
||||
|
||||
@@ -16,6 +16,21 @@ Core targets:
|
||||
|
||||
Stretch targets include LLM/agent engineer, AI Manager, pure SRE, strategic-account FDE, and Principal roles requiring company-wide architecture or external-customer authority.
|
||||
|
||||
## Working Model and Total Package
|
||||
|
||||
User clarification, 2026-10-06: the current position provides 3 homeoffice days per week.
|
||||
Fewer days are acceptable only for a clear overall improvement over the current role.
|
||||
Assess compensation, scope, development, commute, working time and benefits together;
|
||||
the user has not specified a numerical improvement threshold. Clarify these terms early.
|
||||
Do not treat fewer than 3 homeoffice days as an automatic no-go or assume a prestigious
|
||||
employer compensates for reduced flexibility. The user expects such improvements mainly
|
||||
at FAANG or comparable employers; this remains an expectation rather than an employer restriction.
|
||||
|
||||
The internal Swisscom Geo Platform application is a separate task change: according to
|
||||
the user (2026-10-06), position and seniority remain unchanged and salary would not change
|
||||
substantially. Assess it independently of the external-upgrade objective. The external search
|
||||
continues without waiting for its outcome and remains active even if the internal move succeeds.
|
||||
|
||||
## Application Gate
|
||||
|
||||
Before generating a resume, complete Evidence Fit from `critique_framework.md`.
|
||||
@@ -45,8 +60,8 @@ 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
|
||||
re-derived. `job_scout/state/applications.json` is the durable registry; `application_cohort.json` is
|
||||
a generated historical-cohort projection. `cohort_tracker.py summary` is 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
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Cover Letter Reference
|
||||
|
||||
> A cover letter is optional by default. The resume must earn a screen on its own.
|
||||
> The resume must stand alone. Decide on a letter using the employer and market context below.
|
||||
|
||||
## Decision Gate
|
||||
|
||||
@@ -20,6 +20,14 @@ Normally skip it when:
|
||||
|
||||
Record `Cover Letter Decision: YES/NO` and the reason in the session file before writing.
|
||||
|
||||
For Denmark and Norway, normally prepare a short, specific letter when the process permits it;
|
||||
do not automatically skip it merely because the field is optional. Explain the actual connection
|
||||
to the employer, relevant evidence and any confirmed country/location motivation. One page is
|
||||
the normal limit. Employer instructions against letters or motivation questions in the portal
|
||||
take precedence. If no specific additional value exists, record why the letter is omitted.
|
||||
Sources reviewed 2026-09-11: [Workindenmark](https://www.workindenmark.dk/job-search-in-denmark/your-cover-letter),
|
||||
[NAV](https://arbeidsplassen.nav.no/tips-til-jobbsoknaden).
|
||||
|
||||
## Evidence Rules
|
||||
|
||||
1. Read `resume_builder/canonical/claims.json` first.
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
# Current applications
|
||||
|
||||
Generated from `job_scout/state/applications.json`; do not edit this view.
|
||||
Use current outcome and next action below. Imported legacy notes are historical, not current instructions.
|
||||
|
||||
| Application | Current outcome | Interview reached | Next action |
|
||||
|---|---|---|---|
|
||||
| NVIDIA - Senior DevOps Engineer, Zürich (req JR2024256) | applied | not recorded | No action expected; req pulled ~2026-09-20. Treat as dormant. Does not block NVIDIA JR2027105 (Senior Production Engineer, DGX Cloud). |
|
||||
| RUAG C5I - AI Engineer C5I, Thun (application ID 18027) | rejected_after_interview | yes | Abgeschlossen: Absage nach Interview; Anforderungen vor allem beim Homeoffice nicht vereinbar. Keine weitere Aktion fuer diese Bewerbung offen. |
|
||||
| Schweizer Armee - Kommando Cyber (Kdo Cy), DevOps Engineer III (Data Platform), Zimmerwald (Ref JRQ$540-19848) | rejected_no_interview | not recorded | Closed; no pending application action. Read recorded history before reopening. |
|
||||
| Citadel Securities — Platform Engineer, Research Platform Engineering, Zürich (also NY/Miami) | applied | not recorded | Await response. At first contact, confirm whether the application is for the Zurich seat; relocation to the US remains ruled out. Clarify homeoffice/onsite requirements and the Zurich compensation package. Baseline is 3 homeoffice days/week; fewer days require a clear overall improvement. The posted US salary range is not a Zurich figure. |
|
||||
| SBB - Data Engineer (m/w/d), Asset Management Infrastrukturanlagen, Bern (Job ID 103755) | withdrawn_by_candidate | yes | Closed. For future SBB roles assess Niveau L/Kader; do not generalize SBB bands to other employers. |
|
||||
| AWS (AWS EMEA SARL, Switzerland Branch) — Senior Forward Deployed Engineer, Zürich (job 10504263) | not_proceeding | not recorded | Closed; no pending application action. Read recorded history before reopening. |
|
||||
| Google — Forward Deployed Engineer III, Google Cloud GTM (French, German), Zürich (req 78350205438567110) | not_proceeding | not recorded | Closed; no pending application action. Read recorded history before reopening. |
|
||||
| SDU Center for Energy Informatics, Odense DK — PhD, Theme 2 Predictive Maintenance & Asset Management of Smart Energy Networks (job 4159) | not_proceeding | not recorded | Closed; no pending application action. Read recorded history before reopening. |
|
||||
| Aker BP ASA — Data Product Architect, AI-ready Data Products (FINN 469067315) | rejected_no_interview | not recorded | Closed; no pending application action. Read recorded history before reopening. |
|
||||
| Google - Software Engineer III, Business Home, Zurich (req 93922217108087494) | rejected_no_interview | not recorded | Closed; no pending application action. Read recorded history before reopening. |
|
||||
| Microsoft — Principal Forward Deployed Engineer, SWE (German Speaking), Zürich (req 200043897) | applied | not recorded | Done — await response |
|
||||
| BIS Basel — Senior Data & Analytics Engineer, AI (jr100429, 3-yr term) | rejected_no_interview | not recorded | Abgeschlossen: Absage erhalten; keine weitere Aktion offen. |
|
||||
| NATO JWC Stavanger — Staff Officer, AI Engineer (2030 Digitalisation, G15, 3-yr PLN) | rejected_no_interview | not recorded | Abgeschlossen: Absage erhalten; keine weitere Aktion offen. |
|
||||
| Microsoft — Senior SWE, Industry Solutions Engineering (ISE), Zürich (req 200040836) | rejected_no_interview | not recorded | Closed; no pending application action. Read recorded history before reopening. |
|
||||
| Kraken (Payward) — SRE, AI Agents (remote, CH-eligible) | rejected_no_interview | not recorded | Closed; no pending application action. Read recorded history before reopening. |
|
||||
| Google — Senior Data Engineer (Merchant Data Science), Zürich/MV | rejected_no_interview | not recorded | Closed; no pending application action. Read recorded history before reopening. |
|
||||
| Snowflake — Sr SWE, Enterprise (Observe by Snowflake), Zürich | closed_no_response | not recorded | Closed; no pending application action. Read recorded history before reopening. |
|
||||
| Isovalent (Cisco) Sr Data Engineer, Observability | role_closed | not recorded | Closed; no pending application action. Read recorded history before reopening. |
|
||||
| Google Zürich Sr SWE Infrastructure (Data Pipeline) | not_proceeding | not recorded | Closed; no pending application action. Read recorded history before reopening. |
|
||||
| Kraken AI Infrastructure | rejected_no_interview | not recorded | Closed; no pending application action. Read recorded history before reopening. |
|
||||
| Infineon Doctoral | withdrawn_by_candidate | yes | Closed; no pending application action. Read recorded history before reopening. |
|
||||
| Infineon AI Engineer | not_proceeding | not recorded | Closed; no pending application action. Read recorded history before reopening. |
|
||||
| Apple Data Engineer (ISE, Zurich) | rejected_no_interview | not recorded | Closed; no pending application action. Read recorded history before reopening. |
|
||||
| Google FDE GenAI (Zurich) | paused | not recorded | Likely abandon |
|
||||
| Equinor — Manager / AI Architect, Agentic systems (Stavanger/Oslo/Rotvoll/Sandsli; req JR106747) | rejected_no_interview | not recorded | Closed; no pending application action. Read recorded history before reopening. |
|
||||
| QuantCo Cloud Engineer (Europe/Zürich) | rejected_no_interview | not recorded | Closed; no pending application action. Read recorded history before reopening. |
|
||||
| Swisscom (Schweiz) AG — Data Engineer - Geo Platform, Bern/Worblaufen (internal, req R-0006447) | interviewing | yes | Swisscom-Rueckmeldung zwischen 2026-10-08 und 2026-10-15 abwarten; internen Aufgabenwechsel separat bewerten. Externe Suche unabhaengig vom Ausgang aktiv fortsetzen, auch bei erfolgreichem internem Wechsel. |
|
||||
| Google — Senior Software Engineer, Full Stack, Commerce, Zürich | open | not recorded | No action - superseded by the Staff Shopping Graph package (output/Google_Staff_SWE_Shopping_Graph/). Reopen only if the user explicitly overrides the frontend gap. |
|
||||
| Kongsberg Discovery (Seatex) — Lead Engineer, DevOps and Test Infrastructure, Trondheim | applied | not recorded | Wait for Kongsberg response. Screen prep: embedded targets/HIL question, recency of DevOps/test work (2015-22), relocation to Trondheim, clearance eligibility as German citizen resident in Switzerland, on-site expectations. Package: output/Kongsberg_Lead_Engineer_DevOps_Test_Infra/. |
|
||||
| BIS (Bank for International Settlements) — Senior/Lead Data & Analytics Engineer, MED IT, Basel (jr100498, 3-yr term) | applied | not recorded | Await BIS response. If contacted: ask office days and total package; weigh the 3-year fixed term against the permanent Swisscom post. Interview prep is in the critique: SDMX answer, Swisscom dashboard tool (not in KB), attributed schedule example for project planning, Lead story. |
|
||||
| Google — Staff Software Engineer, Shopping Graph (Feeds Infra), Zürich | applied | not recorded | Await Google response. Google limit: next Google application window counts this submit (3 per rolling 30 days). At first contact clarify level (L6 vs L5), Zurich hybrid days vs current 3 homeoffice days, and total package. Interview prep: SW-4 prototype story as the technical-direction example, plus one concrete Staff-level example the user names; Java currency; end-to-end system design with scale and trade-offs. Package: output/Google_Staff_SWE_Shopping_Graph/. |
|
||||
| NVIDIA — Senior Production Engineer, DGX Cloud, Switzerland Remote (JR2027105) | applied | not recorded | Await response. Send the LinkedIn note to an NVIDIA recruiter or DGX Cloud engineer (draft in session). Interview prep: incident debugged end to end (SW-2/SW-11); safe model rollout in the fab (BS-1, rollout mechanics not in KB); Kubernetes recency; distributed systems at scale; vLLM/SGLang/Dynamo not used. Package: output/NVIDIA_ProdEng_DGX_Cloud/. |
|
||||
|
||||
## Current targeting notes
|
||||
|
||||
- SBB Niveau K/L is SBB-specific. The reported approximate CHF 145k K ceiling is not a salary anchor for other employers.
|
||||
- Assess headroom and total package: working time, holidays, office days, commute and verified benefits. Never decline a Thun-area role on salary band alone.
|
||||
- Childcare-cost coverage at the Swiss Army/Kdo Cy remains unverified; confirm before pricing it.
|
||||
- Norway remains open selectively; the Swiss compensation threshold does not automatically apply there.
|
||||
- An interview does not prove how an ATS or recruiter evaluated the application. No causal inference from a single conversion.
|
||||
- User clarification 2026-10-06: current baseline is 3 homeoffice days/week. Fewer days are acceptable only for a clear overall improvement over the current role; assess total package and commute early, with no automatic rejection based on office days alone. User expects such improvements mainly at FAANG or comparable employers, without restricting the search to them.
|
||||
@@ -11,9 +11,13 @@ Choose before planning content:
|
||||
|---|---|---|
|
||||
| International Tech | FAANG, US-tech, international scale-up, English-language engineering role | 2 pages; no photo or demographic data; conventional headers |
|
||||
| Swiss/DACH | Traditional Swiss/German/Austrian employer or explicit local dossier request | 2 pages normally; optional photo only by user choice; references/certificates separate |
|
||||
| Denmark | Danish employer without a more specific format | Normally 2 pages; tailored professional profile (roughly 4–8 lines), explain unfamiliar employers and relevant collaboration; assess a specific motivation letter |
|
||||
| Norway | Norwegian employer without a more specific format | Normally 2 pages; tailored key qualifications (roughly 4–6 lines), clear responsibilities and results; assess a specific motivation letter |
|
||||
| Employer-specific | NATO, public sector, academic or a mandated portal format | Follow the employer's explicit rules |
|
||||
|
||||
International Tech is the default even when the role is physically located in Europe.
|
||||
International Tech remains the default for international tech recruiting. Use the local Denmark/Norway profile where appropriate; explicit employer requirements and user preferences take precedence. Profile lengths are guidance, not gates. Keep the standing preferences against demographic details; no photo is required.
|
||||
|
||||
Market guidance: [Workindenmark profile](https://www.workindenmark.dk/job-search-in-denmark/your-cv/a-good-personal-profile-counts) and [Tekna CV](https://www.tekna.no/en/career/cv-and-cover-letter/how-to-write-a-good-cv/), reviewed 2026-09-11. Only state relocation or local-language plans if confirmed.
|
||||
|
||||
## 2. Evidence Preflight
|
||||
|
||||
@@ -34,7 +38,7 @@ The reader must see these items in this order:
|
||||
|
||||
1. Name, professional identity, contact/location/work authorization.
|
||||
2. Optional 2--3 line summary.
|
||||
3. Four to six compact skills lines.
|
||||
3. Compact skills block: normally 4–8 rendered lines, checked in the PDF.
|
||||
4. Professional Experience, reverse chronological.
|
||||
5. Education and relevant certifications once.
|
||||
|
||||
@@ -59,7 +63,9 @@ Use relevance and evidence, not page-filling quotas. For Dennis's normal 2-page
|
||||
- Swisscom: 4--5 bullets.
|
||||
- Bosch: 3--4 bullets.
|
||||
- Fraunhofer, Vizrt and Generali: 0--1 bullet each.
|
||||
- Capgemini/Bundeswehr: include only when directly relevant.
|
||||
- **Capgemini: NEVER include.** Standing user preference (`config.md`); the resulting
|
||||
Nov 2014 - May 2015 gap is intentional and must not be "fixed" or explained away.
|
||||
- Bundeswehr: include only when directly relevant (defence, public-sector and security employers).
|
||||
- Typical total: 11--14 bullets. This is a guide, not a requirement.
|
||||
|
||||
A strong shorter resume is better than a full page padded with weak evidence. White space is acceptable when hierarchy and readability are strong.
|
||||
@@ -68,14 +74,14 @@ A strong shorter resume is better than a full page padded with weak evidence. Wh
|
||||
|
||||
The summary is optional. When used:
|
||||
|
||||
- Keep it to 2--3 rendered lines and normally two sentences.
|
||||
- International Tech/Swiss-DACH: normally 2–3 rendered lines. Denmark/Norway: use the profile guidance above, without padding.
|
||||
- State the demonstrated professional identity and two strongest proof points.
|
||||
- Do not state the desired role as if it were prior experience.
|
||||
- Avoid credential lists and unsupported scale claims.
|
||||
|
||||
## 6. Skills
|
||||
|
||||
- Use 4--6 compact lines from `skills_taxonomy.md`.
|
||||
- Use roughly 4–8 rendered lines from `skills_taxonomy.md`, not a count of source macros.
|
||||
- List only canonical `allowed` or context-appropriate `allowed-with-context` skills.
|
||||
- Certification-only skills stay in certification context.
|
||||
- Do not use Expert/Proficient/Familiar self-ratings.
|
||||
@@ -157,3 +163,61 @@ Classify every JD requirement as:
|
||||
- **Gap:** no reliable evidence.
|
||||
|
||||
Never turn Adjacent into Direct by vocabulary substitution. A required, title-defining Gap is an application-fit problem, not a resume-writing problem.
|
||||
|
||||
---
|
||||
|
||||
## Page-one weighting and rendered density (review findings F18/F19, 2026-09-11)
|
||||
|
||||
**The problem, measured:** across four compiled packages the first real employment entry began
|
||||
at **45-55% of page one** (NVIDIA 55.4%, SBB 50.6%, RUAG 50.3%, Aker BP 45.4%). A reader
|
||||
reaching the middle of the page has seen a profile and a skills block, and no evidence yet.
|
||||
Measure with `helpers/page_metrics.py <pdf>` rather than estimating.
|
||||
|
||||
These are **diagnostics, not targets.** There is no pixel goal and no rule that page two must
|
||||
be filled. A package that reads well at 50% is fine; a skills block that pushed evidence there
|
||||
is not.
|
||||
|
||||
### Skills: budget RENDERED lines, not source macros
|
||||
|
||||
The old rule counted `\skillline` macros, which does not control density: six categories with
|
||||
long value lists wrap to **twelve or more rendered lines**. The NVIDIA package is the worked
|
||||
example - six `\skillline` calls, one of them 240 characters.
|
||||
|
||||
- **Aim for roughly 4-8 rendered lines of skills**, verified in the compiled PDF.
|
||||
- **Cut anything the experience bullets already prove.** A skills line repeating "Kubernetes,
|
||||
Docker, GitLab CI/CD" when three bullets below say the same thing spends page-one space to
|
||||
say it twice.
|
||||
- **Keep what the JD actually gates on** plus the ATS literals that are genuinely evidenced.
|
||||
Drop adjacent nice-to-haves; they read as padding and cost the reader's first screen.
|
||||
- Certifications belong on one line, at the end, not spread across categories.
|
||||
|
||||
**Worked example, measured 2026-09-11.** The submitted NVIDIA CV was rebuilt from a copy with
|
||||
this guidance applied - six skill lines cut to four by removing what the experience bullets
|
||||
already prove, and the education entries split per F19. Result: the experience section moved
|
||||
from **55.4% to 44.0%** of page one, page-one text lines from 47 to 39, still two pages, zero
|
||||
overfull boxes, validator PASS. The submitted document itself was NOT modified (F17: archives
|
||||
are evidence).
|
||||
|
||||
### Order: employer chronology stays, evidence order inside a position does not
|
||||
|
||||
- **Keep reverse-chronological employers.** Swiss and German readers expect it and breaking it
|
||||
looks evasive.
|
||||
- **Within a position, lead with the bullet closest to the target role**, not with the one that
|
||||
happens to be most senior or most recent. The chronology is between employers, not inside one.
|
||||
- After the short profile, the next thing should be **either the experience section or a very
|
||||
compact competence block**. Not both at full length.
|
||||
|
||||
### Education (F19)
|
||||
|
||||
Long single-cell entries - degree, focus, institution, right-aligned date - produce visible
|
||||
word-spacing and mid-word breaks. Seen in SBB, NVIDIA and Aker BP.
|
||||
|
||||
- **Split the entry**: degree on the entry line, institution (and focus) on the line below.
|
||||
`RUAG_AI_Engineer_C5I` is the model that already does this well.
|
||||
- **Grades and thesis stay only where they carry concrete relevance.** For an experienced
|
||||
industry profile they usually do not; `claims.json` `grade_output_rule` already says grades
|
||||
are off by default. The M.Eng. thesis is worth naming when the role touches condition
|
||||
monitoring, diagnostics or industrial sensor data - as the SBB asset-management req did -
|
||||
and otherwise not.
|
||||
- Do not let an immutable template line force education detail into a document that does not
|
||||
need it.
|
||||
@@ -5,7 +5,7 @@
|
||||
Before generation, editing or critique:
|
||||
|
||||
1. Read `resume_builder/canonical/claims.json` completely.
|
||||
2. Read `config.md` and `AGENTS.md` corrections/status.
|
||||
2. Read `config.md`, `AGENTS.md` corrections and `resume_builder/reference/current_applications.md`. Application status is authoritative in `job_scout/state/applications.json`; the Markdown view and old cohort JSON are generated projections. Historical events are not current instructions.
|
||||
3. Run `python resume_builder/helpers/validate_resume_system.py`.
|
||||
4. Treat canonical claims as higher authority than extractions, experience files, bundles, sessions or outputs.
|
||||
5. Never use a file under `output/` as source content for a new application. Consult `resume_builder/canonical/historical_outputs.json`.
|
||||
@@ -33,7 +33,7 @@ Read `resume_builder/reference/application_strategy.md` and `critique_framework.
|
||||
|
||||
## Audience and Cover-Letter Decisions
|
||||
|
||||
Select International Tech, Swiss/DACH or Employer-specific format before writing. International Tech is default.
|
||||
Select the appropriate profile in `resume_reference.md` before writing, including Denmark/Norway when applicable. International Tech is the default for international tech recruiting; employer requirements take precedence.
|
||||
|
||||
Apply `cl_reference.md` and record `Cover Letter Decision: YES/NO`. A deliberately omitted letter is a valid complete package.
|
||||
|
||||
@@ -88,4 +88,4 @@ After explicit approval:
|
||||
|
||||
## Progress and Recovery
|
||||
|
||||
Give short progress updates at major steps. Before ending or clearing context, update session Status and the Active Sessions pointer. If interrupted, add a Resume Point describing completed work and the exact next action.
|
||||
Give short progress updates at major steps. Before ending or clearing context, update session Status and the application registry through the tracker; regenerate its views. Do not duplicate status in AGENTS or CLAUDE. If interrupted, add a Resume Point describing completed work and the exact next action.
|
||||
@@ -0,0 +1,59 @@
|
||||
<!-- Shared workflow version: 2026-09-11 -->
|
||||
|
||||
# Critique an Application Package
|
||||
|
||||
## Startup
|
||||
|
||||
1. Read `resume_builder/reference/shared_ops.md`.
|
||||
2. Read `resume_builder/canonical/claims.json` completely.
|
||||
3. Read `config.md`, the session file, and the real verbatim JD.
|
||||
4. Stop if the JD is reconstructed, incomplete or inferred.
|
||||
5. Read `resume_builder/reference/critique_framework.md` and `resume_builder/support/ai_fingerprint_rules.md`.
|
||||
6. Read the resume and optional cover letter. Never use either as evidence; verify against canonical claims and experience files.
|
||||
|
||||
## Preflight
|
||||
|
||||
Run:
|
||||
|
||||
```powershell
|
||||
python resume_builder/helpers/validate_resume_system.py --document <resume.tex>
|
||||
```
|
||||
|
||||
Add `--document <cover_letter.tex>` when a letter exists. Any failure is Tier 1 and prevents approval.
|
||||
|
||||
Compile the documents and inspect the PDFs. Extract resume text with `pdftotext` and confirm that employer, formal title and dates appear in the expected order.
|
||||
|
||||
## Critique
|
||||
|
||||
Follow `critique_framework.md` exactly:
|
||||
|
||||
1. Hard-gate audit.
|
||||
2. Evidence Fit score, independent of writing.
|
||||
3. Document Quality score, independent of role fit.
|
||||
4. Channel Strength rating.
|
||||
5. Competitive and reader-sequence assessment.
|
||||
6. Canonical claim audit.
|
||||
7. Tiered fixes.
|
||||
8. Cover-letter decision/critique.
|
||||
9. Mechanical verification.
|
||||
|
||||
Do not issue a single overall score. Do not label a high-quality document submit-ready when Evidence Fit fails a hard gate.
|
||||
|
||||
## Cover-Letter Handling
|
||||
|
||||
If the session records `Cover Letter Decision: NO`, do not penalize absence. If a letter exists, first assess whether it should exist under `cl_reference.md`.
|
||||
|
||||
## Save and Report
|
||||
|
||||
Save `output/<Folder>/critique_<name>.md`. Update the session with:
|
||||
|
||||
- Evidence Fit score and Core/Adjacent/Stretch classification.
|
||||
- Hard-gate result.
|
||||
- Document Quality score.
|
||||
- Channel Strength.
|
||||
- Tier 1 fixes.
|
||||
- Critique status and date.
|
||||
|
||||
Present the fit verdict first, then the two scores and actionable fixes. Wait for explicit user approval before finalization or editing.
|
||||
|
||||
When approved, run the finalization checks from `shared_ops.md`. A package with a hard-gate NO-GO may be archived, but must not be described as recommended for submission.
|
||||
@@ -0,0 +1,48 @@
|
||||
<!-- Shared workflow version: 2026-09-11 -->
|
||||
|
||||
# Edit a Resume or Cover Letter
|
||||
|
||||
## Startup
|
||||
|
||||
1. Read `shared_ops.md` and `resume_builder/canonical/claims.json` completely.
|
||||
2. Run the system validator.
|
||||
3. Read the session, real JD, target `.tex`, critique/feedback, selected profile rules and relevant experience files.
|
||||
4. Check `historical_outputs.json`. A package marked unsafe must be regenerated from canonical sources rather than lightly polished.
|
||||
5. If the package was already submitted, preserve it as history. Create a clearly named new version only when the user requests a reusable corrected document.
|
||||
|
||||
## Diagnose
|
||||
|
||||
Classify requested changes as:
|
||||
|
||||
- Truth/provenance correction.
|
||||
- Fit/framing correction.
|
||||
- Information hierarchy or readability.
|
||||
- Content selection.
|
||||
- Mechanical/LaTeX.
|
||||
- Blocked because evidence is absent.
|
||||
|
||||
Do not treat whitespace, equal bullet lengths or an exact character target as defects. Do not add filler. A critique cannot authorize an unsupported claim.
|
||||
|
||||
Present a concise edit plan and wait for explicit confirmation unless the user already approved specific edits.
|
||||
|
||||
## Execute
|
||||
|
||||
- Source every work claim from canonical IDs and experience files.
|
||||
- Keep employer/title/date hierarchy conventional.
|
||||
- Preserve natural bullet lengths and verified ownership scope.
|
||||
- Remove unsupported skills rather than replacing them with synonyms.
|
||||
- Update a cover letter only when its session decision is YES or the user explicitly requests it.
|
||||
- If edits reveal a hard fit gate, update the Evidence Fit classification; writing improvements cannot remove the gate.
|
||||
|
||||
## Verify
|
||||
|
||||
Run the validator on every edited document, compile, inspect the PDF, and verify extracted text order. Compare before/after for:
|
||||
|
||||
- validator failures;
|
||||
- page count;
|
||||
- employer/title/date visibility;
|
||||
- bullet count and relevance;
|
||||
- duplicated sections;
|
||||
- readability at normal size.
|
||||
|
||||
Update the session Edit History, Document Quality, status and next action. Mark the critique stale after material edits. Present results and wait for approval.
|
||||
@@ -0,0 +1,43 @@
|
||||
<!-- Shared workflow version: 2026-09-11 -->
|
||||
|
||||
# Decide and Generate a Cover Letter
|
||||
|
||||
## Startup
|
||||
|
||||
1. Read `shared_ops.md`, `resume_builder/canonical/claims.json`, `cl_reference.md`, the session, real JD and finished resume.
|
||||
2. Run the validator on the resume.
|
||||
3. Confirm that the session has a completed resume and a recorded Cover Letter Decision.
|
||||
|
||||
## Decision Gate
|
||||
|
||||
If the session says NO, explain the recorded reason and stop unless the user explicitly asks to override it. If no decision exists, apply `cl_reference.md` before writing and record YES/NO.
|
||||
|
||||
Do not generate a letter merely because an upload field exists or because older workflow expected a three-page package.
|
||||
|
||||
## Plan
|
||||
|
||||
State in one sentence what the letter adds beyond the resume. Select at most two evidence themes. Verify any named company/product/programme hook from a current primary source and save its URL in the session.
|
||||
|
||||
If the only possible content repeats resume bullets or paraphrases company news, change the decision to NO and explain why.
|
||||
|
||||
## Generate
|
||||
|
||||
- Use the selected audience profile and employer-requested language.
|
||||
- International Tech/industry: normally 200--300 words in two or three paragraphs.
|
||||
- Swiss/DACH: one A4 page, appropriate formality.
|
||||
- Denmark/Norway: normally one page with specific employer and country motivation; follow `cl_reference.md` when deciding whether to write one.
|
||||
- Employer-specific: follow the requested format or portal limit.
|
||||
- Lead with candidate-role connection.
|
||||
- Add motivation, decision context or a genuine connection.
|
||||
- Use only claims already present in both the canonical registry and resume.
|
||||
- Never introduce a new tool, metric, customer, ownership claim or result.
|
||||
|
||||
## Verify
|
||||
|
||||
Run:
|
||||
|
||||
```powershell
|
||||
python resume_builder/helpers/validate_resume_system.py --document <resume.tex> --document <cover_letter.tex>
|
||||
```
|
||||
|
||||
Compile and inspect the letter. Confirm it is readable, within the employer's limit, and materially different from the resume. Update the session and present the letter for approval. Point to `/critique` next.
|
||||
@@ -0,0 +1,86 @@
|
||||
<!-- Shared workflow version: 2026-09-11 -->
|
||||
|
||||
# Generate a Resume
|
||||
|
||||
## Input
|
||||
|
||||
Accept a JD file, pasted JD, or URL. Obtain the real posting text before analysis. If it cannot be retrieved, ask the user to paste it; never reconstruct it.
|
||||
|
||||
## Phase 0 — Canonical and JD Preflight
|
||||
|
||||
1. Read `resume_builder/reference/shared_ops.md`.
|
||||
2. Read `resume_builder/canonical/claims.json` completely.
|
||||
3. Read `config.md`, `AGENTS.md`, `application_strategy.md`, `resume_reference.md`, and `critique_framework.md`.
|
||||
4. Run `python resume_builder/helpers/validate_resume_system.py`.
|
||||
5. Verify and save the verbatim JD; record source/date/status.
|
||||
6. Create the output folder and session from `session_file_template.md`.
|
||||
|
||||
## Phase 1 — Fit Gate Before Writing
|
||||
|
||||
Build a requirement table with Required/Preferred and Direct/Adjacent/Gap/Constraint classifications. Cite canonical claim IDs for every Direct or Adjacent match.
|
||||
|
||||
Compute Evidence Fit and identify hard gates using `critique_framework.md`. Then assign:
|
||||
|
||||
- Core.
|
||||
- Adjacent.
|
||||
- Stretch.
|
||||
- No-go.
|
||||
|
||||
Record Channel Strength and a warm-channel action for Core roles.
|
||||
|
||||
Stop and present the fit decision before resume planning when:
|
||||
|
||||
- a hard gate fails;
|
||||
- the role is Stretch;
|
||||
- a practical constraint is unresolved.
|
||||
|
||||
Proceed on a no-go only after the user explicitly overrides the stated reason. An override does not change the fit classification.
|
||||
|
||||
## Phase 2 — Audience and Content Plan
|
||||
|
||||
Select the audience profile from `resume_reference.md`: International Tech, Swiss/DACH, Denmark, Norway or Employer-specific. Employer requirements take precedence.
|
||||
|
||||
Read the matching role bundle, `skills_taxonomy.md`, `achievement_reframing_guide.md`, and only the experience files needed for selected claims.
|
||||
|
||||
Plan:
|
||||
|
||||
- Optional summary sized to the selected audience profile.
|
||||
- Compact evidence-backed skills block, normally 4–8 rendered lines, verified in the PDF.
|
||||
- Swisscom 4--5 bullets.
|
||||
- Bosch 3--4 bullets.
|
||||
- Zero or one bullet for each older role.
|
||||
- Normally 11--14 bullets total, with no page-fill quota.
|
||||
|
||||
For each proposed bullet show canonical ID, evidence type, scope, and why it belongs. Identify any impact metric that still needs user confirmation.
|
||||
|
||||
Apply `cl_reference.md` and propose `Cover Letter Decision: YES/NO` with one reason.
|
||||
|
||||
Present the plan and wait for explicit user confirmation before generation.
|
||||
|
||||
## Phase 3 — Generate
|
||||
|
||||
Copy `resume.cls` and `resume_template.tex` into the output folder. For a Swiss/DACH audience, also read `resume_template_dach.tex` as an audience-policy overlay; it is not a standalone document. Write fresh content from canonical claims and experience records; never copy a historical output.
|
||||
|
||||
Rules:
|
||||
|
||||
- Employer, formal/transparent title, dates and location come first.
|
||||
- Do not use tailored themes as job titles.
|
||||
- Mix natural bullet lengths.
|
||||
- Use only verified metrics and outcomes.
|
||||
- Preserve allowed verbs and ownership scope.
|
||||
- Never add a skill to mirror the JD.
|
||||
- Certifications appear once.
|
||||
|
||||
## Phase 4 — Validate and Inspect
|
||||
|
||||
Run:
|
||||
|
||||
```powershell
|
||||
python resume_builder/helpers/validate_resume_system.py --document <resume.tex>
|
||||
```
|
||||
|
||||
Fix every failure. Compile the LaTeX, inspect both pages, and run `pdftotext` to verify parsing and information order. Do not add filler to reduce whitespace.
|
||||
|
||||
Update the session with the as-built content, validation results, page count, cover-letter decision, and next action.
|
||||
|
||||
Present the finished resume and the original Evidence Fit classification. Wait for approval. If the cover-letter decision is YES, point to `/make-cl`; otherwise point directly to `/critique`.
|
||||
@@ -0,0 +1,79 @@
|
||||
<!-- Shared workflow version: 2026-09-11 -->
|
||||
|
||||
# Build or Update the Knowledge Base
|
||||
|
||||
## Authority Model
|
||||
|
||||
The pipeline is:
|
||||
|
||||
`source documents -> extractions -> canonical claims -> experience records/bundles -> generated applications`
|
||||
|
||||
Generated applications never flow backward into the KB.
|
||||
|
||||
Read `resume_builder/canonical/claims.json`, `config.md`, and all relevant extractions before changing normalized sources. Preserve raw source documents. A verified correction must update canonical claims first and then every dependent normalized file.
|
||||
|
||||
## Canonical Claim Record
|
||||
|
||||
For each employment item or achievement, record:
|
||||
|
||||
- stable ID;
|
||||
- employer, title, dates and location;
|
||||
- factual scope;
|
||||
- individual vs shared ownership;
|
||||
- allowed verbs;
|
||||
- forbidden overstatements;
|
||||
- metric/result and verification status;
|
||||
- evidence source;
|
||||
- last verified date.
|
||||
|
||||
When ownership is ambiguous, use contributing/shared scope and ask the user. Do not default to full ownership.
|
||||
|
||||
## Experience Files
|
||||
|
||||
Experience files explain facts and context. They may contain example phrasings, but those examples cannot override canonical scope and should not be optimized to fixed line counts.
|
||||
|
||||
Every achievement section must include canonical ID, source, ownership scope, status, verified result/metric state, relevant skills and role relevance.
|
||||
|
||||
## Skills Taxonomy
|
||||
|
||||
Use only these evidence levels:
|
||||
|
||||
- Production — current.
|
||||
- Production — historical.
|
||||
- Hands-on — current.
|
||||
- Project / proof of concept.
|
||||
- Certification / coursework.
|
||||
- Unverified / never used.
|
||||
|
||||
Do not assign Expert/Proficient/Familiar labels. Add a skill to canonical claims before it can appear in a generated document.
|
||||
|
||||
## Role Bundles
|
||||
|
||||
Each bundle must contain:
|
||||
|
||||
1. Defensible positioning.
|
||||
2. Good-fit roles and hard-gate cautions.
|
||||
3. Achievement priorities.
|
||||
4. Safe reframing rules.
|
||||
5. Evidence-backed skills guidance.
|
||||
6. Conditional cover-letter guidance.
|
||||
|
||||
Bundles may rank evidence; they may not broaden it. Title-defining gaps must be stated explicitly.
|
||||
|
||||
## Significance Context
|
||||
|
||||
Keep company/industry context separate from candidate impact. Mark external claims for re-verification at application time. Never attach generic scale, economics, customers or market trends to the candidate.
|
||||
|
||||
## Correction Propagation
|
||||
|
||||
After any correction, search canonical claims, config, extractions, experience files, bundles, support files, templates and active drafts. Historical submitted outputs remain unchanged but update `historical_outputs.json` when they become unsafe for reuse.
|
||||
|
||||
## Validation
|
||||
|
||||
Run:
|
||||
|
||||
```powershell
|
||||
python resume_builder/helpers/validate_resume_system.py
|
||||
```
|
||||
|
||||
Then review the diff for dates, titles, ownership, metrics and skill evidence. Present the changed claim records and affected downstream files to the user for confirmation.
|
||||
@@ -0,0 +1,98 @@
|
||||
<!-- Shared workflow version: 2026-09-11 -->
|
||||
|
||||
# Source Evidence Extraction
|
||||
|
||||
Use this skill when adding new evidence to `knowledge_base/extractions/`. Extraction preserves what a source supports; it does not tailor claims to a vacancy.
|
||||
|
||||
## Required inputs
|
||||
|
||||
1. Read `config.md` and the anti-fabrication rules in `AGENTS.md`.
|
||||
2. Read the complete source material.
|
||||
3. Check `resume_builder/canonical/claims.json` for existing facts and identifiers.
|
||||
4. Inspect related extraction files so new evidence does not create a duplicate or contradiction.
|
||||
|
||||
Generated resumes, cover letters, critiques, and session files under `output/` are never evidence sources.
|
||||
|
||||
## Extraction procedure
|
||||
|
||||
### 1. Identify the source
|
||||
|
||||
Record:
|
||||
|
||||
- source filename and type;
|
||||
- source date, if known;
|
||||
- whether it is primary evidence, user-authored notes, or a secondary description;
|
||||
- the person, employer, project, or publication it concerns.
|
||||
|
||||
### 2. Separate evidence from inference
|
||||
|
||||
For every potentially reusable fact, record:
|
||||
|
||||
- the source-supported statement;
|
||||
- the exact supporting passage or precise location;
|
||||
- any interpretation separately as `Inference`;
|
||||
- confidence: `verified`, `user-confirmed`, `needs verification`, or `do not use`.
|
||||
|
||||
Never silently convert an inference into a verified claim.
|
||||
|
||||
### 3. Capture career facts precisely
|
||||
|
||||
When applicable, extract:
|
||||
|
||||
- exact employer, formal title, location, and start/end dates;
|
||||
- ownership scope and collaborators;
|
||||
- work performed, method, technology, and domain;
|
||||
- outcome and beneficiary;
|
||||
- metrics with units, baseline, period, and attribution;
|
||||
- publication status, authorship position, and venue;
|
||||
- current versus historical skill use;
|
||||
- certification versus practical experience.
|
||||
|
||||
For large-company work, describe only the user's component, domain, pipeline, service, or contribution. Do not infer ownership of organization-wide platforms or transformations.
|
||||
|
||||
### 4. Record claim controls
|
||||
|
||||
For each major claim, include where useful:
|
||||
|
||||
- allowed verbs;
|
||||
- verbs or framings that would overstate ownership;
|
||||
- safe resume wording;
|
||||
- known contradictions requiring resolution;
|
||||
- whether a metric is verified, qualitative only, or still missing.
|
||||
|
||||
### 5. Write the extraction
|
||||
|
||||
Create or update a focused Markdown file in `knowledge_base/extractions/`. Use a clear structure such as:
|
||||
|
||||
```markdown
|
||||
# Subject
|
||||
|
||||
## Source
|
||||
## Verified facts
|
||||
## Ownership and attribution
|
||||
## Outcomes and metrics
|
||||
## Skills and recency
|
||||
## Safe claim seeds
|
||||
## Inferences / open questions
|
||||
## Conflicts with existing KB
|
||||
```
|
||||
|
||||
Claim seeds are factual building blocks, not polished resume bullets. Do not add unsupported impact language for relevance.
|
||||
|
||||
## Publication rules
|
||||
|
||||
- Never infer `published`, `accepted`, or `under review` from a manuscript file.
|
||||
- Preserve the user's author position.
|
||||
- Institutional funding is not a personal award.
|
||||
- Follow `config.md` provenance flags.
|
||||
|
||||
## Completion
|
||||
|
||||
Report:
|
||||
|
||||
- files created or updated;
|
||||
- newly verified facts;
|
||||
- unresolved contradictions or missing metrics;
|
||||
- suggested next command: use `setup-build-kb` to promote reviewed evidence into the canonical registry, experience files, bundles, and support files.
|
||||
|
||||
Do not update canonical claims from an unreviewed extraction.
|
||||
@@ -286,7 +286,7 @@ Each achievement has a **Significance** line (why it matters to any reader) and
|
||||
|
||||
| Role Type | Priority | Lead Verb | Framing Angle |
|
||||
|-----------|----------|-----------|---------------|
|
||||
| All roles | LOW | Implemented | CV only — do not include on 2-page resume |
|
||||
| All roles | EXCLUDED | — | Historical record only; omit Capgemini from every document |
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -60,12 +60,22 @@ Do not use Expert/Proficient/Familiar labels in resumes. Evidence and recency ar
|
||||
| Domain-grounded assistants/custom GPTs | Hands-on — current | Configured with curated knowledge; no fine-tuning or formal evaluation |
|
||||
| Copilot, Kiro | Hands-on — current | AI-assisted engineering tools, not LLM product engineering |
|
||||
|
||||
| Linux administration | Professional 2020–2022 (BS-6) + personal and current (PP-3) | Employer-side use ended Dec 2022; PP-3 is a personal Debian server and must be named as such. Not evidence of physical-datacenter work |
|
||||
| Ansible | Professional — intensive at Bosch (BS-6) | Configuration management and IaC, including self-written extensions. Does NOT license Terraform. **GitOps is forbidden** — push-based execution, no reconciliation agent |
|
||||
| Bash / shell scripting | Professional-historical + personal-current (BS-6, PP-3) | Added to `claims.json` 2026-09-05. Does NOT license Groovy, nor systems/kernel-level claims |
|
||||
|
||||
## Personal-Project Framework Experience
|
||||
|
||||
| Skill | Evidence level | Safe framing |
|
||||
|---|---|---|
|
||||
| Django, Flask, FastAPI | Project / proof of concept — private/hobby projects (PP-4) | Used in personal projects, user-confirmed 2026-09-18. Never used professionally. Project details, dates and depth are not established; do not attach to an employer or a named project without confirmation. |
|
||||
|
||||
## Certification-Only Signals
|
||||
|
||||
| Skill | Evidence |
|
||||
|---|---|
|
||||
| TensorFlow / Keras | IBM AI Engineering coursework |
|
||||
| PyTorch | Coursework/personal evidence only; verify before listing outside certification context |
|
||||
| PyTorch | **Certification-backed** (IBM AI Engineering, 4 Jun 2020, verify code 3ZBZFVAL6A34). `claims.json` output policy is `certification-context-only`: list only beside the certificate |
|
||||
| Spark ML | Coursework context only unless professional evidence is added |
|
||||
| AI for Trading / quantitative ML | Udacity/WorldQuant Nanodegree |
|
||||
|
||||
@@ -77,8 +87,9 @@ Do not use Expert/Proficient/Familiar labels in resumes. Evidence and recency ar
|
||||
- Terraform
|
||||
- Formal model or LLM evaluation
|
||||
- LLM fine-tuning, red-teaming or model-training ownership
|
||||
- FastAPI, Flask or Django
|
||||
- Enterprise SaaS/SSO administration — user confirmed 2026-09-18 that he has not performed it. Do not infer enterprise identity administration from personal hosting or secrets-management work.
|
||||
- TypeScript
|
||||
- Frontend/UI development — user answered no to frontend experience on 2026-10-03. Backend JavaScript and Selenium UI testing do not establish frontend development; do not claim Full Stack expertise.
|
||||
- Petabyte-scale ownership
|
||||
|
||||
## Certifications
|
||||
@@ -90,7 +101,7 @@ Do not use Expert/Proficient/Familiar labels in resumes. Evidence and recency ar
|
||||
| iSAQB CPSA — Foundation | iSAQB | 2016; no expiry |
|
||||
| ITIL Foundation | PEOPLECERT / AXELOS | 2016; no expiry |
|
||||
| AI for Trading Nanodegree | Udacity / WorldQuant | 2021 |
|
||||
| IBM AI Engineering Specialization | IBM / Coursera | Completion year not recorded |
|
||||
| IBM AI Engineering Specialization | IBM / Coursera | **Completed 4 Jun 2020**, no expiry, verify code 3ZBZFVAL6A34 (certificate read 2026-08-27). Explicitly non-credit — never present as an academic qualification |
|
||||
|
||||
The Swisscom Security Champion assignment is not a certification and does not belong in this table.
|
||||
|
||||
|
||||
@@ -27,7 +27,12 @@ Bern, Switzerland $\vert$
|
||||
\textit{City, country}
|
||||
|
||||
\vspace{1em}
|
||||
\today
|
||||
% APPLICATION DATE -- replace with the literal date this letter is sent,
|
||||
% e.g. 11 September 2026. Do NOT use \today (review finding F17, 2026-09-11):
|
||||
% it makes the document date-dependent, so recompiling a historical letter silently
|
||||
% restamps it with the current date. 17 existing packages already carry that defect
|
||||
% and are deliberately left alone; new ones must not add to it.
|
||||
[GENERATE: application date, literal]
|
||||
|
||||
\vspace{1em}
|
||||
\textbf{Application for \textit{exact role title}}
|
||||
|
||||
@@ -1,6 +1,22 @@
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
% TEMPLATE: Academic CV (cv.cls)
|
||||
% FIXED sections contain actual content — copy verbatim during generation
|
||||
% ============================================================================
|
||||
% ACADEMIC LEGACY TEMPLATE -- NOT the industry path (review finding F09, 2026-09-11)
|
||||
%
|
||||
% This is the long-form ACADEMIC CV. It still uses fixed page targets, rendered-line
|
||||
% budgets and 2L/3L bullet variants -- all of which the project dropped for industry
|
||||
% documents, where natural bullet length and relevance govern selection.
|
||||
%
|
||||
% Use resume_template.tex (International Tech) or resume_template_dach.tex (Swiss/DACH)
|
||||
% for every employer application. A European PROFESSIONAL CV is not an academic long CV;
|
||||
% do not reach for this file just because a posting says "CV".
|
||||
%
|
||||
% Use this only for academic or research applications that genuinely want a long CV with
|
||||
% publications. Its [GENERATE: ...] placeholders and asset expectations (GS.png, orcid.png)
|
||||
% must all be resolved before output -- the document scanner now fails on a leftover
|
||||
% placeholder.
|
||||
% ============================================================================
|
||||
% JD-DEPENDENT sections have [GENERATE: ...] placeholders — replace per JD
|
||||
%
|
||||
% SETUP INSTRUCTIONS:
|
||||
|
||||
@@ -33,14 +33,13 @@
|
||||
\begin{document}
|
||||
|
||||
\begin{rSection}{Summary}
|
||||
Staff data engineer with 12+ years of production software experience across telecom, semiconductor manufacturing, broadcast technology and insurance. Owns business-critical pipeline components at Swisscom and previously integrated containerized ML inference into a continuously operating Bosch semiconductor fab.
|
||||
Staff data engineer with over ten years of production software experience across telecom, semiconductor manufacturing, broadcast technology and insurance. Owns business-critical pipeline components at Swisscom and previously integrated containerized ML inference into a continuously operating Bosch semiconductor fab.
|
||||
\end{rSection}
|
||||
|
||||
\begin{rSection}{Technical Skills}
|
||||
\skillline{Languages}{Python, SQL; Java and C\# (professional, historical); C++ and JavaScript (limited historical use)}
|
||||
\skillline{Data}{Apache Kafka, Airflow, PySpark, Oracle, Teradata, Hadoop/Impala, data products, metadata and governance}
|
||||
\skillline{Cloud and platform}{AWS (S3, Glue, Athena/Iceberg, Redshift), CloudFormation, Kubernetes, Docker, GitLab CI/CD, Ansible}
|
||||
\skillline{ML delivery}{Production inference deployment and support, on-call operations; ELK, Grafana and Prometheus proof-of-concept work}
|
||||
\skillline{Certifications}{AWS Solutions Architect -- Associate; Data Engineering with AWS; iSAQB CPSA-F; ITIL Foundation}
|
||||
\end{rSection}
|
||||
|
||||
@@ -80,11 +79,19 @@ Staff data engineer with 12+ years of production software experience across tele
|
||||
|
||||
\end{rSection}
|
||||
|
||||
% EDUCATION LAYOUT (review finding F19, 2026-09-11)
|
||||
% Keep the degree on the entry line and the institution on the line below. Cramming
|
||||
% degree + focus + institution into one cell with a right-aligned date produces visible
|
||||
% word spacing and mid-word breaks - seen in the SBB, NVIDIA and Aker BP packages.
|
||||
% Grades and thesis only where they carry concrete relevance; see claims.json
|
||||
% grade_output_rule, which keeps grades off by default.
|
||||
\begin{rSection}{Education}
|
||||
\compactentry{M.Eng. Computer Aided Engineering (Software Design \& Engineering), Universität der Bundeswehr München}{Apr 2012 -- Oct 2013}
|
||||
Thesis at Tongji University, Shanghai: \textit{Development of a Web-Based Remote Fault Diagnosis System}; grade 1.0.
|
||||
\compactentry{M.Eng. Computer Aided Engineering}{Apr 2012 -- Oct 2013}
|
||||
Universität der Bundeswehr München; Software Design \& Engineering.
|
||||
% Add thesis or grade only when relevant to this application, using the canonical facts.
|
||||
|
||||
\compactentry{B.Eng. Information and Telecommunication Technologies, Universität der Bundeswehr München}{Oct 2009 -- Oct 2012}
|
||||
\compactentry{B.Eng. Information and Telecommunication Technologies}{Oct 2009 -- Oct 2012}
|
||||
Universität der Bundeswehr München.
|
||||
\end{rSection}
|
||||
|
||||
\end{document}
|
||||
@@ -0,0 +1,96 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import contextlib
|
||||
import io
|
||||
import json
|
||||
import sys
|
||||
import tempfile
|
||||
import unittest
|
||||
from pathlib import Path
|
||||
from unittest.mock import patch
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
sys.path.insert(0, str(ROOT / "resume_builder/helpers"))
|
||||
import application_records as records
|
||||
import application_tracker as tracker
|
||||
from argparse import Namespace
|
||||
import copy
|
||||
|
||||
|
||||
class ApplicationRecordTests(unittest.TestCase):
|
||||
def test_generated_views_are_current(self):
|
||||
self.assertEqual([], records.render(records.load(), check=True))
|
||||
|
||||
def test_imported_outcomes_preserve_interview_and_closed_state(self):
|
||||
applications = records.load()["applications"]
|
||||
self.assertEqual(len(applications), len({row["id"] for row in applications}))
|
||||
sbb = next(row for row in applications if row["company"] == "SBB")
|
||||
self.assertEqual("withdrawn_by_candidate", sbb["outcome"])
|
||||
self.assertTrue(records.interview_reached(sbb))
|
||||
for token in ("200040836", "JR106747", "JRQ$540-19848"):
|
||||
row = next(row for row in applications if token in row["label"])
|
||||
self.assertEqual("rejected_no_interview", row["outcome"])
|
||||
|
||||
def test_both_agents_link_to_one_view(self):
|
||||
for name in ("AGENTS.md", "CLAUDE.md"):
|
||||
text = (ROOT / name).read_text(encoding="utf-8")
|
||||
section = text.split("## Active Sessions", 1)[1].split("## KB Corrections", 1)[0]
|
||||
self.assertIn("resume_builder/reference/current_applications.md", section)
|
||||
self.assertNotIn("| Session |", section)
|
||||
|
||||
def test_atomic_write_leaves_no_shared_temp_file(self):
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
path = Path(directory) / "state.json"
|
||||
records.atomic_write(path, '{"value": 1}\n')
|
||||
self.assertEqual({"value": 1}, json.loads(path.read_text()))
|
||||
self.assertEqual([path], list(Path(directory).iterdir()))
|
||||
|
||||
def args(self, **overrides):
|
||||
fields = dict(id=None, company="Example", role="Engineer", date="2026-09-11", job_id="req-1", url=None,
|
||||
fit_class="core", evidence_fit=79, hard_gate="pass", channel="weak", outcome="applied",
|
||||
fit_override_reason=None, rubric_version="test", next_action="Await response.")
|
||||
fields.update(overrides)
|
||||
return Namespace(**fields)
|
||||
|
||||
def test_more_than_ten_applications_and_idempotent_retry(self):
|
||||
data = records.load()
|
||||
for index in range(11):
|
||||
tracker.add_application(data, self.args(job_id=f"new-{index}", role=f"Engineer {index}"))
|
||||
count = len(data["applications"])
|
||||
tracker.add_application(data, self.args(job_id="new-10", role="Engineer 10"))
|
||||
self.assertEqual(count, len(data["applications"]))
|
||||
|
||||
def test_bad_dates_scores_and_unexplained_classification_are_rejected(self):
|
||||
for fields in ({"date":"2026-99-11"}, {"evidence_fit":101}, {"evidence_fit":float("nan")},
|
||||
{"fit_class":"adjacent"}, {"hard_gate":"fail"}):
|
||||
with self.subTest(fields=fields), self.assertRaises(ValueError):
|
||||
tracker.add_application(records.load(), self.args(**fields))
|
||||
|
||||
def test_outcome_update_preserves_interview_event_and_is_idempotent(self):
|
||||
data = records.load()
|
||||
tracker.add_application(data, self.args())
|
||||
row = data["applications"][-1]
|
||||
invited = Namespace(id=row["id"], date="2026-09-12", event="interview_invited", outcome=None, note=None, next_action=None)
|
||||
tracker.update_application(data, invited)
|
||||
withdrawn = Namespace(id=row["id"], date="2026-09-13", event=None, outcome="withdrawn_by_candidate", note="Decision", next_action=None)
|
||||
tracker.update_application(data, withdrawn)
|
||||
tracker.update_application(data, withdrawn)
|
||||
self.assertEqual(3, len(row["events"]))
|
||||
self.assertTrue(records.interview_reached(row))
|
||||
self.assertEqual("withdrawn_by_candidate", row["outcome"])
|
||||
tracker.add_application(data, self.args())
|
||||
self.assertEqual("withdrawn_by_candidate", row["outcome"])
|
||||
|
||||
def test_transaction_failure_does_not_write_registry(self):
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
path = Path(directory) / "applications.json"
|
||||
initial = json.dumps(records.load())
|
||||
path.write_text(initial, encoding="utf-8")
|
||||
with patch.object(records, "REGISTRY", path):
|
||||
with self.assertRaises(ValueError), records.transaction() as data:
|
||||
data["applications"][0]["outcome"] = "made-up"
|
||||
self.assertEqual(initial, path.read_text(encoding="utf-8"))
|
||||
self.assertFalse(path.with_suffix(".lock").exists())
|
||||
path.with_suffix(".lock").write_text("another writer")
|
||||
with self.assertRaises(ValueError), records.transaction():
|
||||
pass
|
||||
@@ -0,0 +1,108 @@
|
||||
"""Negative regression tests for the document scanner (review findings F05 and F06).
|
||||
|
||||
Each case below is a counter-proof from `output/Project_Review_2026-09-11/project_review.tex`
|
||||
that the scanner accepted before 2026-09-11. The point of these tests is that a green
|
||||
validator run means something; they are not a claim that the scanner proves truthfulness.
|
||||
See `validate_resume_system.UNCHECKED` for what deliberately stays a reading task.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import sys
|
||||
import tempfile
|
||||
import unittest
|
||||
from pathlib import Path
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
sys.path.insert(0, str(ROOT / "resume_builder" / "helpers"))
|
||||
|
||||
import validate_resume_system as validator # noqa: E402
|
||||
|
||||
CLAIMS = validator.load_json(validator.CLAIMS_PATH)
|
||||
|
||||
|
||||
def scan(body: str) -> str:
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
path = Path(directory) / "candidate.tex"
|
||||
path.write_text(
|
||||
"\\documentclass{resume}\n\\begin{document}\n"
|
||||
"\\contactline{dennis@thiessen.io $\\vert$ +41 795 955 585}\n"
|
||||
f"{body}\n\\end{{document}}\n",
|
||||
encoding="utf-8")
|
||||
return " | ".join(validator.scan_document(path, CLAIMS))
|
||||
|
||||
|
||||
class ScannerCatchesTests(unittest.TestCase):
|
||||
"""Things that must fail. Every one of these passed before the fix."""
|
||||
|
||||
def test_solo_ownership_of_a_company_scale_platform(self):
|
||||
# The recorded regression wording carried an adjective the literal list missed.
|
||||
self.assertIn("SW-7", scan(r"\item Built a decentralized Data Mesh for the group."))
|
||||
|
||||
def test_full_ml_lifecycle_ownership(self):
|
||||
self.assertIn("BS-1", scan(r"\item I owned the full ML lifecycle end to end."))
|
||||
|
||||
def test_employer_excluded_from_all_documents(self):
|
||||
self.assertIn("Capgemini", scan(r"\item Capgemini Deutschland GmbH, Nov 2014 -- May 2015."))
|
||||
|
||||
def test_certification_only_skill_without_its_context(self):
|
||||
self.assertIn("PyTorch", scan(r"\item Trained production models in PyTorch."))
|
||||
|
||||
def test_forbidden_skill_split_by_markup(self):
|
||||
# \textbf{Snow}flake defeated a plain substring comparison.
|
||||
self.assertIn("Snowflake", scan(r"\item Delivered \textbf{Snow}flake pipelines."))
|
||||
|
||||
def test_unregistered_but_forbidden_skill(self):
|
||||
self.assertIn("Groovy", scan(r"\item Maintained Groovy build jobs."))
|
||||
|
||||
def test_unresolved_placeholder(self):
|
||||
self.assertIn("placeholder", scan(r"\item [GENERATE: Bullet]"))
|
||||
|
||||
def test_wrong_contact_details(self):
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
path = Path(directory) / "wrong.tex"
|
||||
path.write_text(
|
||||
"\\documentclass{resume}\n\\begin{document}\n"
|
||||
"\\contactline{wrong@example.com $\\vert$ +41 000 000 000}\n"
|
||||
"\\end{document}\n", encoding="utf-8")
|
||||
found = " | ".join(validator.scan_document(path, CLAIMS))
|
||||
self.assertIn("e-mail", found)
|
||||
self.assertIn("phone", found)
|
||||
|
||||
|
||||
class ScannerAllowsTests(unittest.TestCase):
|
||||
"""Things that must NOT fail. False positives taught the workflow to write around the checker."""
|
||||
|
||||
def test_latex_comment_is_not_a_claim(self):
|
||||
self.assertEqual("", scan("% Never claim Terraform experience\n\\item Built pipelines."))
|
||||
|
||||
def test_honestly_denying_a_skill_is_not_claiming_it(self):
|
||||
self.assertEqual("", scan(r"\item I have no Terraform experience and say so openly."))
|
||||
|
||||
def test_german_denial_is_not_claiming_it(self):
|
||||
self.assertEqual("", scan(r"\item Keine Terraform-Erfahrung vorhanden."))
|
||||
|
||||
def test_education_institution_is_not_the_employment_entry(self):
|
||||
# "Universitaet der Bundeswehr Muenchen" is a school, not the Bundeswehr employment
|
||||
# record, and in German packages it is written with LaTeX accent macros.
|
||||
body = r'\compactentry{M.Eng., Universit\"at der Bundeswehr M\"unchen}{Apr 2012 -- Oct 2013}'
|
||||
self.assertNotIn("BUNDESWEHR", scan(body))
|
||||
|
||||
|
||||
class ShippedDocumentsTests(unittest.TestCase):
|
||||
"""The packages built under the current rules must stay clean."""
|
||||
|
||||
CURRENT = (
|
||||
"SBB_DataEngineer_AssetMgmt", "NVIDIA_SrDevOps_Zurich", "RUAG_AI_Engineer_C5I",
|
||||
"KdoCy_DevOps_Data_Platform", "CitadelSecurities_PlatformEngineer",
|
||||
"AkerBP_Data_Product_Architect",
|
||||
)
|
||||
|
||||
def test_current_packages_have_no_findings(self):
|
||||
for folder in self.CURRENT:
|
||||
for document in (ROOT / "output" / folder).glob("e2e_*resume.tex"):
|
||||
with self.subTest(document=document.name):
|
||||
self.assertEqual([], validator.scan_document(document, CLAIMS))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
@@ -2,6 +2,7 @@ from __future__ import annotations
|
||||
|
||||
import importlib.util
|
||||
import json
|
||||
import sys
|
||||
import re
|
||||
import unittest
|
||||
from pathlib import Path
|
||||
@@ -62,10 +63,52 @@ class CanonicalSystemTests(unittest.TestCase):
|
||||
"resume_builder/templates/resume_template.tex",
|
||||
"resume_builder/templates/coverletter_template.tex",
|
||||
):
|
||||
self.assertEqual([], validator.scan_document(ROOT / relative, self.claims), relative)
|
||||
self.assertEqual([], validator.scan_document(ROOT / relative, self.claims, template=True), relative)
|
||||
|
||||
|
||||
class PackageReproducibilityTests(unittest.TestCase):
|
||||
"""F17: a PDF in a folder is not evidence that the package can be rebuilt."""
|
||||
|
||||
def test_manifest_is_current(self):
|
||||
import subprocess
|
||||
result = subprocess.run(
|
||||
[sys.executable, str(ROOT / "resume_builder" / "helpers" / "package_manifest.py"),
|
||||
"--check"], capture_output=True, text=True)
|
||||
self.assertEqual(0, result.returncode, result.stdout + result.stderr)
|
||||
|
||||
def test_cover_letter_template_does_not_use_today(self):
|
||||
# \today makes a rebuild date-dependent: recompiling a historical letter
|
||||
# silently restamps it with the current date.
|
||||
template = (ROOT / "resume_builder" / "templates" / "coverletter_template.tex").read_text(
|
||||
encoding="utf-8")
|
||||
body = "\n".join(
|
||||
line for line in template.splitlines() if not line.strip().startswith("%"))
|
||||
self.assertNotIn("\\today", body)
|
||||
|
||||
def test_every_application_package_is_classified_for_reuse(self):
|
||||
manifest = json.loads(
|
||||
(ROOT / "resume_builder" / "canonical" / "package_manifest.json").read_text(
|
||||
encoding="utf-8"))
|
||||
unclassified = [name for name, entry in manifest["packages"].items()
|
||||
if entry["reuse_classification"] == "UNCLASSIFIED"]
|
||||
self.assertEqual([], unclassified)
|
||||
|
||||
|
||||
class WorkflowPolicyTests(unittest.TestCase):
|
||||
def test_agent_entrypoints_resolve_the_same_shared_workflow(self) -> None:
|
||||
for entry in sorted((ROOT / ".agents/skills").glob("*/SKILL.md")):
|
||||
other = ROOT / ".claude/skills" / entry.parent.name / "SKILL.md"
|
||||
bodies = []
|
||||
for path in (entry, other):
|
||||
body = re.sub(r"\A---\n.*?\n---\n", "", path.read_text(encoding="utf-8"), count=1, flags=re.S)
|
||||
bodies.append(body)
|
||||
links = re.findall(r"\]\(([^)]+\.md)\)", body)
|
||||
self.assertEqual(1, len(links), path)
|
||||
workflow = (path.parent / links[0]).resolve()
|
||||
self.assertEqual(ROOT / "resume_builder/reference/workflows" / (entry.parent.name + ".md"), workflow)
|
||||
self.assertIn("Shared workflow version:", workflow.read_text(encoding="utf-8"))
|
||||
self.assertEqual(*bodies)
|
||||
|
||||
def test_skills_use_minimal_valid_frontmatter(self) -> None:
|
||||
for skill_file in sorted((ROOT / ".agents/skills").glob("*/SKILL.md")):
|
||||
text = skill_file.read_text(encoding="utf-8")
|
||||
|
||||
@@ -0,0 +1,158 @@
|
||||
"""Small regression cases from the follow-up review; no network or production writes."""
|
||||
from __future__ import annotations
|
||||
|
||||
import contextlib
|
||||
import copy
|
||||
import io
|
||||
import json
|
||||
from pathlib import Path
|
||||
import sys
|
||||
import tempfile
|
||||
import unittest
|
||||
from argparse import Namespace
|
||||
from unittest.mock import patch
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
sys.path[:0] = [str(ROOT / "resume_builder/helpers"), str(ROOT / "job_scout")]
|
||||
import application_records as records
|
||||
import application_tracker as tracker
|
||||
import package_manifest as manifest
|
||||
import page_metrics
|
||||
import scout
|
||||
import validate_resume_system as validator
|
||||
|
||||
|
||||
class ScannerRegressionTests(unittest.TestCase):
|
||||
def scan(self, body):
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
path = Path(directory) / "resume.tex"
|
||||
path.write_text("dennis@thiessen.io +41 795 955 585\n" + body, encoding="utf-8")
|
||||
return validator.scan_document(path, validator.load_json(validator.CLAIMS_PATH))
|
||||
|
||||
def test_context_cannot_be_borrowed_or_confused_with_model_training(self):
|
||||
for body in ("Implemented production model training in PyTorch.",
|
||||
"Coursera certification: PyTorch. Built production models in PyTorch.",
|
||||
r"\skillline{Certificate}{Coursera, PyTorch}\skillline{Production}{PyTorch}"):
|
||||
with self.subTest(body=body):
|
||||
self.assertTrue(self.scan(body))
|
||||
self.assertEqual([], self.scan("IBM AI Engineering certificate: PyTorch."))
|
||||
|
||||
def test_inline_markup_and_unrelated_negation_do_not_hide_claims(self):
|
||||
for body in (r"Built Lang\textbf{Chain} services.",
|
||||
"Delivered services without downtime using Terraform."):
|
||||
with self.subTest(body=body):
|
||||
self.assertTrue(self.scan(body))
|
||||
self.assertEqual([], self.scan("I have no Terraform experience."))
|
||||
|
||||
def test_employer_name_is_not_a_skill_but_later_claim_still_is(self):
|
||||
self.assertEqual([], self.scan("Application to Snowflake for Senior Software Engineer."))
|
||||
self.assertTrue(self.scan("Application to Snowflake. Built Snowflake pipelines."))
|
||||
|
||||
def test_missing_identity_invalid_period_and_empty_evidence_report_errors(self):
|
||||
original = validator.load_json(validator.CLAIMS_PATH)
|
||||
history = validator.load_json(validator.HISTORY_PATH)
|
||||
data = copy.deepcopy(original)
|
||||
data.pop("identity")
|
||||
self.assertTrue(validator.canonical_checks(data, history)[0])
|
||||
data = copy.deepcopy(original)
|
||||
data["employment"][0]["start"] = "2035-99"
|
||||
data["claims"][0]["evidence"] = {"source": "missing/file.pdf"}
|
||||
errors = validator.canonical_checks(data, history)[0]
|
||||
for phrase in ("invalid start", "ownership", "does not exist"):
|
||||
self.assertTrue(any(phrase in error for error in errors), errors)
|
||||
|
||||
|
||||
class ScoutRegressionTests(unittest.TestCase):
|
||||
def test_explicit_country_and_exclusion_override_town_name(self):
|
||||
for location in ("Freiburg, Germany", "Baden, Austria", "Kastellaun, Germany", "Remote - Switzerland excluded"):
|
||||
with self.subTest(location=location):
|
||||
self.assertFalse(scout.location_eligibility(location)[0])
|
||||
self.assertTrue(scout.location_eligibility("Baar")[0])
|
||||
self.assertTrue(scout.location_eligibility("Wetzikon", country="CH")[0])
|
||||
self.assertTrue(scout.location_eligibility("Aarhus, Denmark")[0])
|
||||
self.assertTrue(scout.location_eligibility("Oslo, Norway", policy="norway_only")[0])
|
||||
|
||||
def test_smartrecruiters_preserves_country_through_matching(self):
|
||||
payload = {"content": [{"id": "1", "name": "Data Engineer", "location": {"city": "Wetzikon", "country": "CH"}}], "totalFound": 1}
|
||||
with patch.object(scout, "http_get_json", return_value=payload):
|
||||
jobs = scout.fetch_smartrecruiters({"company": "example"})
|
||||
rows, _, _ = scout._process_company("example", "Example", {}, jobs, {}, "2026-09-11", {})
|
||||
self.assertEqual(1, len(rows))
|
||||
|
||||
def test_related_requisition_stays_visible_when_hiding_decided(self):
|
||||
old = "https://jobs.ruag.ch/offene-stellen/data-engineer/11111111-1111-1111-1111-111111111111"
|
||||
new = "https://jobs.ruag.ch/offene-stellen/data-engineer/22222222-2222-2222-2222-222222222222"
|
||||
decisions = {old: {"decision": "skip", "date": "2026-09-01"}}
|
||||
row = dict(company="RUAG", title="Data Engineer", location="Thun", url=new, score=3, pos=[], neg=[], in_ch=True, remote=False, relocation=False, is_new=True, posted="")
|
||||
with tempfile.TemporaryDirectory() as directory, patch.object(scout, "_raw_decisions", return_value=decisions):
|
||||
path = Path(directory) / "report.md"
|
||||
scout.write_report(path, [row], [], False, True, decisions=scout.index_decisions(decisions), hide_decided=True)
|
||||
text = path.read_text(encoding="utf-8")
|
||||
self.assertIn(new, text)
|
||||
self.assertIn("RELATED", text)
|
||||
|
||||
def test_new_only_commits_delivered_results_and_preserves_other_companies(self):
|
||||
job = dict(id="1", title="Data Engineer", location="Bern", url="https://example.com/1")
|
||||
with tempfile.TemporaryDirectory() as directory, contextlib.ExitStack() as stack:
|
||||
for name, value in {"ROOT": Path(directory), "REPORTS_DIR": Path(directory)/"reports",
|
||||
"COMPANIES": [("example", "Example", "fake", {})]}.items():
|
||||
stack.enter_context(patch.object(scout, name, value))
|
||||
stack.enter_context(patch.object(scout, "load_seen", return_value={"other": {"old": {"title": "Untouched"}}}))
|
||||
for name in ("load_decisions", "load_last_scrape"):
|
||||
stack.enter_context(patch.object(scout, name, return_value={}))
|
||||
stack.enter_context(patch.object(scout, "save_last_scrape"))
|
||||
saved = stack.enter_context(patch.object(scout, "save_seen"))
|
||||
stack.enter_context(patch.object(scout, "_close_browser"))
|
||||
stack.enter_context(patch.object(scout, "_fetch_company", return_value=("example", "Example", "fake", {}, [job], None, 0.0)))
|
||||
stack.enter_context(patch.object(sys, "argv", ["scout.py", "--new-only"]))
|
||||
stack.enter_context(contextlib.redirect_stdout(io.StringIO()))
|
||||
stack.enter_context(contextlib.redirect_stderr(io.StringIO()))
|
||||
scout.main()
|
||||
state = saved.call_args.args[0]
|
||||
self.assertIn("1", state["example"])
|
||||
self.assertIn("old", state["other"])
|
||||
|
||||
def test_concurrent_scout_writer_is_rejected(self):
|
||||
with tempfile.TemporaryDirectory() as directory, patch.object(scout, "ROOT", Path(directory)):
|
||||
with scout.writer_lock():
|
||||
with self.assertRaises(SystemExit), scout.writer_lock():
|
||||
pass
|
||||
self.assertFalse((Path(directory)/"state/scout.lock").exists())
|
||||
|
||||
|
||||
class ArtifactRegressionTests(unittest.TestCase):
|
||||
def test_manifest_detects_contents_but_allows_missing_local_pdf(self):
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
root = Path(directory)
|
||||
folder = root / "example"
|
||||
folder.mkdir()
|
||||
source = folder/"resume.tex"
|
||||
source.write_text("\\documentclass{article}\nOriginal", encoding="utf-8")
|
||||
pdf = folder/"resume.pdf"
|
||||
pdf.write_bytes(b"first PDF")
|
||||
recorded = {"packages": {"example": manifest.describe(folder, record_pdfs=True)}}
|
||||
current = {"packages": {"example": manifest.describe(folder)}}
|
||||
self.assertEqual([], manifest.check_manifest(recorded, current, root))
|
||||
pdf.unlink()
|
||||
self.assertEqual([], manifest.check_manifest(recorded, current, root))
|
||||
pdf.write_bytes(b"changed PDF")
|
||||
self.assertTrue(manifest.check_manifest(recorded, current, root))
|
||||
source.write_text("\\documentclass{article}\nChanged claims", encoding="utf-8")
|
||||
self.assertNotEqual(current["packages"]["example"], manifest.describe(folder))
|
||||
|
||||
def test_page_metric_matches_heading_not_summary_word(self):
|
||||
def bbox(args, **kwargs):
|
||||
Path(args[-1]).write_text('<page width="595" height="842">'
|
||||
'<word xMin="0" yMin="100" xMax="60" yMax="111">Ten</word>'
|
||||
'<word xMin="60" yMin="100" xMax="160" yMax="111">experience</word>'
|
||||
'<word xMin="0" yMin="420" xMax="100" yMax="431">Professional</word>'
|
||||
'<word xMin="101" yMin="420" xMax="160" yMax="431">Experience</word></page>')
|
||||
with patch.object(page_metrics.shutil, "which", return_value="pdftotext"), patch.object(page_metrics.subprocess, "run", side_effect=bbox):
|
||||
self.assertEqual(49.9, page_metrics.measure(Path("unused.pdf"))["experience_pct"])
|
||||
|
||||
def test_older_imported_event_cannot_reopen_withdrawn_application(self):
|
||||
data = records.load()
|
||||
row = next(row for row in data["applications"] if row["company"] == "SBB")
|
||||
args = Namespace(id=row["id"], date="2026-09-10", event=None, outcome="applied", note="older event", next_action=None)
|
||||
with self.assertRaises(ValueError):
|
||||
tracker.update_application(data, args)
|
||||
@@ -0,0 +1,65 @@
|
||||
"""Scout selection regressions from the 2026-09-11 review (F11 onwards).
|
||||
|
||||
These are the cases where a bug silently removed or mis-ranked a role *before* any human
|
||||
judgement happened, which is the expensive kind: a job that never reaches the report cannot
|
||||
be evaluated at all.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import sys
|
||||
import unittest
|
||||
from pathlib import Path
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
sys.path.insert(0, str(ROOT / "job_scout"))
|
||||
|
||||
import scout # noqa: E402
|
||||
|
||||
|
||||
def process(jobs, cid="acme", display="Acme"):
|
||||
results, stat, warnings = scout._process_company(
|
||||
cid, display, {}, jobs, {}, "2026-09-11", {})
|
||||
return results, stat, warnings
|
||||
|
||||
|
||||
class RequisitionDedupeTests(unittest.TestCase):
|
||||
"""F11: title is not identity."""
|
||||
|
||||
def test_two_requisitions_sharing_a_title_both_survive(self):
|
||||
jobs = [
|
||||
{"id": "R-1", "title": "Senior Data Engineer",
|
||||
"location": "Bern, Switzerland", "url": "https://acme.example/jobs/R-1"},
|
||||
{"id": "R-2", "title": "Senior Data Engineer",
|
||||
"location": "Zurich, Switzerland", "url": "https://acme.example/jobs/R-2"},
|
||||
]
|
||||
results, _, warnings = process(jobs)
|
||||
self.assertEqual(2, len(results), "a different requisition must never be dropped")
|
||||
self.assertTrue(any("title(s) shared by different requisitions" in message
|
||||
for _, message in warnings),
|
||||
"the collision should be reported, not silently resolved")
|
||||
|
||||
def test_same_requisition_republished_per_location_is_merged(self):
|
||||
jobs = [
|
||||
{"id": "R-9", "title": "Platform Engineer | Switzerland | Remote",
|
||||
"location": "Bern, Switzerland", "url": "https://acme.example/jobs/R-9"},
|
||||
{"id": "R-9", "title": "Platform Engineer | Germany | Remote",
|
||||
"location": "Munich, Germany", "url": "https://acme.example/jobs/R-9"},
|
||||
]
|
||||
results, _, _ = process(jobs)
|
||||
self.assertEqual(1, len(results), "one requisition should stay one row")
|
||||
self.assertIn("Bern", results[0]["location"])
|
||||
|
||||
def test_distinct_titles_are_unaffected(self):
|
||||
jobs = [
|
||||
{"id": "A", "title": "Data Engineer", "location": "Bern, Switzerland",
|
||||
"url": "https://acme.example/jobs/A"},
|
||||
{"id": "B", "title": "Platform Engineer", "location": "Bern, Switzerland",
|
||||
"url": "https://acme.example/jobs/B"},
|
||||
]
|
||||
results, _, warnings = process(jobs)
|
||||
self.assertEqual(2, len(results))
|
||||
self.assertEqual([], [m for _, m in warnings if "title(s) shared" in m])
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in new issue
Block a user