feat(citadel): 2-page resume for Citadel Securities Platform Engineer

13 bullets, validator PASS, compiles to exactly 2 pages, rendered PDF
inspected clean - no clipping, orphans, header wrapping or bad breaks.

Built at the user's direction with the working-model question still
open. That block stands: if the Zurich seat is 5-day onsite, this
package does not get submitted. Recorded in the session file rather than
quietly dropped.

Three Phase 2 decisions the user left open, taken and marked reversible.
VZ-1 is in - it is the only canonical evidence pairing C++ with a
distributed backend and this JD names both, hedged verb preserved. A
Personal Project section carries PP-1, labelled three separate ways and
with no performance figure of any kind; PP-2 appears as supporting
coursework, never as a credential. Generali is kept against the Phase 1
"omit" recommendation, because dropping it opened an unexplained
May 2015 to Jun 2017 employment gap that costs more than the weak bullet.

Cadence sits at 7/12 (58%), above the section 7a guide of ~50%, down
from 75% after reshaping two bullets. The rest are legitimate technology
enumerations - "Oracle, Kafka, Python and Teradata", "Elasticsearch,
Logstash, Kibana and Kafka". The checker added yesterday cannot tell a
rhetorical rule-of-three from a list of tools actually used, which is a
real limitation of the pattern rather than a defect in this document.
Cutting them would delete accurate ATS-relevant names, which section 7a
itself forbids. Left deliberately.

