Weidong Shi.

AI in Action · Jul 7, 2026 · 14 min read

AI in Action: Building RetireCheck with Cursor

How practical engineering, domain architecture, and AI-assisted development shipped a production retirement calculator — from wizard UX to Monte Carlo projections.

I built a production-ready app in about a day of focused effort, spread over a weekend. I didn't write most of the code — but I made every architectural decision. That distinction is the whole story.

RetireCheck went from empty repo to deployed production app — frontend on Vercel, API on Render, tests and CI green — through a workflow I call intent-driven vibe coding: rules plus one-line prompts, with the pipeline enforcing quality. Vibe coding gets you a demo. Intent plus guardrails gets you production.

RetireCheck product showcase — wizard, gauge, and results
RetireCheck: four-step wizard, animated readiness gauge, and shareable results.

The project

RetireCheck is a free US retirement calculator that answers one question people quietly worry about: will your money last? A four-step wizard collects your situation — no sign-up. The backend runs a 1,000-scenario Monte Carlo simulation, compares Social Security claiming ages, and projects federal and state taxes, RMDs, and Medicare IRMAA surcharges year by year.

Stack: Next.js 16 + TypeScript + Recharts (Vercel) · ASP.NET Core with a pure C# domain library (Render) · xUnit · GitHub Actions CI.

RetireCheck architecture diagram — Next.js, API, and C# domain
One rule governs this architecture: all math lives in the C# domain layer.

Context engineering before prompts

Before asking Cursor to write a single component, I wrote the rulebook. The highest-leverage line in the repo:

All financial math lives in RetirementCalculator.Domain. No calculation logic in React components or API controllers.

That boundary keeps every tax bracket, Social Security adjustment, and Monte Carlo run in a pure, unit-testable C# library. The React layer stays a thin rendering shell — so there is no “AI spaghetti” where a tax formula quietly lands in a component.

Context, loop, and ship workflow diagram for Cursor-assisted development
Context → Loop → Ship: the engineer decides, the AI assistant types, the pipeline verifies.

Two features, prompt to production

Monte Carlo fan chart. One sentence — “Replace the pie chart with a Monte Carlo fan chart — shaded P10–P90 band, median line, open by default” — produced a Recharts composed chart. Review, typecheck, tests, ship.

RetireCheck Monte Carlo fan chart screenshot
The result of that one-sentence prompt: P10–P90 band with median line.

One-click sample plan. Most visitors from a social feed will not fill a four-step form. A sample-plan button wires a realistic profile through the same API path — still no calculation logic in the UI.

RetireCheck animated readiness gauge from sample plan
One click from the homepage: animated readiness score from 1,000 simulations.

Where the engineer stayed in the loop

  • Architecture — domain boundary, API contract, Next.js proxy to the backend.
  • Test strategy — xUnit on Social Security math and validation; CI on every push.
  • Review — every diff read before merge. The AI assistant proposes; git and CI dispose.

Takeaways

  1. Write rules before prompts.
  2. Isolate business logic in a pure, testable layer.
  3. Review diffs — never trust-and-paste.
  4. Ship something real; deploys teach.
  5. Your value moves up the stack: boundaries, contracts, tests, taste.

Closing

RetireCheck was the first full pass of the AI in Action loop: Build → Validate → Improve → Document → Share. SleepCheck follows the same philosophy in a different domain — proof that the methodology travels.

AI accelerates software delivery. Experienced engineering judgment shapes the final product.