Step 1: Choose the Execution Owner
This choice determines whether the Harness or the Benchmark runs the agent loop:HarnessFreeBenchmark is a subclass of BaseBenchmark. They share the task-loading, preparation, artifact-collection, evaluation, and aggregation contracts; only the owner of the execution stage differs. Prefer a Harness-driven Benchmark. Use a Benchmark-driven implementation only when the upstream interaction protocol itself belongs to the Benchmark definition.
Step 2: Choose the Evaluation Location
This choice determines whereevaluate() runs and is independent of the execution owner:
Both
BaseBenchmark and HarnessFreeBenchmark can use all three modes. collect_artifacts() is not a fourth mode; it is an optional lifecycle hook that extracts submissions before the task Environment closes. A fresh evaluator that depends on the task workspace usually needs to override this method. See Evaluation Modes and Artifacts for the implementation patterns.
Step 3: Choose the Aggregation Strategy
This choice determines how attempt-level verdicts become request-level metrics. It does not change the execution owner or evaluation location:
See Results and Aggregation for the result fields and aggregation patterns. Regardless of the final combination, read Shared Contracts first to define task fields, visibility boundaries, and per-task plans.
Shared Lifecycle
Each request loads and selects tasks first, then performs these steps for every task and attempt:collect_artifacts() is called. The evaluation mode determines where evaluate() runs. After all tasks finish, aggregate_metrics() reads the persisted structure and produces the summary.
Method Responsibilities
After the implementation works, add the user-facing entry point through Documentation Update, then follow Validation and Alignment with real data, Environments, and official results.
