The Rule Written in the Same Breath as the Purpose
The shared repository's charter has two sentences, and the second one points the opposite way from the first. Plumbing gets one owner. Domain code never migrates into the kit.
The second sentence exists because the first one creates a gradient. Once a shared place exists, it is the cheapest place to put anything two apps need, and the cost of each individual deposit is invisible. The rule is the counterweight, and it has to be stated at birth — retrofitting it after the shared layer has learned three domains is not a rule, it is a rewrite.
The Apps Already Forbid It of Each Other
What makes the rule sharp here is that it was already load-bearing between the apps themselves. Each sibling's architecture document forbids copying the others' domain spines — one says outright that the journey-and-day axis must not be carried over unexamined, because a journal that inherits a trip container has silently acquired a beginning and an end, which is the exact thing an open timeline is defined by not having.
A shared repository is the backdoor around that. Nobody would copy a journey container into a health app; everybody would happily consume a shared "timeline container" module that happens to be a journey container with the nouns filed off. Same import, different route, and this time it arrives with the authority of the shared layer behind it.
What the Rule Costs, Honestly
Some duplication survives on purpose. Every app in this family has a composer and a record card. They look alike, they solve the same user problem, and they are domain-toned all the way down — what fields exist, what the placeholder says, what an attachment means. So they stay separate, and the family accepts three of them.
The invariant they share is enforced somewhere else entirely: each app's own architecture document requires that a composer offers attachments, a prompt macro, and a way to ask the assistant. That is a shared requirement with three implementations, and it is a completely legitimate answer — one that a purely code-level view of duplication cannot even express.