Release digest: June 1 - 8, 2026 (Week 23)
- Chronicle (Release v15.33.5):
WithHashiCorpVaultandWithAzureKeyVaultextension methods onIChronicleAspireBuilderto configure compliance encryption key storage from Aspire host code without manually setting environment variables (#3205, #685) - Chronicle (Release v15.33.5): Compliance encryption storage environment variable constants in
ChronicleContainerImageTags - Chronicle.Elixir (Release v0.3.2):
subject/1macro inChronicle.Complianceto explicitly mark the GDPR data-subject field on a read model. Falls back to:idwhen not declared. - Chronicle.TypeScript (Release v0.2.1):
IMaterializedReadModelsandMaterializedReadModelsfor retrieving individual or multiple read model instances directly from the Chronicle sink. - Chronicle.TypeScript (Release v0.2.1):
IReadModels.materializedexposes the new service to consumers. - Chronicle.TypeScript (Release v0.2.1): Compliance-aware release for reducer-based read models: instances are automatically passed through the release pipeline when the schema declares compliance metadata on any property.
- Chronicle.Elixir (Release v0.3.0): New
Chronicle.Projections.Projectionmacro for defining standalone declarative projections — keeps read model structs as pure data shapes while projection logic lives in a separate module. - Chronicle.Elixir (Release v0.3.0):
:projectionsoption onChronicle.Clientto register declarative projection modules alongside:read_models; auto-discovered viaotp_app:convention. - Chronicle.Elixir (Release v0.3.0): Read model queries now wait for the Chronicle connection to be established before attempting requests, with configurable timeouts and clean error propagation when the connection is unavailable.
- Chronicle.Elixir (Release v0.2.0): Automatic, ordered re-registration of reactors, reducers, projections, seeders, webhooks and subscriptions on every reconnect, bringing reconnection behavior on par with the C# client.
- Chronicle.Elixir (Release v0.2.0): Guides for connections (connection strings and resilience), event types, reactors, reducers, and getting started.
- Arc (Release v20.39.0):
@cratis/eslint-plugin-arc: ESLint rules for projects that consume Cratis Arc, designed to compose on top of@cratis/eslint-config. - Arc (Release v20.39.0):
skip-generated-proxies(processor) — skips Arc-generated proxy files wholesale. They carry a// @generated by Cratisheader (and a**DO NOT EDIT**banner), cannot be edited, and are regenerated by the build, so any lint finding on them is un-actionable. Keyed on the header because generated proxies sit intermixed with hand-written.tsunder the same folders, with no path distinction. The pass-through preserves filenames (import resolution is unaffected) and keeps--fixworking on hand-written files. - Arc (Release v20.39.0):
no-hooks-in-view-model(rule) — forbids React hook calls inside MVVM view models (classes named*ViewModel). A view model must be a plain, React-free class; inject Cratis abstractions instead of calling hooks. Only bare-identifier hook calls are flagged, so view-model methods that merely start withuseare not false positives. The class suffix and hook pattern are configurable. - Arc (Release v20.39.0): Named per the ESLint scoped-plugin convention (
@scope/eslint-plugin-*). The plugin namespace is@cratis/arc, so rule IDs read@cratis/arc/no-hooks-in-view-model. - Arc (Release v20.39.0): Ships as raw ESM (no build step), declares only
eslintas a peer dependency, and exposesmeta.versionplus per-rule docs URLs. It owns these rules because Arc owns the proxy generator and@cratis/arc.react.mvvm. - Arc (Release v20.38.0):
@cratis/eslint-plugin-arc: ESLint rules for projects that consume Cratis Arc, designed to compose on top of@cratis/eslint-config. - Arc (Release v20.38.0):
skip-generated-proxies(processor) — skips Arc-generated proxy files wholesale. They carry a// @generated by Cratisheader (and a**DO NOT EDIT**banner), cannot be edited, and are regenerated by the build, so any lint finding on them is un-actionable. Keyed on the header because generated proxies sit intermixed with hand-written.tsunder the same folders, with no path distinction. The pass-through preserves filenames (import resolution is unaffected) and keeps--fixworking on hand-written files. - Arc (Release v20.38.0):
no-hooks-in-view-model(rule) — forbids React hook calls inside MVVM view models (classes named*ViewModel). A view model must be a plain, React-free class; inject Cratis abstractions instead of calling hooks. Only bare-identifier hook calls are flagged, so view-model methods that merely start withuseare not false positives. The class suffix and hook pattern are configurable. - Arc (Release v20.38.0): Named per the ESLint scoped-plugin convention (
@scope/eslint-plugin-*). The plugin namespace is@cratis/arc, so rule IDs read@cratis/arc/no-hooks-in-view-model. - Arc (Release v20.38.0): Ships as raw ESM (no build step), declares only
eslintas a peer dependency, and exposesmeta.versionplus per-rule docs URLs. It owns these rules because Arc owns the proxy generator and@cratis/arc.react.mvvm. - Arc (Release v20.37.0):
@cratis/eslint-plugin-arc: ESLint rules for projects that consume Cratis Arc, designed to compose on top of@cratis/eslint-config. - Arc (Release v20.37.0):
skip-generated-proxies(processor) — skips Arc-generated proxy files wholesale. They carry a// @generated by Cratisheader (and a**DO NOT EDIT**banner), cannot be edited, and are regenerated by the build, so any lint finding on them is un-actionable. Keyed on the header because generated proxies sit intermixed with hand-written.tsunder the same folders, with no path distinction. The pass-through preserves filenames (import resolution is unaffected) and keeps--fixworking on hand-written files. - Arc (Release v20.37.0):
no-hooks-in-view-model(rule) — forbids React hook calls inside MVVM view models (classes named*ViewModel). A view model must be a plain, React-free class; inject Cratis abstractions instead of calling hooks. Only bare-identifier hook calls are flagged, so view-model methods that merely start withuseare not false positives. The class suffix and hook pattern are configurable. - Arc (Release v20.37.0): Named per the ESLint scoped-plugin convention (
@scope/eslint-plugin-*). The plugin namespace is@cratis/arc, so rule IDs read@cratis/arc/no-hooks-in-view-model. - Arc (Release v20.37.0): Ships as raw ESM (no build step), declares only
eslintas a peer dependency, and exposesmeta.versionplus per-rule docs URLs. It owns these rules because Arc owns the proxy generator and@cratis/arc.react.mvvm. - Arc (Release v20.36.0):
@cratis/eslint-plugin-arc: ESLint rules for projects that consume Cratis Arc, designed to compose on top of@cratis/eslint-config. - Arc (Release v20.36.0):
skip-generated-proxies(processor) — skips Arc-generated proxy files wholesale. They carry a// @generated by Cratisheader (and a**DO NOT EDIT**banner), cannot be edited, and are regenerated by the build, so any lint finding on them is un-actionable. Keyed on the header because generated proxies sit intermixed with hand-written.tsunder the same folders, with no path distinction. The pass-through preserves filenames (import resolution is unaffected) and keeps--fixworking on hand-written files. - Arc (Release v20.36.0):
no-hooks-in-view-model(rule) — forbids React hook calls inside MVVM view models (classes named*ViewModel). A view model must be a plain, React-free class; inject Cratis abstractions instead of calling hooks. Only bare-identifier hook calls are flagged, so view-model methods that merely start withuseare not false positives. The class suffix and hook pattern are configurable. - Arc (Release v20.36.0): Named per the ESLint scoped-plugin convention (
@scope/eslint-plugin-*). The plugin namespace is@cratis/arc, so rule IDs read@cratis/arc/no-hooks-in-view-model. - Arc (Release v20.36.0): Ships as raw ESM (no build step), declares only
eslintas a peer dependency, and exposesmeta.versionplus per-rule docs URLs. It owns these rules because Arc owns the proxy generator and@cratis/arc.react.mvvm. - Arc (Release v20.35.0):
@cratis/eslint-plugin-arc: ESLint rules for projects that consume Cratis Arc, designed to compose on top of@cratis/eslint-config. - Arc (Release v20.35.0):
skip-generated-proxies(processor) — skips Arc-generated proxy files wholesale. They carry a// @generated by Cratisheader (and a**DO NOT EDIT**banner), cannot be edited, and are regenerated by the build, so any lint finding on them is un-actionable. Keyed on the header because generated proxies sit intermixed with hand-written.tsunder the same folders, with no path distinction. The pass-through preserves filenames (import resolution is unaffected) and keeps--fixworking on hand-written files. - Arc (Release v20.35.0):
no-hooks-in-view-model(rule) — forbids React hook calls inside MVVM view models (classes named*ViewModel). A view model must be a plain, React-free class; inject Cratis abstractions instead of calling hooks. Only bare-identifier hook calls are flagged, so view-model methods that merely start withuseare not false positives. The class suffix and hook pattern are configurable. - Arc (Release v20.35.0): Named per the ESLint scoped-plugin convention (
@scope/eslint-plugin-*). The plugin namespace is@cratis/arc, so rule IDs read@cratis/arc/no-hooks-in-view-model. - Arc (Release v20.35.0): Ships as raw ESM (no build step), declares only
eslintas a peer dependency, and exposesmeta.versionplus per-rule docs URLs. It owns these rules because Arc owns the proxy generator and@cratis/arc.react.mvvm. - Components (Release v2.3.0):
@cratis/eslint-plugin-components: ESLint rules for projects that consume Cratis Components, designed to compose on top of@cratis/eslint-config. - Components (Release v2.3.0):
no-root-barrel-import(rule) — disallows importing from the@cratis/componentsroot barrel. Use a subpath export (@cratis/components/CommandDialog,@cratis/components/DataPage,@cratis/components/Toolbar, …); the root pulls the whole optional-peer-heavy surface and hides intent. Coversimportand re-export … from. Configurable package name and allow-list. - Components (Release v2.3.0):
no-primereact-dialog(rule) — disallows importingDialogfromprimereact/dialog. UseCommandDialogfrom@cratis/components/CommandDialog, orDialogfrom@cratis/components/Dialogs— the wrappers add Arc command binding, overlay/focus fixes, and theming. - Components (Release v2.2.0):
@cratis/eslint-plugin-components: ESLint rules for projects that consume Cratis Components, designed to compose on top of@cratis/eslint-config. - Components (Release v2.2.0):
no-root-barrel-import(rule) — disallows importing from the@cratis/componentsroot barrel. Use a subpath export (@cratis/components/CommandDialog,@cratis/components/DataPage,@cratis/components/Toolbar, …); the root pulls the whole optional-peer-heavy surface and hides intent. Coversimportand re-export … from. Configurable package name and allow-list. - Components (Release v2.2.0):
no-primereact-dialog(rule) — disallows importingDialogfromprimereact/dialog. UseCommandDialogfrom@cratis/components/CommandDialog, orDialogfrom@cratis/components/Dialogs— the wrappers add Arc command binding, overlay/focus fixes, and theming. - Arc (Release v20.34.0):
@cratis/eslint-plugin-arc: ESLint rules for projects that consume Cratis Arc, designed to compose on top of@cratis/eslint-config. - Arc (Release v20.34.0):
skip-generated-proxies(processor) — skips Arc-generated proxy files wholesale. They carry a// @generated by Cratisheader (and a**DO NOT EDIT**banner), cannot be edited, and are regenerated by the build, so any lint finding on them is un-actionable. Keyed on the header because generated proxies sit intermixed with hand-written.tsunder the same folders, with no path distinction. The pass-through preserves filenames (import resolution is unaffected) and keeps--fixworking on hand-written files. - Arc (Release v20.34.0):
no-hooks-in-view-model(rule) — forbids React hook calls inside MVVM view models (classes named*ViewModel). A view model must be a plain, React-free class; inject Cratis abstractions instead of calling hooks. Only bare-identifier hook calls are flagged, so view-model methods that merely start withuseare not false positives. The class suffix and hook pattern are configurable. - Arc (Release v20.34.0): Named per the ESLint scoped-plugin convention (
@scope/eslint-plugin-*). The plugin namespace is@cratis/arc, so rule IDs read@cratis/arc/no-hooks-in-view-model. - Arc (Release v20.34.0): Ships as raw ESM (no build step), declares only
eslintas a peer dependency, and exposesmeta.versionplus per-rule docs URLs. It owns these rules because Arc owns the proxy generator and@cratis/arc.react.mvvm. - Fundamentals (Release v7.14.0):
@cratis/eslint-config: a shareable ESLint flat-config package for Cratis projects. It exposes aconsumerpreset for projects that build on Cratis (house TypeScript/React hygiene plus thefor_*BDD spec relaxations) and aninternalpreset that adds the Cratis MIT license-header rule for use inside the Cratis product repos. Thebaseandspecsbuilding blocks are exported for custom composition. - Chronicle (Release v15.33.0):
InstanceCountToSkipandInstanceCountconcepts for type-safe pagination parameters with implicit conversion operators - Chronicle (Release v15.33.0):
IMaterializedReadModelsinterface with optionalskipandtakeparameters onGetInstances<TReadModel>()andObserveInstances<TReadModel>()methods (defaults: skip=0, take=50) - Chronicle (Release v15.33.0):
IMaterializedReadModelsgRPC service contract with correspondingObserveInstancesRequestandObserveInstancesResponsetypes - Chronicle (Release v15.33.0):
IReadModels.Materializedproperty returningIMaterializedReadModelsfor accessing materialized read model operations - Chronicle (Release v15.33.0):
IReadModelsComplianceinterface for PII decryption operations on read model instances - Chronicle (Release v15.33.0):
ReadModelsComplianceimplementation ofIReadModelsComplianceto centralize PII decryption logic - Chronicle (Release v15.33.0):
IEventComplianceinterface for PII decryption operations on event content - Chronicle (Release v15.33.0):
EventComplianceimplementation ofIEventComplianceto centralize PII decryption logic - Chronicle (Release v15.33.0):
ISink.ObserveInstances(ReadModelContainerName? occurrence, int skip, int take)for sink-level observation - Chronicle (Release v15.33.0): Client and Kernel implementations of
MaterializedReadModelsservice with automatic Release() calls on all returned instances - Chronicle (Release v15.33.0): Comprehensive documentation for materialized read models pagination and observation at
Documentation/read-models/materialized-pagination.md - Chronicle (Release v15.33.0): Specs for optional parameter behavior on
GetInstancesandObserveInstances - Chronicle (Release v15.32.3): Reactors can now control the append metadata of the side-effect events they return — event source id, event stream id and type, event source type, and subject — through the
ICanProvideEventSourceId,ICanProvideEventStreamIdandICanProvideSubjectinterfaces and the[EventStreamId],[EventStreamType]and[EventSourceType]attributes. - Fundamentals (Release v7.13.0): ConceptAs abstract class with value property, valueOf(), and toString() methods
- Fundamentals (Release v7.13.0): Union type support with recommended export pattern: concept class with “Concept” suffix and clean union type export (e.g.,
class UserIdConcept→export type UserId = UserIdConcept | string) - Fundamentals (Release v7.13.0): Flexible assignment of both ConceptAs instances and primitives through exported union types
- Fundamentals (Release v7.13.0): Recursive serialization pattern following C# implementation (recognize ConceptAs → unwrap → serialize inner value)
- Fundamentals (Release v7.13.0): Prototype chain-based type detection in JsonSerializer for ConceptAs subclasses
- Fundamentals (Release v7.13.0): 216 comprehensive tests covering creation, serialization, deserialization, and union type scenarios
- Fundamentals (Release v7.13.0): Complete documentation at Documentation/typescript/concept_as.md with union type export pattern, examples, and best practices
- Fundamentals (Release v7.13.0): Comparison table highlighting differences between C# and TypeScript implementations
- Fundamentals (Release v7.12.0): ConceptAs abstract class with value property, valueOf(), and toString() methods
- Fundamentals (Release v7.12.0): Union type support with recommended export pattern: concept class with “Concept” suffix and clean union type export (e.g.,
class UserIdConcept→export type UserId = UserIdConcept | string) - Fundamentals (Release v7.12.0): Flexible assignment of both ConceptAs instances and primitives through exported union types
- Fundamentals (Release v7.12.0): Recursive serialization pattern following C# implementation (recognize ConceptAs → unwrap → serialize inner value)
- Fundamentals (Release v7.12.0): Prototype chain-based type detection in JsonSerializer for ConceptAs subclasses
- Fundamentals (Release v7.12.0): 216 comprehensive tests covering creation, serialization, deserialization, and union type scenarios
- Fundamentals (Release v7.12.0): Complete documentation at Documentation/typescript/concept_as.md with union type export pattern, examples, and best practices
- Fundamentals (Release v7.12.0): Comparison table highlighting differences between C# and TypeScript implementations
- Fundamentals (Release v7.11.0): ConceptAs abstract class with value property, valueOf(), and toString() methods
- Fundamentals (Release v7.11.0): Union type support with recommended export pattern: concept class with “Concept” suffix and clean union type export (e.g.,
class UserIdConcept→export type UserId = UserIdConcept | string) - Fundamentals (Release v7.11.0): Flexible assignment of both ConceptAs instances and primitives through exported union types
- Fundamentals (Release v7.11.0): Recursive serialization pattern following C# implementation (recognize ConceptAs → unwrap → serialize inner value)
- Fundamentals (Release v7.11.0): Prototype chain-based type detection in JsonSerializer for ConceptAs subclasses
- Fundamentals (Release v7.11.0): 216 comprehensive tests covering creation, serialization, deserialization, and union type scenarios
- Fundamentals (Release v7.11.0): Complete documentation at Documentation/typescript/concept_as.md with union type export pattern, examples, and best practices
- Fundamentals (Release v7.11.0): Comparison table highlighting differences between C# and TypeScript implementations
- Components (Release v2.1.0):
Source/Filter/module: standaloneFilterPanel,FilterEditor,RangeHistogramFilter,useFilterStatehook, and full TypeScript type definitions (FilterDefinition,FilterEditorProps,FilterEditorSlotProps,FilterValues,RangeValues,CustomFilterValues) (#102) - Components (Release v2.1.0):
FilterEditorslot component — declares a custom editor for a specific filter group as a declarative child of<FilterPanel>; value tracked separately incustomValues(#102) - Components (Release v2.1.0):
type: 'custom'filter type as an explicit opt-in for fully custom filter editors (#102) - Components (Release v2.1.0): 5 Storybook stories for
FilterPanel: single-select, multi-select, numeric range/histogram, custom editor, and mixed filter types (#102) - Components (Release v2.1.0):
./Filtersubpath export inpackage.jsonfor direct imports via@cratis/components/Filter(#102) - Components (Release v2.1.0):
Documentation/Filter/index.md— full API reference covering all exported types,FilterPanelprops,FilterEditorprops,useFilterStatehook, and usage examples for every filter type (#102) - Components (Release v2.1.0): BDD specs in
Source/Filter/for_useFilterState/coveringbuildFilterValuesandbuildRangeValues— 9 tests across 4 spec files (#102) - Components (Release v2.1.0):
Source/Filter/utils.tsexportingbuildFilterValuesandbuildRangeValuesas pure, testable utility functions (#102) - Chronicle (Release v15.32.0): Reactor handlers can return side-effect events directly, including single and multiple event return shapes (#3307)
- Chronicle (Release v15.32.0): Observer in-flight event persistence with subscribe-time partition recovery after interruption (#1682)
- Chronicle (Release v15.32.0): Observer handled-event counters, including total and per-event-type visibility in observer information (#1557)
- Chronicle (Release v15.32.0): Stream completion support with dedicated closed-stream constraint storage and validation (#1446)
- Chronicle (Release v15.32.0): Nested projection object coverage for nested-in-nested and nested-in-children scenarios (#3142)
- Chronicle (Release v15.32.0): Constraint change metadata and dedicated constraint reindex job flow for affected definitions
Changed
Section titled “Changed”- cli (Release v1.6.1):
DetailOverlayWindowexposes its per-tab editors (TabEditors) so a tab’s content can be updated afterBuild— used to fill the Instances tab once the async fetch completes. The fetch runs on a background task (Task.Run+ConfigureAwait(false)) and the result is marshalled back onto the UI thread viaEnqueueOnUIThread. - Arc (Release v20.39.2): All streaming transports (
ObservableQueryDemultiplexer,ClientObservable,ClientObservableSSE,ClientEnumerableObservable,ClientEnumerableObservableSSE) now share a singleIReadModelInterceptors.InterceptEmissionhelper that intercepts each emission, unwrapping collection emissions to the read model element type. - Chronicle.Elixir (Release v0.3.2):
Chronicle.ReadModels.get_instance_by_id/3,get_instances/2,all/2,query/2, andget_snapshots_by_id/3now apply client-side compliance decryption (via the Chronicle complianceReleaseendpoint) when the read model is backed by a reducer. Projection-backed models are unaffected — the server handles compliance for those. - Chronicle.Elixir (Release v0.3.1): Improved context documentation with richer explanations of correlation, identity, causation chains, delegation, and on-behalf-of patterns.
- Chronicle.Elixir (Release v0.3.1): Console sample now cycles through three mock users (press
I) so each operation records a distinct causer in the event log. - Chronicle.TypeScript (Release v0.2.1): Bumped
@cratis/chronicle.contractsto15.33.3. - Chronicle (Release v15.33.3):
ComplianceMetadataTypeis now a string instead of aGuid; the built-in PII type is simply"PII". - Chronicle.Elixir (Release v0.2.0): The client now connects, detects a dead connection, reconnects, and re-registers all observers through a single connection lifecycle rather than each observer polling and retrying independently.
- Chronicle.Elixir (Release v0.2.0): Modules are organized into domain-driven folders (auditing, connections, correlation, event sequences, events, identity, reactors, read models, reducers, seeding).
- Arc (Release v20.39.1): All streaming transports (
ObservableQueryDemultiplexer,ClientObservable,ClientObservableSSE,ClientEnumerableObservable,ClientEnumerableObservableSSE) now share a singleIReadModelInterceptors.InterceptEmissionhelper that intercepts each emission, unwrapping collection emissions to the read model element type. - Components (Release v2.3.0): Add the
ESLintworkspace to the repoworkspaces. - Components (Release v2.3.0): Named per the ESLint scoped-plugin convention (
@scope/eslint-plugin-*). The plugin namespace is@cratis/components, so rule IDs read@cratis/components/no-root-barrel-import. - Components (Release v2.3.0): Ships as raw ESM (no build step), declares only
eslintas a peer dependency, and exposesmeta.versionplus per-rule docs URLs. It owns these rules because Components owns its subpath export surface and the dialog wrappers. - Components (Release v2.2.0): Add the
ESLintworkspace to the repoworkspaces. - Components (Release v2.2.0): Named per the ESLint scoped-plugin convention (
@scope/eslint-plugin-*). The plugin namespace is@cratis/components, so rule IDs read@cratis/components/no-root-barrel-import. - Components (Release v2.2.0): Ships as raw ESM (no build step), declares only
eslintas a peer dependency, and exposesmeta.versionplus per-rule docs URLs. It owns these rules because Components owns its subpath export surface and the dialog wrappers. - Fundamentals (Release v7.14.0): Fundamentals now lints its own source through
@cratis/eslint-config’sinternalpreset instead of a hand-maintained rule set, removing configuration that is otherwise duplicated across the Arc and Components repos. The effective rule set is unchanged: the existing lint gate passes, and the MIT license-header rule still fires on un-headered files. - Fundamentals (Release v7.14.0): The package ships as raw ESM (no build step) and declares only
eslintas a peer dependency. It is the foundation that@cratis/arc.eslintand@cratis/components.eslintcompose on top of. - Components (Release v2.1.3): Filter clear buttons now appear in header next to count badge/indicator, not at bottom of filter content (#issue)
- Components (Release v2.1.3): Clear button styled as round icon with × character, hover/active states, and descriptive tooltips (#issue)
- Components (Release v2.1.3):
RangeHistogramFilterno longer renders its own clear button—handled by parentFilterPanel(#issue) - Components (Release v2.1.3): Custom filter examples updated to remove inline clear buttons following new pattern (#issue)
- Components (Release v2.1.3): Documentation updated with clear button behavior for all filter types and guidance for custom editors (#issue)
- Components (Release v2.1.3): String/option filters: next to selection count, calls
onFilterClear(filterKey) - Components (Release v2.1.3): Range filters: next to “Range” indicator, calls
onRangeChange(filterKey, null) - Components (Release v2.1.3): Custom filters: next to dot indicator, calls
onCustomValueChange(filterKey, undefined) - Chronicle (Release v15.33.0): Moved paginated
GetInstancesand observableWatchInstancesmethods fromIReadModelstoIMaterializedReadModels - Chronicle (Release v15.33.0):
skipandtakeparameters are now optional with defaults (skip: 0, take: 50) onIMaterializedReadModelsinterface methods - Chronicle (Release v15.33.0): MongoDB Sink now supports observable instances via Arc’s
.Observe()with change stream monitoring - Chronicle (Release v15.33.0): SQL Sink now supports observable instances via Arc’s EF
.Observe()with proper DbContext scope lifetime management - Chronicle (Release v15.33.0): InMemorySink and NullSink updated with observation support for testing scenarios
- Chronicle (Release v15.33.0): Both
ReadModelsandMaterializedReadModelsservices now use injectedIReadModelsCompliancefor PII decryption - Chronicle (Release v15.33.0): Converted
ReadModelsCompliancefrom static helper to injectable service following theIEventCompliancepattern - Chronicle (Release v15.33.0): Renamed
IEventComplianceHelper→IEventComplianceandEventComplianceHelper→EventCompliancefor consistency with read models compliance naming - Arc (Release v20.33.19): Updated
Cratis.Chronicle,Cratis.Chronicle.AspNetCoreandCratis.Chronicle.Testingto15.32.3. - Arc (Release v20.33.19):
ICanProvideEventSourceId,ICanProvideEventStreamId,ICanProvideSubjectandEventStreamIdAttributenow come fromCratis.Chronicle(theCratis.Chronicle.Eventsnamespace) instead of being duplicated in Arc. Command code that implements these should import them fromCratis.Chronicle.Events. - Arc (Release v20.33.18): Updated
Cratis.Chronicle,Cratis.Chronicle.AspNetCoreandCratis.Chronicle.Testingto15.32.3. - Arc (Release v20.33.18):
ICanProvideEventSourceId,ICanProvideEventStreamId,ICanProvideSubjectandEventStreamIdAttributenow come fromCratis.Chronicle(theCratis.Chronicle.Eventsnamespace) instead of being duplicated in Arc. Command code that implements these should import them fromCratis.Chronicle.Events. - Arc (Release v20.33.17): Updated
Cratis.Chronicle,Cratis.Chronicle.AspNetCoreandCratis.Chronicle.Testingto15.32.3. - Arc (Release v20.33.17):
ICanProvideEventSourceId,ICanProvideEventStreamId,ICanProvideSubjectandEventStreamIdAttributenow come fromCratis.Chronicle(theCratis.Chronicle.Eventsnamespace) instead of being duplicated in Arc. Command code that implements these should import them fromCratis.Chronicle.Events. - Chronicle (Release v15.32.3): Moved
ICanProvideEventSourceId,ICanProvideEventStreamIdandICanProvideSubjectto theCratis.Chronicle.Eventsnamespace so they are shared by reactors and commands. - Fundamentals (Release v7.13.0): JsonSerializer now follows C# pattern: recognizes ConceptAs types, unwraps to inner value, then recursively serializes using reliable type detection
- Fundamentals (Release v7.13.0): JsonSerializer serializes both ConceptAs instances and primitives to inner values and deserializes JSON primitives back to ConceptAs instances based on @field decorator
- Fundamentals (Release v7.13.0): Updated TypeScript documentation index and table of contents to include ConceptAs
- Fundamentals (Release v7.13.0): Reorganized test structure: moved serialization tests from
for_ConceptAstofor_JsonSerializerto reflect that serialization is a JsonSerializer concern, while keeping ConceptAs creation tests self-contained - Fundamentals (Release v7.12.0): JsonSerializer now follows C# pattern: recognizes ConceptAs types, unwraps to inner value, then recursively serializes using reliable type detection
- Fundamentals (Release v7.12.0): JsonSerializer serializes both ConceptAs instances and primitives to inner values and deserializes JSON primitives back to ConceptAs instances based on @field decorator
- Fundamentals (Release v7.12.0): Updated TypeScript documentation index and table of contents to include ConceptAs
- Fundamentals (Release v7.12.0): Reorganized test structure: moved serialization tests from
for_ConceptAstofor_JsonSerializerto reflect that serialization is a JsonSerializer concern, while keeping ConceptAs creation tests self-contained - Fundamentals (Release v7.11.0): JsonSerializer now follows C# pattern: recognizes ConceptAs types, unwraps to inner value, then recursively serializes using reliable type detection
- Fundamentals (Release v7.11.0): JsonSerializer serializes both ConceptAs instances and primitives to inner values and deserializes JSON primitives back to ConceptAs instances based on @field decorator
- Fundamentals (Release v7.11.0): Updated TypeScript documentation index and table of contents to include ConceptAs
- Fundamentals (Release v7.11.0): Reorganized test structure: moved serialization tests from
for_ConceptAstofor_JsonSerializerto reflect that serialization is a JsonSerializer concern, while keeping ConceptAs creation tests self-contained - Arc (Release v20.33.3): Changed Chronicle read model setup to register the compliance interceptor in each service collection (#2152)
- Components (Release v2.1.0):
FilterPanelacceptschildren?: ReactNode— usesReact.Children+isValidElementto discover<FilterEditor>slots and render them in the matching filter group (#102) - Components (Release v2.1.0):
PivotViewer/components/FilterPanel.tsxis now a thin adapter: convertsPivotFilter<TItem>[]+ computed options intoFilterDefinition[], generates<FilterEditor>children from anyPivotFilter.renderEditor, and delegates all rendering to the new standalone component — no breaking changes to the public API (#102) - Components (Release v2.1.0):
PivotFilter<TItem>retainsrenderEditor?andtype: 'custom'so PivotViewer consumers can inject custom filter editors without any workarounds (#102) - Components (Release v2.1.0):
Source/Filter/useFilterState.tsnow importsbuildFilterValuesandbuildRangeValuesfrom./utils(#102) - Components (Release v2.1.0):
Documentation/toc.ymlupdated with Filter entries in both the Storybook section and Common Components section (#102) - Components (Release v2.1.0):
eslint.config.mjs— addedargsIgnorePattern: '^_'to the@typescript-eslint/no-unused-varsrule to honour the_-prefix convention for intentionally unused parameters (#102) - Arc (Release v20.33.2): Changed Chronicle read model setup to register the compliance interceptor in each service collection (#2152)
- Chronicle (Release v15.32.1): Registered the required Chronicle observation activity sources for reactor and reducer gRPC services.
- Chronicle (Release v15.32.1): Extended append-many client/test harness support with per-event subject assertions and an in-process PII integration scenario.
- Chronicle (Release v15.32.0): Constraint definitions are persisted as versions; latest is active while prior versions are retained
- Chronicle (Release v15.32.0): Constraint updates now classify change impact and trigger targeted reindex only when required
- Chronicle (Release v15.32.0): Observer count behavior now aligns with replay semantics (full replay reset, partition replay adjustment) (#1557)
- Chronicle (Release v15.32.0): Event compliance handling is consumed through a dedicated injectable helper contract (#1557)
- Chronicle (Release v15.32.0): Stream completion behavior now returns explicit completion results and rejects unsupported completion cases (#1446)
- Chronicle (Release v15.32.0): Observer state keeps a backward-compatible alias for handled-event-type counts while guiding consumers to the new property name (#1557)
- Components (Release v2.0.1): Move UI runtime libraries (allotment, framer-motion, pixi.js, primeicons, primereact) from peer dependencies to dependencies for package consumers.
- Components (Release v2.0.1): Keep only framework-level peers (React, Cratis Arc, fundamentals, reflect-metadata, tsyringe) as peer dependencies.
- Chronicle (Release v15.33.8): SQL backend: Workbench event-store list and namespace dropdown now populate correctly — SSE observable subscriptions were silently receiving no data because the BehaviorSubject’s initial emission was swallowed by a non-replaying Subject intermediary before any subscriber was attached
- Chronicle (Release v15.33.8): SQL backend: Appending events no longer fails with
value too long for type character varying(200)when a unique constraint value (e.g. a long email address) exceeds 200 characters — theValuecolumn is now created as unbounded text, and existing tables are automatically altered in-place on next startup - Chronicle (Release v15.33.7): SQL read model instances query failing with `42703: column does not exist` when two read models share the same container name across namespaces and the existing table was created by a different read model with a different column set.
- Chronicle (Release v15.33.6):
ClusterStorage.ObserveEventStores,EventTypesStorage.GetAllGenerationsForEventType,NamespaceStorage.ObserveAll, andObserverStateStorage.ObserveAllin the SQL storage backend no longer throwNotImplementedExceptionat runtime — each is now fully implemented following the sameReplaySubject/NotifyChangepattern used by the rest of the SQL storage layer. - Chronicle.Elixir (Release v1.0.1): The `Artifacts.discover_loaded/0` test assertion was missing `:projections` from the expected artifact category keys, causing CI to fail after projections support was added.
- Chronicle (Release v15.33.5): OpenIddict storage registrations now route to SQL-backed implementations when the configured storage type is SQLite, MS SQL, or PostgreSQL, preventing authentication failures with SQL backends
- cli (Release v1.6.1): Read model instances now load asynchronously: the detail overlay opens immediately and the UI thread no longer blocks on the instances fetch when activating a read model row.
- Chronicle (Release v15.33.4): Fixing so that we don’t fall back to production tag - but development slim when other databases are configured for Aspire setup.
- Arc (Release v20.39.2): Observable (
ISubject<T>) andIAsyncEnumerable<T>model-bound query results no longer crash under read model interception.QueryPipeline.ApplyInterceptorsnow leaves streaming results untouched for the streaming transport to intercept per emission. - Arc (Release v20.39.2): Collection observable queries (
ISubject<IEnumerable<TReadModel>>) now have compliance/PII release applied to each item. The streaming transports previously keyed interception on the enumerable type, found no matching interceptor, and silently served undecrypted values. - Chronicle.TypeScript (Release v0.2.3): Calling the compliance `Release` gRPC service no longer crashes the entire client with `requestEncode is not a function`. The service definition was wired with empty placeholder objects instead of proper protobuf message functions; replaced with correct binary encode/decode implementations.
- Chronicle.TypeScript (Release v0.2.2):
getSnapshotsByIdnow releases (decrypts) compliance-protected PII fields in read model snapshots when the read model is owned by a reducer, matching the behavior already applied togetInstanceByIdandgetInstances. - Chronicle.Elixir (Release v0.3.1):
ComplianceMetadataType.pii()now returns"PII"instead of the opaque GUID"cae5580e-83d6-44dc-9d7a-a72e8a2f17d7", aligning the Elixir client with the Chronicle kernel which changed to string-based compliance type identifiers. - Chronicle.TypeScript (Release v0.2.1):
ComplianceMetadataTypenow uses a plainstringvalue instead ofGuid, matching the kernel concept that was changed to a string representation. ThePIIsentinel is updated from a UUID to'PII'. - Chronicle.Elixir (Release v0.3.0): Model-bound
fromdeclarations with no options now correctly trigger auto-mapping instead of producing an empty property set. - Chronicle.Elixir (Release v0.3.0): Console sample interactive input no longer requires pressing Enter after each keypress.
- Chronicle (Release v15.33.3): Personally Identifiable Information is now decrypted on every path that returns a read model or events — including
getInstanceById(immediate projections and stored read models) and read model snapshots. - Chronicle (Release v15.33.3): Encrypting a batch of events that contained several PII events for the same subject could overwrite the subject’s encryption key and leave earlier events undecryptable; concurrent encryptions for a subject now share a single key.
- Chronicle (Release v15.33.2): Unique constraints are now enforced across events appended in the same
AppendManybatch — two events in one batch can no longer both claim the same unique value and both be appended. - Chronicle.Elixir (Release v0.2.0): Reducers no longer fail to register with a server-side
ReducerRegistrationFailed/NullReferenceException: observers now register their observation streams only after their read-model and projection definitions exist on the kernel. - Chronicle.Elixir (Release v0.2.0): Seeding no longer fails with
:not_connectedat startup: seeders run once the connection is ready and retry idempotently. - Arc (Release v20.39.1): Observable (
ISubject<T>) andIAsyncEnumerable<T>model-bound query results no longer crash under read model interception.QueryPipeline.ApplyInterceptorsnow leaves streaming results untouched for the streaming transport to intercept per emission. - Arc (Release v20.39.1): Collection observable queries (
ISubject<IEnumerable<TReadModel>>) now have compliance/PII release applied to each item. The streaming transports previously keyed interception on the enumerable type, found no matching interceptor, and silently served undecrypted values. - Chronicle (Release v15.33.1): The
developmentanddevelopment-slimcontainer images no longer abort at startup demanding an encryption certificate and HTTPS. Development security relaxations (ephemeral OpenIddict keys, optional TLS) are once again gated on the compile-timeDEVELOPMENTflag the images are built with, instead of a runtime environment-variable check the images never set. Production images still require an encryption certificate. - Arc (Release v20.33.19): The subject is now included when a command appends events for explicit event source ids (
EventForEventSourceId), matching the behavior of the other event appenders. - Arc (Release v20.33.18): The subject is now included when a command appends events for explicit event source ids (
EventForEventSourceId), matching the behavior of the other event appenders. - Arc (Release v20.33.17): The subject is now included when a command appends events for explicit event source ids (
EventForEventSourceId), matching the behavior of the other event appenders. - Arc (Release v20.33.16): Date objects in URL query parameters and route replacements now serialize as ISO 8601 for .NET DateTimeOffset binding compatibility
- Arc (Release v20.33.15): Date objects in URL query parameters and route replacements now serialize as ISO 8601 for .NET DateTimeOffset binding compatibility
- Arc (Release v20.33.14): Date objects in URL query parameters and route replacements now serialize as ISO 8601 for .NET DateTimeOffset binding compatibility
- Arc (Release v20.33.13): Date objects in URL query parameters and route replacements now serialize as ISO 8601 for .NET DateTimeOffset binding compatibility
- Arc (Release v20.33.12): Date objects in URL query parameters and route replacements now serialize as ISO 8601 for .NET DateTimeOffset binding compatibility
- Arc (Release v20.33.11): Incorrect TypeScript import generation for nullable primitive types (e.g.
import { Date } from '../Nullable\1’`) - Arc (Release v20.33.10): Incorrect TypeScript import generation for nullable primitive types (e.g.
import { Date } from '../Nullable\1’`) - Arc (Release v20.33.9): ProxyGenerator crash when processing nullable DateTimeOffset query parameters due to Nullable.GetUnderlyingType() returning null for MetadataLoadContext types
- Arc (Release v20.33.8): ProxyGenerator crash when processing nullable DateTimeOffset query parameters due to Nullable.GetUnderlyingType() returning null for MetadataLoadContext types
- Arc (Release v20.33.7): Add integration specs for generic type parameter and dictionary with generic key scenarios that previously caused null reference exceptions
- Arc (Release v20.33.7): Replace null-forgiving operators with proper null guards throughout TypeExtensions for all
type.FullNameusages - Arc (Release v20.33.6): Add integration specs for generic type parameter and dictionary with generic key scenarios that previously caused null reference exceptions
- Arc (Release v20.33.6): Replace null-forgiving operators with proper null guards throughout TypeExtensions for all
type.FullNameusages - Arc (Release v20.33.5): ProxyGenerator now correctly maps nullable value types (
DateTimeOffset?,DateTime?,int?,Guid?,bool?) to their underlying TypeScript types (Date,number,boolean,Guid) instead of the literal type nameNullable - Arc (Release v20.33.4): ProxyGenerator now correctly maps nullable value types (
DateTimeOffset?,DateTime?,int?,Guid?,bool?) to their underlying TypeScript types (Date,number,boolean,Guid) instead of the literal type nameNullable - Arc (Release v20.33.3): Fixed open generic read model interceptors being skipped by Arc query interception (#2152)
- Arc (Release v20.33.3): Fixed DI-registered read model interceptors not running for query read models (#2152)
- Components (Release v2.1.1): Date range for filters didn’t format properly, now it has more options.
- Components (Release v2.1.0): Storybook static build (
storybook build) now completes successfully — fixed a pre-existing[lightningcss minify] Invalid empty selectorcrash by addingcssMinify: falseto theviteFinalconfig inSource/.storybook/main.ts(#102) - Components (Release v2.1.0): CI build failure caused by ESLint flagging
_propsinFilterEditor.tsxas unused — resolved by addingargsIgnorePattern: '^_'to the ESLint rule config (#102) - Arc (Release v20.33.2): Fixed open generic read model interceptors being skipped by Arc query interception (#2152)
- Arc (Release v20.33.2): Fixed DI-registered read model interceptors not running for query read models (#2152)
- Chronicle (Release v15.32.1): Fixed
AppendManysubject propagation for compliance and PII encryption. - Chronicle (Release v15.32.1):
AppendMany(EventSourceId, IEnumerable<object>)now resolves[Subject]from each event and sends it per event. - Chronicle (Release v15.32.1):
AppendMany(IEnumerable<EventForEventSourceId>)now preserves an explicit per-eventSubjectoverride, or derives it from[Subject]when no override is provided. - Chronicle (Release v15.32.1): The gRPC contract, kernel append-many model, compliance application, SQL storage, in-memory storage, and the API append-many endpoint now carry the subject through consistently.
- Chronicle (Release v15.32.1): Batched events whose PII belongs to a person different from the event source are now encrypted under the person subject instead of falling back to the aggregate event source id.
- Chronicle (Release v15.32.1): Fixed child projection parent-key resolution when the parent projection is identified by
$eventSourceIdand the child key is a different type. - Chronicle (Release v15.32.1): Fixed projection sink updates that combine parent collection property changes with child add/remove operations in the same update across MongoDB, SQL, and in-memory storage.
- Chronicle (Release v15.32.1): Fixed repeated MongoDB redaction handling so already-redacted events preserve the original event type and do not trigger another observer rewind.
- Chronicle (Release v15.32.1): Fixed redaction detection to compare against the event type id instead of the full event type value.
- Chronicle (Release v15.32.1): Fixed compliance release handling for non-string subjects and multiple PII properties.
- Chronicle (Release v15.32.1): Fixed observer event decryption when event type schemas with PII metadata are loaded lazily while handling events.
- Chronicle (Release v15.32.0): Unique constraint definition updates now rebuild affected indexes to prevent stale uniqueness behavior
- Chronicle (Release v15.32.0): Constraint change propagation now carries actionable change details instead of generic change signals
- Chronicle (Release v15.32.0): Integration regressions caused by scenario setup overwrites of explicit identifiers
- Chronicle (Release v15.32.0): Observer state serialization issues for concept-keyed read-only dictionary payloads (#1557)
- Chronicle (Release v15.32.0): Build failure caused by an analyzer-triggering unnecessary using in specs (#3142)
- Chronicle (Release v15.32.0): CI/package restore failures caused by branch-local GitHub Packages source configuration
- Chronicle (Release v15.32.0): Integration spec and benchmark regressions caused by legacy observer handled-event count property usage (#1557)
Removed
Section titled “Removed”- Chronicle (Release v15.32.0): Observer handled-count Orleans grain path in favor of persisted incremental state (#1557)
- Chronicle (Release v15.32.0): Legacy append error path for completed streams in favor of constraint violations (#1446)
- Chronicle (Release v15.32.0): Completed-stream collection ownership from event sequence state, now moved to dedicated constraint storage (#1446)
- Chronicle (Release v15.32.0): Branch-local
NuGet.configthat redirected package restore to GitHub Packages - Components (Release v2.0.1): Remove optional peer dependency metadata for libraries now included as runtime dependencies.
Security
Section titled “Security”- No updates
Deprecated
Section titled “Deprecated”- Chronicle (Release v15.32.0):
ObserverState.HandledEventTypesCountin favor ofObserverState.HandledEventCountPerEventType(#1557)