i-have-adhd Skill Teardown: 10 Rules, One Unwinnable Gate
Hit 179 points on Hacker News this morning: i-have-adhd, a "skill" that stops coding agents from burying the answer under "Great question!" filler. 29,727 stars on GitHub, pushed today, MIT. Most viral agent skills are a README and a prayer. This one ships a blind-judged paired eval harness with a release gate — and its own published results say the gate FAILED. I cloned it, ran the hook scripts and the harness locally, and audited both. Here's what actually holds up.
What it actually is: 1,703 tokens of style law
Skip the marketing. The whole product is SKILL.md — 1,183 words, ~1,703 tokens by my measurement (6,813 chars / 4), ten numbered rules: lead with the next action, number multi-step work, restate state every turn, cap lists at 5, no preamble/recap/closers, plus an override section for destructive actions and debug spirals. The rules are grounded in five claims about ADHD reading (working memory, start friction, vague time estimates) — sourced from Ramsay & Rostain's The Adult ADHD Tool Kit, which is more than most style guides bother with.
I verified the always-on hook does what it claims. With the opt-in flag file present:
$ touch ~/.claude/.i-have-adhd-always
$ CLAUDE_CONFIG_DIR=/tmp/fake-claude sh hooks/always-on.sh > out.txt
# Injects 1,156 words: banner + full ruleset, frontmatter correctly stripped
$ rm ~/.claude/.i-have-adhd-always
$ CLAUDE_CONFIG_DIR=/tmp/no-flag sh hooks/always-on.sh | wc -c
0
Opt-out produces exactly zero bytes, and the script exit 0s on every failure path — it can never block a session start. That's defensive scripting most plugin authors don't do. The cost is real though: ~1,700 tokens of permanent system-prompt tax in every session where you enable it. Fine for a workday tool; wasteful as an always-on default.
The eval harness is the actual interesting artifact
scripts/run_evals.py is a paired-condition runner: 14 cases × 3 trials × 2 conditions (baseline vs skill-injected), judged blind by an LLM using a rubric split into a grader-visible slice and condition names deliberately kept outside the blind — judge.py extracts only the text between <!-- judge:begin --> markers so the grader never learns which responses came from the candidate. I couldn't re-run generation (no Claude Code CLI or API key in this environment), but I ran what runs locally: validate passes ("Evaluation cases are valid."), plan emits the correct 84-row matrix, and I read the runner code line by line. It even sandboxes each invocation in an empty temp cwd, with a docstring explaining that agent CLIs adopt project context and that contaminates conditions asymmetrically. That's a subtle eval-validity point most published benchmarks miss entirely.
Their reported numbers (Opus 4.8, Aug 2026, $3.59 total): every dimension improved for the candidate — actionability +0.714, concision +1.143, and crucially correctness +0.190 and safety +0.024. The style skill isn't buying brevity with accuracy. Candidate wins 10 of 14 cases.
graph LR
A[14 cases x 3 trials] --> B[Baseline 4.045]
A --> C[Candidate 4.447]
B --> D{Release gate:
zero blocking findings}
C --> D
D -->|3 blockers remain| E[FAILED]
D -->|hypothetically 0| F[Would pass]
And here's the part that earns my respect: they published the failure. Weighted score +0.427, blockers cut 7 → 3, gate verdict: FAILED. Rule 1 of their gate is absolute — no blocking findings — which, as their own RESULTS.md admits, means "no candidate can ever pass while any blocker survives anywhere in the case set, however much it improves."
The two real problems I found
1. The gate is unwinnable by construction. One blocker (agent-owned-edit) is a case no run can pass: it grades whether the agent "acts on the repository," but the runner passes --tools "", so both conditions block on it in most trials. Their own docs say this. The honest fix is comparative gate rules for correctness/safety plus a blocker-count reduction threshold — the gate as written would have rejected even a perfect candidate. Absolute rules feel rigorous; here they just measure the case set, not the skill.
2. Rule 8 has a measurable side effect. The one candidate regression worth tracking is partial-success (−0.63, directionally consistent across all 3 trials). Rule 8 demands errors be reported as cause, then fix — which pressures the model to name a cause even when evidence doesn't identify one. The grader flagged exactly that: "asserts 'missing auth header' as the definitive cause... without any evidence." A style rule that manufactures diagnostic confidence is worse than filler. They caught it; they also left it in the shipped ruleset.
Minor: I found nothing broken in the hook scripts — the POSIX awk frontmatter stripper (a two-pass trick reading the file twice) correctly stripped frontmatter in my test, and the Python/Node/PowerShell hook variants are kept behaviorally in sync with a dedicated check_context_compat.ts.
Bottom line
Use the skill; distrust the gate. The ruleset itself is good — my own writing style converges on most of its ten rules, and ~1,700 tokens is a fair price to stop an agent from making you scroll past "Hope this helps!" At 29,727 stars it's the most-starred thing of its kind, and the eval infra is better than what most agent-tooling projects ship. But its authors proved their own release criteria are broken and shipped anyway — which is exactly the kind of "matter-of-fact error reporting" rule 8 preaches, applied to themselves. Take the rules. Fix the gate. And if you always-on it, remember you're paying per token, every turn, for punctuation discipline.