Twenty days, one cricket game: the build log
How a cricket management sim went from a plan to 789 passing tests, day by day, including the parts that went wrong.

I’ve wanted to make a cricket management game for years. This one is called Cricket Pro, for now. Something as deep as Football Manager, with cricket real enough that a fan believes it. In August I finally started, with Claude Code writing the code and me doing everything else.
The case study has the short version. This is the long one, day by day, including the parts that went wrong.
Day one: an engine before dinner
On 20 August I asked for a plan.
We settled on a desktop game in .NET and Avalonia, international sides first, real player names during development, and a 2D match view later. By the afternoon there was a ball-by-ball engine. Each delivery runs through nine steps, from the bowler’s intent to where the fielders are standing, so a gap in the field is a gap because nobody is in it.
The engine was checked against real cricket from the first commit. That first check found six bugs that reading the code hadn’t. Good-length balls sailed over the stumps, so almost nobody was bowled. Every edge carried to a fielder. Ground shots never reached the rope, which gave one Test 10.5 runs an over and zero fours.
My job was the cricket. I corrected the follow-on rule, pointed out that Tests rarely go five days anymore, and complained about 110 declarations in 200 matches. When the declaration rate still looked off, I asked for it to be written down instead of tuned until it looked right. That started a known-issues file, and it’s still there.
The world, overnight
That night my prompts were mostly “yes carry on with…”. A season calendar, selection AI, ageing, injuries from bowling workload and save files all landed between midnight and 5am, roughly one an hour.
One bug, “not enough bowlers”, kept coming back in different places and kept getting patched where it showed up. Third time round I pointed out that teams have part-timers and all-rounders, and in a pinch anyone can bowl. Splitting “can bowl” from “counts as a bowler” fixed it for good.
The next morning I played match day for the first time and sent six complaints in one message. It asked me whether to declare after every single over, for example. All six were fixed within the hour. Before logging off that night I asked for a full handoff document, so another session could pick the project up cold. No session remembers the last one, so the documents became the project’s memory.
Stopping to design it
By day four I had a working skeleton that nobody had designed. Two external audits scored it 64/100 for UX and 11/24 for UI. Fair.
So I stopped adding features and set up a process. UX work with the intent skills, UI with impeccable, a written spec, then the build, with every feature tracked on a board. I also asked to be interviewed about the game I actually wanted. That interview produced 17 numbered decisions. You play a manager who can be sacked. You run match day yourself and can hand decisions to your captain. Accessibility gets checked at every UI stage.
Gold, then steel, then teal
The project had a rule against hard-coded colours and spacing from the first screen. A count found 290 of them anyway. Rules that only live in a document get ignored, so they became tests that fail the build.
The first accent colour was gold. It looked lovely on a button. On the home screen it filled a whole tile, and one caption on it measured 1.57:1. I said it looked really bad, and it did. It went to steel, then teal. Each change was one file, because nothing was hard-coded anymore.
For the player screens I shared Football Manager screenshots and said visualisation is key. Then we found the thing this game could do differently. Your scouts can be wrong about a player, so attributes are shown as a bar with a band for how sure they are, and only results like runs and wickets are printed exactly.

Real players
I wanted real cricketers, so I picked the sources: Cricsheet’s ball-by-ball archive for who played, Wikidata for bowling styles and birth dates. 22,703 match files became 1,429 players across 11 countries.
Every cut-off was measured, and the first guesses were wrong in funny ways. The first all-rounder rule made Joe Root an all-rounder. A test insisted Nathan Lyon was a fast-medium bowler. The first real world picked Hussey, Haddin, Pietersen and Bell for 2026, because everyone since 2001 was in it with a random age. Real birth dates and an activity cut-off sorted that out.
530 names belong to more than one cricketer, so nobody is ever matched by name. And if a country can’t field a legal XI from real players, the import stops. It doesn’t make anyone up.
Match day, twice
The first match-day redesign ran without me. It was good, and checking the old code against it found 18 bugs. Three of them could wipe a whole career, like an engine error that closed the game with your season unsaved.
But nobody had asked the person who’d play it, so I asked to be interviewed. Six answers changed the design. Match day became its own mode. Every over break stops, and you set the pace with “simulate to”. A success metric got dropped, because it would have improved whenever people used the feature less.
The build was split into six parts, and every part passed its tests. Then I put the branch next to the wireframes and it looked nothing like them. The skip control worked but had no button. The pitch map was squeezed into a strip at the bottom. Tests check logic. Somebody still has to look at the screen.
That became the top product principle, and it added quick play: one match, no career, about ninety seconds to the first ball.

Three sessions at once
At 00:07 on 28 August I opened three sessions in thirty seconds, each on its own branch: one for the career-wiping bugs, one for the match-day design, one for the roster. That day had 29 commits. It also set up every problem of the next ten days.
The board went stale and listed finished work as missing. A second roster picker got built next to the first one, and I only noticed when I asked whether I hadn’t already done this. A trial merge in a throwaway copy found 17 errors in files git said had merged cleanly.
On 8 September I called it. Everything is all over the place, bring it back into one place. The clean-up rescued an 18,052-row data table that only existed in an uncommitted folder, merged everything, deleted 17 branches and ran 789 tests twice to be sure.
Where it is now
Since then I’ve been redesigning the screens in Claude Design, using the design system and the match-day decisions as the brief. None of it is in the game yet. Next up is the beta: bring the redesign in, check the real career stats, build ratings from real data, and swap real names for fictional ones before anyone outside sees it.

If you want the tidy version with the decisions and the charts, the case study is here.