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 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): 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): 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): 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.
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 IEventComplianceHelper → IEventCompliance and EventComplianceHelper → EventCompliance 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)