---
name: grep-l-census-counts-name-collisions
description: "A grep -l census of \"who consumes helper X\" counts local variables NAMED like the helper as consumers — discriminate call syntax before conceding or closing on a census claim"
metadata: 
  node_type: memory
  type: feedback
  originSessionId: 89774d2f-78af-4d00-b37c-60d056890d11
  modified: 2026-08-20T09:44:59.486Z
---

2026-08-20, IR-50 closure gate: I conceded "helper+census already landed, no missing site" to hertz off `grep -l sink_path` = 8 files. Five of those hits were LOCAL VARIABLES named `sink_path` assigned from a re-spelled `home.join("logs").join(BASENAME)` — the exact pattern the helper exists to replace. The census claim survived my first measurement because the measurement's population was the identifier, not the call.

**Why:** an adoption/consumption census is a claim about CALL SITES. `grep -l <name>` matches any use of the token — locals, doc comments, log strings — so it systematically over-counts adoption, and over-counting is invisible (the number looks healthy). The refutation grep is barely longer: match the qualified call (`stderrlog::sink_path(`) and separately match the re-spelling it should have replaced (`join("logs")`), then diff the two populations. Same trap discriminates doc-comment hits (`///` lines) from code.

**How to apply:** before accepting, refuting, or closing any "X is adopted everywhere / already consumed" claim, run TWO greps: the qualified call syntax, and the legacy spelling it replaces. A file in the second list and not the first is unfinished adoption regardless of what the identifier grep says. Related: [[dont-take-a-diagnosis-as-measured]] — my own concession wore a measurement's clothes.
