github/spec-kit · error · ValidationError
Preserved extension config for '{manifest.id}' cannot be rea
Error message
Preserved extension config for '{manifest.id}' cannot be read ({cfg_file.name}) in {dest_dir}: {exc}. Resolve manually — fix its permissions or remove it — then reinstall. What it means
Error "Preserved extension config for '{manifest.id}' cannot be read ({cfg_file.name}) in {dest_dir}: {exc}. Resolve manually — fix its permissions or remove it — then reinstall." thrown in github/spec-kit.
Source
Thrown at src/specify_cli/extensions/__init__.py:2390
"Preserved extension config for "
f"'{manifest.id}' is a symlink ({cfg_file.name}) in "
f"{dest_dir}, which cannot be safely rescued during "
"reinstall. Resolve manually — replace the symlink with "
"a regular file or remove it — then reinstall."
)
if cfg_file.is_file():
# A kept config that cannot be read or stat'ed must not
# crash the reinstall with a raw OSError — and must not
# reach the rmtree below unrescued. Like the symlink
# guard above, reject while dest_dir is untouched so the
# preserved bytes are never lost.
try:
stranded_configs[cfg_file.name] = (
cfg_file.read_bytes(),
cfg_file.stat().st_mode,
)
except OSError as exc:
raise ValidationError(
"Preserved extension config for "
f"'{manifest.id}' cannot be read "
f"({cfg_file.name}) in {dest_dir}: {exc}. "
"Resolve manually — fix its permissions or "
"remove it — then reinstall."
) from exc
if stranded_configs and not staging_is_complete:
# Write a durable backup outside dest_dir before any
# destructive operation so the original bytes survive a
# crash or partial failure at any later step. The staging
# dir is cleaned up only after every restore succeeds.
#
# Any pre-existing staging dir here lacks the completion marker
# (staging_is_complete is False), so it is a stale partial from an
# interrupted attempt — remove it first for a clean write.
if rescue_staging_dir.is_symlink():
rescue_staging_dir.unlink()View on GitHub (pinned to bf88c9f9a8)
Solutions
- Fix the config file's permissions or remove it, then reinstall the extension.
When it happens
Trigger: Thrown at src/specify_cli/extensions/__init__.py:2390 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of github/spec-kit@bf88c9f9a8 (2026-08-14).
Data as JSON: /api/errors/12d3f15c57b14930.
Report an issue: GitHub.