An AI can write a boss overnight. What it can't do is hold a controller. Every build of Kindlefall ended the same way: someone played it on a Mac, in Chrome, with an Xbox pad, and wrote down what felt wrong. Sometimes politely. The changelog quotes those notes more than once, and not always flatteringly for the game.
This post is those notes and what they turned into. Where the old build still exists in git, we checked it out and captured it the same way as the new one, so the "before" pictures below are the real thing.
"Looks awful": the HUD
Early on the AI gave the HUD an art pass: a real fire shader in the health medallion, 3D glass flasks, a glass-tube health bar. It was technically lovely. At 24 pixels it was mush. The first round of feedback swapped the fire for a beating ember heart (the fire looked the same as the spell charges) and re-lit the flasks. The next round is in the changelog as "looks awful", and the rethink admitted the real problem: it replaced the tiny 3D renders with painted icons in one aligned row of equal slots.
1 · Before the art pass
2 · Shader fire, 3D flasks
3 · The heart, still 3D
4 · Today: crisp icons in slotsAGENTS.md: tiny HUD elements should be crisp icons, not tiny 3D renders or noisy shaders.The bugs a headless browser can't see
The test bot runs headless. On a Mac, Chrome runs WebGL through Metal with fast math, and three times the playtest saw something the bot never could:
- A black box on every sword swing. A
pow(0.0, y)in the sword-trail shader returns NaN on Metal; one NaN pixel gets smeared by the bloom into a huge black rectangle. - Random black flashes near elites and shrines. Same family:
atan(0, 0)at the exact centre pixel of the rune-ring shader. - Whole frames going black. A different bug wearing the same clothes: adaptive resolution resized the canvas after rendering, which clears it, and the new 60 fps cap then presented the blank canvas.
The AI's summary of that day is still our favourite line in the docs: "a full-screen black frame is a present/clear problem, a black blob is a NaN." Every new shader now gets grepped for unguarded pow, atan, normalize and divides before it ships.
And one bug was a playtest bug in a different way: the notes kept reporting things as broken that were already fixed. Chrome was running cached modules. That's why the title screen shows a build stamp, and why a red banner appears if the code in the tab is older than the files on disk.
"Don't just throw you in": the opening
Runs used to start with you standing in a room. The note asked for an opening, and got a 3.8-second shot: fade in close on the knight, pull out, pan to where the enemies rise, pan back. Too fast, said the next note, so it became about nine seconds. Then it went silent: no music during the intro, just the ground rumbling as the room wakes and the dead rising with their own sounds, then the score creeping in over seven seconds once you have control. Then the title screen got the same treatment: pressing Play fades to black first, and a bug where the music blipped on for a moment was traced to a fade reading a gain value that lags scheduled changes. That clip at the top of part 1 is the result.
The lava, four times
This is our favourite before-and-after, because it's four befores. Floor IV needed lava, and lava is hard.
- Build .12: flat lava with glowing cracks. The playtest note, verbatim from the changelog: the first room's lava "looks like ass".
- Build .13: lower, with cooled crust, a hot lip against the banks, heat glow on the stone and broken basalt shelves along every bank. "Still looked bad."
- Build .15: rebuilt as a sunken channel with rock walls lit from below and a molten surface that actually flows along the channel, crust rafts drifting near the banks. You sink into it if you stand in it.
- Build .16: 3D. The surface is displaced, real crust slabs drift down each channel on the current as one instanced mesh, and bubble domes swell and burst.
The same evening the playtest met the Cinderlings, molten slimes that split when you hit them, and the note was "more of that". That one line is why Floor IV kept growing procedural creatures: next came a six-legged crawler on procedural IK, and finally the Forge Heart itself.
First play of the overnight build
The morning after the overnight sprint, a person played floors that had only ever been played by a bot. Build .19 is the list of what broke:
- A stuck door on Floor I. If you took a side trip into a secret room and then took the shrine's boon, the shrine opened the side room's doors instead of its own. A shrine now remembers its room.
- An arch through a wall. Secret links got a doorway arch that clipped through the cracked wall hiding them.
- Less borrowed Dark Souls copy. The game now has its own words: kill banners say EXTINGUISHED and VANQUISHED, and the death screen says DEATH.
Then build .20, two things you only see with your own eyes. A click during the loading screen started a run (now the game waits in a "preparing" state and throws away anything pressed). And the floor flickered.
Z-fighting
The tops of the floor tiles sat at exactly y = 0.05, which was also the height of every telegraph, rune ring, glow and message glyph drawn on the floor. Two surfaces at the same depth fight over which one is in front, and as the camera moved, they shimmered. The fix is almost funny for how small it is: floor tiles moved 0.06 down, and additive effects got a polygon offset. Floor VI's moving tiles followed, and two builds later Floor VII's flat overlays needed the same fix.
Second playtest: earned, not mashed
Build .22 is where the game's combat got its spine. The playtest found you could mash your way through fights with ripostes: the "visceral strike" mark (stun an enemy, and your next hit is an execution) was appearing after ordinary hit-staggers, and Ember Parry fired if you just hammered the button.
Now marks only appear on real openings: a parry, a guard break, a wall stun, a posture break. One execution per enemy per six seconds. Ember Parry ignores presses within half a second of the last one, the window is 0.18 seconds (0.12 against bosses), and a miss locks you out for a second. "POSTURE BROKEN" got its own banner.
The ending
The overnight build ended with an epilogue, then a credits roll naming the guardians you'd felled, then a restart. It didn't feel like a real ending. Now it's the epilogue, which remembers your run (your hero, whether Vesper was your ally or your rival, Ser Cendric's farewell, your deaths and vows), then the word KINDLEFALL alone on the screen (since Sprint #2 with a short recap of your descent beneath it), then the main menu, with New Game+ waiting under Continue. No credits roll, no restart button. It ends.
The waves
The same build sent the Tide Gallery back to the Floor V team. The orchestrator had already bounced the waves once because the screenshot didn't match the report; the playtest note was that they needed to look way better. They came back as real breakers.
Third playtest: quiet, and a Pyromancer who doesn't swing her staff
Build .23 was mostly about calm. The title screen used to play the world's sounds behind the menu; now the world is silent there and the score plays softly. A click anywhere used to start a run; now only Enter, A, or the chosen hero's card does. Restart asks "Really restart this run?", with No selected by default.
And the Pyromancer. She was built overnight as a mage with a staff combo. The note: "swinging the staff is kind of dumb". So her attack became three magic arrows and then a fireball that bursts, auto-aimed out to twelve units and homing slightly, tuned to about 23 damage per second single-target against roughly 30 for the melee heroes, plus the embers it feeds back.
Then the note said she was "squishy". She got a Frost Wave on its own button: an ice cone that shoves everything back, freezes it briefly and shatters enemy projectiles, no embers needed, seven-second cooldown. The next round turned it into a frozen breaker that rises, stands as a wall for about a second and a half, then cracks into chunks, and turned the Meteor into a real molten boulder that tumbles in from the side, lands half-buried and throws out cooling debris. With, per the changelog, "no white flash".
The small notes
Not every note is a rework. Some of our favourite changes are one line each:
- Heart pieces that a message calls hidden are now actually hidden, under crates. Pip, the lost child ghost, hides somewhere different on every floor.
- No hint message in front of secret walls. Keep the mystery.
- The Great Forge's trip-hammers hid the whole hall, so they're faint ghosts while raised and only solid while winding up and falling.
- The long vocal roar is reserved for bosses. The playtest loves it, and the brute's boss-like "ahh" was replaced with its own bark and snort.
- Floor II's ambience had a crackle that sounded like static. It was 40 high-passed clicks a second; now it's a sparse, low-passed pop.
- Glare. Three separate notes about white flashes and bloom before every brief started including a brightness rule. It's now the first thing in the Sprint #2 brief: "no big white flashes."