10bbd0ddb2
The notification pipeline previously hard-coded a lowercase-`p`-tag match in two places (the observer predicate and consumeFromCache via taggedUserIds). That's correct for most kinds but wrong for two: - NIP-22 CommentEvent: a comment several levels deep only tags the root author via uppercase `P` (RootAuthorTag). Pure lowercase-p routing missed "someone replied deep in your thread" notifications. - Experimental WakeUpEvent (kind 23903): its `p` tags are the authors of the subject events it references — Bob reacting to Alice's post yields a WakeUpEvent with p=Bob, even though Alice's device is the one that needs to wake up. Transport-layer routing (push/relay subscription) already delivered the event to the right device, so the in-event routing has to be permissive. Introduce `open fun Event.notifies(userHex: HexKey): Boolean` with a lowercase-`p` default that covers NIP-01/04/17/25/28/34/57/68/71/84/AC/ chess/wiki/long-form/poll mentions. Each kind with distinct semantics overrides: - CommentEvent.notifies: super.notifies(u) || rootAuthorKeys().contains(u) — picks up uppercase P root-author routing on top of lowercase p. - WakeUpEvent.notifies: true — every logged-in account is a valid wake target once the event has reached LocalCache on this device. NotificationDispatcher's observer predicate and EventNotificationConsumer. consumeFromCache both now ask `event.notifies(accountHex)` instead of extracting taggedUserIds themselves. The zap path's redundant isTaggedUser re-check is gone too (it was duplicating what the outer routing already enforced). https://claude.ai/code/session_01GQDJxiHPogdzCNhUBN7Pjc