Where a candidate starts
The work at a glance
- My role
- Product designer
- Scope
- Placement challenge · full flow, edge cases
- Built in
- 3 days · Claude, no Figma file
How it came together
-
01
Read the brief and never opened Figma.
-
02
Gave the model its constraints before any generation.
-
03
Built it in VS Code, live on Vercel in three days.
-
04
Corrected what the model got wrong for first-time users.
I wrote the constraints first and the markup second
Three decisions made the prototype usable. The rules, the first run, and the recovery.
The rules before the build
When the placement PRD landed I did not open Figma. I built a Claude skill holding Scaler’s design system, so what it generated came out inside the system.
Then an implementation-plans.md turned the requirements into a flow: category order, what a wrong answer does, what carries forward, when a category closes.
I sketched the flow first, then let Claude build to those constraints. Full flow, edge cases included, in three days.
## Challenge rules ### Category order - Easy, then Medium, then Hard. Fixed. - A category opens only once the one before it closes. ### On a wrong answer - The miss is not graded and not deducted. - Route into Practice Mode, same interface. - Practice is required, not offered. No skip. ### What carries forward - Every correct answer already banked stays banked. - The correct count carries across the practice detour. - One miss still clears the round. ### When a category closes - Threshold met -> close it, unlock the next. - Six tries spent -> the attempt ends here.
The rules existed before the code did. I decided the edge cases; Claude only carried them out.
Built for the wrong user first
Claude’s first pass assumed a returning user. It dropped candidates straight into Contest Mode with no onboarding.
Reasonable for a PRD written for people who know the product. Wrong for the real audience: someone hitting this cold, once.
So I built the first run back in: the rules, the modes, the ‘you cannot skip this’ framing, before any question loads.
The moment someone gets it wrong
The hard part was not the state logic. It was how a learner feels the moment they fail, on a timer, on camera.
A wrong answer routes into Practice Mode, same interface, framed as ‘not graded’ rather than a step down.
Right at that transition, the copy says it plainly: you keep the answers you already got right, your contest progress is safe.
And the way back is never vague. A ‘Continue’ or ‘Back to Contest Mode’ says exactly when they can resume.
The conditions the learner has agreed to before the first question. Timer and camera on.
Four screens that keep one promise
A wrong answer never takes away a right one. One miss still clears the round.
Practice changes nothing in the real test, but the detour after a wrong answer is not optional.
The same editor, no camera. Practice uses different questions, so rehearsing costs nothing.
Each detour spends one of six tries. Spend the last and the attempt ends here.
A PRD on one side and commits on the other
The document set the behaviour; the repo holds every decision that followed it, one commit at a time.
The PRD is not mine. It fixes the state machine, the thresholds, the proctoring. My work is what it leaves open: the first run, and the moment someone fails.
Each change is a scoped commit against a written spec, so ‘cut the landing page’ is a reviewable diff rather than a redraw.
What this entry was testing
Can a design system be written down tightly enough for a model to build to it?
Components, spacing and the mascot kit went into a Claude skill. What came out matched the system.
Is writing the rules better than asking for edge cases?
Writing the rules down first meant I decided the edge cases and Claude only carried them out.
Where do a model’s defaults quietly miss the real audience?
At the start. It built for someone returning, because the brief was written for one.
Can you design how a moment feels while working in code, not screens?
It reads right to me, but no nervous candidate has met it on a live timer yet.