abhigyanpatwari/GitNexus · error · ValueError
ce_* arms require both --ce-plugin-dir and --ce-plugin-versi
Error message
ce_* arms require both --ce-plugin-dir and --ce-plugin-version
What it means
validate_ce_plugin_inputs() raises ValueError when a ce_* arm is selected but only one (or neither) of --ce-plugin-dir / --ce-plugin-version is supplied. CE arms require both because the snapshot is built from a directory pinned to an exact version.
Source
Thrown at eval/workflow_bench/runtime_mounts.py:268
raise SandboxError("pinned GitNexus shared runtime has an unexpected package identity")
return mounts
def validate_ce_plugin_inputs(
arms: Sequence[str],
plugin_dir: Path | None,
plugin_version: str | None,
) -> CePluginConfig | None:
"""Require an explicit directory and exact version iff a CE arm is selected."""
has_ce_arm = any(arm in CE_ARMS for arm in arms)
supplied = plugin_dir is not None or plugin_version is not None
if not has_ce_arm:
if supplied:
raise ValueError("--ce-plugin-dir and --ce-plugin-version require at least one ce_* arm")
return None
if plugin_dir is None or plugin_version is None:
raise ValueError("ce_* arms require both --ce-plugin-dir and --ce-plugin-version")
if _EXACT_VERSION.fullmatch(plugin_version) is None:
raise ValueError("--ce-plugin-version must be an exact semantic version (aliases and ranges are forbidden)")
source = _validated_runtime_root(plugin_dir, label="Compound Engineering plugin source")
return CePluginConfig(source=source, version=plugin_version)
def _is_forbidden_plugin_path(relative: PurePosixPath) -> bool:
for part in relative.parts:
lowered = part.lower()
if lowered in _FORBIDDEN_PATH_PARTS or lowered in _SECRET_EXACT_NAMES:
return True
if lowered.startswith(".env.") or lowered.startswith(".npmrc."):
return True
if lowered.endswith(_SECRET_SUFFIXES) or any(marker in lowered for marker in _SECRET_NAME_MARKERS):
return True
return False
View on GitHub (pinned to d540b00184)
Solutions
- Supply both flags together: `--ce-plugin-dir <dir> --ce-plugin-version <exact-semver>`.
- If version is unknown, look it up in the plugin's .claude-plugin/plugin.json first.
Example fix
# before --arms ce_review --ce-plugin-dir ./plugin # after --arms ce_review --ce-plugin-dir ./plugin --ce-plugin-version 1.2.3
Defensive patterns
Strategy: validation
Validate before calling
from eval.workflow_bench.runtime_mounts import CE_ARMS
def ce_arm_inputs_complete(arms, plugin_dir, plugin_version) -> bool:
has_ce_arm = any(a in CE_ARMS for a in arms)
if not has_ce_arm:
return True
return plugin_dir is not None and plugin_version is not None Try / catch
try:
cfg = validate_ce_plugin_inputs(arms, plugin_dir, plugin_version)
except ValueError as exc:
if "require both" in str(exc):
# fill in the missing flag
...
raise Prevention
- Treat --ce-plugin-dir and --ce-plugin-version as a pair in CLI wrappers.
- Add an assertion in your wrapper script that both are non-None before invoking the benchmark.
When it happens
Trigger: Invoking with `--arms ce_review --ce-plugin-dir ./plugin` (version missing), or `--arms ce_workflow --ce-plugin-version 1.2.3` (dir missing).
Common situations: User supplies the directory but forgets the version flag (or vice versa); partial config file templating.
Related errors
- --ce-plugin-dir and --ce-plugin-version require at least one
- --ce-plugin-version must be an exact semantic version (alias
- Malformed --shard arg '${malformed}' — expected --shard=<ind
- ${flag} must be a positive integer
- ${flag} is too large
AI-assisted analysis of abhigyanpatwari/GitNexus@d540b00184 (2026-08-12).
Data as JSON: /api/errors/10f32d87487e56b9.
Report an issue: GitHub.