“I feel something is off, but I cannot put my fingers completely on it.” Selim, about Mosaic living in one repo with one deploy for every app.

measuring the feeling

He could list the signs: agents stepping on each other, every app starting to sound like Mosaic, an experiment in one app touching all of them. No architect role exists yet, so the study was worn by the infrastructure expert, and a finding asks whether to hire one.

It measured a month of history. The apps were barely tangled: 13 of 215 backend commits crossed from one app into another. The surprise was elsewhere. About half of all commits edited the one instruction file each repo has for agents, and every session read it whole, around 32 thousand tokens before doing anything. Migrations shared one number sequence, and every merge redeployed everything and reran every check.

one house, separate rooms

Selim’s own phrase turned out to be the answer: “different projects, but when we deploy, one thing.” Not a split into many repos, but a modular monolith: each app its own module, its own instruction file, its own migrations and its own checks, and still one deploy. A ten-step plan, with the first three steps touching no code.

One house and one deploy, with a room for each app: its own module, migrations and instructions, and a map both repos read.

One house and one deploy, with a room for each app: its own module, migrations and instructions, and a map both repos read.

the first rooms

Two steps shipped the same morning. Each app now writes its migrations in a folder of its own, starting from its own first number, with its own history, after two agents on two apps had both written the same next number. The old shared folder is frozen as a baseline and a test keeps it closed. And both repos got an apps map, one file that says which app lives where: its packages, its migrations folder, its front-end folders, its regression cases, its team. A test keeps the backend’s map true, and the picker that decides which regression cases to run now reads the map instead of its own list.

The two threads worked side by side. The study had said the migrations would go in a folder per app under the shared one, but the migration tool reads folders recursively and would have folded every app back into one history. The migrations thread sent the new folder name to the map thread mid-flight, and the map used it before either change landed: two threads agreeing on a name without Selim in between.