abhigyanpatwari/GitNexus · error · ValueError

--task-bindings-json must contain a list

Error message

--task-bindings-json must contain a list

What it means

Raised in main() when --task-bindings-json is supplied but json.loads does not yield a list. The flag carries an ordered list of expected task bindings that the harness verifies, so any other JSON type (object, string, number, bool, null) is rejected. It is caught with the other input-validation errors and reported via parser.error (exit 2).

Source

Thrown at eval/workflow_bench/runner.py:928

    args = parser.parse_args()
    try:
        args.model = normalized_model_identifier(args.model)
        args.proposer_model = (
            normalized_model_identifier(args.proposer_model, flag="--proposer-model")
            if args.proposer_model is not None
            else None
        )
        task_document = yaml.safe_load(args.tasks.read_text())
        if not isinstance(task_document, Mapping) or not isinstance(task_document.get("tasks"), list):
            raise ValueError("task file must contain a tasks list")
        tasks, skipped_expensive = select_tasks(
            task_document["tasks"],
            include_expensive=args.include_expensive,
        )
        oracle_snapshots = capture_task_oracles(tasks)
        expected_task_bindings = json.loads(args.task_bindings_json) if args.task_bindings_json else None
        if expected_task_bindings is not None and not isinstance(expected_task_bindings, list):
            raise ValueError("--task-bindings-json must contain a list")
        supplied_promotion_target_bases = (
            json.loads(args.promotion_target_bases_json) if args.promotion_target_bases_json else {}
        )
        if not isinstance(supplied_promotion_target_bases, dict) or not all(
            isinstance(path, str) and isinstance(digest, str)
            for path, digest in supplied_promotion_target_bases.items()
        ):
            raise ValueError("--promotion-target-bases-json must contain a string mapping")
        ce_plugin_config = validate_ce_plugin_inputs(
            args.arms,
            args.ce_plugin_dir,
            args.ce_plugin_version,
        )
    except (OSError, SandboxError, ValueError, yaml.YAMLError) as exc:
        parser.error(str(exc))
        raise AssertionError("ArgumentParser.error() returned unexpectedly")

    candidate_arms = [arm for arm in args.arms if arm in CANDIDATE_ARMS]

View on GitHub (pinned to d540b00184)

Solutions

  1. Re-emit the value as a JSON array, e.g. `[ {"task": "t-a", "binding": "..."} ]`.
  2. Validate before passing: `python3 -c "import json,sys; assert isinstance(json.load(open(sys.argv[1])), list)" bindings.json`.
  3. Double-check the flag name in the docs — task-bindings is a list, promotion-target-bases is a string map.
  4. If empty/unneeded, omit the flag entirely (None is allowed).

Example fix

# before — object passed where a list is required
--task-bindings-json '{"task-a": "sha1:abc"}'
# after — a JSON list
--task-bindings-json '[{"task":"task-a","binding":"sha1:abc"}]'
Defensive patterns

Strategy: validation

Validate before calling

import json

v = json.loads(args.task_bindings_json) if args.task_bindings_json else None
assert v is None or isinstance(v, list), '--task-bindings-json must contain a list'

Type guard

def is_bindings_list(raw: str | None) -> bool:
    if raw is None:
        return True
    try:
        return isinstance(json.loads(raw), list)
    except json.JSONDecodeError:
        return False

Prevention

When it happens

Trigger: args.task_bindings_json is non-empty, json.loads succeeds, but the result is not a list — e.g. the flag was given a JSON object `{...}` or a bare scalar string.

Common situations: Confusing --task-bindings-json (a list) with --promotion-target-bases-json (an object); pasting a single binding object instead of a one-element array; emitting from a script whose serializer defaulted to an object/dict.

Related errors


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