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
- Locate special files: `find <plugin_dir>/{skills,scripts,assets} -type b -o -type c -o -type p -o -type s`.
- Remove them, then re-extract the plugin from a trusted source.
- 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
- Audit plugin trees for special files before snapshotting.
- Only build plugins from trusted, scripted generators.
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
- evidence source must be a regular non-symlink file: {path}
- results directory must not traverse symlinks: {root}
- results artifact parent must be a real directory: {current}
- transcript artifact parent must be owner-only: {current}
- evidence must be a regular non-symlink file: {value}
AI-assisted analysis of abhigyanpatwari/GitNexus@d540b00184 (2026-08-12).
Data as JSON: /api/errors/c446d27edbd99b43.
Report an issue: GitHub.