Session record, KG (9 lines incl. one soft-invalidate), the null-search feedback memory, and MEMORY.md. MEMORY.md: the afternoon Active Session is ADDED ALONGSIDE the morning's rather than promoting-and-demoting it. Two sessions ran today and both wrapped; the protocol is date-keyed and single-writer, which is PENDING-174, filed today. Neither record supersedes the other. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wn9mxsFjHJkzYjuDdrtxwp
32 lines
4.6 KiB
Markdown
32 lines
4.6 KiB
Markdown
---
|
|
name: feedback-a-null-search-is-evidence-about-the-query
|
|
description: "A search that returns nothing is evidence about the QUERY until you have shown the query could have found the thing — and acting on a handle (filename, regex, path) without inspecting the referent is the same error in the other direction. Four instances across two sessions on 2026-08-31."
|
|
metadata:
|
|
node_type: memory
|
|
type: feedback
|
|
---
|
|
|
|
**A search that finds nothing is a fact about the query, not about the world** — until the query has been shown capable of finding the thing. And its mirror: **acting on a handle without inspecting what the handle points at** — a filename, a path, a regex shape, a commit message — is the same failure running the other way. Both substitute a surface form for the thing itself.
|
|
|
|
**Four instances, one day (2026-08-31), two sessions, three substrates.**
|
|
|
|
1. **A regex matched the *shape* of damage across natural language.** The parallel session's conversion-damage counts returned **126,098** "split diacritics" (they were the French preposition *à*) and **788** "dropped ligatures" (they were the words *at*, *full*, *species*). True count: **8.** Two orders of magnitude, twice. Logged by that session in `chamber-library/_curation/tool-evolution-log.md`.
|
|
2. **A glob matched a literal space.** `find -iname '*early recordings*'` against `Early_recordings_and_musical_style.pdf`. On that null result I told the steward he did not own Robert Philip's `Early Recordings and Musical Style`. He owned it. It was in the library the whole time.
|
|
3. **A name search could not reach the thing at all.** Joachim & Moser's `Violinschule` sat in the working folder under `IMSLP29616/17/21-PMLP66450` — the *Requiem's* plate number. No search on title or author could find it; only reading the PDFs' internal titles did. I had reported it missing.
|
|
4. **`git add PENDING.md` staged a shared file by name.** No `git diff --cached` first. It annexed a second session's uncommitted `PENDING-176`/`-177` into commit `860c3df` under this session's trailers — content unharmed, attribution wrong, and git will report it that way permanently. Disclosed rather than rewritten, in `7578f5a`.
|
|
|
|
**Why:** every one of these felt like *looking*. None of them was. A query is a hypothesis about the form a thing takes, and a null result confirms only that the hypothesis was wrong about the form — which is exactly the information a null result cannot distinguish from absence. The cost is asymmetric and quiet: a false positive gets checked because it produces something to check, while a false negative produces silence, and silence is indistinguishable from a clean result. Instances 2 and 3 were caught **only because the steward pointed at the file**; nothing in the apparatus would have surfaced them.
|
|
|
|
⚠ **This is the non-motivated sibling of Symmetria §3's flag** — *"a search query shaped by what the session wants to find rather than by what it needs to find."* That one is about desire bending the query. This one needs no desire: an honest wrong guess at a surface form produces the identical silence. Do not let the §3 flag's framing ("was I motivated?") certify a query that was merely wrong.
|
|
|
|
⚠ **Two sessions, both executor.** This says nothing about jurist/executor independence under Constraint 6 — the same party in formation missing the same way is expected, not evidence. What it does establish is a **rule of three for the executor**, on one day, unprompted by any of the three catches.
|
|
|
|
**How to apply:**
|
|
- **Before reporting an absence, prove the instrument on a known positive.** Search for something you *know* is there, in the same corpus, with the same query form. If the control does not come back, the null tells you nothing.
|
|
- **Normalise before matching** — underscores, hyphens, case, ligatures, curly vs straight quotes — or match on content rather than name. Filenames are the least reliable surface a thing has.
|
|
- **Never report "you do not have X" from a name search.** Report "no filename match for X", which is what was actually established.
|
|
- **Before `git add <shared file>`, read `git diff --cached`.** The register is one file and staging is a whole-file act; anything else living in it comes along silently.
|
|
- **When a count is startling, read the matches before believing it.** Two orders of magnitude is a query defect until proven otherwise.
|
|
|
|
Related: [[feedback-census-by-mechanism-not-proxy]] (the instrument must bear the generalization), [[feedback-checkable-claim-surfaces-bugs]], [[feedback-grounding-pass-finds-errors-not-support]] (search the register for the CONCLUSION, not just the citations).
|