{"record":{"id":"3a89ebf69855bdec","repo":"abhigyanpatwari/GitNexus","slug":"compound-engineering-plugin-is-missing-required-sk","errorCode":null,"errorMessage":"Compound Engineering plugin is missing required skill: {skill}","messagePattern":"Compound Engineering plugin is missing required skill: (.+?)","errorType":"exception","errorClass":"SandboxError","httpStatus":null,"severity":"error","filePath":"eval/workflow_bench/runtime_mounts.py","lineNumber":463,"sourceCode":"                    \"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,\n            manifest_digest=hashlib.sha256(canonical_manifest).hexdigest(),\n            file_count=len(entries),\n            total_bytes=total_bytes,\n        )\n        _freeze_snapshot(root)\n        return snapshot","sourceCodeStart":445,"sourceCodeEnd":481,"githubUrl":"https://github.com/abhigyanpatwari/GitNexus/blob/d540b00184d71a896261ee02670da9a92d59d8f7/eval/workflow_bench/runtime_mounts.py#L445-L481","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["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'.","Restore the missing skill from the canonical plugin repo at the matching version tag.","Ensure the release/archive step includes skills/*/SKILL.md (check it is not git-ignored or stripped by a bundler).","Confirm SKILL.md is a regular file, not a directory or symlink."],"exampleFix":"# before: only ce-plan and ce-work shipped\nfind ce-plugin/skills -maxdepth 2 -name SKILL.md\n# skills/ce-plan/SKILL.md\n# skills/ce-work/SKILL.md\n# after: restore the missing skill\ngit -C ce-plugin checkout v1.3.0 -- skills/ce-code-review/SKILL.md","handlingStrategy":"validation","validationCode":"from pathlib import Path\n\nplugin = Path(\"ce-plugin\")\nmissing = [s for s in (\"ce-plan\", \"ce-work\", \"ce-code-review\")\n          if not (plugin / \"skills\" / s / \"SKILL.md\").is_file()]\nif missing:\n    raise SystemExit(f\"plugin missing required skills: {missing}\")","typeGuard":"from pathlib import Path\n\ndef has_required_skills(plugin_dir: Path) -> bool:\n    return all((plugin_dir / \"skills\" / s / \"SKILL.md\").is_file()\n               for s in (\"ce-plan\", \"ce-work\", \"ce-code-review\"))","tryCatchPattern":"try:\n    snapshot = _build_ce_plugin_snapshot(config, destination_parent)\nexcept SandboxError as exc:\n    if \"missing required skill\" in str(exc):\n        log.error(\"restore the missing skill(s) in the plugin checkout\")\n    raise","preventionTips":["Ship all three skills (ce-plan, ce-work, ce-code-review) in every release.","Ensure the archive step includes skills/*/SKILL.md (regular files).","CI gate: assert the three SKILL.md files exist and are regular."],"tags":["sandbox","ce-plugin","skills","manifest","validation","workflow-bench"],"backgroundTag":null,"analyzedSha":"d540b00184d71a896261ee02670da9a92d59d8f7","analyzedAt":"2026-08-12T19:50:25.132Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}