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
- Re-emit the value as a JSON array, e.g. `[ {"task": "t-a", "binding": "..."} ]`.
- Validate before passing: `python3 -c "import json,sys; assert isinstance(json.load(open(sys.argv[1])), list)" bindings.json`.
- Double-check the flag name in the docs — task-bindings is a list, promotion-target-bases is a string map.
- 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
- Emit --task-bindings-json as a JSON array from the producing script.
- Do not confuse it with the object-shaped --promotion-target-bases-json.
- Omit the flag when unused (None is allowed).
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
- --promotion-target-bases-json must contain a string mapping
- task file must contain a tasks list
- Malformed --shard arg '${malformed}' — expected --shard=<ind
- ${source} must be a boolean (true/false).
- ${source} must be a string.
AI-assisted analysis of abhigyanpatwari/GitNexus@d540b00184 (2026-08-12).
Data as JSON: /api/errors/fd20396d5084538d.
Report an issue: GitHub.