MILESTONEPIPELINEFOUNDER
Same Fight, Different Layer
Three days quiet. Tokens ran out Saturday night. Four days to reset, nothing to spend, the kind of stretch that used to feel like a cage and now just feels like the week breathing out.
I sold a few things. Bought a used Mac Air M1.
Not a flex. A tool. The thing I've been trying to work around for two months finally sitting on my desk.
Here's what the old loop looked like: perfect everything in the Unity editor, stack up a pile of changes worth the drive, get in the car, commandeer my brother's MacBook, build through Xcode, pray it holds on the phone, drive home. Three times I did that. Each drive costs half a day. That math shaped every decision — "is this bug worth the drive" started quietly editing which bugs I chased.
New loop: find the bug on my phone. Fix it. Push a new build. Test it on my phone. No car. No borrowing. No batching up a week's worth of hopes into one trip.
The difference in iteration speed isn't even the point. The point is what the old loop was hiding.
I've been building the game in an editor that lies. Not maliciously — Unity's editor is an approximation, and 95% of the time the approximation holds. The other 5% is where closed beta lives. Text that renders at one size in the editor and a different size on a 6.1" screen. Tap zones that feel right with a mouse and wrong with a thumb. Padding the editor treats as 20 pixels and iOS treats as 12. That 5% has been accumulating under my nose for 642 passes, and I couldn't see any of it without the drive.
Now I can. And I have.
Most of it isn't game-breaking. It's the stuff you don't ship. Rendering inconsistencies, layout drift, tap targets that don't quite line up with their visuals. The kind of thing a tester with any self-respect would screenshot and send me, and I'd read their message knowing I should have caught it myself.
So I'm pulling back April 30.
Closed beta moves to sometime in May. No hard date. That decision is not casual — post-025 had April 30 in writing, and I sat with that promise for a week. But a hard date forces you to ship what you have on that day, and what I have on that day is going to be 95% of a good experience and 5% of "the text doesn't fit in the box." Testers are doing me a favor by showing up. Handing them unfinished work is not how you respect that.
Confident it lands well before the end of May. The work that remains is the kind of work that gets faster once you have the new loop running — diagnose on device, fix on laptop, rebuild, verify. Minutes per cycle, not days.
---
And while the tokens were dry, the pipeline didn't actually stop. I had a weekly reset mid-week on Thursday that handed me about 79 more passes before Saturday's flatline. 79 of them landed in a 3-day window. Most of them converged on four surfaces.
The Achievements popup ate about 23 passes on its own. Eight of those were me chasing symptoms — row heights, colors, opacity curves, sprite paths — all the cosmetic layers, none of them load-bearing. Pass 699 finally caught it: the rows weren't rendering at all in certain states because a RectMask2D was clipping the viewport and a TutorialOverlay was sitting on the wrong sorting order. Not a polish problem. A layering problem. Fifteen passes of me patching the drywall while the joist was cracked.
Pass 721 did it again. Three more root-causes, same popup, different layer. A color mapping that fell through because the switch statement never matched the data. A filter that returned true for every "always" unlock condition and leaked five placeholder secret rows onto the screen. An icon path that didn't exist in Resources, falling back through three tiers of defaults to land on a near-black square. Three data-layer fixes, one scroll-feel fix, one diagnostic probe. Different layer from all 8 prior attempts.
Same popup. Same fight. Different layer every time.
The pattern isn't new — the entire 642-pass history has this shape. But you can only see it cleanly when you're out of tokens and nothing's moving and the pass log just sits there waiting for you to read it.
22 more passes on the Training screen — drill card titles truncating, session-confirm popup titles drifting upward in their band, drill-card scroll rhythm off by two pixels. 6 passes on the Feedback and Bug Report popups — email-field overlap, panel tint, subtitle fonts. 5 passes on the Hub — lock overlays rendering at 32 pixels while the unlocked icon they replace is 140, so toggling a feature lock was a visual earthquake.
None of this is the kind of work you write home about. All of it is the kind of work that decides whether a beta tester's first five minutes feel like "this works" or "this is janky."
---
The build is on TestFlight right now. Internal only — me testing against myself, which is exactly the visibility I needed to find the 5% the editor was hiding. [Public beta](/beta.html) is the next gate. When it's ready, I submit for public beta review and the invites go out.
Not April 30. Sometime in May.
This is the 35th devlog entry. The 36th won't have a date on it either. The one after that might.
The Mac on the desk. The phone in my hand. The fight is the same. I can just finally see it.