abhigyanpatwari/GitNexus · error · SandboxError
proposer did not produce one bounded regular proposal.md
Error message
proposer did not produce one bounded regular proposal.md
What it means
Raised by `run_proposer` after the confined proposer session finishes: the expected `.wfbench-output/proposal.md` must be a regular file, not a symlink, and no larger than MAX_EVIDENCE_FILE_BYTES (256 KiB). If it is absent, a symlink, or oversized, the proposer did not produce valid output.
Source
Thrown at eval/workflow_bench/evolve.py:527
require_pid_namespace=True,
bare=True,
settings_json=sandbox.settings_json,
strict_mcp_config=True,
mcp_config_json='{"mcpServers":{}}',
allowed_tools=PROPOSER_ALLOWED_TOOLS,
disable_slash_commands=True,
transcript_projects=sandbox.transcript_projects,
transcript_cwd=Path("/workspace"),
)
if not record["ok"]:
return record
candidate_overlay_files(internal_overlay)
if (
not internal_proposal.is_file()
or internal_proposal.is_symlink()
or internal_proposal.stat().st_size > MAX_EVIDENCE_FILE_BYTES
):
raise SandboxError("proposer did not produce one bounded regular proposal.md")
if overlay_dir.exists():
raise SandboxError(f"proposer output destination already exists: {overlay_dir}")
shutil.copytree(internal_overlay, overlay_dir, copy_function=shutil.copyfile)
proposal_path.parent.mkdir(parents=True, exist_ok=True)
shutil.copyfile(internal_proposal, proposal_path)
proposal_path.chmod(0o600)
return record
except BaseException as exc:
primary = exc
raise
finally:
try:
runner.remove_clone(clone)
except OSError as cleanup:
if primary is None:
raise
primary.add_note(f"proposer clone cleanup also failed: {type(cleanup).__name__}: {cleanup}")
View on GitHub (pinned to d540b00184)
Solutions
- Inspect the generation's proposer-session.json to see why the session ended and where (if anywhere) it wrote.
- Confirm the proposer prompt points at /workspace/.wfbench-output/proposal.md and that Bash is enabled (PROPOSER_ALLOWED_TOOLS).
- If the proposal is just too long, tighten the prompt to demand a concise proposal; if absent, switch to a stronger --proposer-model or fix the prompt.
- Re-run the generation once the proposer reliably writes a bounded proposal.md.
Example fix
// before: proposer writes an 800 KiB essay to proposal.md // after: prompt instructs a <=4KB proposal: failure pattern, the single change, metric, risks // ensure path is /workspace/.wfbench-output/proposal.md
Defensive patterns
Strategy: try-catch
Try / catch
from workflow_bench.proposer_sandbox import SandboxError
try:
record = run_proposer(prompt, args, overlay_dir=od, proposal_path=pp, evidence_bundle=eb, bwrap_bin=bb)
except SandboxError as exc:
if 'did not produce one bounded regular proposal.md' in str(exc):
log.error('proposer failed to write a valid proposal.md; check proposer-session.json')
raise
raise Prevention
- Pin --proposer-model to a capable named model; diagnosis needs quality.
- Keep proposal.md short: the cap is 256 KiB but review wants concision.
- Verify the proposer writes to the exact /workspace/.wfbench-output/proposal.md path.
When it happens
Trigger: The proposer Claude session ran but either wrote no proposal.md, wrote it elsewhere, made it a symlink, or produced a file larger than 256 KiB. Also fires if the session failed (record['ok']) in a way that still left the worktree without a valid proposal.
Common situations: An under-powered/misconfigured proposer model that gives up, a proposer that writes the proposal to the wrong path (not /workspace/.wfbench-output/proposal.md), or an overly verbose proposal exceeding the 256 KiB cap.
Related errors
- 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
- duplicate transcript artifact path: {normalized}
- transcript artifact is unavailable: {path}: {exc}
AI-assisted analysis of abhigyanpatwari/GitNexus@d540b00184 (2026-08-12).
Data as JSON: /api/errors/31d33cb2b11ccdd6.
Report an issue: GitHub.