The published EventStream<T> / IEventStreamRepo<T> surface has no way for a caller to assert "I loaded this stream at version N; reject my commit if it has since moved past N." CommitEventStream(EventStream<T>, string? userId, ct) takes no expected/original version, and EventStream<T> exposes no loaded-version or concurrency token. As a result an adapter can only enforce part of optimistic concurrency, and a stale-but-well-formed write is accepted rather than rejected.
The published
EventStream<T>/IEventStreamRepo<T>surface has no way for a caller to assert "I loaded this stream at version N; reject my commit if it has since moved past N."CommitEventStream(EventStream<T>, string? userId, ct)takes no expected/original version, andEventStream<T>exposes no loaded-version or concurrency token. As a result an adapter can only enforce part of optimistic concurrency, and a stale-but-well-formed write is accepted rather than rejected.