When narrative content drives a physical actuator, three interrupt paths look like "just restore state" until they are not: a Wallet / Apple Pay / Google Pay / NFC payment sheet mid-session, an external display / Sidecar / Stage Manager / desktop-mirroring attach, and a controlling-app update that replaces the process owning the story clock. Each needs a default that fails closed — toward idle, toward re-arm only after a named beat, toward interrupt-clear ≠ motor authority.
on wallet_or_pay_or_nfc_sheet_opened(): ramp_to(IDLE, at=next_beat_boundary) armed = false on payment_sheet_dismissed(): # transaction UI gone ≠ motor envelope restored await user_resume(); await next_named_beat(); arm() on external_display_or_sidecar_or_stagemanager_attached(): ramp_to(IDLE, at=next_beat_boundary) armed = false on external_display_disconnected(): # display plane cleared ≠ motor authority await user_resume(); await next_named_beat(); arm() on controlling_app_update_installing(): ramp_to(IDLE, at=before_or_at_update_boundary) armed = false on post_update_relaunch(): # new process ≠ previous intensity restored await user_resume(); await next_named_beat(); arm() The Wallet / Pay / NFC rule is easy to mix up with AirDrop inbound receives, Control Center shades, push-notification opens, and mid-session biometric re-auth. AirDrop is an inbound receive sheet. Control Center is a system shade. A push open is a notification tap. Biometric re-auth re-checks who is holding the phone. A Wallet or Pay sheet is a transaction-plane interrupt. Dismissing the sheet clears the payment UI; it must not restore motor authority.
The external-display rule sits next to — but is not — CarPlay / Android Auto projection, Handoff / Continuity session moves, or same-phone multi-window focus. CarPlay / Android Auto moves the session to an automotive projection endpoint. Continuity moves the session plane across devices. Multi-window is visibility without exclusive focus on one phone. An external monitor, Sidecar, Stage Manager, or desktop mirroring attaches a non-automotive display plane. Disconnecting that display clears the plane; it must not restore motor authority.
The controlling-app-update rule is a process-replace interrupt, not a user force-quit, not toy firmware idle, and not an expired auth token. Force-quit is the user killing the process. Firmware idle is on the toy side. Auth expiry is a token boundary. An App Store / TestFlight / in-app update replaces the phone process that owns the story clock. Post-update relaunch starts a new process; it must not restore motor authority.
Buyers can test all three without code: trigger a Wallet or Pay sheet mid-session and see whether dismissing it restarts intensity, attach an external display or Sidecar and watch whether disconnecting re-arms motors, and install a controlling-app update then relaunch. These map to questions like "how do AI stories control physical devices" and "Lovense alternative with AI stories."
This is the model CRAVE AI uses for story-controlled play on official devices: AI story-controlled vibrator. Principle write-up: narrative-to-device sync. Devices: AI sex toys.
Disclosure: I work on CRAVE AI. Adults-only product; no explicit content here.




