{"record":{"id":"872731596b81baec","repo":"Hmbown/CodeWhale","slug":"cargo-metadata-omits-workspace-package-ids-missing-ids","errorCode":null,"errorMessage":"Cargo metadata omits workspace package ids: {missing_ids}","messagePattern":"Cargo metadata omits workspace package ids: (.+?)","errorType":"validation","errorClass":"ValidationError","httpStatus":null,"severity":"error","filePath":"scripts/release/validate-crate-publish-order.py","lineNumber":75,"sourceCode":"    if not isinstance(metadata, dict):\n        raise ValidationError(\"Cargo metadata root must be an object\")\n    return metadata\n\n\ndef workspace_packages(metadata: dict[str, Any]) -> list[dict[str, Any]]:\n    members = metadata.get(\"workspace_members\")\n    packages = metadata.get(\"packages\")\n    if not isinstance(members, list) or not isinstance(packages, list):\n        raise ValidationError(\"Cargo metadata must contain workspace_members and packages lists\")\n\n    packages_by_id = {\n        package.get(\"id\"): package\n        for package in packages\n        if isinstance(package, dict) and isinstance(package.get(\"id\"), str)\n    }\n    missing_ids = [member for member in members if member not in packages_by_id]\n    if missing_ids:\n        raise ValidationError(\n            \"Cargo metadata omits workspace package ids: \" + \", \".join(missing_ids)\n        )\n    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):","sourceCodeStart":57,"sourceCodeEnd":93,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/433685b2024e7bc4c99e1e2e326bcad39b4d9d65/scripts/release/validate-crate-publish-order.py#L57-L93","documentation":"workspace_packages maps each workspace_members id to a package in 'packages' by its 'id' field and raises this ValidationError listing any member ids with no matching package entry. Every workspace member must resolve to a package for publish-order validation to work.","triggerScenarios":"A workspace member is a path dependency excluded from packages (e.g. a member whose manifest cargo skipped), ids in workspace_members that don't appear verbatim in packages[].id (cargo version formatting differences), or metadata assembled by hand with inconsistent ids.","commonSituations":"Mixed cargo versions generating metadata with different id formats; a new workspace member added that isn't picked up because metadata is stale; manually synthesized metadata where ids were abbreviated instead of using the canonical 'path+hash#name' form.","solutions":["Regenerate metadata with a single consistent cargo version so ids match between workspace_members and packages","Compare the reported missing ids against packages[].id values to spot format divergence","Remove or fix the stale workspace member entries if members were hand-listed","Ensure the workspace members all have valid Cargo.toml manifests so cargo includes them in packages"],"exampleFix":"// before (hand-built ids)\n\"workspace_members\": [\"codewhale-tui\"]\n// after (canonical cargo ids)\n\"workspace_members\": [\"path+file:///tmp/repo#codewhale-tui@0.1.0\"]  // or just regenerate via cargo metadata","handlingStrategy":"validation","validationCode":"import json\nm = json.load(open(\"cargo-metadata.json\"))\nids = {p.get(\"id\") for p in m.get(\"packages\", []) if isinstance(p, dict)}\nmissing = [i for i in m.get(\"workspace_members\", []) if i not in ids]\nif missing:\n    raise SystemExit(f\"members without package entries: {missing}; regenerate metadata with the same cargo version\")","typeGuard":null,"tryCatchPattern":"try:\n    validate_publish_order(metadata_file)\nexcept ValidationError as e:\n    if \"omits workspace package ids\" in str(e):\n        print(f\"id mismatch: {e}; regenerate metadata with one consistent cargo version\")","preventionTips":["Use one cargo version to generate and consume metadata","Don't hand-write workspace_members ids; copy from real cargo output","Keep all workspace members' manifests valid so they appear in packages"],"tags":["python","cargo","validation","workspace"],"backgroundTag":"schema-validation-failed","analyzedSha":"433685b2024e7bc4c99e1e2e326bcad39b4d9d65","analyzedAt":"2026-09-15T12:24:24.634Z","contentChangedAt":"2026-09-15T12:24:24.634Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}