cold-run
README.md
# cold-run
**I tested 47 agent skills. I deleted 23 of them. Three were making Claude's code worse.**
Then I built the tool that does it, pointed it at the 24 survivors, and it graded three of the
first five **NEGATIVE**.
That is not a bug. It is the most interesting thing I found, and I am publishing it rather than
waiting for you to find it: [runs/bare-baseline/](runs/bare-baseline/).
```sh
npx cold-run
```
## The finding
A skill that does nothing is the boring failure. The common one is worse:
> **A skill spends the agent's attention.** It buys a specific check, and it pays for that check
> out of everything else the task needed.
Asked to build a cached lookup, the agent following `amplification-check` added jitter and
single-flight — exactly what the skill asks for. The agent that had never seen the skill added
those *and* an LRU cap, stale-while-revalidate, and negative caching. The skilled version's cache
grows without bound.
Asked to add retries inside a Lambda, the skilled agent produced a tidy retry-budget table and a
blanket `except` that retries a definitive 404 as eagerly as a timeout.
You cannot see this by reading a skill. Both of those skills are well written. You only see it by
running the task twice and diffing the artifacts.
---
## What it does
Finds your skills, picks an adversarial test task for each one, runs a cold/skilled pair in
parallel, and tells you which of your skills change nothing.
```
cold-run v0.1 — 30 skills in ~/.claude/skills
REAL retry-guard added a breaker + cap; cold declined one
NONE be-thorough cold output was identical
NONE check-edge-cases cold found two more edge cases
NEGATIVE refactor-first skilled dropped a null check cold kept
...
11 change nothing.
2 make the output worse.
17 earn their place.
Deleting the 13 frees ~7,400 tokens of always-loaded
context, every session.
full report -> cold-run-report.md
every transcript -> .cold-run/
```
It never deletes anything. It writes the report and every transcript, and the decision is yours.
**Cost is real and it asks first.** Four model calls per skill. On a library over 12 it tests a
spread of five so your first run is cheap; `--all` does the rest.
```sh
npx cold-run # auto-finds your skills
npx cold-run path/to/skills # or point it somewhere
npx cold-run --all --yes # everything, no prompt
```
Runs through your local `claude` CLI if you have one, otherwise `ANTHROPIC_API_KEY`.
Zero dependencies — `npx` starts instantly.
## As an MCP server
Same audit, driven by whatever agent you already talk to — Claude Code, Claude Desktop, Cursor.
It uses your agent's own subagents, so there's no second API key and no hidden spend.
```sh
claude mcp add cold-run -- npx -y --package=cold-run cold-run-mcp
```
<details><summary>Any other MCP client</summary>
```json
{
"mcpServers": {
"cold-run": {
"command": "npx",
"args": ["-y", "--package=cold-run", "cold-run-mcp"]
}
}
}
```
</details>
Then just ask: *"which of my skills actually do anything?"*
## The five verdicts
| | |
|---|---|
| **REAL** | The artifact differs materially and the skilled run is better. |
| **MARGINAL** | A small real addition on top of an output the cold run already got right. |
| **NONE** | Indistinguishable — or the skilled run only *talked* about the principle. Talking is not changing. |
| **NEGATIVE** | The cold output was better. This is not rare. Three of my 47 landed here. |
| **INVALID** | One side never produced an artifact, so the pair is void. Reported, never counted. A verdict from a run that did not happen is worse than no verdict. |
## The 24 that survived, and the asterisk on them
The library that produced this tool is in [skills/](skills/). Every one has a recorded
cold/skilled pair behind it — see [EVIDENCE.md](EVIDENCE.md) and [runs/ledger.md](runs/ledger.md).
**Read this before you install them.** That audit ran both agents under my machine's global
operating contracts — house rules that force stop-and-ask behaviour and a fixed reporting format.
`cold-run` deliberately strips all of that. Under the bare baseline, three of the first five
survivors grade NEGATIVE. Both results are published, in full, with transcripts:
[runs/bare-baseline/](runs/bare-baseline/).
Which number applies to you depends on what your own `CLAUDE.md` already forces. Neither has been
run at full scale under the bare baseline. I would rather ship the contradiction than hide it.
The 23 that didn't make it, and why none could be repaired, are in [runs/dropped.md](runs/dropped.md).
A few of the survivors, so you can judge the bar:
- **`yagni-audit`** — "implement a rate limiter." Cold wrote ~700 lines: sync, async, keyed,
Redis, Lua, decorators. Skilled wrote 15.
- **`trust-source-check`** — cold authenticated services with a shared static env-var token.
Skilled required a JWKS-verified OIDC token with audience pinning.
- **`reverse-path-proof`** — skilled ran a real Postgres container and found the rollback
*aborts* on a 255-character name, wiping every name in the table. Cold had the same bug.
- **`pit-of-success`** — cold shipped immediate hard delete as the default. Skilled made it
reversible for 30 days and put purge behind a confirmation echoing the user id.
Install them the normal way, or don't. The tool is the point.
## Skills are graded on two gates here, not one
1. **Cold-run delta** — does it change the artifact? 23 skills failed this.
→ [EVIDENCE.md](EVIDENCE.md)
2. **Routing** — does the description actually get the skill *loaded*? A perfect skill with a
description that never fires is dead weight that still costs tokens. Tested as a classifier
against 360 written requests; two rounds failed before all 24 passed.
→ [tests/router/](tests/router/)
A skill passing one and failing the other is still broken.
## vs. skill-doctor
[skill-doctor](https://github.com/marian2js/skill-doctor) is a **linter**. It reads your skills
and checks frontmatter validity, broken resource links, and whether a trigger description *looks*
weak, then scores 0-100. It never runs anything.
cold-run is the other half. It executes the skill and an agent that cannot see the skill, on the
same task, and compares the artifacts.
| | skill-doctor | cold-run |
|---|---|---|
| Reads your skills | yes | yes |
| Runs them | no | yes |
| Catches a broken link or bad frontmatter | **yes** | no |
| Catches a skill that is well-formed and changes nothing | no | **yes** |
A skill can score 100/100 on structure and still be a no-op. That is the failure this catches,
and it is the common one — 23 of my 47 were structurally perfect.
Run both. They fail on different things.
## Prior art
[obra/superpowers](https://github.com/obra/superpowers) is the workflow layer — brainstorm,
plan, execute, verify. There is no overlap with this: zero workflow skills here, zero domain
checks there. Its `writing-skills` prescribes the same subagent testing this tool automates.
## License
MIT.
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues