When a search tool reports zero hits, most people read it as “this doesn’t exist.”
All it actually says is: within the scope I looked at this time, written this way, I found nothing.
Three ways to get a quiet zero
① The tool skipped some files. Version control search skips files it decides are binary by default, and it may decide that from the first few bytes alone. A log made of data rows is easily taken for binary. It gets skipped entirely, and you’re never told.
② The scope isn’t the one you think. Ignore rules, path arguments, a default depth limit: any one of them can make your search cover only half of what you meant.
③ You spelled it differently than the content does. Chinese file names are percent-encoded inside links. An identifier in a config file may be quoted or escaped. A literal search finds literal text.
The mistake we nearly made
That zero was about to become our evidence that nothing referenced the file, so it was safe to delete.
In fact a log file did reference it, and the search had skipped that log as binary. If we’d followed the zero, we would have deleted something still in use, and nobody would have noticed for a long time.
The rule
Treat zero hits as a signal to check a second way, not as a conclusion.
To show that something doesn’t exist, you need at least two methods that work on different principles to both come up empty. One goes by literal text, the other by structure, for example dumping the file contents directly and filtering them, which sidesteps the tool’s own judgment about what to skip.
⚠️ Proving something exists takes one piece of evidence. Proving it doesn’t takes coverage.


