abhigyanpatwari/GitNexus · error · SandboxError

CE comparator requires the compound-engineering plugin manif

Error message

CE comparator requires the compound-engineering plugin manifest

What it means

Identity guard after a successful manifest parse. The parsed plugin.json must be a JSON object whose 'name' field is exactly 'compound-engineering'. Any other value (or a non-dict manifest) means the supplied tree is not the CE comparator plugin the harness expects, so mounting it would benchmark the wrong thing.

Source

Thrown at eval/workflow_bench/runtime_mounts.py:455

                payload,
                executable=executable,
            )
            entries.append(
                {
                    "path": relative_text,
                    "sha256": hashlib.sha256(payload).hexdigest(),
                    "size": len(payload),
                    "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(

View on GitHub (pinned to d540b00184)

Solutions

  1. Confirm the manifest name: 'python -c "import json;print(json.load(open('<plugin_dir>/.claude-plugin/plugin.json'))['name'])"' should print compound-engineering.
  2. Point --ce-plugin-dir at the correct plugin checkout (the one whose manifest name is compound-engineering).
  3. If you forked the plugin intentionally, restore the canonical name field; the harness only benchmarks the named plugin.
  4. Run 'git -C <plugin_dir> status' to confirm you are on the branch/release you intended.

Example fix

// before: .claude-plugin/plugin.json
{ "name": "ce-plugin-fork", "version": "1.0.0" }
// after
{ "name": "compound-engineering", "version": "1.0.0" }
Defensive patterns

Strategy: validation

Validate before calling

import json
from pathlib import Path

plugin = Path("ce-plugin")
data = json.loads((plugin / ".claude-plugin" / "plugin.json").read_text())
if not isinstance(data, dict) or data.get("name") != "compound-engineering":
    raise SystemExit(f"wrong plugin identity: {data.get('name')!r}")

Type guard

import json
from pathlib import Path

def is_compound_engineering_plugin(plugin_dir: Path) -> bool:
    try:
        data = json.loads((plugin_dir / ".claude-plugin" / "plugin.json").read_text())
    except (OSError, ValueError):
        return False
    return isinstance(data, dict) and data.get("name") == "compound-engineering"

Try / catch

try:
    snapshot = _build_ce_plugin_snapshot(config, destination_parent)
except SandboxError as exc:
    if "requires the compound-engineering plugin manifest" in str(exc):
        log.error("wrong plugin passed to --ce-plugin-dir")
    raise

Prevention

When it happens

Trigger: Passing --ce-plugin-dir at a checkout of a different plugin (e.g. the gitnexus plugin, or a renamed fork), or a manifest whose name field was edited. The check fires only after error 548 confirms the file parses.

Common situations: Operator pointed at the wrong directory (e.g. the gitnexus-claude-plugin instead of compound-engineering); a fork renamed the plugin; a template was copied but the name not updated.

Related errors


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