Hmbown/CodeWhale · error · ValidationError

Cargo metadata omits workspace package ids: {missing_ids}

Error message

Cargo metadata omits workspace package ids: {missing_ids}

What it means

Some ids listed in workspace_members have no matching entry (by 'id') in the packages array. The member list and the package records are therefore inconsistent, and the validator cannot resolve those members; the message lists the offending member ids.

Source

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

    if not isinstance(metadata, dict):
        raise ValidationError("Cargo metadata root must be an object")
    return metadata


def workspace_packages(metadata: dict[str, Any]) -> list[dict[str, Any]]:
    members = metadata.get("workspace_members")
    packages = metadata.get("packages")
    if not isinstance(members, list) or not isinstance(packages, list):
        raise ValidationError("Cargo metadata must contain workspace_members and packages lists")

    packages_by_id = {
        package.get("id"): package
        for package in packages
        if isinstance(package, dict) and isinstance(package.get("id"), str)
    }
    missing_ids = [member for member in members if member not in packages_by_id]
    if missing_ids:
        raise ValidationError(
            "Cargo metadata omits workspace package ids: " + ", ".join(missing_ids)
        )
    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):

View on GitHub (pinned to 8880682c63)

Solutions

  1. Regenerate the fixture in one shot from the same workspace state so members and packages agree
  2. Or edit workspace_members to remove the ids you deleted from packages
Defensive patterns

Strategy: type-guard

Type guard

def members_resolvable(metadata: dict) -> bool:
    members = metadata.get("workspace_members", [])
    ids = {p.get("id") for p in metadata.get("packages", []) if isinstance(p, dict)}
    return all(m in ids for m in members)

Prevention

When it happens

Trigger: A fixture whose packages array was trimmed while workspace_members still references the removed entries; mixing outputs captured from two different workspace states.

Common situations: Curating cargo-metadata fixtures for unit tests and deleting package entries without updating the member list.

Related errors


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