agent-skill-eval 0.2.1__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.
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/.github/ISSUE_TEMPLATE/bug_report.yml +2 -2
- agent_skill_eval-0.4.0/.github/PULL_REQUEST_TEMPLATE.md +9 -0
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/.github/workflows/ci.yml +1 -1
- agent_skill_eval-0.4.0/.github/workflows/release.yml +48 -0
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/AGENTS.md +4 -4
- agent_skill_eval-0.4.0/CHANGELOG.md +305 -0
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/CONTRIBUTING.md +2 -2
- agent_skill_eval-0.4.0/Makefile +107 -0
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/PKG-INFO +37 -31
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/README.md +33 -27
- agent_skill_eval-0.4.0/TODO.md +53 -0
- agent_skill_eval-0.4.0/config/.env.example +30 -0
- agent_skill_eval-0.4.0/config/baseline.env +21 -0
- agent_skill_eval-0.4.0/examples/review-diff/evals/evals.json +45 -0
- agent_skill_eval-0.4.0/examples/review-diff/evals/files/changes.diff +21 -0
- agent_skill_eval-0.4.0/examples/review-diff/evals/files/orders.py +22 -0
- agent_skill_eval-0.4.0/examples/validate-config/evals/evals.json +57 -0
- agent_skill_eval-0.4.0/examples/validate-config/evals/files/app_config.json +10 -0
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/pyproject.toml +30 -6
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/schemas/evals.schema.json +1 -1
- agent_skill_eval-0.4.0/skills/review-diff/SKILL.md +85 -0
- agent_skill_eval-0.4.0/skills/validate-config/SKILL.md +91 -0
- agent_skill_eval-0.4.0/skills/validate-config/references/config-rules.md +33 -0
- agent_skill_eval-0.4.0/skills/validate-config/scripts/validate_config.py +68 -0
- {agent_skill_eval-0.2.1/src/skill_eval → agent_skill_eval-0.4.0/src/agent_skill_eval}/__init__.py +2 -2
- agent_skill_eval-0.4.0/src/agent_skill_eval/__main__.py +3 -0
- {agent_skill_eval-0.2.1/src/skill_eval → agent_skill_eval-0.4.0/src/agent_skill_eval}/cli.py +13 -15
- {agent_skill_eval-0.2.1/src/skill_eval → agent_skill_eval-0.4.0/src/agent_skill_eval}/git_state.py +1 -1
- {agent_skill_eval-0.2.1/src/skill_eval → agent_skill_eval-0.4.0/src/agent_skill_eval}/graders/__init__.py +2 -2
- {agent_skill_eval-0.2.1/src/skill_eval → agent_skill_eval-0.4.0/src/agent_skill_eval}/harnesses/__init__.py +12 -6
- {agent_skill_eval-0.2.1/src/skill_eval → agent_skill_eval-0.4.0/src/agent_skill_eval}/models.py +3 -0
- {agent_skill_eval-0.2.1/src/skill_eval → agent_skill_eval-0.4.0/src/agent_skill_eval}/runner.py +7 -7
- {agent_skill_eval-0.2.1/src/skill_eval → agent_skill_eval-0.4.0/src/agent_skill_eval}/skills.py +1 -1
- {agent_skill_eval-0.2.1/src/skill_eval → agent_skill_eval-0.4.0/src/agent_skill_eval}/workspace.py +3 -3
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/tests/conftest.py +1 -1
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/tests/test_cli_smoke.py +1 -1
- agent_skill_eval-0.4.0/tests/test_e2e.py +210 -0
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/tests/test_fuzz_grader.py +2 -2
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/tests/test_git_state.py +3 -3
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/tests/test_graders.py +11 -11
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/tests/test_harnesses.py +24 -1
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/tests/test_launch_features.py +14 -14
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/tests/test_llm_grader.py +1 -1
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/tests/test_runner.py +32 -32
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/tests/test_skill_validation.py +1 -1
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/tests/test_skills.py +2 -2
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/tests/test_workspace.py +2 -2
- agent_skill_eval-0.2.1/.github/workflows/publish.yml +0 -50
- agent_skill_eval-0.2.1/CHANGELOG.md +0 -83
- agent_skill_eval-0.2.1/TODO.md +0 -105
- agent_skill_eval-0.2.1/src/skill_eval/__main__.py +0 -3
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/.github/actions/setup/action.yml +0 -0
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/.gitignore +0 -0
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/CODE_OF_CONDUCT.md +0 -0
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/LICENSE +0 -0
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/examples/commit-push-pr/evals/evals.json +0 -0
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/examples/commit-push-pr/evals/files/sample_change.py +0 -0
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/examples/fix-failing-tests/evals/evals.json +0 -0
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/examples/fix-failing-tests/evals/files/calculator.py +0 -0
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/examples/fix-failing-tests/evals/files/conftest.py +0 -0
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/examples/fix-failing-tests/evals/files/test_calculator.py +0 -0
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/examples/write-release-notes/evals/evals.json +0 -0
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/examples/write-release-notes/evals/files/commits.txt +0 -0
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/scripts/record-demo.sh +0 -0
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/skills/commit-push-pr/SKILL.md +0 -0
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/skills/fix-failing-tests/SKILL.md +0 -0
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/skills/write-release-notes/SKILL.md +0 -0
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/tests/__init__.py +0 -0
- {agent_skill_eval-0.2.1 → agent_skill_eval-0.4.0}/tests/fixtures/evals/format-json.json +0 -0
- {agent_skill_eval-0.2.1 → 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=
|
|
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/
|
|
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: `
|
|
39
|
-
- Package layout: `src/
|
|
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
|
|
@@ -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/## / /'
|