# Epic 1: Event System Core (Append-only Log Foundation) **status:** accepted **date:** 07.05.2026 (May) **scope:** `:core:events` --- ## context Correx is built on deterministic replay of nondeterministic execution. The only reliable source of truth is a structured event log. To support: * reproducible session execution * crash recovery * offline debugging * synthetic data generation the system requires a strict event sourcing foundation. This epic establishes the minimal, correct event system abstraction before any orchestration logic exists. --- ## goal Define and implement a **fully functional event sourcing core** that provides: > an append-only, ordered, immutable event log with deterministic replay capability --- ## scope (what IS included) ### 1. event model definition Define the canonical event structure: * `EventEnvelope` * `eventId` * `sessionId` * `sequence` * `timestamp` * `version` * `causationId` * `correlationId` * `payload` ### 2. payload abstraction Define `EventPayload` interface for polymorphic event content. Implement concrete event types (initial minimal set): * tool invocation event * approval event (minimal placeholder) * session lifecycle event (minimal placeholder) No domain expansion beyond structural needs. --- ### 3. serialization system Implement deterministic serialization using `kotlinx.serialization`: * polymorphic module for `EventPayload` * stable JSON encoding (`Json`) * version field included for forward compatibility Guarantee: > identical event → identical serialized form --- ### 4. EventStore interface Define core contract: * `append(event)` * `appendAll(events)` * `read(sessionId): List` * `lastSequence(sessionId): Long` Rules: * append-only semantics * no mutation or update operations * ordering guaranteed per session --- ### 5. in-memory EventStore implementation Provide reference implementation: * deterministic ordering per session * idempotency via eventId deduplication * sequence generation per session * strict ordering enforcement Used for: * contract testing * fast execution * deterministic simulation --- ### 6. SQLite EventStore implementation (v1 baseline) Provide persistence-backed implementation: * append events into SQLite table * enforce uniqueness via `event_id` * store sequence per session * support ordered reads via SQL query No concurrency guarantees in Epic 1 (deferred to Epic 1.5). --- ### 7. contract test suite (EventStoreContractTest) Define shared behavior validation: * ordering is preserved * idempotency rules are consistent * read returns correct sequence * appendAll preserves ordering semantics * both implementations behave identically This becomes the **canonical correctness definition**. --- ## explicit exclusions (important) Epic 1 does NOT include: * concurrency safety guarantees * snapshotting * transaction management hardening * session lifecycle logic * workflow transitions * orchestration kernel * distributed storage * performance optimization * schema migration system --- ## consequences ### positive * establishes single source of truth for all system state * enables deterministic replay foundation * allows testing higher-level logic via event streams * decouples domain logic from persistence mechanics * provides interchangeable storage backends ### negative * naive SQLite implementation may not reflect production concurrency needs * no snapshot support → replay cost increases over time * schema evolution is manually managed initially * requires strict discipline to avoid leaking mutable state concepts upward --- ## rationale Event sourcing must be introduced as a **pure, minimal abstraction first**, without mixing: * orchestration logic * concurrency concerns * optimization layers This ensures that all higher-level systems depend on a stable, predictable contract rather than implementation behavior. --- ## status Epic 1 is the **foundation layer of Correx architecture**. All subsequent epics (sessions, transitions, kernel, approvals, context) assume: > EventStore is correct, deterministic, and interchangeable across implementations.