abhigyanpatwari/GitNexus · error · ValueError

--arms must name exactly the minimal incumbent set for this

Error message

--arms must name exactly the minimal incumbent set for this overlay: 

What it means

Raised by `resolve_incumbent_arms` when an explicit `--arms` list is given but does not exactly equal the minimal incumbent set the overlay requires (derived from `required_candidate_arms(overlay)` via the skills the overlay actually touches). The user-selected arms must match the overlay's skill coverage.

Source

Thrown at eval/workflow_bench/evolve.py:557

            try:
                runner.remove_clone(clone)
            except OSError as cleanup:
                if primary is None:
                    raise
                primary.add_note(f"proposer clone cleanup also failed: {type(cleanup).__name__}: {cleanup}")


# Promotion application lives in promotion_apply; the public helpers are
# re-exported above so existing callers of workflow_bench.evolve keep working.

# ─── Driver ──────────────────────────────────────────────────────────────────


def resolve_incumbent_arms(overlay: Path, explicit_arms: list[str] | None) -> list[str]:
    candidates = required_candidate_arms(overlay)
    required = [CANDIDATE_ARMS[candidate] for candidate in candidates]
    if explicit_arms is not None and explicit_arms != required:
        raise ValueError("--arms must name exactly the minimal incumbent set for this overlay: " + " ".join(required))
    return required


def generation_timeout_seconds(
    *,
    task_count: int,
    runs: int,
    session_timeout: int,
    incumbent_arms: list[str],
) -> int:
    """Budget every sequential bounded phase in the generated benchmark."""

    if task_count < 1 or runs < 1 or session_timeout < 1:
        raise ValueError("task count, runs, and session timeout must be positive")
    try:
        session_slots = sum(2 * ARM_SESSION_COUNTS[arm] for arm in incumbent_arms)
    except KeyError as exc:
        raise ValueError(f"unsupported evolution arm: {exc.args[0]}") from exc

View on GitHub (pinned to d540b00184)

Solutions

  1. Omit --arms entirely and let the harness derive the minimal set from the overlay.
  2. Or run `required_candidate_arms(overlay)` to learn the exact required list, then pass that exact set in the same order.
  3. Make sure the overlay only edits skills for the arms you intend to benchmark.

Example fix

# before: overlay edits both gitnexus-plan and gitnexus-work, but you pass only
#   --arms workflow_direct   (workflow_direct exercises only gitnexus-work)
# after: omit --arms, or pass the derived set, e.g.
#   --arms workflow workflow_direct
Defensive patterns

Strategy: validation

Validate before calling

from workflow_bench.evolution import required_candidate_arms, CANDIDATE_ARMS
required = [CANDIDATE_ARMS[c] for c in required_candidate_arms(overlay)]
if explicit_arms is not None and explicit_arms != required:
    raise ValueError(f'--arms must be exactly {required} (got {explicit_arms})')

Prevention

When it happens

Trigger: Invoked from `runner_argv` (building the benchmark command) or `main` (validating --initial-overlay): `resolve_incumbent_arms(overlay, args.arms)` where args.arms != the arms implied by the overlay's candidate files.

Common situations: Passing `--arms workflow_direct` for an overlay that also modifies gitnexus-plan (which requires the `workflow` arm), or vice versa; or listing arms in a different order than the canonical CANDIDATE_ARMS derivation.

Related errors


AI-assisted analysis of abhigyanpatwari/GitNexus@d540b00184 (2026-08-12). Data as JSON: /api/errors/d006a7c6b3cfb122. Report an issue: GitHub.