{"record":{"id":"6ff57656709cc649","repo":"abhigyanpatwari/GitNexus","slug":"compound-engineering-plugin-manifest-is-missing","errorCode":null,"errorMessage":"Compound Engineering plugin manifest is missing: {manifest_path}","messagePattern":"Compound Engineering plugin manifest is missing: (.+?)","errorType":"exception","errorClass":"SandboxError","httpStatus":null,"severity":"error","filePath":"eval/workflow_bench/runtime_mounts.py","lineNumber":302,"sourceCode":"    return False\n\n\ndef _plugin_files(source: Path) -> Iterator[tuple[PurePosixPath, Path]]:\n    \"\"\"Yield only allowlisted plugin files in stable order.\"\"\"\n\n    manifest_root = source / \".claude-plugin\"\n    try:\n        manifest_root_metadata = manifest_root.lstat()\n    except OSError as exc:\n        raise SandboxError(\n            f\"Compound Engineering plugin manifest directory is unavailable: {manifest_root}: {exc}\"\n        ) from exc\n    if stat.S_ISLNK(manifest_root_metadata.st_mode) or not stat.S_ISDIR(manifest_root_metadata.st_mode):\n        raise SandboxError(f\"Compound Engineering plugin manifest directory must be real: {manifest_root}\")\n    required_manifest = _ALLOWED_PLUGIN_MANIFESTS[0]\n    manifest_path = source / Path(*required_manifest.parts)\n    if not manifest_path.exists():\n        raise SandboxError(f\"Compound Engineering plugin manifest is missing: {manifest_path}\")\n    for relative in _ALLOWED_PLUGIN_MANIFESTS:\n        candidate = source / Path(*relative.parts)\n        if candidate.exists():\n            yield relative, candidate\n\n    skills = source / \"skills\"\n    if not skills.exists():\n        raise SandboxError(f\"Compound Engineering plugin skills directory is missing: {skills}\")\n\n    def walk(directory: Path, relative_dir: PurePosixPath) -> Iterator[tuple[PurePosixPath, Path]]:\n        try:\n            with os.scandir(directory) as scanned:\n                entries = sorted(scanned, key=lambda entry: entry.name)\n        except OSError as exc:\n            raise SandboxError(f\"Compound Engineering plugin directory is unreadable: {directory}: {exc}\") from exc\n        for entry in entries:\n            relative = relative_dir / entry.name\n            if _is_forbidden_plugin_path(relative):","sourceCodeStart":284,"sourceCodeEnd":320,"githubUrl":"https://github.com/abhigyanpatwari/GitNexus/blob/d540b00184d71a896261ee02670da9a92d59d8f7/eval/workflow_bench/runtime_mounts.py#L284-L320","documentation":"_ALLOWED_PLUGIN_MANIFESTS[0] (.claude-plugin/plugin.json) is mandatory. If .claude-plugin/ is real but plugin.json does not exist (.exists() is False), the harness cannot load the plugin and aborts.","triggerScenarios":".claude-plugin/ contains only marketplace.json (or nothing); plugin.json was renamed; the file was deleted.","commonSituations":"Incomplete plugin release; generator/template that emits only marketplace.json; manual cleanup that removed the wrong file.","solutions":["Create .claude-plugin/plugin.json with the required fields (name, version).","If you intended a different manifest name, also add plugin.json — the harness only relaxes this for the optional secondary manifests."],"exampleFix":"// before: .claude-plugin/ contains only marketplace.json\n// after: add .claude-plugin/plugin.json\n{\n  \"name\": \"compound-engineering\",\n  \"version\": \"1.2.3\"\n}","handlingStrategy":"validation","validationCode":"from pathlib import Path\n\ndef manifest_present(source: Path) -> bool:\n    return (source / \".claude-plugin\" / \"plugin.json\").exists()","typeGuard":null,"tryCatchPattern":"try:\n    list(_plugin_files(source))\nexcept SandboxError as exc:\n    if \"manifest is missing\" in str(exc):\n        # add .claude-plugin/plugin.json\n        ...\n    raise","preventionTips":["Treat .claude-plugin/plugin.json as required in plugin templates.","Run a plugin lint step in CI that fails when plugin.json is absent."],"tags":["ce-plugin","manifest","structure"],"backgroundTag":null,"analyzedSha":"d540b00184d71a896261ee02670da9a92d59d8f7","analyzedAt":"2026-08-12T19:50:25.132Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}