Also walked into the trap the SBB .tex header warns about: the first
draft named the excluded non-canonical tools in a comment explaining why
they were excluded, and the validator errored on all three because it
scans raw file text. Comment rewritten without naming them.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MHtzyTKBcg6BWhD5qFegtK
This commit is contained in:
2026-08-26 08:42:46 +02:00
co-authored by Claude Opus 5
parent 0eda29327a
commit 89f9af5d89
3 changed files with 192 additions and 1 deletions
@@ -0,0 +1,92 @@
% Citadel Securities — Platform Engineer, Research Platform Engineering (New York, Miami, Zurich)
% Profile: International Tech, English, 2 pages. Generated 2026-08-26.
% Generated from resume_builder/canonical/claims.json + normalized experience files.
% Several tools named in the JD are non-canonical and are deliberately absent from this
% document; they are listed and bridged in the session file's Gap Assessment. Do not
% reintroduce them here, not even in a comment -- the validator scans raw file text.
% JD qualifications 3 and 7 are disjunctive, so Python and AWS satisfy them alone.
% PP-1 appears only under an explicitly labelled Personal Project heading; claims.json
% forbids calling it distributed/production/multi-user or quoting ANY performance figure.
\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$ Production Data Platforms on AWS $\vert$ Kafka $\cdot$ Kubernetes $\cdot$ Spark}
\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}
Staff data engineer who builds and runs the pipelines and governed data products that analytics and AI consumers depend on, on AWS and Kubernetes at Swisscom, with Component Ownership covering data quality, incidents and on-call duty. Earlier work at Bosch tuned query performance over Oracle and Hadoop/Impala for semiconductor analysis teams and moved containerized ML inference into a continuously operating fab.
\end{rSection}
\begin{rSection}{Technical Skills}
\skillline{Programming}{Python, SQL, PySpark; Java and C\# (professional, historical); C++ (limited historical use)}
\skillline{Distributed data systems}{Apache Kafka, Apache Airflow, Spark/PySpark, ETL/ELT, data modelling, query performance tuning, Oracle, Teradata, Hadoop/Impala}
\skillline{Cloud and platform}{AWS (S3, Glue, Athena/Iceberg, Redshift, Lambda, Step Functions), CloudFormation, Kubernetes, Docker, GitLab CI/CD, Ansible}
\skillline{Reliability and operations}{Production operation and on-call, SLOs, incident and root-cause analysis; Grafana, Prometheus, ELK (proof of concept)}
\skillline{Trading domain (self-directed)}{Systematic/quantitative trading concepts, factor construction, backtesting -- personal project and coursework only, no professional experience}
\skillline{Certifications}{AWS Solutions Architect -- Associate; Data Engineering with AWS; iSAQB CPSA-F; ITIL Foundation}
\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 Build and model governed data products within Swisscom's company-wide Data Mesh, onboarding source systems and maintaining their metadata and lineage in Atlassian Compass so downstream analytics and AI teams can find and reuse the data.
\item Component Owner for business-critical Fulfillment ETL running across Oracle, Kafka, Python and Teradata, accountable for its data quality, governance and on-call operation.
\item Migrated owned Fulfillment and Product Analysis pipelines onto Swisscom's AWS platform using Glue, Athena with Apache Iceberg, Redshift, Airflow and CloudFormation, contributing to the wider company migration programme.
\item Develop and operate Python data applications on Kubernetes, delivered through GitLab CI/CD from automated test to production support.
\item Translate stakeholder and product-owner requirements into delivered data products; run root-cause analysis in 2nd- and 3rd-level support.
\end{rSubsection}
\end{rSection}
\newpage
\begin{rSection}{Professional Experience (continued)}
\begin{rSubsection}{Robert Bosch Semiconductor Manufacturing Dresden GmbH}{Feb 2020 -- Dec 2022}{Senior Engineer, Data Analysis (Data Engineering)}{Dresden, Germany}
\item Developed data services in Python, Java and C\# over Oracle and Hadoop/Impala, tuning query performance for analysis teams working with semiconductor defect records, wafer inspection images and process-control electrical parameters.
\item Integrated containerized ML inference with Docker, Kubernetes and Ansible into a continuously operating semiconductor fab, replacing manual image-based defect classification.
\item Built an anomaly-detection proof of concept on Elasticsearch, Logstash, Kibana and Kafka, with Grafana and Prometheus monitoring for continuously running manufacturing systems.
\item Served as Application Owner for analytics applications and their upstream pipelines, defining SLOs and coordinating vendors, user training and documentation.
\end{rSubsection}
\begin{rSubsection}{Fraunhofer CML}{Sep 2018 -- Oct 2019}{Research Software Engineer}{Hamburg, Germany}
\item Developed containerized microservices for the MISSION maritime research data-exchange platform.
\end{rSubsection}
\begin{rSubsection}{Vizrt}{Jul 2017 -- May 2018}{Test Automation / DevOps Engineer}{Bergen, Norway}
\item 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 Introduced BDD test automation through a proof of concept and held technical responsibility for the suite and its Jenkins jobs.
\end{rSubsection}
\end{rSection}
\begin{rSection}{Personal Project}
\compactentry{Equity Signal Platform -- self-hosted, single-user}{Personal project}
Ingests daily US-equity prices, fundamentals and LLM-assisted sentiment; runs one long-only cross-sectional momentum book (residual 12-1 momentum, ATR stop and trail, at most 15 concurrent positions) through scheduled scan and backtest pipelines; surfaces the gated setups in a web dashboard and Telegram alerts. Built end to end as a personal system, not a production or multi-user service. Supporting coursework: Udacity \textit{AI for Trading} nanodegree (factor construction, alpha signals, backtesting).
\end{rSection}
\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{B.Eng. Information and Telecommunication Technologies, Universität der Bundeswehr München}{Oct 2009 -- Oct 2012}
\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
}
@@ -238,10 +238,50 @@ or quoting any PnL, Sharpe, return or backtest figure.
though the JD names GCP and Azure (Q7 is disjunctive; AWS satisfies it). though the JD names GCP and Azure (Q7 is disjunctive; AWS satisfies it).
- **M.Eng. thesis throughput figure** — barred by `thesis_limits`; not usable as high-throughput evidence. - **M.Eng. thesis throughput figure** — barred by `thesis_limits`; not usable as high-throughput evidence.
## Output Files
- `e2e_citadel_securities_platform_engineer_resume.tex` / `.pdf` — 2 pages, 13 bullets
- `resume.cls` (copied from templates)
- `JD_CitadelSecurities_PlatformEngineer.txt` — verbatim posting
**Phase 2 decisions taken (user said "lets build the resume" without answering the two open items):**
- **VZ-1 included.** Only canonical evidence pairing C++ with a distributed backend; this JD names
both explicitly. Hedged verb "Contributed" per `claims.json`; no broadcaster names. Reversible.
- **Personal Project section added** for PP-1, labelled three ways (heading, right-aligned
"Personal project", and "not a production or multi-user service" in the body). No performance
figure of any kind. PP-2 appears as "Supporting coursework", never as a credential.
- **Generali kept** with one bullet, against the Phase 1 "omit" recommendation — omitting it left an
unexplained May 2015Jun 2017 employment gap, which costs more than the weak bullet does.
**Verification:**
- `validate_resume_system.py --document`**PASS**, 1 warning (cadence, see below)
- Compiled with MiKTeX pdflatex, **exactly 2 pages**, rendered PDF inspected: no clipping, orphans,
header wrapping or bad breaks; umlauts, `C\#` and `C++` all render correctly
- Page 2 fills well; page 1 has bottom whitespace from the deliberate `\newpage`. Not padded —
`resume_reference.md` §9: "Do not add content merely to reduce bottom whitespace."
**Known residual — cadence 7/12 (58%), above the §7a ~50% guide.** Reduced from 75% by reshaping two
bullets. The remaining flags are almost all legitimate technology enumerations ("Oracle, Kafka,
Python and Teradata"; "Elasticsearch, Logstash, Kibana and Kafka"). **The §7a checker cannot
distinguish a rhetorical rule-of-three from a list of tools actually used** — a real limitation of
the pattern. Cutting these would mean deleting accurate, ATS-relevant technology names, which §7a
itself forbids ("never trade accuracy… to fix cadence"). Left as-is deliberately.
**Trap hit and fixed during generation:** the first draft named the non-canonical tools in a header
comment explaining why they were excluded. The validator scans **raw file text**, so it errored on
all three. This is the exact failure the SBB `.tex` header warns about. Comment rewritten without
naming them.
## Status ## Status
- Phase 0: **DONE** (2026-08-25) - Phase 0: **DONE** (2026-08-25)
- Phase 1: **PROPOSED 2026-08-26 — awaiting user confirmation** - Phase 1: **DONE** (2026-08-26)13 bullets confirmed
- Phase 2: **DONE** (2026-08-26) — resume compiled and verified
- Cover Letter: **PENDING** (decision YES — PP-1 domain story needs prose)
- Critique: **PENDING**
- **STILL BLOCKED on the working-model question** — resume built at user direction with that
question open. If Zurich is 5-day onsite, this package does not get submitted.
- Next: `/critique output/CitadelSecurities_PlatformEngineer/session_citadel_securities_platform_engineer.md`
- Resume: PENDING - Resume: PENDING
- Cover Letter: PENDING (decision YES) - Cover Letter: PENDING (decision YES)
- Critique: PENDING - Critique: PENDING