Skip to main content

skillroll mascot: a hooded otter holding a twenty-sided die and field guide

skillroll

Simple eval infrastructure for agent skills.
Describe one behavior in Markdown. A Dungeon Master simulates the outside world. skillroll tells you whether the behavior still works.

Get started · Write an eval · Understand a result

skillroll demo: create a wait-for-CI eval, edit it, run it, and read the judge summary

skillroll is a drop-in eval harness for repositories of Agent Skills. It gives prompt maintenance the same regression loop that tests give code, without a custom test framework for every skill.

If you can explain what a skill should do, you can eval it.

Why skillroll exists

Scripts have exact inputs and outputs. Agent skills do not. A good skill may take different paths, use different words, and still do the right thing. Deterministic assertions are a poor fit for that behavior.

Traditional eval harnesses work around this with mocks, fixtures, fake APIs, and skill-specific setup. Those systems are expensive to write and harder to maintain than the prompts they protect.

skillroll replaces that setup with one small Markdown case.

How it works

Each case describes three things:

  • Input: the realistic request given to the skill;
  • World: the external state the skill can encounter; and
  • Success criteria: the important behavior to preserve.

During the run, the skill sends external actions through one controlled boundary. A Dungeon Master agent answers from the written World and the action history. It can simulate a file, API, service, person, failure, or any other outside interaction the case needs.

When an answer must be exact, a case can provide a deterministic rule. For everything else, the Dungeon Master keeps the simulation coherent. A final judge compares the observed behavior with the success criteria and returns a verdict with readable evidence.

No mock server. No fake SDK. No per-skill harness code.

Prompt TDD

  1. Describe the failing or required behavior before changing the prompt.
  2. Run the case and inspect what the skill actually did.
  3. Make the smallest prompt fix that changes the behavior.
  4. Run the case again and keep it as a regression test.

Dark skillroll evidence summary showing required E2E still running and the merge correctly withheld

Quickstart

skillroll requires Python 3.12 or later and uv.

uv tool install skillroll

From a repository that already contains SKILL.md files:

cd /path/to/my-skills
skillroll init
skillroll new my-skill/first-use

init detects the skills folder, confirms it with you, and writes a small local configuration. --yes is only for scripts that need to accept the detected folder without questions. skillroll does not replace an existing configuration or eval case.

Open my-skill/evals/first-use.eval.md and replace the placeholders:

# First use

```skillroll
schema_version: 1
```

## Input

The request the skill should handle.

## World

The outside state and action results the skill may encounter.

## Success criteria

