Hmbown/CodeWhale · error · ValidationError

publish package list is missing workspace crates: {missing}

Error message

publish package list is missing workspace crates: {missing}
publish package list contains non-workspace crates: {extra}

What it means

The set of workspace crates named codewhale-* and the positional crate list passed on the command line (the maintained publication order from scripts/release/crates.sh) do not match: codewhale-* crates absent from the list are reported as 'missing', and list entries that are not codewhale-* workspace crates are reported as 'non-workspace'. One or both parts may appear, joined by a newline. The release inventory must exactly mirror the codewhale-* workspace members.

Source

Thrown at scripts/release/validate-crate-publish-order.py:118

        rendered = ", ".join(str(version) for version in versions)
        raise ValidationError(f"workspace packages have mixed versions: {rendered}")

    workspace_by_name = {package["name"]: package for package in packages}
    release_names = sorted(
        name for name in workspace_by_name if name.startswith("codewhale-")
    )
    ordered_set = set(ordered_crates)
    missing = sorted(set(release_names) - ordered_set)
    extra = sorted(ordered_set - set(release_names))
    if missing or extra:
        messages = []
        if missing:
            messages.append("publish package list is missing workspace crates: " + " ".join(missing))
        if extra:
            messages.append(
                "publish package list contains non-workspace crates: " + " ".join(extra)
            )
        raise ValidationError("\n".join(messages))

    positions = {name: index for index, name in enumerate(ordered_crates)}
    has_workspace_dependencies = {name: False for name in release_names}
    publish_edges: set[tuple[str, str, str]] = set()
    for dependent in release_names:
        dependencies = workspace_by_name[dependent].get("dependencies", [])
        if not isinstance(dependencies, list):
            raise ValidationError(f"Cargo metadata dependencies for {dependent} must be a list")
        for dependency in dependencies:
            if not isinstance(dependency, dict) or dependency.get("path") is None:
                continue
            dependency_name = dependency.get("name")
            if dependency_name not in workspace_by_name:
                continue
            has_workspace_dependencies[dependent] = True
            kind = dependency.get("kind") or "normal"
            # Cargo does not compile dev-dependencies while verifying a publish.
            # They may legitimately point back across the publication DAG.

View on GitHub (pinned to 8880682c63)

Solutions

  1. Add each crate named under 'missing' to scripts/release/crates.sh, placed before any crate that depends on it
  2. Remove each entry named under 'non-workspace' from the list, or fix its spelling to match the real package name
  3. Re-run scripts/release/validate-crate-publish-order.py with the updated list until it passes

Example fix

# scripts/release/crates.sh: before
crates=(codewhale-protocol codewhale-tui codewhale-cli)
# workspace gained codewhale-release -> error lists it as missing

# after
crates=(codewhale-protocol codewhale-release codewhale-tui codewhale-cli)
Defensive patterns

Strategy: validation

Validate before calling

# Keep the crate list in sync with codewhale-* workspace members
expected = sorted(p["name"] for p in packages if p["name"].startswith("codewhale-"))
if sorted(ordered_crates) != expected:
    raise SystemExit(
        f"list drift: missing={set(expected) - set(ordered_crates)} "
        f"extra={set(ordered_crates) - set(expected)}"
    )

Prevention

When it happens

Trigger: A new crate codewhale-foo was added to the workspace but not to scripts/release/crates.sh; a crate was removed or renamed (e.g. codewhale-bar -> codewhale-bar2) without updating crates.sh; a typo in a crate name in the list; passing a manually typed crate list that omits or adds entries.

Common situations: Post-merge release validation after adding, renaming, or deleting workspace crates.

Related errors


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