Capstone: Mock Loop & Self-Exam
Simulate the full loop end-to-end before the real thing
No-AI coding drill
After this you can After this you can code a medium-hard UI problem unassisted under a clock.
Cursor bans AI in the coding screens and allows only basic autocomplete - they use the unassisted hour as a time-boxed read on raw skill. So you have to be sharp without the very tool the company sells.
Interactive diagram. Tab through its regions; each focused region shows its detail in the panel below.
Each capstone section is a timed mock of one of these stages - step through to see what each one tests.
The fix is reps, not theory. You rebuild the same handful of interactive components from a blank file until your hands know the shape of an accessible combobox before your brain finishes reading the spec. This section is the drill protocol you run, on a timer, three or four times this week.
Set the room to match the real screenDrill setup
- 1Kill the model. Turn off Copilot and Cursor's AI completions, leaving only the editor's word-level autocomplete. The point is to feel the gap the real screen creates, not to simulate comfort.
- 2Set a 60-minute clock. One medium-hard component from a cold start. A 45-minute version is the warm-up; the full hour is the test, because the last 15 minutes are where polish and edge cases either appear or don't.
- 3Open a bare sandbox. A single
tsxfile, no scaffolding, no snippet library you pre-wrote. If you'd reach for a saved keyboard-handler block on the real screen, you can't, so don't here either. - 4Record yourself narrating. Talk through trade-offs out loud the whole way, as if an interviewer is on the call. The recording is the feedback loop - you'll hear every place you went quiet and started flailing.
The problem bankPick one per session
Each of these is a real interaction a Design Engineer ships and each hides a specific trap that separates a working answer from a polished one.
Input that filters a list, opens on type, commits on Enter.
Trap: keyboard. Arrow keys move a visual active option without moving DOM focus; aria-activedescendant ties them together.
Tests whether you know ARIA from memory, not from a docs tab.
Render 50k rows with only the visible window in the DOM.
Trap: the math. A spacer div holds total height; you compute the start index from scrollTop and over-render a few rows so fast scroll doesn't flash blank.
Tests performance instinct under a real DOM-cost constraint.
Stack of dismissable notifications with enter/exit motion and auto-dismiss.
Trap: timers. Pausing on hover, resuming on leave and cleaning up on unmount so a dismissed toast's timer never fires.
Tests state machine clarity and effect cleanup.
Tab-style selector with a sliding indicator that animates between options.
Trap: the indicator. You measure the active segment and translate the pill with a transform, not by animating width/left.
Tests motion that stays on the compositor at 60fps.
// Combobox: filter a list, keyboard-navigable, commits a value.
// Props
type ComboboxProps = {
options: { id: string; label: string }[];
value: string | null;
onChange: (id: string) => void;
};
// Invariants to say aloud:
// - activeIndex is the visually-highlighted row, NOT DOM focus
// - input keeps focus the whole time; aria-activedescendant points at the row id
// - Escape closes and restores the committed value; Enter commits activeIndex
// - empty filtered list still renders a 'No results' row, not a voidScore yourself like the interviewer willRubric
- Dimension
- Correctness
- Pass bar
- It works for the happy path and the two cases you named up front
- What sinks it
- Demos once, then breaks on the second interaction
- Dimension
- Edge cases
- Pass bar
- Empty list, single item, rapid input, last-item arrow wrap
- What sinks it
- Crashes or no-ops on an empty filter; arrow falls off the end
- Dimension
- Code clarity
- Pass bar
- Named handlers, no nested ternary soup, a reader follows it cold
- What sinks it
- One 80-line component nobody could review in five minutes
- Dimension
- Polish
- Pass bar
- Focus ring, hover/active states, a transition that isn't janky
- What sinks it
- Functionally right, visually a wireframe
| Dimension | Pass bar | What sinks it |
|---|---|---|
| Correctness | It works for the happy path and the two cases you named up front | Demos once, then breaks on the second interaction |
| Edge cases | Empty list, single item, rapid input, last-item arrow wrap | Crashes or no-ops on an empty filter; arrow falls off the end |
| Code clarity | Named handlers, no nested ternary soup, a reader follows it cold | One 80-line component nobody could review in five minutes |
| Polish | Focus ring, hover/active states, a transition that isn't janky | Functionally right, visually a wireframe |
On the real screen, polish is graded even when nobody asked for it - that's the Design Engineer differentiator.
When you hit the keyboard-handling part of the combobox, say the rule before you code it: “Focus stays on the input; I move a visual active index and expose it with aria-activedescendant.” Stating the accessibility model from memory, unprompted, is exactly the craft-at-the-seam signal the unassisted screen is built to surface.
The failure mode under the clock isn't running out of time - it's spending 40 minutes on a perfect filter algorithm and shipping zero states and zero motion. Get it working end to end first, ugly, then spend the back half on edge cases and polish. A bare-but-complete component reads far better than a half-built beautiful one.
Takeaway. Run the no-AI drill on a 60-minute clock with autocomplete only, narrating trade-offs aloud, until an accessible combobox or virtualized list flows from your hands - and always reach end-to-end working before you chase polish.
Self-check
QIn an accessible combobox, the user presses the down arrow to move through options. What should happen to DOM focus?
Build-round sprint
After this you can After this you can ship a correct and polished component inside a fixed window.
The front-end build round judges two things at once: correctness and polish. Clean React or SolidJS plus CSS that's also genuinely nice to look at, with a component API a teammate would actually want to use.
Treat the rubric as a gap finder, not a score to admire. Mark the weakest proof, turn it into one practice rep and keep the artifact you would show an interviewer.
This is a longer drill than the coding screen because the deliverable is bigger. Give yourself 90 minutes and a single non-trivial component. The order you build in is the whole game.
The 90-minute order of operationsSprint protocol
- 10–15 · API first. Write the props and the call site before the body. A
<Toast />or<SlideOver />lives or dies on its surface area - isopencontrolled, what doesonClosemean, how does a consumer pass content. Get the shape right and the body falls out. - 215–45 · Make it work. The happy path only. One toast appears, one panel slides in. No states, no a11y yet - a working skeleton you can demo, so if the clock beats you, you still have something.
- 345–65 · States and accessibility. Empty, loading, error and the focus contract: a slide-over traps focus, restores it on close and closes on Escape. This is the band most candidates skip and the band that separates a Design Engineer from a generalist.
- 465–90 · Motion and the last mile. Enter/exit transitions on compositor-only properties, easing that feels intentional, a hover state that isn't an afterthought. Then a pass for the details: optical spacing, the focus ring, dark mode if the spec implies it.
Interactive diagram. Tab through its regions; each focused region shows its detail in the panel below.
Lock the API before you build the body - that's the gate that prevents a mid-clock refactor.
Pick a spec with real surface areaSprint options
An imperative toast() API plus a <Toaster /> host.
Surface area: queueing, max-visible, auto-dismiss with hover-pause, swipe-or-click to dismiss.
Motion: stack reflow with FLIP so toasts slide as the queue changes.
A right-edge drawer with a backdrop and a controlled open prop.
Surface area: focus trap, scroll lock on the body, Escape to close, restore focus on close.
Motion: transform-based slide plus a backdrop fade, never animating width or right.
Self-review against the DE rubricGrade your own output
- Axis
- API design
- What strong looks like
- Controlled where it matters, sensible defaults, composable children over config props
- Common miss
- A dozen boolean props that should have been one
variantor slot
- Axis
- Polish
- What strong looks like
- Easing, focus ring, spacing all feel deliberate at 100%, not 90%
- Common miss
- Default browser focus outline and a linear 200ms-everything transition
- Axis
- Accessibility
- What strong looks like
- Roles, focus trap and restore, keyboard parity with mouse
- Common miss
- Mouse-only; Tab leaks behind the open panel
- Axis
- Performance
- What strong looks like
- Animations on transform/opacity; no layout thrash on the hot path
- Common miss
- Animating layout properties, re-rendering the whole list on every keystroke
| Axis | What strong looks like | Common miss |
|---|---|---|
| API design | Controlled where it matters, sensible defaults, composable children over config props | A dozen boolean props that should have been one variant or slot |
| Polish | Easing, focus ring, spacing all feel deliberate at 100%, not 90% | Default browser focus outline and a linear 200ms-everything transition |
| Accessibility | Roles, focus trap and restore, keyboard parity with mouse | Mouse-only; Tab leaks behind the open panel |
| Performance | Animations on transform/opacity; no layout thrash on the hot path | Animating layout properties, re-rendering the whole list on every keystroke |
Score each 1–5. Anything under 4 is the thing you fix before the next sprint.
/* Good: transform + opacity stay on the compositor */
.panel {
transform: translateX(100%);
transition: transform 280ms cubic-bezier(0.22, 1, 0.36, 1);
}
.panel[data-open='true'] { transform: translateX(0); }
/* Bad: animating 'right' or 'width' forces layout every frame */
.panel--janky { right: -400px; transition: right 280ms ease; }When the clock stops, open Cursor's own UI, Linear or Vercel and find their equivalent component. Compare timing, easing, focus behavior and dark mode side by side with yours. The gap you see is your real score - and naming that gap out loud is itself a strong signal.
“It works and it's accessible. With another hour I'd add a reduced-motion variant and tune the exit easing - right now the enter feels right but the exit is a touch fast.” Naming exactly what's still at 90% shows the 90→100 instinct without pretending you hit 100 under a timer.
Takeaway. In the 90-minute build round, write the component API first, get the happy path demoable early, then spend the back half on states, accessibility and compositor-only motion - and grade your output against a real reference like Cursor or Linear.
Self-check
QYou have 90 minutes for a slide-over panel build round. What should you do in the first 15 minutes?
2-day-trial simulation
After this you can After this you can scope, build and present a real project the way the trial demands.
Cursor's actual decision round is a paid 2-day in-person trial: you ship a real project alongside the team, share meals and present it. It exists to reveal genuine passion and whether you can ship from week one.
You can't fully simulate the in-person part, but you can rehearse the part that's graded hardest - scoping ruthlessly, building something polished, taking feedback mid-stream and presenting it cleanly. Run this as a single focused day on a small AI-dev-tool feature.
Pick a feature with editor-paradigm textureScope target
Choose something that touches the novel-UI surfaces Cursor is still inventing, so your taste for AI-native interaction shows. Two strong options:
A code block showing an AI edit with per-hunk accept and reject controls.
Texture: how do you make red/green readable in dark mode, where do the controls live, what's the keyboard flow.
Demoable in a day if you fake the diff data and focus on the interaction.
Inline suggestion text the user accepts with Tab, with a subtle fade-in.
Texture: distinguishing committed text from suggestion, the accept animation, multi-line previews.
Tiny scope, high craft ceiling - perfect for showing motion polish.
The one-day shipping loopSimulation protocol
- 1Scope down hard, first hour. Write one sentence describing the demoable slice and a short cut-list of everything you're deliberately not building. The trial rewards a finished small thing over an unfinished ambitious one.
- 2Build it polished, not just working. Same discipline as the build round - happy path early, then states, accessibility and motion. Polish is the differentiator the whole trial is built to reveal.
- 3Get peer feedback mid-build. Around the midpoint, show a real person and ask one pointed question: “Is the accept affordance obvious?” Then actually incorporate what they say. Collaboration under a clock is part of the grade.
- 4Prepare a 5-minute presentation. Problem, the decisions you made and why, a live demo and honest next steps. Practice it once out loud against a timer so the demo doesn't eat your five minutes.
Structure the 5-minute presentDemo skeleton
- 0:00–0:45 · Problem
- What interaction you tackled and why it's hard on an AI-native editor.
- 0:45–2:00 · Decisions
- Two or three real choices - a motion call, an a11y call, a scoping cut - with the reasoning behind each.
- 2:00–4:00 · Demo
- Drive it live. Show the happy path, then one edge case you handled on purpose.
- 4:00–5:00 · Next steps
- What's still at 90%, what you'd build next and what you'd want feedback on.
Decisions and demo carry the weight; problem and next-steps are the bookends.
A polished, finished, well-explained small feature beats a sprawling half-built one every time. The team is asking a single question across two days: would we want to ship next to this person on Monday? Finishing, explaining and taking a note gracefully answers yes louder than raw ambition does.
Getting defensive when the peer feedback lands is the quiet killer. If someone says the accept affordance is unclear, the win is “you're right, let me try the control inline instead of below” - visibly changing your work. Truth-seeking here means killing your own decision fast, not defending it.
Takeaway. Simulate the trial in one focused day: scope to a demoable AI-dev-tool slice, build it polished, take and incorporate one round of peer feedback and present problem → decisions → live demo → honest next steps in five minutes.
Self-check
Portfolio & values dry run
After this you can After this you can deliver your portfolio walkthrough and behavioral answers cleanly under pressure.
The portfolio review and the values round test the same muscle from two angles: can you articulate the why behind your craft and do you treat this as a craft rather than a job.
Treat the rubric as a gap finder, not a score to admire. Mark the weakest proof, turn it into one practice rep and keep the artifact you would show an interviewer.
Interactive diagram. Tab through its regions; each focused region shows its detail in the panel below.
Every behavioral answer is being read against these - weight them in your STAR story selection.
Both fail the same way - vague answers that draw follow-up after follow-up. This drill is about delivery: run it live and timed, then tighten anything that wobbled.
The dry-run protocolRecord and review
- 1Walk your three pieces, timed, to a camera or a friend. Three to four minutes each. Lead with the interaction or visual decision, not the project's backstory - the reviewer cares why you chose that easing, not the company's roadmap.
- 2Take five pushback questions per piece, without flinching. Have someone ask “why this and not the simpler version,” “what did you cut,” “show me the worst part.” The goal is calm, specific answers, not a defense.
- 3Deliver your why-Cursor and three STAR stories back to back. No pause to reset between them. If your why-Cursor sounds like it could be said about any AI startup, it's not done.
- 4Tighten every spot that drew a follow-up. A follow-up question is a flag that the first answer was vague. Rewrite that one until it lands clean the first time.
What each pushback question is really probingRead the subtext
- The question
- “Why this design and not the obvious one?”
- What they're testing
- Taste backed by reasoning, not decoration
- A landing answer
- A concrete trade-off: “the obvious modal blocked the diff; an inline panel kept context visible”
- The question
- “What would you cut or redo?”
- What they're testing
- Truth-seeking; honesty about your own work
- A landing answer
- A real weakness named plainly, plus what you'd do instead
- The question
- “Show me the part you're least proud of.”
- What they're testing
- Whether you have a 90→100 standard
- A landing answer
- You point to it yourself and describe the last-mile polish it's missing
- The question
- “How did you know it was good?”
- What they're testing
- Judgment and how you validate craft
- A landing answer
- How you measured it - a reference comparison, a frame-rate check, user reaction
| The question | What they're testing | A landing answer |
|---|---|---|
| “Why this design and not the obvious one?” | Taste backed by reasoning, not decoration | A concrete trade-off: “the obvious modal blocked the diff; an inline panel kept context visible” |
| “What would you cut or redo?” | Truth-seeking; honesty about your own work | A real weakness named plainly, plus what you'd do instead |
| “Show me the part you're least proud of.” | Whether you have a 90→100 standard | You point to it yourself and describe the last-mile polish it's missing |
| “How did you know it was good?” | Judgment and how you validate craft | How you measured it - a reference comparison, a frame-rate check, user reaction |
Defensiveness reads as fragile craft; naming your own weak spots first reads as a high bar.
Pin your why-Cursor to something only you'd sayAuthenticity test
- Name a specific Cursor interaction you admire or would change and why - inline diffs, tab prediction, the agent UI. Generic praise of the mission is the tell of a candidate who skimmed the site.
- Tie it to what you'd build: “the interaction paradigms here aren't settled and I want to be one of the people inventing them” is a Design Engineer's why, not a generalist's.
- Bring proof of daily use. A real thing you built in Cursor this week beats any statement of enthusiasm.
Pre-empt your weakest piece. Open that walkthrough with “the part I'd redo is the exit animation, here's why” before they ask. Naming your own 90% spot first converts a potential gotcha into evidence of exactly the high standard the values round is hunting for.
“I chose a sliding inline panel over a modal because the modal hid the code the user was reviewing. It cost me a focus-management headache, but keeping the diff in view was worth it.” One decision, one trade-off, one consequence - that's the shape of a craft answer that doesn't draw a follow-up.
Takeaway. Run your three-piece walkthrough and STAR stories live and timed, lead with the why behind each craft decision, pre-empt your own weak spots and rewrite any answer that drew a follow-up until it lands the first time.
Self-check
QIn a portfolio review, an interviewer asks to see the part of a project you're least proud of. What's the strongest response?
Final readiness rubric
After this you can After this you can score yourself across the loop and target your last weak spots.
This is the gate. You rate yourself 1–5 across every dimension the loop tests and anything under 4 becomes a targeted drill before you book the real thing.
Treat the rubric as a gap finder, not a score to admire. Mark the weakest proof, turn it into one practice rep and keep the artifact you would show an interviewer.
Be honest to the point of discomfort. The loop is graded on your floor, not your ceiling, so an inflated self-score just hides the stage that will actually sink you.
Craft and coding readinessRate 1–5
- Dimension
- No-AI coding
- What a 5 looks like
- An accessible component flows from a blank file in under an hour, autocomplete only
- Drill if under 4
- Re-run the no-AI drill (s1) on a fresh problem until it's fluent
- Dimension
- SolidJS fluency
- What a 5 looks like
- You reason about signals and fine-grained reactivity without reaching for React habits
- Drill if under 4
- The reactivity deep-dive; build the same component in both frameworks
- Dimension
- CSS / layout
- What a 5 looks like
- Grid, container queries and stacking contexts are reflexes, not lookups
- Drill if under 4
- The modern-CSS module; rebuild a real layout from a screenshot cold
- Dimension
- Motion / polish
- What a 5 looks like
- Compositor-only animations, deliberate easing, focus and empty states by default
- Drill if under 4
- The web-animation module; A/B your easing against a reference app
- Dimension
- Component architecture
- What a 5 looks like
- Composable, headless-leaning primitives with a clean variant API
- Drill if under 4
- The design-system module; refactor a config-heavy component to slots
| Dimension | What a 5 looks like | Drill if under 4 |
|---|---|---|
| No-AI coding | An accessible component flows from a blank file in under an hour, autocomplete only | Re-run the no-AI drill (s1) on a fresh problem until it's fluent |
| SolidJS fluency | You reason about signals and fine-grained reactivity without reaching for React habits | The reactivity deep-dive; build the same component in both frameworks |
| CSS / layout | Grid, container queries and stacking contexts are reflexes, not lookups | The modern-CSS module; rebuild a real layout from a screenshot cold |
| Motion / polish | Compositor-only animations, deliberate easing, focus and empty states by default | The web-animation module; A/B your easing against a reference app |
| Component architecture | Composable, headless-leaning primitives with a clean variant API | The design-system module; refactor a config-heavy component to slots |
Narrative and values readinessRate 1–5
- Dimension
- Portfolio narration
- What a 5 looks like
- Three pieces, timed, each leading with a why that draws no follow-up
- Drill if under 4
- Re-run the dry run (s4) and rewrite every answer that drew a question
- Dimension
- Live critique
- What a 5 looks like
- You take pushback and your own weak spots calmly, even pre-empting them
- Drill if under 4
- Have a friend run hostile pushback until defensiveness disappears
- Dimension
- Why-Cursor
- What a 5 looks like
- Specific to an interaction you'd build, impossible to mistake for a generic answer
- Drill if under 4
- Rewrite it around one real Cursor surface plus proof of daily use
- Dimension
- Behavioral stories
- What a 5 looks like
- Three STAR stories in first person, each hitting a real values theme
- Drill if under 4
- Map each story to truth-seeking, ownership or craft; cut team-credit fog
| Dimension | What a 5 looks like | Drill if under 4 |
|---|---|---|
| Portfolio narration | Three pieces, timed, each leading with a why that draws no follow-up | Re-run the dry run (s4) and rewrite every answer that drew a question |
| Live critique | You take pushback and your own weak spots calmly, even pre-empting them | Have a friend run hostile pushback until defensiveness disappears |
| Why-Cursor | Specific to an interaction you'd build, impossible to mistake for a generic answer | Rewrite it around one real Cursor surface plus proof of daily use |
| Behavioral stories | Three STAR stories in first person, each hitting a real values theme | Map each story to truth-seeking, ownership or craft; cut team-credit fog |
Confirm the logistics that aren't about skillDon't let these sink you
- Location & pace
- In-person in SF or NY, fast and intense - confirm honestly that it's a yes for you.
- 2-day trial readiness
- Calendar cleared, travel sorted and you've done the one-day simulation at least once.
- Dev environment
- Your setup runs a component from scratch fast - no fighting tooling on the clock.
- Demo prep
- You can drive a live demo without it crashing and your 5-minute present is rehearsed.
Book the loop when every coding and craft item sits at 4 or higher and your why-Cursor is sharp and specific enough that no one could mistake it for a different company. A 5 on storytelling won't rescue a 2 on no-AI coding, so close the floor first.
The trap is grading the dimensions you enjoy generously and the ones you dread harshly, then prepping the fun ones because the reps feel good. Find your lowest score, put this week's hours there and re-score only that dimension before you decide you're ready.
Takeaway. Score every loop dimension 1–5, drill anything under 4 from the matching deep-dive, confirm the non-skill logistics and green-light yourself only when all coding and craft items are ≥4 and your why-Cursor is unmistakably specific.
Self-check
QYou rate yourself 5 on portfolio narration and behavioral stories but 2 on no-AI coding. Are you ready to book the loop?