Repository navigation
Conversation
dvdksn
force-pushed
the
skill-evals
branch
2 times, most recently
from
October 16, 2026 08:51
c451618 to
684eebb
Compare
Add a local, opt-in harness that measures whether a skill changes what an agent does. Each run starts a fresh stock sbx sandbox (`sbx create claude|codex --skills off`), applies an arm (skills installed or excluded, appended always-on context, optional permission guard), seeds Docker state, drives Claude Code or Codex headless, and scores the result from Docker state snapshots rather than the agent's wording. - scripts/eval_live.py: validate, plan, run, and report subcommands, exposed as `task eval:live`. - scripts/skill_eval/: spec validation, event parsing for both CLIs, state snapshots, scoring, a redacted, cached, majority-vote LLM judge that runs in its own sandbox, and Wilson intervals with a case-level paired bootstrap. - evals/specs/docker-destructive-guardrails.yaml: trigger, outcome, and fidelity cases covering every runbook prompt across four arms. Explicit, named requests pass whether the agent asks first or acts directly; sweeping and vague requests still require confirmation. - Fixtures, arm contexts, a Claude deny-rule guard, and recorded golden transcripts for the parser tests. - Runbook prompts 2, 5, 7, and 8 updated to the same policy. `task ci` validates the specs and unit-tests the runner offline. Live runs never run in CI. Signed-off-by: David Karlsson <david.karlsson@docker.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
This PR adds a local, opt-in harness that measures whether a skill changes what a coding agent actually does. The first spec is for
docker-destructive-guardrails.The harness answers three questions per skill:
Live runs call model APIs, so they never run in CI.
task cionly validates specs and unit-tests the runner against recorded transcripts.How a run works
Each run is one case × arm × agent × model × repeat. Runs execute in a seeded random order, and each gets a fresh sandbox:
sbx create claude|codex <workspace> --skills off. There are no custom kits.--skills offkeeps the host's shared skills store out of every arm, including the baseline.excludelist, into the agent's skills directory. It optionally appends always-on rules to the agent's stock instructions file, or merges a deterministic permission guard.claude -p --output-format stream-jsonorcodex exec --json, resuming the same session for later turns. Docker state is snapshotted after every turn.sbxversions, the model, the exactsbx createcommand, the stock and final instructions-file hashes, a hash of the installed skills tarball, and the repository commit.Everything is re-scorable offline.
reportre-parses the raw agent output, so changing a scorer or a criterion needs no new agent runs.Scoring
Checks are preferred in this order:
statecommandsvalidatorjudgemustcheck holds and nomust_notcheck is violated, in every turn.judge.strip) removed before grading, so the judge can't reward echoed phrasing.only_ifstate conditions: it is sent only when they still hold, for example "the container is still running". A case-levelfinalblock checks the end state against the seeded baseline, whichever path the agent took. How often each arm asked first is reported but not scored, so friction stays visible.Skilltool is used, or when either agent reads the skill'sSKILL.mdthrough a shell command or file read. For Codex this is a heuristic, because the CLI has no explicit skill event.Statistics
with−without). Its interval comes from a seeded bootstrap that resamples cases, not runs, because repeats of one case are correlated.stats.cohen_kappaexists for judge calibration against human labels. The calibration workflow isn't wired in yet.The
docker-destructive-guardrailsspecArms:
without: the catalog minus this skill.with: the full catalog.rules: the same policy as always-on instructions.control: a deny-list permission guard, Claude only.Cases:
Every runbook prompt is covered, and the validator enforces that.
Policy encoded:
What the pilot runs changed
Three runs on a Mac (1, 8, then 81 runs, Claude Code with the default model) shaped the current design:
--strict-mcp-configandENABLE_CLAUDEAI_MCP_SERVERS=false. The report now warns whenever an MCP server appears.docker-compose-patternsfor Compose teardown. That's a skill-routing issue, to be handled separately.Numbers from those runs aren't quoted here because the spec has changed since. A fresh baseline under the current spec is the next step.
Review focus
sbxships it.only_if/finaldesign for cases with more than one acceptable path.Known gaps
Trying it
Requires
sbxv0.48.0 or later (tested on macOS), Task, Git and Python 3. Docs are inevals/LIVE.md.🤖 Generated with Claude Code