{"record":{"id":"17229112c7b0475d","repo":"github/spec-kit","slug":"downloaded-bundle-version-mismatch-for-entry-id-r","errorCode":null,"errorMessage":"Downloaded bundle version mismatch for {entry.id!r}: catalog declares {entry.version!r}, but the manifest declares {manifest.bundle.version!r}.","messagePattern":"Downloaded bundle version mismatch for (.+?): catalog declares (.+?), but the manifest declares (.+?)\\.","errorType":"exception","errorClass":"BundlerError","httpStatus":null,"severity":"error","filePath":"src/specify_cli/commands/bundle/__init__.py","lineNumber":1078,"sourceCode":"\n    report = validate_manifest(manifest)\n    if report.ok:\n        return\n    raise BundlerError(\n        f\"{source} contains an invalid bundle manifest:\\n  - \"\n        + \"\\n  - \".join(report.errors)\n    )\n\n\ndef _validate_catalog_manifest(entry, manifest) -> None:\n    \"\"\"Bind a downloaded manifest to the catalog identity that selected it.\"\"\"\n    if manifest.bundle.id != entry.id:\n        raise BundlerError(\n            f\"Downloaded bundle id mismatch: catalog entry {entry.id!r} points to \"\n            f\"a manifest for {manifest.bundle.id!r}.\"\n        )\n    if manifest.bundle.version != entry.version:\n        raise BundlerError(\n            f\"Downloaded bundle version mismatch for {entry.id!r}: catalog declares \"\n            f\"{entry.version!r}, but the manifest declares \"\n            f\"{manifest.bundle.version!r}.\"\n        )\n    _validate_manifest_structure(\n        manifest,\n        source=f\"Downloaded bundle {entry.id!r}\",\n    )\n\n\ndef register(app: typer.Typer) -> None:\n    \"\"\"Attach the bundle command group to the root Typer app.\"\"\"\n    app.add_typer(bundle_app, name=\"bundle\")\n","sourceCodeStart":1060,"sourceCodeEnd":1092,"githubUrl":"https://github.com/github/spec-kit/blob/bf88c9f9a82fa370c7a7257aa2b3cf10b457b65c/src/specify_cli/commands/bundle/__init__.py#L1060-L1092","documentation":"After confirming the bundle id, Spec Kit requires the catalog entry version and downloaded manifest version to match exactly. A difference means the catalog metadata and published artifact describe different releases, so installation/update is stopped before mutation.","triggerScenarios":"`_validate_catalog_manifest` compares `manifest.bundle.version` with `entry.version` after a catalog download and finds they differ, including formatting differences such as `v1.2.3` versus `1.2.3`.","commonSituations":"The artifact version was bumped but the catalog still lists the old version, the catalog was bumped while the download URL still points to the old tag, or one side added a `v` prefix.","solutions":["Make the catalog entry version exactly equal to bundle.yml's bundle.version, normally plain semver without a `v` prefix.","If the catalog version is new, ensure download_url points to the newly published artifact.","Re-tag/re-publish the release if the artifact itself carries the stale version.","Retry `specify bundle info <id>` to verify the aligned pair before installing."],"exampleFix":"# catalog.json (before)\n{\"id\": \"demo\", \"version\": \"1.1.0\"}\n# bundle.yml\nversion: 1.0.0\n\n# catalog.json (after)\n{\"id\": \"demo\", \"version\": \"1.0.0\"}","handlingStrategy":"validation","validationCode":"def catalog_and_manifest_versions_match(entry, manifest) -> bool:\n    return manifest.bundle.version == entry.version","typeGuard":null,"tryCatchPattern":"except BundlerError as exc:\n    if \"bundle version mismatch\" in str(exc):\n        block_install_until_catalog_and_artifact_are_aligned()\n    else:\n        raise","preventionTips":["Generate the catalog version from bundle.yml during release automation.","Use the same plain semver format on both sides and omit a `v` prefix.","Update download_url and version in the same commit/tag."],"tags":["versioning","integrity","bundle","catalog","manifest"],"backgroundTag":null,"analyzedSha":"bf88c9f9a82fa370c7a7257aa2b3cf10b457b65c","analyzedAt":"2026-08-14T19:43:37.150Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}