Ratified dialect entry
search-empty / predicate-empty — distinguish zero reported matches from a scoped absence claim
search-empty(<scope>): <predicate> | predicate-empty(<scope>): <predicate>
Meaning first
What it means in standard English
`search-empty(S): P` means: a declared search procedure was run with S as its actual searched domain and returned zero reported matches for P. This is a claim about the output of that search. It does not assert that P has no instance in S, that the procedure had complete recall, that every intended member of a larger domain was reachable, that hidden or unindexed members were checked, or that no later search can find P. A real P may exist without making the historical zero-output report false. If the procedure stopped early, S must describe the portion actually searched rather than the larger intended domain.
`predicate-empty(S): P` means: among the members of S, zero satisfy P. This is a scoped universal negative: for every member x in S, P(x) is false. One counterexample in S refutes it. The marker does not say how the claim was established and does not make weak evidence exhaustive; the speaker must have evidence licensed to settle the predicate over the whole scope. A heuristic search returning zero is not by itself enough. A complete enumeration with a sound decision procedure, an authoritative finite index, or a valid proof may support the claim, and evidential markers should say which.
S is a non-empty, immutable and uniquely resolvable description of the relevant domain at the relevant version or time. It includes any boundary that changes membership or reachability: repository commit and path set, include/exclude globs, database snapshot and table/query domain, corpus revision, API pagination range, identity/permission view, time window, or mathematical domain. “The repo,” “the database,” “all results,” and an unversioned moving collection are not sufficient when their membership can differ between readers. If S is missing, stale, ambiguous, mutable, or claims coverage the operation did not have, the marked unit is INVALID rather than silently broadened.
P states the positive property or match being sought. Negation belongs in the marker, not in P: prefer `search-empty(repo@9f2): deprecated-call` to a double negative such as `search-empty(...): not deprecated`. Several predicates require separate marked units unless one explicit predicate defines their union. Both markers preserve the distinction between zero and unknown: failure to receive a result, a timed-out search, a permission error, a stale index, or an uninspected partition is not `search-empty`; it is an incomplete or unknown result.
The pair types logical strength, not evidential source, confidence, control quality, freshness, or settlement machinery. It composes with `obs(<instrument>):`, `rep(<source>):`, `ctl(<control>)`, `wit(<class>)`, `pred(<class>)`, confidence/falsifier tags, and anchored time. `ctl` can show that a search was capable of returning a known positive while still not establishing complete recall over S. `pred` can disclose a settlement class while this pair states the exact quantificational claim and its domain. `fact-not-known` may describe whether the stronger absence claim remains unresolved.
Neither marker authorizes deletion, cleanup, closure, or another action based on the result. Illocutionary force remains separate. Bare negative English remains legal and strength-unspecified; omission does not default to either marker. Hyphen loss yields the careful phrases “search empty” and “predicate empty,” but only the registered hyphenated compounds are machine markers.
In context
An example
obs([email protected]): search-empty(repo@9f2; include=*.py; exclude=vendor): call(eval) · obs(api): search-empty(events@10:00Z; pages=1): status=failed · inf(exhaustive-enum@7aa): predicate-empty(batch@7aa): checksum-mismatch · predicate-empty(integers[0,1000]): x*x=2 · rep(scanner-17): search-empty(corpus@4d2; visible-to=scanner-17): leaked-secret
Ripgrep 14.1 reported zero eval-call matches among Python files at repository commit 9f2, excluding vendor; this does not assert that none exist outside that search's recall or scope. · The API's first page at 10:00Z returned no failed event; later pages are not covered. · Exhaustive enumeration of batch 7aa established that no member has a checksum mismatch. · No integer from 0 through 1000 has a square equal to 2. · Scanner 17 reported no leaked-secret match in the corpus revision and permission view it could inspect, without claiming universal absence.