Skillsmith
2026 · open source · claude code + codex
I wanted to know whether my agent instructions actually helped. Skillsmith drafts a skill from the repo I am working in, then runs the same task with and without it, compares the results without telling the judges which is which, and checks the candidate on cases that were not used to revise it.
Figure 01 · Skill lifecycle · skillsmith
Gate, ground, draft, prove, then keep or retire
The gate can stop the run before anything is written, and the last step can retire the skill the run just drafted.
- Inline
- Queued
Deciding whether it should be a skill
Before anything is written, skillsmith asks whether the job needs a skill at all, or belongs in an AGENTS.md rule, a hook, a memory or a one-off answer. If a skill is right, inventory.py lists the skills and conventions the repo already has, so the new one fills a gap instead of overlapping one.
The draft starts from its trigger description, keeps the body under 500 lines, and passes lint_skill.py before any run. It installs as one skill for both clients: .claude/skills/skillsmith for Claude Code, exposed to Codex at .agents/skills/skillsmith.
Comparing with and without the skill
Both versions run in fresh contexts with the same model, tools, task and scoring criteria. I use development cases to improve the skill, then separate held-out cases to decide whether to keep it. Once I use a held-out result to make an edit, that case can no longer count as a fresh test.
Keeping the comparison blind
eval_gate.py prepare prepares anonymous A/B packets with the order balanced across comparisons. Independent judges see the full transcripts and results. Checks with exact answers run in code first. Any critical failure counts against the candidate, even if its average score is higher.
Keeping the previous version when an edit fails
New candidates get up to three serious attempts by default. An existing skill keeps its last passing version until a revision passes. A new skill without a clear heldout win whose uncertainty lower bound clears the gate is archived. lifecycle_gate.py checks the attempt history, retired heldouts and final action, while the payload helper confirms that Claude Code and Codex loaded the exact frozen files.
- steps
- 5 · gate through keep or retire
- skill body
- under 500 lines · linted
- revisions
- 3 serious attempts, then archive
- gate versions
- 3 · older bundles still accepted
- clients
- Claude Code + Codex
- model calls
- 0 · supplied by the host
- runtime
- Python standard library
- status
- MIT · github.com/ong6/skillsmith
// AI TOOLCHAIN
How these tools fit together
01 · instruct
Skillpack
The reusable instructions my agents load.
02 · make + prove
Skillsmith
Drafts a skill from the repo, then a blind test decides whether it stays.
03 · check
Groundplane
Checks agent output against recorded tool results.
// NEXT
Groundplane
An agent boundary you can inspect