System Information
Pindrop: 1.22.5 (26)
macOS: Version 27.0 (Build 26A5388g)
Chip: Apple Silicon (Apple M5 Pro, Mac17,8)
Model: openai_whisper-large-v3_turbo
Language: en
What happened?
Every Quick Capture recording crashes the app the instant the note editor window is presented — about 10 ms from the "Opened note editor" log line to the fatal error, with process death ~80 ms later. Transcription and AI note enhancement both complete successfully first; it's the window presentation that dies.
This is not the default.store migration problem from #78 — that store was rebuilt from scratch earlier the same day and ModelContainer creation succeeds in 0.02 s.
Crash is EXC_BREAKPOINT / SIGTRAP on the main thread:
0 libswiftCore.dylib _assertionFailure(_:_:file:line:flags:)
1 SwiftData
2 SwiftData
3 SwiftData
4 Pindrop
5 Pindrop
6 Pindrop
7 Pindrop
8 libswift_Concurrency.dylib completeTaskWithClosure
The assertion string doesn't appear in the .ips report, but it's in the unified log at the same instant:
[com.apple.swiftdata:PersistentModel] Illegal attempt to create a full future for a
temporary identifier. These won't be resolvable after the temporary object is
deallocated: <private>
SwiftData/BackingData.swift:1080: Fatal error: This model instance was invalidated
because its backing data could no longer be found the store.
PersistentIdentifier(id: SwiftData.PersistentIdentifier.ID(backing:
SwiftData.PersistentIdentifier.PersistentIdentifierBacking.temporaryIdentifier(
SwiftData.TemporaryPersistentIdentifierImplementation)))
Cause
AppCoordinator.openNoteEditorWithEnhancedNote (line 3214 on v1.22.5; unchanged on main at line 3220) constructs a NoteSchema.Note and hands it to the window controller without ever inserting it into a ModelContext:
private func openNoteEditorWithEnhancedNote(_ enhancedNote: AIEnhancementService.EnhancedNote) {
let newNote = NoteSchema.Note(
title: enhancedNote.title,
content: enhancedNote.content,
tags: enhancedNote.tags,
sourceTranscriptionID: nil
)
noteEditorWindowController.show(note: newNote, isNewNote: true) // detached model
...
}
Because the instance was never inserted, its persistentModelID is a temporary identifier. NoteEditorWindow.presentEditor reads it straight away:
openNoteModelID = note?.persistentModelID
which is what emits the "Illegal attempt to create a full future for a temporary identifier" line. Meanwhile NoteEditorView.createNoteIfNeeded() — correctly — builds and inserts a separate Note, so the detached instance is orphaned, and a subsequent synchronous access to it during presentation traps at BackingData.swift:1080.
Every other show(note:isNewNote:) call site passes either nil (openNewNoteFromMenu, line 6062) or a note already fetched from the store. This is the only site that passes an uninserted model, which matches the observation that Quick Capture is the only affected route.
Worth noting for triage: disabling AI enhancement does not avoid this. stopRecordingAndTranscribeForQuickCapture returns a fallback EnhancedNote(tags: []) when enhancement is off or fails, so openNoteEditorWithEnhancedNote runs on every Quick Capture path.
Suggested fix
Either insert and persist before presenting:
container.mainContext.insert(newNote)
try? container.mainContext.save()
noteEditorWindowController.show(note: newNote, isNewNote: false)
…or keep the note uninserted and pass the enhanced title/content/tags to the editor as seed values rather than as a model object, letting the existing createNoteIfNeeded() perform the single insert — this preserves the "new note" window semantics.
A defensive guard in presentEditor against a temporary persistentModelID would also keep this class of mistake from being fatal.
Expected Behavior
Quick Capture should open the note editor pre-filled with the enhanced title, content, and tags, and the app should stay running so the note can be reviewed and saved.
Steps to Reproduce
- Bind a Quick Capture hotkey (push-to-talk or toggle) in Settings.
- Hold the hotkey, speak a sentence, release it.
- Transcription and note enhancement complete; the note editor window is presented.
- The app immediately crashes with
EXC_BREAKPOINT (SIGTRAP).
Reproduced on 2 of 2 attempts. Searching my full log history, Quick Capture has never once completed successfully on this machine — Opened note editor with enhanced note appears exactly twice, and both sessions end at that line.
Unaffected for comparison: normal dictation (.dictation route), opening an existing note from history, and File → New Note (which passes nil).
Log File Attachment
Attaching the raw log isn't practical here — the two crash sessions are 240 KB and 970 KB, dominated by per-attribute ContextEngineService AX dumps, and they contain window titles and document paths from unrelated apps. Here are the final lines of the crashing session verbatim (pindrop-2026-07-22_10-27-33-1.log):
2026-07-22T10:27:57.629 [INFO] [Audio] [AudioRecorder.swift:2868] Recording stopped, 744084 bytes captured
2026-07-22T10:27:57.630 [INFO] [Transcription] [TranscriptionService.swift:494] Transcribing 186021 samples (11.63s) using WhisperKit
2026-07-22T10:27:58.881 [INFO] [Transcription] [TranscriptionService.swift:509] Transcription completed in 1.25s
2026-07-22T10:28:01.192 [INFO] [App] [AppCoordinator.swift:3186] Note enhancement completed: title='<redacted>', tags=3
2026-07-22T10:28:01.220 [INFO] [UI] [NoteEditorWindow.swift:103] Creating note editor window for locale=en_US isNewNote=true
2026-07-22T10:28:01.238 [INFO] [App] [AppCoordinator.swift:3224] Opened note editor with enhanced note
2026-07-22T10:28:01.246 [WARN] [UI] [AppLocalization.swift:25] Missing localized string for key=Show more stats locale=en_US
2026-07-22T10:28:01.246 [WARN] [UI] [AppLocalization.swift:25] Missing localized string for key=Show more stats locale=en_US
<end of log — process trapped at 10:28:01.248>
The earlier session (pindrop-2026-07-22_08-27-03-1.log) ends on the identical three lines at 10:27:25.
Happy to send either full log directly if that's useful.
Permissions
System Information
What happened?
Every Quick Capture recording crashes the app the instant the note editor window is presented — about 10 ms from the "Opened note editor" log line to the fatal error, with process death ~80 ms later. Transcription and AI note enhancement both complete successfully first; it's the window presentation that dies.
This is not the
default.storemigration problem from #78 — that store was rebuilt from scratch earlier the same day andModelContainercreation succeeds in 0.02 s.Crash is
EXC_BREAKPOINT/SIGTRAPon the main thread:The assertion string doesn't appear in the
.ipsreport, but it's in the unified log at the same instant:Cause
AppCoordinator.openNoteEditorWithEnhancedNote(line 3214 onv1.22.5; unchanged onmainat line 3220) constructs aNoteSchema.Noteand hands it to the window controller without ever inserting it into aModelContext:Because the instance was never inserted, its
persistentModelIDis a temporary identifier.NoteEditorWindow.presentEditorreads it straight away:which is what emits the "Illegal attempt to create a full future for a temporary identifier" line. Meanwhile
NoteEditorView.createNoteIfNeeded()— correctly — builds and inserts a separateNote, so the detached instance is orphaned, and a subsequent synchronous access to it during presentation traps atBackingData.swift:1080.Every other
show(note:isNewNote:)call site passes eithernil(openNewNoteFromMenu, line 6062) or a note already fetched from the store. This is the only site that passes an uninserted model, which matches the observation that Quick Capture is the only affected route.Worth noting for triage: disabling AI enhancement does not avoid this.
stopRecordingAndTranscribeForQuickCapturereturns a fallbackEnhancedNote(tags: [])when enhancement is off or fails, soopenNoteEditorWithEnhancedNoteruns on every Quick Capture path.Suggested fix
Either insert and persist before presenting:
…or keep the note uninserted and pass the enhanced title/content/tags to the editor as seed values rather than as a model object, letting the existing
createNoteIfNeeded()perform the single insert — this preserves the "new note" window semantics.A defensive guard in
presentEditoragainst a temporarypersistentModelIDwould also keep this class of mistake from being fatal.Expected Behavior
Quick Capture should open the note editor pre-filled with the enhanced title, content, and tags, and the app should stay running so the note can be reviewed and saved.
Steps to Reproduce
EXC_BREAKPOINT (SIGTRAP).Reproduced on 2 of 2 attempts. Searching my full log history, Quick Capture has never once completed successfully on this machine —
Opened note editor with enhanced noteappears exactly twice, and both sessions end at that line.Unaffected for comparison: normal dictation (
.dictationroute), opening an existing note from history, and File → New Note (which passesnil).Log File Attachment
Attaching the raw log isn't practical here — the two crash sessions are 240 KB and 970 KB, dominated by per-attribute
ContextEngineServiceAX dumps, and they contain window titles and document paths from unrelated apps. Here are the final lines of the crashing session verbatim (pindrop-2026-07-22_10-27-33-1.log):The earlier session (
pindrop-2026-07-22_08-27-03-1.log) ends on the identical three lines at 10:27:25.Happy to send either full log directly if that's useful.
Permissions