A proposal-only system for authoring and evaluating small atomic skills across Claude Code and Codex, with one neutral contract and thin surface adapters.
Project description
Rigwright
Rigwright authors and evaluates small, single-purpose skills for AI coding agents: the reusable instruction files that Claude Code and Codex load to handle one kind of task well. In practice, skill files sprawl into catch-all documents where no one can tell whether an edit helped, and each platform needs the same skill re-packaged by hand in its own format. Rigwright gives every skill one measurable outcome and its own eval set (test prompts with expected behavior), then generates the packaging for each platform from a single neutral source, validated against both platforms' native schemas.
Getting started
- Prerequisites: Python 3.12 or newer.
- Install:
pip install rigwright. The CLI is published on PyPI asrigwright. See Install for the run-from-clone alternative that needs no install at all. - Check it works: from a clone of this repository, run
rigwright gate. It runs the full offline gate (contract, build, package, determinism, fixtures, and evals) and printsoffline gate PASS: 8/8 commands.
Create your own skill
The installed CLI can create and validate a neutral skill in a workspace outside the Rigwright repository. It refuses to overwrite an existing skill directory and does not install, activate, or promote the result:
rigwright init-skill --workspace ../my-rigwright-skills --id changelog-check --description "Check a changelog for one required release heading." --outcome "Report whether the required heading exists."
rigwright validate-workspace --workspace ../my-rigwright-skills
The first command creates rigwright-workspace.json, src/skills/changelog-check/skill.json, and its four-case evals/evals.json. The second command applies the neutral skill, lifecycle, and eval contracts to every skill it discovers; it does not require or hardcode Rigwright's seven vendor leaves. Edit the scaffold's generated triggers, instructions, and cases to match the real workflow before treating it as a candidate. Adapter building remains a repository workflow.
One skill, end to end
Every skill is one neutral JSON record. Here is rigwright-author-skill, the skill that authors other skills (trimmed):
// src/skills/rigwright-author-skill/skill.json
{
"id": "rigwright-author-skill",
"intent": "Create or improve one atomic neutral skill source.",
"outcome": "Produce one contract-valid skill, its eval set, and requested thin surface adapters.",
"non_goals": ["Create a plugin container", "Run promotion evaluation", "Install or activate a skill", /* … */],
"instructions": [
"Confirm the reusable intent, realistic positive triggers, near misses, bounded inputs, and one independently measurable outcome.",
"Record a no-skill or prior-version baseline before final prose and define at least three positive eval cases plus one realistic near miss.",
// …
],
"eval_path": "evals/evals.json"
}
One command builds all seven records into platform-native packages:
$ python -B tools/build_adapters.py --mode candidate-sandbox --output-root artifacts/build
adapter build candidate-sandbox: 7 included, 0 excluded
For Claude Code, that generates a plugin manifest plus one SKILL.md per skill (trimmed):
<!-- artifacts/build/claude-code/rigwright/skills/rigwright-author-skill/SKILL.md -->
---
name: rigwright-author-skill
description: "Authors or improves one atomic neutral skill and emits requested Claude Code or Codex adapters. Use when a user asks to create, refactor, tighten, or add evals to a skill without installing or activating it."
---
# Rigwright Author Skill
Create or improve one atomic neutral skill source.
## Procedure
1. Confirm the reusable intent, realistic positive triggers, near misses, bounded inputs, and one independently measurable outcome.
2. Record a no-skill or prior-version baseline before final prose and define at least three positive eval cases plus one realistic near miss.
…
This is a generated `claude-code` adapter. Edit the neutral `src/skills/rigwright-author-skill/skill.json` source instead of this file.
The Codex package carries the same skill body under Codex's own manifest layout, plus the UI metadata Codex keeps in a separate file:
# artifacts/build/codex/rigwright/skills/rigwright-author-skill/agents/openai.yaml
interface:
display_name: "Rigwright Author Skill"
short_description: "Use Rigwright Author Skill workflow"
default_prompt: "Use $rigwright-author-skill for this bounded proposal task."
policy:
allow_implicit_invocation: false
Each skill ships its own eval set (prompts that must trigger it and realistic near misses that must not), and one command rebuilds both adapter modes and replays them all:
$ python -B tools/run_evals.py
offline evals passed: 59 assertions, 7 near misses, 6 fixed tasks
All output above is from a real run on this tree.
The seven skills
| Skill | What it does |
|---|---|
rigwright-route |
Picks which single Rigwright skill should handle a request. |
rigwright-author-skill |
Writes or improves one skill, with its eval set and platform adapters. |
rigwright-author-plugin |
Wraps existing skills into one platform-native plugin container. |
rigwright-evaluate |
Compares a frozen candidate skill against frozen baselines and records regressions. |
rigwright-migrate |
Plans a backward-compatible successor for a skill, with a rollback path. |
rigwright-prioritize |
Picks which one skill owns an intent when several overlap. |
rigwright-archive |
Packages a retiring skill as a hash-verified copy with restore proof. |
Each skill is deliberately narrow: anything beyond its one outcome (installing, activating, promoting) is out of scope by contract, and the validator enforces those boundaries. The per-skill boundary lists are in STATUS.md.
How it works
flowchart LR
A["Neutral sources<br>src/skills/*/skill.json"] --> B["Adapter builder<br>tools/build_adapters.py"]
B --> C["Claude Code package"]
B --> D["Codex package"]
C --> E["Validators<br>127 contract + 224 package checks"]
D --> E
E --> F["Eval report<br>59 assertions"]
The neutral record is the single source of truth; generated files say so and point back to it. Builds are deterministic: rebuilding produces byte-identical trees and archives, and tools/verify_determinism.py proves it. Beyond Rigwright's own validators, a manual CI job runs each platform's native validator (claude plugin validate and the Codex plugin validator) against the generated packages.
Install
The CLI is on PyPI as rigwright and needs Python 3.12+:
pip install rigwright
Run the complete offline gate from a clone of this repository with rigwright gate, or with no install at all:
$ python tools/run_all.py
offline gate PASS: 8/8 commands
The eight commands and their current one-line results:
source fingerprint skipped: no config/sources.json
contract validation passed: 127 checks, 7 leaves, 32 eval cases
adapter build normal: 0 included, 7 excluded
adapter build candidate-sandbox: 7 included, 0 excluded
package validation passed: 224 checks
determinism passed: 2 surface packages
runtime fixtures passed: 6 tasks, 4 conditions, 3 replicates
offline evals passed: 59 assertions, 7 near misses, 6 fixed tasks
Evidence is written under artifacts/ (untracked). See Validation for the cache-free assessment pattern.
Status: source version 0.2.0 is prepared for review while PyPI still carries the historical
0.1.0 CLI package. The seven skills remain proposals, and nothing in this repository installs or
activates them; full current state in STATUS.md.
Safety and limitations
- Generated packages under
artifacts/are offline evaluation evidence, not installations. Which skill version is live is decided outside this repository, by the owner's separate lifecycle registry (see STATUS.md). - Open problem: producing Codex plugin manifests that pass Codex's native validator for a dual-surface plugin. Rigwright's own generated Codex package passes the captured validators, but that is candidate-local evidence and does not settle the general case. See Conflicts and open problems.
- The offline gates prove deterministic contract and fixture coverage; they are not adoption, production, or model-quality claims. An internal blinded runtime evaluation was run on both platforms; it does not authorize promotion.
- Original material is MIT licensed under Rahul Krishna. Captured third-party material retains its original terms and is not relicensed; see third-party notices.
- No dedicated public security contact exists yet; report privately through the GitLab project rather than a public issue. See Security policy.
Project documents
- Status
- Architecture
- Configuration
- Validation
- Privacy and retained evidence
- Release readiness
- Contributing
- Roadmap
- Changelog
Rigwright is authored by Rahul Krishna and distributed under the MIT License.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file rigwright-0.2.0.tar.gz.
File metadata
- Download URL: rigwright-0.2.0.tar.gz
- Upload date:
- Size: 101.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b28c8aca2e4ea362ef5965c46ed0eb73f931b3554fb348653180769a17ac10f0
|
|
| MD5 |
b17218f6b5324453b999b76121d4a652
|
|
| BLAKE2b-256 |
e89dfa85c6333457d31d623455d94fa31c7f6ad2b7e00b1bbcbaf80bee2e7c7a
|
File details
Details for the file rigwright-0.2.0-py3-none-any.whl.
File metadata
- Download URL: rigwright-0.2.0-py3-none-any.whl
- Upload date:
- Size: 39.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
091f1fd9644efcf62027a1dcecd5f692fba92a01d99d2e681b262337298da34b
|
|
| MD5 |
dbc1119fad787e667788526a98cce570
|
|
| BLAKE2b-256 |
af146c969c3baf88f12a86738fd0fb08d3cf5225e4486b5f0fc4570bbe26e160
|