abhigyanpatwari/GitNexus · error · ValueError

task {task_id} sandbox_dependencies must be a list

Error message

task {task_id} sandbox_dependencies must be a list

What it means

Raised by select_tasks when `sandbox_dependencies` is present but is not a list (runner_tasks.py:56-57). sandbox_dependencies describes {source,target} copy mappings between repos; non-list shapes are rejected before per-entry validation runs.

Source

Thrown at eval/workflow_bench/runner_tasks.py:57

                raise ValueError(f"task {index} requires a nonblank string {field}")
        for field in optional_strings:
            if field in task and not isinstance(task[field], str):
                raise ValueError(f"task {task['id']} field {field} must be a string")
        task_id = task["id"]
        if not re.fullmatch(r"[A-Za-z0-9][A-Za-z0-9._-]{0,127}", task_id):
            raise ValueError(f"task id must be a simple artifact-safe slug: {task_id!r}")
        if task_id in seen:
            raise ValueError(f"duplicate task id: {task_id}")
        seen.add(task_id)
        expensive = task.get("expensive", False)
        if not isinstance(expensive, bool):
            raise ValueError(f"task {task_id} expensive metadata must be boolean")
        copies = task.get("sandbox_copy", [])
        if not isinstance(copies, list) or not all(isinstance(path, str) and path for path in copies):
            raise ValueError(f"task {task_id} sandbox_copy must be a string list")
        dependencies = task.get("sandbox_dependencies", [])
        if not isinstance(dependencies, list):
            raise ValueError(f"task {task_id} sandbox_dependencies must be a list")
        for dependency in dependencies:
            if (
                not isinstance(dependency, Mapping)
                or set(dependency) != {"source", "target"}
                or not all(isinstance(dependency[field], str) and dependency[field] for field in ("source", "target"))
            ):
                raise ValueError(
                    f"task {task_id} sandbox_dependencies entries require nonblank source and target strings"
                )
        validate_oracle_declaration(task)
        if expensive and not include_expensive:
            skipped.append(task_id)
        else:
            selected.append(task)
    if not selected:
        raise ValueError("no tasks selected after expensive-task filtering")
    return selected, skipped

View on GitHub (pinned to d540b00184)

Solutions

  1. Wrap sandbox_dependencies in a YAML list.
  2. If no cross-repo dependencies exist, remove the key (defaults to []).
  3. Confirm each entry is a mapping with exactly source and target.

Example fix

# before
- id: t1
  sandbox_dependencies:
    source: a
    target: b
# after
- id: t1
  sandbox_dependencies:
    - source: a
      target: b
Defensive patterns

Strategy: type-guard

Validate before calling

for i, t in enumerate(doc.get("tasks", [])):
    d = t.get("sandbox_dependencies", [])
    if not isinstance(d, list):
        raise SystemExit(f"task {i} sandbox_dependencies must be a list")

Type guard

def sandbox_dependencies_is_list(task: dict) -> bool:
    d = task.get("sandbox_dependencies", [])
    return isinstance(d, list)

Prevention

When it happens

Trigger: `sandbox_dependencies:` left null, set to a single mapping, or provided as a string.

Common situations: Forgetting list brackets around a single dependency; YAML null from a bare key; passing a dict instead of a list of dicts.

Related errors


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