Skip to content

Release digest: September 14 - 21, 2026 (Week 38)

RepositoryPrevious versionCurrent version
AIv2.0.10v2.28.1
Arcv22.14.0v22.16.1
Arc.Kotlinv5.0.0v7.5.2
Chroniclev18.2.0v19.1.5
Chronicle.Elixirv3.0.0v3.4.0
Chronicle.Kotlinv5.0.0v6.3.2
Chronicle.TypeScriptv5.0.0v6.2.0
cliv3.1.6v3.8.2
Componentsv4.4.0v4.9.0
Eventmodelers-Build-Kit-JavaFirst releasev1.0.0
Eventmodelers-Build-Kit-KotlinFirst releasev1.0.0
Fundamentalsv7.19.2v7.19.3
OrleansFirst releasev1.4.0
Scenev3.3.1v3.5.0
Screenplayv4.12.1v4.14.0
Stagev3.15.1v3.20.0
Templatesv1.2.1v1.7.0
  • Orleans (Release v1.4.0): Tenant call filters that carry the hosting application’s tenant context across every grain call automatically. Implement the new ITenancy seam - mapping a job’s durable scope and namespace coordinates to your tenant, naming the definite tenant of a calling flow, and establishing tenant context - and register it with silo.AddTenancy<TTenancy>(). The incoming filter re-establishes the tenant from the job family’s own grain key first, so a job resumed after a restart still runs for the tenant it was started for; every other grain learns the caller’s tenant from the entry the outgoing filter records on the call. Only a definite tenant is ever recorded - a deployment-wide fallback is never written onto a call. (#14)
  • Components (Release v4.9.0): ToggleGroup under @cratis/components/Common: a single-selection group of exclusive choices — a segmented control. It carries radiogroup/radio semantics rather than tablist/tab, because the choice is a value and not a panel. Arrow keys move focus and Space or Enter commits, so arrowing past an option never triggers the work behind it. Options take a label, an optional decorative icon and a disabled state; aria-labelledby, aria-describedby and invalid associate the group with a form field’s label and error. Parts: root, option, icon, label (#287)
  • Components (Release v4.9.0): Tabs under @cratis/components/Common: a tab set where arrow keys and Home/End move the selection, the list holds a single tab stop, and every tab is wired to its panel through aria-controls. Tabs take a label, optional content and a disabled state. Parts: root, list, tab, panel (#287)
  • Components (Release v4.9.0): TagGroup under @cratis/components/Common: a group of removable values with an optional text entry. Enter and each configured separator commit the typed value, Backspace on an empty entry removes the last value, and pasting a separated list adds every value in it. Tags themselves are reachable with the arrow keys and removable with Backspace or Delete. Duplicates are refused unless allowDuplicates is set, editable={false} leaves a read-only set of removable tags, and removeLabel supplies a localized name for each remove action. Parts: root, list, tag, remove, input (#287)
  • Components (Release v4.9.0): Breadcrumbs under @cratis/components/Common: an ordered trail inside a navigation landmark whose last segment is the current page — it carries aria-current="page", has no destination and is out of the tab order. Segments take an href or an onNavigate for a router that owns navigation, and the separator is a slot. Parts: root, item, link, separator (#287)
  • Components (Release v4.9.0): Documentation for all four, including a table for choosing between ToggleGroup and Tabs, and their parts in the pass-through cheat sheet (#287)
  • Orleans (Release v1.3.0): JobStep<TRequest, TResult, TState> exposes two protected virtual seams, GetReferenceToSelf() and GetJob(GrainId), so derived steps can be specified under a test host without grain-reference plumbing.
  • Orleans (Release v1.2.0): CratisJsonSerializer - a dedicated Orleans codec and copier that owns serialization of Cratis types crossing grain boundaries, with self-contained serializer options no host configuration can affect. CratisJsonSerializer.CreateSerializerOptions() exposes the options used, should a host need to match them.
  • Stage (Release v3.19.0): Generating an application composes a default screen from its own model: a command form per command, bound by the command name. An application whose Screenplay declares screens still gets exactly what it declared. (#100)
  • Stage (Release v3.18.0): A generated application can carry a composed Scene, and gains the module that registers its generated Arc proxies under the names Scene resolves bindings by, so a screen can reach a command or a query. (#100)
  • Arc.Kotlin (Release v7.5.0): io.cratis:cratis — a new meta package for event-sourced Cratis applications: a pure aggregator bundling Arc, its Spring Boot wiring, and the Chronicle integration into one dependency, so a consumer no longer has to assemble the three by hand. arc-chronicle-spring-boot-starter keeps its own coordinates for a consumer that wants Arc’s Chronicle wiring specifically; both stay at the same version.
  • AI (Release v2.28.0): The cratis-chronicle-client-kotlin, cratis-chronicle-client-elixir, and cratis-chronicle-client-typescript skills now cover variants — mutually exclusive read models for one logical entity — matching the coverage already added to the .NET cratis-chronicle-projection skill, so each is naturally selected when an entity’s shape genuinely changes across its lifecycle:
  • AI (Release v2.28.0): Kotlin/Java: @VariantOf/@EntersOn/@GlobalFor and the declarative variantOf()/entersOn() builder members (io.cratis:chronicle 6.3.0+).
  • AI (Release v2.28.0): Elixir: variant_of/2/enters_on/1,2 (shared by Chronicle.ReadModels.ReadModel and Chronicle.Projections.Projection) and Chronicle.Projections.GlobalHandler (cratis_chronicle 3.4.0+).
  • AI (Release v2.28.0): TypeScript: @variantOf/@entersOn/@globalFor and the declarative builder’s variantOf()/entersOn() (@cratis/chronicle 6.2.0+).
  • Chronicle.Elixir (Release v3.4.0): variant_of/2 declares a read model or projection to be one of several mutually exclusive
  • Chronicle.Elixir (Release v3.4.0): enters_on/1,2 names the event(s) that may create or resurrect a variant. Every other event a
  • Chronicle.TypeScript (Release v6.2.0): @variantOf(identity, key) declares a read model to be one of several mutually exclusive
  • Chronicle.TypeScript (Release v6.2.0): @entersOn(eventType, key?) names the event(s) that may create/resurrect a variant. Every other
  • Chronicle.TypeScript (Release v6.2.0): @globalFor(identity) shares a mapping across every variant of a group without repeating it on
  • Chronicle.TypeScript (Release v6.2.0): The fluent builder gets the equivalent shape: builder.variantOf(identity, m => m.key).entersOn(EventType),
  • Chronicle.TypeScript (Release v6.2.0): There is no declarative equivalent of @globalFor, matching the .NET and Kotlin clients — a
  • AI (Release v2.27.0): The cratis-chronicle-projection skill now covers Chronicle 19.1.0’s variants — mutually exclusive read models for one logical entity, for both the model-bound ([VariantOf<T>], [EntersOn<T>], [GlobalFor<T>]) and fluent (.VariantOf<T>(), .EntersOn<T>()) approaches, so it is naturally selected when an entity’s shape genuinely changes across its lifecycle (e.g. a work item that is a backlog entry, then a pull request, then closed).
  • Chronicle.Kotlin (Release v6.3.0): @VariantOf(identity, key) declares a read model to be one of several mutually exclusive
  • Chronicle.Kotlin (Release v6.3.0): @EntersOn(eventType) names the event(s) that may create/resurrect a variant. Every other event
  • Chronicle.Kotlin (Release v6.3.0): @GlobalFor(identity) shares a mapping across every variant of a group without repeating it on
  • Chronicle.Kotlin (Release v6.3.0): The fluent builder gets the same shape: builder.variantOf(identity, key).entersOn(EventType::class),
  • Chronicle.Kotlin (Release v6.3.0): Both annotations and the fluent builder are directly usable from Java.
  • Arc.Kotlin (Release v7.4.0): ObservableState<T>, a Flow.Publisher<T> that holds a current value, so an observable query written in Java can answer a snapshot GET the way a Kotlin query returning a StateFlow does.
  • Arc.Kotlin (Release v7.4.0): cratis.arc.observable-queries.allowed-origins for naming the browser origins allowed to open an observable-query WebSocket. Empty keeps the same-origin default.
  • Arc.Kotlin (Release v7.4.0): A React frontend shared by both plain Arc samples, consuming only generated proxies, with pages for live queries, change streams, conditional queries, observable collections, authentication queries and cross-cutting authorization.
  • Arc.Kotlin (Release v7.4.0): Samples/run.sh, which starts a backend, regenerates its proxies, and opens the frontend against them; --language, --database, --chronicle, --port and --sign-in-required select what runs.
  • Arc.Kotlin (Release v7.4.0): A selectable task-board store in both samples: in memory, Spring Data MongoDB, or Spring Data JPA, with no change to any command, query or read model.
  • Arc.Kotlin (Release v7.4.0): Guides for using the generated client from React and for applying cross-cutting rules with pipeline filters.
  • Screenplay (Release v4.14.0): variant <Name> and enters on <EventType> grammar in the Projection Declaration Language (#185)
  • Screenplay (Release v4.14.0): Five new diagnostics (PLAY0277-PLAY0281) for invalid/missing/nested/duplicate variant declarations
  • Screenplay (Release v4.14.0): Monaco language support for variant/enters on — syntax highlighting, completions, hover
  • Chronicle (Release v19.1.0): [VariantOf<TIdentity>] and [EntersOn<TEvent>] attributes to declare a model-bound
  • Chronicle (Release v19.1.0): A fluent equivalent — builder.VariantOf<TIdentity>(_ => _.Id).EntersOn<TEvent>() — on
  • AI (Release v2.26.0): A human-confirmation checkpoint before merging any pull request labeled major: the branch, commits, push, and PR proceed under the usual ship-changes authority, but merging stops for an explicit human answer naming the breaking change(s), affected consumers, and resulting version number. Every other release-intent label (patch, minor, no-release) is unaffected.
  • Templates (Release v1.6.0): A self-contained run.sh in the Kotlin and Java templates: starts the Chronicle kernel with docker compose, builds (which generates the frontend proxies), runs the backend, and optionally the frontend dev server — stopping everything again on exit. The natural one-command way to run what was scaffolded.
  • Templates (Release v1.6.0): A SkipAiUpdateInstructions parameter in every template, gating a new dedicated AI-update-hint post action: the Cratis CLI — which runs cratis ai update automatically after scaffolding — passes it so users who already got the real thing are not told to run it again.
  • AI (Release v2.25.0): Kotlin and Java application-development profiles for Arc — cratis/language/java, cratis/arc/java, cratis/chronicle/java, cratis/application/java, and cratis/full/java, mirroring each existing Kotlin profile.
  • AI (Release v2.25.0): kotlin.md and java.md language convention rules, matching the structure of csharp.md/typescript.md.
  • AI (Release v2.25.0): Three new skills bringing Arc.Kotlin’s command/query/validation model to parity with the existing C# Arc skills: cratis-arc-command-kotlin, cratis-arc-query-kotlin, and cratis-arc-validation-kotlin, verified against Arc.Kotlin v7.3.0.
  • cli (Release v3.7.0): --dry-run on cratis ai install, cratis ai update and cratis ai uninstall. It reports the changes that would be made and writes nothing, so a run can be reviewed before it happens — which matters because the corpus is unpinned and an update takes whatever the source currently holds. The output is the same actions and conflicts a real run produces, plus dryRun, so --output json keeps working for scripting.
  • Orleans (Release v1.1.0): Spec coverage for everything beyond the jobs, ported from Chronicle where it existed: KeyHelper (combining, parsing, concepts as parameters, memoization), ConceptSerializer (Orleans round-trips of guid/string concepts and null concepts), OneOfSerializer (both sides and None), LinqCollectionCopier (LINQ iterator support, deep copying), DatabaseNames (naming, the 63-byte limit, illegal characters), InMemoryJobsStorage (scope and namespace resolution), JobsOptions and CratisOrleansOptions defaults. Two new spec projects — Cratis.Orleans.Storage.Specs and Cratis.Orleans.Storage.MongoDB.Specs — wired into the solution. 114 specs across four suites, all green.
  • Orleans (Release v1.1.0): Documentation pages: Workers — the background-task pattern job steps run through, usable directly; Serializers and grain keys — the codec set AddCratisOrleans registers, the JSON fallback and JobStateConverter, and KeyHelper’s typed compound keys.
  • Chronicle (Release v19.0.0): skipCompatibilityCheck connection-string option, alongside the existing skipTlsValidation, for a deliberate, visible, audit-friendly override of the server compatibility check against a known-safe version skew (#4058)
  • Chronicle (Release v19.0.0): ChronicleOptions.SkipCompatibilityCheck, resolved together with the connection string’s option — either input asking to skip is enough, since both default to performing the check
  • cli (Release v3.6.0): The creation wizard behind bare cratis new: which template (defaulting to the cratis concept), then which language, then which database — each question offering only what the chosen template supports, and single-choice questions skipped because their choice is already made; non-interactive terminals get guidance instead of a hang (#150)
  • cli (Release v3.6.0): cratis new list — an explicit listing of the concept templates with their supported languages and databases, replacing the old bare-invocation listing; language derivatives (the C#, Kotlin, and Java cratis) collapse into a single entry, driven by the packages’ own metadata: a shared groupIdentity groups the derivatives, tags.language selects the member, and the Database parameter’s choices declare the databases (#150)
  • cli (Release v3.6.0): Concept resolution for explicit invocation too: cratis new cratis --language kotlin resolves the Kotlin derivative inside the concept through the language map rather than by template name (#150)
  • AI (Release v2.24.0): Event modeling with Screenplay: domain discovery, the nine-step workflow per behavior, the four slice types, and the model-validation gate.
  • AI (Release v2.24.0): Six Screenplay language skills, one per surface — the command and write surface, the Projection Declaration Language, read models and queries and screens, UI composition, the Change Data Capture Language with reactions and triggers, and given/when/then specifications.
  • Chronicle (Release v18.5.0): EventSourceType on ForEventSourceIdAndEventTypesRequest, additive and wire-compatible with every released 18.x baseline (#4049)
  • Templates (Release v1.5.0): A shared groupIdentity (Cratis.Templates.Cratis) across the C#, Kotlin, and Java application templates, so tooling collapses them into one language-selectable concept while standalone templates remain their own concepts via their identity
  • Templates (Release v1.4.0): cratis-kotlin and cratis-java application templates, published as their own Cratis.Templates.Kotlin and Cratis.Templates.Java packages alongside Cratis.Templates
  • Templates (Release v1.4.0): Multi-database support in every template: a Database choice parameter (MongoDB, PostgreSQL, MsSql, SQLite; default MongoDB) selecting the storage packages, connection settings, compose topology, and — on the JVM side — the read-model sink type
  • Templates (Release v1.4.0): The getting-started guide now documents that the templates work unchanged through both dotnet new and the Cratis CLI’s own cratis new command, with no .NET SDK required on the machine
  • Templates (Release v1.4.0): CI validation now scaffolds the C# templates with a non-default database and the JVM templates against SQLite/PostgreSQL
  • cli (Release v3.4.0): Cratis.Templating — a template engine implementing the full current template.json contract: all 24 published top-level properties plus globalCustomOperations/specialCustomOperations, all five symbol types, all 12 generators, the full value-form set, the four condition evaluators (C++, C++2, MSBuild, VB), conditional processing for every documented file family (including MSBuild Condition attributes), custom operations, constraints, baselines, localization overlays, and GUID replacement — with unknown constructs failing loudly by name rather than being ignored (#150)
  • cli (Release v3.4.0): cratis new — lists the catalogued templates and instantiates them with dotnet-new compatible -n/-o semantics, dynamic parameter binding with choice validation, --parameters help, --dry-run, --force, interactive prompts with non-interactive equivalents, the explicit --allow-scripts yes|no|prompt contract for script post actions, and JSON output via --format (#150)
  • cli (Release v3.4.0): Template package acquisition through the CLI’s own NuGet v3 client — service index/flat container, NuGet.Config discovery with credentials, local folder feeds, an offline-capable disk cache under ~/.cratis/templates isolated from the dotnet template store (#150)
  • cli (Release v3.4.0): All eight documented post actions implemented natively — package/project references added by editing project XML with versions resolved through the same NuGet configuration, .sln/.slnx written directly, file permissions, JSON properties, manual instructions, script execution under the explicit policy, and restore (the one toolchain-dependent action) reported with instructions when dotnet is absent (#150)
  • cli (Release v3.4.0): Unit specs for the engine (expressions, conditionals, symbols, value forms, parsing, instantiation, post actions, globs, NuGet configuration and client, the package store, token replacement, file family detection, constraints, localization, baselines, placeholder filenames and GUID replacement), CLI specs for parameter binding, the catalogue and settings validation, and a conformance suite rendering vendored templates through the real engine (#150)
  • cli (Release v3.4.0): The upstream Microsoft.TemplateEngine.TestTemplates corpus (MIT, 56 groups, 100 manifests) vendored at a pinned upstream commit with provenance recorded, and a phase-one conformance gate that parses every manifest: 98 parse cleanly, the two intentionally-invalid templates fail with named errors, and none fail silently (#150)
  • cli (Release v3.4.0): cratis new --language — **required when instan
  • Chronicle.Kotlin (Release v6.0.0): A migration guide for append routing, covering how to keep a legacy route
  • Chronicle.Kotlin (Release v6.0.0): An opt-in live suite exercising append routing and read-back against a real
  • Chronicle.Elixir (Release v3.2.0): An opt-in live suite that exercises append metadata against a real kernel rather than a fake channel: default routing resolved by the kernel, explicit metadata round-tripped through storage, and a stale concurrency scope rejected without persisting any attempted event. It runs only when CHRONICLE_INTEROP_CONNECTION carries credentials.
  • Chronicle (Release v18.4.1): --withdrawn excludes a named release from the wire compatibility gate, which a floor cannot do for the newest release of a major. It refuses a version that is not a released baseline, refuses one from another major, and says out loud when a run was narrowed.
  • Stage (Release v3.17.0): A generated application now includes a frontend: an Arc-mounted React entry point with its bundler and TypeScript configuration, a package manifest pinned to exact versions, and a host that serves the bundle and routes deep links back to it. (#100)
  • Stage (Release v3.17.0): The scaffold profile carries the exact npm package versions a generated frontend is pinned to, kept separate from both the emitted backend packages and the versions Stage itself builds with. (#100)
  • Components (Release v4.8.0): Customize ErrorBoundary recovery with fallback, report diagnostics through onError, and clear host-owned failure state with onReset. (#250)
  • Chronicle (Release v18.4.0): Opt-in append receipts containing persisted routing, sequence numbers, occurrence times, subjects, tags, hashes, and audit metadata. Batch receipts follow input order; rejected appends have no persisted receipts.
  • Chronicle (Release v18.4.0): .NET append results and notifications expose the server-acknowledged event context. Malformed acknowledgments are reported explicitly without implying that retrying the append is safe.
  • cli (Release v3.3.0): Select the generated project name and root namespace independently from the application identity with cratis render --project-name and --root-namespace.
  • cli (Release v3.3.0): Import canonical Screenplay workspace files with cratis render --workspace, preserving their source, application and document identities, and authoritative catalog.
  • cli (Release v3.3.0): Receive exact changed-file and manifest hashes in JSON render publication receipts, together with recovery state.
  • Scene (Release v3.5.0): Display a scalar field from an optional single-model query with Cratis.Components:singleResult, using an explicitly registered Arc query and host-supplied arguments. (#39)
  • Scene (Release v3.5.0): Show idle, loading, not-found and failure states without converting single results into collections or choosing another query.
  • Scene (Release v3.5.0): Cancel obsolete requests and prevent late responses from replacing results for changed inputs or query configuration.
  • Stage (Release v3.16.0): Accept a selected Screenplay file or a folder at runtime and specification entrypoints; use the same compiled input for the event model and Scene. (#81)
  • Stage (Release v3.16.0): Render supported root string-literal projection keys with matching string lookup arguments.
  • Arc.Kotlin (Release v7.2.0): Authenticate trusted platform identity headers through an optional, default-off Spring Security bridge (#191)
  • Arc.Kotlin (Release v7.2.0): Configure explicit ingress trust while preserving application security chains, CSRF protection, and existing authentication (#191)
  • Scene (Release v3.4.0): Pass explicit object-valued queryArguments from Scene dataTable and table components to their registered Arc queries.
  • Scene (Release v3.4.0): Display malformed query arguments as an error instead of executing a table query without the intended arguments.
  • Screenplay (Release v4.13.0): Transfer complete Screenplay workspaces between hosts with a canonical versioned format preserving exact source bytes, document identities and keys, the authoritative identity catalog, and workspace revision. (#173)
  • Screenplay (Release v4.13.0): Reject malformed, noncanonical, or revision-inconsistent workspace envelopes instead of silently replacing identities. Invalid-but-editable source remains editable and retains its compilation diagnostics.
  • Arc.Kotlin (Release v7.1.0): Call command and query pipelines from imperative Java services through explicit-context blocking facades and Spring beans (#193)
  • Arc.Kotlin (Release v7.1.0): Reject blocking-facade reentry and use inside Arc’s bounded coroutine scope (#193)
  • Arc.Kotlin (Release v7.0.0): Generate identity-details client types from Kotlin and Java provider declarations and typed factories (#189)
  • Arc.Kotlin (Release v6.0.0): Export standalone DTOs and map generated types to external TypeScript packages (#174)
  • Arc.Kotlin (Release v6.0.0): Validate reusable models and configure explicit concept-rule exclusions from Kotlin and Java (#174)
  • Arc.Kotlin (Release v6.0.0): Discover declared command-response handlers through dependency metadata (#174)
  • Components (Release v4.7.0): Open Dialog as an accessible side sheet with placement="start" or placement="end", including RTL-aware placement and reduced-motion support. (#280)
  • Components (Release v4.7.0): Add optional dialog subtitles and customizable close icons without replacing focus management, keyboard dismissal, or busy-state behavior. (#280)
  • AI (Release v2.23.0): Cratis Components 4 documentation: subpath imports, the tokens / styles / theme entries, --cratis-* tokens, typed pt parts and data-cratis-part selectors, the nine-slot presentation adapters, ComboBox, and rewritten styling and accessibility skills.
  • AI (Release v2.23.0): Generated OpenCode agent adapters (harnesses/opencode/agents) with mode: subagent and a permission map derived from each agent’s tools; Source/Harness.Setup --check verifies they are current.
  • AI (Release v2.23.0): The seven ways an in-process scenario spec passes while proving nothing — discarded assertion Tasks, an unseeded read model rejected as DependencyUnavailable, .Validate() authorizing first, constraint preconditions that must go through EventScenario.Given, GetInstances<T> not being harness-backed, one-child [ChildrenFrom] specs, self-derived expectations — with the matching analyzer ids.
  • AI (Release v2.23.0): Returning a [Command] from a reactor, [ExecuteCommandsAsSystem], and the no-principal rule; ARCCHR0006 / ARCCHR0008 / CHR0042 guidance; never persisting clock-relative state; command success versus projection convergence; unattended reactor passes; erasure beyond the event log; reading framework source at the consumer’s tag.
  • AI (Release v2.23.0): rules/ai-distribution.md and rules/new-repository-intake.md, split out of general.md.
  • AI (Release v2.23.0): Write-guard behavior specs with planted under- and over-blocking defects, and a quality-gates.project.json so this repository’s own checks run under the Stop hook.
  • AI (Release v2.23.0): A “when to run this review without being asked” trigger in the security-review skill.
  • Orleans (Release v0.2.0): Integration/ folder with an end-to-end spec: a co-hosted silo started through the public AddCratisOrleans surface, MongoDB jobs storage, real job and step grains, asserting a three-step job completes with its state persisted. Requires a MongoDB on localhost:27017.
  • Orleans (Release v0.2.0): In-memory jobs storage in Cratis.Orleans.Storage (AddCratisOrleansInMemoryJobsStorage) for spec hosts and services that do not need jobs to survive a restart.
  • Orleans (Release v0.2.0): AddCratisOrleans is now self-contained: it registers the Cratis Orleans serializers — concepts, OneOf, expando objects, LINQ collection copiers and the JSON fallback carrying the job state converter — plus the job system’s own collaborators (type discovery, job type registry, step throttle, options). One package, one call.
  • Orleans (Release v0.2.0): A fifty-step scale spec in the Orleans TestKit suite.
  • Orleans (Release v0.2.0): Documentation/ folder: getting started tutorial, the job system and storage scope concepts, silo hosting and storage configuration how-tos, and the options reference.
  • AI (Release v2.21.3): Added ‘Automatically Includes’ column to profile tables showing which child profiles are automatically included when selecting a parent profile (#147)
  • AI (Release v2.21.3): Added ‘Agent Harnesses Exclusion’ section explaining that the skills folder should not be included in Agent Harnesses (#147)
  • AI (Release v2.21.3): Updated marketplace.json to exclude the skills folder (empty array) (#147)
  • AI (Release v2.21.3): Created decision records for issues #147 and #148 (#147, #148)
  • AI (Release v2.21.3): Disabled Claude subagent spawning in the Claude harness Dockerfile to ensure deterministic, single-agent execution (#359)
  • Arc (Release v22.16.0): fieldName on BaseCommandFormFieldProps, so a field can declare the command property it binds to instead of relying on inference from the accessor.
  • Components (Release v4.6.0): ComboBox under @cratis/components/Common: the input owns the combobox role with aria-expanded/aria-controls/aria-activedescendant; options render in a listbox popover; ArrowUp/Down move, Enter selects, Escape closes, typing filters (contains, startsWith, or none for consumer-side search via onInputChange); openOnFocus; loading/loadingMessage as a busy status region, failure as an alert replacing the options, emptyMessage; an action footer row after the options that receives the typed text; options with label, optional description (inline or stacked) and disabled; description/errorMessage associated through aria-describedby/aria-errormessage (#279)
  • Components (Release v4.6.0): Fourteen stable ComboBox parts with canonical states in the generated manifest; no new tokens (#279)
  • Components (Release v4.6.0): group is a stable part on NumberInput and NumberInputField (data-cratis-part="group", states disabled / invalid / readonly), so a product that owns the box on root removes the built-in one through pt.group (#277)
  • Components (Release v4.6.0): showSteppers (default true) on NumberInput removes the decrement/increment buttons entirely; keyboard stepping still commits with the Step reason; the field forwards it (#277)
  • Components (Release v4.6.0): Documentation for both, seven stories (one ComboBox keyboard play, one product-owned NumberInput box), and specs — the ComboBox ones drive the real React Aria popover in jsdom (#277, #279)
  • Components (Release v4.5.1): The publishing job asks the registry for every public workspace at the released version, retries briefly for propagation, and fails with the missing package names when they are absent
  • Arc (Release v22.15.0): detailsType on <Arc>, forwarded to the identity provider, so identity details are deserialized into their declared type instead of staying raw JSON (#2583)
  • Arc (Release v22.15.0): IEnumerable<TEnum> is supported as a model-bound query argument (#2571)
  • Arc (Release v22.15.0): Documentation for the skip-generated-proxies processor in @cratis/eslint-plugin-arc, which excludes generated proxies from linting without a hand-maintained path allow-list (#2613)
  • Arc (Release v22.15.0): Reference pages for ARCCHR0004 and ARCCHR0006 (#2633, #2632)
  • Components (Release v4.5.0): onCommit reporting blur, enter, paste and step after the matching change (#175)
  • Components (Release v4.5.0): required with native form semantics, with normalization withheld from submission until the controlled owner accepts it (#175)
  • Components (Release v4.5.0): Step buttons, description and error parts, and ReactNode adornments that stay outside the parsed and submitted value (#175)
  • Components (Release v4.5.0): A --cratis-number-input-* token contract in its own stylesheet (#175)
  • Components (Release v4.5.0): Specification coverage for useGrouping, which had none: a year must render 2026 and not 2 026 (#271)
  • Arc (Release v22.14.2): Documentation for the mode — what it emits, when to use it, when not to, and that it removes the decorators and their import but not an import of a type Fundamentals genuinely provides, such as TimeOnly. Wired into the configuration index and table of contents.
  • Chronicle (Release v18.3.0): .FromAll() fluent projections can now Count, Increment, and Decrement into a dictionary-typed read model property, with the key resolved per event from an EventContext value (e.g. one counter per event type) (#2464)
  • Chronicle (Release v18.3.0): The Projection Declaration Language’s all block supports the same dynamic dictionary-key syntax on count/increment/decrement (#2464)
  • Chronicle (Release v18.3.0): The Workbench’s per-language client-code preview (C#, Kotlin, TypeScript, Elixir) now renders the all/every block and .FromAll()/[FromAll] mappings, including the C# dynamic dictionary-key shape
  • Chronicle (Release v18.3.0): Read models can now recover automatically when a projection or reducer definition changes shape (new event types added, filters changed) instead of requiring a manual rebuild, governed by a new evolution policy (automatic / partial-only / manual)
  • Chronicle.Elixir (Release v3.1.0): from_every macro projections can now increment/decrement into a dictionary-typed read model field, with the key resolved per event from an event-context value
  • Chronicle.Kotlin (Release v5.1.0): .fromAll { } (and [FromAll]-equivalent) projections can now count/increment/decrement into a dictionary-typed read model property, with the key resolved per event from an EventContext value
  • Chronicle.TypeScript (Release v5.1.0): fromEvery(...) declarative projections can now count/increment/decrement into a dictionary-typed read model property, with the key resolved per event from an EventContext value
  • Arc (Release v22.14.1): Chronicle 18.2.0: Integration specifications cover empty event-sequence, job, failed-partition, webhook, and event-store-subscription results.
  • Components (Release v4.9.0): The published stylesheet grows by one shared sheet for all four controls, measured at 208 014 raw and 32 571 gzip bytes against ceilings of 205 KiB and 32 KiB. Raw has room; gzip now has 197 bytes of headroom, so the next stylesheet to join the aggregate has to come with a reduction. Flagged for your judgement.
  • Stage (Release v3.20.0): A generated application targets the current package set instead of one roughly thirteen minor versions behind on Arc and three majors behind on the Chronicle kernel image. The kernel image tracks the Chronicle client the metapackage brings, not the newest tag. (#100)
  • Stage (Release v3.19.0): An application that declares no screens now plans a Scene payload and a binding module it did not plan before, so its generated frontend has something to render.
  • cli (Release v3.8.2): The CLI’s pinned template catalogue version bumps to 1.7.0. The Kotlin and Java templates no longer pin a literal Cratis Arc/Chronicle version in the scaffolded build.gradle.kts — it now resolves to latest.release on every fresh build, the same way the C# templates already float their Cratis PackageReference (Cratis/Templates#53).
  • Templates (Release v1.7.0): The Kotlin and Java templates no longer pin a literal Cratis Arc/Chronicle version in build.gradle.kts. The io.cratis.arc Gradle plugin and the new io.cratis:cratis meta package (Cratis/Arc.Kotlin#209) both resolve to latest.release, so a fresh build always picks up the newest published release — the same behavior the C# templates already have via NuGet’s Version="*". Previously this required hand-editing a literal version on every Arc/Chronicle release, and had already drifted three releases behind.
  • Arc.Kotlin (Release v7.5.0): Bump the chronicle-spring-boot-starter dependency to 6.3.1, which fixes a kernel-side bug where an event type registration could be silently dropped while still reporting success (Cratis/Chronicle.Kotlin#86).
  • Eventmodelers-Build-Kit-Kotlin (Release v1.0.0): First stable 1.0.0 release of the Kotlin Eventmodelers build kit.
  • Eventmodelers-Build-Kit-Java (Release v1.0.0): First stable 1.0.0 release of the Java Eventmodelers build kit.
  • Eventmodelers-Build-Kit-Java (Release v0.0.1): Selected the cratis/application/java and cratis/arc/java AI profiles alongside cratis/chronicle/java.
  • Eventmodelers-Build-Kit-Java (Release v0.0.1): Refreshed the installed Cratis AI corpus: adds java.md/kotlin.md language rules, the Arc command/query/validation skills, and the opencode agent harness for projects scaffolded by this kit.
  • Eventmodelers-Build-Kit-Kotlin (Release v0.0.1): Refreshed the installed Cratis AI corpus: adds the Kotlin Arc command/query/validation skills, java.md/kotlin.md language rules, and the opencode agent harness for projects scaffolded by this kit.
  • Arc.Kotlin (Release v7.4.0): Operation-level authorization metadata now replaces a class declaration wholesale rather than being rejected. A read model annotated @Authorize can expose one @AllowAnonymous query, and an @AllowAnonymous class can close one operation with @Roles. ARCKSP0108 still rejects @AllowAnonymous combined with @Authorize or @Roles on the same declaration.
  • Arc.Kotlin (Release v7.4.0): The Kotlin and Java samples resolve identity from a client principal supplied as a header or a cookie, so an authenticated observable subscription keeps its caller instead of dropping to anonymous.
  • Chronicle (Release v19.1.1): Updated Cratis.Screenplay to 4.14.0 (Chronicle kernel LanguageService.Compile)
  • Chronicle (Release v19.1.1): Updated @cratis/screenplay-language to 4.14.0 (Workbench ProjectionEditor)
  • Screenplay (Release v4.14.0): A projection with variant blocks now builds one read model per variant (named after the
  • cli (Release v3.8.0): Pin the default template package version to 1.6.0, matching the JVM template polish release (Cratis/Templates #51).
  • cli (Release v3.8.0): Suppress a template’s own “run cratis ai update” hint when the CLI already ran the AI update automatically after creation, using the new SkipAiUpdateInstructions template symbol.
  • Templates (Release v1.6.0): The JVM getting-started instructions now carry the complete run story: the JDK 17 and Docker requirements, docker compose, run.sh as the one-command path, the build that generates proxies, and the per-package-manager dev command.
  • Templates (Release v1.6.0): The Java template’s .cratis/ai.json declared the Kotlin application profile; it now declares cratis/application/java with java and typescript languages, matching the AI catalog.
  • AI (Release v2.25.0): cratis/arc/client-kotlin and cratis/chronicle/client-java now expose the skills that cover them, and profiles.md documents the new Kotlin/Java coverage.
  • Orleans (Release v1.1.0): README overhauled to the Chronicle/Fundamentals standard: centered logo and badges, one-sentence definition, feature tables for the job system (durable jobs, steps as grains, plan-then-perform, at-least-once, fail-open, lifecycle), pluggable storage, silo hosting and building blocks, package list, a complete runnable getting-started walkthrough, the three spec tiers, support and contributing.
  • cli (Release v3.6.0): The catalogue pins Cratis.Templates 1.5.0 and its lockstep Kotlin and Java packages, whose derivatives now share the cratis short name exactly like the SDK’s own language families (#150)
  • Chronicle.Kotlin (Release v6.2.0): Requires io.cratis:chronicle-contracts 18.5.0, which carries the event source type on this query. Against an older kernel the argument still does nothing (#79)
  • Chronicle.Elixir (Release v3.3.0): Requires cratis_chronicle_contracts 18.5.0, which carries the event source type on this query. Against an older kernel the option still does nothing (#54)
  • Chronicle.TypeScript (Release v6.1.0): Requires @cratis/chronicle.contracts 18.5.0, which carries the event source type on this query. Against an older kernel the argument still does nothing (#71)
  • AI (Release v2.24.1): The Screenplay skills no longer report the language-service keyword gap or the three over-strict projection-grammar rules as current: both were fixed in Cratis/Screenplay#199. The guidance that absent highlighting is not evidence a construct is wrong is kept, since it outlives the fix.
  • AI (Release v2.24.1): The language reference now names dotnet-build.yml as the only workflow that runs tests on a pull request, so a guard on the language service belongs in the C# suite.
  • AI (Release v2.24.0): The cratis/screenplay profile now carries the modeling method and the whole .play language, not only the compiler reference.
  • AI (Release v2.24.0): The Screenplay language reference routes each construct to the skill that owns it, and the Chronicle event-modeling, event-model-diagram and Stage skills now name the Screenplay route.
  • AI (Release v2.24.0): The always-loaded “Where to Look” table points at Screenplay for designing an information system, business process or information flow, and at Stage for rendering a settled model.
  • cli (Release v3.4.2): Every cratis ai option now has a help description; they previously rendered blank. The command descriptions say what each one writes and leaves alone, and install, update and status carry worked examples.
  • Templates (Release v1.4.0): The Framework choice shrinks to net10.0 only — .NET 8 and .NET 9 are dropped as targets — and, with a single choice left, the framework’s interactive prompt is removed so scaffolding proceeds straight to the default
  • Chronicle.Kotlin (Release v6.0.0): Appending no longer substitutes routing defaults. Omitted or empty
  • Chronicle.Kotlin (Release v6.0.0): Single-source appendMany honors supplied routing options for every event in
  • Chronicle.Kotlin (Release v6.0.0): EventContext carries the compliance subject the kernel stored, which
  • Chronicle.Kotlin (Release v6.0.0): The client verifies its contract descriptor against the kernel before exposing
  • Chronicle.Kotlin (Release v6.0.0): Pins io.cratis:chronicle-contracts:18.4.1.
  • Chronicle.TypeScript (Release v6.0.0): Breaking: an append no longer sends client-chosen route defaults. An unspecified source type, stream type, or stream identifier is omitted, and the kernel resolves it to source type Default, stream type All, and stream identifier Default. Previously the client wrote source type Default, stream type Default, and the event source identifier as the stream identifier, so existing streams are no longer continued by default.
  • Chronicle.TypeScript (Release v6.0.0): Breaking: route-scoped reads no longer narrow to that legacy route either. getTailSequenceNumber(), getNextSequenceNumber(), getTailSequenceNumberForObserver(), and getForEventSourceIdAndEventTypes() leave an unsupplied dimension unnarrowed. Without this, every event written by the new append path was invisible to those reads — a narrowed read returned an empty collection and a narrowed tail returned the unset sentinel, with no error. Supplied dimensions are still sent unchanged, and getFromSequenceNumber()/hasEventsFor() carry no route dimensions at all.
  • Chronicle.TypeScript (Release v6.0.0): To keep writing to and reading from an existing stream, pass all three dimensions explicitly — append(id, event, { sourceType: 'Default', streamType: 'Default', streamId: id }) and getForEventSourceIdAndEventTypes(id, types, 'Default', id). Preserve existing append routes covers both halves.
  • Chronicle.TypeScript (Release v6.0.0): Event contexts now preserve the kernel’s routing metadata (eventSourceType, eventStreamType, eventStreamId, subject, occurrence time, correlation, causation, tags, identity, hash, observation state) across reads, reactors, and reducers.
  • Chronicle.TypeScript (Release v6.0.0): The client refuses to write to a server whose contract is incompatible, or that has no compatibility check at all. The verdict is permanent rather than retried, including for a server reached during a background reconnect, and authorization verdicts are read as the kernel sends them.
  • Chronicle.TypeScript (Release v6.0.0): Contracts pinned to the released @cratis/chronicle.contracts 18.4.1.
  • Chronicle.TypeScript (Release v6.0.0): yarn workspace @cratis/chronicle test — 42 files, 321 tests, 0 failures.
  • Chronicle.TypeScript (Release v6.0.0): yarn ci (clean + build) — 0 errors.
  • Chronicle.TypeScript (Release v6.0.0): python3 Documentation/validate-client-snippets.py — 707 snippet files, 466 compilable snippets, 241 explicit unsupported placeholders, compiled successfully.
  • Chronicle.TypeScript (Release v6.0.0): Both TypeScript examples on the migration guide compiled against the SDK in this branch.
  • Chronicle.TypeScript (Release v6.0.0): Live run against the released cratis/chronicle:18.4.1-development-slim kernel (isolated SQLite, Development, random host port, throwaway container): 17/17 checks passed — an unrouted append lands on Default/All/Default and is returned by an unnarrowed read; the same read narrowed to the legacy Default stream retur
  • Chronicle.Elixir (Release v3.2.0): cratis_chronicle_contracts is pinned to 18.4.1, and the compatibility preflight announces that protocol version. Kernel 18.4.1 withdraws the append-receipt contract introduced in 18.4.0; this client never surfaced receipts, so nothing but the pin changes.
  • Chronicle (Release v18.4.1): An append notification reports the event as the caller asked for it, with the sequence number the kernel assigned, and claims nothing else. No invented occurrence time, no invented hash.
  • AI (Release v2.23.1): guards-and-fuses.md states its scope: authoring a scanner, guard, allowlist or checker, or running a pass over a computed set of subjects. Its destructive-pass contracts are keyed to the risk class of the effect rather than to whether a person is attending. Preparing an exact inverse becomes knowing the recovery and preserving what it needs, so an irreversible effect with a named target is not blocked by an inverse that cannot exist. The dry-run list is a message in the conversation, not a retained artifact.
  • AI (Release v2.23.1): verification-discipline.md says documentary evidence is not produced unless a repository workflow or the user asks for it, and that reporting means the conclusion and any real uncertainty rather than the audit trail.
  • AI (Release v2.23.1): rtk.md gains the decision it was missing: when raw output is required, because the result is parsed, compared exactly, used as evidence of content or Git state, or decides what happens next.
  • AI (Release v2.23.1): local-work-artifacts.md treats a task worktree as a work record, removed once its branch is merged, from the parent checkout, after reviewing ignored files.
  • AI (Release v2.23.1): The application profile moves out of general.md into application-profile.md under profile: application, so framework repositories stop loading a manual that tells them it does not apply. general.md drops from 26.3 KB to 16.6 KB.
  • Components (Release v4.8.0): ErrorBoundary now shows a neutral message and a retry action instead of the caught error’s message and stack, and retry remounts only the protected section. (#250)
  • Components (Release v4.8.0): Selecting a renderer adapter no longer logs a console error when a slot outside its documented profile uses the built-in implementation. Invalid profile promises still fail or report CRATIS-UI-1002, and rendererFallback='throw' still rejects fallback with CRATIS-UI-1003. (#234)
  • Arc.Kotlin (Release v7.0.0): Require concrete supported identity-details DTOs; erased or unsupported provider shapes now fail with ARCKSP0307 (#189)
  • Arc.Kotlin (Release v6.0.0): Generate sorting helpers from returned model fields; consumers must regenerate clients (#174)
  • Arc.Kotlin (Release v6.0.0): Keep application query-renderer chains authoritative; register in-memory processing explicitly where needed (#174)
  • Components (Release v4.7.0): Support TypeScript 7 compilation while retaining TypeScript 6 compatibility for tools that require its compiler API. Packed-package checks cover both compiler versions and continue to report known upstream declaration exceptions. (#176)
  • Components (Release v4.7.0): Reduce the published stylesheet size by removing duplicate FilterPanel rules from PivotViewer.
  • AI (Release v2.23.0): Agent definitions use one canonical tool vocabulary (Read, Grep, Glob, Bash, Edit, Write, Agent) with readonly: true on reviewer and investigator roles; Copilot-only names are gone.
  • AI (Release v2.23.0): general.md is trimmed to invariants and pointers (33 KB → 26 KB, under the Codex project-doc budget); procedure lives in the owning rules and skills.
  • AI (Release v2.23.0): rules/efcore.md and rules/orleans.md are rewritten from what Arc and the Chronicle kernel actually ship.
  • AI (Release v2.23.0): Every skill’s verified-version table names the current release and what the re-verification covered.
  • cli (Release v3.2.1): cratis ai install and cratis ai update link .opencode/agents to the corpus’s generated OpenCode adapters (harnesses/opencode/agents) when the installed corpus ships them; a corpus without that directory keeps the canonical agents directory as the target, so existing installations are unaffected.
  • Orleans (Release v0.3.0): The job logging scopes (BeginJobScope, BeginJobStepScope, the jobs manager scope) and the [LoggerMessage] log messages for the job, job step and step throttle grains are public instead of internal. They are part of the authoring surface: a consumer’s own job and step implementations read through them, and keeping them internal made them invisible outside this assembly - which the Chronicle kernel’s jobs hit the moment they derived the package’s engine.
  • Orleans (Release v0.2.0): The MongoDB storage registers the standard Guid representation and Arc’s concept serialization provider, matching the kernel’s conventions, so job ids and concepts round-trip without host-side setup.
  • Orleans (Release v0.2.0): JobStateConverter lives in the core package, where the Orleans JSON fallback and the SQL provider both reach it.
  • AI (Release v2.21.3): Updated profiles.md to include profile composition information
  • AI (Release v2.21.3): Updated marketplace.json to use empty array for skills field
  • AI (Release v2.21.3): Updated Directory.Build.props to treat warnings as errors in Release builds
  • AI (Release v2.21.3): Updated publish.yml to build both Debug and Release configurations
  • AI (Release v2.21.3): Fixed SA1402 warnings by consolidating types in files
  • AI (Release v2.21.3): Closes #147: Submit the first approved Cratis AI release to marketplaces
  • AI (Release v2.21.3): Closes #148: Approve the first public Cratis AI target and source contract
  • AI (Release v2.21.3): Closes #359: Disable Claude subagent spawning in the harness Docker image
  • AI (Release v2.21.3): Related to #165: Assign owners and source authority for Cratis AI profiles
  • Components (Release v4.6.0): The Styling cascade contract explains that a product declaring its own @layer order first must name the cratis-* layers in that statement, between its reset and its utilities — declaring them after the Components import ranks a component stylesheet above every product utility (#277)
  • Components (Release v4.6.0): The duplicated narrow-width .cratis-number-input__steps block in NumberInput.css is merged into one rule (same declarations, same media query).
  • Components (Release v4.6.0): The packed stylesheet’s raw ceiling moves from 204 KiB to 205 KiB against the new measurement (raw 209017, gzip 32022, 1170 blocks). The gzip ceiling — the size a consumer transfers — is not raised and keeps 746 bytes of headroom; the comment records that the next stylesheet has to come with a reduction. Flagged for your judgement.
  • Components (Release v4.6.0): 50 specs across for_ComboBox, for_NumberInput and for_NumberInputField; parts manifest (57 components, 313 parts); TSDoc coverage; story index attestation (302 stories / 70 modules); packed archive wi
  • Arc (Release v22.15.0): A single-instance observable query — ObserveSingle/ObserveById, on both MongoDB and EF Core — now emits default when no document matches: after the document is deleted, after an update moves it out of the filter, and when the initial query finds nothing. It previously held the last known value forever with no signal. Guard with hasData / isReady on the client. Note a read model with [RemovedWith<T>] hard-deletes its document, so “the read model was removed” is this case. (#2642)
  • Arc (Release v22.15.0): Direct-mode WebSocket and SSE observables forward a null emission instead of dropping it, matching what the multiplexed transport already did (#2642)
  • Arc (Release v22.14.2): The library-mode page no longer claims abstract classes are skipped. They are not collected directly, but a concrete type’s base class is followed — so an inheritance chain arrives intact rather than with its roots missing, which is what makes the mode usable for a model with an abstract hierarchy at all. Open generic definitions and their type parameters are the things actually skipped.
  • AI (Release v2.0.11): The C# service-lifetime rule now leads with the rule as stated - a type taking a scoped dependency is scoped or transient, never a singleton - and makes deleting [Singleton] the first remedy. IServiceScopeFactory is demoted to the one case that actually needs it: a service the host itself resolves once, such as a BackgroundService, which has no request to inherit a scope from. Presenting the scope factory as the general fix is how an application accumulates dozens of captive dependencies that each look deliberate; a sweep of a real application found several dozen singletons holding a scoped service, not one of which needed to be a singleton.
  • AI (Release v2.0.11): Enforcement now asks for ValidateScopes and ValidateOnBuild in every environment rather than only Development, where the host enables them by default - backwards for a failure whose whole character is that it stays quiet. Spells out the order that matters on an existing codebase: turn them on locally, fix what they name, then let them reach the deployed environments, since doing it the other way converts a silent multi-tenant bug into a failed production start.
  • AI (Release v2.0.11): The C# conventions skill, its dependency-injection reference, the code-review skill and the code-reviewer agent carry the same rule, so none of them can be read as permitting what the rule refuses.
  • Arc (Release v22.14.1): Cratis.Chronicle, Cratis.Chronicle.AspNetCore and Cratis.Chronicle.Testing are updated to 18.2.0
  • Arc (Release v22.14.1): Chronicle 18.2.0: Generated gRPC messages initialize non-nullable values and collections at the contract boundary.
  • AI (Release v2.28.1): Recognize and authenticate Anthropic OAuth tokens and API keys copied from wrapped terminal output instead of sending whitespace or choosing the wrong authentication header.
  • AI (Release v2.28.1): Make the same normalized credential available for worker-secret delivery through AnthropicCredential.Normalize.
  • AI (Release v2.28.1): Keep Kubernetes console capture attached while a new worker’s Pod and container become ready, preserving the output that applications archive after completion or failure.
  • Stage (Release v3.20.0): A keyed lookup over a raw key declares its parameter as the event source id rather than the string it is stored as, so the incoming value is validated instead of being converted inside the method after validation has run.
  • Stage (Release v3.20.0): Generated command specifications dispose the scenario they own, so a generated application builds where analysis is treated as errors.
  • Stage (Release v3.20.0): Generated specifications no longer declare the globalization namespace unless something in the file uses it.
  • Stage (Release v3.20.0): A generated read model states its key, so an instance is self-identifying rather than leaving the key implicit in its event source.
  • Chronicle (Release v19.1.5): A job step that was Scheduled or Running when its silo died now restarts its work on the next start or resume. Previously the step answered AlreadyStarted from its persisted status even though the background task doing the work died with the process - the step stayed Scheduled forever and the job it belonged to looked alive without ever running. Observers whose catch-up waited on such a job stranded on every retry until the strand bound quarantined them, and every kernel restart mid-catch-up minted more wedged steps. A step already running in the same activation still answers AlreadyStarted.
  • Chronicle (Release v19.1.4): A quarantined observer now comes back to life when its client subscribes again. Previously a new subscription was recorded but the observer stayed quarantined - making quarantine terminal in practice: no redeploy, restart or reconnect could ever revive it, and observers stayed dead across every subsequent deploy while the events they should have handled kept appending. A fresh subscription resets the stranded-catch-up counter and routes the observer, which re-evaluates the gap and drives catch-up; if catch-up keeps stranding under the new subscription, the bound quarantines it again.
  • Chronicle (Release v19.1.4): Clearing an observer’s quarantine through the API now also resets the stranded-catch-up counter. Previously the counter was already past the bound, so the very next transient strand re-quarantined the observer immediately - the manual clear survived exactly one hiccup.
  • Orleans (Release v1.3.0): A job step that was Scheduled or Running when its process died now restarts its work on the next start or resume. Previously the step answered AlreadyStarted from its persisted status even though the background task doing the work died with the process - the step stayed Scheduled forever, its job stayed Running forever, and every step queued behind it on the step throttle waited for work that no longer existed. A step already running in the same activation still answers AlreadyStarted.
  • Orleans (Release v1.2.0): Job states now cross grain boundaries correctly even when the hosting application registers its own JSON serializer for its own namespaces. Previously, any AddJsonSerializer call made after the Cratis registrations silently replaced the serializer options the Cratis types depend on - Orleans’ shared JSON codec holds a single options instance - and every IJobsManager.GetJobsOfType call then failed with NotSupportedException deserializing the interface-typed JobState.Request. Job-driven schedules (reconciliation sweeps, retry jobs) built on GetJobsOfType stopped running entirely in affected deployments.
  • Arc.Kotlin (Release v7.5.2): The Arc Chronicle integration now uses Chronicle Kotlin 6.3.2, which ensures a fresh application’s event store exists before registering its artifacts.
  • Chronicle.Kotlin (Release v6.3.2): A fresh Spring Boot application now creates its configured event store before registering event types, read models, reducers, and reactors. Previously the kernel rejected artifact registration with Event store does not exist, but the startup log still reported successful registration; the first command then failed because its event schema was absent.
  • Chronicle (Release v19.1.3): Event-type registration from a gRPC client now reaches the handler after command validation. The protobuf-backed repeated Types sequence may be single-use; validation enumerated it first, leaving the handler with no types and allowing a later append to fail with MissingEventSchemaForEventType. Registrations are now materialized when the command is created.
  • Stage (Release v3.18.0): An application that composes no Scene plans exactly what it planned before, with its emitted scaffold bytes unchanged.
  • Stage (Release v3.17.1): The Host image starts from the Chronicle development kernel matching its client packages, so the repository passes its own client and kernel compatibility check again.
  • Stage (Release v3.17.1): Scaffolding a new application produces its project and solution files again. The template package now groups the C#, Java and Kotlin applications under one short name, and the scaffolder could select a template that has neither.
  • Chronicle.Kotlin (Release v6.3.1): register()/registerSingle() now check the kernel’s registration result instead of discarding it. A rejected or failed event type registration used to be indistinguishable from a successful one; it now throws ChronicleCommandRejected, the same way every other artifact kind (read models, reactors, reducers) already reports a kernel rejection.
  • Chronicle.Kotlin (Release v6.3.1): Bump the pinned chronicle-contracts dependency to 19.1.2, which carries a kernel fix for a real registration bug this surfaced: a client’s event type registration was silently never stored while the kernel still reported success, so every later append of that event type failed with “is missing from the event store” (Cratis/Chronicle#4073).
  • Chronicle (Release v19.1.2): Registering event types no longer silently drops a registration when the incoming sequence can only be enumerated once. EventTypeRegistrar.Register() used to walk the incoming registrations twice — once to validate, once to build what gets written — without ever materializing the sequence first; a single-use sequence saw the first (validation) pass consume everything and the second pass see nothing, so the command still reported success while the event type was never stored. Every later append of that event type then failed with is missing from the event store, with nothing pointing at registration as the cause. Reproduced end-to-end with the Kotlin client scaffolded from dotnet new cratis-kotlin (Cratis/Chronicle.Kotlin#86).
  • cli (Release v3.8.1): The CLI’s pinned template catalogue version (1.6.0) scaffolded Kotlin/Java projects with three bugs: a docker-compose.yml port conflict that made ./run.sh fail with Port 8080 was already in use, a non-executable gradlew/run.sh, and a stale Chronicle client dependency that made every command and query fail with UNIMPLEMENTED: Service is unimplemented. All three are fixed in Cratis.Templates(.Kotlin/.Java) 1.6.1 (Cratis/Templates#52); bump the CLI’s pin to match.
  • Templates (Release v1.6.1): Every generated docker-compose.yml mapped the Chronicle container’s port 8080 to the host, colliding with the scaffolded application’s own default port and causing ./run.sh to fail with Port 8080 was already in use.
  • Templates (Release v1.6.1): gradlew and run.sh were not executable after scaffolding a Kotlin or Java project, requiring a manual chmod +x (previously documented as a workaround in the README instead of fixed).
  • Templates (Release v1.6.1): The Kotlin and Java templates pinned arc-chronicle-spring-boot-starter to 7.2.0, which pulled in a Chronicle client several releases behind the Chronicle development kernel these templates connect to, so every command and query failed with UNIMPLEMENTED: Service is unimplemented. Bumped to 7.4.1, which carries the matching Chronicle client fix.
  • Arc.Kotlin (Release v7.4.1): Bump the default Chronicle client version pulled in by arc-chronicle-spring-boot-starter from 6.1.0 (contracts 18.4.1) to 6.3.0 (contracts 19.0.1), matching the currently shipping Chronicle server. Applications built with the previous pin failed every command and query against a fresh Chronicle development kernel with UNIMPLEMENTED: Service is unimplemented., because the client’s compatibility preflight and artifact registration used a protocol contract several releases behind the server.
  • Orleans (Release v1.1.4): Fixed an intermittent CS8669 build failure in every Release build of a project referencing Cratis.Orleans (or Cratis.Orleans.Storage/.MongoDB/.Sql), caused by the package-alignment guard’s inline RoslynCodeTaskFactory task using a nullable reference type annotation (string?) without an ambient #nullable context in the compiled fragment.
  • Chronicle (Release v19.1.0): ReadModelScenario<TReadModel> now builds a variant’s projection definition the same
  • Templates (Release v1.6.0): The Kotlin and Java .cratis/ai.json language lists included both JVM languages; each now declares only its own plus typescript.
  • Orleans (Release v1.1.2): All nullable reference type annotations removed from public types that cross grain boundaries — PerformJobStepError’s positional parameters, PerformWorkResult’s properties, and the out-parameter annotations of the TryGet methods. The Orleans code generator emits serialization and proxy code for grain method signatures, and nullable annotations in the signature types flow into that generated code without a #nullable directive — CS8669 in every consuming project. This completes the fix started in #9, which only covered JobStepResult.
  • Orleans (Release v1.1.1): JobStepResult no longer carries a nullable reference type annotation in its Result<object?, PerformJobStepError> type argument. The Orleans code generator emits serialization and proxy code for every grain interface that carries JobStepResult across a boundary, and the object? flowed into that generated code without a #nullable directive — CS8669, failing the build of any consuming project (Chronicle’s Storage.InMemory among them). The result now carries plain object, with nulls replaced by an empty string at the single construction point; nothing observable changes.
  • Chronicle (Release v19.0.1): The kernel’s connect-time compatibility check now orders the comparison by which side is actually older (by protocol version), rather than always treating the connecting client as the older side — a client that has only gained fields, methods, or messages since the kernel’s release now connects successfully instead of being incorrectly refused (#4058)
  • Chronicle (Release v19.0.1): ConnectCompatibility.Check(clientContract, clientProtocolVersion, kernelContract, kernelProtocolVersion), in Cratis.Chronicle.Compatibility, decides which of the two is actually older and calls WireCompatibilityChecker.Check in that order — always Check(older, newer), regardless of whether the older one happens to be the client or the kernel.
  • Chronicle (Release v19.0.1): ProtocolVersionOrder.Compare orders two protocol version strings numerically, not lexicographically ("1.10.0" sorts after "1.9.0"), and treats an empty or unparsable version as the oldest possible rather than throwing — a client too old to send a protocol version at all falls back to the direction Chronicle has always checked, so this cannot regress an older, pre-CheckCompatibility client.
  • Chronicle (Release v19.0.1): ConnectionService.CheckCompatibility now calls ConnectCompatibility.Check instead of calling WireCompatibilityChecker.Check directly.
  • Chronicle (Release v19.0.0): ChronicleClient’s direct construction path (used outside a host) now actually honors a request to skip the compatibility check; it previously ignored the setting entirely
  • Chronicle (Release v19.0.0): AddCratisChronicleConnection’s skipCompatibilityCheck parameter now falls back to the connection string’s option when not explicitly specified, the same way skipTlsValidation already does
  • cli (Release v3.6.0): A dashed name (the wizard’s default from the folder name) made the sourceName identity and safe_name forms collide on one token and fail the scaffold; the documented upstream behavior is tolerance, and this engine now defines it deterministically — file paths keep the identity form, content takes the last non-identity form (My-App.csproj beside RootNamespace My_App), matching the upstream engine’s observable output (#150)
  • Orleans (Release v0.3.1): The published packages carry the correct assembly identity: the build step now compiles with the release version, so AssemblyVersion matches the NuGet package version instead of the default 1.0.0.0. Consumers that bind by assembly-qualified name - Chronicle’s Arc proxy generator does - failed to load Cratis.Orleans.Storage from the published 0.x.0 packages for exactly this reason.
  • Chronicle (Release v18.5.1): A silo no longer terminates when a grain call made during startup cannot reach a sibling silo that has not stabilized yet. The failures a forming cluster produces are now retried wherever they occur in the startup task, rather than at whichever individual call site was last discovered to be unprotected. A step that still fails once the retry budget is spent fails the host as before, so a genuine defect is not started around (#4051)
  • Chronicle (Release v18.5.1): A projection can no longer stay permanently unsubscribed. The activation-time resubscribe no longer holds the projections manager’s turn while it runs, so registrations arriving during it are answered instead of timing out; and a registration now reconciles projections that are registered but not subscribed, instead of deciding purely from whether definitions changed. Together these close a state where appends kept succeeding, commands kept returning success, the observer had no failed partitions — because it was observing nothing — and the read model simply never updated (#4052)
  • Chronicle.Kotlin (Release v6.2.0): getForEventSourceIdAndEventTypes now sends the event source type it is given, so narrowing a read to one event source type no longer returns every source type (#79)
  • Chronicle.Elixir (Release v3.3.0): get_for_event_source/2 now sends the :event_source_type it is given, so narrowing a read to one event source type no longer returns every source type (#54)
  • Chronicle.Elixir (Release v3.3.0): Compilation, formatting and tests now run on the pull request. They previously ran only on push to main and on manual dispatch, both of which happen after a merge, so a failing suite surfaced on main with the merge already done
  • Chronicle.TypeScript (Release v6.1.0): getForEventSourceIdAndEventTypes now sends the event source type it is given, so narrowing a read to one event source type no longer returns every source type (#71)
  • Chronicle.TypeScript (Release v6.1.0): The JS/TS specifications now run in CI. There was no test step, and vitest could not start because its required vite peer was absent, so every specification in this repository was decorative
  • Screenplay (Release v4.13.1): The language service now highlights and completes every construct the compiler accepts. capture, projection, reducer, contribute, dialog, form, theme and ui had no keyword entry, so they appeared unrecognized in the editor despite compiling (#198)
  • Screenplay (Release v4.13.1): The projection grammar reference no longer describes syntax more strictly than the compiler accepts: every takes a bare automap, composite-key braces are optional, and $causedBy is a valid expression root
  • Chronicle (Release v18.5.0): GetForEventSourceIdAndEventTypes now applies its event source type argument instead of ignoring it, so a read narrowed to one event source type no longer returns events of every other type (#4049)
  • cli (Release v3.4.2): .cratis/ai.json no longer requires a languages property. Omitting it previously failed with The given key was not present in the dictionary, which named a dictionary lookup rather than the file or property. An empty language selection now means unconstrained rather than matching nothing, so composed profiles are still selected, matching how the @cratis/pi package reads the same file.
  • cli (Release v3.4.1): The cratis new listing footer told users to run cratis new <template> -n <Name> — the pre---language form, which now fails with a missing---language error — and carried a trailing “no .NET SDK required / list parameters with” fragment that added nothing. It now shows the required form, cratis new <template> --language csharp -n <Name>, and nothing else (#150)
  • Chronicle.Kotlin (Release v6.0.0): Reads narrow only by what the caller passes. A missing or empty filter means
  • Chronicle.Kotlin (Release v6.0.0): The in-memory server double in Cratis.Chronicle.Testing now narrows
  • Chronicle.Kotlin (Release v6.0.0): getForEventSourceIdAndEventTypes documents that its eventSourceType
  • Chronicle.Elixir (Release v3.2.0): Ordinary batch appends now go through the rich append RPC, so routing (event source type, stream type, stream id), tags, subject, occurred time, correlation id, identity, causation and per-entry concurrency scopes survive to the kernel instead of being dropped. Omitted routing and occurrence assignment are still left to the kernel, and the public return shapes and the explicit none-scope policy are unchanged.
  • Chronicle.Elixir (Release v3.2.0): A failed append result is now reported truthfully as an error tuple - including concurrency and constraint violations - rather than returning :ok on a rejection the server refused to persist.
  • Chronicle.Elixir (Release v3.2.0): Correlation ids are encoded correctly onto the wire, so a supplied UUID arrives as the same id rather than a reordered one.
  • Chronicle.Elixir (Release v3.2.0): The client runs a compatibility preflight once per connection channel, retries a failed check, and discards the successful verdict on reconnect, so an incompatible or unreachable server is caught before an append is attempted.
  • Stage (Release v3.17.0): The emitted scaffold bytes are frozen by a specification, so a change that should not alter generated output has to prove it did not.
  • AI (Release v2.23.1): The managed Pi rules extension honors applyTo, paths and profile. Universal rules go in the system prompt, path-scoped rules are attached the first time a matching file is read, written or edited in a session, and profile-specific rules are dropped when the repository does not select that profile. Chronicle goes from roughly 85k to roughly 25k tokens per turn.
  • AI (Release v2.23.1): A request to only commit, only push, or only open a pull request no longer routes through the ship-changes prompt, which declares itself direct authority for the whole branch-through-merge-and-branch-delete chain. Ship and land keep their meaning and their authority.
  • Components (Release v4.8.0): A Dropdown with an external <label> is announced by its field label instead of only its selected value, across single, filtered, and multiple selection. Labels that are added, replaced, or reassociated after mounting stay correct. (#281)
  • Chronicle (Release v18.4.0): Preserve authorization verdicts across .NET, JVM, JavaScript, Elixir, and Python protobuf clients instead of omitting a successful verdict from the wire.
  • Chronicle (Release v18.4.0): Apply one kernel policy to omitted routing metadata across all append endpoints, while preserving explicit routes and existing query-filter semantics. This centralizes the policy that 18.3.1 shipped; it does not change behavior.
  • Chronicle (Release v18.4.0): Match MongoDB append acknowledgments to stored timestamp precision and preserve supplied hashes in in-memory storage.
  • Chronicle (Release v18.4.0): Prevent concurrent gRPC generator builds from causing multi-target NuGet publication failures.
  • cli (Release v3.3.1): cratis ai install and update resolve rules against the composed profile closure instead of the literal configured list, so a profile that reaches an application profile through composes gets that profile’s rules and not just its skills — cratis/full/csharp was installing twelve application profiles’ skills while dropping vertical-slices.md, reactors.md, react.md and the rest of the frontend set (#154).
  • cli (Release v3.3.1): cratis init no longer writes through the symlinks cratis ai install creates. File.Exists follows a link, so appending the @CHRONICLE.md reference or writing the generated skill landed inside .cratis/ai — reported afterwards as corpus drift that cratis ai update refuses to replace without --force. Each destination is now resolved, following a link on the file or any ancestor directory, and reported as managed with a pointer to cratis ai update (#155).
  • cli (Release v3.3.0): Render nested Screenplay folders without passing filesystem paths into the compiler’s non-path document-identity contract.
  • cli (Release v3.3.0): Honor cancellation after the final file operation before publishing the managed manifest, leaving interrupted changes recoverable.
  • Stage (Release v3.16.0): Honor explicit root namespaces in generated application source, imports, and specifications. (#80)
  • Stage (Release v3.16.0): Preserve explicit event destinations when generating state-change commands. (#85)
  • Stage (Release v3.16.0): Keep read-model declarations, constructor arguments, and generated expectations consistent across semantic capture. Constructor parameters now follow semantic-ID order; regenerate callers that construct these generated models positionally. (#11)
  • Stage (Release v3.16.0): Keep same-named commands and queries in distinct slices on distinct canonical routes, retaining only unambiguous legacy aliases. (#53)
  • Stage (Release v3.16.0): Reject context-dependent inline handlers, unbound file-backed handlers, unsupported explicit query intent, and unsupported composite keys rather than generating weaker behavior. (#78, #58, #13)
  • Stage (Release v3.16.0): Preserve warm-stage handoff, Scene playback, and Chronicle read-model identity lookup when combining these rendering and input improvements.
  • Stage (Release v3.16.0): Keep the sandbox Chronicle development kernel aligned with the declared client versions, rejecting source-pin drift before release.
  • Arc (Release v22.16.1): Treat command responses containing neither events nor concurrency scopes as successful no-ops, including inside transactions, instead of attempting an empty append. Responses with concurrency scopes continue through the existing concurrency-validation path.
  • Arc (Release v22.16.1): Avoid disposed cancellation-token errors when MongoDB observable queries finish or their final subscriber disconnects.
  • Arc.Kotlin (Release v7.1.0): Preserve interruption and cooperative cleanup when blocking calls reach synchronous handlers or validators (#193)
  • Arc.Kotlin (Release v6.0.0): Preserve cancellation and request isolation through observable queries and Java adapters (#174)
  • Arc.Kotlin (Release v6.0.0): Keep generated Kotlin and Java metadata consistent across compiler rounds and incremental edits (#174)
  • Arc.Kotlin (Release v6.0.0): Preserve captured Chronicle routing and stable causation within command frames (#174)
  • Components (Release v4.7.0): Bind each automatically generated form field to its own command property, preventing text edits from overwriting date, number, or boolean values when used with Arc and Arc React 22.16.0 or newer. The existing package-wide Arc peer range is unchanged.
  • AI (Release v2.23.0): The Pi subagent bridge fails loudly when a declared tools list resolves to no Pi tool, instead of launching the subagent with every tool.
  • AI (Release v2.23.0): A missing non-nullable injected read model is a DependencyUnavailable validation failure (HTTP 400), not a thrown CannotResolveValidatorDependency.
  • AI (Release v2.23.0): Event-source-id resolution is first-match across EventSourceId a
  • Chronicle (Release v18.3.1): Store canonical defaults for omitted event-source and stream metadata, including requests from older clients. Keep .NET concurrency inputs and append notifications consistent with the metadata sent to the kernel. (#4041)
  • Chronicle (Release v18.3.1): Preserve explicit routing metadata on .NET single-source batch appends, including their tags, subjects, timestamps, and concurrency scope. (#4041)
  • Chronicle (Release v18.3.1): Respect JSON naming policies and explicit property names in typed event migrations, including nested paths and value maps. Preserve existing raw string paths and public constructors.
  • Chronicle (Release v18.3.1): Report unknown read-model identifiers with a meaningful error across keyed, collection, materialized, and session lookups, without rejecting passive models or confusing missing instances with missing definitions.
  • Arc (Release v22.16.0): Fields whose value accessor reads a property dynamically no longer all bind to the same command property, and no longer feed one field’s value to another field’s component.
  • Arc (Release v22.16.0): Inference is unchanged and remains the fallback: every existing command => command.property caller behaves exactly as before. The prop is additive and optional.
  • Arc (Release v22.16.0): cloneElement already overwrote fieldName, so a caller-supplied value was previously inert; that overwrite is now a no-op when the caller supplies one.
  • Arc (Release v22.16.0): extractPopulatedValues.ts and ValidationMessage.tsx keep their own copies of the same heuristic and would still mis-resolve a computed accessor. Left alone deliberately — worth a follow-up, not part of a minimal fix.
  • Arc (Release v22.16.0): Optional hardening not included: getPropertyName mis-binds silently here because the matched name is a real property, so the existing dev warning never fires. A guard rejecting a match that is not a static member access on the parameter would make this loud rather than silent.
  • Arc (Release v22.16.0): Requires the matching Components change to take effect for generated forms: Cratis/Components fix/auto-command-form-field-binding.
  • Arc (Release v22.16.0): New spec for_CommandFormFields/when_field_accessor_is_a_computed_property.ts: two fields with identical computed accessor source text must bind to their own properties, and editing one must leave the other untouched. Verified to fail with the change stashed and pass with it applied.
  • Arc (Release v22.16.0): commands/CommandForm suite: 14 files, 35 tests passing. Full Arc.React run: 130 files, 335 tests passing.
  • cli (Release v3.1.7): Linux install and cratis update manual guidance linked to an unversioned release asset (cratis-linux-x64.tar.gz) that 404s; release assets are named with their version. Both now resolve the latest version via the GitHub API first.
  • Components (Release v4.5.2): Wait out ordinary registry propagation before failing a publish, rather than reporting a slow registry as a missing package
  • Arc (Release v22.15.0): Collection query arguments — IEnumerable<int>, IEnumerable<SomeConcept>, and similar — are now bound from the query string. They were classified as injected dependencies, because the DI container reports it can supply any IEnumerable<T>, so the query ran with an empty collection and returned an empty answer while reporting success. (#2652)
  • Arc (Release v22.15.0): useIdentity(type) deserializes with the type it is given, as its documentation already promised. Previously the type was used only to decide which argument was the default and was then discarded, so any DateOnly, Guid, ConceptAs<T>, or nested value on identity details was raw JSON at runtime. (#2583)
  • Arc (Release v22.15.0): ARCCHR0004 only flags an [EventType] id that repeats the type name. An id that differs is the supported way to rename an event record while events already in the log keep resolving; following the old advice to remove it orphaned every stored event of that type. (#2633)
  • Arc (Release v22.15.0): ARCCHR0006 no longer flags private helper methods that reactor dispatch would never select, and is suppressed when a [Replay] handler is declared for the same event type. Its message now states that [OnceOnly] fires once per event source, not once per event — so a handler for an event that recurs on the same source would run only for the first one. (#2632, #2615)
  • Arc (Release v22.15.0): The proxy generator no longer deletes hand-written index.ts exports that point at a sibling folder or an npm package. It only ever wrote exports for files it generated
  • Components (Release v4.5.0): Keep a full-field paste change and its commit in one browser event transaction, so WebKit preserves onChange before onCommit (#175)
  • Components (Release v4.5.0): The Storybook verifiers printed hardcoded story and autodocs counts in their summaries while asserting different ones, so a passing run could report a number that was not real. Both now derive the count from the built index (#175)
  • Arc (Release v22.14.2): --emit-interfaces had no MSBuild property, which left it unusable for the thing it exists for: a package generating its own TypeScript model as part of its build cannot reach a flag only the command line accepts. CratisProxiesEmitInterfaces now maps to it, alongside every other option.
  • Components (Release v4.4.1): Document the real accessibility contract of NumberInput and NumberInputField, including the missing range announcement and why the spinbutton role is not used (#175)
  • Chronicle (Release v18.3.0): A projection built only from the all block or .FromAll(), with no separate from block, never processed a single event at runtime — every event was filtered out before it reached a property mapper (#2464)
  • Chronicle (Release v18.3.0): A dynamic dictionary key resolved against an EventContext value could silently pick up an unrelated read-model property’s schema (e.g. a string id property) and produce the wrong value type instead of the expected int64 (#2464)
  • Chronicle (Release v18.3.0): A dynamic dictionary-key mapping targeting a property that already has a concrete, non-dynamic schema now fails with a clear error instead of silently succeeding (#2464)
  • Chronicle (Release v18.3.0): Regenerating a projection declaration containing a keyword-named property nested in a dotted path (e.g. eventType.id) no longer produces a declaration that fails to re-parse
  • Chronicle (Release v18.3.0): Reducer definitions are now compared by value, and a passive reducer’s fingerprint and definition survive round-tripping through MongoDB and SQL storage correctly
  • Chronicle (Release v18.3.0): An observer subscribed to all events (SubscribeToAllEvents, the mechanism behind all/.FromAll()) could get stuck disconnecting itself every time it entered its routing state, because the “no event types on the subscription” disconnect check does not distinguish a genuinely empty subscription from the empty-by-design subscription an all-events observer always has
  • Chronicle (Release v18.3.0): The same all-events observer could also silently drop every live event it was handed instead of dispatching it to the subscriber, for the same reason
  • Chronicle (Release v18.3.0): The catch-up job for an all-events observer resolved zero schemas and zero events to read, because it asked for event types from the observer’s static, subscribe-time definition instead of the current, full set of registered event types
  • Chronicle (Release v18.3.0): ObserverKeys (used to enumerate the partitions an observer must catch up) built its query with an unconditional $in filter on event type; MongoDB’s $in with an empty array matches no document at all, so an all-events observer — whose definition carries no fixed event type list — always resolved zero partitions to catch up
  • Arc (Release v22.14.1): Chronicle 18.1.5: Preserve empty sequence-query collections through protobuf round-trips so .NET callers receive an empty collection rather than null. (cratis/chronicle#4025)
  • Arc (Release v22.14.1): Chronicle 18.1.5: Complete a reactor that returns no follow-up events without submitting an invalid empty append.
  • Arc (Release v22.14.1): Chronicle 18.1.5: Preserve separator characters in observer partition identifiers when routing a connected observer.
  • Arc (Release v22.14.1): Chronicle 18.1.6: Preserve empty query collections after .NET client deserialization (cratis/chronicle#4025)
  • Arc (Release v22.14.1): Chronicle 18.1.6: Deserialize populated query collections without throwing (cratis/chronicle#4025)
  • Arc (Release v22.14.1): Chronicle 18.1.6: Keep query results independent across successive and concurrent queries (cratis/chronicle#4025)
  • Arc (Release v22.14.1): Chronicle 18.2.0: Client APIs now return empty collections or initialized response objects instead of compensating for null wire values in converters.
  • Chronicle (Release v18.4.1): AppendReceipt, AppendCausation and AppendIdentity, the IncludeReceipt/IncludeReceipts request flags and the Receipt/Receipts response fields.
  • Chronicle (Release v18.4.1): AppendResult.Receipt, AppendManyResult.Receipts and the kernel plumbing behind them.
  • Chronicle (Release v18.4.1): The routing-omission tracking that existed to serve receipts. It never changed what reached the kernel, because the client’s defaults already equal the kernel’s, and it broke value equality on EventForEventSourceId along the way.
  • AI (Release v2.23.1): terminal-commands.md, which said to prefix every command with rtk because it is “always safe”, contradicting the caveats in rtk.md. Its content now lives in rtk.md.
  • Components (Release v4.5.0): The seven specifications from #264, as redundant — every case they covered is covered here, usually more thoroughly (#175)
  • cli (Release v3.3.0): Bound workspace input to 32 MiB and validate the opened file before reading, rejecting nonregular inputs such as pipes and devices.
  • No updates