Your product is one thing to the people who use it. Internally it is a web app, a backend API, a mobile client, a background worker, and some infrastructure — five repositories, five histories, five sets of owners. Nobody set out to split the product into pieces nobody reads together. It happened one reasonable decision at a time.
The problem shows up the moment someone asks a whole-product question. Where does a followed store get stored, and which services notice when it changes? The answer lives in four repositories, and there is no document, dashboard, or person that holds all four at once.
This is the structural reason the gap never closes on its own. Your issue tracker scopes to a repository. Your code search scopes to a repository. Your CI, your review, your ownership file — all of them draw their boundary at the same place, the repository edge. The tools are not wrong; they were built for the unit teams actually commit to.
But the product is not a repository. It is the seam between them: an event the backend emits and the worker consumes, a field the API renames and the mobile client still expects, a feature that is half-built in one repo and fully wired in another. None of those live inside a single repository, so none of your per-repo tools can see them. The knowledge that spans repositories lives only in the heads of the few engineers who have worked across all of them — and it leaves when they do.
Take a concrete one. The backend renames store_id to merchant_id in a pull request that, from
inside the backend repository, looks complete and correct — its own tests pass, its own reviewers
approve. But the mobile client still sends store_id, and the worker still keys its notification
lookup on the old name. Nothing in the backend's repository knows those two consumers exist. The
break is real, it spans three repositories, and not a single per-repo tool is positioned to catch
it. It surfaces in production, or in an incident channel, or in the head of the one engineer who
remembers that the worker reads that field.
So the whole-product view gets rebuilt by hand, every time it is needed. Someone opens each repository, reads enough to reconstruct how the pieces connect, and holds the result just long enough to answer the question in front of them. The next question starts from zero, because the reconstruction was never written down anywhere the tools could keep it current.
The cost is not one big failure; it is a tax on every cross-repo decision.
A feature request arrives and estimation stalls, because no one can enumerate the services it touches without a day of spelunking. A spec ships describing three of the four repositories involved, and the fourth surfaces as a surprise in code review. A product manager answers a stakeholder confidently and is quietly wrong, because the part of the system they could not read is exactly the part that mattered. Each of these is small. Together they are why cross-repo work always feels slower than it should.
WeaveSpec is built on the bet that the missing artifact — one product view, derived from the many repositories, kept current as they change — is worth having on its own. Connect the repositories that make up a product, and the seams between them stop being the thing only three people understand.
A cross-repo spec is not read the same way twice. The product manager, the tech lead, the developer and QA each need a different slice of it — from the same source of truth.
Connecting your repositories to any tool is a real decision. The questions worth asking are not about trust — they are about what gets stored, what can leave, and what keeps tenants apart.
A coding agent is only as good as the spec you hand it. Across several repositories, the missing input is not more code — it is a clear, source-anchored description of the work.
A tool that reads your repositories and writes documents is easy to describe and easy to mistrust. The refusals are the part worth reading first.