Push notifications are deferred beyond v1
The human surface keeps an in-app notification and a freshness stream instead of a browser push service.
Context
The human wants to know when an agent waits on a decision without watching the app. True background delivery, with the installed app closed, requires a browser push service. The browser chooses it (FCM, APNs, autopush) and the hub cannot substitute a service of its own, so a third party sits in the transport path. That sits badly with the local-first invariant that the node is the cloud. It also needs a secure context, so a plain-HTTP LAN deployment cannot use it at all, and the embedded tailnet carries no certificate issuance.
Decision
v1 ships no background push. The human surface keeps the opt-in in-app notification, raised while the app runs, and adds a server-sent freshness stream so an open app refreshes its waiting badge as soon as a write lands instead of polling. The mailbox stays pull-based.
Consequences
- No vendor push service and no third party in the path; the token, the payload, and the timing stay on the node.
- An installed app that is fully closed raises nothing. The operator learns of a waiting item when the app next opens.
- The freshness stream needs a live page and carries no event data, only a nudge to refetch, so it is not a chat channel and does not change the asynchronous interaction model.
- A later revision can add opt-in Web Push with a contentless, end-to-end encrypted payload if a vendor transport is accepted. That would supersede this record.