{"record":{"id":"141cef777693c679","repo":"jdx/mise","slug":"packslip-list-identity-prefix-must-be-a-non-empty","errorCode":null,"errorMessage":"packslip: list_identity_prefix must be a non-empty string","messagePattern":"packslip: list_identity_prefix must be a non-empty string","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/backend/packslip.rs","lineNumber":566,"sourceCode":"        return Ok(Pin::Identity(explicit));\n    }\n    match Policy::for_project(project) {\n        Some(policy) => Ok(Pin::Identity(policy)),\n        None => bail!(\n            \"packslip:{project} is not on a forge mise knows, so nothing pins its signer; set `pubkey`, or `identity` and `issuer`, in its tool options\"\n        ),\n    }\n}\n\nimpl Pin {\n    /// A vendor may publish its index from a different workflow than its bundles.\n    /// The override replaces only the list's subject constraint, retaining the issuer.\n    fn for_release_list(&self, opts: &PackslipOptions<'_>) -> Result<Self> {\n        let Some(value) = opts.raw.opts.get(\"list_identity_prefix\") else {\n            return Ok(self.clone());\n        };\n        let Some(prefix) = value.as_str().filter(|prefix| !prefix.trim().is_empty()) else {\n            bail!(\"packslip: list_identity_prefix must be a non-empty string\");\n        };\n        let Self::Identity(policy) = self else {\n            bail!(\"packslip: list_identity_prefix cannot be combined with pubkey\");\n        };\n        if policy.issuer.as_deref().is_none_or(str::is_empty) {\n            bail!(\"packslip: list_identity_prefix requires an issuer\");\n        }\n        Ok(Self::Identity(Policy {\n            issuer: policy.issuer.clone(),\n            identity: None,\n            identity_prefix: Some(prefix.to_string()),\n        }))\n    }\n\n    fn trust(&self) -> Trust<'_> {\n        match self {\n            Pin::Identity(policy) => Trust::Identity(policy),\n            Pin::Key(key) => Trust::Key(key),","sourceCodeStart":548,"sourceCodeEnd":584,"githubUrl":"https://github.com/jdx/mise/blob/533346cc374382b41ec5ff70536252b2e96e725c/src/backend/packslip.rs#L548-L584","documentation":"Packslip backend: when a tool's options override the release-list pin via list_identity_prefix, the override string was empty. A non-empty prefix is required so mise can constrain the release-list manifest signer by matching subject prefixes against it.","triggerScenarios":"Calling release_list/github_list with PackslipOptions containing list_identity_prefix set to \"\", \"   \", or a non-string value.","commonSituations":"Empty variable interpolation in mise.toml (env var not set so the option resolves to an empty string); quoting mistakes leaving the value blank; passing a non-string type in config.","solutions":["Set list_identity_prefix to the intended non-empty prefix string in the tool options.","If the value comes from an env var/template, ensure that variable is set (e.g. in .env or mise.toml [env]).","Remove the list_identity_prefix option entirely if you want the release list's default identity constraint."],"exampleFix":"// before\n\"packslip:foo\" = { version = \"1.0\", list_identity_prefix = \"\" }\n\n// after\n\"packslip:foo\" = { version = \"1.0\", list_identity_prefix = \"https://github.com/vendor/\" }","handlingStrategy":"validation","validationCode":"function validateListIdentityPrefix(opts) {\n  const v = opts.list_identity_prefix;\n  if (v !== undefined && (typeof v !== 'string' || v.trim() === '')) {\n    throw new Error('list_identity_prefix must be a non-empty string');\n  }\n}","typeGuard":"const isNonEmptyString = (v) => typeof v === 'string' && v.trim().length > 0;","tryCatchPattern":null,"preventionTips":["Avoid interpolating unset env vars into config values that must be non-empty.","Trim and validate the prefix in a config linter before applying mise.toml changes.","Omit the option rather than setting it to an empty string."],"tags":["packslip","config","validation"],"backgroundTag":"empty-required-field","analyzedSha":"533346cc374382b41ec5ff70536252b2e96e725c","analyzedAt":"2026-09-17T13:35:38.149Z","contentChangedAt":"2026-09-17T13:35:38.149Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}