hailneed MIT · local-first

00 hailneed suite · module 02 · Skill lint & usage

The skill reads fine.
Does it ever
actually fire?

A skill that never triggers looks exactly like one that works. skillbench lints skill files against 26 transparent checks, then reads real activation counts from the session history your agent already keeps — and where nothing is recorded, it says unmeasured, not unused.

01 Evidence

This is a real report.
Show, do not tell.

Abridged from an actual run of --lint across every skill installed on the machine this site was built on. Skill names generalized; every count and score is what the linter printed. Nothing in it ever left that machine.

lint report — markdown out
# skillbench — lint

Source note: 38 skill · installed agent roots · claude-code/installed: 3
· claude-code/user: 13 · gemini-cli/user: 8 · codex/user: 8
· codex/system: 6 · score: 223 (poor)

1 error · 42 warn · 45 info

## By check

| Sev   | Check               | n  | example skills                |
|-------|---------------------|----|-------------------------------|
| error | ref-broken-link     |  1 | skill-creator                 |
| warn  | eval-missing        | 35 | agent-notes:intake, video-su… |
| warn  | fm-desc-no-trigger  |  5 | video-suite, skill-creator, … |
| warn  | path-absolute       |  1 | agent-notes:intake            |
| info  | fm-desc-no-boundary | 30 | persona:stats, agent-notes:w… |

## Skills needing most work

| Skill              | agent       | error | warn | info | score |
|--------------------|-------------|-------|------|------|-------|
| `video-suite`      | claude-code |     0 |    6 |    3 |    27 |
| `skill-creator`    | codex       |     1 |    3 |    0 |    22 |
| `media-assets`     | claude-code |     0 |    3 |    9 |    21 |
| `video-suite-cli`  | claude-code |     0 |    3 |    6 |    18 |
| `agent-notes:intake` | claude-code |   0 |    2 |    1 |     9 |

Yes — the machine this linter was written on scores poor. That is the point: it reports what it finds. Every finding names the check, the skill and the severity, and every check carries a “why it matters” and a “how to fix” line. The checks live in one file you can open, and any check you disagree with switches off with --ignore.

02 Install

One marketplace.
Then one command.

claude code
# once
> /plugin marketplace add hailneed/plugins

# lint + usage evidence
> /plugin install skillbench@hailneed

# and try it
> /skillbench:coverage
  • Claude Code and Node.js 18 or newer.
  • No dependencies, no build step, no API key, no account.
  • Standalone works toonode scripts/skillbench.mjs --coverage --md --lang en
  • CI-ready--lint --path . --out lint.json has a stable output format; bind score.raw to a threshold.
Marketplace manifest

03 Commands

Three questions
about every skill.

01

/skillbench:lint

Is it written right? 26 transparent checks across frontmatter, activation quality — trigger phrases, negative boundary — body size, broken references, portability, tool permissions and eval coverage. Runs on the repo you are developing (--path) or on every skill installed across Claude Code, Codex CLI and Gemini CLI.

02

/skillbench:coverage

Does it actually fire? Claude Code records which skill was active for each tool call; coverage turns that into real activations per skill — calls, distinct sessions, projects, recency — and lists the ones that never fired, with the likeliest reason. Codex CLI and Gemini CLI do not record attribution; their skills report as unmeasured, never as unused.

03

/skillbench:collide

Do two skills compete for the same request? An idf-weighted overlap score naming the shared terms that blur the boundary, plus drift detection for skills mirrored into several agent homes — are the copies still identical?

04 Trust

Claims you can
check in the source.

  • No network calls. The scanner only reads skill files and session logs already on your disk — skillbench.mjs contains no fetch, no sockets.
  • Unmeasured is not unused. Only Claude Code stores skill attribution; skills on Codex CLI and Gemini CLI are reported as unmeasured. Where there is no number, no number is shown.
  • No quota spent. Everything is read from disk. Live trigger testing — actually running should_trigger prompts — is deliberately deferred to v0.2 because it costs quota.
  • 26 checks, no model judgementchecks.mjs is a list you can read, and --selftest proves the engine against 20 fixtures without touching your data.
  • Symlinks are followed. Skills linked from a development repo are found and linted — a naive scanner silently misses every one of them.
  • MIT. LICENSE — no account, no signup, no telemetry.

05 Cloud

skillbench Cloud
is in design.

The plugin stays free and local — that is a promise, not a phase. Cloud is the optional layer for teams whose skills outnumber the people maintaining them:

  • Continuous measurement for a team skill library — lint and coverage tracked over time, not run by hand.
  • Regression history — how a description change affected trigger rate, before and after.
  • Pre-publish gate for marketplace publishers — a skill ships when it passes, not when it looks done.

06 Family

One suite.
Five more modules.