Our kite game passed every automated check. It wasn't fun.
On the third of August I played the flagship game of my own catalogue for the fifth time in one day and wrote the verdict into the project log:
"I am not having fun in this game. This is boring. Can't put my finger on why, but I personally will never play this game."
At that moment the game had seventy-two automated checks, all green. A bot had played it thousands of times. It was survivable, loseable, fair, legible, correctly priced, and rendered cleanly at every screen size we test. Every one of those claims was measured, not assumed. It was also a game its own maker would not play. Both things were true at once, and the diagnosis for how generalises to any game — made with AI or without.
Context for new readers: PilPili is a browser-game arcade of small games, built by one person directing AI for about two hours a day. I don't write the code. I play, I judge, and I answer questions. The game in question is a kite-fighting game — the kind half of India grows up with. Two paper kites, glass-coated strings; cross them in the sky and saw until one drifts loose.
Five rounds of fixing the wrong thing
The first build had real defects, and I found them the way any playtester does. Trees grew downward out of the sky. The string had no slack — a kite line behaving like a steel rod. The child on the ground slid along instead of walking. And, most seriously, the fight at the centre of the game could not be won: when the test harness was finally made to play the game rather than test it in pieces, it measured that every string crossing lasted 0.88 seconds, that the attack meter needed 1.0 and peaked at 0.36, and that across one hundred ninety-four fights the number of cuts landed by anyone was zero.
Every defect was fixed, and every fix verified by measurement. Five rounds of feedback, all of it acted on, all of it real.
None of it was why the game was boring. The verdict above came after all five rounds. Fixing defects faster would not have changed it.
The diagnosis: a game with no decisions in it
The question finally changed from "what is broken" to "why is this boring," and the answer fell out of a table. Walk through every moment the game asks something of the player, and count the reasonable answers.
An obstacle arrives: be above it. One answer, visible on screen. A rival kite approaches — and this row is where the diagnosis landed: a banner announced, five full seconds early, whether the rival's string was stronger or weaker than yours, which told you exactly which of two gestures to make. One answer, delivered in advance, in writing. Your string upgrades: automatic, as score rose. The fight resolves: decided by arithmetic between your upgrade level and theirs, fixed before the fight began.
Every moment had exactly one correct answer, and the game announced it before you had to act. Nothing was ever at stake in a choice, because there were no choices — only execution. A fight lasted 1.28 seconds and its outcome was settled before it started.
The detail worth pausing on: the banner that spoiled every fight had been added as a fix, answering a legitimate complaint from an earlier round — I couldn't tell which rival was stronger, so the game started telling me. Making the game legible and making it decision-free turned out to be the same edit. Legibility and decisions pull against each other, and for five rounds, legibility won every time.
No automated check catches this, and the reason is worth being precise about. Every check we run tests whether the game is correct: survivable, loseable, fair, readable, honest. None asks whether any moment has more than one reasonable answer. The suite was measuring whether the game worked. Nothing was measuring whether there was a game.
Pulling the answer out of a player who can't articulate it
A method note, because it worked and will be used again. I could not say why the game was boring — my actual words in the log were "I am not sure how to convey my thoughts." Open questions ("what would make it fun?") had already produced nothing.
Forced choices worked. Four questions, each offering three or four concrete directions with a one-line consequence attached. What is the one thrill this game must deliver — the one-on-one duel, a sky full of kites to hunt, the mastery of flight itself, or stakes and loot? What should decide a fight — hands in the moment, hidden information and nerve, position and angle, or an economy of upgrades? Are the obstacles the game, in the way, or weapons? What exactly is wrong with the art?
I answered all four instantly: the duel; position and angle; obstacles become weapons; and the art failed every way offered. Choosing between concrete options took no effort where articulating from scratch had been impossible. Ten minutes later, unprompted, I was writing the control scheme myself: let the thumb decide the angle and speed of the cut — you touch your kite and drag, and the speed and angle of your stroke across the rival's string is the attack. And the kite's head should always point where it is moving, the way a real fighter kite flies.
Those four answers plus that paragraph were the redesign. Everything after was implementation.
The rebuild, and what it broke on the way
The fight now works like this: when two strings tangle, both cutting meters fill, and each side's rate is its own kite's sawing. Stroke speed, times how squarely the stroke crosses the other string, times height — the higher kite's string bears down on the lower one's, which is true of real kite fighting — times only a modest edge for the better string. A parked kite saws almost nothing. The upgrade ladder climbs on fights won, not on survival. The spoiler banner did not have to be removed so much as it fell away: position decides the fight, and position is on the screen. Legibility and decision stopped being enemies the moment the answer became something you could see instead of something you had to be told.
The rebuild surfaced three structural traps, each caught by measurement within a day. A build log is for exactly this part.
The rival that optimises your objective stalemates. The first rival AI chased the air above the player's kite — height wins, so it wanted height. The player is faster, so both parties raced to the top of the screen and parked there, and with sawing driven by movement, two parked kites saw nothing. Measured result: fights timed out. The fix made the rival a swooping duelist that loops above and below you in readable arcs, so "who is higher" became a rhythm to time strokes against instead of a race with a ceiling.
A winning gesture and an escape gesture collided on one axis. Dragging right pays out line, and holding it fully out is how you refuse a fight — that is real kite flying too. But a winning stroke, swept up and over the rival, passed through the right side of the screen, and the game read it as fleeing the fight it was winning. The fix: passing through the zone does nothing; only holding the line out breaks the tangle. A stroke is a transit. An escape is a stay.
A reward the world hands out for free is not a reward. Rivals can crash into trees if you pin the fight low — the "obstacles become weapons" answer made real. At the first tuning of the rival's dodging, a bot that did nothing at all collected ten crash payouts a season, because the rival's swoop clipped trees on its own. Every loseability check still passed; they test whether doing nothing gets you killed, and it did. Nothing tested whether doing nothing got you paid. Now it does: the do-nothing policy must earn zero, and a crash only pays when the fight was deliberately held where the trees are.
The verdict, after
Same day, sixth session, the log reads:
"Much much better."
By the seventh session I had still not landed my first cut. No payoff yet, no new features since the morning — and the log reads:
"Most important for me — I retried because I wanted to."
From "I will personally never play this game" to retrying for its own sake, in one day, purely by relocating where the decisions live. That reversal is the cleanest evidence for the diagnosis I can offer.
What this means if you build with AI
The uncomfortable version of the lesson: AI made it cheaper than ever to build the boring version of a game, precisely because the boring version is correct. Everything measurable was right. A large volume of automated verification — and we run a lot of it — builds a convincing costume of quality around a game that has no reason to be played.