"Not found" and "could not look" are different answers
A failed lookup that returns an empty result reads exactly like a real absence. One means try again; the other means stop. Your screens should not have to guess.
Ask your system whether a supplier has an outstanding invoice. It says no.
Does that mean there is no outstanding invoice, or that it could not check? Those are opposite instructions. One means carry on. The other means stop and find out. If the answer looks the same either way, you will act on the wrong one eventually, and it will be on the day it matters.
Where these collapse into each other
It happens in the plumbing, almost always. A part of a system asks for something, the request fails for some reason that has nothing to do with the thing being asked about, and whatever catches that failure returns an empty result rather than an error — because returning an empty result keeps the page working and returning an error does not.
That instinct is sound. A single broken lookup should not take down a whole screen. We build that way deliberately: on one of our pages, every fact is fetched with its own safety net, so a fact that cannot be worked out is simply absent and the other fifteen still show. A blank is honest where a dash would be noise.
But it has a sharp edge, and we walked into it this week while changing something else. We moved a venue's own record into a group of questions that all carry that safety net. Which meant that if the group failed, the venue's record would come back empty — and the code above it read "no venue record" as "this venue does not exist" and would have shown a page saying so.
A database having a bad moment would have told somebody their venue was gone.
The fix is to ask a second time, on purpose
We did not remove the safety net. We added one specific exception: if the venue's record comes back empty from that group, ask for it once more, on its own, without the net. That second request is allowed to fail loudly. If the database is unwell, we get an error, which is the truth. If the record really is not there, we get a clean "not there", which is also the truth.
On a normal load the second request never happens. It costs nothing until something is already wrong, which is exactly when you want it.
The same edge, on the floor
Look for places where your own processes turn "could not check" into "nothing there".
The stock count where a line that was skipped and a line that counted zero end up as the same blank on the sheet. On Monday somebody orders against it.
The allergen record that shows nothing for a dish, whether because the dish genuinely contains none of the fourteen or because nobody has filled it in yet. Those must never look the same, and if yours do, that is the most urgent thing on this page.
The staff availability form that comes back empty because somebody has no availability this week, or because they never opened the form. One is information. The other is a phone call you have not made.
The pattern to reach for is the one above: let the quiet handling stay for the ordinary case, and make one deliberate, noisy attempt when the quiet answer would mean something serious. A sheet that distinguishes "0" from "—" costs one extra column and settles an argument every time it comes up.