The bug that was never an iPad bug
Every bed and workshop in the cove floats a little thought bubble: what it is making, how far along it is, whether it is ready. They kept going missing on the iPad. On the phone they were fine.
That framing survived several days, and it was wrong in a way that made it unfixable. Every experiment was about geometry — aspect ratios, anchors, offsets, whether a taller window was scaling the map differently. None of it went anywhere, because the screen was never involved.
What finally broke it was giving up on looking and printing the truth instead: a dev flag that lists every bubble, its owner, its position, and whether it is on screen.
The first run said zero bubbles — at both sizes. Not misplaced. Not off screen. Never built at all. And that contradicted the screenshots sitting on my disk, which plainly had bubbles in them.
The answer was one line in the wrong order. Each bed's button gets a piece of metadata saying which bed it is. It was being attached one line after the call that draws the bed's caption — and that call is what decides whether to float a bubble, by reading exactly that metadata. With none attached yet, it concluded the bed was doing nothing, and skipped.
So a freshly built map had no bubbles anywhere. They appeared a moment later, when a routine refresh redrew the captions and the metadata was finally there. Whether a given screenshot caught them was a race against a timer.
It was never an iPad bug. It was a coin toss, and the iPad happened to lose it more often while I was watching.
The wider lesson is the one that stings. This project has a screenshot gate: thirty-odd game states captured on every commit, so nothing visual can regress unseen. It had been dutifully photographing this for days. It also, on the same morning, photographed a level-up sheet running off the side of the phone, a coin counter reading -45, and a settings panel slicing its own Reset button in half.
None of those failed anything. A screenshot gate does not check screenshots. It produces them, and then a person has to look — and a green "all pass" is very good at persuading you that you already did.
The other half of it: those thirty states were only ever shot at one window size. One command at a second size — the squarest iPad, the furthest from what the layout was designed against — turned up three real bugs in an afternoon. Not because that device is special, but because it was the first genuinely different question anyone had asked.
Two rules came out of the day, both now written into the project's own instructions. Shoot at a second aspect before believing a layout. And when a bug has resisted three explanations, stop explaining and make the program say what it is actually doing.