With this model, it’s possible to create a notification that a user cannot act on when user permissions have been changed after notification creation. It’s acceptable because it will be even more confusing if a notification disappears from the UI later due to changes in users permissions.
+
+ Say, a plugin created a notification for user Amy. The notification system stores this notification and probably it's been shown to the user. Later, an admin changed Amy's roles and permissions. What should the notification system do in this case? Hide the notification from Amy? She remembers that there was a notification and maybe wants to refer to it.
+ The notification service continues showing such notifications. When a user clicks on CTA, it navigates to the plugin page, showing a message that a user doesn't have sufficient permission to act.
+
+
+ Having more use-cases, we can consider extending notification creation API to specify Kibana-specific permissions for the recipients
+ (send a notification to all the users with access to a feature X or space Y).
+ Although, it will require declaring Notification plugin dependency on other Kibana plugins, which can turn into circular dependency problems later.
+- Kibana calculates whether a user should receive a notification in runtime before showing one to the customer.
+ The only available option for the current Kibana Security model. Considering the future integration with UNS,
+ Kibana has to provide an HTTP API to check users' permissions are sufficient to see a notification.
+ Unified Notification center performs a call to HTTP API to filter out notifications before rendering them in Cloud UI.
+ This option adds a significant runtime performance penalty. Moreover, it makes the rendering process dependent on Kibana instance availability. If one of them is temporarily unavailable, the UNS can't decide if a notification must be shown or not.
+
+### Notification System
+Abstracts the way notifications are created, stored, configured, and retrieved.
+It allows Kibana to adopt different strategies for on-premise and Cloud versions:
+- *LocalRepository* - a repository for on-premise version, it stores data within the current deployment.
+- *RemoteRepository* - a repository for the Cloud version of Kibana. It stores data within the Unified Notification System deployed in the Cloud.
+In this case, a user can see in Kibana UI the external notifications created outside of Kibana.
+
+*Repository* interface:
+- `create(NotificationEvent)`- creates a notification in the Notification system.
+- `get({ search_after?: number; size?: number; filter?: NotificationFilter })` - retrieves last notifications for the current user.
+Might be paginated using `search_after` filed.
+- `markAsRead({ notification_id: string[] })` - mark notifications with given ids as read.
+- `markAsUnread({ notification_id: string[] })` - mark notifications with given ids as unread.
+- `markAllAsRead()` - mark all the notifications as read.
+- `markAsPinned({ notification_id: string[] })` - mark notifications with given ids as pinned.
+- `markAsUnpinned({ notification_id: string[] })` - mark notifications with given ids as unpinned.
+- `configure()` - updates user-specific notification settings.
+
+*Repository* interace if not exposed outside of Notification system.
+Sources interact with Notification sustem via plugin contract:
+```typescript
+interface Notifications {
+ create(events: NotificationEvent): void;
+ createForAllUsers(events: Omit