Essay

The screen missing on iOS

How one platform axis quietly answered two questions, and the small fix that split them.

Pebbles is a diary app on web, iOS and Android, with a back office that only runs in a browser. In the map, every admin screen carried an iOS status and an Android status, both empty. And an empty status reads as work not done yet. The delivery board counted them against Android; the acceptance matrix gave them two columns that would stay blank forever.

Nothing was broken. Every number was correct for the data it was given. The data said "this screen has no iOS status", and the only sentence the model could build from that was "missing on iOS". Two other projects hit the same wall, and so did Arkaik itself, an app plus a CLI plus an agent plugin. Three unrelated projects hitting one wall is not a bug, it is a shape problem.

The platform field was answering two questions at once: which app is this screen part of, and which runtime does that app ship on? While a project meant one product, the first question had one answer, so nobody asked it. A conflated dimension stays invisible while the second one has only one value. You find it when the second value arrives.

Two tempting fixes were set aside. Flattening everything into per-project "targets" (app-web, admin-web...) multiplies names and loses the clean "is this live on iOS?" axis the acceptance matrix stands on. Making products a node species, linked by edges, turns a configuration question into a graph traversal and hangs every screen off a pseudo-node that is not part of the product.

What shipped is the boring option. Products are project-level definitions with their own platform list, flows and screens name their product, and data models and endpoints derive theirs from who uses them. The key move is the smallest: a node's own platforms stay the source of truth, and the product only offers a menu to intersect with. No existing view had to be rewired.