pnpm/pnpm · error · PnpmError

PNPM_ENGINE_IDENTITY_UNVERIFIABLE|PNPM_ENGINE_IDENTITY_MISMATCH

PNPM_ENGINE_IDENTITY_UNVERIFIABLE|PNPM_ENGINE_IDENTITY_MISMATCH

Error message

Refusing to run pnpm@${pnpmVersion}: its npm registry signature could not be verified (${describe(result.failures)}). The bytes selected by this project's lockfile/registry do not match a published, signed pnpm release.

What it means

Error "Refusing to run pnpm@${pnpmVersion}: its npm registry signature could not be verified (${describe(result.failures)}). The bytes selected by this project's lockfile/registry do not match a published, signed pnpm release." thrown in pnpm/pnpm.

Source

Thrown at pnpm11/engine/pm/commands/src/self-updater/verifyPnpmEngineIdentity.ts:121

    // is project-controlled, so it is not a safe fallback.
    throw new PnpmError(
      'PNPM_ENGINE_IDENTITY_UNVERIFIABLE',
      `Refusing to run pnpm@${pnpmVersion}: its npm registry signature could not be verified (${String(err)}).`,
      { hint: 'The registry signing keys / packument must be reachable to verify the pnpm release. Set `pmOnFail` to `ignore` to skip the version switch.' }
    )
  }
  if (result.verified) return

  if (result.failures.every(isTolerableWithoutSignature)) {
    globalWarn(
      `The authenticity of pnpm@${pnpmVersion} could not be verified against npm's registry signatures: ${describe(result.failures)}. ` +
      'Proceeding anyway, because the release was resolved through the registry configured in your own (non-project) configuration and stays pinned by its integrity checksum.'
    )
    return
  }

  const onlyUnreachable = result.failures.every((f) => f.category === 'unreachable')
  throw new PnpmError(
    onlyUnreachable ? 'PNPM_ENGINE_IDENTITY_UNVERIFIABLE' : 'PNPM_ENGINE_IDENTITY_MISMATCH',
    `Refusing to run pnpm@${pnpmVersion}: its npm registry signature could not be verified ` +
    `(${describe(result.failures)}). The bytes selected by this project's lockfile/registry do not match a published, signed pnpm release.`,
    { hint: 'This can indicate a tampered lockfile or a malicious/unreachable registry. Set `pmOnFail` to `ignore` to skip the version switch if this is unexpected.' }
  )
}

/**
 * Whether the engine may run despite `failure`: no signature was obtainable
 * (nothing suspicious was observed — as opposed to a signature that exists but
 * does not validate, or a canonical registry answering that no signed release
 * exists), and the package resolves through a registry the user configured
 * themselves. See the trust rationale on {@link verifyPnpmEngineIdentity}.
 */
function isTolerableWithoutSignature (failure: InstalledSignatureFailure): boolean {
  return (failure.category === 'unreachable' || failure.category === 'uncovered') &&
    !equalRegistries(failure.registry, CANONICAL_NPM_REGISTRY)
}

View on GitHub (pinned to 5b11d3a15b)

When it happens

Trigger: Thrown at pnpm11/engine/pm/commands/src/self-updater/verifyPnpmEngineIdentity.ts:121 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of pnpm/pnpm@5b11d3a15b (2026-08-16). Data as JSON: /api/errors/4f3c164b56770037. Report an issue: GitHub.