epic-12: after epic audit and init commit
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
---
|
||||
name: "Adr 0006 Event Store Append Only"
|
||||
description: "Append‑only, ordered, idempotent event store invariants"
|
||||
depth: 2
|
||||
links: ["../index.md", "../modules/core-events-submodule-spec.md", "./adr-0005-persistence-choice.md"]
|
||||
---
|
||||
|
||||
# ADR-0006: Event Store Append-Only & Ordering Invariant
|
||||
|
||||
**status:** accepted
|
||||
**date:** 08.05.2026
|
||||
**deciders:** Kami
|
||||
|
||||
---
|
||||
|
||||
## context
|
||||
|
||||
The system relies on an append-only event log as the single source of truth. Replay correctness, session reconstruction, and deterministic projections all depend on strict ordering and immutability of persisted events.
|
||||
|
||||
Without enforced guarantees at the storage layer, higher-level invariants (projection determinism, replay correctness) cannot be trusted.
|
||||
|
||||
This ADR formalizes storage-level constraints for all EventStore implementations.
|
||||
|
||||
---
|
||||
|
||||
## content
|
||||
|
||||
The EventStore MUST enforce:
|
||||
|
||||
### 1. append-only semantics
|
||||
|
||||
* events cannot be updated or deleted
|
||||
* event_id is immutable and unique per event
|
||||
|
||||
### 2. idempotency
|
||||
|
||||
* repeated append attempts with same event_id MUST be ignored or rejected safely
|
||||
* duplicate events MUST NOT be stored
|
||||
|
||||
### 3. per-session ordering
|
||||
|
||||
* sequence MUST be strictly monotonically increasing per session_id
|
||||
* ordering MUST be total within a session stream
|
||||
|
||||
### 4. causality preservation
|
||||
|
||||
* causation_id and correlation_id MUST be preserved as metadata only
|
||||
* they MUST NOT affect ordering
|
||||
|
||||
### 5. deterministic read model
|
||||
|
||||
* read(session_id) MUST always return events in sequence order
|
||||
* read consistency MUST not depend on implementation timing
|
||||
|
||||
---
|
||||
|
||||
## consequences
|
||||
|
||||
**positive:**
|
||||
|
||||
* guarantees replay correctness foundation
|
||||
* enables deterministic projection logic
|
||||
* simplifies concurrency model (append-only reduces state conflicts)
|
||||
* allows multiple backend implementations (sqlite, in-memory)
|
||||
|
||||
**negative:**
|
||||
|
||||
* no event mutation allowed (requires compensating events instead)
|
||||
* stricter implementation requirements for persistence engines
|
||||
* potential write amplification in correction scenarios
|
||||
|
||||
---
|
||||
|
||||
## status
|
||||
|
||||
accepted
|
||||
Reference in New Issue
Block a user