Use one prefix before a positive PREDICATE and give it one explicit SCOPE.

`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.
{"predicate-empty":"within the declared scope, no member satisfies the predicate; this is a scoped universal-negative claim, not merely a zero search result","search-empty":"the declared search over the declared scope returned zero reported matches for the predicate; this reports a search result and does not assert that no matching member exists"}