abhigyanpatwari/GitNexus · error · SandboxError
transcript artifact is unavailable: {path}: {exc}
Error message
transcript artifact is unavailable: {path}: {exc} What it means
Raised by `_bound_transcript_artifact` when `path.lstat()` raises OSError for the resolved transcript file. The artifact is referenced in evidence but is missing or unreadable on disk.
Source
Thrown at eval/workflow_bench/evolve.py:392
raise SandboxError(f"transcript_artifacts exceeds the global evidence limit of {MAX_TRANSCRIPT_ARTIFACTS}")
for artifact in artifacts:
relative, _, _ = _transcript_artifact_metadata(artifact)
normalized = _normalized_transcript_artifact_path(relative)
if normalized in seen_paths:
raise SandboxError(f"duplicate transcript artifact path: {normalized}")
seen_paths.add(normalized)
artifacts_by_row.append(artifacts)
return artifacts_by_row
def _bound_transcript_artifact(root: Path, metadata: Any) -> str:
relative, expected_digest, expected_size = _transcript_artifact_metadata(metadata)
path = _results_artifact_path(root, relative, transcript=True)
try:
before = path.lstat()
except OSError as exc:
raise SandboxError(f"transcript artifact is unavailable: {path}: {exc}") from exc
if stat.S_ISLNK(before.st_mode) or not stat.S_ISREG(before.st_mode):
raise SandboxError(f"transcript artifact must be a regular non-symlink file: {path}")
if stat.S_IMODE(before.st_mode) & 0o077:
raise SandboxError(f"transcript artifact must be owner-only: {path}")
if before.st_size != expected_size:
raise SandboxError(f"transcript artifact size does not match its results row: {path}")
descriptor = os.open(path, os.O_RDONLY | getattr(os, "O_NOFOLLOW", 0))
try:
opened = os.fstat(descriptor)
if not stat.S_ISREG(opened.st_mode) or opened.st_dev != before.st_dev or opened.st_ino != before.st_ino:
raise SandboxError(f"transcript artifact changed while opening: {path}")
digest = hashlib.sha256()
content = bytearray()
while chunk := os.read(descriptor, 64 * 1024):
digest.update(chunk)
content.extend(chunk)
if len(content) > MAX_EVIDENCE_FILE_BYTES:View on GitHub (pinned to d540b00184)
Solutions
- Verify the transcript file exists under `<seed-results>/transcripts/<name>` and is readable.
- Re-extract or re-copy the full results dir (including transcripts/) from its source.
- Drop the evidence row whose transcript is unavailable, or regenerate the results.
Defensive patterns
Strategy: try-catch
Validate before calling
from pathlib import Path
missing = []
for r in evidence:
for a in r.get('transcript_artifacts', []):
if not (results_dir / a['path']).exists():
missing.append(a['path'])
if missing:
raise FileNotFoundError(f'transcripts missing from results dir: {missing}') Try / catch
from workflow_bench.proposer_sandbox import SandboxError
try:
proposer_evidence_entries(results_dir=rd, evidence=ev, learnings=lr, gate_summary=gs)
except SandboxError as exc:
if 'is unavailable' in str(exc):
log.warning('transcript missing; regenerating seed results')
raise Prevention
- Keep the results dir self-contained: results.jsonl + transcripts/ + *.patch travel together.
- Before running evolve, list transcripts/ and cross-check against the paths in results.jsonl.
When it happens
Trigger: `proposer_evidence_entries` is called with a `results_dir` whose `transcripts/<name>` file referenced by an artifact's `path` does not exist, is on an unreadable path, or whose parent directory was removed.
Common situations: Pointing `--seed-results` at a results dir whose transcripts/ subdirectory was pruned, partially copied, or lives on a volume that is no longer mounted.
Related errors
- evidence source must be a regular non-symlink file: {path}
- results directory is unavailable: {root}: {exc}
- transcript_artifacts must be a list
- transcript_artifacts exceeds the per-row session limit of {M
- transcript_artifacts exceeds the global evidence limit of {M
AI-assisted analysis of abhigyanpatwari/GitNexus@d540b00184 (2026-08-12).
Data as JSON: /api/errors/77b55e4fad8bff1e.
Report an issue: GitHub.