abhigyanpatwari/GitNexus · error · SandboxError

Compound Engineering plugin entries must be regular files: {

Error message

Compound Engineering plugin entries must be regular files: {entry.path}

What it means

walk() only yields directories and regular files. Any other file type (FIFO, socket, character/block device) raises this error — special files have no legitimate place in a Claude plugin snapshot and can be used to disrupt or escape the sandbox.

Source

Thrown at eval/workflow_bench/runtime_mounts.py:333

                entries = sorted(scanned, key=lambda entry: entry.name)
        except OSError as exc:
            raise SandboxError(f"Compound Engineering plugin directory is unreadable: {directory}: {exc}") from exc
        for entry in entries:
            relative = relative_dir / entry.name
            if _is_forbidden_plugin_path(relative):
                continue
            try:
                metadata = entry.stat(follow_symlinks=False)
            except OSError as exc:
                raise SandboxError(f"Compound Engineering plugin entry is unreadable: {entry.path}: {exc}") from exc
            if stat.S_ISLNK(metadata.st_mode):
                raise SandboxError(f"Compound Engineering plugin entries must not be symlinks: {entry.path}")
            if stat.S_ISDIR(metadata.st_mode):
                yield from walk(Path(entry.path), relative)
            elif stat.S_ISREG(metadata.st_mode):
                yield relative, Path(entry.path)
            else:
                raise SandboxError(f"Compound Engineering plugin entries must be regular files: {entry.path}")

    for name in _ALLOWED_PLUGIN_DIRS:
        directory = source / name
        if not directory.exists():
            continue
        try:
            metadata = directory.lstat()
        except OSError as exc:
            raise SandboxError(f"Compound Engineering plugin component is unreadable: {directory}: {exc}") from exc
        if stat.S_ISLNK(metadata.st_mode) or not stat.S_ISDIR(metadata.st_mode):
            raise SandboxError(f"Compound Engineering plugin component must be a real directory: {directory}")
        yield from walk(directory, PurePosixPath(name))


def _bounded_plugin_bytes(path: Path) -> tuple[bytes, bool]:
    """Read one stable regular file without following a last-component symlink."""

    try:

View on GitHub (pinned to d540b00184)

Solutions

  1. Locate special files: `find <plugin_dir>/{skills,scripts,assets} -type b -o -type c -o -type p -o -type s`.
  2. Remove them, then re-extract the plugin from a trusted source.
  3. Audit the plugin provenance if unexpected special files appear.
Defensive patterns

Strategy: validation

Validate before calling

import os, stat
from pathlib import Path

def only_regular_and_dirs(source: Path) -> bool:
    for name in ("skills", "scripts", "assets"):
        d = source / name
        if not d.exists():
            continue
        for root, _dirs, files in os.walk(d):
            for f in files:
                mode = (Path(root) / f).lstat().st_mode
                if not (stat.S_ISREG(mode) or stat.S_ISLNK(mode)):
                    return False
    return True

Try / catch

try:
    list(_plugin_files(source))
except SandboxError as exc:
    if "must be regular files" in str(exc):
        # locate and remove the FIFO/socket/device, then re-extract
        ...
    raise

Prevention

When it happens

Trigger: A FIFO, Unix socket, or device node exists under skills/, scripts/, or assets/ — e.g., a leftover mkfifo from debugging, or a maliciously crafted plugin.

Common situations: Manual debugging artifact left in the tree; malicious plugin; broken extract that created device nodes (rare).

Related errors


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