{"record":{"id":"1ac9848b6887f4ba","repo":"abhigyanpatwari/GitNexus","slug":"compound-engineering-plugin-version-mismatch-expe","errorCode":null,"errorMessage":"Compound Engineering plugin version mismatch: expected {config.version}, got {plugin_manifest.get('version')!r}","messagePattern":"Compound Engineering plugin version mismatch: expected (.+?), got (.+?)","errorType":"exception","errorClass":"SandboxError","httpStatus":null,"severity":"error","filePath":"eval/workflow_bench/runtime_mounts.py","lineNumber":457,"sourceCode":"            )\n            entries.append(\n                {\n                    \"path\": relative_text,\n                    \"sha256\": hashlib.sha256(payload).hexdigest(),\n                    \"size\": len(payload),\n                    \"executable\": executable,\n                }\n            )\n\n        manifest_path = root / \".claude-plugin\" / \"plugin.json\"\n        try:\n            plugin_manifest = json.loads(manifest_path.read_text())\n        except (OSError, UnicodeError, json.JSONDecodeError) as exc:\n            raise SandboxError(f\"Compound Engineering plugin manifest is invalid: {exc}\") from exc\n        if not isinstance(plugin_manifest, dict) or plugin_manifest.get(\"name\") != \"compound-engineering\":\n            raise SandboxError(\"CE comparator requires the compound-engineering plugin manifest\")\n        if plugin_manifest.get(\"version\") != config.version:\n            raise SandboxError(\n                \"Compound Engineering plugin version mismatch: \"\n                f\"expected {config.version}, got {plugin_manifest.get('version')!r}\"\n            )\n        for skill in (\"ce-plan\", \"ce-work\", \"ce-code-review\"):\n            if not (root / \"skills\" / skill / \"SKILL.md\").is_file():\n                raise SandboxError(f\"Compound Engineering plugin is missing required skill: {skill}\")\n\n        canonical_manifest = json.dumps(\n            {\n                \"schema_version\": CE_PLUGIN_MANIFEST_SCHEMA_VERSION,\n                \"files\": entries,\n            },\n            sort_keys=True,\n            separators=(\",\", \":\"),\n        ).encode()\n        snapshot = CePluginSnapshot(\n            root=root,\n            version=config.version,","sourceCodeStart":439,"sourceCodeEnd":475,"githubUrl":"https://github.com/abhigyanpatwari/GitNexus/blob/d540b00184d71a896261ee02670da9a92d59d8f7/eval/workflow_bench/runtime_mounts.py#L439-L475","documentation":"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.","triggerScenarios":"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).","commonSituations":"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.","solutions":["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\"'.","Check out the release tag matching the version you intend: 'git -C <plugin_dir> checkout v<X.Y.Z>'.","If you bumped the version locally, rebuild and ensure package.json/plugin.json both carry the new value, then pass it.","Avoid reusing a previous run's --ce-plugin-version flag verbatim after updating the plugin."],"exampleFix":"# before\nwfbench run --ce-plugin-dir ./ce-plugin --ce-plugin-version 1.2.0   # manifest says 1.3.0\n# after\ngit -C ./ce-plugin checkout v1.3.0\nwfbench run --ce-plugin-dir ./ce-plugin --ce-plugin-version 1.3.0","handlingStrategy":"validation","validationCode":"import json, re\nfrom pathlib import Path\n\nplugin = Path(\"ce-plugin\")\ndeclared = json.loads((plugin / \".claude-plugin\" / \"plugin.json\").read_text())[\"version\"]\nflag_version = \"1.3.0\"  # the value you will pass to --ce-plugin-version\nassert re.fullmatch(r\"\\d+\\.\\d+\\.\\d+\", flag_version), \"use exact semver\"\nif declared != flag_version:\n    raise SystemExit(f\"version drift: manifest={declared} flag={flag_version}\")","typeGuard":"import json, re\nfrom pathlib import Path\n\ndef versions_match(plugin_dir: Path, flag_version: str) -> bool:\n    if re.fullmatch(r\"\\d+\\.\\d+\\.\\d+\", flag_version) is None:\n        return False\n    try:\n        data = json.loads((plugin_dir / \".claude-plugin\" / \"plugin.json\").read_text())\n    except (OSError, ValueError):\n        return False\n    return isinstance(data, dict) and data.get(\"version\") == flag_version","tryCatchPattern":"try:\n    snapshot = _build_ce_plugin_snapshot(config, destination_parent)\nexcept SandboxError as exc:\n    if \"version mismatch\" in str(exc):\n        log.error(\"--ce-plugin-version disagrees with manifest; check out the matching tag\")\n    raise","preventionTips":["Read the version from the manifest and pass that exact string.","Check out the release tag matching the version before benchmarking.","Never alias/range the version; the harness requires exact semver."],"tags":["sandbox","ce-plugin","version","manifest","validation","workflow-bench"],"backgroundTag":null,"analyzedSha":"d540b00184d71a896261ee02670da9a92d59d8f7","analyzedAt":"2026-08-12T19:50:25.132Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}