- The important behavior that must remain true.
```

Validate the Markdown without calling a model:

skillroll validate --case my-skill/evals/first-use.eval.md

Connect any compatible model

skillroll works with OpenAI-compatible Chat Completions endpoints that support tool calling and structured JSON output. It is not tied to OpenAI or OpenRouter. Enter these values during init, or add them to skillroll.toml:

[inference]
base_url = "https://provider.example/v1"
model = "provider/model-name"
api_key_env = "SKILLROLL_API_KEY"

The configuration stores the name of an environment variable, never the key. SKILLROLL_API_KEY is the provider-neutral default; api_key_env can name any environment variable you already use. Export the key, check the connection, then run the eval:

export SKILLROLL_API_KEY="your-key"
skillroll doctor
skillroll eval --case my-skill/evals/first-use.eval.md

doctor checks the endpoint before the eval spends inference. eval prints the verdict and the path to a readable report.

OpenRouter as a starting point

OpenRouter is an optional, simple way to use many models through one OpenAI-compatible endpoint. Our current model testing points to this practical split:

Choice What we found Use it for
OpenRouter Free The selected model and availability can change. Results are not stable enough to compare over time. Checking that setup, tool calls, and the pipeline work.
openai/gpt-5.6-luna-pro The best middle ground we found between reliable skill behavior and price. Prompt development and ongoing CI evals.
A stronger frontier model More capable on unusually difficult or long cases, at a higher price. Investigating failures or validating critical changes.

To use Luna Pro through OpenRouter:

[inference]
base_url = "https://openrouter.ai/api/v1"
model = "openai/gpt-5.6-luna-pro"
api_key_env = "SKILLROLL_API_KEY"

OpenRouter Free is a sanity check, not an eval model. For a disposable setup, skillroll init --skills-path skills --openrouter-free selects it explicitly. Do not use its verdicts as regression or release evidence.

Estimated Luna Pro cost per eval

As of August 23, 2026, OpenRouter lists Luna Pro at $0.20 per million input tokens and $1.20 per million output tokens. These working estimates use the prompt sizes and action patterns in skillroll's bundled cases and include the compatibility check, skill run, Dungeon Master, and judge:

Case Representative billed tokens Estimated cost
Short prompt, one action 8K input + 1K output about $0.003
Typical prompt, two actions 20K input + 3K output about $0.008
Large prompt, four actions 60K input + 8K output about $0.022

Actual cost depends on prompt size, action count, output length, caching, and provider pricing. Batch runs share one compatibility check. Add current rates to skillroll.toml if you want reports to estimate cost from observed usage.

Read the result

Each run is saved under .skillroll/runs/. The report explains the verdict, shows the observed actions, and points to the failed criteria. result.json is available for automation and transcript.jsonl contains the complete action history.

Outcome Meaning
PASS The observed behavior met the case.
FAIL The observed behavior missed a success criterion.
INCOMPLETE A required repository check did not run.
ERROR skillroll could not produce a trustworthy verdict.

Add GitHub Actions

After skillroll.toml exists, generate the advisory workflow:

skillroll init --github-workflow

This writes .github/workflows/skillroll.yml without replacing an existing workflow. Review it before committing. Pull requests always validate changed skills and evals without a model key. To enable model-backed evals for pull requests from your own repository, create a skillroll-eval environment with a secret named by api_key_env, then set the SKILLROLL_LIVE_EVAL repository variable to true. Fork pull requests never receive the key.

Start with advisory results. See the GitHub Actions guide for manual runs, repository checks, and artifact retention.

Keep evals small

One case should cover one important behavior. Narrow cases are easier to write, read, debug, and run in CI. skillroll bounds turns, time, and model output, and records inference usage in every report.

Use deterministic rules for exact action results. Let the Dungeon Master handle the behavior that would otherwise require mocks or elaborate setup.

Trust and security

skillroll is local, open source infrastructure:

  • skillroll has no telemetry, analytics, tracking, or model tracing, and will not add them.
  • There is no skillroll account or hosted service. The only model traffic goes to the endpoint you configure when you run doctor or an eval.
  • API keys stay in environment variables. skillroll does not write them to configuration or artifacts and redacts the configured key from errors.
  • Run artifacts stay under .skillroll/runs/ and are ignored by the generated .gitignore rule.
  • skillroll is released under the permissive MIT License. The code, prompts, and security boundaries are public and reviewable.
  • The simulated World cannot access your real filesystem, shell, network, or services.
  • Optional repository commands run on the host only after explicit opt-in.
  • Reports may contain case text, simulated state, and model output. Review them before sharing.
  • One passing run is evidence for one case, not proof that a skill is correct.
  • Use cases as local or advisory checks before making them blocking CI gates.

skillroll is an early project. Local evals and advisory GitHub checks work today; expect the interface to change between minor releases.

Learn more

The documentation index lists the same guides by task.

See PRINCIPLES.md for the project principles and CONTRIBUTING.md to work on skillroll. Project support, security reporting, and governance are in SUPPORT.md, SECURITY.md, and GOVERNANCE.md.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

skillroll-0.1.2.tar.gz (99.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

skillroll-0.1.2-py3-none-any.whl (126.2 kB view details)

Uploaded Python 3

File details

Details for the file skillroll-0.1.2.tar.gz.

File metadata

  • Download URL: skillroll-0.1.2.tar.gz
  • Upload date:
  • Size: 99.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for skillroll-0.1.2.tar.gz
Algorithm Hash digest
SHA256 d43edcd55a51db15a54e5b9ae5010c00f59c433e6682f8df876171057d0708a3
MD5 a594e144f84b90c28e62d86a53a73279
BLAKE2b-256 b797eecb3c0157815df502ed8f4ecbdd8614322bbe7a86f5bcd7952611d2ee69

See more details on using hashes here.

Provenance

The following attestation bundles were made for skillroll-0.1.2.tar.gz:

Publisher: release.yml on hagaiw/skillroll

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file skillroll-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: skillroll-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 126.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for skillroll-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 62e4dd5df65e9a592a8f6d3527230d7b5537ea22cf2d7327e97b51fa99ec0935
MD5 69912e81f5444a7b9a4e432e4667989f
BLAKE2b-256 0f6221cad326be5e0e56fe154c49a35ade1c9142bfcf6b24f27f2721eef0c87a

See more details on using hashes here.

Provenance

The following attestation bundles were made for skillroll-0.1.2-py3-none-any.whl:

Publisher: release.yml on hagaiw/skillroll

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.1.2 This release

2 files

0.1.1

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page