Release v2.3.0
Summary
Adds a concept construct with type-level PII, gives projections control over AutoMap and their event sequence, and closes documentation gaps.
Real coverage of the 759 shared documentation snippet IDs: 186 → 336 (24.5% → 44.3%).
Added
-
Chronicle.Concept— a strongly-typed wrapper for a domain value, joining the existingusemacro family alongsideChronicle.Events.EventTypeandChronicle.ReadModels.ReadModel. Supports:string,:integer,:float,:booleanand:uuid, and rejects an unknown type at compile time (#40)defmodule MyApp.PersonName do use Chronicle.Concept, type: :string pii "Legal name of the data subject" end
A concept serializes as the value it wraps, not as an object wrapping one, so adopting one for a property already in production changes neither the wire format nor the registered schema (#40)
-
PII declared on a concept is resolved wherever that concept is used, in both events and read models — declare it once and every property using the type is encrypted (#40)
-
A concept declared with
event_source_id: truecannot also be marked PII; the combination raises at compile time, because encrypting the identifier would make its own decryption key unfindable (#40) -
no_auto_map/0andno_auto_map/1— turn Chronicle's automatic property mapping off for a whole projection, or exclude specific fields. AutoMap was never sent to the kernel at all, so it silently fell back to theInheritdefault and could not be turned off (#40) -
not_rewindable: trueandevent_sequence:on a read model or projection. Both were hardcoded, so every projection was rewindable and pinned to the event log (#40) -
A guide page covering concepts (#40)
Changed
- The JSON schema generator descends into nested structs instead of flattening every non-numeric field to
"string", so nested read models and structured event payloads register with an accurate schema (#40)
Fixed
- Only the first
from_everydeclaration reached the kernel. The macro accumulated every call but the coordinator kept one, so a projection declaring context capture and property mapping separately silently lost all but one (#40) - Compliance metadata now lands on the individual leaf values in the schema rather than the object containing them, and is de-duplicated when a value is reached by both a concept marker and a redundant field-level
pii(#40) - 150 documentation snippets that rendered an empty Elixir tab now show real code, and 21 that claimed "Elixir does not support this workflow yet" were false —
append_many_for_event_sources/2,ReadModels.watch/2and reactor side-effect returns among them (#40) - The README referenced
Chronicle.EventType,Chronicle.ReadModel,Chronicle.Reactor,Chronicle.ReducerandChronicle.Seeder; the real modules are nested underChronicle.Events,Chronicle.ReadModels,Chronicle.Reactors,Chronicle.ReducersandChronicle.Seeding(#40)