I Was Not Seeing Things

Post 4 of 6 about building Rainbow Tile Slide, a puzzle game I shipped to the App Store in September. I'm a product manager, not an engineer. Claude wrote every line of the code. I made the decisions, played it on real hardware, and filed the bugs.

I told Claude the numbers on my app icon were crooked. It built a picture proving they weren't, and explained that I was seeing things.

I was not seeing things.

The icon

My app icon has four little tiles on it, each one turned at a slightly different angle, each with a number printed on it. I asked for those numbers to be bigger and easier to read, which sounded like a five-minute job and was not. The first version came back with each number tilted to match its own tile. I looked at it and said two of them read as printed on diagonally. That was a bad description of what was bothering me.

Claude took me at my word and made all four numbers stand straight up, the way they do in the real game. Which was worse. I did want them tilted. What had been bothering me was that the four numbers were different sizes from each other, and the two that looked most wrong happened to sit on the two most-tilted tiles, so I blamed the tilt.

I filed a bad bug report and got a good fix for the wrong bug. That one is on me.

The next rebuild sized all four numbers the same and put the tilt back. It shipped. It looked right, until I saw it on my Home Screen and two of the four numbers still weren't sitting on their tiles. The same two.

So I took a photo of my own phone and drew lines on it by hand to show exactly what I meant.

Claude generated its own picture of the icon instead, with the tiles and their numbers laid out side by side, and told me the alignment was correct. Then it suggested that what I was seeing came from the tiles sitting at different angles, and wasn't there.

Nothing had been measured. It had drawn a picture of what it expected to see, looked at its own picture, and agreed with itself. So I asked it to stop making pictures and measure the actual pixel positions. The numbers were off. I was right.

Why they were wrong

To know how much to rotate a number, you have to know how much its tile is rotated. The way that got measured was to find the tile's corner and work the angle out from there. Which is a fine method, right up until the corners are rounded, because then the outermost pixel isn't where the two edges would meet. It sits out on the curve, by a different amount on every tile.

Two of my four tiles were rotated at angles where that error was small enough not to show. The other two weren't.

The fix was a measurement method that doesn't need to find an exact corner at all. Checked against every tile before it shipped, then checked again by me, on my phone, where I had noticed it in the first place.

Legal Stuff

My privacy policy has a section on what happens to analytics data that leaves the country. It was built from my analytics vendor's material, and it said those transfers were governed by something called Standard Contractual Clauses. While I was cleaning up the rest of the policy, I left that one section alone until I could check it.

I went back to the vendor first. Their support chat sent me a link to a dashboard and nothing else. Then I asked Gemini, which I'd been using alongside Claude for the paperwork side of this project. Gemini came back with a lot of specifics. The vendor's registered legal entity and the country it's registered in. A contact address. The exact method they use to anonymize a visitor before anything gets stored, down to the formula. And a confirmation that Standard Contractual Clauses covered the transfer.

I checked all of it against the vendor's own published privacy policy and terms. The company registration was real and I could look it up myself. The anonymization method matched their documentation word for word. The legal relationship it described was the right one.

The Standard Contractual Clauses were not there. Not on their privacy page, not in their terms, nowhere on their site. There was one more claim, about which cloud provider they use, that I also couldn't find anywhere. I took that back to Gemini and it withdrew both claims. Then it explained the difference it had run together, which is that the kind of agreement my vendor actually has in place is not the same thing as the safeguard I'd been told covered the transfer.

So I rewrote the section around what I could show: what the vendor does to the data before storing it, who they are, and where it goes. The Standard Contractual Clauses stayed in the policy, but not as a statement about my vendor. They're written as something I will put in place if my analytics ever need it.

What I'd take from both

Gemini's answer would have been easy to catch if it had been wrong the whole way through. It wasn't. Three of the things it told me checked out precisely. Two did not, and one of those two was the thing I had asked about in the first place.

I could see the icon problem. The tile was sitting on my Home Screen and nothing anybody told me was going to make it look straight. What it took was a measurement instead of another picture.

With the privacy policy there was nothing to see. A sentence about international data transfers reads the same whether it's true or not, and the three accurate sentences around it are what make it look settled.

I'm not an engineer and I'm not a lawyer. I'm the one whose name is on it.

Rainbow Tile Slide is free on the App Store, with no ads: https://apps.apple.com/us/app/rainbow-tile-slide/id6805617800

This is post 4 of 6 about building it. The rest of the series is here.