2.0.0 (2026-05-09)
⚠ BREAKING CHANGES
- kernel: change event store behavior to return result tuples
- kernel: rename domain to aggregate_type (everywhere)
- kernel: use aggregate_id instead of stream_id
- kernel: rename command key() to target() for clarity
- kernel: refine command, event and snapshot keys
- kernel: route all commands through a singleton aggregate manager
- kernel: remove manager behaviour (used for routing)
- kernel: remove lifecycle management from kernel layer
- kernel: turn the kernel into a plain OTP app
Features
- contract: add contain/2 to the range ADT (0f3eb9e)
- contract: add difference/2 to the range ADT (cadf54a)
- contract: add equal/2 to the range ADT (4a85896)
- contract: add intersection/2 to the range ADT (31fb6c8)
- contract: add lt/2 to the range ADT (439d82d)
- contract: add overlap/2 to the range ADT (5542f1f)
- contract: add projection checkpoint store behavior (61c3bc7)
- core: refine store startup and validation (5ed9e55)
- example: extract interactive bank account example into standalone script (5ea9e33)
- kernel: add projection event log folding (7bb5ce7)
- kernel: add projection runtime (9ee6ddd)
- kernel: handle aggregate process failures in command dispatch (f9c8691)
- kernel: introduce registry mapping aggregate_type to aggregate_module (0e2acc9)
- kernel: make snapshot interval configurable (d4b0f57)
- projection: add managed projection runners (1ccc6ae)
- store_ets: add global event positions (b397992)
- store_file: add File store backend (e16058b)
- store_file: add global event index (19f5d73)
- store_mnesia: add global event positions (0c09f08)
- xp: improve xp (demo) application (32f777d)
- xp: wire projection runtime into demo app (8c829cc)
Bug Fixes
- contract: correct behavior of advance/2 to return empty range when beyond upper bound (4f7f60a)
- contract: correct error tuple for invalid range creation (dff2608)
- file: handle file:write_file error return type (1c6b31e)
- kernel: add (missing) event_type/1 callback to aggregate behavior (97ec156)
- kernel: add warning log for missing registry entry in init/1 (c67b810)
- kernel: align manager dispatch specs with actual return types (95774e9)
- kernel: make checkpoint ets startup race-safe (1c5e5db)
- kernel: preserve event order in aggregate batches (59046e4)
- xp: enforce positive withdraw amounts (813f7da)
Documentation
- kernel: document projection runner failure mode (7e768e4)
- kernel: tighten aggregate process documentation (ff3cea9)
- README: add codecov badge (c1aa4e3)
- README: add pull-based projection runtime and checkpointing details (2dde721)
- README: clarify command payload and aggregate type resolution (19af86b)
- README: describe file store backend (+ cosmetics) (dd9174a)
- README: describe lint workflow (dialyzer, fmt) (9663a18)
- README: document global event folding (fa2f543)
- README: document kernel refactor and supervision tree (fdd21b4)
- README: document managed projections (8cfdf16)
- README: document projection app runtime (6a4de80)
- README: include capabilities for each store (29bfe3c)
- README: refresh feature overview (1eee3a9)
- README: specify event store backend roadmap (e91c279)
Styles
- contract: polish style (14990a8)
- fix line length lint (8ee4e12)
- kernel: make linter happy again (7f509bb)
- kernel: simplify metadata and tags handling (0214388)
Refactors
- apply es_ prefix to all modules (simplify naming) (8ceee1e)
- contract: change fold callback to use interval as first-class parameter (6a020f2)
- contract: rename interval ADT into range (c6c3056)
- core: split store behaviours (a6022c2)
- extract event sourcing contract into dedicated app (33241ee)
- kernel: change event store behavior to return result tuples (8186b17)
- kernel: configure store via OTP application environment (6fb6c45)
- kernel: extract rehydration logic from aggregate init (60c7c70)
- kernel: migrate es_kernel_aggregate_sup to modern dynamic supervisor (f2001cf)
- kernel: refine command, event and snapshot keys (8ad27c2)
- kernel: remove lifecycle management from kernel layer (07ddecb)
- kernel: remove manager behaviour (used for routing) (acb0e75)
- kernel: remove wrapper functions from es_kernel_store (d835daf)
- kernel: rename command key() to target() for clarity (58d60e9)
- kernel: rename dispatch to execute in es_kernel_aggregate (cb49631)
- kernel: rename domain to aggregate_type (everywhere) (4188fc1)
- kernel: restructure stream_id as {domain, aggregate_id} tuple (b475ab7)
- kernel: route all commands through a singleton aggregate manager (ed6c697)
- kernel: turn the kernel into a plain OTP app (b7af467)
- kernel: use aggregate_id instead of stream_id (eade7e5)
- merge es_contract into es_kernel application (f23018a)
- move contract types to dedicated modules (6c9bd74)
- projection: move projection runtime to dedicated app (93a5f07)
- range: normalize/relax range creation logic (8cac1d9)
- remove configurable sequence_zero and sequence_next functions (055087e)
- rename es_core to es_kernel (d7fd4c1)
- rename event store and snapshot store callbacks (74a5dc4)
- reorder fold/4 callback parameters (39d927e)
- split store backends into dedicated apps (fa9dd51)
- store_ets: make store_es a standalone OTP application (73f716d)
- store_ets: parametrize table name with configurable defaults (d66b918)
- store_mnesia: make store_es a standalone OTP application (d37902e)
- store_mnesia: parametrize table name with configurable defaults (de2300e)
- store: clarify meaning of store context (844e054)
- store: split event and snapshot stores (bcb6199)
Performance Improvements
- kernel: optimize retrieve_events to build event lists in O(n) (889be9e)
Tests
- contract: add comprehensive unit tests for event_sourcing_interval module (012d846)
- contract: cover contain/2 for the range ADT (f9839c1)
- contract: cover difference/2 for the range ADT (90a7533)
- contract: cover equal/2 for the range ADT (b6072e1)
- contract: cover intersection/2 for the range ADT (a7d047b)
- contract: cover lt/2 for the range ADT (b73e816)
- contract: cover overlap/2 for the range ADT (2fd9119)
- contract: make range tests black-box (f994fa5)
- kernel: add aggregate_survives_dead_worker test case (cb450e0)
- kernel: cover file store backend (0236ec9)
- kernel: cover global event folding (1e65094)
- kernel: cover projection runtime (5d779e3)
- projection: cover projection management (79830cd)
- projection: ensure polling runner cleanup (f5e6a33)
- remove domain from aggregateId (not necessary) (ced40f8)
- xp: put bank_account_aggregate under testing (21f5df0)
Build System
- agents: bring erlang_otp_developer to life (43d6fc1)
- agents: remove unnecessary tools field (61731ec)
- deps: bump actions/cache from 4 to 5 (2db2fc8)
- deps: bump actions/checkout from 5 to 6 (beed6fc)
- deps: bump codecov/codecov-action from 5 to 6 (4a3c7a4)
- deps: bump crazy-max/ghaction-import-gpg from 6 to 7 (8522c7c)
- project: configure covertool coverdata properly (809ce64)
- rebar: add projection app to umbrella (25fce84)
- release: add escript to generate release BOM (dcaf2f4)
- release: categorize non-feature commits in changelog (ec7d421)
Continuous Integration
- codecov: ignore demo app coverage (4a597e2)
- workflow: addcoverage reporting job and upload to Codecov (22c0631)
- workflow: ensure injected demo snippet is up to date (884609c)
- workflow: fix example script path (deea666)
Chores
- project: add data directory to git ignore list (9cdf6a3)