From 942080134b71606b27615f494e74de9c5958029f Mon Sep 17 00:00:00 2001 From: Dan Mordechay Date: Wed, 14 Oct 2026 14:46:02 +0300 Subject: [PATCH] rule-hunter: a claim of absence carries the command that looked A hunter wrote "picker.test.ts is absent" while the file existed. The evidence protocol asked for file:line and an excerpt for a finding, but said nothing about findings that rest on something not existing. Such a finding now carries the command and its empty result (an ls listing, a grep count of 0). When the budget does not allow that call, the lead goes in the not-reached line as unverified, never as a finding. Co-Authored-By: Claude Opus 5.5 --- core/agents/rule-hunter.md | 10 ++++++++++ go-linter-driven-development/agents/rule-hunter.md | 10 ++++++++++ linter-driven-development/agents/rule-hunter.md | 10 ++++++++++ python-linter-driven-development/agents/rule-hunter.md | 10 ++++++++++ .../agents/rule-hunter.md | 10 ++++++++++ 5 files changed, 50 insertions(+) diff --git a/core/agents/rule-hunter.md b/core/agents/rule-hunter.md index efe912d4..f66d0569 100644 --- a/core/agents/rule-hunter.md +++ b/core/agents/rule-hunter.md @@ -111,8 +111,18 @@ a finding by a design maxim or general principle ("tell don't ask", "law of Demeter") — maxims propose, evidence disposes; only your rule's detection commands convict. +**Claims of absence:** A finding that rests on something *not* existing — no test +file, no caller, no row in a table, never imported — carries the command that looked +and its empty result as the evidence: `ls ` with the listing that lacks the +file, `grep -rn | wc -l` → `0`. Memory of the scope, a file list read +earlier, or a search over a narrower directory proves nothing about absence. When the +budget does not allow that call, the lead is not a finding: name it in the +`not reached:` line as `unverified: `. + **Output — one block per finding:** `rule | file:line | evidence (falsifying-question answers) | proposed fix pattern (named from the rule's Fix pattern section) | effort (S/M/L)` +For a claim of absence the evidence column holds the command and its empty result +(`` `ls src/placement` → no test file ``). Then, rule by rule, one receipt line per falsifying question, in the rule's order: `R Q: hit(s) → finding(s)` — the counts table's number for that question and how many of its hits became findings; the rest were cleared. A diff --git a/go-linter-driven-development/agents/rule-hunter.md b/go-linter-driven-development/agents/rule-hunter.md index fac119f6..8f04b538 100644 --- a/go-linter-driven-development/agents/rule-hunter.md +++ b/go-linter-driven-development/agents/rule-hunter.md @@ -111,8 +111,18 @@ a finding by a design maxim or general principle ("tell don't ask", "law of Demeter") — maxims propose, evidence disposes; only your rule's detection commands convict. +**Claims of absence:** A finding that rests on something *not* existing — no test +file, no caller, no row in a table, never imported — carries the command that looked +and its empty result as the evidence: `ls ` with the listing that lacks the +file, `grep -rn | wc -l` → `0`. Memory of the scope, a file list read +earlier, or a search over a narrower directory proves nothing about absence. When the +budget does not allow that call, the lead is not a finding: name it in the +`not reached:` line as `unverified: `. + **Output — one block per finding:** `rule | file:line | evidence (falsifying-question answers) | proposed fix pattern (named from the rule's Fix pattern section) | effort (S/M/L)` +For a claim of absence the evidence column holds the command and its empty result +(`` `ls src/placement` → no test file ``). Then, rule by rule, one receipt line per falsifying question, in the rule's order: `R Q: hit(s) → finding(s)` — the counts table's number for that question and how many of its hits became findings; the rest were cleared. A diff --git a/linter-driven-development/agents/rule-hunter.md b/linter-driven-development/agents/rule-hunter.md index c0bb667f..4b5423df 100644 --- a/linter-driven-development/agents/rule-hunter.md +++ b/linter-driven-development/agents/rule-hunter.md @@ -111,8 +111,18 @@ a finding by a design maxim or general principle ("tell don't ask", "law of Demeter") — maxims propose, evidence disposes; only your rule's detection commands convict. +**Claims of absence:** A finding that rests on something *not* existing — no test +file, no caller, no row in a table, never imported — carries the command that looked +and its empty result as the evidence: `ls ` with the listing that lacks the +file, `grep -rn | wc -l` → `0`. Memory of the scope, a file list read +earlier, or a search over a narrower directory proves nothing about absence. When the +budget does not allow that call, the lead is not a finding: name it in the +`not reached:` line as `unverified: `. + **Output — one block per finding:** `rule | file:line | evidence (falsifying-question answers) | proposed fix pattern (named from the rule's Fix pattern section) | effort (S/M/L)` +For a claim of absence the evidence column holds the command and its empty result +(`` `ls src/placement` → no test file ``). Then, rule by rule, one receipt line per falsifying question, in the rule's order: `R Q: hit(s) → finding(s)` — the counts table's number for that question and how many of its hits became findings; the rest were cleared. A diff --git a/python-linter-driven-development/agents/rule-hunter.md b/python-linter-driven-development/agents/rule-hunter.md index 58dd3d0b..0bc78769 100644 --- a/python-linter-driven-development/agents/rule-hunter.md +++ b/python-linter-driven-development/agents/rule-hunter.md @@ -111,8 +111,18 @@ a finding by a design maxim or general principle ("tell don't ask", "law of Demeter") — maxims propose, evidence disposes; only your rule's detection commands convict. +**Claims of absence:** A finding that rests on something *not* existing — no test +file, no caller, no row in a table, never imported — carries the command that looked +and its empty result as the evidence: `ls ` with the listing that lacks the +file, `grep -rn | wc -l` → `0`. Memory of the scope, a file list read +earlier, or a search over a narrower directory proves nothing about absence. When the +budget does not allow that call, the lead is not a finding: name it in the +`not reached:` line as `unverified: `. + **Output — one block per finding:** `rule | file:line | evidence (falsifying-question answers) | proposed fix pattern (named from the rule's Fix pattern section) | effort (S/M/L)` +For a claim of absence the evidence column holds the command and its empty result +(`` `ls src/placement` → no test file ``). Then, rule by rule, one receipt line per falsifying question, in the rule's order: `R Q: hit(s) → finding(s)` — the counts table's number for that question and how many of its hits became findings; the rest were cleared. A diff --git a/ts-react-linter-driven-development/agents/rule-hunter.md b/ts-react-linter-driven-development/agents/rule-hunter.md index dfe92e3e..fdfc3af0 100644 --- a/ts-react-linter-driven-development/agents/rule-hunter.md +++ b/ts-react-linter-driven-development/agents/rule-hunter.md @@ -111,8 +111,18 @@ a finding by a design maxim or general principle ("tell don't ask", "law of Demeter") — maxims propose, evidence disposes; only your rule's detection commands convict. +**Claims of absence:** A finding that rests on something *not* existing — no test +file, no caller, no row in a table, never imported — carries the command that looked +and its empty result as the evidence: `ls ` with the listing that lacks the +file, `grep -rn | wc -l` → `0`. Memory of the scope, a file list read +earlier, or a search over a narrower directory proves nothing about absence. When the +budget does not allow that call, the lead is not a finding: name it in the +`not reached:` line as `unverified: `. + **Output — one block per finding:** `rule | file:line | evidence (falsifying-question answers) | proposed fix pattern (named from the rule's Fix pattern section) | effort (S/M/L)` +For a claim of absence the evidence column holds the command and its empty result +(`` `ls src/placement` → no test file ``). Then, rule by rule, one receipt line per falsifying question, in the rule's order: `R Q: hit(s) → finding(s)` — the counts table's number for that question and how many of its hits became findings; the rest were cleared. A