thefrederiksen/devthrottle/checks-that-fail-open
Claude Code and agent skill by thefrederiksen/devthrottle
- community
Checking that the SKILL.md file is still in the repository.
A check whose pass condition is an ABSENCE certifies a run that never happened. Restate it as a specific PRESENCE - and an empty result is a broken instrument, never a clean run. Use when the task involves: verify, prove it, sweep, grep returned nothing, zero hits, clean run, it passed, no defects, reviewed, delivered, double check, how do we know.
Install
npx vskill@latest install thefrederiksen/devthrottle/checks-that-fail-openSKILL.md
Checks That Fail Open
A check FAILS OPEN when its pass condition is an ABSENCE, and FAILS CLOSED when its pass condition is a specific PRESENCE.
That is the whole law. Doing nothing at all satisfies an absence. Doing nothing produces the wrong value against a presence.
Written up 2026-08-07 after this fleet hit the same defect eight times in one day, in eight different media, and nobody recognised it as one thing until they were listed side by side. The ninth will be somewhere nobody predicted, which is why this is a skill and not an issue.
The root
Every instance is a measurement standing in for the thing it measures.
| The measurement | What it stood in for | |
|---|---|---|
| "Delivered" | received | |
| a working spinner | doing the work you asked for | |
| a count | the list | |
| a tail | the whole output | |
| a comment | the code | |
ancestry (git branch --merged) | the work landed | |
| "no defects posted" | reviewed | |
| "the bad string is gone" | the true string is present | |
| an empty roster row | nothing to say | |
| an error category | the answer the component actually produced |
And the honest reason it goes unnoticed: the tool usually makes the weaker claim cheap and the stronger claim effortful. message send reported delivery in one command; the blocking ask (since removed) waited for the agent's own answer. Two careful sessions used only the first, all night, without noticing. Today message send answers only "queued", and the stronger claim is a reply you asked for with --reply-wanted and read from your inbox.
The eight that cost a day
- A sweep that searched nothing. Run by absolute path from outside a repository,
git greperrored, the return code was ignored, and it printedfiles searched: 0 / UNANNOTATED CLAIMS: 0and exited 0 - certifying the whole repository while searching nothing. - An `awk` range that never matched. It printed no delete-shaped calls and looked exactly like proof - inside a writer's own verification of a fix to an overclaim.
- `git grep` with a leading slash, on Windows. Git Bash rewrites a leading-slash argument to a Windows path before git sees it, so
/docs/startarrives asC:/Program Files/Git/docs/start. No error, no warning, exit 0. A sweep run exactly as written in the plan reports a clean pass having searched for the wrong string. Guard withMSYS_NO_PATHCONV=1, drop the slash, bracket it as"[/]docs/start", or use ripgrep. - A guard that cried wolf on prose ABOUT the defect. A grep for a bad address also matched the comment discussing that address - so it fired on exactly the file it existed to guard, teaching whoever ran it to wave the hit away.
- A range anchored on a heading. Rename the heading and the range yields nothing, the grep prints zero lines, zero lines contain no bad string - a pass, while the check ran over nothing.
- A review. Three review seats died in one night; one had completed its review and recorded the verdict NOWHERE. "No defects were posted" is an absence, and is satisfied by a review that never ran.
- A success test reading a truncated tail.
Delivered to <long name> (1 session(s)).wraps;| tail -1showed onlysession.; the test looking forDeliveredfailed, and four identical messages all landed while the check said none had. - A shell that ate the content. A
gh pr comment --bodycontaining a backticked filename had it command-substituted away.ghposted, returned a URL, and exited 0 - and the published sentence was missing the two words it existed for. A tool that returns a link is not a tool that returned your content. Use--body-filewith a quoted heredoc.
The repair, which is always the same
Do not fix an absence-shaped check with more care. Restate it as a presence.
And the presence must not filter on the property the defect would fail. This qualifier is load-bearing, and it was learned by watching the law applied mechanically produce a new hole. Restating "the stylesheet is stamped" as the specific presence count(stamped URLs) == count(stamp placeholders in the template) is a presence, it is specific, and it CANNOT FAIL: add a file that was never stamped at all and both numbers are unchanged. The failing case sits outside both sides of the comparison. A presence filtered on the property under test is the same hole with a number in front of it - see the count-shaped section below.
The presence that works is a DERIVED enumeration with a per-item assertion: not "four URLs are stamped" but "here is every static URL found ON THE PAGE ITSELF, and each one ends with the stamp".
DERIVED is the whole of it, and it is what reconciles this with "an enumeration is an absence claim wearing a list's clothes" under the table. An enumeration you HAND-KEEP is exactly that - it is true only if exhaustive and it cannot prove its own exhaustiveness, and the hand-kept list in the count-shaped section below went stale exactly that way: it named three files while the template stamped four. An enumeration DERIVED from the artifact under test - every URL the rendered page actually contains, every input tag the template actually declares - is exhaustive by construction, because the thing being checked is the thing being enumerated. If you had to type the list, it will go stale. If the check reads the list off the artifact, it cannot.
| Fails open | Fails closed | |
|---|---|---|
| "no bad string in the output" | "exactly these two lines, and here they are" | |
| "zero unannotated claims" | "N files searched, and here they are" | |
| "no defects were posted" | "PASS - here is what I read, and what I could not reach" | |
| "nothing currently writes to it" | "no write route exists - here is the search" | |
| "its only handlers are X, Y, Z" | "no OnPaste, no PasteEvent, no Ctrl+V branch - here is the search" | |
| "the bad string is gone" | "the corrected string reaches the built artifact" | |
"git branch --merged says merged" | "the changed files are byte-identical to origin/main" | |
| "N of them carry the stamp, and N is what I expected" | "here are ALL of them, and each one carries it" |
An enumeration is an absence claim wearing a list's clothes - true only if exhaustive, and an enumeration cannot prove its own exhaustiveness. One page asserted five event handlers where there were six: the conclusion was right and the evidence was wrong, which is the worst combination, because it survives review.
Five rules that fall out of it
- State all three arms. A reader assumes two outcomes. There are three: the expected result is a pass, a bad result is the defect, and an EMPTY result is a repair job on the instrument - never a clean run.
- Quote the actual output, never the word "passed". A load-bearing count is only load-bearing if it is visible in the record.
- Reconcile a sweep against its own expected inventory. Name what you expect it to find FIRST, run it, then compare. A count with nothing to compare against proves only that the tool ran - and a truncated sweep is indistinguishable from a clean file. One sweep covered 23 of 37 and reported clean; it was caught only because the missing items were known to exist.
- A control proves the check RAN, not that it reached FAR ENOUGH. A line count is a control for TRUNCATION, not for SCOPE. An event, a callback, a hook, a registration - any fan-out is a REACH problem, and only enumerating the subscribers answers it.
- Run it against a known-BAD input. A check only ever run against the state you hope passes has demonstrated nothing. Prove it FIRES as well as passes.
The subtler sibling: a claim that is RIGHT resting on evidence that is WRONG
Harder to catch, because the conclusion survives scrutiny precisely because it is correct - so nobody re-examines what it stands on.
Seen four times in one day, every one found only because a reviewer opened the cited range: a correct negative proved by an incomplete enumeration; a correctly narrowed claim citing a comment about a different class; a correct exoneration resting on a comment saying so; and a real experiment with a correct conclusion whose one wrong detail would have argued for the wrong practice while citing the experiment as proof.
A wrong conclusion gets argued with. A right conclusion with false evidence gets agreed with, cited, and inherited - and the falsehood travels inside it.
Agreeing with a conclusion is not a reason to skip its citation - it is the situation where skipping is most likely and most costly. And when you cannot find evidence for something you believe is true, say less rather than reaching for the nearest plausible citation.
Applying it to review, which is where it costs most
- State a PASS as explicitly as a defect, naming what you checked AND what you could not reach. A pass with no stated scope cannot be judged by anyone who was not there - and everybody who was there is exactly the population that disappears. Report it wherever the review was asked for; if you have been asked to publish it somewhere, publish the same scope there.
- Name the artifact, not just "durably". Where a verdict is recorded decides whether it survives, and the tiers are not equal: a comment on the change beats a pushed file beats a committed file beats a local one beats a message that scrolls away. "Durably" with no named target lets someone pick the weakest rung and believe they complied. Do not write to anywhere you were not asked to write - a review that posts itself somewhere unexpected is its own defect.
- A verdict on file that covers a commit which is no longer the head is not a verdict on the head. A verification has a timestamp.
- A comment describing a fix is itself a claim, and goes stale like any other text. A durability rule manufactures this surface: telling a fleet to write everything down produces comment blocks, inventory rows and defect narratives, all of which read as commentary and none of which is exempt. The rule ships with the leg-hunt attached.
The COUNT-SHAPED check, and three siblings (2026-08-20)
Four more, in one evening, between two sessions. The first three are one shape and it is not covered above: it is not an absence, it is a comparison of two numbers where BOTH SIDES FILTER ON THE PROPERTY THE DEFECT WOULD FAIL, so the failing case sits outside both sides and is invisible to the comparison. The check is a presence, it is specific, and it still cannot fail.
- A hand-kept list naming three stamped static files while the template stamped FOUR. The fourth
arrived with a later feature and nobody updated the list; the test passed on the three it knew.
assert page.count(stamp) == template.count(stamp_placeholder). Add a fifth static file with
NO stamp and both numbers stay four - counts agree, test passes, page ships an unstamped file. Measured ALIVE by mutation before the repair.
assert page.count("data-default") >= 2on a slider-reset control. It counts only the sliders
that HAVE a default, so a slider with none is invisible and never gets reset. Measured ALIVE.
One sentence: a test checking a NUMBER ABOUT the thing instead of the thing. The repair is always to enumerate and assert the property of EACH item - every static URL carries the stamp; every range input carries a default.
How the third was found, which is the transferable part. Not by re-reading, and not by grepping for count(. By searching the suite for the DEFECT'S SHAPE: which assertion compares two numbers where both sides filter on the property the defect would fail. Searching by the TOOL (ast.walk, rglob, count() finds duplicates of a mechanism. Searching by the SHAPE finds the same defect in code that shares no tool with it - a stamp count and a slider count have nothing in common but the shape. When you fix one instance, search for its shape before you close it.
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 90 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingplugins/agent-discipline/skills/checks-that-fail-open/SKILL.md
Popularity
- Repository stars
- 96
- Repository forks
- 11
- 7-day trend score
- 0
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/thefrederiksen/devthrottle/checks-that-fail-open)