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

  1. 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.