Skip to main content

Promotion Simulator

The Only Honest Answer Was a Simulation

3 sessions26 prompts1h 35m human2h 54m AI
monte-carlosimulationreactmodelingplanning-first
View Live Project →
Project screenshot
Human: 1h 35m (35%)AI: 2h 54m (65%)

The Setup​

A colleague asked: "What percentage of team members would reasonably be up for promotion at any given cycle?" The question came with 5 assumptions (competent team, invested leader, twice-yearly cycles, 1/3 step sizes) -- but Brian understood that with the vast complexity of this space it was not so simple as fixing a few variables and guessing. A rich set of variables could be explored with a simulation, and that's something relatively simple to build, and something his customers might find interesting.

Brian framed both the original question and his own analysis of each assumption, then declared the intent: "I want to make a minimalist static site reactjs calculator, but we have to explore the model first." A single average or formula would be dishonest. The only real answer was Monte Carlo -- model the variables, run 10,000 teams, show the distribution.

All three sessions happened on a single day (Feb 6), interleaved with other projects -- 61 project switches that day.

Session 1: Pure Planning — Feb 6, 07:47-08:30 | 45 min | 5 prompts | Model exploration, zero code

Zero Code, All Thinking​

The entire session was model exploration. Not a single line of code was written.

Session
Demanding deeper modeling before any code exists
>Do some ultra thinking about the topic to come up with a range of variables, factors, modeling the simulation. Best ux to present this and interact with it
claudeProposes 'Avg time for full level transition (years)' as a key variable
>I don't like this one. I think it is itself too over-simplified. I think we should even model the career progression a bit more

Brian instructed Claude to create a CLAUDE.md file and set governance boundaries before any code: "I want really good tests co-located with the math. Once tests work, we don't touch them without discussing the reasons with me and getting permission from me."

Multiple plan rejections followed -- Brian used plan mode as a collaborative design space, not a rubber stamp. Session output: a shared mental model and the scaffolding for a detailed plan. No lines of code.

Session 2: The Big Build — Feb 6, 08:44-10:15 | 1.5 hours | 14 prompts | Full implementation, model interrogation, deepening

The Plan Drop​

Brian arrived with a detailed implementation plan he'd written between sessions, covering: simulation model (agent skill matrices, 6 skill dimensions, growth formula, demonstration mechanics, promotion evaluation, attrition), Monte Carlo structure (10k teams), sensitivity analysis (tornado chart, 9 parameters), UX design (4 visualizations, presets, web worker), architecture (pure math/UI split), tech stack (Vite + React 18 + Tailwind + Recharts), and an 18-step build order.

He opened the session with: "Implement the following plan."

Claude executed the entire pipeline in one long run: types, constants, RNG, skill matrices, agents, teams, aggregation, simulation, sensitivity analysis, web worker, React hooks, all UI components, and presets. 40+ files created. Tests ran at each step.

While Claude executed the full 18-step build, Brian was working on other projects. He'd fire off the plan, switch away, and come back when Claude was done. When he returned at 09:21, the dev server was running and 75 tests were passing.

Model Interrogation​

Session
Four questions in one message, ending with 'discuss'
>What does learning speed mean? Where do we take into account the manager's qualities? Do the colleague's 5 assumptions have any bearing? Let's think before changing stuff here. Discuss.

He caught leaked framing in the UI: "Don't write 'original question', remove the fact this was a question, map the case onto something generic sounding where it wasn't 'someone asked you'." Spotted a counterintuitive result: "Kind of odd, if I move cycles per year to 1 instead of 3, the % rate decreases, I thought it would increase."

Model Deepening​

Brian requested variable skill growth rates: "different people grow at different speeds at different times, each person has a different pace and each month has a different modifier." Caught a copy detail: "Don't use emdashes in copy anywhere."

Claude proposed a Team Inspector feature for drilling into individual career progressions -- by preserving the random seed used in the simulation, any arbitrary team could be deterministically re-computed on-the-fly, avoiding the need to store 10k teams in memory. Brian: "yeah that's a cool idea actually. Build that." Per-agent per-cycle skill snapshots, progression tables, wired through the web worker.

