| specify event ${{command}} (${{event}}) failed: ${{(e as Err | exception | error | filesystem, path-traversal, validation |
| errors.join('; ') | exception | error | filesystem, path-traversal, validation |
| Error: --short-name requires a value | console | error | filesystem, symlink, security |
| Error: --number requires a value | console | error | filesystem, directory, validation |
| Error: --number must be a non-negative integer | console | error | filesystem, symlink, security, portability |
| Error: branch_template must include the {number} token so ge | console | error | filesystem, directory, workflow |
| Error: branch_template must not place {slug} before {number} | console | error | filesystem, symlink, race-condition, security |
| Error: branch_template must put {number}- at the start of th | console | error | filesystem, portability, race-condition, security |
| ERROR: --template requires a template name | console | error | filesystem, symlink, security |
| ERROR: Unknown option '{arg}'. Use --help for usage informat | console | error | filesystem, directory, validation |
| ERROR: SPECIFY_INIT_DIR does not point to an existing direct | console | error | filesystem, symlink, security, portability |
| ERROR: SPECIFY_INIT_DIR is not a Spec Kit project (no .speci | console | error | filesystem, symlink, security, portability |
| ERROR: Feature directory not found. Set SPECIFY_FEATURE_DIRE | console | error | workflow, state-management, filesystem |
| ERROR: Feature directory not found. Set SPECIFY_FEATURE_DIRE | console | error | network, download, size-limit, workflow |
| Invalid extension registry {registry}: not a regular file | exception | error | network, download, size-limit, workflow |
| Failed to parse extension registry {registry}: {exc} | exception | error | workflow, size-limit, yaml, validation |
| Invalid extension registry {registry}: root must be a mappin | exception | error | filesystem, workflow, staging, low-level |
| Invalid extension registry {registry}: 'extensions' must be | exception | error | workflow, staging, race-condition, filesystem |
| PyYAML is required to resolve preset template composition | exception | error | workflow, staging, race-condition, security, toctou |
| Failed to parse preset manifest {manifest_path}: {exc} | exception | error | yaml, templates, configuration, preset |
| Wrap layer {path} is missing {placeholder} | exception | error | templates, preset, composition, placeholder |
| Unknown template composition strategy '{strategy}' in {path} | exception | error | templates, preset, configuration, strategy |
| Failed to read template layer for '{template_name}': {exc} | exception | error | templates, filesystem, encoding, composition |
| Template '{template_name}' has composing layers but no repla | exception | error | templates, preset, composition, missing-file |
| Error: {arg} requires a value | console | error | cli, argument-parsing, shell |
| Error: Feature description cannot be empty or contain only w | console | error | cli, validation, shell |
| GitHub API response missing valid tag_name | exception | warning | network, github-api, version-check, proxy |
| Output path {candidate!r} escapes directory {base!r} | validation | error | security, path-traversal, validation, commands |
| Unsupported agent: {agent_name} | validation | error | agents, registry, validation |
| Invalid command name {cmd_name!r}: {name_reason} | validation | error | security, path-traversal, commands, validation |
| Aliases for command {cmd_name!r} must be a list | validation | error | commands, schema, validation, aliases |
| Invalid command alias {alias!r}: {alias_reason} | validation | error | security, path-traversal, aliases, validation |
| Invalid Copilot prompt name {cmd_name!r}: {name_reason} | validation | error | security, path-traversal, copilot, validation |
| AzureDevOpsAuth does not support auth scheme {auth_scheme!r} | validation | error | authentication, azure-devops, configuration |
| auth.json must be a JSON object, got {type(raw).__name__} | validation | error | authentication, json, configuration, validation |
| auth.json must contain a 'providers' array | validation | error | authentication, json, configuration, schema |
| providers[{i}]: must be a JSON object | validation | error | authentication, json, configuration, schema |
| providers[{i}]: 'hosts' must be a non-empty array | validation | error | authentication, json, configuration, schema |
| providers[{i}]: each host must be a non-empty string | validation | error | authentication, json, configuration, validation |
| providers[{i}]: invalid host pattern {h!r}. Only exact hostn | validation | error | authentication, config, validation, security |
| providers[{i}]: 'provider' must be a non-empty string | validation | error | authentication, config, validation |
| providers[{i}]: 'auth' must be a non-empty string | validation | error | authentication, config, validation |
| providers[{i}]: 'token' must be a non-empty string | validation | error | authentication, config, validation, secrets |
| providers[{i}]: 'token_env' must be a non-empty string | validation | error | authentication, config, validation, environment |
| providers[{i}]: unknown provider {provider!r}; registered: { | validation | error | authentication, config, registry, validation |
| providers[{i}]: provider {provider!r} does not support auth | validation | error | authentication, config, validation, provider-mismatch |
| providers[{i}]: auth={auth!r} requires 'token' or 'token_env | validation | error | authentication, config, credentials, validation |
| providers[{i}]: auth='azure-ad' requires 'tenant_id', 'clien | validation | error | authentication, azure, config, validation |
| providers[{i}]: '{field_name}' must be a non-empty string | validation | error | authentication, azure, config, validation, yaml-quoting |
| Malformed catalog config at {path}: expected a mapping at th | exception | error | bundler, catalog, yaml, config, validation |
| Unsupported catalog config schema version '{str(schema_versi | exception | error | bundler, catalog, schema-version, version-mismatch |
| Malformed catalog config at {path}: 'catalogs' must be a lis | exception | error | bundler, catalog, yaml, validation |
| Malformed catalog config at {path}: each catalog entry must | exception | error | bundler, catalog, yaml, validation |
| A catalog url is required. | exception | error | bundler, catalog, validation, cli |
| Invalid catalog url: '{url}'. | exception | error | bundler, catalog, url, validation, ipv6 |
| Unsupported catalog url scheme '{parsed.scheme}://' in '{url | exception | error | bundler, catalog, url, scheme, validation |
| Catalog url must use HTTPS (got {parsed.scheme}://). HTTP is | exception | error | bundler, catalog, https, security, url |
| Catalog url must be a valid URL with a host: {url} | exception | error | bundler, catalog, url, validation, hostname |
| Catalog source '{resolved_id}' (or url) already exists in th | exception | error | bundler, catalog, duplicate, configuration |
| '{target}' is a built-in default source and cannot be delete | exception | error | bundler, catalog, builtin, remove, configuration |
| No project-scoped catalog source matching '{target}' was fou | exception | error | bundler, catalog, not-found, remove |
| Invalid install_policy '{value}' (must be one of {[p.value f | exception | error | bundler, catalog, validation, enum, install-policy |
| Each catalog source must be a mapping. | exception | error | bundler, catalog, validation, configuration |
| A catalog source is missing its 'id'. | exception | error | bundler, catalog, validation, missing-field |
| Catalog source '{source_id}' is missing its 'url'. | exception | error | bundler, catalog, validation, missing-field |
| Catalog source '{source_id}' is missing its 'priority'. | exception | error | bundler, catalog, validation, missing-field, priority |
| Catalog source '{source_id}' has a non-integer priority: {pr | exception | error | bundler, catalog, validation, priority, type-error |
| Catalog entry '{entry_id}': 'tags' must be a list of strings | exception | error | bundler, catalog, validation, tags, untrusted-input |
| Catalog entry '{entry_id}': 'verified' must be a boolean (tr | exception | error | bundler, catalog, validation, verified, untrusted-input |
| Each catalog entry must be a mapping. | exception | error | bundler, catalog, validation, untrusted-input |
| Catalog entry '{entry_id or '<unknown>'}': 'requires' must b | exception | error | bundler, catalog, validation, requires, untrusted-input |
| Catalog entry '{entry_id or '<unknown>'}': 'provides' must b | exception | error | bundler, catalog, validation, provides, untrusted-input |
| Catalog payload must be a JSON object. | exception | error | bundler, catalog, validation, payload, untrusted-input |
| Catalog payload is missing a 'bundles' object. | exception | error | bundler, catalog, validation, payload, missing-field |
| Catalog entry for '{key}' is missing its 'id' field. | exception | error | bundler, catalog, validation, id-mismatch, untrusted-input |
| Catalog entry id mismatch: key '{key}' != entry id '{entry_i | exception | error | bundler, catalog, validation, id-mismatch, untrusted-input |
| Malformed catalog config at {config_path}: expected a mappin | exception | error | bundler, yaml, config, catalog, validation |
| Unsupported catalog config schema version '{str(schema_versi | exception | error | bundler, config, schema-version, version-mismatch, catalog |
| Malformed catalog config at {config_path}: 'catalogs' must b | exception | error | bundler, yaml, catalog, validation, config |
| Manifest must be a YAML mapping at the top level. | exception | error | bundler, yaml, manifest, validation |
| Manifest is missing the required 'bundle' mapping. | exception | error | bundler, manifest, yaml, validation |
| 'requires' must be a mapping when present. | exception | error | bundler, manifest, yaml, validation |
| 'integration' must be a mapping when present. | exception | error | bundler, manifest, yaml, validation, integration |
| 'provides' must be a mapping when present. | exception | error | bundler, manifest, yaml, validation |
| '{field_name}' must be a list of strings when present. | exception | error | bundler, manifest, yaml, validation, list-of-strings |
| provides.{kind} must be a list when present. | exception | error | bundler, manifest, yaml, validation, provides |
| Each provides.{kind} entry must be a mapping. | exception | error | bundler, manifest, yaml, validation, provides |
| provides.{kind} priority must be an integer, got {raw!r}. | exception | error | bundler, manifest, yaml, validation, priority |
| Each installed-bundle record must be a mapping. | exception | error | bundler, records, json, validation, corruption |
| Corrupt record: 'contributed_components' must be a list. | exception | error | bundler, records, json, validation, corruption |
| Corrupt records file: an installed-bundle record is missing | exception | error | bundler, records, json, validation, corruption |
| Corrupt records file: record for bundle '{bundle_id}' is mis | exception | error | bundler, records, json, validation, corruption |
| Corrupt records file: {path} — missing 'schema_version'. Exp | exception | error | bundler, records, json, schema-version, corruption |
| Unsupported records schema version '{seen}' at {path}; this | exception | error | bundler, records, schema-version, version-mismatch, json |
| Corrupt records file: {path} | exception | error | bundler, records, json, validation, corruption |
| Corrupt records file: {path} — 'bundles' must be a list. | exception | error | |
| Each contributed component must be a mapping. | exception | error | |
| Corrupt records file: component 'kind' must be one of {list( | exception | error | |
| Corrupt records file: a contributed component is missing its | exception | error | |
| Component priority must be an integer, got {raw!r}. | exception | error | |
| Catalog '{source_id}' URL is malformed: {url} | exception | error | |
| Catalog '{source_id}' URL must use HTTPS (got {parsed.scheme | exception | error | |
| Catalog '{source_id}' URL must be a valid URL with a host: { | exception | error | |
| Bundled community catalog not found: {path} | exception | error | |
| Catalog {source.id!r} URL is malformed: {url!r} | exception | error | |
| Unknown built-in catalog '{url}'. | exception | error | |
| Catalog file not found: {path} | exception | error | |
| Network access disabled; cannot fetch catalog '{source.id}' | exception | error | |
| Unsupported catalog URL scheme: {url} | exception | error | |
| Failed to fetch catalog from {url}: {exc} | exception | error | |
| Failed to load catalog '{source.id}' ({source.url}): {exc} | exception | error | |
| Bundle '{bundle_id}' was not found in any configured catalog | exception | error | |
| Bundle targets integration '{manifest.integration.id}' but t | exception | error | |
| Failed to install bundle '{plan.bundle_id}': {exc}. No chang | exception | error | bundler, install, rollback, wrapper-error |
| Bundle '{bundle_id}' is not installed. | exception | error | bundler, remove, not-found, state |
| Failed to remove bundle '{bundle_id}': {exc}. {detail} | exception | error | bundler, remove, partial-state, wrapper-error |
| No bundle.yml found in '{bundle_dir}'. | exception | error | bundler, build, manifest, missing-file |
| No README.md found in '{bundle_dir}'. Every bundle must ship | exception | error | bundler, build, readme, contract |
| Refusing to build an invalid manifest. Run 'specify bundle v | exception | error | bundler, build, validation, manifest |
| {kind} '{component_id}' is pinned to version {pinned} in the | exception | error | bundler, versioning, pinned-version, drift |
| Unknown component kind '{kind}'. | exception | error | bundler, dispatch, kind, manifest |
| Failed to {action} {label}. | exception | error | bundler, delegation, typer, workflow, install |
| Preset '{component.id}' is not bundled and network access is | exception | error | bundler, offline, preset, network |
| Preset '{component.id}' not found in any catalog. | exception | error | bundler, preset, catalog, not-found |
| Preset '{component.id}' is from a discovery-only catalog; in | exception | error | bundler, preset, catalog, policy |
| Failed to remove preset '{component.id}': {exc} | exception | error | bundler, preset, remove, wrapper-error |
| Extension '{component.id}' is not bundled and network access | exception | error | bundler, offline, extension, network |
| Extension '{component.id}' not found in any catalog. | exception | error | bundler, extension, catalog, not-found |
| Extension '{component.id}' is from a discovery-only catalog; | exception | error | bundler, extension, catalog, policy |
| Failed to remove extension '{component.id}': {exc} | exception | error | bundler, extension, remove, wrapper-error |
| Workflow '{component.id}' installs from a catalog and networ | exception | error | bundler, offline, workflow, network |
| Step '{component.id}' installs from a catalog and network ac | exception | error | bundler, offline, step, network |
| Cannot resolve an invalid manifest:
- {structural} | exception | error | bundler, manifest, validation, yaml |
| Bundle '{manifest.bundle.id}' requires Spec Kit {manifest.re | exception | error | bundler, version, compatibility, semver |
| Bundle '{manifest.bundle.id}' targets integration '{required | exception | error | bundler, integration, compatibility, guard |
| Bundle '{manifest.bundle.id}' targets integration '{required | exception | error | bundler, integration, project-state, guard |
| No bundle.yml found in '{bundle_dir}'. | exception | error | bundler, manifest, filesystem, path |
| Failed to initialize a Spec Kit project (integration '{integ | exception | error | bundler, init, integration, cli |
| Bundle '{bundle_id}' resolves only from a discovery-only sou | exception | error | bundler, catalog, source, policy |
| Specify a bundle id or use --all. | exception | warning | bundler, cli, usage, arguments |
| Bundle '{target}' is not installed. | exception | error | bundler, update, records, usage |
| Bundle '{target}' resolves only from a discovery-only source | exception | error | bundler, update, catalog, policy |
| No bundle.yml found in '{candidate}'. | exception | error | bundler, manifest, filesystem, path |
| Artifact '{candidate}' does not contain a bundle.yml. | exception | error | bundler, zip, manifest, packaging |
| Could not read bundle.yml inside '{candidate}': {exc} | exception | error | bundler, encoding, utf-8, zip |
| Invalid YAML in bundle.yml inside '{candidate}': {exc} | exception | error | bundler, yaml, zip, validation |
| '{candidate}' is not a recognised bundle source (.zip artifa | exception | error | bundler, path, format, filesystem |
| No bundle.yml found at '{target}'. | exception | error | bundler, manifest, path, filesystem |
| Catalog entry '{resolved.entry.id}' has no download_url; can | exception | error | bundler, catalog, download, data-quality |
| Catalog entry '{resolved.entry.id}' has a malformed download | exception | error | bundler, catalog, url, validation |
| Catalog entry '{resolved.entry.id}' has a non-HTTP(S) downlo | exception | error | bundler, catalog, url, security, https |
| Network access disabled; cannot download bundle '{resolved.e | exception | error | bundler, offline, network, download |
| Refusing to download {label}: URL is malformed: {url} | exception | error | security, url, bundle, catalog, validation |
| Refusing to download {label} over non-HTTPS URL: {url} | exception | error | security, https, url, bundle, catalog |
| Refusing to download {label} from URL with no host: {url} | exception | error | security, url, bundle, catalog, validation |
| Failed to download bundle '{entry_id}' from {_source_desc}: | exception | error | network, download, https, bundle, catalog |
| Downloaded artifact for bundle '{entry_id}' from {_source_de | exception | error | zip, bundle, manifest, download, validation |
| Downloaded artifact for bundle '{entry_id}' from {_source_de | exception | error | internal, defensive, bundle, zip, temp-files |
| Downloaded content for bundle '{entry_id}' from {_source_des | exception | error | yaml, bundle, manifest, download, validation |
| Failed to parse downloaded bundle '{entry_id}' from {_source | exception | error | yaml, bundle, manifest, parse, unexpected-error |
| {source} contains an invalid bundle manifest:\n - " + "\n | validation | error | validation, bundle, manifest, yaml, schema |
| Downloaded bundle id mismatch: catalog entry {entry.id!r} po | exception | critical | integrity, supply-chain, bundle, catalog, manifest |
| Downloaded bundle version mismatch for {entry.id!r}: catalog | exception | error | versioning, integrity, bundle, catalog, manifest |
| {exc} | exception | error | init, extensions, url, download, https |
| Directory not found: {source_path} | exception | error | init, extensions, filesystem, path |
| No extension.yml found in {source_path} | exception | error | init, extensions, filesystem, manifest |
| Could not query extension catalog: {catalog_error} | exception | error | init, extensions, catalog, network, configuration |
| Extension '{ext_spec}' not found in bundled extensions or ca | exception | error | init, extensions, catalog, lookup |
| Extension '{resolved_id}' is bundled with spec-kit but not f | exception | error | init, extensions, installation, bundled, packaging |
| Extension '{ext_spec}' is in the '{catalog_name}' catalog bu | exception | error | security, policy, extensions, catalog, init |
| Unknown event '{event_name}': must be one of {sorted(CANONIC | validation | warning | events, extensions, yaml, configuration, validation |
| Event '{event_name}' handler missing required non-empty 'com | validation | warning | events, extensions, yaml, configuration, validation |
| Event '{event_name}' handler has invalid 'matcher': must be | validation | error | events, validation, yaml, extensions |
| Event '{event_name}' handler has invalid 'timeout': must be | validation | error | events, validation, timeout, yaml |
| failures | exception | error | events, aggregation, extensions, refresh |
| Invalid events: expected a mapping | validation | error | events, validation, yaml, manifest |
| Invalid event '{event_name}': expected a mapping | validation | error | events, validation, yaml, manifest |
| Event '{event_name}' missing required 'command' string | validation | error | events, validation, command, manifest |
| Event '{event_name}' has invalid 'matcher': must be a string | validation | error | events, validation, matcher, manifest |
| Event '{event_name}' has invalid 'timeout': must be a positi | validation | error | events, validation, timeout, manifest |
| Refusing to write event config through a symlink: {walked} | exception | error | security, symlink, filesystem, events, path-traversal |
| Invalid YAML in {path}: {e} | validation | error | yaml, manifest, extensions, parsing |
| Manifest not found: {path} | validation | error | manifest, extensions, file-not-found, install |
| Manifest is not valid UTF-8: {path} ({e.reason} at byte {e.s | validation | error | encoding, utf-8, manifest, extensions |
| Could not read manifest {path}: {e} | validation | error | filesystem, permissions, manifest, extensions |
| Manifest must be a YAML mapping, got {type(data).__name__}: | validation | error | yaml, manifest, extensions, validation |
| Missing required field: {field} | validation | error | manifest, validation, extensions, required-fields |
| Unsupported schema version: {self.data['schema_version']} (e | validation | error | manifest, schema-version, versioning, extensions |
| Invalid extension: expected a mapping, got {type(ext).__name | validation | error | manifest, validation, extensions, yaml |
| Missing extension.{field} | validation | error | manifest, validation, extensions, required-fields |
| Invalid extension.{field}: expected a string, got {type(ext[ | validation | error | manifest, validation, yaml, type-coercion, extensions |
| Invalid extension ID '{ext['id']}': must be lowercase alphan | validation | error | extension-manifest, validation, naming |
| Invalid version: {ext['version']} | validation | error | extension-manifest, validation, versioning |
| Invalid extension.category: must be a non-empty string | validation | error | extension-manifest, validation, optional-fields |
| Invalid extension.effect '{ext.get('effect')}': must be one | validation | error | extension-manifest, validation, allowlist |
| Invalid requires: expected a mapping, got {type(requires).__ | validation | error | extension-manifest, validation, yaml-structure |
| Missing requires.speckit_version | validation | error | extension-manifest, validation, required-fields |
| Invalid requires.speckit_version: expected a non-empty strin | validation | error | extension-manifest, validation, yaml-coercion, compatibility |
| Invalid provides: expected a mapping, got {type(provides).__ | validation | error | extension-manifest, validation, yaml-structure |
| Invalid provides.commands: expected a list | validation | error | extension-manifest, validation, yaml-structure |
| Invalid provides.templates: expected a list | validation | error | extension-manifest, validation, yaml-structure |
| Invalid provides.scripts: expected a list | validation | error | extension-manifest, validation, yaml-structure |
| Invalid hooks: expected a mapping | validation | error | extension-manifest, validation, hooks, yaml-structure |
| Extension must provide at least one command, hook, or event | validation | error | extension-manifest, validation, required-fields |
| Invalid hook '{hook_name}': list must contain at least one e | validation | error | extension-manifest, validation, hooks |
| Invalid hook '{hook_name}': expected a mapping or list of ma | validation | error | extension-manifest, validation, hooks |
| Hook '{hook_name}' missing required 'command' field | validation | error | extension-manifest, validation, hooks, required-fields |
| Hook '{hook_name}' has invalid 'priority': must be an intege | validation | error | extension-manifest, validation, hooks, typing |
| Hook '{hook_name}' has invalid 'priority': must be >= 1 | validation | error | extension-manifest, validation, commands |
| Each command entry in 'provides.commands' must be a mapping | validation | error | extension-manifest, validation, commands, required-fields |
| Command missing 'name' or 'file' | validation | error | extension-manifest, validation, commands, yaml-coercion, typing |
| Invalid command name: expected a string, got {type(cmd['name | validation | error | manifest, validation, extensions, type-error |
| Invalid command 'file' {label}: {reason} | validation | error | extensions, manifest, path-traversal, validation, security |
| Invalid command name '{cmd['name']}': must follow pattern 's | validation | error | extensions, manifest, naming-convention, validation |
| Aliases for command '{cmd['name']}' must be a list | validation | error | extensions, manifest, validation, aliases |
| Aliases for command '{cmd['name']}' must be strings | validation | error | extensions, manifest, validation, aliases, type-error |
| Invalid alias {alias!r} for command '{cmd['name']}': {alias_ | validation | error | extensions, manifest, security, path-traversal, aliases |
| Hook '{hook_name}' must be a mapping or list of mappings, go | validation | error | extensions, manifest, hooks, validation |
| Each entry in 'provides.{section}' must be a mapping | validation | error | extensions, manifest, templates, scripts, validation |
| {singular.capitalize()} missing 'name' or 'file' | validation | error | extensions, manifest, validation, required-field |
| Invalid {singular} name: expected a string, got {type(name). | validation | error | extensions, manifest, validation, type-error |
| Invalid {singular} name '{name}': must be lowercase alphanum | validation | error | extensions, manifest, naming-convention, validation |
| Duplicate {singular} name '{name}' in 'provides.{section}' | validation | error | extensions, manifest, duplicates, validation |
| Invalid {singular} 'file' {label}: {reason} | validation | error | extensions, manifest, path-traversal, security, validation |
| Invalid {singular} description for '{name}': expected a stri | validation | error | extensions, manifest, validation, type-error |
| Invalid {singular} entry '{name}': 'strategy' is not authora | validation | error | extensions, manifest, presets, validation |
| Invalid runtimes for script '{name}': expected a list of str | validation | error | extensions, manifest, scripts, validation, type-error |
| Invalid runtimes {invalid} for script '{name}': must be one | validation | error | extensions, manifest, scripts, validation |
| Extension '{extension_id}' is not installed | exception | error | extensions, registry, key-error, state |
| Cannot restore '{extension_id}': metadata must be a dict | exception | error | extensions, registry, rollback, value-error |
| Extension ID '{manifest.id}' conflicts with core command nam | validation | error | extensions, manifest, naming-convention, namespace, validation |
| Aliases for command '{primary_name}' must be a list | validation | error | |
| {kind.capitalize()} for command '{primary_name}' must be a s | validation | error | |
| Invalid {kind} {name!r}: {path_reason} | validation | error | |
| Invalid {kind} '{name}': must follow pattern 'speckit.{exten | validation | error | |
| {kind.capitalize()} '{name}' must use extension namespace '{ | validation | error | |
| {kind.capitalize()} '{name}' conflicts with core command nam | validation | error | |
| Duplicate command or alias '{name}' in extension manifest | validation | error | |
| Extension commands conflict with installed extensions:\n- {n | validation | error | |
| .extensionignore is not valid UTF-8: {ignore_file} ({e.reaso | validation | error | |
| {skills_dir} is not a directory | console | error | |
| Invalid version specifier: expected a string, got {type(requ | exception | error | |
| Invalid version specifier: {required} | exception | error | |
| Extension requires spec-kit {required}, but {speckit_version | exception | error | |
| Priority must be a positive integer (1 or higher) | validation | error | |
| Extension '{manifest.id}' is already installed. Use 'specify | exception | error | |
| Source path is the install destination for '{manifest.id}' ( | validation | error | |
| Preserved extension config conflict for '{manifest.id}': The | validation | error | |
| Preserved extension config for '{manifest.id}' is a symlink | validation | error | |
| Preserved extension config for '{manifest.id}' cannot be rea | validation | error | |
| No extension.yml found in archive | validation | error | extensions, packaging, zip, manifest |
| Unsupported agent: {agent_name} | exception | error | extensions, agent-integration, validation |
| Invalid catalog format from {url}: expected a JSON object | exception | error | extensions, catalog, json, validation |
| Invalid catalog format from {url} | exception | error | extensions, catalog, json, schema |
| Invalid catalog format from {url}: 'extensions' must be a JS | exception | error | extensions, catalog, json, validation |
| Failed to fetch catalog from {entry.url}: {e} | exception | error | extensions, catalog, network, urllib |
| Invalid JSON in catalog from {entry.url}: {e} | exception | error | extensions, catalog, json, network |
| Failed to fetch any extension catalog | exception | error | extensions, catalog, network, offline |
| Failed to fetch catalog from {catalog_url}: {e} | exception | error | extensions, catalog, network, urllib |
| Invalid JSON in catalog: {e} | exception | error | extensions, catalog, json, network |
| URL must use HTTPS (HTTP is only allowed for localhost) | exception | error | extensions, security, https, url-validation |
| Failed to download from {url}: {exc} | exception | error | extensions, network, download, urllib |
| Could not safely create download file: {exc} | exception | error | extensions, filesystem, permissions, download |
| Could not safely write download file: {exc} | exception | error | extensions, filesystem, disk-full, download |
| {url} did not return a ZIP archive or tar.gz/tgz archive (go | exception | error | extensions, download, authentication, archive-format |
| Could not install extension from downloaded archive: {exc} | exception | error | extensions, filesystem, installation, archive |
ENOTDIR Download file changed between creation and open | exception | error | extensions, security, toctou, symlink |
ELOOP Refusing to write through a symlinked download file | exception | error | extensions, security, symlink, eloop |
| Cannot safely update hard-linked generated artifact '{origin | exception | error | |
| Command rollback found an unexpected directory at '{original | exception | error | |
| Command rollback backup is missing for '{original_file}' | exception | error | |
| Cannot safely create update backup under symlinked directory | exception | error | |
| Cannot safely reuse an existing update backup directory '{ba | exception | error | |
| Downloaded extension archive contains multiple extension.yml | validation | error | |
| Archive must use canonical 'extension.yml' casing | validation | error | |
| Downloaded extension archive must contain exactly one top-le | validation | error | |
| Downloaded extension archive is missing 'extension.yml' | validation | error | |
| Invalid extension manifest in downloaded archive: expected Y | validation | error | |
| Invalid extension manifest in downloaded archive: expected ' | validation | error | |
| Extension ID mismatch: expected '{extension_id}', got '{zip_ | validation | error | |
| Extension version mismatch: expected '{update['available']}' | validation | error | |
| Cannot safely update symlinked Copilot prompt artifact '{pro | exception | error | |
| Registry entry for '{extension_id}' missing or corrupted aft | exception | error | |
| Command rollback found an unexpected directory at '{command_ | exception | error | |
| Skill rollback backup is missing for '{original_path}' | exception | error | |
| Integration key must be lowercase kebab-case, for example 'm | validation | error | |
| Refusing to scaffold outside the repository root: {target} | validation | error | filesystem, validation, scaffold, path-safety |
| Refusing to scaffold through symlinked path: {label} | validation | error | filesystem, symlink, security, scaffold |
| Unsupported integration type '{normalized_type}'. Use one of | validation | error | validation, scaffold, developer-error |
| Run this command from the Spec Kit repository root. | validation | error | validation, scaffold, developer-error |
| Refusing to overwrite existing scaffold file(s): {labels} | validation | error | filesystem, scaffold, idempotency |
| {env_name} is not parseable as a POSIX-quoted command line ( | validation | error | environment, configuration, shell-quoting, developer-error |
| No runnable script variant for this platform: requested {req | exception | error | configuration, templates, scripts, cross-platform |
| Integration destination {dest} escapes project root {project | validation | error | configuration, filesystem, security, path-safety, integrations |
| manifest.project_root ({manifest.project_root}) does not mat | exception | error | integrations, manifest, path-safety, developer-error |
| {type(self).__name__}.config is not set. | validation | error | integrations, configuration, developer-error, skills |
| {type(self).__name__}.config is missing required 'folder' en | validation | error | integrations, configuration, developer-error, skills |
| Skills destination {skills_dir} escapes project root {projec | exception | error | configuration, filesystem, security, integrations, skills |
| Invalid catalog format from {entry.url}: {shape_error} | console | error | network, json, validation, catalog, integrations |
| Failed to fetch catalog from {entry.url}: {exc} | console | error | |
| Catalog from {entry.url} is not valid UTF-8: {exc} | console | error | |
| Invalid JSON in catalog from {entry.url}: {exc} | console | error | |
| Failed to fetch any integration catalog | exception | error | |
| Catalog URL must be non-empty. | validation | error | |
| Failed to read catalog config {config_path}: {exc} | validation | error | |
| Catalog config file {config_path} is corrupted (expected a m | validation | error | |
| Catalog config {config_path} has invalid 'catalogs' value: m | validation | error | |
| Invalid catalog entry at index {idx} in {config_path}: expec | validation | error | |
| Invalid catalog entry at index {idx} in {config_path}: {exc} | validation | error | |
| Catalog URL already configured: {url} | validation | error | |
| Invalid catalog entry at index {idx} in {config_path}: 'prio | validation | error | |
| Invalid catalog entry at index {idx} in {config_path}: 'prio | validation | error | |
| No catalog config file found. | validation | error | |
| Catalog config contains no catalog entries. | validation | error | |
| Catalog config contains no removable catalog entries. | validation | error | |
| Catalog index {index} out of range (0-{len(display_order) - | validation | error | |
| Failed to delete catalog config {config_path}: {exc} | validation | error | |
| Invalid YAML in {path}: {exc} | validation | error | |
| Descriptor not found: {path} | validation | error | |
| Unable to read descriptor {path}: {exc} | validation | error | |
| Descriptor root must be a YAML mapping, got {type(self.data) | validation | error | |
| Missing required field: {field} | validation | error | |
| Unsupported schema version: {self.data['schema_version']} (e | validation | error | |
| 'integration' must be a mapping | validation | error | |
| Missing integration.{field} | validation | error | |
| integration.{field} must be a string, got {type(integ[field] | validation | error | |
| Invalid integration ID '{integ['id']}': must be lowercase al | validation | error | |
| Invalid version '{integ['version']}' | validation | error | |
| 'requires' must be a mapping | validation | error | |
| Missing requires.speckit_version | validation | error | |
| requires.speckit_version must be a non-empty string | validation | error | |
| requires.tools must be a list | validation | error | |
| Each requires.tools entry must be a mapping | validation | error | |
| requires.tools entry 'name' must be a non-empty string | validation | error | |
| 'provides' must be a mapping | validation | error | |
| Invalid provides.commands: expected a list | validation | error | yaml, validation, integration-descriptor, spec-kit |
| Invalid provides.scripts: expected a list | validation | error | yaml, validation, integration-descriptor, spec-kit |
| Integration must provide at least one command or script | validation | error | yaml, validation, integration-descriptor, spec-kit |
| Each command entry must be a mapping | validation | error | yaml, validation, integration-descriptor, spec-kit |
| Command entry missing 'name' or 'file' | validation | error | yaml, validation, integration-descriptor, spec-kit |
| Command entry 'name' must be a non-empty string | validation | error | yaml, validation, integration-descriptor, spec-kit |
| Command entry 'file' must be a non-empty string | validation | error | yaml, validation, integration-descriptor, spec-kit |
| Command entry 'file' must be a relative path without '..': { | validation | error | path-traversal, security, yaml, validation, spec-kit |
| Script entry must be a non-empty string | validation | error | yaml, validation, integration-descriptor, spec-kit |
| Script entry must be a relative path without '..': {script_e | validation | error | path-traversal, security, yaml, validation, spec-kit |
| manifest.project_root ({manifest.project_root}) does not mat | validation | error | filesystem, paths, integration-setup, spec-kit, copilot |
| Integration destination {dest_resolved} escapes project root | validation | error | filesystem, path-containment, security, integration-setup, spec-kit |
| manifest.project_root ({manifest.project_root}) does not mat | validation | error | filesystem, paths, integration-setup, spec-kit, forge |
| Integration destination {dest} escapes project root {project | validation | error | filesystem, path-containment, security, integration-setup, spec-kit, forge |
| --commands-dir is required for the generic integration | validation | error | options, validation, integration-setup, spec-kit, generic |
| manifest.project_root ({manifest.project_root}) does not mat | validation | error | filesystem, paths, integration-setup, spec-kit, generic |
| Integration destination {dest} escapes project root {project | validation | error | path-traversal, security, options, integration-setup, spec-kit |
| manifest.project_root ({manifest.project_root}) does not mat | validation | error | filesystem, paths, integration-setup, spec-kit, hermes |
| Skills destination {new_skills_dir} contains a symlinked pat | validation | error | filesystem, symlink, security, integration-setup, spec-kit, kimi |
| Absolute paths are not allowed in manifests: {rel} | validation | error | filesystem, path-traversal, security, manifest, spec-kit |
| Path {rel} resolves to {resolved} which is outside the proje | validation | error | manifest, path-traversal, security, integrations |
| Integration manifest directory escapes project root: {label} | validation | error | manifest, path-validation, integrations |
| Refusing to use symlinked integration manifest directory: {l | validation | error | manifest, symlink, security, integrations |
| Integration manifest directory path is not a directory: {lab | validation | error | manifest, filesystem, integrations |
| Refusing to overwrite symlinked integration manifest path: { | validation | error | manifest, symlink, security, integrations |
| Integration manifest path is not a file: {label} | validation | error | manifest, filesystem, integrations |
| Integration manifest path escapes project root: {label} | validation | error | manifest, path-resolution, security, integrations |
| Manifest paths must be canonical; '..' segments are not allo | validation | error | manifest, canonicalization, path-traversal |
| Refusing to record symlinked manifest path: {rel} (symlinked | validation | error | manifest, symlink, security |
| Manifest path is not a regular file: {rel} | validation | error | manifest, file-existence, ordering |
| Integration manifest at {path} is not valid UTF-8 | validation | error | manifest, encoding, corruption |
| Integration manifest at {path} contains invalid JSON | validation | error | manifest, json, corruption |
| Integration manifest at {path} must be a JSON object, got {t | validation | error | manifest, json, schema |
| Integration manifest 'files' at {path} must be a mapping of | validation | error | manifest, json, schema, validation |
| Integration manifest 'recovered_files' at {path} must be a l | validation | error | manifest, json, schema, validation |
| Manifest at {path} belongs to integration {stored_key!r}, no | validation | error | manifest, integration-key, misconfiguration |
| Invalid YAML in {path}: {e} | validation | error | presets, yaml, validation |
| Manifest not found: {path} | validation | error | presets, file-not-found, yaml |
| Manifest is not valid UTF-8: {path} ({e.reason} at byte {e.s | validation | error | |
| Could not read manifest {path}: {e} | validation | error | |
| Manifest must be a YAML mapping, got {type(data).__name__}: | validation | error | |
| Missing required field: {field} | validation | error | |
| Unsupported schema version: {self.data['schema_version']} (e | validation | error | |
| Invalid {section}: expected a mapping | validation | error | |
| Missing preset.{field} | validation | error | |
| Invalid preset.{field}: expected a string, got {type(pack[fi | validation | error | |
| Invalid preset ID '{pack['id']}': must be lowercase alphanum | validation | error | |
| Invalid version: {pack['version']} | validation | error | |
| Missing requires.speckit_version | validation | error | |
| Invalid requires.speckit_version: expected a non-empty strin | validation | error | |
| Preset must provide at least one template | validation | error | |
| Invalid provides.templates: expected a list | validation | error | |
| Each template entry in 'provides.templates' must be a mappin | validation | error | |
| Template missing 'type', 'name', or 'file' | validation | error | |
| Invalid template {field}: expected a string, got {type(tmpl[ | validation | error | |
| Invalid template type '{tmpl['type']}': must be one of {sort | validation | error | |
| Invalid template file path '{file_path}': must be a relative | validation | error | |
| Invalid strategy value: must be a string, got {type(strategy | validation | error | preset, validation, yaml, strategy |
| Invalid strategy '{strategy}': must be one of {sorted(VALID_ | validation | error | preset, validation, strategy |
| Invalid strategy '{strategy}' for script: scripts only suppo | validation | error | preset, validation, script, strategy |
| Invalid command name '{tmpl['name']}': must be lowercase alp | validation | error | preset, validation, naming, command |
| Invalid template name '{tmpl['name']}': must be lowercase al | validation | error | preset, validation, naming |
| Preset '{pack_id}' not found in registry | exception | error | preset, registry, keyerror, state |
| Cannot restore '{pack_id}': metadata must be a dict | exception | error | preset, registry, type-validation, rollback |
| Invalid version specifier: expected a string, got {type(requ | validation | error | preset, compatibility, version, type-validation |
| Invalid version specifier: {required} | exception | error | preset, compatibility, version, pep440 |
| Preset requires spec-kit {required}, but {speckit_version} i | exception | error | preset, compatibility, version, upgrade |
| Priority must be a positive integer (1 or higher) | validation | error | preset, install, priority, validation |
| Preset '{manifest.id}' is already installed. Use 'specify pr | exception | error | preset, install, duplicate, state |
| No preset.yml found in archive | validation | error | preset, install, archive, packaging |
| Catalog URL is malformed: {url} | validation | error | preset, catalog, url, validation |
| Catalog URL must use HTTPS (got {parsed.scheme}://). HTTP is | validation | error | preset, catalog, https, security |
| Catalog URL must be a valid URL with a host. | validation | error | preset, catalog, url, validation |
| Invalid preset catalog format from {url}: expected a JSON ob | exception | error | preset, catalog, json, validation |
| Invalid preset catalog format from {url} | exception | error | preset, catalog, json, schema |
| Invalid preset catalog format from {url}: 'presets' must be | exception | error | preset, catalog, json, schema |
| Failed to read catalog config {config_path}: {e} | validation | error | yaml, config, validation, file-io |
| Invalid catalog config {config_path}: expected a mapping at | validation | error | yaml, config, validation, type-mismatch |
| Invalid catalog config: 'catalogs' must be a list, got {type | validation | error | yaml, config, validation, type-mismatch |
| Invalid catalog entry at index {idx}: expected a mapping, go | validation | error | yaml, config, validation, type-mismatch |
| Invalid priority for catalog '{item.get('name', idx + 1)}': | validation | error | yaml, config, validation, type-coercion |
| Failed to fetch preset catalog from {entry.url}: {e} | exception | error | network, http, presets, catalog |
| Failed to fetch preset catalog from {catalog_url}: {e} | exception | error | network, http, presets, catalog, search |
| Preset '{pack_id}' not found in catalog | exception | error | presets, catalog, not-found |
| Preset '{pack_id}' is bundled with spec-kit and has no downl | exception | error | presets, bundled, install |
| Preset '{pack_id}' is from the '{catalog_name}' catalog whic | exception | error | presets, catalog, permissions, install |
| Preset '{pack_id}' has no download URL | exception | error | presets, catalog, missing-field |
| Preset download URL is malformed: {download_url} | exception | error | presets, catalog, type-mismatch |
| Preset download URL must use HTTPS: {download_url} | exception | error | presets, security, https, download |
| Failed to download preset from {download_url}: {e} | exception | error | network, http, presets, download |
| Failed to save preset archive: {e} | exception | error | file-io, presets, disk-space, permissions |
| Invalid extension registry {registry.registry_path}: refusin | validation | error | extensions, registry, corruption, security, fail-closed |
| Wrap strategy in '{layer['source']}' is missing the {placeho | validation | error | presets, templates, layering, validation |
| Shared infrastructure path escapes project root: {label} | exception | error | |
| Refusing to use symlinked {context}: {label} | exception | error | |
| {context.capitalize()} path is not a directory: {label} | exception | error | |
| {context.capitalize()} escapes project root: {label} | exception | error | |
| {context.capitalize()} does not exist: {label} | exception | error | |
| Refusing to use symlinked shared infrastructure directory: { | exception | error | |
| Shared infrastructure directory path is not a directory: {la | exception | error | |
| Shared infrastructure directory escapes project root: {label | exception | error | |
| Refusing to overwrite symlinked shared infrastructure path: | exception | error | |
| Shared infrastructure destination escapes project root: {lab | exception | error | |
| Installed workflow owner is unavailable; cannot safely resum | exception | error | |
| response declared {content_length} bytes, exceeding the {max | exception | error | |
| response exceeds the {max_bytes}-byte workflow size limit | exception | error | |
| response exceeds the {_MAX_WORKFLOW_YAML_BYTES}-byte workflo | exception | error | |
| Failed to write staged workflow file | exception | error | |
| Staged workflow file changed before commit | exception | error | |
| Refusing to use symlinked workflow install lock: {lock_file} | exception | error | |
| Failed to stage prior workflow ({move_exc}); failed to resto | exception | error | |
| Failed to commit workflow file ({commit_exc}); failed to res | exception | error | |
| Archive must contain workflow.yml at its root or in exactly | exception | error | |
| Workflow package contains symlink: {path} | exception | error | |
| Workflow package contains unsupported file: {path} | exception | error | |