microsoft/eval-recipes · v0.0.28 → v0.0.31
Blind head-to-head benchmarking in eval-recipes
January 2026
It runs an AI agent on a task and judges the work. Through v0.0.27 that judgment was a solo score against a rubric — useful, but silent on which agent is best.
First, the capability the story is built on.
test.py rubricEach agent was judged independently by a test.py script. At the v0.0.27 tag the schema used test_script: Path — and grepping the tree for “comparison” returned nothing.
So the machinery existed. But a lone number has a limit…
Path to test.pyPut three agents on one task and score each in isolation, and you still can't say who actually won. The real question a score can't answer: relative to the others, who did best?
v0.0.28 set out to answer exactly that.
“Add comparison based benchmarking” landed as a single large change: run several agents (minimum 2, any number above) on the same task and rank their outputs.
The next question — how do you make that ranking trustworthy?
Each agent's directory is copied to a randomly named folder agent_<hex> so the comparison carries no hint of who produced what.
Anonymized inputs are only half of it — who does the ranking?
The COMPARISON_SYSTEM_PROMPT drives an LLM judge to create a relative ranking of the agents from best to worst, under one absolute rule.
Now the verdict needs somewhere to land.
ClaudeAgentOptions / ClaudeSDKClientThe HTML report computes Average Rank, Win Rate, and Task Wins — plus a genuine Kendall's W, with LLM explanations per task and across all tasks.
From “here's a number” to “here's who won, blindly, and why.”
overall_win_rate (0–100)Shipping the capability wasn't the end. v0.0.29 and v0.0.31 turned a working feature into one you can actually drive and diagnose.
From a number, to a ranked winner, to a winner you can explain.
ScoreRunSpec) replaced CLI filters; filters.py (150 lines) deletedFeature status: Active · v0.0.28–v0.0.31
Data as of: 2026-01-27 (v0.0.31 release date). Primary source: microsoft/eval-recipes, cloned to /tmp/eval-recipes and researched directly.
Commands run:
gh release list -R microsoft/eval-recipes — confirmed v0.0.28 (2026-01-16) → v0.0.31 (2026-01-27)git show --stat 8522922 — PR #36: 28 files, +3,479 / −153grep -n 'secrets|token_hex|copytree' semantic_test_comparison.py; sed -n '186,206p' — _create_anonymous_workspace(), secrets.token_hex(2)sed -n '1,60p' semantic_test_comparison.py — ClaudeAgentOptions/ClaudeSDKClient judge, “NEVER…change the code or files” rulegrep -n 'Kendall|Win Rate|Average Rank' create_comparison_html_report.py; sed -n '171,203p' — _calculate_kendalls_w(), W = 12·S/(m²(n³−n))git ls-tree -r v0.0.27 --name-only | grep comparison — empty; v0.0.27 schema used test_script: Pathgit show --stat a1eaa6d (PR #39) · git show --stat bfd3aa1 (PR #44)git log v0.0.27..v0.0.31 --format='%an' | sort | uniq -c — 6 David Koleczek + 4 GitHub ActionPrimary contributor: David Koleczek (DavidKoleczek) — all human commits and releases in the window.
Gaps: Dashboard interactivity/visual quality inferred from create_comparison_html_report.py (1,469 lines) and release text, not rendered. Version tags live in microsoft/eval-recipes, not amplifier-bundle-recipes.