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
- Add each crate named under 'missing' to scripts/release/crates.sh, placed before any crate that depends on it
- Remove each entry named under 'non-workspace' from the list, or fix its spelling to match the real package name
- 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
- Treat scripts/release/crates.sh as release-critical: update it in the same commit that adds/removes/renames any codewhale-* crate
- Run the validator in CI on every push so inventory drift is caught immediately
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
- Cargo metadata contains duplicate workspace package names
- workspace packages have mixed versions: {rendered}
- could not read Cargo metadata: {error}
- cargo metadata failed with exit code {process.returncode}{su
- Cargo metadata is not valid JSON: {error}
AI-assisted analysis of Hmbown/CodeWhale@8880682c63 (2026-08-16).
Data as JSON: /api/errors/c1502c20a5a4e31b.
Report an issue: GitHub.