Distinguish no-data, no-match, and error states
Aliases: empty state taxonomy · zero results · permission empty state · loading versus empty
What it is
An evidence-backed empty-result state taxonomy distinguishes why a surface shows no items from what the system actually knows: a successful read of a genuinely empty source, existing data with no match for the current query or filters, a failed request that leaves content unknown, lack of viewing permission, or a request still loading without a conclusion. These states may all look blank, but they assert different facts, responsibilities, and next steps. Copy must not turn “unconfirmed” into “none.”
Why it happens
When rendering observes only an empty items array, network errors, permission filtering, incomplete requests, and a true zero collapse into one state. Reliable classification also needs request lifecycle, transport or domain result, authentication and entitlement, query criteria, an unfiltered count or other baseline where available, and data freshness. No data is a fact after a successful read; no match is a relation to a query; failure means the read did not complete; forbidden marks an access boundary without revealing whether an object exists; loading is nonterminal. Copy can state what is known, unknown, and actionable only after this evidence is fixed.
Studying it
Build a failure-injection matrix across source state, query, permission, and request lifecycle. Create a first-use empty collection, a cleared collection, zero match, timeout, offline state, partial failure, expired session, permission denial, slow response, and stale cache. Compare final copy, action, and data, and test judgments about whether data exists, the system failed, or access is missing, along with first action and recovery. Logs should retain a reason code, evidence source, and transition rather than only “empty shown.” Do not test permission states with real sensitive objects when the research surface could itself disclose existence.
Where it stops holding
The system may know that the current page is empty without knowing the whole collection is empty. Sharding, pagination, sync lag, and offline caches require a bounded scope and time. Permission copy should state what the current role cannot view or do without implying a protected resource exists. Partial success should preserve available content and identify the unresolved range instead of turning the whole surface into all-empty or all-error. Error cause, responsibility, and recovery wording belongs to error-copy design; loading progress and animation belong to feedback components. The taxonomy's role is to stop either state being mislabeled as empty.
Applying it
- Implement mutually exclusive
loading,loaded_empty,no_match,forbidden,failed,partial, andloaded_nonemptystates with evidence and allowed transitions. Never classify fromitems.length === 0alone. - Give states distinct messages and reason codes. Bound a true empty claim, echo query criteria for no match, admit inability to confirm after failure, avoid existence leakage under permission denial, and do not announce zero results while loading.
- Version the state contract across client, API, cache, search, and permission services. Resolve unknown or conflicting signals to “cannot confirm yet” with safe recovery rather than guessing no data.
- Regress slow network, offline, empty source, filtering, pagination, expired identity, and partial response end to end. Visible copy, screen-reader updates, actions, and telemetry should all report one classification.