abhigyanpatwari/GitNexus · error · SandboxError
Compound Engineering plugin manifest directory is unavailabl
Error message
Compound Engineering plugin manifest directory is unavailable: {manifest_root}: {exc} What it means
_plugin_files() lstat's source/.claude-plugin/ to start enumerating the plugin manifest. Any OSError (ENOENT, EACCES, EIO) is wrapped as SandboxError with this message, refusing to proceed without an inspectable manifest directory.
Source
Thrown at eval/workflow_bench/runtime_mounts.py:294
for part in relative.parts:
lowered = part.lower()
if lowered in _FORBIDDEN_PATH_PARTS or lowered in _SECRET_EXACT_NAMES:
return True
if lowered.startswith(".env.") or lowered.startswith(".npmrc."):
return True
if lowered.endswith(_SECRET_SUFFIXES) or any(marker in lowered for marker in _SECRET_NAME_MARKERS):
return True
return False
def _plugin_files(source: Path) -> Iterator[tuple[PurePosixPath, Path]]:
"""Yield only allowlisted plugin files in stable order."""
manifest_root = source / ".claude-plugin"
try:
manifest_root_metadata = manifest_root.lstat()
except OSError as exc:
raise SandboxError(
f"Compound Engineering plugin manifest directory is unavailable: {manifest_root}: {exc}"
) from exc
if stat.S_ISLNK(manifest_root_metadata.st_mode) or not stat.S_ISDIR(manifest_root_metadata.st_mode):
raise SandboxError(f"Compound Engineering plugin manifest directory must be real: {manifest_root}")
required_manifest = _ALLOWED_PLUGIN_MANIFESTS[0]
manifest_path = source / Path(*required_manifest.parts)
if not manifest_path.exists():
raise SandboxError(f"Compound Engineering plugin manifest is missing: {manifest_path}")
for relative in _ALLOWED_PLUGIN_MANIFESTS:
candidate = source / Path(*relative.parts)
if candidate.exists():
yield relative, candidate
skills = source / "skills"
if not skills.exists():
raise SandboxError(f"Compound Engineering plugin skills directory is missing: {skills}")
def walk(directory: Path, relative_dir: PurePosixPath) -> Iterator[tuple[PurePosixPath, Path]]:View on GitHub (pinned to d540b00184)
Solutions
- Confirm the directory exists: `ls -la <plugin_dir>/.claude-plugin`.
- If missing, re-assemble the plugin from its canonical source so .claude-plugin/ is present.
- Grant read+execute on the path: `chmod -R +rX <plugin_dir>`.
Defensive patterns
Strategy: validation
Validate before calling
from pathlib import Path
def manifest_dir_available(source: Path) -> bool:
try:
(source / ".claude-plugin").lstat()
return True
except OSError:
return False Try / catch
from .proposer_sandbox import SandboxError
try:
list(_plugin_files(source))
except SandboxError as exc:
if "manifest directory is unavailable" in str(exc):
# point --ce-plugin-dir at a directory that has .claude-plugin/
...
raise Prevention
- Standardize plugin assembly so .claude-plugin/ is always present.
- Pre-flight check the source tree before invoking the benchmark.
When it happens
Trigger: Calling _plugin_files() on a plugin source that has no .claude-plugin/ directory, where .claude-plugin is unreadable, or where the path is on a broken mount.
Common situations: --ce-plugin-dir pointed at the repo root or a wrong subdirectory; plugin tarball was extracted without hidden directories; permissions strip the harness user of access.
Related errors
- Compound Engineering plugin manifest directory must be real:
- Compound Engineering plugin directory is unreadable: {direct
- Compound Engineering plugin entries must not be symlinks: {e
- Compound Engineering plugin entries must be regular files: {
- Compound Engineering plugin file must be regular and non-sym
AI-assisted analysis of abhigyanpatwari/GitNexus@d540b00184 (2026-08-12).
Data as JSON: /api/errors/6fecc0ef9232f358.
Report an issue: GitHub.