1. Define one real task
Pick a task you understand well enough to judge. It might be explaining a module, fixing a bug with a known reproduction, adding a small feature, or suggesting tests for a boundary case. Avoid making your first evaluation a production emergency.
Write down the starting state, the desired result, and what the tool must leave alone. Keep a copy of the repository at that point so you can repeat the exercise. A successful answer should do more than look plausible: it should meet the same acceptance criteria you would use for your own work.
- Explanation: can you trace the answer back to actual files and symbols?
- Bug fix: does it address the reproduction without weakening existing behavior?
- Feature: does it fit the existing conventions and remain within scope?
- Tests: do they check meaningful behavior, including failure cases?
Worked example: fix a duplicate invoice total
This is an illustrative evaluation task, not a test we ran or a benchmark of any provider. Imagine a small invoice app where selecting the same saved item twice creates two rows instead of increasing its quantity. Use a disposable copy with synthetic items and a known failing example.
- Freeze the starting point: record the Git commit, runtime, dependency lockfile, and command that reproduces the duplicate-row behavior. Reset to that commit before each candidate run.
- Give the same prompt: “When a saved item with the same item ID is added again, increment its quantity in the existing row. Keep distinct item IDs separate, even if their labels match. Preserve price calculation and existing UI behavior. Add regression coverage; do not add dependencies or edit unrelated files.”
- Set acceptance cases: adding item A twice yields one row with quantity two; adding A and B yields two rows; different IDs with the same label stay separate; the invoice total reflects each quantity. Run the existing checks as well as the new cases.
- Inspect the result: confirm the patch uses stable IDs, inspect any total-calculation changes, and verify the tests would fail on the starting code. Record every hint and manual repair before calling the task complete.
A patch that merges rows by label fails the distinct-ID case even if the screen looks correct. A patch with all acceptance cases passing still needs review for unrelated edits. These are separate gates; a faster completion does not cancel a failed requirement.
Download the coding assistant evaluation worksheet (CSV). It includes an illustrative task definition and an unfilled run row. Duplicate the run row for each candidate and attempt; replace the example with your own acceptance cases. Record “unknown” for unavailable cost data, and do not treat an empty result as a passing score.
2. Check the fit before the features
Decide where assistance belongs in your day. Do you want suggestions while typing, a conversation about a codebase, or a tool that can propose changes across files? Those are different interaction patterns. Your preferred editor, terminal habits, and review process should influence the choice.
Then check the provider’s current documentation for supported environments, repository access, data handling, and plan limits. Record the plan and date you evaluated. Availability under one plan does not establish availability under another.
For a shortlist organized by working style, see Cursor vs Claude Code vs Codex. Use that comparison to choose candidates, then run your own task before deciding.
3. Keep the evaluation comparable
Give each candidate the same starting files, task description, and constraints. Record any extra hints you provide. If you guide one tool through several corrections but give another only a single attempt, the results describe different processes.
Keep a short log: setup time, changes proposed, validation performed, corrections needed, and review time. Include failures. A confident explanation is not a substitute for a correct result, and a passing test suite is only as useful as the behavior it covers.
4. Decide what the assistant may touch
Use a disposable branch or a small test repository. Keep secrets and customer data out of the exercise. Review proposed commands, dependency changes, external requests, and file edits according to the access you grant.
Separate permission from usefulness. A tool can be capable of running a command without that command being appropriate for your task. Define whether it can install packages, access the network, change configuration, or publish anything before the evaluation begins.
Use the AI code review workflow to turn the resulting diff, checks, and unresolved findings into a review record before merging.
5. Choose a next step, not a permanent winner
Summarize your findings against the original task. Which candidate produced a result you could verify? Which fit your working environment? Where did you spend time correcting it? Include the subscription or usage cost you actually incurred, rather than assuming the advertised entry price represents your workload.
A sensible outcome is a short trial on a defined class of work. Revisit the decision after you have several comparable tasks. You do not need one assistant to win every possible scenario; you need a setup that makes your own work more manageable.
For the cost side of the decision, use our AI stack budgeting framework. If you plan to connect several tools, start by drawing the workflow’s boundaries.