{"record":{"id":"00f31f08ee3aa9cc","repo":"github/spec-kit","slug":"archive-must-use-canonical-extension-yml-casing","errorCode":null,"errorMessage":"Archive must use canonical 'extension.yml' casing","messagePattern":"Archive must use canonical 'extension\\.yml' casing","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"src/specify_cli/extensions/_commands.py","lineNumber":1926,"sourceCode":"                                and \"extension.yml\" in str(exc).casefold()\n                            ):\n                                raise ValueError(\n                                    \"Downloaded extension archive contains multiple \"\n                                    \"extension.yml manifests\"\n                                ) from exc\n                            raise\n                        manifest_root = extracted_root\n                        top_level = list(extracted_root.iterdir())\n                        root_manifest_entries = [\n                            entry\n                            for entry in top_level\n                            if entry.name.casefold() == \"extension.yml\"\n                        ]\n                        if any(\n                            entry.name != \"extension.yml\"\n                            for entry in root_manifest_entries\n                        ):\n                            raise ValueError(\n                                \"Archive must use canonical 'extension.yml' casing\"\n                            )\n                        canonical_root_manifest = next(\n                            (\n                                entry\n                                for entry in root_manifest_entries\n                                if entry.name == \"extension.yml\"\n                            ),\n                            None,\n                        )\n                        if canonical_root_manifest is not None:\n                            manifest_path = canonical_root_manifest\n                        else:\n                            top_level_dirs = [\n                                entry for entry in top_level if entry.is_dir()\n                            ]\n                            if len(top_level_dirs) != 1:\n                                raise ValueError(","sourceCodeStart":1908,"sourceCodeEnd":1944,"githubUrl":"https://github.com/github/spec-kit/blob/bf88c9f9a82fa370c7a7257aa2b3cf10b457b65c/src/specify_cli/extensions/_commands.py#L1908-L1944","documentation":"Error \"Archive must use canonical 'extension.yml' casing\" thrown in github/spec-kit.","triggerScenarios":"Thrown at src/specify_cli/extensions/_commands.py:1926 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Rename the manifest in the archive to the canonical 'extension.yml' casing."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"bf88c9f9a82fa370c7a7257aa2b3cf10b457b65c","analyzedAt":"2026-08-14T19:43:37.150Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}