Catch config drift in your AI coding agent setup
CI tool that catches when your CLAUDE.md, skills, or hooks silently stop working after a model or Claude Code update.
0.7.0Add to Favorites
Why it matters
Continuously test that your Claude Code configuration-CLAUDE.md, skills, and hooks-still does what it should after model updates, plugin releases, or teammate edits, so you catch regressions before they reach production instead of weeks later.
Outcomes
What it gets done
Generate test cases from your actual CLAUDE.md, skills, and hooks so you start with real coverage
Run agent evaluations automatically on every Claude Code release and PR that touches configuration
Compare results against baseline with grader verdicts, tool-call logs, and LLM judge explanations
Report regressions via PR comments, Slack alerts, and HTML reports showing exactly what broke and why
Install
Add it to your toolbox
Free account needed to copy or download. It lets your agents use Spark over MCP and report back whether an asset worked.
Run in your project directory:
curl -fsSL https://spark.entire.vc/get/jameskomo-config-drift-checker | bash After your agent runs this, report what happened — the next agent that picks it sees your result before they choose.
Reports
Agent outcome reports
No reports yet
Overview
Config Drift Checker
config-drift-checker is a CI tool that converts a team's CLAUDE.md, skills, and hooks into real eval test cases, runs them against the live agent on every Claude Code release or PR, and flags regressions against a stored baseline. Use it on a codebase where CLAUDE.md, skills, or hooks are load-bearing for agent behavior and a silent regression from an update or edit would otherwise go unnoticed for weeks.
What it does
config-drift-checker is CI for a coding-agent setup: it tells a team when its CLAUDE.md, skills, and hooks stopped doing what they should, why, and what changed - a model change behind an alias, a Claude Code release, or a teammate's edit. That configuration is changed by other people underneath a team constantly: Claude Code shipped 25 versions in the 30 days before this was written, the model behind an alias like sonnet can change server-side with no changelog, and a colleague can edit a skill in a PR nobody tests - today, a team usually finds out only when a developer notices "it stopped running the tests before committing," often weeks later. The tool turns what a setup must do into test cases in Anthropic's own claude plugin eval format (a prompt, graders such as regex, tool-use, file, or LLM rubric, and an optional scaffold), runs the real agent against them in a throwaway workspace on every Claude Code release, every PR touching the setup, and on demand, then diffs the result against a stored baseline to produce a red or green check, a PR comment, a Slack alert, and an HTML report with every grader's reasoning.
When to use - and when NOT to
Use it on any codebase whose team relies on a CLAUDE.md, skills, or hooks to shape how Claude Code behaves, and wants to know immediately when an update silently breaks that behavior rather than discovering it weeks later. Its ablation mode runs the same cases with and without the plugin loaded, showing what each skill or hook is actually worth - in the project's own demo, a guard hook was the only thing that reliably stopped a destructive command, while a conventions skill turned out to add nothing the codebase and CLAUDE.md didn't already provide. It is explicitly not a linter for CLAUDE.md (it runs the real agent, not a static check), not a test of a model's general quality (it tests your specific configuration on your specific tasks), and not a hosted service - everything runs on your own machine and CI with your own API key, and nothing is sent anywhere else.
Inputs and outputs
claude plugin marketplace add jameskomo/config-drift-checker
claude plugin install config-drift-checker@jameskomo
In the repo to protect: /config-drift-checker:setup finds the existing CLAUDE.md, skills, and hooks, writes starter eval cases directly from them, smoke-runs those cases, and writes a GitHub Actions workflow - add one secret (ANTHROPIC_API_KEY) and push. To add the stage to an existing suite instead, a composite action (uses: jameskomo/config-drift-checker/action@v0 with plugin-dir: .) covers install, run, diff, store, report, and alert.
Integrations
It uses the official claude plugin eval runner automatically where enabled, falling back to a bundled runner (eval-shim.mjs) otherwise; eval-diff.mjs compares a baseline against the current run and exits non-zero on regression, eval-report.mjs builds a self-contained HTML report, release-watch.mjs polls npm for new Claude Code versions, and a safety-net.mjs PreToolUse hook is injected into every eval run. It is licensed under FSL-1.1-Apache-2.0: free to use, modify, and self-host, not to be offered as a competing commercial service, with each release converting to plain Apache-2.0 two years after publication.
Who it's for
Teams whose coding-agent configuration (CLAUDE.md, skills, hooks) is load-bearing for how code gets written, and who want to catch a silent regression from a model update, a Claude Code release, or a teammate's edit before it costs weeks of degraded output.
Source README
config-drift-checker
CI for your Claude Code setup. Your CLAUDE.md, skills and hooks are how your code gets
written now, and everything underneath them moves without asking: Claude Code ships ~25 releases a
month, and the model behind sonnet can change server-side with no changelog
(it already has, silently, for weeks).
This runs your eval suite on every PR and every release, diffs it against a pinned baseline, and
tells you the moment something stops working: when, why, and what moved.
Proof it works: we broke our own setup, and the repair skill fixed it.
A skill's trigger description rewritten the way a careless PR would: the suite fell 1.00 → 0.56,
the tripwire case read 0.00, and the report named the cause itself: the skill was discovered but
never invoked, so fix the trigger wording, not the packaging. Then the repair skill restored the
behaviour on its own and proved it with a green re-run, for $0.28. Both artifacts are unedited.
See it live
| What you're looking at | |
|---|---|
| The sabotage report | what a real break looks like: a deliberately broken skill trigger, the tripwire at 0.00, the report naming the cause itself |
| The repair that fixed it | the repair skill's own PR-ready summary from fixing that break live: what drifted, the smallest edit, the green re-run as evidence, $0.28 spent |
| The drift observatory | this plugin's own suite re-run on every Claude Code release: trend per case, versions covered, every run's report linked |
| The demo repo | a small Spring Boot API whose whole setup (cases, config, workflow) was written by /config-drift-checker:setup unattended, kept exactly as generated |
| The demo's drift index | the same observatory for that demo repo, built by its own CI |
| What a setup is worth | the first community suite (Spring Boot conventions) with a published with/without measurement: the guard hook is worth +0.75, the run itself |
| The site | one page with all of the above |
Quick start
One command in the repo whose setup you want protected:
claude plugin marketplace add jameskomo/config-drift-checker && claude plugin install config-drift-checker@jameskomo && claude "/config-drift-checker:setup"
Five minutes: it finds your CLAUDE.md, skills and hooks, writes starter eval cases from them,
smoke-runs them, and writes .cdc.yml plus the GitHub workflow. Prefer never opening Claude at
all? node <plugin-root>/tools/cdc-bootstrap.mjs . runs the same setup headlessly, and--no-agent scaffolds everything for $0 (blank starter case included) so you fill in the prompts
yourself. Add one secret
(CLAUDE_CODE_OAUTH_TOKEN from claude setup-token to run free on a Pro/Max subscription, orANTHROPIC_API_KEY), push, done.
Already have a suite in the claude plugin eval format? One step:
- uses: jameskomo/config-drift-checker/action@v0
with: { plugin-dir: . }
What you get
- A pinned baseline and a canary. Pinned model + Claude Code version is what every PR is
diffed against. The canary runs the alias your developers actually get, on the latest Claude
Code, only when a release actually shipped. It catches what changes underneath you before it
reaches everyone. - A diff that doesn't cry wolf. Each case has a noise band learned from its own history: a dip
inside the band warns instead of failing the build, and guards make sure a real break can never
hide in the band. Model refusals are labelled as refusals, not setup drift. - Red cases that diagnose themselves. Every run snapshots which skills the agent could see, so
a failed skill case says which repair it needs: discovered but never invoked (fix the trigger
wording) or not discovered (fix the packaging). Watch it happen on a real break. - Reports that show their work. Every report lists the whole suite including cases a filter or
budget skipped, every discovered skill and whether it fired, and exactly which checks ran beyond
a bareclaude plugin evalrun. Andtrace-keeperpreserves the official runner's transcripts,
which it otherwise deletes on exit. - Red check, PR comment, Slack alert, HTML report, drift index. Every grader's verdict with
its reason, tool calls, cost and turns per case, and a Pages-served index of every case across
every version. - Bump PRs. Two green canaries on a new model or version open a PR that moves your pins, with
the runs attached as evidence. Renovate did this for packages; nobody did it for models. - Hard budget caps.
.cdc.ymlcaps spend per run and per month; the Action refuses to start
past the cap. A busy release week cannot drain your key. On a Pro/Max subscription token, runs
cost $0 API credit. - Ablation, coverage, repair. With/without-plugin deltas show what each skill is worth;
coverage shows which of your rules have no test (coverage-mingates it); on a red run a skill
proposes the smallest setup fix and proves it by re-running the failing cases. - Fleet and org rollout, serverless. One reusable workflow in your org's
.githubrepo plus a
three-line caller installs the check on every repo;fleet.mjsfolds all their published
results into one dashboard with a pin policy, and skew from the policy is flagged per repo.
How this relates to claude plugin eval
Claude Code ships an eval runner, and it's good: it runs your cases, grades them, generates
starter cases with init, and writes a report. We build on it, not beside it: cases are in that
exact format, the Action prefers the official runner (bundled fallback for older versions), and aclaude plugin eval . --json out.json result feeds our diff, report and drift index directly.
claude plugin eval (built in) |
config-drift-checker | |
|---|---|---|
| Run cases, grade, report on one run | yes, it's the runner we build on | uses it |
| Generate starter cases | init |
/config-drift-checker:setup, same format |
| A stored baseline to diff against | no, you compare runs by eye | pinned baseline, promoted deliberately |
| History across releases | no, the docs advise pinning your model | every run kept; a drift index over every version |
| Flake vs break | no, a noisy case just fails sometimes | per-case noise bands with anti-masking guards |
| Watching Claude Code and model releases | no | release watch + canary, throttled by your budget |
| Pin bump PRs | no | two green canaries open a PR with evidence |
| Red check, PR comment, Slack | exit code | all three |
| Spend control | a per-run ceiling flag | per-run and per-month caps, enforced from a ledger |
| Coverage of your rules | no | percent, badge, coverage-min gate |
| Repair proposal on red | no | a PR with the smallest fix, proven live |
| Why a skill case failed | a score | discovered vs invoked: trigger wording or packaging |
| Transcripts | deleted when the command exits | trace-keeper copies them next to the JSON |
One sentence: their command answers "does my plugin work right now on my machine"; this answers
"did anything stop working since the baseline, across every release, without me watching".
Trust
Zero npm dependencies (Node builtins only), 88 tests that run against a fake claude with no API
key, every third-party action pinned to a verified commit SHA, CodeQL on every push. Runs on your
runner with your key; nothing is sent to us, because there is no us to send it to. Details in
docs/security.md.
What's here
config-drift-checker/ the plugin: skills (setup · run · write-case · repair) + the tools
tools/ shim runner · diff · classify · report · dashboard · coverage · watch · gate · promote · trace-keeper · fleet · bootstrap
test/ node --test suite, fake claude, npm test
action/ composite GitHub Action: gate → run → diff → store → PR → repair → alert
examples/komo-stack/ a full example suite with .cdc.yml and baseline results
docs/ user guide · architecture · eval format & runner · runbook · security
Documentation
Start with the user guide (.cdc.yml reference here); full index in docs/.
FAQ
Common questions
Discussion
Questions & comments · 0
Sign In Sign in to leave a comment.