Every credential your team uses is held in a secret store, so where do copies of those values still come to rest outside it?
answer
- the store is not the estate
- count the humans who handled it
- history keeps the old revision
- shell history and terminal scrollback
- chat, tickets, runbooks, laptops
basics
~20 sCopies rest wherever a person once moved the value by hand: a configuration repository and its history, a chat thread, a ticket attachment, a runbook page, a laptop's shell history and terminal scrollback, and private notes.
solid answer
~40 sThe store holds the **value of record**, not the only copy. Every time a human moves a credential by hand a copy is made, and the store never learns of it. The usual resting places are a configuration repository and its history, a chat thread where someone pasted the value so a colleague could get unblocked, an attachment on the ticket that requested it, a runbook page that inlined it so the 3am step was copy-pasteable, a laptop's shell history file and terminal scrollback, and someone's personal notes. Each one is a holder, and none of them expires. That is what `sprawl` names: a population of copies whose size nobody can state, which is why the first deliverable of a secrets programme is an inventory rather than a store.
go deeper
Be able to name the resting places out loud: configuration repository and its history, chat threads, ticket attachments, runbook pages, shell history, terminal scrollback, personal notes. That list is the whole first-screen answer.
Explain why the count is unknowable rather than merely unknown: copies are made by people, copying is not an event against the store, and any copy can be copied again by someone who never touched the store.
Show that adopting a store changes where values are fetched and nothing about copies already at rest, and connect that to why an inventory, not a store rollout, is the first deliverable in a real estate.
Frame the trade-off between chasing copies and shortening the value's life, and be honest that the second scales while the first does not, because the population of copies has no upper bound you can establish.
## The value of record is not the only copy A secret store gives a credential a **value of record**: one place the estate agrees is authoritative, with access rules and a record of who asked for it. That is a real improvement over a value living in a settings file. What it does not do is make the store the only place the value exists. Every copy outside the store was made by a person doing ordinary, well-intentioned work: getting a colleague unblocked, reproducing a failure locally, writing down a recovery step so the next person is not stuck at 3am. **Sprawl** is the name for the resulting population of copies. Its defining property is asymmetric: the store can tell you exactly what it holds and which callers it answered, and nothing anywhere can tell you how many copies rest outside it. ## Where copies come to rest - **A configuration repository.** A settings file carrying the value in clear text. The current file is only half the problem — the repository's own history keeps every earlier revision, and every clone and fork carries that history with it. - **Shell history.** A value pasted onto a command line is written verbatim into that shell's history file, on that machine, under that person's account, and stays there until the file rolls over. - **Terminal scrollback.** The same value sits in the buffer of the window it was typed in, in any recorded screen share, and in the screenshot someone pasted into a thread to show the error. - **A chat thread.** Searchable, retained, exported, and readable by everyone added to the channel later — including people who were nowhere near the system when the value was pasted. - **A ticket attachment.** The request for a credential very often carries the credential, because the fastest way to answer the request was to attach it. - **A runbook page.** The value inlined into the recovery step, precisely because the page exists to be followed under pressure without thinking. - **A laptop.** A personal settings file so the service runs locally, a scratch file that was never deleted, an entry in a personal password manager. | Resting place | How the copy got there | Who can read it now | What it survives | |---|---|---|---| | Configuration repository | Committed so the service would start | Everyone with the repository, plus every clone | Cleaning the current file | | Shell history | Pasted onto a command line | Anyone with that account or that disk | Closing the terminal | | Chat thread | Sent to unblock a colleague | Everyone in the channel, now and later | The sender forgetting | | Ticket attachment | Attached to answer the request | Anyone who can read the ticket queue | Closing the ticket | | Runbook page | Inlined to make a step copy-pasteable | Everyone with the page | Staff turnover | ## Why nobody can count them Three properties make the count unknowable rather than merely unknown. 1. **Copies are made by people, not by systems.** A system that copies a value could log it. A person pasting into a thread produces no event anywhere the estate looks. 2. **Copying is not an action against the store.** The store recorded one read, months ago, by an identity that may no longer exist. Everything after that read happened where the store cannot see. 3. **Copying is transitive.** The moment one copy exists outside the store, that copy can be copied again by someone who never touched the store at all, and the chain has no terminator. So the honest statement about any long-lived shared credential is not *how many holders exist* but *how many holders you can name*, which is always fewer. ## What follows for the estate This is the reason the first deliverable of a secrets programme is an inventory, not a store. Putting a value into a store changes where it is fetched from; it does nothing to the copies already at rest, and every one of those copies keeps working until the system that accepts the credential stops accepting it. Deciding which values to replace and which holders to cut off is a decision you can only take over a list of values and their known copies — and if the list does not exist, the default outcome is that the value stays live forever, because nothing forces the question. ## Where this leaf stops Searching automatically for credential-shaped strings, why removing a committed line does not undo the exposure, tracing which workloads read a value before you replace it, and values escaping a build into its outputs are each separate subjects with their own mechanisms. This one is about where copies come to rest and why they cannot be counted.
- The value was only ever in the repository for two hours before someone removed it from the file. Does that shorten the list of resting places?Barely. The repository's history still carries the revision that contained it, every clone taken in or after that window carries the same history, and anything that watched the repository during those two hours kept its own copy. The window bounds who could have first seen it; it does not reduce the places a copy now rests.
- Does moving a credential into a secret store reduce the number of copies outside it?No. It changes where new readers fetch the value and gives you a record of those fetches, which is worth doing. Existing copies in threads, histories, tickets and repositories are untouched and keep working. Only replacing the value and withdrawing the old one makes those copies inert.
- Which of these resting places is hardest to enumerate later?The ones on individual machines — shell history files, scratch files and personal notes — because they sit under accounts and disks nobody else can see, and they leave the estate with the laptop. Shared surfaces like threads, tickets and repositories are at least searchable by someone who is looking.
A credential behaves like a key that anyone holding it can copy at a hardware shop. The safe still holds the original, and nobody in the building can tell you how many copies were cut on the way here.
saying these in an interview costs you the question
- Says the store holds the only copy of the value.
- Counts only the current file and ignores the repository's history.
- Treats a chat thread as ephemeral rather than retained and searchable.
- Assumes a value typed at a terminal leaves no trace on that machine.
- Believes a copy only counts once it is publicly exposed.
- Thinks adopting a store retroactively removes copies made earlier.