agent-skill-eval 0.3.0__tar.gz → 0.4.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/.github/ISSUE_TEMPLATE/bug_report.yml +2 -2
  2. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/.github/workflows/ci.yml +1 -1
  3. agent_skill_eval-0.4.0/.github/workflows/release.yml +48 -0
  4. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/AGENTS.md +4 -4
  5. agent_skill_eval-0.4.0/CHANGELOG.md +305 -0
  6. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/CONTRIBUTING.md +2 -2
  7. agent_skill_eval-0.4.0/Makefile +107 -0
  8. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/PKG-INFO +34 -30
  9. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/README.md +30 -26
  10. agent_skill_eval-0.4.0/TODO.md +53 -0
  11. agent_skill_eval-0.4.0/config/.env.example +30 -0
  12. agent_skill_eval-0.4.0/config/baseline.env +21 -0
  13. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/pyproject.toml +30 -6
  14. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/schemas/evals.schema.json +1 -1
  15. {agent_skill_eval-0.3.0/src/skill_eval → agent_skill_eval-0.4.0/src/agent_skill_eval}/__init__.py +1 -1
  16. agent_skill_eval-0.4.0/src/agent_skill_eval/__main__.py +3 -0
  17. {agent_skill_eval-0.3.0/src/skill_eval → agent_skill_eval-0.4.0/src/agent_skill_eval}/cli.py +13 -15
  18. {agent_skill_eval-0.3.0/src/skill_eval → agent_skill_eval-0.4.0/src/agent_skill_eval}/git_state.py +1 -1
  19. {agent_skill_eval-0.3.0/src/skill_eval → agent_skill_eval-0.4.0/src/agent_skill_eval}/graders/__init__.py +2 -2
  20. {agent_skill_eval-0.3.0/src/skill_eval → agent_skill_eval-0.4.0/src/agent_skill_eval}/harnesses/__init__.py +12 -6
  21. {agent_skill_eval-0.3.0/src/skill_eval → agent_skill_eval-0.4.0/src/agent_skill_eval}/models.py +3 -0
  22. {agent_skill_eval-0.3.0/src/skill_eval → agent_skill_eval-0.4.0/src/agent_skill_eval}/runner.py +7 -7
  23. {agent_skill_eval-0.3.0/src/skill_eval → agent_skill_eval-0.4.0/src/agent_skill_eval}/skills.py +1 -1
  24. {agent_skill_eval-0.3.0/src/skill_eval → agent_skill_eval-0.4.0/src/agent_skill_eval}/workspace.py +3 -3
  25. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/tests/conftest.py +1 -1
  26. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/tests/test_cli_smoke.py +1 -1
  27. agent_skill_eval-0.4.0/tests/test_e2e.py +210 -0
  28. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/tests/test_fuzz_grader.py +2 -2
  29. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/tests/test_git_state.py +3 -3
  30. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/tests/test_graders.py +11 -11
  31. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/tests/test_harnesses.py +24 -1
  32. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/tests/test_launch_features.py +14 -14
  33. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/tests/test_llm_grader.py +1 -1
  34. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/tests/test_runner.py +32 -32
  35. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/tests/test_skill_validation.py +1 -1
  36. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/tests/test_skills.py +2 -2
  37. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/tests/test_workspace.py +2 -2
  38. agent_skill_eval-0.3.0/.github/workflows/publish.yml +0 -50
  39. agent_skill_eval-0.3.0/CHANGELOG.md +0 -94
  40. agent_skill_eval-0.3.0/TODO.md +0 -105
  41. agent_skill_eval-0.3.0/src/skill_eval/__main__.py +0 -3
  42. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  43. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  44. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/.github/actions/setup/action.yml +0 -0
  45. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/.gitignore +0 -0
  46. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/CODE_OF_CONDUCT.md +0 -0
  47. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/LICENSE +0 -0
  48. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/examples/commit-push-pr/evals/evals.json +0 -0
  49. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/examples/commit-push-pr/evals/files/sample_change.py +0 -0
  50. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/examples/fix-failing-tests/evals/evals.json +0 -0
  51. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/examples/fix-failing-tests/evals/files/calculator.py +0 -0
  52. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/examples/fix-failing-tests/evals/files/conftest.py +0 -0
  53. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/examples/fix-failing-tests/evals/files/test_calculator.py +0 -0
  54. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/examples/review-diff/evals/evals.json +0 -0
  55. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/examples/review-diff/evals/files/changes.diff +0 -0
  56. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/examples/review-diff/evals/files/orders.py +0 -0
  57. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/examples/validate-config/evals/evals.json +0 -0
  58. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/examples/validate-config/evals/files/app_config.json +0 -0
  59. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/examples/write-release-notes/evals/evals.json +0 -0
  60. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/examples/write-release-notes/evals/files/commits.txt +0 -0
  61. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/scripts/record-demo.sh +0 -0
  62. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/skills/commit-push-pr/SKILL.md +0 -0
  63. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/skills/fix-failing-tests/SKILL.md +0 -0
  64. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/skills/review-diff/SKILL.md +0 -0
  65. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/skills/validate-config/SKILL.md +0 -0
  66. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/skills/validate-config/references/config-rules.md +0 -0
  67. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/skills/validate-config/scripts/validate_config.py +0 -0
  68. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/skills/write-release-notes/SKILL.md +0 -0
  69. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/tests/__init__.py +0 -0
  70. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/tests/fixtures/evals/format-json.json +0 -0
  71. {agent_skill_eval-0.3.0 → agent_skill_eval-0.4.0}/tests/fixtures/skills/format-json/SKILL.md +0 -0
