Skip to content

Release digest for week of 2026-07-06 to 2026-07-13

  • AuthProxy (Release v2.5.0): The client-credentials verification endpoint’s 2xx response may now include a tenant JSON property. AuthProxy embeds it in the issued token as a cratis/tenant claim, which the existing Claim tenant-resolution strategy can resolve into the Tenant-ID header on proxied requests.
  • AuthProxy (Release v2.5.0): POST /.cratis/token now also accepts grant_type=refresh_token, exchanging a refresh token for a new access/refresh token pair without recontacting the verification endpoint. Every successful client_credentials grant now returns a refresh_token alongside the access token.
  • Specifications (Release v4.0.0): Seven Roslyn analyzers (CRSPEC0001–CRSPEC0007), bundled with Cratis.Specifications, Cratis.Specifications.XUnit and Cratis.Specifications.NUnit, that warn when:
  • Specifications (Release v4.0.0): a test method inside a specification is not named should_* (CRSPEC0001);
  • Specifications (Release v4.0.0): a file declares more than one specification (CRSPEC0002);
  • Specifications (Release v4.0.0): a [Fact]/[Test] is placed on a given context, where it never runs (CRSPEC0003);
  • Specifications (Release v4.0.0): a should_* method is missing its test attribute, so it never runs (CRSPEC0004);
  • Specifications (Release v4.0.0): a specification calls a base lifecycle method (base.Establish()/Because()/Destroy()) explicitly, running it twice (CRSPEC0005);
  • Specifications (Release v4.0.0): a specification that declares test methods is not public, so the runner skips it (CRSPEC0006);
  • Specifications (Release v4.0.0): the action under test (Because) is declared on a reusable given context (CRSPEC0007).
  • Specifications (Release v4.0.0): Both xUnit ([Fact]/[Theory]) and NUnit ([Test]/[TestCase]) test attributes are recognized.
  • Chronicle (Release v15.41.0): CHR0034 — error when [PII] is applied to a property or record parameter whose type derives from EventSourceId<T>. The event source id is the encryption-key lookup identity, so Chronicle throws PIINotSupportedOnEventSourceId at runtime; the analyzer turns that into a compile-time error.
  • Chronicle (Release v15.41.0): CHR0035 — error when a [ReadModel] declares a property or record parameter named _subject, which Chronicle reserves as an internal MongoDB field for compliance-subject tracking.
  • Chronicle (Release v15.41.0): CHR0036 — warning when a reducer declares mutable instance state or injects a storage primitive such as IMongoCollection<T>. Reducers must be stateless for deterministic replay; this mirrors CHR0031/CHR0032 for reactors. (#958)
  • Chronicle (Release v15.41.0): CHR0037 — warning when the two generations referenced by an EventTypeMigration<TUpgrade, TPrevious> do not share one explicit [EventType] id. Chronicle keys generations by that id, so absent or differing ids mean the migration silently never applies.
  • Arc (Release v20.54.0): New analyzer ARCCHR0007 warns when a [Command] injects IEventLog into its Handle/Provide method. Express appends through the handler return type instead — injecting IEventLog bypasses Arc’s append pipeline and its correlation and ordering guarantees.
  • Arc (Release v20.53.0): New analyzer ARCCHR0006 warns when a reactor handler invokes ICommandPipeline.Execute but is not marked [OnceOnly]. Without it, replay operations (redaction, revision, observer rewind) re-run the handler and re-execute the command, duplicating the side effect — the analyzer catches this at build time and points you to mark the handler [OnceOnly].
  • Chronicle (Release v15.40.0): CHR0024 — model-bound read model property has no mapping source (no mapping attribute and no subscribed event carries a same-named property for AutoMap to bind).
  • Chronicle (Release v15.40.0): CHR0025 — a property set explicitly (e.g. [SetFrom]) may be overwritten by AutoMap from another referenced event that carries an identically named property. Informational (not a warning), because the collision can be intentional; the message presents both resolutions (add [NoAutoMap], or accept the update).
  • Chronicle (Release v15.40.0): CHR0026[Key]/[Subject] placed on a property whose type derives from EventSourceId<T>.
  • Chronicle (Release v15.40.0): CHR0027 — a command both implements ICanProvideEventStreamId and carries a non-null [EventStreamId].
  • Chronicle (Release v15.40.0): CHR0028 — redundant .AutoMap() call (already the default).
  • Chronicle (Release v15.40.0): CHR0029 — redundant .Set(x => x.P).To(e => e.P) with matching names.
  • Chronicle (Release v15.40.0): CHR0030 — reactor invokes ICommandPipeline.Execute without [OnceOnly].
  • Chronicle (Release v15.40.0): CHR0031 — reactor declares mutable instance state.
  • Chronicle (Release v15.40.0): CHR0032 — reactor injects a storage primitive (e.g. IMongoCollection<T>) directly.
  • Chronicle (Release v15.40.0): CHR0033 — model-bound [ChildrenFrom<E>] child collection property has no matching event property and no explicit mapping, so AutoMap fills it from nothing.
  • Chronicle (Release v15.40.0): Code fixes for several of the above (remove [Key]/[Subject], remove a redundant .AutoMap() / .Set().To()).
  • Chronicle (Release v15.40.0): A projection build-time warning when a collection read-model property auto-maps to nothing — the runtime companion to CHR0033, covering both model-bound and fluent projections.
  • Chronicle (Release v15.40.0): Model-bound projection value expressions now fail loud on unsupported accessors (method calls, arithmetic, conditionals, string interpolation, constants, or accessors that ignore the lambda parameter) instead of silently producing an empty or partial property path.
  • Chronicle (Release v15.40.0): ReadModelScenario can opt out of strict event subscription, so a seeded stream may carry events the read model does not subscribe to.
  • Arc (Release v20.52.0): Analyzer (ARC0010) that flags a [Command] Handle() returning Task/Task<T> without awaiting anything — including the Task.FromResult/Task.CompletedTask wrapper shape the compiler’s own CS1998 does not catch — with a code fix that unwraps it to the synchronous return shape the command pipeline already accepts.
  • Arc (Release v20.52.0): Analyzer (ARC0011) that flags a [Roles(...)] string-literal argument, with a code fix that rewrites it to nameof(<EnumType>.<Member>) so a role rename becomes a compile error instead of a silent authorization failure.
  • Arc (Release v20.52.0): Analyzer (ARC0012) that flags built-in exception types (Exception, InvalidOperationException, ArgumentException, and the like) thrown from Arc artifacts — command Handle() methods, CommandValidator<T>/ConceptValidator<T> validators, and reactor handlers — steering domain failures toward domain-named exception types.
  • Arc (Release v20.51.0): Analyzer (ARC0010) that flags a [Command] Handle() returning Task/Task<T> without awaiting anything — including the Task.FromResult/Task.CompletedTask wrapper shape the compiler’s own CS1998 does not catch — with a code fix that unwraps it to the synchronous return shape the command pipeline already accepts.
  • Arc (Release v20.51.0): Analyzer (ARC0011) that flags a [Roles(...)] string-literal argument, with a code fix that rewrites it to nameof(<EnumType>.<Member>) so a role rename becomes a compile error instead of a silent authorization failure.
  • Arc (Release v20.51.0): Analyzer (ARC0012) that flags built-in exception types (Exception, InvalidOperationException, ArgumentException, and the like) thrown from Arc artifacts — command Handle() methods, CommandValidator<T>/ConceptValidator<T> validators, and reactor handlers — steering domain failures toward domain-named exception types.
  • Components (Release v2.5.0): onBeforeExecute on CommandDialog, StepperCommandDialog, and CommandStepper now accepts an async callback returning Promise<T>.
  • Components (Release v2.5.0): @cratis/eslint-plugin-components rule onbeforeexecute-must-return, flagging an onBeforeExecute callback that can complete without returning the command values.
  • Components (Release v2.5.0): @cratis/eslint-plugin-components rule no-hooks-in-view-model, flagging React hooks and Arc proxy .use() calls inside a view model class.
  • Arc (Release v20.50.0): Reactors can return a [Command] (or a collection of commands) from a handler method and Arc executes them automatically through the command pipeline — no need to inject ICommandPipeline for simple follow-up actions.
  • Arc (Release v20.50.0): Returned commands run sequentially within a dedicated service scope and go through full validation, authorization, and Handle().
  • Arc (Release v20.50.0): Execution stops at the first command that fails; the reactor then fails and Chronicle pauses the partition for retry — consistent with the built-in event side-effect handlers.
  • Arc (Release v20.50.0): Returning multiple commands is a convenience, not a transaction: there is no rollback, so events appended by earlier commands remain if a later one fails. For all-or-nothing semantics, model it as a single command.
  • Chronicle (Release v15.39.0): Property-level [NoAutoMap] — apply [NoAutoMap] to a single read model property (or record parameter) instead of the whole read model, to exclude just that property from AutoMap while every other property keeps mapping. Use it when an event you subscribe to for a specific value ([SetFrom]) or a [Join] happens to carry an identically named property that would otherwise overwrite your explicitly sourced value (#3444)
  • cli (Release v2.0.2): cratis update now shows a progress spinner while checking for and installing updates, and displays the target version up front when known
  • cli (Release v2.0.0): The default connection string no longer disables TLS. The CLI connects over TLS by default and automatically trusts the Chronicle server’s self-signed development certificate, so local setups need no manual TLS configuration.
  • cli (Release v2.0.0): Bumped Cratis.Chronicle.Connections, Cratis.Chronicle.Contracts, and Cratis.Chronicle.XUnit.Integration to 16.0.1 (first release with the single-port client APIs), and Testcontainers to 4.13.0 to satisfy its new minimum version requirement.
  • cli (Release v2.0.0): [x] dotnet build (Cli, Cli.Specs, Integration/Chronicle) — 0 warnings, 0 errors in Release
  • cli (Release v2.0.0): [x] dotnet test on Cli.Specs — 142/142 passed
  • cli (Release v2.0.0): [x] dotnet test on Integration/Chronicle against a locally built single-port Chronicle dev image — 161/161 passed (auth/login, connection errors, and every command group)
  • cli (Release v2.0.0): [x] Manually ran cratis get-started with no config to verify the onboarding panel renders correctly with the new connection string
  • Narrator (Release v2.0.0): The extension now requests OAuth tokens from the same host:port as the gRPC connection, matching Chronicle’s consolidated single-port Kernel (gRPC and OAuth/API traffic now share port 35000 via TLS ALPN).
  • Narrator (Release v2.0.0): Local development connections now use TLS by default, since TLS is mandatory on the consolidated port. Explicit disableTls=true in the connection string is still supported for callers who need a plaintext connection.
  • Narrator (Release v2.0.0): The extension now trusts the Kernel’s self-signed development certificate on the gRPC channel (previously only the OAuth HTTP request did), so local chronicle://localhost:35000 connections work out of the box.
  • Chronicle.Kotlin (Release v2.0.0): The client now connects to the Chronicle Kernel over a single port (35000) instead of a separate gRPC port plus a management HTTP port (8080). The OAuth token endpoint is derived from the connection’s own host and port.
  • Chronicle.Kotlin (Release v2.0.0): TLS is now enabled by default for local development — the Kernel’s consolidated port requires TLS to multiplex gRPC and OAuth/API traffic, so the development connection string and ChronicleOptions.development() no longer disable it. The client automatically trusts the Kernel’s auto-generated self-signed development certificate.
  • AuthProxy (Release v2.5.0): Documented the new tenant-propagation and refresh-token behavior in authentication.md, services.md, and tenancy.md.
  • Chronicle.Elixir (Release v2.0.0): The client now derives the OAuth token endpoint from the same host and port as the gRPC connection instead of a hardcoded management port (8080), matching the Chronicle Kernel’s consolidation onto a single port (35000).
  • Chronicle.Elixir (Release v2.0.0): TLS is now required for every connection, including local development. The gRPC channel trusts the Kernel’s auto-generated self-signed development certificate automatically, with no configuration needed.
  • Chronicle.Elixir (Release v2.0.0): The default local-development connection string is now chronicle://localhost:35000 (TLS implicit) instead of appending ?disableTls=true. The disableTls option is still supported for callers connecting through something that terminates TLS for them (e.g. a plaintext-terminating proxy).
  • Chronicle.TypeScript (Release v2.0.0): The client now obtains OAuth tokens from the same consolidated port as the gRPC connection (default 35000), matching the Chronicle Kernel’s single-port consolidation.
  • Chronicle.TypeScript (Release v2.0.0): ChronicleOptions.development() now connects over TLS by default. The Kernel multiplexes gRPC and OAuth/API traffic on its single port via TLS ALPN negotiation, so plaintext connections — including local development — are no longer supported.
  • Chronicle.TypeScript (Release v2.0.0): TLS connections without an explicitly pinned certificate now accept the Kernel’s self-signed development certificate, so local development requires no extra certificate setup.
  • Chronicle (Release v16.0.0): Chronicle Server serves gRPC (HTTP/2) together with the Workbench, REST API, OAuth flows and health checks (HTTP/1.1) on the single port 35000, multiplexed over TLS. The Workbench is now reached at https://localhost:35000. (#3372)
  • Chronicle (Release v16.0.0): The Chronicle port now always uses TLS. In development a self-signed certificate is generated automatically when none is configured, and clients accept it without any setup; a certificate is required in production. (#3372)
  • Specifications (Release v4.0.0): The packages now target net8.0, net9.0 and net10.0, matching Arc and Chronicle.
  • Specifications (Release v4.0.0): Updated nunit to 4.6.1, Microsoft.NET.Test.Sdk to 18.7.0, and Microsoft.SourceLink.GitHub to 10.0.300.
  • Arc (Release v20.52.0): useDialog infers the dialog component’s input type directly, so a component typed as (props: TInput) => JSX.Element (reading closeDialog from useDialogContext) is accepted without an as unknown as ComponentType<TInput> cast, and a component whose input type does not match is now a compile error.
  • Components (Release v2.5.0): IconDisplay now repairs a lone PrimeIcons class missing its base class (pi-homepi pi-home) so it renders, and warns in development when given a bare icon name (e.g. plus) that is not a CSS class.
  • Chronicle (Release v15.39.0): AutoMap no longer copies the other properties of an event a read model subscribes to only to aggregate ([Count]/[Increment]/[Decrement]/[Add]/[Subtract]). Previously, aggregating an event also name-mapped its unrelated properties onto the read model, which could silently overwrite explicitly sourced values; aggregating an event now contributes only the aggregate (#3444)
  • Chronicle (Release v16.0.2): Cross-store outbox subscriptions now deliver to every subscribing event store. Previously, when multiple event stores subscribed to the same source store’s outbox, only the first to subscribe received events.
  • cli (Release v2.0.2): cratis update now verifies the actually installed version with the package manager after running, instead of trusting a pre-update NuGet availability check that could be stale or time out — fixing cases where it reported “already at the latest version” right after installing a newer one (#34)
  • cli (Release v2.0.2): The “update available” hint shown after commands now reliably appears instead of only surfacing when the background check happened to finish before the command did
  • cli (Release v2.0.1): Fixed a build failure in the Publish workflow caused by Meziantou.Analyzer’s MA0206 rule flagging empty { } bodies on CLI branch marker classes; these now use the semicolon-bodied type declaration form.
  • Chronicle (Release v16.0.1): Fixed a read model’s [PII] property intermittently failing to decrypt (rsa routines::padding check failed, or rendering as ciphertext) when the same subject also carried PII in a sibling read model. Subject encryption keys are now provisioned atomically and exactly once, even under concurrent appends, multiple silos, or a replica that has not yet caught up.
  • Specifications (Release v4.0.0): The build workflow now installs the .NET 8/9/10 SDKs (it previously pinned an SDK that could not satisfy the repository’s .NET 10 requirement) and runs the analyzer specs in CI.
  • Chronicle (Release v15.41.0): ReadModelScenario<T> now backfills the joined value for a root-level [Join] whose join-source event is keyed by a string concept, matching the parity a Guid-keyed join already had.
  • Arc (Release v20.53.1): Reactor command side-effect failures now build against latest Chronicle, which added a required TargetEventSourceIds parameter to AppendFailure
  • Arc (Release v20.53.0): Update dependencies
  • Chronicle (Release v15.40.0): Model-bound join On property names are normalized to serialized naming, so a model-bound [Join] resolves consistently.
  • Chronicle (Release v15.40.0): A [Join] whose source event is keyed by a string concept (e.g. an organization number) no longer force-converts the key to a Guid-keyed read model’s identifier and crash the projection — the read model materializes and stays spec-able (the joined value is enriched by the real engine).
  • Chronicle (Release v15.40.0): Reactor side-effect append failures now report the target event source ids that failed to append.
  • Chronicle (Release v15.40.0): [SetFromContext<E>] on a child parameter now honors its generic event type.
  • Components (Release v2.5.0): onBeforeExecute no longer executes the command with undefined values when a callback returns nothing — the current values are kept and a warning is logged.
  • Chronicle (Release v15.39.1): ReadModelScenario<T> no longer throws MissingKeyResolverForEventType when a projection’s event source is seeded with an event the projection does not subscribe to; such events are ignored, matching the production projection engine’s subscribed-type filtering.
  • Chronicle (Release v15.39.0): ReadModelScenario<T> no longer throws (The number of generic arguments provided doesn't equal the arity of the generic type definition) on the first access to Instance/Instances when the read model under test is projected by a standalone IProjectionFor<T> class
  • cli (Release v2.0.0): --management-port flag, CHRONICLE_MANAGEMENT_PORT environment variable, and the management-port context key. The OAuth token endpoint is now derived from the connection string’s server address instead of a separately configured port.
  • Narrator (Release v2.0.0): The managementPort context option and its “Management port” prompts in the Add/Edit Context flows — Chronicle no longer exposes a separate management HTTP port.
  • Chronicle.Kotlin (Release v2.0.0): ChronicleConnectionString.managementPort (and its 8080 default) — no longer needed now that OAuth is served on the same port as gRPC.
  • Chronicle.Elixir (Release v2.0.0): Removed the -p 8080:8080 port mapping from the root README’s docker run command and the console sample’s docker-compose.yml — the management port no longer exists on the Kernel.
  • Chronicle.TypeScript (Release v2.0.0): The managementPort connection option has been removed — the Chronicle Kernel no longer exposes a separate management port for authentication.
  • Chronicle (Release v16.0.0): The managementPort server configuration option and the client ManagementPort option — all traffic uses the single port. (#3372)
  • Chronicle (Release v16.0.0): The separate Workbench TLS configuration (workbench.tls); the single port uses the top-level tls certificate. (#3372)
  • Chronicle (Release v16.0.0): The Aspire ChronicleResource management endpoint (DefaultManagementPort and the management endpoint); a single grpc endpoint now serves everything. (#3372)
  • Specifications (Release v4.0.0): Dropped the net48 target framework. Consumers on .NET Framework should remain on the previous release.
  • No updates
  • No updates