Case study · 2026

A problem solved with agentic AI.

I used Claude Code and a multi-agent setup to build a single-page application that streamlines my job-application process — from JD intake to eight tailored PDFs, without a single hallucinated claim.

SPA Engine
CV Engine · Dashboard
+ New Variant

Role family 1

Primary target lane

Role family 2

Secondary target lane

Role family 3

Stretch lane

Role family 4

Exploratory lane

17 variants
CompanyTarget titleUpdatedStatus
summit reSenior Product Owner23.05 · 09:37DRAFT
alpine fintechBusiness Analyst Claims23.05 · 18:17DRAFT
centro cxProduct Owner Digital CX23.05 · 09:37APPLIED
neura consultingAI Domain Lead22.05 · 14:02DRAFT

The problem

Several roles. Two languages. Eight variants per application.

I target multiple role families at once — four lanes, each with its own positioning and skill emphasis. Each needs a different CV framing. Each ships in German and English. Some need a cover letter, others need additional context.

Manually: four to six hours per role, copy-paste errors, stale facts, and a voice that drifts across documents.

8

PDF variants per application

~4 min

per pass, fully local

0

API tokens consumed

25

rules in the constitution

The setup

Local Claude Code. MCP. Thirteen agents.

The engine runs on a local Claude Code instance — no API tokens, no external calls, no data leaving the machine. Each tailoring pass takes four minutes instead of seconds. Privacy and cost are worth the wait.

MCP extends the tool surface so the model can read files, call scripts, and trigger renders within a single session. Thirteen specialised agents each own a bounded concern — no agent sees the full picture, each loads only the rules and sources it needs.

Rule 1 — loaded every session

Facts only. No invention. Ever.

Every claim must trace to a source. If a claim has no source, it does not appear. No exceptions.

Agentic architecture

Specialised agents, shared rules.

Each agent is scoped to one concern. It loads its own playbook, reads only the source files it needs, and hands off to the next agent via structured output. The rules constitution loads at every session start — no agent can override it. Hooks enforce by side-effect between sessions.

RULES.md — 25 rules · loaded every session · no agent can override Triage agent Scores JD against rubric → FIT / STRETCH / SKIP Copy agent Tailors CV + letter → structured JSON variant QA agent Validates against sources → pass / findings Translator agent Mirrors DE ↔ EN → bilingual variant + 9 more specialised agents (web, finance, UX, …) · each loads only its own playbook Hooks enforce between sessions — source-trace · date-delta · state-stamp · application-sync SOURCE FILES ON DISK cv-master.json Every CV field numbers · non-claims Verified metrics + explicit gaps letter-corpus · voice Reference letters + banned words

The engine

JD in, eight PDFs out.

A job description enters the system. The engine triages, tailors, validates, and renders. The model only fills values the schema allows, with content the source corpus already contains.

Capture JD → jd.md Triage FIT / STRETCH / SKIP Tailor Claude · constraints Validate verify.js · 18 rules Render 8 PDFs FED BY VERIFIED SOURCES cv-master.json Single source of truth for every CV field numbers · non-claims Verified metrics and explicit gaps letter-corpus · voice Reference letters and banned-word list The model never invents — it only fills values the schema allows, with content the corpus already contains.

The interface — Triage

Every JD gets scored before anything else runs.

The triage step applies an HR rubric — location, salary floor, lane fit, applicant pool, disqualifiers — and emits a FIT, STRETCH, or SKIP verdict. Only FIT and STRETCH proceed to the tailoring pass. SKIPs auto-log with the verdict reasons.

CV Engine · Triages

Triages

7 decisions logged

EmployerRoleDateVerdict
Centro CXProduct Owner Digital CX (m/w/d)2026-05-23FIT
Alpine FintechBusiness Analyst Claims2026-05-23FIT
Solaris AGSenior Product Manager (100%)2026-05-22SKIP
Neura ConsultingAI Domain Lead2026-05-22STRETCH
Pragma EngineeringBusiness Solution Architect – AI & UX2026-05-21STRETCH
CV Engine · Variant detail

summit re

Senior Product Owner

DEEN DRAFT
Status
Draft Progress Applied Rejected
PDF ↓ Re-tailor

The interface — Variant

Language toggle. Status tracking. PDF on the fly.

Each variant shows the tailored content with a DE/EN toggle. Status moves from draft through applied. The PDF renders on download — page-count cap and ATS extraction enforced at render time. If either check fails, the build fails.

Enforcement

What happens when a claim can't be traced.

Every fact in the CV has to link back to a source file. Sometimes the model produces a line that doesn't. Two options: refuse to generate the PDF, or generate it but flag the ungrounded line.

The engine flags. The flagged line becomes a ticket the operator has to resolve before the next run. Over time this makes the system sharper — every near-miss is logged, not silently swallowed.

Block

Engine refuses. No output, no record of what went wrong. Strict, but silent.

Warn ✓

Engine ships, but the ungrounded claim becomes a finding. Tracked, visible, resolved before the next pass.

What this proves

Not a side project. A way of working.

The engine solved my problem. The method behind it is what I'd bring to a client engagement.

01

Business problem first, technology second.

The starting point was "applications take too long and drift" — not "let's use Claude." The tool choice followed the constraint analysis. That's how I'd scope a client's AI use case: identify where the pain is, then design the solution.

02

Rules first, system second.

The twenty-five-rule constitution existed before the first line of code. Constraints shaped the architecture — not the other way around. For a client, that means guardrails are designed in, not patched on after an incident.

03

Teachable, not bespoke.

The rules-constitution + hooks + agent pattern is a methodology, not a one-off. A client team can learn it, adapt it, and run it without me in the room. That's enablement — not dependency.

Let's talk.

If the discipline reads as a fit — I'd be glad to walk through the system live.

Get in touch →