Hmbown/CodeWhale · error · ValueError

version must be a semantic release identifier

Error message

version must be a semantic release identifier

What it means

CodewhaleHarness._validate_config() fullmatches config.version against ^[0-9]+\.[0-9]+\.[0-9]+(?:[-+][0-9A-Za-z.-]+)?$ — three numeric segments with an optional prerelease/build tail and no leading 'v'. The version selects the GitHub release the harness installs and pins the stream-json schema it expects (default 0.9.1), so malformed values fail fast in setup() and launch() instead of mid-rollout.

Source

Thrown at integrations/verifiers-codewhale/codewhale_harness/harness.py:98

    """Preinstalled facade inside the runtime; useful for local candidate testing."""

    max_turns: int | None = None
    """Optional model-step ceiling; omitted rollouts are unlimited."""

    sandbox: Literal["auto", "read-only", "workspace-write", "external-sandbox"] = (
        "auto"
    )
    """`auto` keeps subprocess runs workspace-bound and trusts isolated runtimes."""


class CodewhaleHarness(Harness[CodewhaleHarnessConfig]):
    APPENDS_SYSTEM_PROMPT = True
    SUPPORTS_MCP = True
    SUPPORTS_USER_SIM = False

    def _validate_config(self) -> None:
        if not _VERSION.fullmatch(self.config.version):
            raise ValueError("version must be a semantic release identifier")
        if (
            self.config.max_turns is not None
            and not 1 <= self.config.max_turns <= 10_000
        ):
            raise ValueError("max_turns must be between 1 and 10000")
        invalid = [
            tool
            for tool in self.config.disabled_tools or []
            if not _TOOL.fullmatch(tool)
        ]
        if invalid:
            raise ValueError(
                "disabled_tools must use Codewhale catalog identifiers: "
                + ", ".join(repr(tool) for tool in invalid)
            )

    @property
    def binary(self) -> str:

View on GitHub (pinned to 8880682c63)

Solutions

  1. Strip any leading 'v' and use exactly three numeric segments, e.g. '0.9.1'
  2. Copy the version from the config default or the release page's plain version string
  3. Validate with the same regex before constructing CodewhaleHarnessConfig

Example fix

# before
config = CodewhaleHarnessConfig(version='v0.9.1')
# after
config = CodewhaleHarnessConfig(version='0.9.1')
Defensive patterns

Strategy: validation

Validate before calling

import re
_VERSION = re.compile(r'^[0-9]+\.[0-9]+\.[0-9]+(?:[-+][0-9A-Za-z.-]+)?$')
version = version[1:] if version.startswith('v') else version
if not _VERSION.fullmatch(version):
    raise ValueError(f'not a semantic release: {version}')
config = CodewhaleHarnessConfig(version=version)

Prevention

When it happens

Trigger: version='v0.9.1' (tag-style leading v), '0.9' (missing patch segment), '0.9.1.2', 'latest', a branch name, or a commit SHA.

Common situations: Pasting release tags as displayed on GitHub (they carry the v prefix); feeding git describe output; CI injecting the checked-out ref as the version.

Related errors


AI-assisted analysis of Hmbown/CodeWhale@8880682c63 (2026-08-16). Data as JSON: /api/errors/4e425f06a89a0164. Report an issue: GitHub.