Head-to-head comparison of coding agents (Claude Code, Aider, Codex, etc.) on custom tasks with pass rate, cost, time, and consistency metrics
git clone https://github.com/affaan-m/ECC.git--- name: agent-eval description: Head-to-head comparison of coding agents (Claude Code, Aider, Codex, etc.) on custom tasks with pass rate, cost, time, and consistency metrics license: MIT metadata: origin: ECC tools: Read, Write, Edit, Bash, Grep, Glob --- # Agent Eval Skill A lightweight CLI tool for comparing coding agents head-to-head on reproducible tasks. Every "which coding agent is best?" comparison runs on vibes — this tool systematizes it. ## When to Activate - Comparing coding agents (Claude Code, Aider, Codex, etc.) on your own codebase - Measuring agent performance before adopting a new tool or model - Running regression checks when an agent updates its model or tooling - Producing data-backed agent selection decisions for a team ## Installation > **Note:** Install agent-eval from its repository after reviewing the source. ## Core Concepts ### YAML Task Definitions Define tasks declaratively. Each task specifies what to do, which files to touch, and how to judge success: ```yaml name: add-retry-logic description: Add exponential backoff retry to the HTTP client repo: ./my-project files: - src/http_client.py prompt: | Add retry logic with exponential backoff to all HTTP requests. Max 3 retries. Initial delay 1s, max delay 30s. judge: - type: pytest command: pytest tests/test_http_client.py -v - type: grep pattern: "exponential_backoff|retry" files: src/http_client.py commit: "abc1234" # pin to specific commit for reproducibility ``` ### Git Worktree Isolation Each agent run gets its own git worktree — no Docker required. This provides reproducibility isolation so agents cannot interfere with each other or corrupt the base repo. ### Metrics Collected | Metric | What It Measures | |--------|-----------------| | Pass rate | Did the agent produce code that passes the judge? | | Cost | API spend per task (when available) | | Time | Wall-clock seconds to completion | | Consistency | Pass rate across repeated runs (e.g., 3/3 = 100%) | ## Workflow ### 1. Define Tasks Create a `tasks/` directory with YAML files, one per task: ```bash mkdir tasks # Write task definitions (see template above) ``` ### 2. Run Agents Execute agents against your tasks: ```bash agent-eval run --task tasks/add-retry-logic.yaml --agent claude-code --agent aider --runs 3 ``` Each run: 1. Creates a fresh git worktree from the specified commit 2. Hands the prompt to the agent 3. Runs the judge criteria 4. Records pass/fail, cost, and time ### 3. Compare Results Generate a comparison report: ```bash agent-eval report --format table ``` ``` Task: add-retry-logic (3 runs each) ┌──────────────┬───────────┬────────┬────────┬─────────────┐ │ Agent │ Pass Rate │ Cost │ Time │ Consistency │ ├──────────────┼───────────┼────────┼────────┼─────────────┤ │ claude-code │ 3/3 │ $0.12 │ 45s │ 100% │ │ aider │ 2/3 │ $0.08 │ 38s │ 67% │ └──────────────┴───────────┴────────┴────────┴─────────────┘ ``` ## Judge Types ### Code-Based (deterministic) ```yaml judge: - type: pytest command: pytest tests/ -v - type: command command: npm run build ``` ### Pattern-Based ```yaml judge: - type: grep pattern: "class.*Retry" files: src/**/*.py ``` ### Model-Based (LLM-as-judge) ```yaml judge: - type: llm prompt: | Does this implementation correctly handle exponential backoff? Check for: max retries, increasing delays, jitter. ``` ## Best Practices - **Start with 3-5 tasks** that represent your real workload, not toy examples - **Run at least 3 trials** per agent to capture variance — agents are non-deterministic - **Pin the commit** in your task YAML so results are reproducible across days/weeks - **Include at least one deterministic judge** (tests, build) per task — LLM judges add noise - **Track cost alongside pass rate** — a 95% agent at 10x the cost may not be the right choice - **Version your task definitions** — they are test fixtures, treat them as code ## Links - Repository: [github.com/joaquinhuigomez/agent-eval](https://github.com/joaquinhuigomez/agent-eval)
1. **Define the Task**: Clearly describe the coding task, including input/output specifications, edge cases, and performance constraints. Use [TASK_DESCRIPTION] placeholder. 2. **Prepare Test Suite**: Create a comprehensive test suite (e.g., unit tests, performance benchmarks) and save it as [TEST_SUITE]. Include edge cases and validation criteria. 3. **Select Agents**: Specify the agents to compare (e.g., [AGENT_A] = Aider, [AGENT_B] = Claude Code). Ensure both are installed and configured. 4. **Run Evaluation**: Use the prompt template to generate the evaluation command. Execute it in a terminal or agent environment that supports both tools. 5. **Analyze Results**: Review the pass rate, cost, time, and consistency metrics. Investigate discrepancies to identify strengths/weaknesses of each agent. Tip: For consistency checks, rerun the task 3-5 times to measure variability.
No install command available. Check the GitHub repository for manual installation instructions.
git clone https://github.com/affaan-m/ECC/tree/main/skills/agent-evalCopy the install command above and run it in your terminal.
Launch Claude Code, Cursor, or your preferred AI coding agent.
Use the prompt template or examples below to test the skill.
Adapt the skill to your specific use case and workflow.
Run a head-to-head evaluation of [AGENT_A] vs [AGENT_B] on the following task: [TASK_DESCRIPTION]. Track and report: (1) pass rate (tests passed / total tests), (2) total cost in USD, (3) total time taken in minutes, and (4) consistency score (how often both agents produce identical outputs). Use [TEST_SUITE] as the validation criteria. Provide a summary table and a detailed breakdown of discrepancies.
### Agent Evaluation Report: Aider vs. Claude Code **Task**: Implement a Python function `find_palindromes(s: str) -> list[str]` that returns all palindromic substrings of length >= 3 in a given string. The function must handle edge cases (empty string, single character) and include unit tests. **Test Suite**: 20 automated tests covering: - Basic palindromes (e.g., "abba" → ["abba"]) - Overlapping palindromes (e.g., "abaxyzzyxf" → ["xyzzyx", "yzzy"]) - Edge cases (empty string, single character) - Performance (strings up to 10,000 chars) #### Results Table | Metric | Aider (v0.12.1) | Claude Code (v1.0) | |-----------------|-----------------|--------------------| | Pass Rate | 18/20 (90%) | 20/20 (100%) | | Total Cost | $0.42 | $0.87 | | Total Time | 4.2 min | 2.1 min | | Consistency | 16/20 (80%) | N/A | #### Detailed Breakdown **Aider**: Failed on edge cases (empty string returned `[]` instead of `None`) and one performance test (timeout on 10k-char input). Output varied in 4 cases due to non-deterministic seed in random test generation. **Claude Code**: Passed all tests. Generated identical code in 3/3 reruns. Used a two-pointer approach for O(n²) time complexity. #### Discrepancies - **Inconsistency**: Aider’s outputs differed in 4/20 runs due to unseeded randomness in test generation. - **Edge Case Handling**: Aider returned `[]` for empty string; Claude returned `None`. Both valid, but inconsistent with each other. #### Recommendation Claude Code is the better choice for this task due to 100% pass rate and faster execution. Aider’s lower cost is offset by its inconsistency and edge-case failures. For production use, prioritize reliability over cost.
skills-collection
Take a free 3-minute scan and get personalized AI skill recommendations.
Take free scan