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
- Regenerate the fixture in one shot from the same workspace state so members and packages agree
- 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
- Capture fixtures in one shot from a single workspace state
- Never edit workspace_members and packages independently
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
- Cargo metadata is not valid JSON: {error}
- Cargo metadata root must be an object
- Cargo metadata must contain workspace_members and packages l
- 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/872731596b81baec.
Report an issue: GitHub.