{"record":{"id":"a64b7796390e437c","repo":"Hmbown/CodeWhale","slug":"cargo-metadata-contains-duplicate-workspace-packag","errorCode":null,"errorMessage":"Cargo metadata contains duplicate workspace package names","messagePattern":"Cargo metadata contains duplicate workspace package names","errorType":"validation","errorClass":"ValidationError","httpStatus":null,"severity":"error","filePath":"scripts/release/validate-crate-publish-order.py","lineNumber":96,"sourceCode":"    return [packages_by_id[member] for member in members]\n\n\ndef validate_order(\n    packages: list[dict[str, Any]], ordered_crates: list[str]\n) -> tuple[str, dict[str, bool]]:\n    duplicate_crates = sorted(\n        {name for name in ordered_crates if ordered_crates.count(name) > 1}\n    )\n    if duplicate_crates:\n        raise ValidationError(\n            \"publish package list contains duplicates: \" + \", \".join(duplicate_crates)\n        )\n\n    names = [package.get(\"name\") for package in packages]\n    if any(not isinstance(name, str) or not name for name in names):\n        raise ValidationError(\"workspace package is missing a name\")\n    if len(set(names)) != len(names):\n        raise ValidationError(\"Cargo metadata contains duplicate workspace package names\")\n\n    versions = sorted({package.get(\"version\") for package in packages})\n    if len(versions) != 1 or not isinstance(versions[0], str) or not versions[0]:\n        rendered = \", \".join(str(version) for version in versions)\n        raise ValidationError(f\"workspace packages have mixed versions: {rendered}\")\n\n    workspace_by_name = {package[\"name\"]: package for package in packages}\n    release_names = sorted(\n        name for name in workspace_by_name if name.startswith(\"codewhale-\")\n    )\n    ordered_set = set(ordered_crates)\n    missing = sorted(set(release_names) - ordered_set)\n    extra = sorted(ordered_set - set(release_names))\n    if missing or extra:\n        messages = []\n        if missing:\n            messages.append(\"publish package list is missing workspace crates: \" + \" \".join(missing))\n        if extra:","sourceCodeStart":78,"sourceCodeEnd":114,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/8880682c63083a91624de936797efa3ce9e498fd/scripts/release/validate-crate-publish-order.py#L78-L114","documentation":"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.","triggerScenarios":"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.","commonSituations":"Cloning a crate as a starting point and forgetting to rename package.name; vendored duplicates; fixture copy-paste.","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"],"exampleFix":"# crates/new-thing/Cargo.toml: before (copied from codewhale-protocol)\n[package]\nname = \"codewhale-protocol\"\n\n# after\n[package]\nname = \"codewhale-new-thing\"","handlingStrategy":"validation","validationCode":"names = [p[\"name\"] for p in packages]\nif len(set(names)) != len(names):\n    from collections import Counter\n    dupes = sorted(c for c, n in Counter(names).items() if n > 1)\n    raise SystemExit(f\"duplicate workspace package names: {dupes}\")","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Rename package.name immediately when cloning a crate as a template","Let cargo metadata be the authority -- never hand-craft package entries"],"tags":["cargo","release","duplicates","workspace","python"],"backgroundTag":null,"analyzedSha":"8880682c63083a91624de936797efa3ce9e498fd","analyzedAt":"2026-08-16T11:31:27.956Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}