Skip to content

Release v2.3.0

Choose a tag to compare

@github-actions github-actions released this 01 Sep 19:01
27e5dc2

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 existing use macro family alongside Chronicle.Events.EventType and Chronicle.ReadModels.ReadModel. Supports :string, :integer, :float, :boolean and :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: true cannot 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/0 and no_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 the Inherit default and could not be turned off (#40)

  • not_rewindable: true and event_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_every declaration 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/2 and reactor side-effect returns among them (#40)
  • The README referenced Chronicle.EventType, Chronicle.ReadModel, Chronicle.Reactor, Chronicle.Reducer and Chronicle.Seeder; the real modules are nested under Chronicle.Events, Chronicle.ReadModels, Chronicle.Reactors, Chronicle.Reducers and Chronicle.Seeding (#40)