Skip to content

Release digest for week of 2026-06-01 to 2026-06-08

  • Chronicle (Release v15.33.5): WithHashiCorpVault and WithAzureKeyVault extension methods on IChronicleAspireBuilder to 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/1 macro in Chronicle.Compliance to explicitly mark the GDPR data-subject field on a read model. Falls back to :id when not declared.
  • Chronicle.TypeScript (Release v0.2.1): IMaterializedReadModels and MaterializedReadModels for retrieving individual or multiple read model instances directly from the Chronicle sink.
  • Chronicle.TypeScript (Release v0.2.1): IReadModels.materialized exposes 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.Projection macro 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): :projections option on Chronicle.Client to register declarative projection modules alongside :read_models; auto-discovered via otp_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 Cratis header (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 .ts under the same folders, with no path distinction. The pass-through preserves filenames (import resolution is unaffected) and keeps --fix working 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 with use are 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 eslint as a peer dependency, and exposes meta.version plus 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 Cratis header (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 .ts under the same folders, with no path distinction. The pass-through preserves filenames (import resolution is unaffected) and keeps --fix working 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 with use are 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 eslint as a peer dependency, and exposes meta.version plus 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 Cratis header (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 .ts under the same folders, with no path distinction. The pass-through preserves filenames (import resolution is unaffected) and keeps --fix working 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 with use are 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 eslint as a peer dependency, and exposes meta.version plus 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 Cratis header (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 .ts under the same folders, with no path distinction. The pass-through preserves filenames (import resolution is unaffected) and keeps --fix working 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 with use are 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 eslint as a peer dependency, and exposes meta.version plus 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 Cratis header (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 .ts under the same folders, with no path distinction. The pass-through preserves filenames (import resolution is unaffected) and keeps --fix working 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 with use are 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 eslint as a peer dependency, and exposes meta.version plus 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/components root 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. Covers import and re-export … from. Configurable package name and allow-list.
  • Components (Release v2.3.0): no-primereact-dialog (rule) — disallows importing Dialog from primereact/dialog. Use CommandDialog from @cratis/components/CommandDialog, or Dialog from @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/components root 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. Covers import and re-export … from. Configurable package name and allow-list.
  • Components (Release v2.2.0): no-primereact-dialog (rule) — disallows importing Dialog from primereact/dialog. Use CommandDialog from @cratis/components/CommandDialog, or Dialog from @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 Cratis header (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 .ts under the same folders, with no path distinction. The pass-through preserves filenames (import resolution is unaffected) and keeps --fix working 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 with use are 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 eslint as a peer dependency, and exposes meta.version plus 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 a consumer preset for projects that build on Cratis (house TypeScript/React hygiene plus the for_* BDD spec relaxations) and an internal preset that adds the Cratis MIT license-header rule for use inside the Cratis product repos. The base and specs building blocks are exported for custom composition.
  • Chronicle (Release v15.33.0): InstanceCountToSkip and InstanceCount concepts for type-safe pagination parameters with implicit conversion operators
  • Chronicle (Release v15.33.0): IMaterializedReadModels interface with optional skip and take parameters on GetInstances<TReadModel>() and ObserveInstances<TReadModel>() methods (defaults: skip=0, take=50)
  • Chronicle (Release v15.33.0): IMaterializedReadModels gRPC service contract with corresponding ObserveInstancesRequest and ObserveInstancesResponse types
  • Chronicle (Release v15.33.0): IReadModels.Materialized property returning IMaterializedReadModels for accessing materialized read model operations
  • Chronicle (Release v15.33.0): IReadModelsCompliance interface for PII decryption operations on read model instances
  • Chronicle (Release v15.33.0): ReadModelsCompliance implementation of IReadModelsCompliance to centralize PII decryption logic
  • Chronicle (Release v15.33.0): IEventCompliance interface for PII decryption operations on event content
  • Chronicle (Release v15.33.0): EventCompliance implementation of IEventCompliance to 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 MaterializedReadModels service 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 GetInstances and ObserveInstances
  • 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, ICanProvideEventStreamId and ICanProvideSubject interfaces 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 UserIdConceptexport 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 UserIdConceptexport 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 UserIdConceptexport 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: standalone FilterPanel, FilterEditor, RangeHistogramFilter, useFilterState hook, and full TypeScript type definitions (FilterDefinition, FilterEditorProps, FilterEditorSlotProps, FilterValues, RangeValues, CustomFilterValues) (#102)
  • Components (Release v2.1.0): FilterEditor slot component — declares a custom editor for a specific filter group as a declarative child of <FilterPanel>; value tracked separately in customValues (#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): ./Filter subpath export in package.json for direct imports via @cratis/components/Filter (#102)
  • Components (Release v2.1.0): Documentation/Filter/index.md — full API reference covering all exported types, FilterPanel props, FilterEditor props, useFilterState hook, and usage examples for every filter type (#102)
  • Components (Release v2.1.0): BDD specs in Source/Filter/for_useFilterState/ covering buildFilterValues and buildRangeValues — 9 tests across 4 spec files (#102)
  • Components (Release v2.1.0): Source/Filter/utils.ts exporting buildFilterValues and buildRangeValues as 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
  • cli (Release v1.6.1): DetailOverlayWindow exposes its per-tab editors (TabEditors) so a tab’s content can be updated after Build — 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 via EnqueueOnUIThread.
  • Arc (Release v20.39.2): All streaming transports (ObservableQueryDemultiplexer, ClientObservable, ClientObservableSSE, ClientEnumerableObservable, ClientEnumerableObservableSSE) now share a single IReadModelInterceptors.InterceptEmission helper 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, and get_snapshots_by_id/3 now apply client-side compliance decryption (via the Chronicle compliance Release endpoint) 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.contracts to 15.33.3.
  • Chronicle (Release v15.33.3): ComplianceMetadataType is now a string instead of a Guid; 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 single IReadModelInterceptors.InterceptEmission helper that intercepts each emission, unwrapping collection emissions to the read model element type.
  • Components (Release v2.3.0): Add the ESLint workspace to the repo workspaces.
  • 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 eslint as a peer dependency, and exposes meta.version plus 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 ESLint workspace to the repo workspaces.
  • 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 eslint as a peer dependency, and exposes meta.version plus 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’s internal preset 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 eslint as a peer dependency. It is the foundation that @cratis/arc.eslint and @cratis/components.eslint compose 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): RangeHistogramFilter no longer renders its own clear button—handled by parent FilterPanel (#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 GetInstances and observable WatchInstances methods from IReadModels to IMaterializedReadModels
  • Chronicle (Release v15.33.0): skip and take parameters are now optional with defaults (skip: 0, take: 50) on IMaterializedReadModels interface 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 ReadModels and MaterializedReadModels services now use injected IReadModelsCompliance for PII decryption
  • Chronicle (Release v15.33.0): Converted ReadModelsCompliance from static helper to injectable service following the IEventCompliance pattern
  • Chronicle (Release v15.33.0): Renamed IEventComplianceHelperIEventCompliance and EventComplianceHelperEventCompliance for consistency with read models compliance naming
  • Arc (Release v20.33.19): Updated Cratis.Chronicle, Cratis.Chronicle.AspNetCore and Cratis.Chronicle.Testing to 15.32.3.
  • Arc (Release v20.33.19): ICanProvideEventSourceId, ICanProvideEventStreamId, ICanProvideSubject and EventStreamIdAttribute now come from Cratis.Chronicle (the Cratis.Chronicle.Events namespace) instead of being duplicated in Arc. Command code that implements these should import them from Cratis.Chronicle.Events.
  • Arc (Release v20.33.18): Updated Cratis.Chronicle, Cratis.Chronicle.AspNetCore and Cratis.Chronicle.Testing to 15.32.3.
  • Arc (Release v20.33.18): ICanProvideEventSourceId, ICanProvideEventStreamId, ICanProvideSubject and EventStreamIdAttribute now come from Cratis.Chronicle (the Cratis.Chronicle.Events namespace) instead of being duplicated in Arc. Command code that implements these should import them from Cratis.Chronicle.Events.
  • Arc (Release v20.33.17): Updated Cratis.Chronicle, Cratis.Chronicle.AspNetCore and Cratis.Chronicle.Testing to 15.32.3.
  • Arc (Release v20.33.17): ICanProvideEventSourceId, ICanProvideEventStreamId, ICanProvideSubject and EventStreamIdAttribute now come from Cratis.Chronicle (the Cratis.Chronicle.Events namespace) instead of being duplicated in Arc. Command code that implements these should import them from Cratis.Chronicle.Events.
  • Chronicle (Release v15.32.3): Moved ICanProvideEventSourceId, ICanProvideEventStreamId and ICanProvideSubject to the Cratis.Chronicle.Events namespace 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_ConceptAs to for_JsonSerializer to 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_ConceptAs to for_JsonSerializer to 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_ConceptAs to for_JsonSerializer to 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): FilterPanel accepts children?: ReactNode — uses React.Children + isValidElement to discover <FilterEditor> slots and render them in the matching filter group (#102)
  • Components (Release v2.1.0): PivotViewer/components/FilterPanel.tsx is now a thin adapter: converts PivotFilter<TItem>[] + computed options into FilterDefinition[], generates <FilterEditor> children from any PivotFilter.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> retains renderEditor? and type: 'custom' so PivotViewer consumers can inject custom filter editors without any workarounds (#102)
  • Components (Release v2.1.0): Source/Filter/useFilterState.ts now imports buildFilterValues and buildRangeValues from ./utils (#102)
  • Components (Release v2.1.0): Documentation/toc.yml updated with Filter entries in both the Storybook section and Common Components section (#102)
  • Components (Release v2.1.0): eslint.config.mjs — added argsIgnorePattern: '^_' to the @typescript-eslint/no-unused-vars rule 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 — the Value column 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, and ObserverStateStorage.ObserveAll in the SQL storage backend no longer throw NotImplementedException at runtime — each is now fully implemented following the same ReplaySubject/NotifyChange pattern 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>) and IAsyncEnumerable<T> model-bound query results no longer crash under read model interception. QueryPipeline.ApplyInterceptors now 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): getSnapshotsById now releases (decrypts) compliance-protected PII fields in read model snapshots when the read model is owned by a reducer, matching the behavior already applied to getInstanceById and getInstances.
  • 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): ComplianceMetadataType now uses a plain string value instead of Guid, matching the kernel concept that was changed to a string representation. The PII sentinel is updated from a UUID to 'PII'.
  • Chronicle.Elixir (Release v0.3.0): Model-bound from declarations 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 AppendMany batch — 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_connected at startup: seeders run once the connection is ready and retry idempotently.
  • Arc (Release v20.39.1): Observable (ISubject<T>) and IAsyncEnumerable<T> model-bound query results no longer crash under read model interception. QueryPipeline.ApplyInterceptors now 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 development and development-slim container 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-time DEVELOPMENT flag 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.FullName usages
  • 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.FullName usages
  • 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 name Nullable
  • 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 name Nullable
  • 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 selector crash by adding cssMinify: false to the viteFinal config in Source/.storybook/main.ts (#102)
  • Components (Release v2.1.0): CI build failure caused by ESLint flagging _props in FilterEditor.tsx as unused — resolved by adding argsIgnorePattern: '^_' 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 AppendMany subject 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-event Subject override, 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 $eventSourceId and 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)
  • 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.config that redirected package restore to GitHub Packages
  • Components (Release v2.0.1): Remove optional peer dependency metadata for libraries now included as runtime dependencies.
  • No updates
  • Chronicle (Release v15.32.0): ObserverState.HandledEventTypesCount in favor of ObserverState.HandledEventCountPerEventType (#1557)