@hackage / keiki

Pure core for symbolic-register transducer event sourcing.

Latest0.1.0.0

Changelog

Changelog

All notable changes to this package are documented in this file. The format follows Keep a Changelog, and this project adheres to the Haskell PVP.

[Unreleased]

[0.1.0.0] — 2026-06-07

Initial Hackage release. Public surface stabilised around the symbolic-register transducer formalism described in docs/research/synthesis-c-foundation-b-presentation-with-worked-examples.md.

Added
  • Keiki.Core — the foundational RegFile rs register file, the SymTransducer GADT, and the slot / predicate / command / event / output algebra. Edges carry a list-shaped output (output :: [OutTerm rs ci co]) so one transition can emit zero, one, or N events in declaration order — a Generalized Sequential Machine, not a letter FST. The InFlight s co wrapper exposes the streaming-replay state for event-by-event replay through length-N edges; applyEvent (letter-only) and applyEventStreaming (InFlight-aware) cover the two regimes, while applyEvents does atomic chunk replay over command boundaries.
  • Keiki.Acceptor — input- and output-side acceptor projections.
  • Keiki.Builder — the monadic edge-authoring DSL.
  • Keiki.Composition — sequential, alternative, and single-step feedback combinators on SymTransducers.
  • Keiki.Decider — the Chassaing-shape Decider facade (decide / evolve / evolveStreaming / initialState / isTerminal) derived mechanically from a SymTransducer. decide returns the full event list directly, including length-2+ chains from multi-event edges; evolveStreaming threads the Keiki.Core.InFlight wrapper through length-N edges for event-by-event streaming replay.
  • Keiki.GenericsRegFieldsOf, GRecord, mkInCtor / mkInCtorVia, mkWireCtor / mkWireCtorVia, plus EmptyRegFile.
  • Keiki.Generics.THderiveAggregateCtors, deriveWireCtors, deriveView for record-payload aggregates, plus zero-enumeration *All splices that retire the hand-typed (constructorName, shortName) spec list in the common case where the short name equals the constructor name:
    • deriveAggregateCtorsAll ''Cmd ''Regs — enumerates every command constructor and emits inCtor<Ctor> / inp<Ctor> / is<Ctor> (singletons omit inp<Ctor>), defaulting each short-name suffix to the constructor name.
    • deriveWireCtorsAll ''Event — the event-side dual, emitting wire<Ctor> plus, for record-payload events, the <Ctor>TermFields record and its ToOutFields instance.
    • deriveAggregate ''Cmd ''Regs ''Event — fuses both *All variants into one splice covering an aggregate's command and event constructors. The enumerated deriveAggregateCtors / deriveWireCtors remain for abbreviated short names that differ from the constructor name.
  • Keiki.NoThunks — strict-evaluation discipline assertions for the register file and per-vertex state.
  • Keiki.ProfunctorProfunctor / Category / Strong / Choice instances on the existential SymTransducer wrapper.
  • Keiki.Render.Mermaid — Mermaid renderers for single and composite SymTransducer diagrams.
  • Keiki.Shape — GHC-upgrade-safe shape hash for snapshot discrimination. class CanonicalTypeName a, class KnownRegFileShape (rs :: [Slot]), regFileShapeHash, regFileShapeCanonical, renderStableTypeRep, sha256Hex. Reusable by any codec; the optional JSON codec lives in the sibling package keiki-codec-json.
  • Keiki.Symbolic — SBV-backed sat / isBot / isSingleValuedSym analyses for symbolic CI gating.
Out of scope (intentional)
  • No built-in serialization. JSON / CBOR / Protobuf codecs are runtime concerns and live in sibling packages — currently keiki-codec-json. The pure core talks only typed Haskell values; the shape hash discriminates snapshots regardless of codec choice.
Validated against
  • GHC 9.12.2 locally on macOS aarch64 and in CI on Ubuntu Linux x86_64 (see .github/workflows/ci.yml).
  • 278 hspec assertions in the in-tree test suite, including 11 Keiki.ShapeSpec golden assertions for the shape hash, 10 Keiki.CoreInFlightSpec assertions for the GSM streaming replay path, and 3 Keiki.CompositionMultiEventSpec assertions for multi-event composition. The downstream jitsurei package adds 96 more assertions exercising eight worked-example aggregates against the public surface.