@@ -15,7 +15,7 @@ body:
15
15
  label: Steps to reproduce
16
16
  description: Minimal steps to reproduce the behavior
17
17
  placeholder: |
18
- 1. skill-eval run --skill ... --evals ... --agent opencode
18
+ 1. agent-skill-eval run --skill ... --evals ... --agent opencode
19
19
  2. ...
20
20
  validations:
21
21
  required: true
@@ -30,7 +30,7 @@ body:
30
30
  id: version
31
31
  attributes:
32
32
  label: Version
33
- description: Output of `skill-eval --version`
33
+ description: Output of `agent-skill-eval --version`
34
34
  - type: input
35
35
  id: python
36
36
  attributes:
@@ -37,7 +37,7 @@ jobs:
37
37
  - uses: ./.github/actions/setup
38
38
  with:
39
39
  python-version: ${{ matrix.python-version }}
40
- - run: pytest -v --junitxml=results.xml --cov=skill_eval --cov-report=xml:coverage.xml
40
+ - run: pytest -v --junitxml=results.xml --cov=agent_skill_eval --cov-report=xml:coverage.xml
41
41
  - name: Upload test results
42
42
  if: always()
43
43
  uses: actions/upload-artifact@v4
@@ -0,0 +1,48 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+
8
+ permissions:
9
+ contents: write
10
+ id-token: write
11
+
12
+ jobs:
13
+ release:
14
+ runs-on: ubuntu-latest
15
+ concurrency: release
16
+ environment:
17
+ name: pypi
18
+ url: https://pypi.org/project/agent-skill-eval/
19
+
20
+ steps:
21
+ - uses: actions/checkout@v4
22
+ with:
23
+ fetch-depth: 0
24
+ token: ${{ secrets.GITHUB_TOKEN }}
25
+
26
+ - name: Install uv
27
+ uses: astral-sh/setup-uv@v4
28
+
29
+ - name: Set up Python
30
+ run: uv python install 3.12
31
+
32
+ - name: Configure Git
33
+ run: |
34
+ git config user.name "github-actions[bot]"
35
+ git config user.email "github-actions[bot]@users.noreply.github.com"
36
+
37
+ - name: Semantic Release
38
+ env:
39
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
40
+ run: |
41
+ uv run --with 'python-semantic-release>=9,<10' semantic-release version
42
+ uv run --with 'python-semantic-release>=9,<10' semantic-release publish
43
+
44
+ - name: Build package
45
+ run: uv build
46
+
47
+ - name: Publish to PyPI
48
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## Project
4
4
 
5
- Python CLI framework (`skill-eval`) for evaluating agent skills across OpenCode, Claude Code, and Codex. Uses Typer, Pydantic, OpenAI SDK, and Rich.
5
+ Python CLI framework (`agent-skill-eval`) for evaluating agent skills across OpenCode, Claude Code, and Codex. Uses Typer, Pydantic, OpenAI SDK, and Rich.
6
6
 
7
7
  ## Quick commands
8
8
 
@@ -24,7 +24,7 @@ uv run --extra dev ruff check src/ tests/ && uv run --extra dev ruff format --ch
24
24
  ## Architecture
25
25
 
26
26
  ```
27
- src/skill_eval/
27
+ src/agent_skill_eval/
28
28
  ├── cli.py # Typer CLI app (run, report, grade, cleanup, init)
29
29
  ├── runner.py # EvalRunner orchestrates eval execution
30
30
  ├── graders/__init__.py # DeterministicGrader + LLMGrader (700+ lines, single file)
@@ -35,8 +35,8 @@ src/skill_eval/
35
35
  └── workspace.py # Workspace creation (fresh git init or clone)
36
36
  ```
