A Repository That Is Also a Backup
These repositories are private, and they carry a doctrine: each one is a self-contained spine for the work inside it. Wherever a checkout of one exists, the thing builds and runs. No registry account, no lockfile resolution against a service that may or may not exist in five years, no internal package server that has to be stood up before anybody can start.
Vendoring preserves that property exactly. A package destroys it in a specific, easy-to-underrate way: the checkout is no longer the code. It is the code minus its dependencies plus a promise that the dependencies can be fetched. That promise is usually kept. "Usually" is doing real work in that sentence, and for an archive with a horizon measured in years rather than sprints, it is the wrong bet.
The Diff Is a Feature
The second property is one people notice only after they have lived without it. When the shared layer changes, the consumer's history shows the change as code. Open the commit, read the diff, see exactly which lines of the shared client moved.
With a package, the same event appears in the consumer as a single line: a version number went from one value to another. Everything that actually happened lives in a different repository, behind a tag, reachable only if you go looking. For a routine upgrade that indirection is fine. For the moment when you are bisecting a behavior change and the only thing in the consumer's history is a number, it is the difference between five minutes and an afternoon.
The Precedent This Family Was Already Using
The model was not invented for the kit. The same family already distributes a shared set of instruction files to several machines the same way: a canonical source, a deploy step that copies with a checksum, and a check that detects any copy which has stopped matching. Same three parts, different content.
That mattered at decision time, because it meant the model was not a hypothesis. The failure modes were already known — a machine that was missed, a copy someone edited in place — and the mitigations were already in place. Choosing it for code was extending a working practice by one domain rather than importing a new one.