keiro-core-0.7.0.0: CHANGELOG.md
# Changelog
All notable changes to `keiro-core` are recorded here. The format follows
[Keep a Changelog](https://keepachangelog.com/), and the package follows the
[Haskell Package Versioning Policy](https://pvp.haskell.org/).
## [Unreleased]
## 0.7.0.0 — 2026-08-01
### Breaking Changes
- Requires the conservative-projection Keiki release (`keiki >=0.7 && <0.8`),
replacing the previous `>=0.6 && <0.7` bound. Keiki 0.7 treats a predicate
that crosses a one-way generated projection as opaque to symbolic proof, so
verification may return `UnverifiedOpaque` where an earlier release reported a
`Verified*` result. Runtime codec and event-stream behavior is unchanged.
### New Features
- Adds the public `Keiro.Codec.IdDomain` module: the frozen
`keiro-dsl/id-domain/typeid-v7/1` runtime contract for prefix-bearing
TypeID-v7 identifiers. Exposes `IdDomainContract`, `IdDomainFailure`,
`IdNormalization`, `enforcedIdDomainVersion`, `typeIdV7Domain`,
`idDomainAcceptsText`, `validateIdDomainText`, `idDomainTextPattern`, and
`idDomainSampleText`. Admission requires canonical lowercase text, the
declared prefix and one underscore, a 26-character Crockford suffix, and
UUIDv7 version/variant bits; `idDomainTextPattern` yields the matching exact
Keiki projection domain. Adds a `mmzk-typeid >=0.7 && <0.8` dependency.
## 0.6.0.0 — 2026-07-31
### Breaking Changes
- Requires the exact-`Integer` / total-`Natural` Keiki release
(`keiki >=0.6 && <0.7`), replacing the previous `>=0.4 && <0.5` bound.
### New Features
- Adds the public total `Keiro.Codec.Nominal` module: the binding and fixture
API that generated nominal consumer codecs (bound aggregate IDs, enums, and
nominal scalar wrappers) are checked against.
## 0.5.0.0 — 2026-07-31
No changes this release. Released with the package set for the `keiro-dsl`
0.5.0.0 whole-workspace work.
## 0.4.0.1 — 2026-07-28
### Other Changes
- Adds PVP upper bounds to every dependency that previously carried a lower
bound only, so `cabal check` reports no packaging warnings. No API or
behaviour change from 0.4.0.0, which was tagged but never published.
## 0.4.0.0 — 2026-07-28
### Breaking Changes
- `StateCodec` includes the control-state/fold shape discriminator used with
the register-layout hash; stale snapshot seeds are invalidated when either
executable state shape changes.
- Validated event-stream construction rejects invalid event codec schemas,
tags, and upcaster chains at assembly. `mkEventStreamUnchecked` remains the
explicit emergency-forensics bypass.
- Requires Keiki 0.4 and handles its typed projection terms and validation
findings explicitly.
### New Features
- Adds the stable `Keiro.Codec.Structural` integration surface for generated
structural codecs: total `StructuralBinding` values, deterministic labelled
`FixtureCases`, both binding-law helpers, and one-way JSON delegation helpers.
- Adds `Keiro.Codec.Structural.Generic.genericStructuralBinding`, an opt-in
nominal adapter that accepts only exact constructor, selector, arity, order,
and field-type correspondence and otherwise emits a compile-time direction
to the scaffolded binding module.
## 0.3.0.0 — 2026-07-14
No user-facing changes. `keiro-core` is released at 0.3.0.0 to stay in lockstep
with the rest of the Keiro package set.
## 0.2.0.0 — 2026-07-13
### Breaking Changes
- `keiro-core` now requires post-MP-16 Keiki 0.2 (`keiki >=0.2 && <0.3`) and
Kiroku 0.3 (`kiroku-store >=0.3 && <0.4`). Stream validation runs Keiki's new
head-recoverability, inversion-ambiguity, unguarded-input-read, and
state-changing-silent-edge checks; any warning enabled by the selected
`ValidationOptions` makes `mkEventStream` reject the stream at startup.
- `validateEventStreamWith` and `mkEventStreamWith` now force-enable Keiki's
`checkHeadRecoverability` and `checkStateChangingEpsilon`. Caller-supplied
options may only strengthen validation at Keiro's durable boundary; use the
explicitly unsafe `mkEventStreamUnchecked` only for tests and emergency
forensics, never for production streams.
- `mkEventStream` now rejects snapshot codecs that cannot encode their initial
state and register file. Snapshot-enabled streams built from `emptyRegFile`
must initialize every slot before validation; the labelled `uninit: <slot>`
`ErrorCall` is reported as an `EventStreamWarning` instead of escaping at the
first snapshot write.
### New Features
- New module `Keiro.Schema`, exporting `keiroSchema :: Text` (`"keiro"`). This
is the single source of truth for the dedicated PostgreSQL schema that owns
Keiro's framework tables: `keiro-migrations` creates them schema-qualified and
the `keiro` runtime queries resolve against the same name.
- Added `mkEventStreamUnchecked`, which wraps an `EventStream` with no Keiki or
Keiro checks at all. It exists for tests and emergency forensics; a stream
admitted through it can silently lose state changes and fail hydration.
### Other Changes
- Keiki 0.2 and Kiroku 0.3 now resolve from Hackage; their obsolete Git package
overrides and the local Cabal overlay are no longer needed.
- Added a `deepseq` dependency: `validateEventStream` forces the configured
`stateCodec` over the initial state and registers, observing only `ErrorCall`
so that any other exception stays programmer-visible.
## 0.1.0.0 — 2026-07-05
Initial Hackage release.
### Breaking Changes
- Finalized the pre-release stream naming, codec, and event-stream contracts,
including safer stream category construction and validated event-stream
boundaries.
### New Features
- Added shared `Keiro.Codec`, `Keiro.Stream`, `Keiro.EventStream`,
`Keiro.EventStream.Validate`, `Keiro.Integration.Event`,
`Keiro.Snapshot.Policy`, and `Keiro.Prelude` modules.
- Added replay-safety validation helpers built on keiki's transducer validator.
### Other Changes
- Added Haddock coverage and migration documentation for validated event streams.