The icons that only existed on my Mac
The screenshot came in from the phone: the row of buttons along the bottom of the screen, six of them, and five were empty white circles. The sixth had a tick in it.
Every screenshot taken on the development machine showed all six correctly. A seedling, a hammer, a crate, an anchor, an envelope, a tick. They had looked right for weeks.
The sixth button is the whole answer, and it took embarrassingly long to see it.
Those icons were not icons. They were emoji, typed directly into the button labels. The tick survived because โ is an ordinary text character that lives in ordinary fonts. ๐ฑ ๐ ๐ฆ โ โ are not.
macOS is quietly generous about this. Ask it to draw a character your font doesn't have and it goes and finds one that does โ in this case the system colour emoji font โ without telling you. iOS does not extend that courtesy to a game engine's bundled project font. It draws nothing, and nothing is exactly what we shipped.
What makes this a bad bug is not the fix, which took an afternoon. It's that the failure was invisible. A missing icon left a button that looked deliberately blank. There was no error, no warning, no missing-asset placeholder โ nothing to grep for and nothing to see unless you were holding the phone.
So the icons are drawn now, from primitives, in about a hundred lines. A sprout is a stem and two leaves. A crate is an outlined box with a seam and a strap. They cannot silently depend on a font again, they inherit whatever colour the button is, and they stay sharp at any size.
And one more thing, which matters more than the icons: an icon we don't have a drawing for now renders as a circle with a line struck through it. Loud, ugly, obviously wrong.
A failure that looks like a blank button is a failure you ship. A failure that looks like a mistake is one you fix.
The item icons โ the crops, the goods, the salvage โ were never affected. Those are real generated art, fifty-two of them, loaded from files that either exist or don't. It was only the interface, and only the parts where someone had reached for a character instead of a picture because it was faster.
It usually is faster. That's the trap.