Skip to content

chore(evals): fix stale docs and drifted Makefile defaults#1237

Merged
Cali0707 merged 3 commits into
containers:mainfrom
marcnuri-forks:issue-1234
Jun 30, 2026
Merged

chore(evals): fix stale docs and drifted Makefile defaults#1237
Cali0707 merged 3 commits into
containers:mainfrom
marcnuri-forks:issue-1234

Conversation

@manusa

@manusa manusa commented Jun 29, 2026

Copy link
Copy Markdown
Member

What

Makes the local mcpchecker eval workflow reproducible from the docs alone and
fully keyless for the Claude Code agent. The docs and Makefile defaults had
drifted since the ACP migration (#839) and the kubernetes -> core suite rename
(#1081), and a local run still needed an OpenAI key for the LLM judge. Docs +
Makefile + eval-config only, no Go/server code touched.

Incorporates the useful parts of #995 and supersedes #947 (the claude-agent-acp
install target).

Highlights

Keyless local runs with the Claude Code agent

evals/claude-code/eval.yaml now judges with builtin.claude-code instead of
openai:gpt-5, so with AGENT=claude-code both the agent and the LLM judge run on
your Claude subscription. Every suite runs with no OpenAI key, and judge-backed
tasks are really evaluated rather than skipped. (The legacy verify: contains:
short form is semantic LLM judging, not a literal string match, so those tasks need
the judge.) The kubevirt/claude-code per-suite config gets the same judge. CI is
unaffected: it runs evals/openai-agent/eval.yaml, which keeps the independent
openai:gpt-5 judge.

Install + run targets

  • New make claude-agent-acp target installs the adapter the claude-code agent
    needs (supersedes Add/update make target to install deps for mcpchecker agents #947). Idempotent, and version-pinnable via
    CLAUDE_AGENT_ACP_VERSION (next to MCPCHECKER_VERSION). CI never installs the
    adapter, so this knob is purely for local reproducibility.
  • New SUITE / AGENT / MODEL knobs on make run-evals, e.g.
    make run-evals SUITE=kubevirt AGENT=claude-code MODEL=sonnet. Selects the eval
    config, sets the suite label selector, and exports ANTHROPIC_MODEL (which drives
    both agent and judge). run-evals pulls in claude-agent-acp as a conditional
    prereq for the claude-code agent.

Drift / latent-bug fixes

  • EVAL_LABEL_SELECTOR default suite=kubernetes selected zero tasks after the
    rename -> now suite=core.
  • make run-server readiness probe hit /health (a 404 that curl -s swallowed,
    degrading to a port-open check) -> now curl -fsS .../healthz.
  • Aligned every eval config on kubernetes-extension@v0.0.4: the 15
    core-eval-testing/** configs and the kubevirt/openai-agent config were stale
    at v0.0.3. Also fixed that config's model from google:gemini-2.0-flash to
    openai:gpt-5 so the openai-agent directory actually uses an OpenAI model.

Docs

evals/README.md rewritten for the ACP agent: the claude-agent-acp prerequisite
(it bridges to the claude CLI, which runs on your subscription), ANTHROPIC_MODEL
model selection, a keyless single-suite quickstart, top-level vs per-suite configs,
the version knobs, and removal of the dead examples/... paths, the nonexistent
agent binary reference, the old commands:/claude --print block, and the
"OpenAI ACP" mislabel. evals/tasks/README.md updated for the rename
(kubernetes/ -> core/, added config/helm/tekton families, noted the
shared-helper dirs).

Verified locally

Ran the suites end to end (Kind + the MCP server + claude-code on Sonnet, no
OpenAI key
):

  • helm 3/3 pass.
  • core 23/29 keyless: the 19 deterministic tasks pass, and all 4 judge-backed
    tasks (ahoy, debug-app-logs, list-images-for-pods, nodes-top) now pass
    with the claude-code judge giving real semantic verdicts. They had failed only
    because the OpenAI judge had no key, not because the agent was wrong. The
    remaining 6 are genuine (1 setup-script break, 5 verify.sh misses), unrelated
    to this change.
  • make run-server's new /healthz probe confirmed against a live server.

CI safety

The mcpchecker CI pipeline is untouched: it drives the eval through
mcpchecker-action with evals/openai-agent/eval.yaml (judge unchanged) and never
calls make run-evals. The only CI-shared target changed is make run-server,
whose /healthz probe is verified (the endpoint returns 200 and is auth-exempt).

Not done (follow-ups)

  • A lighter eval-oriented Kind cluster target (issue point #5); the minimal manual
    path is documented in the quickstart instead.
  • make diff-evals baseline naming for per-suite eval configs.

Closes #1234

The local mcpchecker eval docs and Makefile defaults drifted after the
ACP migration (containers#839) and the kubernetes -> core suite rename (containers#1081),
making a local run hard to reproduce from the docs alone.

- add a `make claude-agent-acp` target so the claude-code agent works
  out of the box (supersedes containers#947)
- add SUITE/AGENT/MODEL knobs to `make run-evals` for a no-OpenAI-key
  single-suite run, plus a documented quickstart
- fix the default label selector (suite=kubernetes selected zero tasks
  -> suite=core) and the readiness probe (/health 404 -> /healthz, -f)
- rewrite evals/README.md for the ACP agent and document ANTHROPIC_MODEL
- refresh the per-suite kubevirt configs and document top-level vs
  per-suite eval configs

Closes containers#1234

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: Marc Nuri <marc@marcnuri.com>
manusa and others added 2 commits June 29, 2026 15:20
Finishes aligning the drifted eval configs with the rest of the tree.

- bump the 15 evals/core-eval-testing/** configs from
  kubernetes-extension@v0.0.3 to @v0.0.4, matching the claude-code,
  openai-agent, and kubevirt configs
- clarify evals/tasks/README.md that a few subdirectories
  (kiali/scripts, kubevirt/helpers, tekton/helpers) hold shared helpers
  rather than task scenarios

Refs containers#1234

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: Marc Nuri <marc@marcnuri.com>
Route the LLM judge through claude-code for the claude-code agent, so the
whole flow (agent + judge) runs on the Claude subscription with no OpenAI
key. The legacy `verify: contains:` short form is judge-evaluated (semantic),
so this is what makes those tasks runnable keyless. Verified locally:
list-images-for-pods and ahoy pass keyless with real judge verdicts.

- set llmJudge.ref.type: builtin.claude-code in evals/claude-code/eval.yaml
  (was openai:gpt-5) and the kubevirt/claude-code per-suite config (was no
  judge / noop). CI is unaffected: it runs evals/openai-agent/eval.yaml,
  which keeps the independent openai:gpt-5 judge.
- pin the adapter with CLAUDE_AGENT_ACP_VERSION (next to MCPCHECKER_VERSION)
  and mirror the mcpchecker recipe style (set -e + success echo)
- document the keyless claude-code judge, the version knob, and that
  `verify: contains:` is semantic judging rather than a literal match

Refs containers#1234, containers#947, containers#995

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: Marc Nuri <marc@marcnuri.com>
@manusa

manusa commented Jun 29, 2026

Copy link
Copy Markdown
Member Author

Validated locally end to end (Kind + the MCP server + the claude-code agent on Sonnet, no OpenAI key): helm 3/3 and core 23/29 (the remaining 6 are genuine setup / verify.sh misses, not judge artifacts).

Quick local run:

make build mcpchecker claude-agent-acp        # needs the `claude` CLI installed + signed in
kind create cluster --name mcp-eval-cluster --kubeconfig "$PWD/_output/kubeconfig"
export KUBECONFIG="$PWD/_output/kubeconfig"   # export so setup + verify.sh hit the same cluster
make run-server TOOLSETS=core,config
make run-evals SUITE=core AGENT=claude-code MODEL=sonnet

With AGENT=claude-code both the agent and the LLM judge run on your Claude subscription, so no OpenAI key is needed. MODEL pins the model (e.g. sonnet). See evals/README.md for the full quickstart, the kubevirt suite, and the OpenAI-agent path.

@manusa manusa added this to the 0.1.0 milestone Jun 29, 2026
@manusa
manusa marked this pull request as ready for review June 29, 2026 14:19
@manusa
manusa requested a review from Cali0707 June 29, 2026 14:20

@Cali0707 Cali0707 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@Cali0707
Cali0707 merged commit c5cf3a9 into containers:main Jun 30, 2026
11 checks passed
@manusa
manusa deleted the issue-1234 branch June 30, 2026 14:55
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.

Improve local mcpchecker eval workflow: stale docs and drifted Makefile defaults

2 participants