Skip to content

ci: run claude plugin eval on PRs with workload identity federation - #22

Merged
jimisola merged 4 commits into
mainfrom
ci/plugin-evals
Oct 11, 2026
Merged

jimisola merged 4 commits into
mainfrom
ci/plugin-evals

Conversation

@jimisola

@jimisola jimisola commented Oct 10, 2026 •

Copy link
Copy Markdown
Owner

What & Why

Closes #18. Implements the workflow from that issue. On PRs that touch plugins/*/skills/** or plugins/*/evals/**, it runs claude plugin eval for each changed plugin that has evals; a change to the workflow itself runs every suite. workflow_dispatch runs chosen (or all) plugins, optionally with the no-plugin baseline.

  • Auth: workload identity federation; no ANTHROPIC_API_KEY exists anywhere, and the step unsets it in case. Each GitHub OIDC token can be exchanged only once (check_jti), and one eval fires parallel judge calls, so the job exchanges a fresh token per eval case and runs that case on the minted access token (ANTHROPIC_AUTH_TOKEN, masked).
  • Inert until set up: the job is skipped while the ANTHROPIC_FEDERATION_RULE_ID repository variable is empty, and for fork PRs (no OIDC token).
  • Pinned: Claude Code 2.1.296, claude-sonnet-5-5 under test and as judge (Haiku failed correct long answers).
  • Gates: --threshold 0.8, --max-cost-usd 1 per case, --ablation none unless the baseline is asked for.
  • Cost tracking: the job summary shows total cost and duration, the Claude Code version, models and per-case scores; JSON results are uploaded as an artifact.

Setup (done)

  • Console: issuer github-actions, rule claude-plugins-ci with subject prefix repo:jimisola@1577689/claude-plugins@1305641786:* (this repo uses GitHub's immutable subject), owner/repository claims, and a condition allowing pull_request, or workflow_dispatch on main. Workspace ci-evals-personal with a spend limit.
  • Repository variables: ANTHROPIC_FEDERATION_RULE_ID, ANTHROPIC_ORGANIZATION_ID, ANTHROPIC_SERVICE_ACCOUNT_ID, ANTHROPIC_WORKSPACE_ID.

Test Plan

Runs the eval suites of the plugins a PR touches, authenticated by exchanging the job's GitHub OIDC token (no API key). Skips until the federation repository variables exist and for fork PRs. Refs #18.

Signed-off-by: Jimisola Laursen <jimisola@jimisola.com>
A change to the workflow is tested against all plugins with evals, so a PR that edits it gets a real run.

Signed-off-by: Jimisola Laursen <jimisola@jimisola.com>
GitHub tokens are single-use at Anthropic's token exchange (jti replay protection), and one eval run fires its judge calls in parallel, so a shared identity-token file produced jti_reused denials. Each case now gets its own exchange in the workflow and runs on the minted access token; replay protection stays on.

Signed-off-by: Jimisola Laursen <jimisola@jimisola.com>
Haiku failed correct long answers on fork-config-location and merged-before-ci; Sonnet passed the same cases 9/9 votes.

Signed-off-by: Jimisola Laursen <jimisola@jimisola.com>
@jimisola
jimisola merged commit a4939ca into main Oct 11, 2026
1 check passed
@jimisola
jimisola deleted the ci/plugin-evals branch October 12, 2026 18:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Run claude plugin eval in CI with workload identity federation

1 participant