{"record":{"id":"b517124cc1151871","repo":"Hmbown/CodeWhale","slug":"cargo-metadata-is-not-valid-json-error","errorCode":null,"errorMessage":"Cargo metadata is not valid JSON: {error}","messagePattern":"Cargo metadata is not valid JSON: (.+?)","errorType":"validation","errorClass":"ValidationError","httpStatus":null,"severity":"error","filePath":"scripts/release/validate-crate-publish-order.py","lineNumber":56,"sourceCode":"    else:\n        process = subprocess.run(\n            [\"cargo\", \"metadata\", \"--locked\", \"--format-version\", \"1\", \"--no-deps\"],\n            check=False,\n            capture_output=True,\n            text=True,\n        )\n        if process.returncode != 0:\n            detail = process.stderr.strip()\n            suffix = f\": {detail}\" if detail else \"\"\n            raise ValidationError(\n                f\"cargo metadata failed with exit code {process.returncode}{suffix}\"\n            )\n        raw = process.stdout\n\n    try:\n        metadata = json.loads(raw)\n    except json.JSONDecodeError as error:\n        raise ValidationError(f\"Cargo metadata is not valid JSON: {error}\") from error\n    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:","sourceCodeStart":38,"sourceCodeEnd":74,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/8880682c63083a91624de936797efa3ce9e498fd/scripts/release/validate-crate-publish-order.py#L38-L74","documentation":"The metadata text failed json.loads with a JSONDecodeError. Real 'cargo metadata --format-version 1' always emits valid JSON, so in practice this means the --metadata-file fixture is corrupted, truncated, or contains non-JSON content.","triggerScenarios":"A fixture file that was hand-edited and broke syntax; a truncated redirect; stderr or shell noise captured into the file (e.g. '2>&1' or wrong fd order); an empty file.","commonSituations":"Maintaining test fixtures for validate-crate-publish-order.py and saving a partial or annotated copy of cargo metadata output.","solutions":["Locate the syntax error: python3 -m json.tool <metadata-file>","Regenerate the fixture cleanly: cargo metadata --locked --format-version 1 --no-deps > <metadata-file>","Make sure only stdout was redirected, with no shell diagnostics mixed in"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"import json\n\nif args.metadata_file is not None:\n    json.loads(args.metadata_file.read_text(encoding=\"utf-8\"))  # fail early with a clear location","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Regenerate fixtures with a single redirect of stdout only: cargo metadata --format-version 1 --no-deps > fixture.json","Lint fixtures in CI with python -m json.tool so corruption is caught before the release run"],"tags":["json","cargo","release","fixtures","python"],"backgroundTag":null,"analyzedSha":"8880682c63083a91624de936797efa3ce9e498fd","analyzedAt":"2026-08-16T11:31:27.956Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}