Skip to content

Fix actor isolation crash in fetchReminders#4

Closed
Noah-Ribaudo wants to merge 1 commit into
openclaw:mainfrom
Noah-Ribaudo:fix/actor-isolation-crash
Closed

Fix actor isolation crash in fetchReminders#4
Noah-Ribaudo wants to merge 1 commit into
openclaw:mainfrom
Noah-Ribaudo:fix/actor-isolation-crash

Conversation

@Noah-Ribaudo
Copy link
Copy Markdown

Problem

Running remindctl list crashes with:

Incorrect actor executor assumption; expected 'RemindCore.RemindersStore' executor.
Abort trap: 6

Cause

The fetchReminders method calls self.item(from:) inside the EventKit callback closure. This callback runs on EventKit's executor, not the actor's executor, causing Swift's strict concurrency checking to abort.

Fix

Extract all data from EKReminder objects directly within the callback closure before the data crosses the isolation boundary. The calendar property is captured beforehand to avoid accessing actor-isolated state from within the closure.

Testing

Tested on macOS 15 (Sequoia) with Swift 6:

  • remindctl list
  • remindctl list "List Name"
  • remindctl add
  • remindctl delete

The fetchReminders method was calling self.item(from:) inside the
EventKit callback closure, which runs on a different executor than
the actor. This caused 'Incorrect actor executor assumption' crashes.

Fix: Extract all data from EKReminder objects directly within the
callback closure before crossing the isolation boundary, capturing
the calendar beforehand to avoid actor-isolated property access.
@steipete
Copy link
Copy Markdown
Collaborator

Thank you! Reviewing...

@steipete
Copy link
Copy Markdown
Collaborator

Thanks! Closing in favor of #3 (merged). #3 keeps the callback boundary Sendable-only and does ReminderItem construction back on the actor.

@steipete steipete closed this Jan 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants