{"record":{"id":"a232be211a04bc07","repo":"abhigyanpatwari/GitNexus","slug":"transcript-artifacts-must-be-a-list","errorCode":null,"errorMessage":"transcript_artifacts must be a list","messagePattern":"transcript_artifacts must be a list","errorType":"exception","errorClass":"SandboxError","httpStatus":null,"severity":"error","filePath":"eval/workflow_bench/evolve.py","lineNumber":367,"sourceCode":"        relative.is_absolute()\n        or len(relative.parts) != 2\n        or relative.parts[0] != \"transcripts\"\n        or any(part in {\"\", \".\", \"..\"} for part in relative.parts)\n    ):\n        raise SandboxError(f\"unsafe results artifact path: {relative_value!r}\")\n    return relative.as_posix()\n\n\ndef _preflight_transcript_artifacts(evidence: list[dict[str, Any]]) -> list[list[Any]]:\n    \"\"\"Bound every transcript reference before any evidence file is read.\"\"\"\n\n    artifacts_by_row: list[list[Any]] = []\n    seen_paths: set[str] = set()\n    total = 0\n    for artifacts_row in evidence:\n        artifacts = artifacts_row.get(\"transcript_artifacts\", [])\n        if not isinstance(artifacts, list):\n            raise SandboxError(\"transcript_artifacts must be a list\")\n        if len(artifacts) > MAX_TRANSCRIPT_ARTIFACTS_PER_ROW:\n            raise SandboxError(\n                f\"transcript_artifacts exceeds the per-row session limit of {MAX_TRANSCRIPT_ARTIFACTS_PER_ROW}\"\n            )\n        total += len(artifacts)\n        if total > MAX_TRANSCRIPT_ARTIFACTS:\n            raise SandboxError(f\"transcript_artifacts exceeds the global evidence limit of {MAX_TRANSCRIPT_ARTIFACTS}\")\n        for artifact in artifacts:\n            relative, _, _ = _transcript_artifact_metadata(artifact)\n            normalized = _normalized_transcript_artifact_path(relative)\n            if normalized in seen_paths:\n                raise SandboxError(f\"duplicate transcript artifact path: {normalized}\")\n            seen_paths.add(normalized)\n        artifacts_by_row.append(artifacts)\n    return artifacts_by_row\n\n\ndef _bound_transcript_artifact(root: Path, metadata: Any) -> str:","sourceCodeStart":349,"sourceCodeEnd":385,"githubUrl":"https://github.com/abhigyanpatwari/GitNexus/blob/d540b00184d71a896261ee02670da9a92d59d8f7/eval/workflow_bench/evolve.py#L349-L385","documentation":"Raised by `_preflight_transcript_artifacts` in eval/workflow_bench/evolve.py when an evidence row's `transcript_artifacts` field exists but is not a Python list. The harness bounds every transcript reference before reading any evidence file, so the field's shape is non-negotiable.","triggerScenarios":"Calling `proposer_evidence_entries(results_dir=..., evidence=..., ...)` (the generation-0 proposer path, active when `--seed-results` is given) where at least one row in `evidence` has `transcript_artifacts` set to a dict, string, int, or None instead of a list. `evidence` comes from `select_evidence(load_jsonl(results_dir/'results.jsonl'))`.","commonSituations":"A results.jsonl from an incompatible workflow_bench version, a hand-edited JSONL line, or a row written by a buggy custom runner that serialized transcript_artifacts as a dict keyed by session id.","solutions":["Open the `--seed-results` directory's results.jsonl and find the row whose `transcript_artifacts` is not a list (grep for the field).","Fix the offending line so `transcript_artifacts` is a list of `{path,sha256,bytes,source}` objects, or delete the malformed row.","Regenerate the seed results with the current workflow_bench version if the whole file is from an older schema."],"exampleFix":"// before: results.jsonl line has\n{\"task\":\"t1\",...,\"transcript_artifacts\":{\"sess-0\":{...}}}\n// after\n{\"task\":\"t1\",...,\"transcript_artifacts\":[{...}]}","handlingStrategy":"validation","validationCode":"bad = [r for r in evidence if 'transcript_artifacts' in r and not isinstance(r['transcript_artifacts'], list)]\nif bad:\n    raise ValueError(f'non-list transcript_artifacts in rows: {[r.get('task') for r in bad]}')","typeGuard":"def has_list_transcript_artifacts(row: dict) -> bool:\n    ta = row.get('transcript_artifacts', [])\n    return isinstance(ta, list)","tryCatchPattern":null,"preventionTips":["Never hand-edit results.jsonl; regenerate it from the matching workflow_bench version.","If you consume results.jsonl from a custom runner, assert the transcript_artifacts shape before passing rows to proposer_evidence_entries."],"tags":["python","workflow-bench","evidence","validation","sandbox"],"backgroundTag":null,"analyzedSha":"d540b00184d71a896261ee02670da9a92d59d8f7","analyzedAt":"2026-08-12T19:50:25.132Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}