Manager Modeling Escalation​

Session
Pushing simulation far beyond its original scope
>We need to model manager competency and manager strategy to get people promoted. Do some heavy thinking here.
>manager also has a strategy for how they coach people. Some are uniform, some have a favourite, some will focus on the closest, some on the lowest, lots of strategies there

Layered on bimodal attrition ("People who are looked over when promotion ready increases their chances of leaving multiple times") and lost-talent tracking. Session ended with Claude in plan mode, Brian rejecting the final edit -- he would write the plan himself between sessions.

Session 3: Manager Implementation and Validation — Feb 6, 10:16-12:39 | 2.5 hours | 7 prompts | Coaching strategies, calibration, deploy

Another Plan Drop​

Brian arrived with another detailed implementation plan for manager modeling, bimodal attrition, and lost-talent tracking. Covered: 4 new parameters (managerDevelopment, managerAdvocacy, coachingStrategy, frustrationScale), 8 implementation steps, file change summary, verification checklist. Again opened with the plan as the prompt.

Claude implemented all steps: expanded constants/types, created coaching.js with 5 coaching strategies, wired manager effects into skill matrix / agent / team modules, added lost-talent aggregation, enriched the team inspector with attrition data, created ManagerControls UI, updated results displays and model assumptions, added 21 new tests. All 112 tests passed.

Model Validation​

Brian shifted from building to validation: "I want to think through the quality of the model. Inspect it for logical correctness. When I open the page I see average promotion rate per cycle is 0.7%, I didn't do any thinking in any direction, is it reasonable for the defaults we have?"

Claude ran diagnostic scripts tracing numbers through the pipeline. Found: 0.7% is too low, median is 0.0%, bottleneck is baseGrowthRate=0.08 being too slow for Technical Execution skill thresholds. Also identified weak test assertions that would pass regardless of model correctness. Brian approved the fix: baseGrowthRate adjusted from 0.08 to 0.15, sensitivity parameters updated, weak test assertions tightened.

Deploy and Polish​

Meta tags, OG image via Puppeteer screenshot. Brian asked Claude to check his Forgejo deploy script.

Session
Protecting working infrastructure from well-meaning 'fixes'
claudeFlags potential issues in the deploy script
>nope none of that is a bug, it's actually what works. Don't change my deploy file in this case.

Final fix: "use Puppeteer. Something is wrong with the tornado rendering logic. Bars are not really centered. Let's fix that." -- Claude used Puppeteer for multiple rounds of screenshot-edit-verify to fix the centering.

What This Shows​

The Extreme Planning-to-Execution Ratio

Session 1 was 100% planning, 0% code. Brian wrote detailed implementation plans between sessions and delivered them as prompts. The plans were not vague specs -- they included file structures, build order, verification criteria, and parameter definitions. Brian's planning happened in focused bursts between context switches. The plan emerged from a ~45-minute dialogue, then Brian switched to other projects. When he came back, he provided the plan and immediately switched away again while Claude built everything.

Thinking-First as a Design Pattern

Brian's first instinct on receiving a question was not "build a calculator" but "explore the model." He rejected Claude's simplifications ("too over-simplified") and demanded deeper modeling before any code existed. The product grew richer because Brian kept discovering new modeling dimensions while reviewing results -- manager coaching strategies, bimodal attrition, lost-talent tracking were not in the original plan.

Tests as Contracts, Not Safety Nets

"Once tests work, we don't touch them without discussing the reasons with me and getting permission from me" -- set before any code was written. Tests were locked governance boundaries, not just regression checks. When validation revealed weak assertions, that was treated as a model quality issue, not just a testing gap.

Active Quality Gating at Every Altitude

Model theory: "I think it is itself too over-simplified." Simulation logic: "is 0.7% reasonable for the defaults we have?" UI copy: "Don't write 'original question'." Typography: "Don't use emdashes in copy anywhere." Visual rendering: tornado chart bar centering via Puppeteer. Infrastructure: "nope none of that is a bug, it's actually what works."