https://t.co/y4ywBykMCv
TL;DR · AI 摘要
EvoCode-Bench是首个模拟真实开发循环的多轮编码基准,通过持久工作区、演变规范和累积测试提升代理评估的实用性。
核心要点
- EvoCode-Bench包含227个连续轮次任务,覆盖5个技术领域
- 累积测试要求所有历史需求必须持续满足,而非仅验证最新变更
- 示例任务d1_w5要求在8轮中逐步实现CLI工具buildctl的复杂功能
结构提纲
按章节快速跳转。
现有编码基准仅关注单次任务完成度,无法模拟真实开发迭代过程
通过持久工作区、演变规范和累积测试三大特性重构评估体系
代码容器跨轮次持续存在,保留所有历史决策和依赖关系
每轮输入可能扩展、修正或冲突前序需求,强制处理变更管理
每轮验证所有历史需求,确保代码演进不破坏既有功能
d1_w5任务演示如何在8轮中逐步实现CLI工具的复杂功能
思维导图
用一张图看清主题之间的关系。
查看大纲文本(无障碍 / 无 JS 友好)
- EvoCode-Bench
- 核心特性
- 持久工作区
- 演变规范
- 累积测试
- 示例任务
- d1_w5 buildctl CLI开发
- 评估维度
- ML/MLOps
- 云安全
- 科学计算
金句 / Highlights
值得收藏与分享的关键句。
累积测试要求所有历史需求必须持续满足,而非仅验证最新变更
在d1_w5任务中,buildctl需实现TOML解析、拓扑排序、SHA-256缓存等核心功能
测试脚本在验证后会被删除,防止代理窥探未来评分标准
_\_Originally published:\___\_https://www.philschmid.de/evocode-bench\__
Most coding benchmarks work the same. You give the agent a task, let it work, check the result. The agent might run dozens of tool calls, but there's only one user input and one final evaluation.
That's not how most of us use agents. You build something, you get new ideas, requirements shift, you refactor... EvoCode-Bench is designed to test that cycle.
EvoCode-Bench is a new multi-turn coding benchmark with 26 tasks spanning 227 sequential rounds (5–15 rounds per task). It evaluates agents across five domains: ML/MLOps, build systems, data engineering, cloud/security, and scientific computing. Three things make it interesting:
- **Persistent workspace:** One container lives across the entire lifecycle of a task. Code, dependencies, and architectural decisions from Round 1 are still there at Round 15.
- **Evolving specifications:** Each new input brings a new instruction that either _\_extends\__ the codebase, _\_corrects\__ logic, or _\_conflicts\__ with earlier requirements (intentionally breaking previous assumptions).
- **Cumulative testing:** After each turn, the test suite checks all requirements, not just the new one. Break something from a previous turn, and you fail.
Example: Building a CLI Tool Over 8 Rounds
One task (**d1_w5) asks the agent to build buildctl**, a CLI build orchestrator in Go, over 8 rounds. Here's how the first few rounds work:
**Round 1:**
- **User prompt:_\_"Build a CLI tool called\__ _buildctl_ _\_in Go that orchestrates multi-target build pipelines with dependency resolution, parallel execution, and content-addressable artifact caching."\__ The full spec defines TOML config parsing, topological sorting, cache key computation (SHA-256 of command + env + input file hashes), 4 CLI commands (build, graph, clean, status**), JSON report format, and error handling for cycles, missing deps, and timeouts.
- **Agent:** Scaffolds the Go module, implements the pipeline engine, writes the CLI.
- **Verification: The framework mounts round-1/tests/test.sh** (24 test cases) and runs it against the CLI. Test scripts are removed after verification so the agent can't read future grading criteria.
**Round 2:**
- **User prompt:_\_"Add pipeline composition and variable substitution."\__ Specifically: a new imports field in TOML for composing pipelines across files (with transitive import support, cycle detection, name collision errors), and a [variables] section with ${VAR_NAME}** expansion in commands, inputs, and outputs.
- **Agent:** In the same persistent container and codebase, adds import resolution and variable expansion.
- **Verification: The test suite now checks both Round 1 requirements (caching, sorting, error handling) and** the new import/variable features.
**Round 5:**
- **User prompt:_\_"Change build to fail-fast by default. When any target fails, don't start additional targets. Unstarted targets get status\__ _cancelled_ _\_(distinct from\__ _skipped_ _\_). Add\__ _--keep-going**_ _\_flag to restore the old behavior."\__
- This reverses Round 1, which said independent targets should keep running when a sibling fails. The agent has to refactor the execution engine, add a new status type to the JSON report, and update the summary counts, all without breaking imports, variables, hooks, or cache key computation from earlier rounds.
- **Verification:** The test suite still checks all prior requirements (caching, sorting, imports, variables), but the failure-handling tests from Round 1 are adapted to match the new spec.
Key Insights
**Single-turn scores dramatically overstate reliability.** The researchers tested two modes: one where each round starts from a clean, human-completed codebase (SR), and one where the agent maintains its own workspace across rounds (MT@4). Agents are good at following instructions on clean code. They're significantly worse when building on their own past work. For lower-tier models the gap is ~4x (8.4% MT → 33.1% SR); for frontier models it's still 1.4–1.8x. Over 57% of multi-turn failures occur on rounds that models solve easily from a clean state.
**Rankings shift under pressure.** Claude Opus 4.6 had the _\_highest\__ single-round score (78.9%) but drops to third in multi-turn (44.0%), behind Opus 4.7 (54.0%) and GPT-5.5 (52.4%). Across all models, pass rates go from 46.7% at Round 1 to 21.3% by Round 5 to 7.7% by Round 10. More turns, more accumulated decisions, more failures.
**Failure modes differ by model tier.** Lower-tier agents fail early, they simply don't implement what was asked (87–90% of failures). Mid-tier agents handle the initial rounds but when the spec changes, they add the new logic without fully removing the old behavior it replaced (28.6% of failures, peaking at Round 5). Top-tier agents get further but eventually break something that was already working, regressions account for 35% of failures by Round 2.
**Regressions are the real bottleneck.** Agents rarely fail because they can't build the feature. They fail because they break something that was already working. When the spec changes, the agent edits code to handle the new requirement, but those edits touch shared code paths and accidentally break earlier behavior. The agent doesn't always re-verify that the old stuff still works.
**Structure helps.** Agents that tracked requirements in a persistent document (like a project plan or spec file) more than doubled their success rates.
****Limitations****
**Small dataset.** 26 tasks, 227 rounds. A few hard tasks can skew the aggregate scores.
**All-or-nothing scoring.** A single regression zeros out the entire round, even when 98% of test cases pass. The paper also reports per-case scores showing agents often achieve >80% assertion accuracy on rounds scored as binary failures.
**No recovery loops.** Under fail-stop scoring (MT@4), a single failed round terminates the entire trial — all remaining rounds automatically score zero. The benchmark doesn't test whether an agent can recover from a broken state.
**Static interaction.** The "user" is a fixed script. No clarification questions, no "that's not what I meant," no ambiguity.
**Infra-sensitive.** The paper's own results show infrastructure issues (container throttling, kubelet errors) can corrupt scores.
- * *
- Paper: EvoCode-Bench: Evaluating Coding Agents in Multi-Turn Iterative Interactions
- Code & Dataset: UniPat-AI/EvoCodeBench
- Leaderboard: Results