Hmbown/CodeWhale · error · ValidationError
Cargo metadata contains duplicate workspace package names
Error message
Cargo metadata contains duplicate workspace package names
What it means
Two or more workspace packages share the same name. The validator indexes packages by name to build the release inventory and record positions, and duplicate names would also collide as crates.io package names. This is only reachable with genuinely duplicated workspace packages or a fixture that repeats an entry.
Source
Thrown at scripts/release/validate-crate-publish-order.py:96
return [packages_by_id[member] for member in members]
def validate_order(
packages: list[dict[str, Any]], ordered_crates: list[str]
) -> tuple[str, dict[str, bool]]:
duplicate_crates = sorted(
{name for name in ordered_crates if ordered_crates.count(name) > 1}
)
if duplicate_crates:
raise ValidationError(
"publish package list contains duplicates: " + ", ".join(duplicate_crates)
)
names = [package.get("name") for package in packages]
if any(not isinstance(name, str) or not name for name in names):
raise ValidationError("workspace package is missing a name")
if len(set(names)) != len(names):
raise ValidationError("Cargo metadata contains duplicate workspace package names")
versions = sorted({package.get("version") for package in packages})
if len(versions) != 1 or not isinstance(versions[0], str) or not versions[0]:
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:View on GitHub (pinned to 8880682c63)
Solutions
- Find and rename the duplicate: rg '^name = ' --glob 'Cargo.toml' | sort | uniq -d
- Or remove/exclude one of the identically named members from the workspace
- Regenerate metadata and re-run the validator
Example fix
# crates/new-thing/Cargo.toml: before (copied from codewhale-protocol) [package] name = "codewhale-protocol" # after [package] name = "codewhale-new-thing"
Defensive patterns
Strategy: validation
Validate before calling
names = [p["name"] for p in packages]
if len(set(names)) != len(names):
from collections import Counter
dupes = sorted(c for c, n in Counter(names).items() if n > 1)
raise SystemExit(f"duplicate workspace package names: {dupes}") Prevention
- Rename package.name immediately when cloning a crate as a template
- Let cargo metadata be the authority -- never hand-craft package entries
When it happens
Trigger: Two workspace members whose Cargo.toml [package] name fields are identical (e.g. a copied crate directory that was not renamed); a metadata fixture that accidentally includes the same package twice.
Common situations: Cloning a crate as a starting point and forgetting to rename package.name; vendored duplicates; fixture copy-paste.
Related errors
- publish package list contains duplicates: {duplicate_crates}
- workspace packages have mixed versions: {rendered}
- publish package list is missing workspace crates: {missing}
- could not read Cargo metadata: {error}
- cargo metadata failed with exit code {process.returncode}{su
AI-assisted analysis of Hmbown/CodeWhale@8880682c63 (2026-08-16).
Data as JSON: /api/errors/a64b7796390e437c.
Report an issue: GitHub.