hasura/graphql-engine · warning

installation receipt could not be stored, uninstall may fail

Error message

installation receipt could not be stored, uninstall may fail: %w

What it means

After the plugin files are installed, Install() writes a receipt (the plugin manifest JSON) to PluginInstallReceiptPath so future Uninstall/Upgrade calls know what is on disk. If StoreManifest fails (usually a filesystem write error), this error is returned. The plugin binaries are already in place, but the installation is only partially recorded, so Uninstall may not find the receipt and leave artifacts behind.

Source

Thrown at cli/plugins/plugins.go:229

		)
	}

	if !ok {
		return errors.E(
			op,
			fmt.Errorf("plugin %q does not offer installation for this platform", plugin.Name),
		)
	}

	if err := c.installPlugin(plugin, platform); err != nil {
		return errors.E(op, fmt.Errorf("install failed: %w", err))
	}

	err = c.StoreManifest(plugin, c.Paths.PluginInstallReceiptPath(plugin.Name))
	if err != nil {
		return errors.E(
			op,
			fmt.Errorf("installation receipt could not be stored, uninstall may fail: %w", err),
		)
	}

	return nil
}

// Uninstall will uninstall a plugin.
func (c *Config) Uninstall(name string) error {
	var op errors.Op = "plugins.Config.Uninstall"

	if _, err := c.LoadManifest(c.Paths.PluginInstallReceiptPath(name)); err != nil {
		if stderrors.Is(err, fs.ErrNotExist) {
			return errors.E(op, ErrIsNotInstalled)
		}

		return errors.E(
			op,
			fmt.Errorf("failed to look up install receipt for plugin %q: %w", name, err),

View on GitHub (pinned to 724551b9ae)

Solutions

  1. Check that the plugins data directory and receipt path are writable by the current user (ls -la on the plugin data dir; chown/chmod if a previous sudo install changed ownership)
  2. Free disk space or shorten the path if the receipt path is too long
  3. If the receipt location is a stale directory or unreadable file, remove it manually and re-run install
  4. After fixing, uninstall any leftover artifacts manually (rm -rf the plugin install dir) and reinstall to get a clean receipt
Defensive patterns

Strategy: try-catch

Validate before calling

receiptPath := cfg.Paths.PluginInstallReceiptPath(plugin.Name)
if dir := filepath.Dir(receiptPath); dirWritable(dir) {
	_ = cfg.Install(plugin)
}

Try / catch

err := cfg.Install(plugin)
if err != nil && strings.Contains(err.Error(), "receipt could not be stored") {
	// binaries installed; record the plugin manually or clean up and retry
	// e.g. cfg.StoreManifest(plugin, receiptPath) after fixing perms
}

Prevention

When it happens

Trigger: StoreManifest failing: unwritable or missing plugins data directory, disk full, path too long, or the receipt file being a directory/read-only from a previous manual install.

Common situations: Plugins data dir owned by root after running the CLI with sudo once; disk exhaustion; antivirus or sync tools locking the receipt file on desktop machines; a corrupted directory structure left by an interrupted earlier install.

Related errors


AI-assisted analysis of hasura/graphql-engine@724551b9ae (2026-08-28). Data as JSON: /api/errors/5885599b3a73c77a. Report an issue: GitHub.