Capstone: Full Mock Loop
Rehearse the whole loop end to end and find your gaps
No-AI coding rep
After this you can solve a timed problem with no AI beyond autocomplete.
Cursor's first technical screen bans AI past editor autocomplete on purpose. As Michael Truell put it, “programming without AI is still a really great time-boxed test for skill and intelligence.” So the only honest prep is to run that exact constraint on yourself.
This is the one round you can't lean on tooling to fake. Open a blank file, kill Copilot and Cursor's agent, leave only token autocomplete and start a 45-minute timer. Pick a problem with the texture of infra work: a graph, a tree or something concurrent.
Pick one representative problemDrill scope
Cycle detection in a service dependency graph or topo-sort a deploy order.
Shortest path across regions with weighted latency edges.
Tests: the data structures under VPC peering, mesh routing, DAGs.
Merge overlapping CIDR ranges or find the smallest subnet covering a set of IPs.
Build and query a trie of route prefixes.
Tests: range logic that shows up in routing and rate-limit windows.
A bounded worker pool draining a job queue with backpressure.
A thread-safe token-bucket limiter under contention.
Tests: the exact primitives behind autoscaling and edge limits.
Narrate the whole time, out loud, as if an interviewer is on the call. State your approach and its complexity before you type, then talk through each tradeoff as you hit it.
The 45-minute protocolRun it like the real screen
- 10–5 min · Clarify and restate. Pin down inputs, ranges and the failure cases. Can the graph have cycles? Are weights negative? What's the IP-set size? Ask the questions that change your data-structure choice.
- 25–10 min · State the plan and the Big-O. Name your approach and its time and space complexity before writing code: “BFS over the dependency graph, O(V+E) time, O(V) for the visited set.” Commit to it out loud.
- 310–35 min · Write clean production code. Real names, small functions, no dead branches. Handle the empty input and the single-element case as you go, not as an afterthought.
- 435–42 min · Test it. Run a normal case, an empty case and the nastiest edge you can construct. Fix what breaks while narrating the bug.
- 542–45 min · Discuss complexity and alternatives. Restate the Big-O, name one approach you rejected and why and call out what you'd profile if this ran at 1M+ DAU scale.
Interactive diagram. Tab through its regions; each focused region shows its detail in the panel below.
Test is the gate: clearing your own cases before you talk complexity is what separates a pass from a stall.
type Bucket = {
capacity: number;
tokens: number;
refillPerSec: number;
last: number; // epoch ms of last refill
};
function allow(b: Bucket, now: number, cost = 1): boolean {
// Lazy refill: compute tokens earned since last check, cap at capacity.
const elapsedSec = (now - b.last) / 1000;
b.tokens = Math.min(b.capacity, b.tokens + elapsedSec * b.refillPerSec);
b.last = now;
if (b.tokens >= cost) {
b.tokens -= cost;
return true;
}
return false; // throttle: caller returns 429 + Retry-After
}Typing it isn't the point. The point is that you can answer: why lazy refill instead of a background timer, what breaks under concurrent callers, why tokens is a float and not an int. If you can't defend a line, you don't actually know it.
Reaching for the AI by reflex is the failure this round exists to catch. Mute it before you start. Practicing with autocomplete-only is uncomfortable precisely because it surfaces the fundamentals you've been outsourcing - that discomfort is the signal, not a problem to fix with a better prompt.
Self-score honestly
- Did you reach a working solution that passes your own tests inside the box?
- Did you state complexity before coding and discuss the tail at scale?
- Did you handle the empty and single-element edge cases without prompting?
- Where did you stall - recursion, pointers, locking, graph traversal?
Treat your stall point as the deliverable. If you froze on cycle detection or on the lock, that's the exact drill to schedule for tomorrow - a fresh problem in the same family, recorded and re-timed. The screen grades your floor, so spend reps on the weakest fundamental, not on polishing what already works.
Takeaway. Run the no-AI screen on yourself with autocomplete only: clarify, state Big-O before coding, test edge cases, then turn your stall point into tomorrow's drill.
Self-check
QCursor's first technical screen forbids AI beyond editor autocomplete. How should you practice for it and what's the most common self-sabotage?
Infra system-design dry run
After this you can design a Cursor-flavored infra system under time pressure.
Infra design at Cursor isn't a background concern. You're drawing the foundation under a product serving 1M+ DAUs where multi-region latency, abuse-resistance and cost are first-order business problems. The design round watches whether you reason like the person who owns that.
Run one full prompt under a 45-minute clock, on a whiteboard or in a doc, narrating as you go. Use a Cursor-shaped problem so the tradeoffs are real.
Two prompts to runPick one per session
“Design the edge and rate-limiting layer protecting Cursor's inference backends across regions for 1M+ DAUs.”
Pulls in CDN, WAF, Anycast, token-bucket vs sliding-window, abuse mitigation, per-user and per-tenant limits.
“Design multi-region failover for a latency-critical developer-tool API with an explicit latency budget.”
Pulls in active-active vs active-passive, data locality, global load balancing, health checks, failover time.
Drive the same six phases every timeDesign protocol
- 1Requirements. Quantify before you draw. How many requests per second at peak, what's the p99 latency budget, what's the abuse threat model, what's the cost ceiling? Numbers anchor every later tradeoff.
- 2Topology. Sketch the regions, the edge tier, the load balancers and where state lives. Convert any picture in your head into named components and the path between them.
- 3Data flow. Trace one request end to end: DNS or Anycast, edge termination, WAF and rate-limit check, route to the nearest healthy region, backend, response. Say where each hop adds latency.
- 4Failure modes. Kill each component on purpose. A region drops, the limiter's state store partitions, a backend gets slow not dead. State what degrades and what the user sees.
- 5Cost / reliability tradeoffs. Make the call explicit. Active-active doubles spend for seconds of failover; active-passive is cheaper but loses minutes. Pick one and defend it against the budget.
- 6SLOs. Close with the SLIs, the targets and the error budget that govern this. p99 under 200ms, 99.95% availability and here's what we shed first when the budget burns.
Interactive diagram. Tab through its regions; each focused region shows its detail in the panel below.
Cost/reliability is the gate - the call you make explicit there is what the panel is really watching.
For the rate-limiting prompt, the algorithm choice is where strong candidates separate. Name the tradeoff out loud rather than defaulting to whatever you used last.
- Algorithm
- Token bucket
- Strength
- Allows controlled bursts; simple per-key state
- Cost / weakness
- Tuning burst vs rate is fiddly; needs shared state across edges
- Algorithm
- Sliding window log
- Strength
- Most accurate count over the window
- Cost / weakness
- Stores every timestamp - memory blows up at 1M+ DAU
- Algorithm
- Sliding window counter
- Strength
- Near-accurate, cheap fixed memory per key
- Cost / weakness
- Slight approximation at window edges
- Algorithm
- Fixed window
- Strength
- Cheapest to implement
- Cost / weakness
- Lets a 2x burst through at the window boundary
| Algorithm | Strength | Cost / weakness |
|---|---|---|
| Token bucket | Allows controlled bursts; simple per-key state | Tuning burst vs rate is fiddly; needs shared state across edges |
| Sliding window log | Most accurate count over the window | Stores every timestamp - memory blows up at 1M+ DAU |
| Sliding window counter | Near-accurate, cheap fixed memory per key | Slight approximation at window edges |
| Fixed window | Cheapest to implement | Lets a 2x burst through at the window boundary |
At Cursor's scale, sliding-window counter is the usual sweet spot; say why you'd pick it over the log.
Distributed rate limiting has a state problem they will probe: do you check limits at each edge with local counters or against a shared store like Redis? Local is fast but lets users exceed the global cap by hitting many edges; shared is accurate but adds a network hop and a dependency. Name the tradeoff and pick based on whether the limit is a hard abuse ceiling or a soft fairness control.
Designing only the happy path is the most common way this round goes flat. Cursor's infra exists to survive a region loss and a coordinated abuse spike, so an architecture that never names a failure mode reads as someone who hasn't operated at scale. Spend real time killing your own components.
Score your own tapeSelf-rubric
- Dimension
- Quantified
- Pass looks like
- RPS, latency budget and cost ceiling stated up front
- Red flag
- “It should be fast and scalable” with no numbers
- Dimension
- Named tradeoffs
- Pass looks like
- Explicit active-active vs active-passive and an algorithm choice, defended
- Red flag
- One option presented as the only option
- Dimension
- Handled the tail
- Pass looks like
- p99 and a graceful-degradation plan, not just averages
- Red flag
- Designed for the median request only
- Dimension
- Handled abuse
- Pass looks like
- WAF, rate limits and a DDoS/abuse story at the edge
- Red flag
- Assumed all traffic is well-behaved
- Dimension
- Closed on SLOs
- Pass looks like
- SLIs, targets and an error budget that drives decisions
- Red flag
- No measurable definition of done
| Dimension | Pass looks like | Red flag |
|---|---|---|
| Quantified | RPS, latency budget and cost ceiling stated up front | “It should be fast and scalable” with no numbers |
| Named tradeoffs | Explicit active-active vs active-passive and an algorithm choice, defended | One option presented as the only option |
| Handled the tail | p99 and a graceful-degradation plan, not just averages | Designed for the median request only |
| Handled abuse | WAF, rate limits and a DDoS/abuse story at the edge | Assumed all traffic is well-behaved |
| Closed on SLOs | SLIs, targets and an error budget that drives decisions | No measurable definition of done |
Watch the recording with this open and timestamp every red flag.
Takeaway. Drive every infra design through requirements → topology → data flow → failure modes → cost/reliability tradeoffs → SLOs, quantifying up front and killing your own components for the tail and abuse cases.
Self-check
Past-work deep-dive rehearsal
After this you can tell a senior-level story about infra you actually built.
The deep-dive is where Cursor checks that you operate as a functioning senior IC, not someone who watched a project happen near them. They pick the at-scale thing you built and drill until they hit either bedrock or hand-waving.
Pick your strongest at-scale infra project and rehearse it cold. The selection rule matters: choose the one where you owned a hard decision and can put numbers on the outcome, not the one with the prettiest diagram.
Structure the story before they askRehearsal protocol
- 1Frame the problem and the scale. One sentence on what was breaking and the numbers around it - RPS, region count, cost, the SLO you were missing. Scale is the price of entry for a senior story.
- 2Walk the architecture you chose. The topology, the key components and the path of a request or a deploy through them. Keep it tight enough that follow-ups have room to go deep.
- 3Isolate your specific contribution. Say “I” and name the exact decisions you owned versus what the team or another engineer drove. Vague collective credit reads as someone who wasn't actually in the decision.
- 4Quantify the outcome. Latency before and after, cost saved, availability gained, incidents avoided. A result without a number is an opinion.
- 5Name what you'd change. The thing you'd redo with what you know now. Owning a flaw is a stronger signal than defending a perfect record.
Anchor it with real numbersQuantify outcomes
- Latency
- p50 and p99 before vs after, with the budget you were holding to.
- Cost
- Monthly spend or unit cost moved and the lever - Spot, right-sizing, killed waste.
- Availability
- Nines before vs after or failover time cut from minutes to seconds.
- Scale held
- Peak RPS, DAU, region or cluster count the design carried.
- Your decision
- The one architectural call that was yours and the alternative you rejected.
If a row is blank, that's a gap to fill before the loop, not a number to invent.
Then have a peer attack it. Every major choice gets a “why not X?” and you answer without flinching.
- They ask
- Why EKS not self-managed k8s?
- Weak answer
- “It's the standard / it's what we used.”
- Strong answer
- Control-plane ops cost vs team size, IRSA for IAM and the upgrade burden we didn't want to own.
- They ask
- Why active-passive not active-active?
- Weak answer
- “Active-active is too complex.”
- Strong answer
- The cost of double capacity vs our actual failover SLO; minutes of RTO were acceptable for that tier.
- They ask
- Why Terraform not Pulumi?
- Weak answer
- “More people know Terraform.”
- Strong answer
- State and module maturity, drift detection in our pipeline and the existing module library we'd reuse.
| They ask | Weak answer | Strong answer |
|---|---|---|
| Why EKS not self-managed k8s? | “It's the standard / it's what we used.” | Control-plane ops cost vs team size, IRSA for IAM and the upgrade burden we didn't want to own. |
| Why active-passive not active-active? | “Active-active is too complex.” | The cost of double capacity vs our actual failover SLO; minutes of RTO were acceptable for that tier. |
| Why Terraform not Pulumi? | “More people know Terraform.” | State and module maturity, drift detection in our pipeline and the existing module library we'd reuse. |
Strong answers cite the constraint and the rejected option; weak answers cite the convention.
Practice going three “why” levels deep on your single biggest decision. Why service mesh? mTLS and traffic splitting. Why Istio over Linkerd? The sidecar overhead vs feature need. Why eat the sidecar cost at all instead of sidecarless? The third level is where memorized answers run out and real ownership shows. Rehearse until you don't hand-wave at level three.
“I moved us from active-passive to active-active across two regions because our failover RTO of four minutes was burning the SLO during AZ events. It roughly doubled steady-state cost, which I justified against the revenue at risk per minute of downtime. If I redid it, I'd have shipped global load balancing first and split traffic gradually instead of cutting over.”
Takeaway. Pick the at-scale project where you owned a hard call, tell it in the first person with before/after numbers and rehearse three “why” levels deep until level three stops being hand-waving.
Self-check
Behavioral rapid-fire
After this you can deliver tight values-aligned answers on demand.
The behavioral round probes whether you fit a small, flat, talent-dense team where every hire ships from week one. They're reading for truth-seeking, bias to ship and honest cost-versus-reliability judgment - not polish.
Interactive diagram. Tab through its regions; each focused region shows its detail in the panel below.
Map every story to one of these signals; a story that lands on none is a wasted slot.
Run these cold, out loud, one after another, each under two minutes. The constraint is the drill: a tight situation, the action you took and a quantified result.
The five prompts to rehearseRapid-fire set
“Tell me about a time you changed your mind with evidence.”
Maps to: willingness to be wrong, spirited technical debate.
“Describe a deliberate cost-vs-reliability call you made.”
Maps to: defensible tradeoffs over gold-plating.
“Walk me through an incident you ran.”
Maps to: calm under pressure, clarity in postmortems.
“When did you push back on a senior engineer?”
Maps to: flat-team candor, bias to ship over deference.
The fifth prompt is the one most people fumble, so rehearse it hardest: “Tell me about a time you were wrong.” The trap is choosing a fake flaw. Pick a real mistake with a real cost and a real fix.
Hold every answer to this shapeTwo-minute structure
- Situation (20s)
- The stakes and the constraint, fast. Skip the backstory.
- Action (60s)
- What you personally did and the decision you owned - “I,” not “we.”
- Result (30s)
- A number. Latency, cost, downtime avoided, time saved.
- Reflection (10s)
- What you'd do differently, especially for the “wrong” story.
If an answer runs past two minutes, you're narrating the backstory instead of the decision.
After each answer, check it against a Cursor value. A story that doesn't map to one isn't wrong, but it's a wasted slot.
- Prompt
- Changed your mind
- Cursor value it should hit
- Truth-seeking - evidence over ego
- Prompt
- Cost vs reliability
- Cursor value it should hit
- Decisive, defensible tradeoffs
- Prompt
- Ran an incident
- Cursor value it should hit
- Calm under pressure, ownership
- Prompt
- Pushed back
- Cursor value it should hit
- Spirited debate on a flat team
- Prompt
- Time you were wrong
- Cursor value it should hit
- Truth-seeking + bias to learn fast
| Prompt | Cursor value it should hit |
|---|---|
| Changed your mind | Truth-seeking - evidence over ego |
| Cost vs reliability | Decisive, defensible tradeoffs |
| Ran an incident | Calm under pressure, ownership |
| Pushed back | Spirited debate on a flat team |
| Time you were wrong | Truth-seeking + bias to learn fast |
Every story should land on a value; if it lands on two, even better.
Generic enthusiasm and the humble-brag fake flaw both read as job-shopping, which the whole loop is built to filter. “I care too much about quality” isn't a wrong story - it's a non-answer. They'd rather hear you took down a region with a bad Terraform apply and what you changed so it can't happen again.
After the rapid-fire, list the prompts you had no real story for. That's your build list, not a gap to talk around. If you can't tell a genuine cost-vs-reliability story, go make the next tradeoff at work deliberately and own it, so by the loop it's lived experience instead of a hypothetical.
“I was wrong about pushing everything to Spot to cut cost - a Spot reclamation cascade took our batch tier down for 20 minutes during a peak. I'd argued the savings were worth it. The fix was a mixed instance policy with an on-demand floor and I now design Spot adoption per-tier against the SLO instead of as a blanket cost play.”
Takeaway. Rehearse five values-mapped stories cold, each under two minutes with a quantified result and a first-person “I,” and flag any theme you have no real story for as a build list.
Self-check
QFor the “tell me about a time you were wrong” prompt, what makes an answer strong and what's the trap?
2-day project simulation
After this you can rehearse scoping and shipping a real thing fast.
The decision round is a 2-day on-site project where shortlisted candidates build something real with the team, share meals and present at the end. It's designed to filter people “just viewing it as a job.” You can't replicate the team or the meals, but you can replicate the shape: build and demo a real infra tool under a hard clock.
Give yourself a half-day. Pick a small infra tool with a demoable core and a vague-enough brief that you have to scope it yourself.
Pick one buildable toolDrill scope
Read AWS Cost and Usage data (or a sample CSV), group spend by tag, flag untagged waste.
Demoable core: a ranked list of cost by team with the biggest untagged line called out.
A small service enforcing a token bucket per key, backed by Redis, with a 429 + Retry-After.
Demoable core: hammer it with a load script and show the cap holding across two instances.
The half-day protocolRun it like the real project
- 1First 30 min · Orient and write your questions down. Treat it like ramping on an unfamiliar codebase. List the sharp questions you'd ask the team - which cloud account, what's the tag taxonomy, is there an existing limiter pattern, who consumes the output - instead of guessing in silence.
- 2Scope to a demoable slice. Choose the thinnest end-to-end path that proves the tool works on one real input. Write down what you're deliberately cutting and why.
- 3Build end-to-end first, then deepen. Get the full unglamorous slice running before polishing any layer. A vertical you can demo beats a gorgeous half that doesn't run.
- 4Verify it on a real input. Run it against actual data or live traffic, add one test or a reproducible check and note the edge cases you didn't reach.
- 5Write a 5-minute presentation. Show it working in the first 60 seconds, then spend the rest on the tradeoffs you made, what you cut and what you'd build next.
The on-site grades collaboration as hard as code, because you'd be on a flat team where teammates' trust is the currency. So rehearse the human signals, not just the build.
- Did you ask sharp early questions or burn an hour guessing the requirements?
- Would a teammate watching call you pleasant to pair with under a clock?
- Did you communicate progress and blockers or go dark and surface at the end?
- Did you protect the demoable slice instead of rabbit-holing on one layer?
- Could you take feedback mid-build and change course without getting defensive?
Rabbit-holing on one layer until nothing demos is the classic failure of an open-ended build. Protect the walking skeleton above all. A working thin slice with honest gaps beats a deep, broken vertical and on the real on-site it also leaves you energy to actually engage with the team instead of grinding in silence.
“I shipped the end-to-end cost report first and deliberately stubbed the multi-account join. With more time I'd add it next, since cross-account attribution is where the real waste hides - and I'd verify it by reconciling the total against the actual AWS bill, not just trusting my grouping.”
Takeaway. Half-day mock of the on-site: scope a small infra tool to a demoable slice, ask sharp questions early, protect the walking skeleton and rehearse the collaboration signals as hard as the build.
Self-check
Readiness scorecard and final plan
After this you can turn gaps into a dated study plan before the loop.
Run the whole loop on yourself before they do. The point of a mock loop isn't to feel ready - it's to find the dimension that will sink you while there's still time to fix it.
Interactive diagram. Tab through its regions; each focused region shows its detail in the panel below.
Each drill in this module rehearses a stage here; the no-AI screen and the 2-day project are the distinctive gates.
Score yourself 1–5 on each area below using the evidence from the five drills you just ran, not your memory of how they felt. Anything under 3 is a blocker, because the loop is graded on your floor.
- Area
- No-AI coding fundamentals
- What a 5 looks like
- Working, tested solution under the clock with complexity stated, autocomplete only
- Source drill
- Section 1
- Area
- Infra system design
- What a 5 looks like
- Six-phase drive, quantified, with tail and abuse handled and SLOs to close
- Source drill
- Section 2
- Area
- AWS / K8s depth
- What a 5 looks like
- VPC, EKS, IAM and mesh tradeoffs defended three “why” levels deep
- Source drill
- Sections 2 & 3
- Area
- Edge / multi-region
- What a 5 looks like
- Rate-limit algorithm choice and active-active vs passive, defended on cost
- Source drill
- Sections 2 & 3
- Area
- IaCInfrastructure as Code. Managing servers and cloud resources through version-controlled config files (e.g. Terraform). / cost judgment
- What a 5 looks like
- Reproducible IaCInfrastructure as Code. Managing servers and cloud resources through version-controlled config files (e.g. Terraform). instinct and a defensible cost-vs-reliability call
- Source drill
- Sections 3, 4 & 5
- Area
- Behavioral / values
- What a 5 looks like
- Five values-mapped stories cold, first-person, with quantified results
- Source drill
- Section 4
| Area | What a 5 looks like | Source drill |
|---|---|---|
| No-AI coding fundamentals | Working, tested solution under the clock with complexity stated, autocomplete only | Section 1 |
| Infra system design | Six-phase drive, quantified, with tail and abuse handled and SLOs to close | Section 2 |
| AWS / K8s depth | VPC, EKS, IAM and mesh tradeoffs defended three “why” levels deep | Sections 2 & 3 |
| Edge / multi-region | Rate-limit algorithm choice and active-active vs passive, defended on cost | Sections 2 & 3 |
| IaCInfrastructure as Code. Managing servers and cloud resources through version-controlled config files (e.g. Terraform). / cost judgment | Reproducible IaCInfrastructure as Code. Managing servers and cloud resources through version-controlled config files (e.g. Terraform). instinct and a defensible cost-vs-reliability call | Sections 3, 4 & 5 |
| Behavioral / values | Five values-mapped stories cold, first-person, with quantified results | Section 4 |
Score from the recordings, not from memory. Memory inflates.
Before you apply, confirm you can tell all three cold: an at-scale infra project with before/after numbers, a real incident you ran (what broke, how you diagnosed it, the postmortem fix) and a deliberate cost-vs-reliability tradeoff you owned. Missing any one is a gap to close, not a story to fudge in the room.
Turn scores into a dated planGap plan
- 1Rank your two weakest areas and date them. Front-load them on the calendar - a 5 in design can't rescue a 2 in no-AI coding. Put a deadline on each weak area, not a vague “later.”
- 2Assign concrete reps, not reading. A sub-3 in coding means three more timed, autocomplete-only problems by Wednesday, recorded and re-scored. An article isn't a rep.
- 3Build any missing non-negotiable story. If you have no metric-backed incident story, mine your past work for the real one before inventing prep around a story that has no number.
- 4Confirm logistics with your recruiter. Pin down stage details, the allowed languages for the coding screen (TypeScript, Go, Rust or Python) and the scope and format of the 2-day project so you're not surprised.
- 5Lock a final-week routine. Use Cursor daily so “why Cursor” is lived, do fundamentals reps each morning and run one full mock end to end before the real loop.
- Daily
- Use Cursor on real work so your product opinions are current and specific.
- Each morning
- One timed, autocomplete-only fundamentals problem in your screen language.
- Midweek
- Re-run your two weakest drills and re-score from the tape to confirm movement past 3.
- Once
- One full mock loop end to end - coding, design, deep-dive, behavioral, mini build.
Movement from a 2 to a 3+ on the recording is the only proof the plan worked.
One question decides it: could you own the foundation under a product serving 1M+ DAUs, make a decisive cost-versus-reliability call and ship from week one on a flat, high-bar team? If every drill and recording points to yes, you're ready. Wherever a yes is faked, that's exactly where this week's reps go.
Takeaway. Score every area from the tape; any sub-3 is a dated blocker. Front-load your two weakest with concrete reps, confirm the three non-negotiable stories and lock a final-week routine ending in one full mock.
Self-check
QYour mock scores are: no-AI coding 2, infra design 5, AWS/K8s depth 4, behavioral 4. How should you spend your prep week?