For years I've had this one app idea stuck in my head – recreating a dice game from my early days on the internet, but with modern UI: Fifty!
About Fifty!
You can read more about Fifty! & it's rules on the Knuddels Wiki.
This has always felt like a good project to test "how far an AI can get on it's own".
The first time I tried it with ChatGPT o1, trying to recreate it as a simple JavaScript browser console game. This one worked extremely well, since all the code fit & worked in a single "scope".
The gameplay worked with a really simple one-shot prompt:
GPT o1 Initial Prompt
I want a fully working native javascript implementation of the Knuddels.de game called "Fifty!". More information on how it works will follow later. Use no dependencies. Use the console with state of the art browser console styling, grouping/scaffolding & user input to let the user play the game, after the script has been pasted into the browser console. Here's more information about the game & its workings: [...full Fifty! docs...]
Any additional few back & forth prompts were primarily for improving the visuals & gameplay experience. Other than that, this was a really solid working proof-of-concept in the browser console.
This was simple proof that 2025 AI models could easily understand & recreate the game mechanics of Fifty!.
Onto the next level.
Equipped with my POC JS code I decided to take this to Cursor && Claude, in this case still Sonnet 3.7 - Thinking.
This time I wanted to try the dream. Spelling out what I want all at once & then let it rip!.
I crafted a few high level files:
fifty-game-rules.md
- Docs of all game rules & mechanicsfifty_flutter-plan.md
– High level description of the app functionality / intended UI flowinstructions.md
– A starting point document, with descriptions of the task, initial prompt, location of key files & basic behavior rules the AI should followI also gave the AI 3 files to use for itself:
memory.md
– "Collect any findings, learnings & other things you need to remember in @memory.md;"progress.md
– "Use this file to keep track of what you completed implementing etc."implementation.md
– "Create a detailed implementation plan inside of @implementation.md"And then sent the AI Agent off with this initial prompt, linking to all those files:
Sonnet 3.7 Initial Prompt
Context: @fifty-game-rules.md @fifty-js-console-gamecode.md @fifty_flutter-plan.md Start here: @instructions.md cc: @implementation.md @progress.md @memory.md
The idea with this try was so to see how far the AI would get on its own without me doing much more than tasking it to "keep going", switching between prompting it to create a sprint plan & then execute on it, whiling pasting errors back into the chat along the way.
This is the way most people I know expect AI agents to work right now.
If it can't replace me, it's no good.
While this worked pretty okay, moving this way meant I didn't know any of the patterns, practices or specific code it wrote.
Not even just when it comes to errors, but even forseeing future feature collisions.
While it actually acomplished to produce a working game with minimal UI, it required quite some error-debugging during the gameplay development, but ultimately quickly showed weaknesses once I peaked under the hood, because it couldn't realize a required UI feature.
In it's implementation the AI failed to correctly track the remaining available dice for the user. Each round, all the dice where available, even though previously used ones should be removed until the end of the game.
This in itself sounds like a simple error to fix. But this was the moment the "hands off" approach hit it's limit. Cursor kept coming back with "fixes" that weren't actually changing any behavior and since I didn't know a single line of the way it kept track of dices & synced them to the UI, I wasn't intending on trying to now go back & start reading the entire codebase to help out.
In a last effort I tried to pivot the AI & ask for a rewrite of the game logic, to keep track of dices for each player individually.
When it then started to implement a new Player
class, even though the the full Game/Player-logic incl. models was already in place – I knew it was time to call it a day; since I wasn't able to verify any new model it would try to add to not already be there.
This was the point I called it a Fail.
Bionic Arm
In You Are AI Coding Wrong I described my understanding of AI as a bionic arm rather than a separate entity that should be able to read your mind. You harness the speed & technical knowledge, while maintaining the one steering the operation step by step. A power washer for coding if you will.
After Anthropic published Sonnet 4 & seeing some of it's proactive quality in action in other projects, I decided to give it a final shot.
I started with the same high level files:
fifty-game-rules.md
- Docs of all game rules & mechanicsfifty_flutter-plan.md
– High level description of the app functionality / intended UI flowinstructions.md
– A starting point document, with descriptions of the task, initial prompt, location of key files & basic behavior rules the AI should followI then manually set up a new Flutter project, and started coding; But this time the first prompt looked like this:
Sonnet 4 Initial Prompt
Please create a custom OTP component inside of @components it should be customizable to specify: - code length - support alphabetical letters (uppercase) - callbacks on each field entry (props: lastField, allFields) - callbacks on all fields filled (props: allFields)
This was the start of what should turn into a 5h prompting session, after which I came out the other end with a fully working app with more than prototype ui, game rooms with join codes, custom game settings, bot players, user profiles, deep linking, app icon, game assets & even a landing page for both fully compiled apps for iOS & Android, ready to be shipped to friends.
For a more general walk through the actual vibe coding process, you can keep reading:
Keep Reading