abhigyanpatwari/GitNexus · error · SandboxError

Compound Engineering plugin is missing required skill: {skil

Error message

Compound Engineering plugin is missing required skill: {skill}

What it means

Required-skill guard. After manifest identity is confirmed, the harness checks that each of ce-plan, ce-work, ce-code-review has a regular file at skills/<skill>/SKILL.md inside the staged root. Missing any one rejects the plugin, because the CE comparator must exercise all three skills for a valid comparison.

Source

Thrown at eval/workflow_bench/runtime_mounts.py:463

                    "executable": executable,
                }
            )

        manifest_path = root / ".claude-plugin" / "plugin.json"
        try:
            plugin_manifest = json.loads(manifest_path.read_text())
        except (OSError, UnicodeError, json.JSONDecodeError) as exc:
            raise SandboxError(f"Compound Engineering plugin manifest is invalid: {exc}") from exc
        if not isinstance(plugin_manifest, dict) or plugin_manifest.get("name") != "compound-engineering":
            raise SandboxError("CE comparator requires the compound-engineering plugin manifest")
        if plugin_manifest.get("version") != config.version:
            raise SandboxError(
                "Compound Engineering plugin version mismatch: "
                f"expected {config.version}, got {plugin_manifest.get('version')!r}"
            )
        for skill in ("ce-plan", "ce-work", "ce-code-review"):
            if not (root / "skills" / skill / "SKILL.md").is_file():
                raise SandboxError(f"Compound Engineering plugin is missing required skill: {skill}")

        canonical_manifest = json.dumps(
            {
                "schema_version": CE_PLUGIN_MANIFEST_SCHEMA_VERSION,
                "files": entries,
            },
            sort_keys=True,
            separators=(",", ":"),
        ).encode()
        snapshot = CePluginSnapshot(
            root=root,
            version=config.version,
            manifest_digest=hashlib.sha256(canonical_manifest).hexdigest(),
            file_count=len(entries),
            total_bytes=total_bytes,
        )
        _freeze_snapshot(root)
        return snapshot

View on GitHub (pinned to d540b00184)

Solutions

  1. Verify each required file: 'for s in ce-plan ce-work ce-code-review; do test -f <plugin_dir>/skills/$s/SKILL.md || echo MISSING $s; done'.
  2. Restore the missing skill from the canonical plugin repo at the matching version tag.
  3. Ensure the release/archive step includes skills/*/SKILL.md (check it is not git-ignored or stripped by a bundler).
  4. Confirm SKILL.md is a regular file, not a directory or symlink.

Example fix

# before: only ce-plan and ce-work shipped
find ce-plugin/skills -maxdepth 2 -name SKILL.md
# skills/ce-plan/SKILL.md
# skills/ce-work/SKILL.md
# after: restore the missing skill
git -C ce-plugin checkout v1.3.0 -- skills/ce-code-review/SKILL.md
Defensive patterns

Strategy: validation

Validate before calling

from pathlib import Path

plugin = Path("ce-plugin")
missing = [s for s in ("ce-plan", "ce-work", "ce-code-review")
          if not (plugin / "skills" / s / "SKILL.md").is_file()]
if missing:
    raise SystemExit(f"plugin missing required skills: {missing}")

Type guard

from pathlib import Path

def has_required_skills(plugin_dir: Path) -> bool:
    return all((plugin_dir / "skills" / s / "SKILL.md").is_file()
               for s in ("ce-plan", "ce-work", "ce-code-review"))

Try / catch

try:
    snapshot = _build_ce_plugin_snapshot(config, destination_parent)
except SandboxError as exc:
    if "missing required skill" in str(exc):
        log.error("restore the missing skill(s) in the plugin checkout")
    raise

Prevention

When it happens

Trigger: One of skills/ce-plan/SKILL.md, skills/ce-work/SKILL.md, or skills/ce-code-review/SKILL.md is absent or not a regular file (e.g. a symlink, which earlier walking may have rejected, or a directory). Fires after errors 548-550, so the manifest itself is fine.

Common situations: Partial checkout missing a skill folder; a release archive that excluded empty-looking SKILL.md files; a refactor that renamed a skill without keeping the canonical three; a skill shipped only as a symlink (caught earlier) or as a directory.

Related errors


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