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

  1. Confirm the directory exists: `ls -la <plugin_dir>/.claude-plugin`.
  2. If missing, re-assemble the plugin from its canonical source so .claude-plugin/ is present.
  3. 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

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


AI-assisted analysis of abhigyanpatwari/GitNexus@d540b00184 (2026-08-12). Data as JSON: /api/errors/6fecc0ef9232f358. Report an issue: GitHub.