abhigyanpatwari/GitNexus · error · SandboxError

Compound Engineering plugin version mismatch: expected {conf

Error message

Compound Engineering plugin version mismatch: expected {config.version}, got {plugin_manifest.get('version')!r}

What it means

Version pinning guard. validate_ce_plugin_inputs already requires --ce-plugin-version to be an exact semver (no ranges/aliases); _build_ce_plugin_snapshot then verifies the manifest's 'version' field equals that exact string. A mismatch means the operator's declared version and the checked-out plugin disagree, which would make benchmark provenance ambiguous.

Source

Thrown at eval/workflow_bench/runtime_mounts.py:457

            )
            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(
            root=root,
            version=config.version,

View on GitHub (pinned to d540b00184)

Solutions

  1. Read the manifest version and pass that exact value: 'V=$(python -c "import json;print(json.load(open('<d>/.claude-plugin/plugin.json'))['version'])"); wfbench ... --ce-plugin-dir <d> --ce-plugin-version "$V"'.
  2. Check out the release tag matching the version you intend: 'git -C <plugin_dir> checkout v<X.Y.Z>'.
  3. If you bumped the version locally, rebuild and ensure package.json/plugin.json both carry the new value, then pass it.
  4. Avoid reusing a previous run's --ce-plugin-version flag verbatim after updating the plugin.

Example fix

# before
wfbench run --ce-plugin-dir ./ce-plugin --ce-plugin-version 1.2.0   # manifest says 1.3.0
# after
git -C ./ce-plugin checkout v1.3.0
wfbench run --ce-plugin-dir ./ce-plugin --ce-plugin-version 1.3.0
Defensive patterns

Strategy: validation

Validate before calling

import json, re
from pathlib import Path

plugin = Path("ce-plugin")
declared = json.loads((plugin / ".claude-plugin" / "plugin.json").read_text())["version"]
flag_version = "1.3.0"  # the value you will pass to --ce-plugin-version
assert re.fullmatch(r"\d+\.\d+\.\d+", flag_version), "use exact semver"
if declared != flag_version:
    raise SystemExit(f"version drift: manifest={declared} flag={flag_version}")

Type guard

import json, re
from pathlib import Path

def versions_match(plugin_dir: Path, flag_version: str) -> bool:
    if re.fullmatch(r"\d+\.\d+\.\d+", flag_version) is None:
        return False
    try:
        data = json.loads((plugin_dir / ".claude-plugin" / "plugin.json").read_text())
    except (OSError, ValueError):
        return False
    return isinstance(data, dict) and data.get("version") == flag_version

Try / catch

try:
    snapshot = _build_ce_plugin_snapshot(config, destination_parent)
except SandboxError as exc:
    if "version mismatch" in str(exc):
        log.error("--ce-plugin-version disagrees with manifest; check out the matching tag")
    raise

Prevention

When it happens

Trigger: The operator passed --ce-plugin-version X.Y.Z but the checked-out plugin's manifest declares a different version (a tag mismatch, an untagged commit, or a local build whose version was bumped).

Common situations: Checking out a branch instead of the release tag; building locally after bumping the version in source but before tagging; pointing at a stale checkout from a previous release; copy-pasting a version flag from one run to the next without updating.

Related errors


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