Alpha · Career assessment
Career Side Quests
See exactly where you stand for the job you want — and the shortest route across the gap.
What's different
Vs. a resume matcher
- ✓It measures you, not your CV writing — most resume matchers score keyword overlap, which rewards whoever gamed the document best.
- ✓Gaps become scoped builds (side quests) and multi-hop routes (questlines), not a reading list.
- ✓It works at any distance — a sideways step or a full career change — instead of assuming you’re already nearly qualified.
The idea
“Am I actually close?”
Every job posting is a wall of requirements, and the honest question underneath it is uncomfortable: am I actually close to this, or am I kidding myself — and if I'm not close, what's the shortest way across? Nothing answered that. Resume matchers score keyword overlap, which really measures how well you wrote your CV. Asking a chatbot gives you a confident percentage that changes if you reword the question.
Both fail the same way: they produce a number nobody can check. I wanted the opposite — an assessment where every claim points at the exact line that justifies it, so a low score is something you can audit and argue with rather than just feel bad about.
v1
The smallest useful loop
The first version did one thing well: paste a role, upload a CV, and get back a requirement-by-requirement read. The pipeline was the product — pull requirements out of the posting, pull evidence out of your materials, then score one requirement per call with a skeptical reviewer. One contract that every stage speaks, and the aggregation deliberately kept out of the model's hands from day one.
Along the way
What it grew into
Evidence you can click on
Every requirement gets a level and a verbatim quote from your own material — the exact line that earned it. The quote is checked as a literal substring of its source; if it isn’t there, the claim is thrown away and regenerated. Hallucination becomes a cheap string check instead of a leap of faith. “Your material” is deliberately wider than a CV: PDFs and Word documents, links, a GitHub profile treated as evidence rather than a decorative URL, and a box for the work no document records.
Counter-evidence, on purpose
Models flatter resumes by default — ask one to assess you and it will find a way to be encouraging. So each score is required to surface what cuts against it too, and the interface shows that alongside the supporting evidence. You get the case for and the case against.
Side quests and questlines
A gap isn’t a lecture, it’s a build. Each one routes to a side quest: one scoped project that closes it. When the target is a long way off, those chain into a questline — a multi-hop route across the distance, rather than pretending one weekend project bridges a career change.
It reads a two-column CV properly
PDF text extraction groups words by vertical position, which quietly splices a sidebar label into the middle of a job description whenever a wrapped line shares a line with it — “MBA” landing inside someone’s work history. Extraction now finds the column gutters first and reads inside each one, which is a large part of why the scores stopped moving between runs. Parse coverage is shown rather than swallowed, too — a CV that silently yielded one page out of fourteen would otherwise be scored as if that page were the whole person.
Eligibility is a gate, not a score
Averaging “can’t legally work here” into a capability percentage is wrong in both directions — it hides a blocker behind a decent-looking number, and it punishes a strong candidate for a fixable visa question. So eligibility sits outside the score as a gate.
Trade-offs
The judgment calls I'm proud of
This app tells people where they stand against something they want. That makes honesty a product requirement rather than a nicety — and almost every interesting decision came from enforcing it in code instead of trusting a model to behave.
No model ever emits a score
Ask a model for a percentage and you get a plausible one that moves when you rephrase the prompt. So models only return per-requirement levels with quoted evidence — every piece of arithmetic, the verdict and the distance happen in deterministic TypeScript. The number means something because nothing creative produced it.
The app cannot invent numbers
Generated CV bullets carry {{placeholder}} metrics and a digit appearing outside a placeholder fails validation. It would be trivially easy — and quietly disastrous — to let it write “improved throughput by 40%” into someone’s resume. The product refuses to make a number up on your behalf.
Say “this can’t be closed quickly”
Some gaps are years of experience or headcount ownership, and no side quest fixes those. The honest thing is to say so rather than invent remediation, even though a page full of actionable steps would look better. Assessment honesty is enforced in code here, not left to the model’s judgment.
Your CV never touches a model that trains on it
I had already written a disclosure saying the CV isn’t used to train anything — then found it was false on exactly one path, the one that cheapest-provider routing had just sent CV extraction down. Checked against each provider’s own terms: the free Gemini tier says human reviewers may read API input and that content is used to improve Google products; the paid tier and the OpenAI and Anthropic APIs don’t. Stages are now marked for whether they see the candidate’s own material, and those may only use providers that don’t train on input. The filter runs before any cost preference, covers fallback chains, and cannot be overridden by an environment variable — whoever sets an env var isn’t the person whose CV it is. If no safe provider is configured, the read fails rather than degrades. The public job posting still runs on the free tier: that split is the point.
A test suite that has been seen to fail
Most of what decides what a user is told needs no model at all — the scoring arithmetic, verdict rules, distance bands, gap ranking, quote grounding, fabricated-metric detection, PDF column layout. That’s 45 assertions running with every provider key explicitly unset, so a regression doesn’t wait for someone to spend money noticing it. I then verified the suite by breaking things on purpose — reverting the eligibility exclusion, disabling the fabricated-number check — because a suite that has never been observed failing is not evidence of anything. One mutation appeared to pass; the patch simply hadn’t applied.
Where it is now
In alpha, and already useful
Career Side Quests takes a role you want and whatever evidence you have, and hands back a requirement-by-requirement picture where every score cites the line that earned it, the counter-evidence is on the page, and each gap comes with the smallest build that closes it. It runs on my own infrastructure, deploys itself on every push, and treats being wrong loudly as better than being wrong quietly.
The number that matters most to me is repeatability: run the same CV against the same posting several times and the score used to swing 13 points. Column-aware PDF reading, a grounder that tolerates transcription drift but not fabrication, and a rubric rewritten as four ordered questions about what kind of evidence exists — rather than an adjective judgement — brought that down to 7, with ungrounded quotes going from 21 to zero.
It's still an alpha, and I'd rather say so. The pipeline works end to end and the honesty guarantees hold, but the rubric is still being tuned, the job-board adapters cover only some sites, and I'm still finding roles that score in ways I want to argue with. Try it on a real posting — just read the evidence, not only the number.
Try the alpha
Point it at a role you want, give it your evidence, and see the gap — with receipts. Rough edges included.
Try the alpha ↗