Split out of #149 (item 1) — the genuinely-nexus primitive
A subscription that yields every event across all streams in write order, resuming from a GlobalSeq position. Sibling of the existing per-stream Subscription::subscribe(&id, from).
Why this belongs in nexus (not Agency)
The substrate already exists: GlobalSeq is stamped on every event at append time and CLAUDE.md already describes it as "the position an all-streams subscription resumes from." This is a store-level cursor primitive (a data type + read path), not a runtime loop — the same category as the per-stream subscription nexus already ships. Cross-aggregate projections need it.
Scope
- `` cursor over the store, ordered by
GlobalSeq, never terminates (waits when caught up, like the per-stream cursor)
from: None = beginning; from: Some(GlobalSeq) = events after that position
- Yields
PersistedEnvelope (raw bytes; consumer holds the codec — see subscription-stays-raw decision)
- Must tolerate
GlobalSeq gaps (monotonic but not gapless — aborted appends burn values)
Out of scope (these went to Agency)
- Exactly-once transactional checkpoint + competing consumers → agency#155
- Trait-level filtering + ring-buffer notification → nexus Tier 3 (separate card)
Depends on #125 (v1 subscriptions).
Split out of #149 (item 1) — the genuinely-nexus primitive
A subscription that yields every event across all streams in write order, resuming from a
GlobalSeqposition. Sibling of the existing per-streamSubscription::subscribe(&id, from).Why this belongs in nexus (not Agency)
The substrate already exists:
GlobalSeqis stamped on every event at append time and CLAUDE.md already describes it as "the position an all-streams subscription resumes from." This is a store-level cursor primitive (a data type + read path), not a runtime loop — the same category as the per-stream subscription nexus already ships. Cross-aggregate projections need it.Scope
GlobalSeq, never terminates (waits when caught up, like the per-stream cursor)from: None= beginning;from: Some(GlobalSeq)= events after that positionPersistedEnvelope(raw bytes; consumer holds the codec — see subscription-stays-raw decision)GlobalSeqgaps (monotonic but not gapless — aborted appends burn values)Out of scope (these went to Agency)
Depends on #125 (v1 subscriptions).