{"record":{"id":"8098b714b3c65cc0","repo":"abhigyanpatwari/GitNexus","slug":"extra-read-only-mount-is-unavailable-source","errorCode":null,"errorMessage":"extra read-only mount is unavailable: {source}","messagePattern":"extra read-only mount is unavailable: (.+?)","errorType":"exception","errorClass":"SandboxError","httpStatus":null,"severity":"error","filePath":"eval/workflow_bench/proposer_sandbox.py","lineNumber":149,"sourceCode":"                resolved != lexical\n                or stat.S_ISLNK(metadata.st_mode)\n                or not (stat.S_ISDIR(metadata.st_mode) or stat.S_ISREG(metadata.st_mode))\n            ):\n                raise SandboxError(f\"read-only sandbox path must be real and non-symlink: {raw_path}\")\n            additional.append(\n                ReadOnlyMount(\n                    source=lexical,\n                    target=f\"{SANDBOX_WORKSPACE}/{PurePosixPath(relative.as_posix())}\",\n                )\n            )\n\n        for mount in extra_read_only_mounts:\n            source = mount.source.expanduser().absolute()\n            try:\n                metadata = source.lstat()\n                resolved = source.resolve(strict=True)\n            except OSError as exc:\n                raise SandboxError(f\"extra read-only mount is unavailable: {source}\") from exc\n            if (\n                resolved != source\n                or stat.S_ISLNK(metadata.st_mode)\n                or not (stat.S_ISDIR(metadata.st_mode) or stat.S_ISREG(metadata.st_mode))\n            ):\n                raise SandboxError(f\"extra read-only mount must be real and non-symlink: {source}\")\n            target = PurePosixPath(mount.target)\n            if not target.is_absolute() or \"..\" in target.parts:\n                raise SandboxError(f\"extra read-only mount target must be absolute: {mount.target}\")\n            additional.append(ReadOnlyMount(source=source, target=target.as_posix()))\n\n        return _sandbox_command_prefix(\n            bwrap=self.bwrap_bin,\n            clone=clone,\n            home=self.home,\n            temp=self.temp,\n            claude_bin=self.claude_host_bin,\n            mounts=(*self.read_only_mounts, *additional),","sourceCodeStart":131,"sourceCodeEnd":167,"githubUrl":"https://github.com/abhigyanpatwari/GitNexus/blob/d540b00184d71a896261ee02670da9a92d59d8f7/eval/workflow_bench/proposer_sandbox.py#L131-L167","documentation":"Thrown by `command_prefix_for` when an `extra_read_only_mounts` source cannot be probed: `source.lstat()` or `source.resolve(strict=True)` raised `OSError`. Extra mounts are reserved for harness-owned, post-session evidence (e.g. hidden oracles) and must reference an existing, reachable source on disk.","triggerScenarios":"Calling `command_prefix_for(extra_read_only_mounts=[ReadOnlyMount(source=p, target=t)])` where `p` does not exist, has restrictive parent permissions, or sits on a broken symlink chain so `lstat`/`resolve` raise `OSError`.","commonSituations":"Pointing an extra mount at an oracle file that has not been generated yet; a path on an unmounted volume; parent dir with mode 000; the evidence path was cleaned up between sessions; typo in the oracle path.","solutions":["Generate the oracle/evidence file before building the prefix: ensure `source.exists()`.","Verify permissions: every parent of `source` must be traversable (execute bit) so `lstat` succeeds.","Pass an absolute, real path: `source=source.expanduser().resolve(strict=True)`.","If the source is optional, omit it from `extra_read_only_mounts` when it is absent."],"exampleFix":"# before: oracle not yet written\nmount = ReadOnlyMount(source=Path('/run/oracle.json'), target='/workspace/oracle.json')\nprefix = session.command_prefix_for(extra_read_only_mounts=[mount])  # -> SandboxError\n# after: create the oracle first\nPath('/run/oracle.json').write_text(json.dumps(evidence))\nprefix = session.command_prefix_for(extra_read_only_mounts=[mount])","handlingStrategy":"validation","validationCode":"from pathlib import Path\n\ndef extra_mount_source_is_available(source: Path) -> bool:\n    try:\n        source.expanduser().absolute().lstat()\n        source.expanduser().absolute().resolve(strict=True)\n    except OSError:\n        return False\n    return True\n\nmounts = [m for m in extra_mounts if extra_mount_source_is_available(m.source)]\nprefix = session.command_prefix_for(extra_read_only_mounts=mounts)","typeGuard":"from pathlib import Path\n\ndef is_available_extra_mount_source(source: Path) -> bool:\n    try:\n        source.expanduser().absolute().lstat()\n        source.expanduser().absolute().resolve(strict=True)\n    except OSError:\n        return False\n    return True","tryCatchPattern":"try:\n    prefix = session.command_prefix_for(extra_read_only_mounts=mounts)\nexcept SandboxError as exc:\n    if \"extra read-only mount is unavailable\" in str(exc):\n        # generate the missing evidence file first, then retry\n        write_oracle_files()\n        prefix = session.command_prefix_for(extra_read_only_mounts=mounts)\n    raise","preventionTips":["Generate all oracle/evidence files before building the prefix.","Verify parent directory permissions allow lstat on each source.","Omit optional mounts when their source is absent rather than passing a missing path."],"tags":["sandbox","bwrap","mount","path-validation","evidence"],"backgroundTag":null,"analyzedSha":"d540b00184d71a896261ee02670da9a92d59d8f7","analyzedAt":"2026-08-12T19:50:25.132Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}