4e96659bd7
Wire the app read path to the lib's per-doc reactive subscription so a change made in ANOTHER session propagates without a reload or local action: - useNgData subscribes the by-need set via subscribeDocs(allReadDocs, bumpRead) — one doc_subscribe per NURI, per-doc error isolation (never the ORM fan-out). Any patch (own write or broker-synced from a remote peer) re-runs readUnion. - Reactive discovery: watchDiscoveredEvents(relist) subscribes the global index → a new public event from another session enters the read set (and gets its own sub). - Loop-safe: the sub effect is keyed on a stable sorted-NURI key (readDocKey); a fire→bumpRead→read never changes the doc set, so no re-subscribe loop. Identity switch empties the set → clean unsubscribe → rebuild → re-subscribe (no leak). - readUnion stays the one-shot tolerant reader; subscriptions only trigger re-reads. Real 2-browser e2e (e2e-multibrowser.feature): B registers → A's EventDetailScreen shows participantCount 1→2 and an 'unknown' participant WITHOUT A reloading, via A's doc_subscribe on the public event doc (event-driven). Isolated run 12/12 green. Count mechanism unchanged (P4/Option-B is next); the joiner still writes the public event doc's participantCount — which is exactly what the observer sees change live. Gates: @data auth 4/4, @data isolation 4/4, build + tsc clean. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>