Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions src/benchflow/eval_plan.py
Original file line number Diff line number Diff line change
Expand Up @@ -264,6 +264,14 @@ def build_eval_plan(request: EvalCreateRequest) -> EvalPlan:
raise EvalPlanError("--matrix currently requires --tasks-dir")
if request.trials < 1:
raise EvalPlanError("--trials must be >= 1")
if request.trials > 1 and request.matrix is None:
# Only the matrix expansion consumes trials; a plain run would silently
# do one trial per task while the caller believes it ran N. Per-trial
# requests created by run_matrix_eval bypass this planner by design.
raise EvalPlanError(
"--trials > 1 requires --matrix; to repeat one model, use a "
'single-entry matrix such as "models: {default: <model>}"'
)
if request.expected_tasks is not None and request.expected_tasks < 1:
raise EvalPlanError("--expected-tasks must be >= 1")
if request.canonicalize not in {"none", "one-healthy-per-task"}:
Expand Down
8 changes: 8 additions & 0 deletions tests/test_cli_arg_validation.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,14 @@ def test_build_concurrency_zero_rejected(tmp_path: Path):
assert "--build-concurrency must be >= 1" in result.stderr


def test_trials_without_matrix_rejected(tmp_path: Path):
"""Guards PR #1064: plain runs must not silently ignore --trials."""
result = _invoke(tmp_path, "--sandbox", "docker", "--trials", "3")
assert result.exit_code == 1
assert "--trials > 1 requires --matrix" in result.stderr
assert "single-entry matrix" in result.stderr


def test_skill_mode_bogus_clean_error(tmp_path: Path):
result = _invoke(tmp_path, "--sandbox", "docker", "--skill-mode", "bogus")
assert result.exit_code == 1
Expand Down