skill-activation-testing — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited skill-activation-testing (Agent Skill) and scored it 96/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
A description rewrite makes a claim: this fires better than what it replaced. Until the claim is tested it sits at n=0, and n=0 claims get argued, not settled — two people with opposite intuitions and no instrument between them. This skill is the instrument. It pairs with intrinsic-prompt-design: that skill tells you how to write the description; this one tells you how to find out whether the change did anything.
The one thing to carry out of here, before any mechanics: there are two tiers of test, and they measure different things. The cheap tier runs in minutes but cannot see the thing a description rewrite is usually for — winning attention under load. The real tier can see it, but costs a live install and many turns. The failure this skill exists to prevent is a confident A/B number that doesn't say which of those two questions it answered. A methodology that manufactures false certainty is worse than no methodology, because the certainty propagates into the next decision and the one after that.
You can learn the router-judge mechanics in ten minutes. The discipline is what makes the numbers mean something. Each rule below carries the failure it prevents, so you can tell when an edge case lets you set it aside and when it's the rule doing its job.
intrinsic-prompt-design itself). Measuring only should-fire turns tells you the description is loud, not that it's accurate.No canonical lineup — model names rot as lineups and access shift, so the rule is the roles and the recording, not the names. Write model-per-role into the run design before running, and report it with the results.
If you can articulate why one of these doesn't apply to the experiment in front of you, set it aside on those grounds. If you're setting it aside because it's inconvenient, that's the signal it's load-bearing here.
The split is not "cheap version / thorough version of the same test." The tiers answer different questions, and conflating them is failure #1 above.
Blind LLM "router" judges decide which skill, if any, they would auto-invoke — given a realistic catalog (with distractors) and a batch of user turns. The only thing that differs between arms is the variable under test (e.g. OLD vs NEW description); the skill name and everything else stay identical, so any delta is attributable to the change. Use independent judges per arm (three is enough to catch a split; one judge can't tell you whether a fire was robust or a coin-flip), on a pinned judge model — same model across arms and across runs, recorded with the result (discipline #6). The judges must be blind — they don't know an A/B is happening or which arm they're in — or you've measured the experimenter, not the description.
Run it in two rounds:
"use the <skill> methodology…") as a pipeline sanity check. This usually ties at ~100% positives / ~0% negatives in both arms — the shared skill name fires the clear cases on its own. Diagnostic, not informative: it proves the pipeline runs and the catalog is well-formed, and it earns Round 2. Do not report this tie as "no difference."Measures: recall on should-fire turns and false-fire rate on traps (both rounds), plus spurious co-activations of other skills — but read the last one only from Round 1, since Round 2's "at most one" constraint forbids co-activation by construction. A spurious co-activation is a precision signal even in the ceiling round (it's a different skill firing, not the target's recall), but it's the one finding the ceiling round can carry — don't promote it past "minor."
Validity limit (state it with the result): an explicit router reads every description by construction. Tier 1 therefore cannot measure attention-capture or skim-resistance — the very thing an interrupt-shaped rewrite is usually for. If the rewrite's headline claim is "fires more reliably under load," Tier 1 is necessary (it rules out the rewrite breaking routing accuracy) but not sufficient (it cannot confirm the headline). Say which.
See references/router-judge-template.md for the parameterized prompt; references/firing-experiment.md for a full two-round run; and references/self-application.md for this skill tested by its own method.
The only tier that can measure firing under genuine attention scarcity. Tier 1 forces a router to read every description; Tier 2 lets the live model skim, ignore, and choose — the actual condition a description ships into.
Design the run (per skill). Declare the session model first — it must be the model the skill actually deploys on, with any floor arm labelled as such (discipline #6). Then build a turn set with a known denominator:
Run it. Load the plugin so its skills and the count-skill-firings.sh hook are active, then issue the turns:
PreToolUse for Skill (confirmed live, not only per docs) — but confirm your own wiring. The hook appends {timestamp, session_id, skill, cwd} per Skill call to ~/.claude/logs/skill-firings.log (override with SKILL_FIRINGS_LOG).SKILL_FIRINGS_LOG=… claude -p "<turn>" --plugin-dir ./<plugin> --allowedTools Skill — --plugin-dir loads the plugin and its hooks; --allowedTools Skill lets the skill fire but keeps it from spiralling into a full sub-analysis. Loop N times; tally the log. Even a nested headless call counts — it's a real session, the actual model auto-firing.hooks/hooks.json and activates on install; a cloud session installs plugins declared in the repo's committed .claude/settings.json.~/.claude/plugins/cache/<plugin>) against your repo checkout — identical ⇒ use the install; differs ⇒ ask the operator (update the install / use the older install [only with a stated reason] / fall back to --plugin-dir). Don't silently test a stale install.Score it. Numerator = the log; denominator = your run design (the should-have-fired turns — it exists nowhere else). Report firings/N per turn, never a bare count (discipline #5). And before reporting any non-firing, run a silence-diligence pass: re-run a sample of the silent should-fire turns capturing the full response, because silence has three readings — a genuine routing choice, a session error, or the model asking for missing input — and only the first is a true miss. Skip the pass and "didn't fire" conflates all three; the recall number becomes fiction.
Cost and validity: slow, high-variance, needs an install or --plugin-dir and many runs — that cost is why Tier 1 exists as the cheap screen. But Tier 2 sees the gap Tier 1 can't: in practice clear positives fire reliably live, while borderline turns under-fire well below the proxy's prediction (the proxy must read; the live model skims). That gap is the attention effect.
The asymmetry is the whole point, so read by it: Tier 1 can veto a rewrite but cannot confirm the headline.
Every reported number is paired with the question it answers and the question it leaves open. Arms differ in exactly one variable. Round 2 exists, and the over-fire traps are genuinely adjacent. Firing-rate claims carry their denominator. Every result records which model played which role. A tie on easy turns is reported as a warmed-up pipeline, not a finding.
When it's not working: a single recall number is reported as "the description works"; the arms quietly differ in more than one thing; the easy-round tie is the headline; a firing count is dressed up as a firing rate; the Tier-2 session quietly ran on a cheaper model than the skill deploys on; or — the subtlest — the proxy's result is offered as the answer to the attention question it cannot, by construction, address.
This is a methodology for testing skills, written as a skill — so the honest thing was to test it with its own method before shipping. That run is in references/self-application.md: a two-arm Tier-1 experiment on this very description (interrupt-shaped, as shipped) against a flat, label-shaped control, same name and catalog and turns. It settles what Tier 1 can settle — routing accuracy and trap-avoidance — and is silent, by construction (discipline #1), on attention-capture. A skill-activation skill that shipped its own description at n=0 would be refuted by its own first sentence.
The reusable instruments this skill generalizes were built in PR #28 (the intrinsic-prompt-design description rewrite): the firing-counter hook (vasana-system/hooks/count-skill-firings.sh + its test suite) and the two-round proxy design with its stated validity limit, originally recorded in intrinsic-prompt-design/references/firing-experiment.md. This skill lifts that one-off experiment into a repeatable method so the next description change is tested the same disciplined way instead of re-argued at n=0.
A vasana is a pattern that persists across unrelated contexts. The numerator/denominator confusion, the ceiling-effect tie misread as a null result, the proxy that deletes the very condition it's meant to test — if you notice one of these recurring outside skill-activation work (in benchmarks, in metrics dashboards, in any before/after claim), it may be worth capturing.
This skill pairs with intrinsic-prompt-design (how to write the description you're now testing) and uses vasana-system/hooks/count-skill-firings.sh as its Tier-2 instrument.
Modify freely. Keep this section intact.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.