{"record":{"id":"4e28717ebd31fd79","repo":"jdx/mise","slug":"the-embedded-notification-helper-is-not-developer","errorCode":null,"errorMessage":"the embedded notification helper is not Developer ID signed","messagePattern":"the embedded notification helper is not Developer ID signed","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/system/history/notify/macos.rs","lineNumber":51,"sourceCode":"    // running helper. The bundle identifier remains stable across versions.\n    let fingerprint = crate::hash::hash_to_str(&(HELPER, INFO, ICON, CODE_RESOURCES));\n    root.join(fingerprint).join(\"mise.app\")\n}\n\nfn executable(app: &Path) -> PathBuf {\n    app.join(\"Contents/MacOS/mise-notify\")\n}\n\nfn complete(app: &Path) -> bool {\n    executable(app).is_file()\n        && app.join(\"Contents/Info.plist\").is_file()\n        && app.join(\"Contents/Resources/mise.icns\").is_file()\n        && app.join(\"Contents/_CodeSignature/CodeResources\").is_file()\n}\n\npub(super) fn notification(title: &str, body: &str) -> Result<Command> {\n    if !release_signed() {\n        bail!(\"the embedded notification helper is not Developer ID signed\");\n    }\n    let app = ensure_app(&crate::dirs::DATA.join(\"notifications\"))?;\n    Ok(notification_command(&app, title, body))\n}\n\nfn notification_command(app: &Path, title: &str, body: &str) -> Command {\n    let mut command = Command::new(executable(app));\n    command.args([title, body]);\n    command\n}\n\nfn ensure_app(root: &Path) -> Result<PathBuf> {\n    let app = app_path(root);\n    if complete(&app) {\n        return Ok(app);\n    }\n    crate::file::create_dir_all(root)?;\n    let mut lock = fslock::LockFile::open(&root.join(\"install.lock\"))?;","sourceCodeStart":33,"sourceCodeEnd":69,"githubUrl":"https://github.com/jdx/mise/blob/afd2eddd3a50c16190efc1c7e94404b48f72af57/src/system/history/notify/macos.rs#L33-L69","documentation":"macOS notification delivery uses an embedded helper app, which must be signed with a Developer ID for the system to display notifications from it. notification() bails out when the bundled app does not pass the release_signed() check (absent or non-Developer-ID code signature), rather than attempting delivery that macOS would silently drop.","triggerScenarios":"Requesting a notification when the helper app bundle fails release_signed(): the _CodeSignature/CodeResources file or the mise.icns resource is missing, or the app is signed with an ad-hoc/development identity instead of Developer ID.","commonSituations":"Running a locally built (cargo build) mise binary whose embedded helper is not Developer ID signed; a broken or partial app bundle in the data directory; Apple notarization/signing stripped by copying files manually.","solutions":["Install an official Developer ID-signed mise release instead of a locally built binary.","Re-sign the helper app with a Developer ID certificate (codesign --sign 'Developer ID Application: ...').","Verify the bundle contains Contents/Resources/mise.icns and Contents/_CodeSignature/CodeResources; re-extract/reinstall the app bundle if missing.","Disable or skip notification delivery in dev builds (build with the notification feature off) if signing is not available."],"exampleFix":"// before: ad-hoc local build\n$ cargo build --features notifications  # helper is ad-hoc signed -> error\n// after: official release\n$ mise run install-dev  # or install a signed release whose helper passes release_signed()","handlingStrategy":"fallback","validationCode":"// check the bundle before attempting notification\nlet signed = app.join(\"Contents/_CodeSignature/CodeResources\").is_file()\n    && app.join(\"Contents/Resources/mise.icns\").is_file();","typeGuard":null,"tryCatchPattern":"match notify::notification(&title, &body) {\n    Err(e) if e.to_string().contains(\"not Developer ID signed\") => {\n        eprintln!(\"notifications unavailable: {e}; falling back to log\");\n    }\n    other => other?,\n}","preventionTips":["Use official signed releases in environments where notifications matter.","Keep the helper bundle intact (don't copy files piecemeal).","Detect dev builds early and skip notification features."],"tags":["macos","codesigning","notifications","release"],"backgroundTag":"codesign-verification-failed","analyzedSha":"afd2eddd3a50c16190efc1c7e94404b48f72af57","analyzedAt":"2026-09-09T01:38:25.179Z","contentChangedAt":"2026-09-09T01:38:25.179Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}