When a search reports zero hits, it’s easy to read that as “this doesn’t exist.”
All it really says is: in the scope I looked at this time, written this way, I didn’t find it.
Three ways to get a quiet zero
The tool skipped some files. The built-in search in version control skips files it decides are binary by default, and it may decide that from the first few bytes. A log file with one record per line is easily mistaken for binary and skipped entirely, with no notice.
The scope isn’t what you think. Ignore rules, path arguments, default search depth: any one of them can leave the search covering only half of what you meant.
You wrote it differently from the content. Chinese file names turn into percent-encoding inside links, and identifiers in config files may carry quotes or escape characters. A literal search only finds the literal.
We almost deleted the wrong thing
That zero was being used as evidence that nothing referenced the file, so it could be deleted.
In fact a log file did reference it. That log had simply been skipped as binary. If we had deleted the file based on the zero, we would have removed something still in use, and it would have been a long time before anyone noticed.
What we do now
When a search comes back with zero, we treat it as a signal to look again, not as a conclusion.
To say something doesn’t exist, at least two methods that work on different principles both have to come up empty. One matches the literal text. The other comes at it from another angle, for example dumping the whole file and filtering it, which goes around the judgment the tool made on its own.
To prove something exists, finding one is enough. To prove it doesn’t, you have to have looked in every corner.


