Parent: #1481 (Eval harness foundation — decomposed per owner request)
This is Step 1 of the eval harness, decomposed from #1481 into independently-mergeable ≤200-line slices. Unblocks #1267 (null-agent floor test) and #1302 (replay grading).
Scope (this issue — ≤200 lines)
Define a fixed, versioned task set — a gold-standard eval dataset that the harness runner (Step 2) and null-agent (Step 3) will consume. This is the data layer; no runner code yet.
Specific changes
-
Task set schema: a simple dataclass or TypedDict defining a task:
id: unique task identifier
prompt: the task instruction text
expected_tools: list of tool calls the agent should make (for trajectory grading)
expected_result_pattern: optional regex/substring for result validation
category: task category (code, search, file-ops, etc.)
difficulty: easy/medium/hard
-
Task definitions: 5-10 tasks sourced from existing evolution cycle tasks (real work the agent has done), covering different tool categories. Stored as a Python module or JSON file.
-
Versioning: the task set has a version field so eval runs can pin to a specific set.
-
Loader function: load_task_set(version: str = "1.0") -> list[EvalTask]
What this issue does NOT do
Success criteria
Existing code checked
scripts/evolution_evaluator.py — deterministic scoring rubric (text grading only, not a task set)
tests/agent/test_agent_judge.py — Agent-as-a-Judge eval (different scope)
tests/agent/test_plan_mode_eval.py — plan-mode eval harness (different scope, model comparison)
- No existing eval task set in the codebase (verified by grep)
Parent: #1481 (Eval harness foundation — decomposed per owner request)
This is Step 1 of the eval harness, decomposed from #1481 into independently-mergeable ≤200-line slices. Unblocks #1267 (null-agent floor test) and #1302 (replay grading).
Scope (this issue — ≤200 lines)
Define a fixed, versioned task set — a gold-standard eval dataset that the harness runner (Step 2) and null-agent (Step 3) will consume. This is the data layer; no runner code yet.
Specific changes
Task set schema: a simple dataclass or TypedDict defining a task:
id: unique task identifierprompt: the task instruction textexpected_tools: list of tool calls the agent should make (for trajectory grading)expected_result_pattern: optional regex/substring for result validationcategory: task category (code, search, file-ops, etc.)difficulty: easy/medium/hardTask definitions: 5-10 tasks sourced from existing evolution cycle tasks (real work the agent has done), covering different tool categories. Stored as a Python module or JSON file.
Versioning: the task set has a version field so eval runs can pin to a specific set.
Loader function:
load_task_set(version: str = "1.0") -> list[EvalTask]What this issue does NOT do
Success criteria
load_task_set()loader implementedExisting code checked
scripts/evolution_evaluator.py— deterministic scoring rubric (text grading only, not a task set)tests/agent/test_agent_judge.py— Agent-as-a-Judge eval (different scope)tests/agent/test_plan_mode_eval.py— plan-mode eval harness (different scope, model comparison)