behavioral tests for SKILL.md

Catch silent skill misfires before your users do.

A skill can look valid and still miss the prompts it was built for. Tripwire runs real agent sessions, records what activates, and fails CI when that behavior changes.

Open source Runs on your machine Claude adapter live-verified
tripwire test
$ tripwire test ./skills/code-review

Running 4 committed scenarios...

 "review this pull request"        activated
 "audit this auth middleware"     missed
 "write release notes"             stayed quiet
 "fix this CSS bug"                stayed quiet

1 activation regression. CI failed.

the failure your linter cannot see

Your skill description is routing code.

The agent reads a skill’s name and description before deciding whether to load it. A clean file proves the syntax works. It does not prove the agent will choose the skill.

Tripwire does not ask an LLM whether your description “looks good.” The Claude adapter reads the structured Skill tool event from a real session and matches the skill that fired. Gemini and Codex adapters are available as experimental checks.

silent miss

The user asks for the right outcome.

The wording differs from your description, so the agent never loads the skill. Nothing crashes. The user gets a generic answer.

false trigger

The skill claims too much territory.

An unrelated prompt matches the description. The agent loads the wrong instructions and interferes with work it should have ignored.

try it now

Lint in your browser, then run it for real.

No install needed for the static check. When you're ready, copy three commands and probe a real prompt.

1. Lint it in your browser

This checks file structure and authoring rules. The activation test runs from the CLI because it needs a real agent session.

Load an example:
SKILL.md
Lint result

2. Then run it for real

$ npm install -g tripwire-skills
$ tripwire lint ./skills/my-skill
$ tripwire test ./skills/my-skill --prompt "your real user prompt" --expect activate

The one-prompt check does not need a Tripwire account or a separate generation key. Once activation works, analyze generates a scenario matrix you commit and replay in CI. See the full workflow in the README.

a review signal your team can enforce

Gate skill changes on every pull request.

The Action lints changed skills, replays committed activation scenarios, annotates the diff, and posts one sticky PR summary. Missing credentials skip the paid probe and leave static lint running.

  • Runs on your GitHub runner
  • Uses your model credentials
  • Distinguishes misfires from broken infrastructure
# .github/workflows/tripwire.yml
name: Tripwire
on: pull_request
jobs:
  skills:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v5
        with: { fetch-depth: 0 }
      - uses: bharath31/tripwire@v1
        with:
          probe: true
          anthropic-api-key: ${{ secrets.ANTHROPIC_API_KEY }}

production questions

What skill developers need to know.

How is Tripwire different from a SKILL.md linter?

A linter checks file structure and authoring rules. Tripwire also runs the skill through a real agent and observes whether it activates. That behavioral check catches valid-looking descriptions that miss intended prompts or trigger for unrelated requests.

Does Tripwire upload my skill or prompts?

Tripwire does not send skill files, prompts, file paths, repository names, model output, usernames, or credentials to its servers. Probes run locally or on your GitHub runner through your configured agent provider. Anonymous behavioral telemetry can be disabled with TRIPWIRE_TELEMETRY=0.

ship the behavior you intended

Give your next skill change a real activation test.