37
37
 
38
- - Entry point: `skill_eval.cli:app` (registered as `skill-eval` console script)
39
- - Package layout: `src/skill_eval/` (hatchling build, wheel packages `src/skill_eval`)
38
+ - Entry point: `agent_skill_eval.cli:app` (registered as `agent-skill-eval` console script)
39
+ - Package layout: `src/agent_skill_eval/` (hatchling build, wheel packages `src/agent_skill_eval`)
40
40
  - The `fake` harness (used in tests) is a no-op agent that produces deterministic output
41
41
 
42
42
  ## Testing
@@ -0,0 +1,305 @@
1
+ # CHANGELOG
2
+
3
+
4
+ ## v0.4.0 (2026-06-11)
5
+
6
+ ### Bug Fixes
7
+
8
+ - Address Gemini review findings
9
+ ([`641b98b`](https://github.com/tardigrde/agent-skill-eval/commit/641b98be6f791832eb396f00939eca5da3522316))
10
+
11
+ - cost accumulation test: float-safe compare via pytest.approx - Makefile: default CLAUDE_CODE_MODEL
12
+ to a real Anthropic ID so the target works even without config/baseline.env - test-live: export
13
+ model vars so e2e tests use configured models instead of hardcoded fallbacks
14
+
15
+ Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
16
+
17
+ ### Continuous Integration
18
+
19
+ - Replace tag-triggered publish with semantic-release on main
20
+ ([`64a4cca`](https://github.com/tardigrde/agent-skill-eval/commit/64a4cca2a8c1461eef50339ad6eb909ed35658df))
21
+
22
+ Pushing to main now handles version bump, tag, GitHub release, and PyPI publish (trusted publishing)
23
+ automatically from conventional commits — no manual tag push. Pattern borrowed from gcpath.
24
+
25
+ Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
26
+
27
+ ### Features
28
+
29
+ - Codex harness fix, cost_usd metric, e2e milestone tests
30
+ ([`bb34a28`](https://github.com/tardigrde/agent-skill-eval/commit/bb34a287521bd1f4deb07176d4d396bdf1429e83))
31
+
32
+ - CodexHarness: replace deprecated --full-auto with --sandbox workspace-write and add
33
+ --skip-git-repo-check so codex runs in freshly git-inited eval workspaces without its trust
34
+ prompt. - TimingData: new cost_usd field; claude-code parses total_cost_usd, opencode sums
35
+ per-step cost. Cost, time, and accuracy are now all machine-readable per run for downstream skill
36
+ optimization. - tests/test_e2e.py: two-tier end-to-end tests exercising the real CLI as a
37
+ subprocess. Free tier (fake harness, no network) runs in every pytest invocation; live tier
38
+ (claude-code, opencode, codex + LLM grader) is opt-in via the `live` marker and locks in the
39
+ all-harnesses-complete-with-real-grades milestone. - Makefile: AGENTS variable, full-eval
40
+ (includes codex), test-e2e and test-live targets; config/baseline.env pins
41
+ claude-haiku-4-5-20251001 for claude-code (claude CLI validates --model client-side, so
42
+ OpenRouter-only slugs are rejected).
43
+
44
+ Verified: make test-live 7/7 passed; 232 unit tests; lint clean.
45
+
46
+ Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
47
+
48
+ - Converge all names on agent-skill-eval, add ase alias
49
+ ([`33f1084`](https://github.com/tardigrde/agent-skill-eval/commit/33f10842d56d2849fb04866bfbd0b230800de9a4))
50
+
51
+ Repo (skill-evals), CLI (skill-eval), and module (skill_eval) now all match the PyPI package name
52
+ agent-skill-eval. Short alias `ase` installs alongside the full command. Env var prefix
53
+ SKILL_EVAL_* renamed to ASE_*. Version 0.4.0.
54
+
55
+ Skills remain the only eval target for now; subagent evals are noted as coming soon in the README.
56
+
57
+ Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
58
+
59
+
60
+ ## v0.3.0 (2026-06-11)
61
+
62
+ ### Features
63
+
64
+ - 0.3.0 — validate-config + review-diff skills, changelog, PR template
65
+ ([`0423a50`](https://github.com/tardigrde/agent-skill-eval/commit/0423a50d03f3620428c790fd665959ae58ce9e74))
66
+
67
+
68
+ ## v0.2.1 (2026-06-11)
69
+
70
+ ### Chores
71
+
72
+ - Rename package to agent-skill-eval, bump to 0.2.1
73
+ ([`6a42b78`](https://github.com/tardigrde/agent-skill-eval/commit/6a42b78a73e8668da5c85d21ac7dd6b5141e9679))
74
+
75
+ Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
76
+
77
+
78
+ ## v0.2.0 (2026-06-10)
79
+
80
+ ### Bug Fixes
81
+
82
+ - Address review findings (Gemini + self-review)
83
+ ([`5316e99`](https://github.com/tardigrde/agent-skill-eval/commit/5316e997d4a09676cdf760287fa592aa18cdb40b))
84
+
85
+ - explicit UTF-8 encoding on all file reads/writes and subprocess output capture (Windows cp1252
86
+ would corrupt agent output) - LLM judge workspace listing uses os.walk with in-place pruning so
87
+ excluded trees (.git, skill dirs) are never traversed - reject blank bare --agent-model specs -
88
+ harness no longer retries when the failed attempt already mutated the workspace (a second run
89
+ would grade the union of both attempts) - warn when an agent ends up with no with/without-skill
90
+ delta because all runs in one config errored - publish workflow verifies the git tag matches
91
+ pyproject version - README documents that re-grading judges from saved artifacts, not the deleted
92
+ live workspace
93
+
94
+ Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
95
+
96
+ - Assertion routing bugs found by live smoke runs
97
+ ([`dd31f03`](https://github.com/tardigrde/agent-skill-eval/commit/dd31f035ef95f4035d35c611fb62534c61fac144))
98
+
99
+ - "pr" matched as substring routed "prominently"/"present" prose assertions to the PR check; now
100
+ word-boundary (\bprs?\b, pull request) - "The file `X` exists" did not match the file-existence
101
+ check - contains/includes assertions with no quoted pattern now fall through to the LLM grader
102
+ instead of failing deterministically
103
+
104
+ Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
105
+
106
+ - Complete handoff review fixes and tighten PR grading
107
+ ([`311bd88`](https://github.com/tardigrde/agent-skill-eval/commit/311bd885da5126b22ee27e6a436ebb920625ffed))
108
+
109
+ Address all remaining findings from the review handoff:
110
+
111
+ - Branch grading requires a newly created eval branch (Finding A): state_diff exposes eval_branch,
112
+ post.current_branch; grader fails on checkout-of-existing-branch scenarios. - Commit grading
113
+ requires a new commit on the eval branch (Finding B): full SHAs captured in branch_heads,
114
+ commit_shas, head_sha; grader fails on HEAD-advanced-without-new-commit. - Push grading matches
115
+ created branch and commit (Finding C): remote_branch_heads captured via for-each-ref; grader
116
+ requires remote branch head to match local HEAD for the eval branch. - PR grading matches the
117
+ created branch and requires OPEN state (Finding D, remaining gap): headRefName match, state ==
118
+ OPEN filter, optional gh pr view direct-lookup corroboration, and rescue when state-delta is
119
+ empty. - Cleanup manifest uses remote branch delta only (Finding E): CleanupManifest.branches
120
+ renamed to remote_branches; deleted branches come from post.remote_branches - pre.remote_branches.
121
+ - Cleanup only deletes recorded workspaces (Finding F): no more glob-delete of skill-eval-*;
122
+ missing-manifest now warns and skips. - grade --recompute-benchmark recovers agent identity from
123
+ run_meta.json (Finding G): RunMeta model, per-config persistence, backwards-compatible fallback to
124
+ 'unknown'. - Negative-control eval has inverted branch/commit/push/PR assertions (Finding H). -
125
+ Test/lint command documentation updated to uv run --extra dev (Finding I). - uv.lock gitignored;
126
+ CI stays on pip (Finding J, option b). - README documents new files, flags, schema, cleanup
127
+ warning (Finding K). - Output directory layout includes agent segment eval-<id>/<agent>/<config>/
128
+ (Finding L).
129
+
130
+ Also remove dead duplicate return in _check_pr_created and update PR test fixtures with state
131
+ fields.
132
+
133
+ 98 tests pass.
134
+
135
+ - Give LLM judge real workspace context
136
+ ([`70fce85`](https://github.com/tardigrde/agent-skill-eval/commit/70fce85004a9dfb75a278f312715cf5c88985a9d))
137
+
138
+ The rubric grader derived the workspace from the results dir, so the judge never saw the agent's
139
+ artifacts and failed content assertions with "cannot verify". Now grade_assertions passes the live
140
+ workspace through, small text files (<=4KB, max 10) are inlined into the judge prompt, and
141
+ skill-install/VCS dirs are excluded so the skill text does not leak into grading.
142
+
143
+ Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
144
+
145
+ - Grader model validation, add tests, and address review issues
146
+ ([`d642c59`](https://github.com/tardigrde/agent-skill-eval/commit/d642c598b7545c6421c1fdf96c05a88283c00a03))
147
+
148
+ Source fixes: - Add EvalCase contradiction validator (force_skill_invocation + should_trigger) - Fix
149
+ LLMGrader to fail missing assertions instead of silently dropping them
150
+
151
+ Test improvements: - Add conftest.py with shared fixtures (deduplicate _init_git_workspace, grader,
152
+ evals_path) - Add test_llm_grader.py: 18 tests covering client property, base_url, prompt shape,
153
+ JSON parsing, API errors, partial results, missing fields, file listing - Rewrite
154
+ test_fuzz_grader.py: real handler tests instead of mocked dispatch - Add _check_command_ran
155
+ coverage for all hardcoded commands + unknown command - Add test_compute_benchmark with xfail for
156
+ known multi-agent delta=0 bug - Add EvalCase validation tests (valid, negative control,
157
+ contradiction) - Add SkillInstaller.uninstall tests (empty parent removal) - Add
158
+ WorkspaceManager._clone_repo test - Add github_repo_slug tests for URLs without .git suffix -
159
+ Remove dead _init_workspace_with_changes helper from test_runner.py
160
+
161
+ Note: deepseek/deepseek-v4-flash is a valid OpenRouter model, not fictitious as claimed in TODO.md.
162
+ Default grader model left unchanged.
163
+
164
+ - Implement github_repo_slug function to parse GitHub URLs and update related usages
165
+ ([`a20e817`](https://github.com/tardigrde/agent-skill-eval/commit/a20e8177fbbfb42c08b15000f6c54d957ae64981))
166
+
167
+ - Openrouter grader, opencode parser, workspace-aware grading, dotenv support
168
+ ([`ff851a8`](https://github.com/tardigrde/agent-skill-eval/commit/ff851a87bf6934dd1ba69e5fcb9b2c9759484df2))
169
+
170
+ - Tighten evals with state-delta grading, scoped cleanup, and proper re-grading
171
+ ([`1b175d3`](https://github.com/tardigrde/agent-skill-eval/commit/1b175d30d1522b78b1b7564a25bf2da07077065a))
172
+
173
+ Addresses review findings from PR #2:
174
+
175
+ - Add pre/post git state capture (GitStateSnapshot) including PR list from the source repo,
176
+ persisted as pre_state.json / post_state.json per run. - Rework DeterministicGrader to grade
177
+ against the state delta (new branches, HEAD advance, new remote refs, new PRs) instead of loose
178
+ workspace state or agent output text. Existing branches/commits/PRs at baseline can no longer
179
+ satisfy "new branch", "new commit", or "new PR" assertions. - Implement should_trigger=False
180
+ semantics: branch/commit/push/pr assertions are inverted to "MUST NOT" for negative controls, so
181
+ the negative-control eval fails if the skill incorrectly triggers. - Stop auto-prepending 'Use the
182
+ $skill' to every with-skill prompt. Eval prompts decide for themselves; opt in via
183
+ force_skill_invocation: true on EvalCase for tests that need to assert the skill is reachable by
184
+ name. - Add stage_files: true to EvalCase so eval prompts that say 'I have changes staged'
185
+ actually have staged changes. - Replace broad cleanup (closes all open PRs, deletes all
186
+ non-default branches) with manifest-driven cleanup: each run records the exact branches and PRs it
187
+ created in cleanup.json, and _cleanup_manifest removes only those. Falls back to workspace-only
188
+ cleanup when no manifest is present. - Make 'skill-eval grade' re-grade with the saved eval
189
+ metadata and state artifacts, persist grading.json, and optionally recompute benchmark.json.
190
+ Persist evals_meta.json during run. - Refactor _compute_benchmark / _compute_stats into
191
+ module-level compute_benchmark / compute_stats so they can be called from the grade command
192
+ without an EvalRunner instance. - Update evals.json: explicit-invoke and no-changes opt in to
193
+ force_skill_invocation; explicit-invoke stages its fixtures. - Tests: rewrite grader tests around
194
+ state deltas, add negative-control tests, add 'existing artifact does not satisfy' tests, add
195
+ scoped cleanup tests, add prompt-construction tests, add grade-command persistence tests, add
196
+ evals_meta persistence test. 73/73 tests pass.
197
+
198
+ ### Continuous Integration
199
+
200
+ - Add Python version matrix, caching, coverage, and smoke test job
201
+ ([`f1d2a88`](https://github.com/tardigrde/agent-skill-eval/commit/f1d2a880e5fa66ad67f26d999a0614c86b6b1e39))
202
+
203
+ - Add Python 3.11/3.12/3.13 matrix to lint and test jobs - Add composite action
204
+ (.github/actions/setup) with pip caching - Add concurrency block (cancel-in-progress) and
205
+ permissions (contents: read) - Add pytest --junitxml and --cov with artifact upload - Add smoke
206
+ test as separate job (runs after lint+test) - Add pytest-cov to dev dependencies
207
+
208
+ ### Documentation
209
+
210
+ - Add LICENSE, CHANGELOG, CONTRIBUTING, issue templates, --version flag, and fill pyproject metadata
211
+ ([#6](https://github.com/tardigrde/agent-skill-eval/pull/6),
212
+ [`7a1db3d`](https://github.com/tardigrde/agent-skill-eval/commit/7a1db3d71a7a6b8c87f397053d2e94cf0ac571f0))
213
+
214
+ * docs: add LICENSE, CHANGELOG, CONTRIBUTING, issue templates, --version flag, and fill pyproject
215
+ metadata
216
+
217
+ - Add MIT LICENSE file - Add CHANGELOG.md from git history (3 releases) - Add CONTRIBUTING.md,
218
+ CODE_OF_CONDUCT.md, .github/ISSUE_TEMPLATE/ - Fill pyproject.toml: authors, readme, homepage,
219
+ repository, keywords, classifiers - Unify version source: pyproject.toml is single source,
220
+ __init__.py reads via importlib.metadata - Add --version/-v flag to CLI via typer callback -
221
+ Document python -m skill_eval entry point in README - Document examples/ vs skills/ directory
222
+ convention - Update negative-control example to match real evals.json assertions (push + content
223
+ checks) - Add grading.json evidence debugging section to README
224
+
225
+ * fix: correct repo URLs, move project.urls, fix CLI help fallback, reorder CHANGELOG
226
+
227
+ - CONTRIBUTING.md: fix clone URL and cd dir to tardigrde/skill-evals - pyproject.toml: move
228
+ homepage/repository out of [project] into [project.urls] as PEP 621-compliant Homepage/Repository
229
+ keys; update URLs to tardigrde/skill-evals - src/skill_eval/cli.py: print help and exit when
230
+ skill-eval is invoked with no subcommand - CHANGELOG.md: reorder to newest-first per Keep a
231
+ Changelog convention; relabel earliest entry [0.1.0] -> [0.1.0-alpha.1]
232
+
233
+ Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
234
+
235
+ ---------
236
+
237
+ Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
238
+
239
+ ### Features
240
+
241
+ - 0.2.0 — pass@k, per-agent deltas, model pinning, validate/list/compare, write-release-notes
242
+ example
243
+ ([`0d0ac3b`](https://github.com/tardigrde/agent-skill-eval/commit/0d0ac3b1aa737475228bdd8a22c8bc877934d596))
244
+
245
+ - fix multi-agent benchmark: per-agent deltas instead of silent 0.0 - --runs N with full_pass_rate /
246
+ pass@k in benchmark.json - --agent-model agent=model, --harness-base-url, --timeout, --retries -
247
+ harness retry/backoff; exit_code/timed_out/retries recorded in timing.json - ungradeable
248
+ assertions skipped (not failed); method/skipped in grading.json - new commands: validate, list,
249
+ compare; report --format markdown --show-evidence - richer init scaffold (SKILL.md template +
250
+ negative control) - write-release-notes example skill (LLM-rubric-heavy, offline) - evals.json
251
+ JSON Schema + sync test; SKILL.md frontmatter warnings - PyPI trusted-publishing workflow; README
252
+ restructured; demo script
253
+
254
+ Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
255
+
256
+ - Add CI workflow, improve project structure, and enhance testing coverage
257
+ ([`a20cf73`](https://github.com/tardigrde/agent-skill-eval/commit/a20cf738368eba65b2e237ab2b569af46486adc0))
258
+
259
+ - Add fix-failing-tests skill for error recovery evaluation
260
+ ([#7](https://github.com/tardigrde/agent-skill-eval/pull/7),
261
+ [`d9f1464`](https://github.com/tardigrde/agent-skill-eval/commit/d9f1464a87ca451c179c511bf127d46d190660eb))
262
+
263
+ * feat: add fix-failing-tests skill for error recovery evaluation
264
+
265
+ Add second example skill that tests the highest-signal agent capability: error recovery / iterative
266
+ refinement (Reflexion, SWE-bench).
267
+
268
+ Skill: agent runs pytest, diagnoses 3 subtle bugs in calculator.py, fixes source code (not tests),
269
+ verifies all 15 tests pass.
270
+
271
+ Bugs: - average: divides by (count-1) instead of count → ZeroDivisionError + wrong results -
272
+ factorial: range(1,n) instead of range(1,n+1) → off-by-one - is_palindrome: missing .lower() →
273
+ case-sensitive comparison fails
274
+
275
+ 4 eval cases: explicit-invoke, implicit-invoke, contextual-invoke, negative-control. Offline, zero
276
+ dependencies, deterministic grading via pytest pass/fail.
277
+
278
+ Verified with opencode: agent fixed all 3 bugs in ~30s.
279
+
280
+ * fix: add conftest.py sys.path fixture and tighten fix-failing-tests evals
281
+
282
+ - Add files/conftest.py that inserts its own directory into sys.path so pytest can resolve `from
283
+ calculator import ...` regardless of the working directory from which pytest is invoked. - Add
284
+ "files/conftest.py" to the files array of every eval case that includes test_calculator.py
285
+ (explicit-invoke, implicit-invoke, contextual-invoke). - Remove "files/test_calculator.py" from
286
+ the negative-control case, matching the commit-push-pr convention of minimal fixture files and
287
+ avoiding baiting the agent into running tests.
288
+
289
+ Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
290
+
291
+ ---------
292
+
293
+ Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
294
+
295
+ - Check actual outcomes (branches, commits, PRs) instead of just agent text output
296
+ ([`9127fe7`](https://github.com/tardigrde/agent-skill-eval/commit/9127fe7ec69d12b0c0d60df72dae8aa525fe366f))
297
+
298
+ - Improve commit-push-pr skill to 100% pass rate and add cleanup command
299
+ ([`8e6dfc9`](https://github.com/tardigrde/agent-skill-eval/commit/8e6dfc9b61311f2cc3d32ed283040663e2c8d6db))
300
+
301
+ - Fix evals.json file paths (evals/files/ -> files/) - Fix assertion quotes for grader parsing
302
+ (single quotes -> backticks) - Improve SKILL.md with autonomous execution directive - Clarify what
303
+ counts as changes (include untracked, exclude agent config) - Add cleanup command to close PRs,
304
+ delete branches, remove workspaces - Add --cleanup flag to run command for automatic post-eval
305
+ cleanup
@@ -3,8 +3,8 @@
3
3
  ## Setup
4
4
 
5
5
  ```bash
6
- git clone https://github.com/tardigrde/skill-evals.git
7
- cd skill-evals
6
+ git clone https://github.com/tardigrde/agent-skill-eval.git
7
+ cd agent-skill-eval
8
8
  uv venv
9
9
  uv pip install -e ".[dev]"
10
10
  ```
@@ -0,0 +1,107 @@
1
+ # agent-skill-eval Makefile
2
+ #
3
+ # Usage:
4
+ # make cheap-eval SKILL=examples/fix-failing-tests EVALS=examples/fix-failing-tests/evals/evals.json
5
+ # make fake-eval SKILL=examples/fix-failing-tests EVALS=examples/fix-failing-tests/evals/evals.json
6
+ # make test
7
+ # make lint
8
+ #
9
+ # OpenRouter setup (set in shell or .env):
10
+ # OPENROUTER_API_KEY=sk-or-...
11
+ # ANTHROPIC_BASE_URL=https://openrouter.ai/api # claude-code reads this
12
+ # ANTHROPIC_AUTH_TOKEN=$OPENROUTER_API_KEY # claude-code auth via OpenRouter
13
+ # ANTHROPIC_API_KEY= # must be blank when using OpenRouter
14
+ # OPENAI_BASE_URL=https://openrouter.ai/api/v1 # opencode reads this
15
+
16
+ # ── Defaults ────────────────────────────────────────────────────────────────
17
+
18
+ # Read OPENROUTER_API_KEY from .env if not already in shell
19
+ OPENROUTER_API_KEY ?= $(shell grep -s '^OPENROUTER_API_KEY' .env | cut -d= -f2- | tr -d '"' | tr -d "'")
20
+
21
+ SKILL ?= skills/fix-failing-tests
22
+ EVALS ?= examples/fix-failing-tests/evals/evals.json
23
+
24
+ # Pinned free/cheap models (see config/baseline.env to override).
25
+ # claude-code needs a real Anthropic model ID: the claude CLI validates
26
+ # --model client-side and rejects OpenRouter-only slugs.
27
+ CLAUDE_CODE_MODEL ?= claude-haiku-4-5-20251001
28
+ OPENCODE_MODEL ?= deepseek/deepseek-v4-flash:free
29
+ CODEX_MODEL ?= gpt-5.4-mini
30
+ GRADER_MODEL ?= deepseek/deepseek-v4-flash:free
31
+
32
+ # Agents to run (space-separated). Override: make cheap-eval AGENTS="fake codex"
33
+ AGENTS ?= fake claude-code opencode
34
+
35
+ WORKSPACE ?= eval-workspace
36
+ CONCURRENCY ?= 3
37
+
38
+ -include config/baseline.env
39
+
40
+ AGENT_FLAGS = $(foreach a,$(AGENTS),--agent $(a))
41
+
42
+ # ── Targets ──────────────────────────────────────────────────────────────────
43
+
44
+ .PHONY: cheap-eval full-eval fake-eval test test-e2e test-live lint help
45
+
46
+ ## cheap-eval: $(AGENTS) in parallel with cheap/free models
47
+ ## claude-code routes via OpenRouter (needs OPENROUTER_API_KEY in .env).
48
+ ## opencode routes via its own Zen provider (needs zen auth, no extra env).
49
+ ## codex uses ~/.codex auth + config.toml model (run via full-eval or AGENTS=).
50
+ cheap-eval: export ANTHROPIC_BASE_URL = https://openrouter.ai/api
51
+ cheap-eval: export ANTHROPIC_AUTH_TOKEN = $(OPENROUTER_API_KEY)
52
+ cheap-eval: export ANTHROPIC_API_KEY =
53
+ cheap-eval:
54
+ uv run agent-skill-eval run \
55
+ --skill $(SKILL) \
56
+ --evals $(EVALS) \
57
+ $(AGENT_FLAGS) \
58
+ --agent-model "claude-code=$(CLAUDE_CODE_MODEL)" \
59
+ --agent-model "opencode=$(OPENCODE_MODEL)" \
60
+ --agent-model "codex=$(CODEX_MODEL)" \
61
+ --grader-model "$(GRADER_MODEL)" \
62
+ --workspace $(WORKSPACE) \
63
+ --concurrency $(CONCURRENCY) \
64
+ --no-baseline
65
+
66
+ ## full-eval: cheap-eval plus codex (needs ~/.codex/auth.json login)
67
+ full-eval: AGENTS = fake claude-code opencode codex
68
+ full-eval: cheap-eval
69
+
70
+ ## fake-eval: fake harness only — zero API cost, CI-safe, no env vars needed
71
+ fake-eval:
72
+ uv run agent-skill-eval run \
73
+ --skill $(SKILL) \
74
+ --evals $(EVALS) \
75
+ --agent fake \
76
+ --grader-model "" \
77
+ --workspace $(WORKSPACE) \
78
+ --concurrency 1
79
+
80
+ ## test: run unit + smoke tests (includes free e2e pipeline test)
81
+ test:
82
+ uv run pytest -v --cov=agent_skill_eval --cov-report=term-missing tests/
83
+
84
+ ## test-e2e: free end-to-end pipeline tests only (fake harness, no API calls)
85
+ test-e2e:
86
+ uv run pytest -v tests/test_e2e.py -m "not live"
87
+
88
+ ## test-live: paid e2e tests against real agents + grader (claude-code, opencode, codex)
89
+ test-live: export ASE_LIVE = 1
90
+ test-live: export ANTHROPIC_BASE_URL = https://openrouter.ai/api
91
+ test-live: export ANTHROPIC_AUTH_TOKEN = $(OPENROUTER_API_KEY)
92
+ test-live: export ANTHROPIC_API_KEY =
93
+ test-live: export CLAUDE_CODE_MODEL := $(CLAUDE_CODE_MODEL)
94
+ test-live: export OPENCODE_MODEL := $(OPENCODE_MODEL)
95
+ test-live: export CODEX_MODEL := $(CODEX_MODEL)
96
+ test-live: export GRADER_MODEL := $(GRADER_MODEL)
97
+ test-live:
98
+ uv run pytest -v tests/test_e2e.py -m live
99
+
100
+ ## lint: ruff check + format check
101
+ lint:
102
+ uv run ruff check src/ tests/
103
+ uv run ruff format --check src/ tests/
104
+
105
+ ## help: list targets
106
+ help:
107
+ @grep -E '^## ' Makefile | sed 's/## / /'