With every app on one ground (without the history), a promise could finally be kept: a bug caught once is caught everywhere, and fixed once for all of them.
the same cases, two more apps
Until today only Mosaic ran the shared regression cases, the ones every cube app must hold, born from bugs Selim met (caught everywhere). He wanted more: “i also want anlat and cubes application to also start running those regressions, as the mosaic is doing.”
Two new adapters taught the runner to play Anlat and Cubes. Anlat already had a stand-in backend for guests that follows the real backend’s rules, so the adapter borrowed it instead of inventing a fake world. Each app got a check on its pull requests, and the runner learned to let a case be red on one app without failing that app’s gate, so a known red can wait without blocking everything else.
The first run was honest: Anlat kept its place when stepping out but its holds were incomplete; Cubes opened every screen at its top; both landed in the wrong place when a hold lifted.
One red case runs on every app; the fix goes into the package once, and every app moves up.
one cause, two apps
Two of Anlat’s reds had a single cause in the shared package: the finger lifting from a hold clicked whatever the hold had just opened. It was fixed once, in the package as 0.16.0, and it turned Anlat and Cubes green together. Then view and sort became one shared piece for every app, and a level title with no cube on top learned to answer a hold too. Selim did not understand that last question the first time it was asked; asked again plainly (should holding the screen’s title open that screen’s view and sort?) he answered yes with one tap. It all shipped as 0.17.0.
Mosaic had been about to build the same view and sort store at the same minute as the Anlat thread. One message each way split it: Anlat’s thread put the shared piece into the package, Mosaic’s kept a small copy of the same shape until the release. Swapping the copy for the package afterwards took thirteen minutes, from dev to master, every Mosaic case green, and the phone kept the choices made before.
empty answers a hold
In the same round “not known yet”, the group of things nobody has placed yet, learned to answer a hold in every app: view, sort, tell us. Selim’s reason was the whole day’s principle: “not known yet should also hold … we want these features to be available in all applications … a fix is going to work for all of them.” Empty is a place you can look at and arrange, not a hole.
the exception that wasn’t needed
Cubes had one difference left: it opened every screen at its top on purpose, against a shared rule that you come back where you were. The thread did not fix it quietly; it asked. Selim’s answer was short: “I don’t have a reason to break the consistency across cubes application … if it will come out again … we will know why that exception is there.”
Twice a red case looked like an app bug and was the test, or the shared piece. A runner pressed a title while the screen was still growing in; a hold left over in one spec silently ate a click in another. And a jump that a handover blamed on the library guessing turned out, with a small probe, to be a loading page flashing for 40 milliseconds: that fix belonged in Cubes, not in the package. Looking at what a check actually saw, before fixing, found every one of them.