Release digest: October 19 - 26, 2026 (Week 43)
Week in numbers
Section titled “Week in numbers”- 349 releases: 2 major, 162 minor, 184 patch.
- 705 merged pull requests and 946 issues closed.
- From merge to release: median 1 minute (90% within 24 minutes).
- Busiest repository: Stage (56 releases).
- Current daily release streak: 83 days.
Version movement
Section titled “Version movement”- Screenplay (Release v4.250.0): Commands can now keep unconditional
producesbeside an attachedhandlerwhose body is a nonempty language-tagged code fence or a resolvedfile. The pair binds in executable model v23, andproducesacts as the handler’s fixed result contract. Bodies remain opaque: reference execution still reports body execution as unsupported, and a target must admit the language and implementation separately. (#1068) - cli (Release v3.103.2): A specification that plans a model whose concept validation message is a
$stringskey and that has.en.stringsand.nb.stringsfiles next to it. It fails without the fix. - Screenplay (Release v4.249.2): A specification that loads a file referenced from a slice imported by a feature imported by a module. It fails without the fix.
- cli (Release v3.103.1): A spec that plans a folder where a module imports a feature that imports a slice. It fails without the fix.
- Screenplay (Release v4.249.0): Semantic conformance test support (
Cratis.Screenplay.Conformance, source-only, prerelease) that compares two canonical semantic models. Assigned identities, the top-level model revision and other provenance are normalized, so reassigning ids never creates a false difference. Literal text, patterns, labels and messages remain significant, and arrays compare as sets or ordered according to their schema path. Unknown arrays and unresolved identities fail explicitly. The rules are documented in https://github.com/Cratis/Screenplay/blob/main/Documentation/screenplay/semantic-conformance.md - Screenplay (Release v4.249.0): Per-target JSON loss ledgers: each entry matches a difference exactly and carries an issue or a by-design reason. Stale entries, ledgers over budget, unledgered differences, uncited warning or error diagnostics, obsolete exclusions, malformed or duplicate ledger fields, and complete runs with no successful comparison all fail. (#1064)
- Screenplay (Release v4.248.0): Screen and toolbar actions can name an explicit subject and bind plain action inputs, with typed inference, migration diagnostics and quick fixes consistent across the native and TypeScript tooling. (#1052)
- AI (Release v7.121.0): Commit and pull-request procedures and terminal-output guidance are available as the
cratis-commits-and-pull-requestsandcratis-rtkskills in every profile. Always-on rules direct agents to load the relevant procedure before acting. (part of #815) - Stage (Release v4.201.0):
CratisPlanOptions.UserInterfaceDomainsnames the slices already generated under an application’s other domains, so the shared frontend files a feature or slice plan writes (scene.json,src/bindings.ts,src/stage.ts,src/stage-scene.json) cover every domain and import each proxy from the domain folder it was generated in. Planning any domain against the same state writes the same files. - Stage (Release v4.201.0): New refusals for an inconsistent option:
STAGE-PLAN-024(domains withoutUserInterface),STAGE-PLAN-025(an invalid or reserved domain),STAGE-PLAN-026(the plan’s own domain, or a domain named twice) andSTAGE-PLAN-027(a slice named under two domains). - cli (Release v3.101.0):
cratis render --file-header <LINE>(repeatable;\nseparates lines in one value) and--file-header-file <FILE>put a header comment at the top of every generated C#, TypeScript and JavaScript file.{year}is replaced with the current year. Without either option, generated files have no header. - Arc (Release v22.143.0):
Slice<TCommand>inCratis.Arc.Chronicle.Testing.Slicesexpresses a command test as given state, one execution through Arc’s real command pipeline, and outcome assertions, without a test-framework base class. Seed events, pin read models and set the caller with theGiven…methods, callRun()once, and assert on the returnedSliceOutcome<TCommand>(success, rejection, denied authorization, and appended events). See Slice testing API. (part of #3519) - Stage (Release v4.199.0): The spec runner compares
then invokes <Command>expectations against the commands a slice’s reactions invoke, with the same rules and messages as Screenplay’s reference runner. The executor now accepts ESM v33 and v34 models. - Stage (Release v4.199.0): A running application now receives the public events of other applications. Its event store is subscribed to the outbox of every store its foreign events come from, and what arrives in the inbox joins the world, sets off its captures and reactions, and what they append reaches the event log.
- Arc (Release v22.142.0):
[EndpointGroup("name")]on a command, read model, controller or assembly puts it in a named endpoint group; artifacts without the attribute behave exactly as before (#2848) - Arc (Release v22.142.0): Assign ports to a group with
ArcOptions.EndpointGroups.Assign("internal", 5001)or theCratis:Arc:EndpointGroups:Portsconfiguration section; a grouped endpoint is matched only on a connection to one of its ports, and the request’s Host header is never used to decide (#2848) - Arc (Release v22.142.0): Observable queries respect groups: a WebSocket or SSE subscription to a grouped query is accepted only on the group’s ports, and an SSE connection cannot subscribe or unsubscribe from a port that serves other groups (#2848)
- Arc (Release v22.142.0): Startup refuses to run when a group that is used has no port, when every listening port is a group port, or when groups are used on the Arc.Core HTTP listener host, which cannot isolate ports (#2848)
- Arc (Release v22.142.0): Grouped endpoints are left out of introspection and OpenAPI, and the proxy generator emits only the default group unless you select one with
--endpoint-group=<name>or theCratisProxiesEndpointGroupMSBuild property (#2848) - Arc (Release v22.142.0): A guide to endpoint groups, including the network and proxy restrictions a port boundary needs: https://github.com/Cratis/Arc/blob/main/Documentation/backend/csharp/endpoint-groups.md (#2848)
- AI (Release v7.119.0): The
cratis-orchestration-merge-gatesskill completes the opt-incratis/orchestrationprofile. It covers: - AI (Release v7.119.0): tier names mapped onto the CI gates;
- AI (Release v7.119.0): a serial merge decided by GitHub state: predecessors merged, no publish run pending, no overlapping change on main since the CI commit;
- AI (Release v7.119.0): the rule that a green run on an older head is not evidence for the current head;
- AI (Release v7.119.0): the review budget;
- AI (Release v7.119.0): an unattended contract in which no hook or tool waits for interactive input. (#857)
- AI (Release v7.119.0): The review-rounds skill now has a contract table naming the inputs a review round takes and its result verdicts, including Incomplete when a provider or tool fails. (#857)
- Arc.Kotlin (Release v7.10.0): Arc honours the Fundamentals
@io.cratis.fundamentals.serialization.DerivedTypefor polymorphic JSON, generated derived-type registrations and proxies, the same way as its own annotation. (part of #301) - AI (Release v7.118.0): A new opt-in engineering profile,
cratis/orchestration, for multi-session autonomous work. It composescratis/engineering/core, and no other profile includes it. (part of #857) - AI (Release v7.118.0): The
cratis-orchestration-lanesskill sets the protocol for two or more lanes working at once: - AI (Release v7.118.0): roles;
- AI (Release v7.118.0): claims with a lease, whose expiry marks a claim stale but never overrides live ownership;
- AI (Release v7.118.0): a typed file inbox with token-exact matching;
- AI (Release v7.118.0): lane briefs and worktree discipline;
- AI (Release v7.118.0): escalation limits;
- AI (Release v7.118.0): context handoffs;
- AI (Release v7.118.0): roll calls answered from git and GitHub state.
- Arc (Release v22.141.0):
ShouldBeRejected()andShouldBeRejected(reason)onCommandResult; the reason form passes only when a validation message equals the reason exactly (part of #3519) - Arc (Release v22.141.0):
ShouldBeDenied()onCommandResultfor a command the caller was not authorized to run (part of #3519) - Arc (Release v22.141.0):
ShouldNotHaveAppendedEvents(),ShouldHaveAppendedEventsInOrder(...)andShouldHaveAppendedEventsInAnyOrder(...)onCommandScenario; they count only events the executed command appended successfully, not the givens, and compare every public property, including nested values and collections (part of #3519) - Stage (Release v4.198.0):
CratisPlanOptions.FileHeadertakes the lines of a file header as plain text; Stage writes them as comments at the top of every generated C#, TypeScript and JavaScript file. - Stage (Release v4.198.0):
CratisPlanOptions.UserInterfacelets a feature or slice plan also produce the application’s shared frontend files (scene.json,src/bindings.ts,src/stage.ts,src/stage-scene.json), composed over the slices that already have generated code, so the bindings never import a proxy that does not exist yet. An unknown slice in the selection is refused withSTAGE-SCREEN-007. - Orleans (Release v1.31.0):
IJob.ResumeIfRunning()andIJobsManager.ResumeIfRunning(JobId)resume a job only while it is stillRunning. The status is checked inside the job grain’s own turn, so an operatorStoporRemovecan never land between the check and the resume. A job in any other status is left untouched and the call returns the newResumeJobSuccess.JobIsNotRunning.Resume()stays unrestricted. Both interfaces move to[Version(1)], so during a rolling upgrade calls to the new methods go to silos running this version. (#155) - Chronicle.Kotlin (Release v7.2.0):
BlockingEventSequenceaccepts a typed event source id (anyConceptAs<String>, such as a class implementingEventSourceId) forappend,appendMany,hasEventsFor,getTailSequenceNumber,getForEventSourceIdAndEventTypesandredactForEventSource, so Java callers no longer have to pass the id as a plain string. (#127) - Chronicle (Release v19.111.0):
Cratis.Chronicle.XUnit.Integration.v3, a variant of the integration-testing package for xUnit v3 and Cratis Specifications 5. The existingCratis.Chronicle.XUnit.Integrationpackage stays on xUnit v2. - Chronicle (Release v19.111.0): A materialization binding catalog for MongoDB and in-memory storage that records, per read model, which generation is served and under which serving epoch. Publishing a new generation is one conditional, idempotent operation that revokes the previous generation’s write fence, and generation numbers are never reused. SQL storage refuses the catalog explicitly. (part of #5159)
- Chronicle (Release v19.111.0): Kernels support structured composite-key read-model lookups with explicit legacy-key ambiguity detection. (part of #4265)
- Screenplay (Release v4.247.0):
SemanticExecutionPlan.Runs,RunningReactionsandRunningCapturesare public, so a host with its own specification executor can run only the isolated slice’s reactions, captures and publications, the way Screenplay’s runner does. - Arc (Release v22.140.0): At startup, Arc now reports commands whose
DecisionRead<T>parameters Chronicle would refuse: it logs them, and stops the host when read protection is On. Reads thatProvide()supplies are checked when they execute. (#2933) - Arc (Release v22.140.0): Client-side “is required” validation results from
Commandnow carryreasonDetail: 'Required'(exported asValidationResultReasonDetail.Required), so applications can replace the message without matching its text. (#3531) - Screenplay (Release v4.246.0):
then invokes <Command>states a command the slice’s reaction invokes, with the values it passes indented beneath, as ESM v34. A specification that states at least one invocation compares every recorded invocation in count and order, or as a set underthen events in any order. - Screenplay (Release v4.246.0): PLAY0815 reports a malformed
then invokesline, and PLAY0816 reports athen invokesfor a command no reaction of the specification’s own slice invokes. - Screenplay (Release v4.246.0): A specification run’s new
Invocationsproperty lists the invocations its reactions made, accepted or refused, asSemanticRecordedInvocationvalues. - cli (Release v3.100.0):
cratis ai test --install-onlyruns the install-phase checks of AI corpus conformance fixtures without launching a harness, so the deterministic part of the suite can run in CI with no model quota. Each fixture runs for the harnesses it declares, or the configured ones when it declares none, and--harnessesnarrows the selection. (part of #204) - Fundamentals.Kotlin (Release v0.7.0): Add
NamingPolicyfor deriving storage collection and property names from types, withDefaultNamingPolicy(English-pluralized class names, matching the collection names the Chronicle Kernel uses for projections) andCamelCaseNamingPolicy(pluralized and camel-cased), as in C# Fundamentals. English pluralization uses Evo Inflector, which is now a runtime dependency ofio.cratis:fundamentals. (part of https://github.com/Cratis/Arc.Kotlin/issues/301) - Fundamentals.Kotlin (Release v0.7.0): Add
AcronymFriendlyCamelCaseNamingStrategytoio.cratis:fundamentals-jackson, a Jackson property naming strategy that camel-cases property names while preserving acronyms the same way .NET does. Set it explicitly on the mapper builder. (part of https://github.com/Cratis/Arc.Kotlin/issues/301) - AI (Release v7.112.0):
WithAgents<TAgents>(ServiceLifetime)registers an agent source with an explicit lifetime. PassServiceLifetime.Scopedwhen yourIAIAgentsreads tenant-scoped data such as Chronicle read models, so each request resolves agents for its own tenant.WithAgents<TAgents>()keeps registering a singleton. (#902) - Specifications (Release v5.0.3): The native runner documentation now covers the supported IDEs, migrating from xUnit, current limits, and how setup, act and teardown failures are reported, including how TUnit differs. (part of #77)
- cli (Release v3.99.0):
cratis chronicle jobs delete <JOB_ID>requests deletion of a retained job and its state. Before asking for confirmation it shows the event store, the namespace, the job ID and that deletion cannot be undone.--yesonly skips the local prompt: the Chronicle server still decides whether the deletion is allowed. Success is reported as “deletion requested”; an invalid ID, a declined or unavailable confirmation, a server refusal, an authorization failure or a server error exits non-zero. (part of #199) - cli (Release v3.98.0):
cratis ai testruns opt-in AI conformance fixtures against installed harnesses (Claude Code and Codex). Each fixture × harness gets a fresh temporary workspace that installs only that fixture’s profile and language slice, so the invoking repository is never changed. Fixtures come from the corpusEvaluations/conformancefolder, or from--fixtures. (part of #204) - cli (Release v3.98.0): Fixture checks are deterministic: required and forbidden files, per-file regex matches, and optional commands. They can run against the installed tree before the agent starts or against the result. A glob that matches no files fails, and no check can reach outside the workspace.
- cli (Release v3.98.0): Results keep the evidence levels apart: installed instruction files with their hashes, whether the agent was observed reading them (
unknownunless the harness reports a read), and the check outcomes. A missing harness or missing credentials is reported as skipped with a reason, never as a pass.--output jsongives machine-readable results for CI. - cli (Release v3.98.0): Every run is bounded. A timeout kills the whole process tree, Claude runs with a spending limit (reported as
not_enforcedfor Codex, which cannot enforce one), and output capture is capped. Transcripts are kept only with--keep-transcripts, inside the temporary output, with secrets redacted. See Test AI conformance. - AI (Release v7.109.0): Conformance fixtures for cross-harness checks live under
Evaluations/conformance, with a fixture schema that the corpus verifier validates. Thecratis ai testcommand from Cratis/cli#204 runs them. (#916) - Chronicle.Kotlin (Release v7.1.0): A correlation guide describing the shared identifier, its thread boundary and cleanup, and passing identifiers explicitly for suspending work: https://github.com/Cratis/Chronicle.Kotlin/blob/main/Documentation/guides/correlation.md (part of #151)
- Fundamentals.Kotlin (Release v0.6.0): Add
CorrelationIdContext, withCorrelationIdAccessorandCorrelationIdModifier, a thread-bound correlation identifier holder that generates an identifier lazily per thread and exposes a shared instance throughCorrelationIdContext.shared(). It does not propagate across coroutine suspension or to other threads. (part of https://github.com/Cratis/Chronicle.Kotlin/issues/151) - Arc (Release v22.139.0): Authentication handlers can opt out of running on endpoints that allow anonymous access by overriding
AppliesToAnonymousEndpointsto returnfalse. The default staystrue, so existing handlers keep establishing an identity on those endpoints. (#3107) - Orleans (Release v1.30.0):
AddJobPlacement()/AddJobPlacement<TDirector>()andAddJobStepPlacement()/AddJobStepPlacement<TDirector>()silo builder extensions opt in to the newJobsPlacementStrategy(job controllers) andJobStepsPlacementStrategy(job-step workers). Without a host director, the default directors place controllers with resource-optimized placement and steps with the cluster default, exactly as before. Recovered steps go through the worker strategy. Enable either strategy only once every silo in the cluster runs this version, and register it identically on every silo. (part of #129) - Orleans (Release v1.30.0):
NoEligibleJobWorker, which a host placement director throws when no silo may host a job grain. Orleans does not retry it; the job’s existing failure handling applies. (part of #129) - Orleans (Release v1.30.0):
UseJobStepParallelismFromSiloMetadata()sizes the job-step throttle per silo from the silo’s metadata, falling back toJobsOptions.MaxParallelSteps. (part of #129) - cli (Release v3.97.0):
cratis run --sample-data [pack]seeds a model’s user-authored sample data pack into the disposable semantic sandbox, so runtime queries show the pack’s rows. Without a pack name the first UI profile’s bindings and active pack decide; a named pack overrides both. An unknown pack, or--engine eventmodel, is refused before Docker starts. See Sample data in the sandbox. - cli (Release v3.97.0): The seeds are ordinary Screenplay seed events derived from the read model’s scalar projection mappings, including later update events, so separate price or approval events fill the same row. An authored
seedfor the same id wins. Collection properties stay empty with a warning naming Cratis/Screenplay#1000, and blueprint-only packs, joins, custom keys and non-invertible expressions are reported as warnings. (#429) - Arc.Kotlin (Release v7.8.0): Arc depends on
io.cratis:fundamentalsand recognises concepts implementingio.cratis.fundamentals.concepts.ConceptAseverywhere it handles concepts: JSON, validation, code generation, Spring Boot conversion, the Chronicle bridge and testing (part of #301) - Arc.Kotlin (Release v7.8.0):
FundamentalsConceptValidatorvalidates concepts that implement the FundamentalsConceptAs(part of #301) - Components (Release v4.38.0):
CratisComponentsProvideraccepts arouteroption (navigateand an optionaluseHref), soBreadcrumbsand other link components navigate client-side through your application’s router on plain clicks, while Ctrl/Cmd, Shift, Alt and middle clicks keep native browser behavior. See CratisComponentsProvider. (#392) - AI (Release v7.106.0):
cratis-engineering-release-trainsassembles one candidate pull request per repository: it joins an open PR rather than opening another, folds superseded PRs, and checks the ship bar before merging. It replaces removable waits with local work: build on a committed local candidate, prove against locally built packages, and drop an item that blocks the candidate. (#909) - AI (Release v7.106.0):
cratis-engineering-ci-gatesderives the local gate from the repository’s workflows, waits on CI with one blocking watch instead of polling, fixes every failing job before a single push, and cancels only runs its own superseded pushes started. It also covers container cleanup for integration tests. (#909) - AI (Release v7.106.0):
cratis-engineering-issue-hygienekeeps a status block in the issue description, re-reads the issue before every key step, files issues only when needed and closes what is done. (#909) - AI (Release v7.106.0):
cratis-engineering-review-roundsseparates blocking from advisory findings, runs follow-up rounds as deltas from the last reviewed commit, and caps the rounds. (#909) - Screenplay (Release v4.244.0): Java is now a built-in inline implementation language:
```javahandler, validation-rule and reducer bodies parse, print and round-trip in both compilers and the editors. The body is passed to the render target unchanged; the Cratis target refuses Java bodies. (#1053) - Ante (Release v1.4.0): Ante can publish what a consumer needs to verify its invitation tokens: issuer metadata at
/.well-known/ante/invitation-tokenand the trusted signing keys as a JSON Web Key Set at/.well-known/ante/jwks.json. SetAnte:Invitations:Token:PublicBaseUrlto the public HTTPS address Ante is served at to turn both on; without it they answer 404. The metadata names the issuer, audience, key set address and the RS256 algorithm, and the key set lists the current, additional and previous keys with public fields only. See Configuration. (#117) - AI (Release v7.105.0):
use-nuget --private-cache(orCRATIS_LOCAL_PRIVATE_CACHE=1) gives a consumer worktree its own NuGet package cache, so repacking the same local version is never masked by~/.nuget/packages.cleanremoves only local package folders from it, andclean CONSUMER --private-cacheremoves the whole cache afterrestore. (part of #885) - AI (Release v7.105.0): The local package helper records every packed stamp in the feed: producer repository, branch, task and the consumer worktrees using it.
list [--json]shows the owner, task, consumers and age of each stamp, andfinish --task IDmarks a task finished. Pass--taskor setCRATIS_LOCAL_TASKwhen packing. (part of #885) - AI (Release v7.105.0):
clean --expiredremoves stamps whose tasks are finished, whose consumer worktrees are gone, or whose package has a real release at or above the stamp’s version. It never removes a stamp that a live worktree still references, and it checks releases offline unless--onlineis passed. Dry-run by default. (#885) - Fundamentals.Kotlin (Release v0.5.0): Add
@DerivedType, stringDerivedTypeIdand an immutableDerivedTypesregistry for Kotlin classes and Java records. (#6) - Fundamentals.Kotlin (Release v0.5.0): Add opt-in
DerivedTypesModulefor_derivedTypeIdJSON dispatch across nested, recursive and collection-based families, with missing ids reading as null. (#6) - Fundamentals.Kotlin (Release v0.4.0): Opt-in
EnumModule: enum values write as ordinals and read defined ordinals, numeric strings, case-insensitive names,@JsonProperty/@JsonAliasandtoString()text; enum map keys remain names. (#13) - Fundamentals.Kotlin (Release v0.4.0): Opt-in
TimeSpanModule:java.time.Durationvalues and map keys use C# TimeSpan"c"strings ([-][d.]hh:mm:ss[.fffffff]), truncated toward zero to 100 ns; reads also accept ISO-8601. (#13) - Fundamentals.Kotlin (Release v0.4.0):
ConceptsModule(ConceptKeyFormat.EMBEDDED_JSON)writes C#-style embedded JSON concept map keys and reads both embedded JSON and legacy plain keys; the no-arg/ServiceLoader default remainsPLAIN. (#13) - Fundamentals.Kotlin (Release v0.4.0): Enum- and Duration-valued concepts follow the new modules, while existing no-arg
ConceptsModuleandTemporalModuleoutput is unchanged. (#13) - Screenplay (Release v4.243.0):
SemanticVersionedConstructstells a host which later-version constructs a bound model holds: date comparisons (ESM v26), composite read-model keys (v27) and Uuid comparisons (v28). A host that carries some of those constructs and not others can judge a model by what it holds instead of by the number it binds as. - Orleans (Release v1.29.0):
JobState.CompletedStepsCountedrecords which steps’ outcomes a job has counted in an execution begun by a resume orRetryFailed, and keeps that record across resumes and activations. Jobs that are never resumed record an empty list. A job logs a warning once the list reaches 100,000 entries. Custom job storage providers must persist this property; state saved without it reads as empty. See Jobs for the size figures and rolling-upgrade behavior (#148) - Components (Release v4.37.0):
CalendarFieldin command forms acceptsisNonModaland passes it to itsDatePickerInput. When it is set, clicking outside the open calendar closes it and also reaches the control you clicked, such as the form’s submit button. It defaults tofalse. (#463) - Stage (Release v4.197.0): The semantic specification runner executes Translate slices: inbound
source eventscaptures append their private events (the first observation counts as added; field-change and transition conditions are supported) and outbound projections append public events locally. Unsupported translation shapes stay refused by name. (part of #79) (part of #213) - Stage (Release v4.197.0): Cratis rendering supports Translate slices:
source eventscaptures render as inbox reactors that decide added, changed and transition conditions from durable per-key capture state, public events render as[Public]contracts published through outbox reactors, and generated Translate specifications run against the generated handlers. Unsupported capture guards stay refused by name. (part of #79) (part of #213) - Stage (Release v4.197.0): Typed capture identities from ESM v32 are admitted, and conversions that would lose their declared identity are refused. (#758)
- AI (Release v7.104.0): The local cross-repository verification helper can compose packages from several producers, each at its own local version, through a composition manifest:
verify-pack --composition,use-nuget --compositionandverify-assets --composition. Activation is journaled and recovers from interrupted runs, and concurrent sessions are locked out. Consumers with a nestedDirectory.Packages.propsor a project that opts out of central package management resolve the composed packages too. A dependency-range conflict between two packages outside the composition is reported as a warning, since NuGet reports it without the overlay as well. (#900) - AI (Release v7.104.0):
stamp --base-versionbuilds local package versions for major-version release branches such asrelease/5.0. (part of #885) - Fundamentals.Kotlin (Release v0.3.0):
ConceptDescriptorandConceptFactoryprovide cached concept construction and bounded scalar conversions, rejecting lossy integer conversions and invalid inputs. (#4) - Fundamentals.Kotlin (Release v0.3.0): Opt-in
TemporalModulewrites and reads plainLocalDate(yyyy-MM-dd) andLocalTimevalues in the same format as Cratis C# apps. Concepts in lists, arrays and sets serialize as their scalar values. Null elements are kept asnull. (#5) - Scene (Release v4.82.0): Kanban boards can let users select a card with the mouse or keyboard (
selectionMode: single) and publish the selected card’s original row asselectedItem, the same output tables use. (#268) - Chronicle.Kotlin (Release v7.0.0): Java callers can begin, look up and inspect units of work using correlation ids. (part of #151)
- Components (Release v4.36.0):
DatePickerInputacceptsisNonModal. When it is set, clicking outside the open calendar closes it and also reaches the control you clicked, such as a form’s submit button. It defaults tofalse, so existing pickers behave as before. (#460) - Components (Release v4.36.0):
DialogandCommandDialogacceptdismissOnOutsideClick,closeOnEscapeandshowCloseButton, so a dialog can ignore outside clicks while keeping Escape and its close button. Each one falls back todismissable, and a busy dialog still cannot be dismissed. (#461) - Scene (Release v4.81.0): Dialogs can independently turn off dismissal by an outside click (
dismissable) and by Escape (closeOnEscape). Clicks over portaled Cratis popovers keep the dialog and its unsaved input. (part of #257) - Screenplay (Release v4.242.0): Source-events captures can declare
key <property> is event source: every captured event is then sourced by the capture’s key, a fixture withoutfortakes the key, and a fixture whose source disagrees is rejected. Only asource eventscapture with a single property key may declare it (PLAY0809). Models that use it select ESM v33; other models keep their version and bytes. (#1042) - Screenplay (Release v4.242.0): Authoring syntax and diagnostics for clock offsets (
today - 7 days,now + 2 hours), date operands (date of occurred), application time zones, command calendars and specification time zones (PLAY0812,PLAY0813,PLAY0814). Executable binding still refuses them withPLAY0268; baretodayandnowremain ordinary property paths. (part of #824) - Fundamentals.Kotlin (Release v0.2.0):
GenerateValuewithuuid(),uuidV7(...),ulid(...),typeId(...),nanoId(...),bytes(count, ValueEncoding)andinteger(minimum, maximum), all using cryptographic randomness and the same limits and formats as Cratis Fundamentals for .NET (#2) - Fundamentals.Kotlin (Release v0.2.0):
GenerationContextthat captures the operation time and tenant, so time-ordered values use one consistent clock reading (#2) - Fundamentals.Kotlin (Release v0.2.0):
Generatable<T>andGeneratableInContext<T>marker interfaces for concepts that expose a staticcreate()orcreate(GenerationContext)factory (#2) - Fundamentals.Kotlin (Release v0.2.0):
GenerateValue.pattern(...)for finite patterns: every distinct admissible value is equally likely, date segments use the operation’s UTC date, and optional Luhn, Mod11 or Mod97 check digits are appended (#3) - Fundamentals.Kotlin (Release v0.2.0):
ChecksumwithhasValidChecksum(value, checksum)for validating Luhn, Mod11 and Mod97 check digits (#3) - Fundamentals.Kotlin (Release v0.1.0):
ConceptAs<T>withT value(), so Java records and Kotlin classes can be concepts, plusConceptAs.isConceptandConceptAs.valueTypeOfhelpers (#1) - Fundamentals.Kotlin (Release v0.1.0):
CorrelationIdbacked byUUID, withNOT_SETandcreate()(#1) - Fundamentals.Kotlin (Release v0.1.0):
toCamelCaseandtoPascalCasestring extensions that match the .NET Cratis Fundamentals casing rules (#1) - Fundamentals.Kotlin (Release v0.1.0):
ConceptsModulefor Jackson 3 (tools.jackson) that writes concepts as their underlying value and reads them back, with the same JSON as the .NETConceptAsJsonConverterfor UUID, string, number, boolean, BigDecimal, LocalDate and OffsetDateTime values; it is discovered automatically throughfindAndAddModules()and Spring Boot (#1) - Fundamentals.Kotlin (Release v0.1.0): A parity map that records which Cratis Fundamentals surfaces are available on the JVM and where they deliberately differ: https://github.com/Cratis/Fundamentals.Kotlin/blob/main/Documentation/parity.md (#1)
- Stage (Release v4.196.0):
SemanticRunAdmission.BlockingModelFeaturesandSemanticRunAdmission.RunsAroundtell a caller which public-event and translation constructs the live runtime runs without an external integration (public events are appended to the application’s own event log, foreign events arrive through seeds), so a host such as Studio admits the same models the Stage host runs. - Orleans (Release v1.28.0):
IJobStorage.GetJobsExcludingFinalizedStopsreturns jobs for the given statuses while leaving out stopped jobs whose stop has completed. It has a default implementation that filters the result ofGetJobs, so custom storage providers keep working without changes and can override it to filter in storage. (#125) - Chronicle (Release v19.110.0): Localhost clustering with persistent storage now uses a database-backed single-writer lease to prevent overlapping kernels from processing the same storage. It is enabled by default and configurable under
Clustering:SingleWriterLease; a kernel stops if it cannot renew its lease for half the lease time. MongoDB requires version 5.0 or later. Start-before-stop deployments can time out safely while the old instance holds the lease, and a development kernel-state reset keeps the lease of the running kernel. (#5109) - Chronicle (Release v19.110.0): Quarantined webhooks now recover automatically by periodically retrying the oldest failed event, honoring receiver deferral deadlines. A successful probe lifts quarantine and refreshes partition retry budgets; failed probes do not consume them. Configure this under
Webhooks:Probe. Quarantine survives kernel restarts; partitions parked after410 Goneor by earlier versions still require manual retry. (#5108) - Chronicle (Release v19.110.0): An explicit, idempotent per-event-store generation initializer records durable receipts and blockers and refuses adoption when it cannot prove exclusion. It is not run automatically and does nothing while projection generations are disabled. (part of #5223)
- Chronicle (Release v19.110.0): The kernel records the projection definition version each connected client registered, providing evidence for deployment-gated promotion when
Features.ProjectionGenerationsis enabled. (part of #5161) - Chronicle (Release v19.110.0): Webhooks can authenticate with the kernel’s Azure managed identity or workload identity instead of a stored client secret: register with
WithManagedIdentity(scope, clientId)in the .NET client or choose “Managed identity” in the Workbench. See https://github.com/Cratis/Chronicle/blob/main/Documentation/hosting/azure.md (#5208) - Chronicle (Release v19.110.0): Read models can declare composite indexes with
[CompositeIndex]and descending indexes with[Index(IsDescending = true)], on MongoDB and SQL read-model stores. (#5199) - Chronicle (Release v19.110.0): SQL read-model indexes can target nested properties, and PostgreSQL indexes collection paths with a GIN index; SQL Server and SQLite skip collection indexes with a warning. (#5198)
- Chronicle (Release v19.110.0):
IUnitOfWorkCompletionClaimlets a caller that owns the request’s unit of work (such as Arc) claim its completion, commit it itself and read the outcome as aUnitOfWorkCompletionResult(Committed,Failed,RolledBackorUnknown) before it writes the response.Unknownmeans the commit failed technically and events may or may not have been appended. A claimed unit that is never completed is rolled back and logged as an error. (#4864) - Chronicle (Release v19.110.0):
ChronicleAspNetCoreOptions.UnitOfWork.ReportFailuresBeforeResponseStartsreturns ProblemDetails for a failed commit when nobody claimed the unit and the response has not started: 409 for conflicts, 400 for constraint violations, 500 otherwise. Off by default. MVC and minimal-API apps that write their response before the commit keep today’s behavior (see #5339). (#4864) - Chronicle (Release v19.110.0): Custom sinks can opt in to atomic isolated replacement and guarded up
- AI (Release v7.103.6): Local cross-repository verification now supports shared train stamps and machine-readable package and asset results. (#881)
- Arc (Release v22.138.0):
IApplicationCalendarresolves the time zone for an operation (operation, then tenant throughICanProvideTenantCalendar, thenCratis:Arc:Calendar:TimeZone, defaultUTC) and rejects ids that are not IANA zones at startup. See Application calendar. (#3521) - Arc (Release v22.138.0):
ReevaluateAtBoundariesre-evaluates a live query answer when a clock boundary passes, such as the local date changing, not only when the data changes. (#3521) - Arc (Release v22.138.0): Unchanged builds now skip proxy discovery and keep the generated files; set
CratisProxiesIncrementaltofalseto always regenerate. (#3524) - AI (Release v7.103.5):
cratis-engineering-local-cross-repo-verificationcovers the Screenplay → Stage and Studio, Arc → Chronicle and Fundamentals → Arc → Chronicle chains with worked examples, and adds a dependency map of which repositories produce and consume which packages (part of #864) - Stage (Release v4.194.0): The semantic specification runner now runs projections with composite and collection read-model properties, mappings from a member of a composite event value, products of two event values, flat transitions keyed by an event property, and keys named by a capture, captures with child collections, and public events published from several source facts. Many more specifications run instead of being reported as unsupported.
- Specifications (Release v5.0.0): Shared resources and isolation leases (experimental): start a database or container once per test session and give each specification its own lease. Opt in with
CratisSpecificationsSharedResources=true. See Shared resources. (#75) - Specifications (Release v5.0.0): Phase timings: report how long
Establish,BecauseandDestroytake, flag slow phases and write a JSON timings file. See Phase timings. (#76) - Specifications (Release v5.0.0): The native runner prints a readable console tree and writes Markdown, JSON and GitHub summary reports. See Runner output and reports. (#79)
- Specifications (Release v5.0.0):
CratisSpecificationsRuntimeDefaults=trueopts into runtime settings tuned for specification runs, andCratisSpecificationsParallelFixtures=trueruns NUnit fixtures in parallel. Both are off by default. See Running specifications fast. (part of #74) - Specifications (Release v5.0.0):
[PerFactSpecificationLifecycle]can be applied to a single class. (part of #74) - Specifications (Release v5.0.0): The native runner reports
CRSPEC0011as a warning when it has to call a lifecycle method through reflection, which is not trim or AOT safe. (part of #77) - Arc (Release v22.137.0):
services.AddMongoDBWatcher()registers the sharedIMongoDBWatcheron its own, for a host or library that observes collections from its ownIMongoDatabasewithout configuring Arc’s MongoDB integration. See Watch multiple collections with a shared change stream. - Arc (Release v22.137.0):
IMongoDBWatcher.GetChanges(IMongoDatabase)gets the shared change stream of a database on its own client. A customIMongoDBWatcherimplementation must add it. - Screenplay (Release v4.241.0): Captures over source events now carry the type of their key onto the appended event’s identity, so a typed key such as a
Uuid-based concept is no longer flattened to text. Models that use it select ESM v32; other models keep their version and bytes. (#1035) - Screenplay (Release v4.241.0): New
Cratis.Screenplay.Matchingpackage: generated .NET applications can validate conceptmatchesrules with the same portable matcher the compiler admits, including patterns too large for .NET’s non-backtracking regex engine. Reference it at the same version as the Screenplay compiler. (#1034) - Specifications (Release v4.5.0):
CratisSpecificationsAnalyzersproperty:falseturns the bundled CRSPEC analyzers off everywhere,idekeeps them in the editor and drops them from command-line and CI builds. Other analyzers and the native runner’s source generator keep working. See Turning the analyzers off. (#84) - Specifications (Release v4.5.0): The native runner reports
CRSPEC0010as a warning for anasync voidfact or lifecycle method, whose failures cannot be observed. ReturnTaskorValueTaskinstead. (#84) - AI (Release v7.103.3): The CI pipeline performance skill and the GitHub Actions rule know the Cratis self-hosted runners: they link the runner guide, explain how to choose between GitHub-hosted runners,
cratis-arcandcratis-arc-small, how to cache on ephemeral runner pods, how to avoid redundant runs on shared capacity, and how a cached0.0.0-cipackage goes stale. (#887) - AI (Release v7.103.2): A scripting rule: new scripts use Node.js or C# file-based apps instead of Python. It loads when you work on shell, Python, Node or PowerShell scripts, workflows and hook scripts, and
general.mdpoints to it for harnesses without path-scoped loading. (#880) - Chronicle (Release v19.109.0): With
Features.ProjectionGenerationson, every MongoDB read-model sink write runs in one majority transaction that checks the writer’s fence gate, applies the writes and records a receipt. A revoked writer’s batch fails withFenceRevoked, and a commit whose outcome is unknown is resolved before the batch is retried or reported. (#5225) (part of #5159) - Chronicle (Release v19.109.0):
Cratis:Chronicle:ReadModels:MaxBatchSize(default 500) bounds how many documents one fenced sink write covers. Larger bulk flushes are split into several fenced transactions. The value must be positive. (part of #5159) - Chronicle (Release v19.109.0): The kernel refuses to start with projection generations on when MongoDB runs as a standalone server, because the fence needs transactions. The message explains how to run MongoDB as a replica set with
--replSet. (part of #5159) - Chronicle (Release v19.109.0):
/health/livereports healthy as soon as the kernel process is listening, without running any health checks, for liveness probes. See Health endpoint. (part of #4040) - Chronicle (Release v19.109.0):
/health/readyreports healthy only once the silo has started and the kernel can serve requests, for readiness probes and load balancers. (part of #4040) - Chronicle (Release v19.109.0):
--migrate-onlyserver option: applies the SQL schema migrations for the cluster, every known event store and namespace, and the jobs schema, then exits without starting the server. Also available asCratis__Chronicle__Storage__SchemaAction=MigrateAndExit. (#5204) - Chronicle (Release v19.109.0):
--verify-schemaserver option: checks that the SQL schema is current without changing it, then exits. Also available asCratis__Chronicle__Storage__SchemaAction=VerifyAndExit. (#5204) - Chronicle (Release v19.109.0): Repeatable
--event-store <name>and--namespace <name>options with--migrate-onlyprovision a new event store and namespace ahead of time, so a server without DDL rights can use them. (#5204) - Chronicle (Release v19.109.0):
Cratis__Chronicle__Storage__SchemaMode=Verify(Cratis:Chronicle:Storage:SchemaMode): the server never creates databases or schemas and never applies migrations. It fails at startup, or when an unprovisioned event store or namespace is first used, with an error that says to run--migrate-only. The default,Migrate, keeps today’s behavior. (#5204) - Chronicle (Release v19.109.0): Schema actions exit with
0(migrated or current),2(schema not current, including a missing database during verification),3(schema lock timed out),4(invalid options, or a database thatCreateIfMissing=falseforbids creating) or1(other errors). On MongoDB and in-memory storage they succeed without doing anything. (#5204) - Chronicle (Release v19.109.0): New guide for least-privilege SQL dep
- Specifications (Release v4.4.0):
CratisSpecificationsSharedLifecycle,CratisSpecificationsReadableNamesandCratisSpecificationsWarnOnSharedContextMutationMSBuild properties, which set up every package (xUnit v2 and v3, NUnit 4 and 5, TUnit and the native runner) the same way, without handwritten assembly attributes. See Setting up a project. (#70) - Specifications (Release v4.4.0):
GivenandWhenas aliases forEstablishandBecausein every package, with analyzerCRSPEC0009reporting a class that declares both forms of the same phase. (#71) - Specifications (Release v4.4.0): Opt-in readable test names in every package:
for_Author.when_registering.should_keep_the_nameis shown asAuthor › when registering › should keep the name. Test identities, filters and traits are unchanged. (#71) - Specifications (Release v4.4.0): Shared lifecycle on xUnit v2 and v3 now supports specifications that take class or collection fixtures in their constructor and specifications that implement
IDisposable, disposing them afterDestroy. (#69) - Specifications (Release v4.4.0): Assertion behavior is now the same across packages: a
nullactual value fails with the package’s own assertion exception, andShouldEqualInOrder,ShouldEqualInAnyOrderandShouldContainSingleMatchingare available in every package. The differences that remain until 5.0 are documented in Assertion behavior per package. (#72) - Specifications (Release v4.4.0): Native runner: Stop and cancellation no longer schedule new classes, wait for running classes to finish and run their cleanup, and expose the token through
SpecificationContext.CancellationToken.--treenode-filterselects classes and facts by namespace, class and method name. (part of #65) - Specifications (Release v4.4.0): Benchmarks for xUnit v3 on Microsoft.Testing.Platform and for the native runner published with NativeAOT. (#73)
- Stage (Release v4.193.0): The semantic specification runner executes Translate slices: inbound
source eventscaptures append their private events (first observation counts as added; field-change and transition conditions supported) and outbound projections append public events locally; unsupported translation shapes stay refused by name. (part of #79) (part of #213) - release-action (Release v1.5.0): Opt-in batched releases: set
release-window(minutes) to release everything merged since the last release in one release once the oldest pending merge is older than the window. Notes from the included pull requests are merged by section, the highest release intent wins, and every included(#n)issue is still closed. The default0keeps one release per pull request. (part of Cratis/Workflows#189) - release-action (Release v1.5.0):
hotfix-labels(defaulthotfix): a pending pull request with one of these labels releases right away. If a major change is pending, the run started by the merge fails and asks for a manual run; scheduled runs only warn and keep the batch pending. A manual run with no version releases everything pending. (part of Cratis/Workflows#189) - release-action (Release v1.5.0):
pull-requestsoutput listing the pull requests a batched release included, and the reasonsbatchedandnothing-pendingfor runs that release nothing yet. (part of Cratis/Workflows#189) - AI (Release v7.103.0): Core .NET engineering skills for contributors to the Cratis framework repositories: performance (BenchmarkDotNet microbenchmarking, performance patterns, vectorization, profiling), diagnostics (trace and dump collection), MSBuild (build performance, Directory.Build organization, restores, output clashes, generated files, targets, binlogs), Orleans, test running and coverage, and C# refactoring and AOT compatibility. They are adapted under MIT from dotnet/skills and managedcode/dotnet-skills with per-skill attribution, ship as the new
cratis/engineering/dotnetprofiles, and are included bycratis/engineering/csharp. (#867) - AI (Release v7.103.0):
yarn workspace @cratis/ai-verification run tool:screenplayinstalls the pinned Screenplay tool into a Git-ignored.cache/screenplay-tool/and prints its path.verifyuses it whenCRATIS_SCREENPLAY_TOOLis unset, so a newer globalscreenplayno longer breaks local verification. (#869) - AI (Release v7.103.0): Fast test subsets
test:hooks,test:adapters,test:corpusandtest:affected; each prints its ten slowest specs.test:affectedmaps committed, staged, unstaged and untracked changes to subsets and runs the full suite whenever it cannot prove a narrower one. The fulltestis unchanged and remains the gate. (#870) - AI (Release v7.103.0): A contract spec runs
cratis-check-prover vendored copies of the pull-request policy callers that Cratis/Workflows publishes; an opt-in live comparison (CRATIS_CONTRACT_LIVE=1) detects drift. (#855) - Specifications (Release v4.3.0): Experimental
Cratis.Specifications.Runnerthat runsEstablish/Because/should_specifications directly on Microsoft.Testing.Platform, without xUnit, NUnit or TUnit underneath. Specifications are registered at compile time by a source generator, so the test project can be published with Native AOT (part of #65) - Specifications (Release v4.3.0): The runner constructs each specification class once, runs
EstablishandBecauseonce and runs its facts against that instance. It acceptsGiven/Whenas aliases forEstablish/Becauseand shows names as readable sentences (Author › when registering › should be registered) (part of #65) - Specifications (Release v4.3.0): Runner options
--specs-parallel,--specs-sequential-facts,--fail-fast,--last-failed-first,--shardand--specs-cache(part of #65) - Specifications (Release v4.3.0): A benchmark harness and a manually dispatched Benchmarks workflow that compare the xUnit, xUnit v3, TUnit and native runner packages with their raw frameworks (#64)
- Specifications (Release v4.2.0):
Cratis.Specifications.TUnitfor writingEstablish/Because/should_specifications on TUnit and Microsoft.Testing.Platform (#60) - Specifications (Release v4.2.0):
Cratis.Specifications.XUnit.v3for writing specifications on xUnit v3, including the shared specification lifecycle the xUnit package offers (#62) - Specifications (Release v4.2.0):
Cratis.Specifications.NUnit5for writing specifications on NUnit 5. Unlike the NUnit 4 package, itsShouldEqualcompares sequences in order (#63) - Specifications (Release v4.2.0): Analyzer CRSPEC0008 reports
should_facts that modify the shared specification context. It is reported as info by default and can be raised through.editorconfig(part of #61) - cli (Release v3.95.0):
cratis screenplay validate --executable --target cratischecks that the model can be rendered as a Cratis application, using the same admission ascratis render --check, and points each refusal at its location in the.playsource; without--target, validation stays target-neutral (#451) - AI (Release v7.102.0): Skill
cratis-engineering-local-cross-repo-verificationand its helper script for proving a lower-layer fix in any Cratis consumer (for example Fundamentals in Arc, or Chronicle in Studio) with locally built NuGet and npm packages and Docker images, without waiting for releases. Covers a unique local version stamp, consumer overlays that leave tracked files untouched (NuGet) or are reversible (Yarn), a leak check before commits and pushes, and cleanup. (#852) - AI (Release v7.102.0): Skill
cratis-ci-pipeline-performance: measure a GitHub Actions workflow’s timings, pick the lever that fits the bottleneck, and verify before and after; the GitHub Actions rule now covers publish queueing, required checks with path filters, and SHA pinning. (#853) - Fundamentals (Release v7.26.0):
DerivedTypes.For(ITypes)returns one sharedDerivedTypesper type universe, so hosts and test scenarios that build many service collections over the same universe stop rescanning it each time. The universe is held weakly. (#1203) - AI (Release v7.101.0): Browser policy rule: one production tab per session, no parallel polling on production, production read-only unless a permit names the action, staging/local preferred for smoke runs, artifacts and uploads under
.ai-work/, a human handoff for sign-in and 2FA, and a required evidence record for UI verification (#861) - AI (Release v7.101.0):
browser-operatoragent, the only agent type that receives browser tools, with a headless production-smoke checklist (port-forward, GET-only header-injecting proxy, fresh headless browser) (#861) - AI (Release v7.101.0): Secrets rule: never run a command whose output contains credentials (pod, deployment and secret JSON/YAML,
describe, environment dumps,docker inspect, secret-manager reads, kubeconfig and.envfiles), use field projections instead, reference secrets by name only, and stop and report a security incident when a value appears in output (#863) - AI (Release v7.101.0):
cratis-guard-secretshook that blocks credential-printing shell commands in Claude Code, Codex and Pi and names the projected alternative, for examplekubectl get pods -o jsonpath=…instead of-o json; setCRATIS_HOOKS_ALLOW_SECRET_READS=1for a call the user explicitly asked for (#863) - AI (Release v7.101.0): A secret scan (
gitleaks detect --no-git) before archiving or sharing local work records (#863) - AI (Release v7.101.0):
modelTierandreviewIndependenceagent frontmatter, checked by corpus verification, so each agent declares a model tier instead of inheriting the session default (#859) - Chronicle (Release v19.108.0): When a kernel node is lost or an append grain call times out while an append is in flight, the append now fails with
AppendError.AppendOutcomeUnknowninstead of a generic failure. The events may or may not have been stored, so reconcile using the correlation id, or retry with the same idempotency key, rather than retrying blindly. Unit-of-work commits report the same error throughGetAppendErrors(). See Appending events. (#5231) - Chronicle (Release v19.107.0): Grain calls are routed by interface version, so during a rolling upgrade a call that needs a newer grain method reaches a node that has it, and older nodes keep being served by newer ones. Upgrading from 19.106 or later can replace nodes one at a time. (#5272)
- Chronicle (Release v19.107.0): Every build and release is checked against the latest release, and fails when a change to a kernel grain interface would stop nodes of the two releases from sharing a cluster. (#4621)
- Chronicle (Release v19.107.0): A rolling upgrade from the latest release to the new build, one node at a time under load, runs in CI. (part of #5169)
- Components (Release v4.35.0):
PropertyType.UniqueIdentifierin the schema editor: a primitive “Unique identifier” entry in the type menu, stored as{ "type": "string", "format": "uuid" }and read back from either auuidorguidformat. - Components (Release v4.35.0):
GlyphMenuandPropertyTypeGlyph, exported from@cratis/components/SchemaEditor, so a host can list its own single-choice types with the same colored glyphs and look as the schema editor’s type menu. - Components (Release v4.35.0):
typeUniqueIdentifierschema editor label for localization. - Chronicle (Release v19.106.6): A per-event-store generation floor that records the minimum generation protocol, the capabilities a kernel must support and the store incarnation, stored in MongoDB, SQL and in-memory storage with conditional writes that never lower it. (part of #5223) (part of #5169)
- Chronicle (Release v19.106.6): Startup admission: before registering event types, applying patches or recovering jobs, the kernel checks the floor of the System store and every event store and refuses to start when it does not meet it. Stores without a floor are only read. (part of #5169)
- Stage (Release v4.192.0):
CratisRendering.CreateProfilehas a public overload that takesusesPrimeReact, andCratisRendering.ListsPrimeReactis public. A host that composes the Scene input itself, such as the CLI, can choose the React Aria or the PrimeReact scaffold from the authored ui profile, and admission accepts that profile in both modes. (#732) - Chronicle (Release v19.106.3): Kernel concepts for materialization generations: a generation number, its lifecycle states, and a fixed mapping from each generation’s observer id to its container. Generation 1 keeps today’s projection id and collection. (part of #5158)
- Chronicle (Release v19.106.3): The kernel can resolve a sink for an explicit destination container, and build a projection pipeline keyed by generation. (part of #5158)
- Chronicle (Release v19.106.3): A reserved
ProjectionGenerationskernel feature setting, off by default and not used yet. (part of #5158) - Stage (Release v4.191.0): A ui profile that lists
PrimeReactgets the PrimeReact packages, provider, licence and theme in the generated frontend, and in live Stage the PrimeReact components are loaded on demand. (#707) - Chronicle (Release v19.106.0): Test event stores (
EventStoreForTesting, and through itReadModelScenarioand the scenario defaults) share one JSON schema generator per process when they use the default service provider, so suites that create many stores generate each event schema once. Each store still gets its own copy of every schema. SetEventStoreForTesting.ShareSchemaGenerator = falseto opt out, for example when metadata providers keep per-store state. (#5252) - Screenplay (Release v4.240.4): The Acme Commerce sample frames five features with templates of the
Cratis.Blueprint.Defaultblueprint, writtentemplate blueprint Cratis.Blueprint.Default <Template> version "^1": CatalogPublication(ListScreen, which also hosts the feature toolbar),Pricing(BoardScreen) andReporting(DashboardScreen), and PurchasingPurchaseOrders(ListScreen) andOverview(DashboardScreen). The board’s template header shows the template and its picker switches it; the domain’s own templates (ProductGrid,SideSummary,StorefrontShell) stay, so both flavours are on the boards. - Screenplay (Release v4.240.4): The Acme walkthrough has a section, “Blueprint templates at the feature level”, with the template of each feature and why the sample uses the foundation blueprint rather than a domain blueprint (crm, approvals, inventory): a domain blueprint’s screens draw empty regions on a live Stage.
- Scene (Release v4.80.0):
hostProfilePackages(TypeScript) andPackageResolver.HostPackages(C#) give hosts one deterministic package order: core, then Cratis.Components, then the component libraries the profile lists, then blueprints. A deliberately chosen library such as PrimeReact therefore always wins shared names likedataTable, and the blueprint keeps its own shell components. (#250) - Chronicle (Release v19.105.0): Set
clustering.typetoSqlto cluster kernel nodes through the configured SQL Server or PostgreSQL storage, without MongoDB. Localhost remains the default, and SQLite storage is not supported for clustering. See Clustering. (#5127) - Chronicle (Release v19.105.0): A guide for running Chronicle on Azure with Microsoft Entra ID: Azure SQL with managed identity, authenticated connection resolution, health checks, webhooks and clustering. See Run Chronicle on Azure. (part of #5127)
- Chronicle (Release v19.105.0): A runbook for rolling out a new version to a multi-node cluster on SQL storage, including what each starting node does to the database and the guarantees Chronicle does not give. See Roll out a new version. (part of #5127)
- Chronicle (Release v19.105.0): Cluster membership probe, heartbeat and table refresh timings, probe counts and death-vote thresholds can now be configured for SQL and MongoDB clusters. Unset options retain the Orleans defaults. See Clustering. (#5209)
- Chronicle (Release v19.105.0): SQL read-model indexes build in the background on populated tables, using online builds where supported. Changed index declarations remove obsolete Chronicle-owned indexes without removing custom indexes. (#5195)
- Chronicle (Release v19.105.0): SQL Server string indexes honor
MaxLength,StringLength, andLength, with a default bound of 450 characters for indexed strings without a declared length. Overlong writes now fail the projection partition instead of storing an unbounded value; replay existing read models to apply the bounded column mapping. (#5197) - Scene (Release v4.79.0):
CompositionOptions.namedTemplateOnlycomposes a screen with only the template it names, not inside the templates that template fits. A modeled screen fills only its own template’s slots, so outer templates could only draw their seeded content, for example a workspace’s module navigation showing “Nothing here yet” beside a master/detail. Hosts that render modeled screens can set it; leaving it unset keeps today’s composition. (#246) - AI (Release v7.100.0): The Screenplay UI composition skill teaches feature and module toolbars: when to put buttons on the feature instead of repeating them on each screen, the
toolbar <name>syntax withitem ... action <Command>andbutton ... slice <Slice>lines,confirmon an item or button, how the entries reach the template’stoolbarslot, and how Preview/Play and Studio’s feature editor handle them, with a verification step (#846). - AI (Release v7.100.0): The Screenplay model-authoring screen workflow covers authoring a feature toolbar through MCP (
toolbarsmember ofFeatureSyntax, replacing a button to setconfirm). - AI (Release v7.100.0): The Components toolbar skill points a Screenplay author to the feature toolbar.
- AI (Release v7.99.0): A fast path in the Screenplay toolchain skill that takes an agent from requirements to a running Cratis application: model,
validate --executable,render --check, render, build, run Chronicle, backend and frontend (#849) - AI (Release v7.99.0): Screenplay skills now state the traps a modeling agent hits before its first render: lowercase enum members, specifications that state every property, one keyed query for read models with two
*Idproperties,observablelists for live screens, no optional event properties for the Cratis target, and the default application shell from Stage 4.189.3 - AI (Release v7.99.0): An executable existence guard example (protected read) so commands against an unknown id are refused
- Arc (Release v22.135.0):
DbSet<TEntity>.UpsertAsyncprovides atomic upserts for supported SQL Server, PostgreSQL, and SQLite mappings, including composite keys and value converters. The existing trackedUpsertAPI remains available. See Upserts. (#3476) - Screenplay (Release v4.240.0):
sticky note on eventsources,sticky note on givencontextsandsticky note on seeddata: the free-standing note of the event source, given context and seed data canvases, with the same description, colour, position and size assticky note on personas. The syntax node carries the canvas it is on. - Screenplay (Release v4.240.0):
position <x> <y>in aneventsourcebody, for tools that draw event sources as cards on a canvas. Authoring metadata only; the executable model is unchanged. - Screenplay (Release v4.240.0): The C# and TypeScript compilers, the printer (byte-equal round trip), the AST schema, Monaco,
grammar.mdandevent-sources.mdknow the new forms; shareddomain-canvasesconformance vectors cover all four canvases. - Screenplay (Release v4.239.0):
personadeclarations can carrygoal "<text>"lines and aposition <x> <y>andsize <width> <height>for the personas canvas (Cratis/Screenplay#1014). - Screenplay (Release v4.239.0):
sticky note on personas: a free-standing note with a description, an optionalcolour(yellow, pink, green or blue), apositionand an optionalsize. Authoring metadata only; the executable model is unchanged. - Screenplay (Release v4.239.0): The TypeScript compiler, the printer (byte-equal round trip), folder merge, the AST schema, Monaco, the VS Code grammar,
personas.mdandgrammar.mdall know the new forms. - Chronicle (Release v19.104.0): A
Webhooks:Retryconfiguration section, separate from the global observer retry settings. By default a failing partition is retried after 1 s, 5 s, 30 s, 2 min, 10 min and 30 min, then hourly, each with ±20% jitter. After 24 hours it is parked. The webhook observer pauses when 5 partitions are parked or at least half of its failing partitions are parked.BackoffScheduleSeconds,MaximumBackoffDelay,MaxRetryAttempts,RetryBudgetand the quarantine thresholds can all be overridden. (#5106) - Chronicle (Release v19.104.0): A circuit breaker per webhook target (scheme, host and port). While it is open, delivery is deferred until its deadline without using up a retry attempt. The
chronicle-webhook-circuit-openedandchronicle-webhook-circuit-rejectedcounters are tagged by target authority. (#5106) - Chronicle (Release v19.104.0):
Webhooks:MaximumRetryAfterSeconds(default 24 hours) caps how long a receiver’sRetry-Aftercan defer delivery. (part of #5108) - AuthProxy (Release v2.32.0): New opt-in
AuthProxy:SearchIndexing:Excludesetting (and a matching Aspire helper) keeps proxied applications out of search indexes: AuthProxy then serves an anonymousrobots.txtthat disallows everything and addsX-Robots-Tag: noindex, nofollowto every response, keeping any policy the upstream already sets. It is off by default. (#204) - Chronicle (Release v19.103.0): SQL read-model storage now creates indexes for
[Index]properties on SQLite, PostgreSQL and SQL Server, including replay shadow tables, and keeps them when a replay is promoted. Indexes are created on top-level scalar columns; nested paths, objects, arrays and SQL Server string columns are skipped with a warning, and an index that cannot be created is logged without stopping the read model. See Indexing read models. (#5193) - Chronicle (Release v19.102.0): Set
UseAutomaticMiddleware = falsein the options forbuilder.AddCratisChronicle(...)and callapp.UseCratisChronicle()afterUseAuthentication()andUseAuthorization()to place Chronicle’s unit of work and causation middleware explicitly. (#5194) - Stage (Release v4.189.0): A Scene screen compiled from a Screenplay slice carries
owner, the qualified id of the slice it was written in (Sales.Orders.PlaceOrder), so a slice preview can load exactly that slice’s screens. (Cratis/StudioIssues#815) - Scene (Release v4.76.0):
Screen.owner: the qualified id of the slice that declared a screen (Sales.Orders.PlaceOrder), in the TypeScript and .NET models and the shared model-shape manifest. Whoever composes the document sets it; nothing is matched by name. (Cratis/StudioIssues#815) - Scene (Release v4.76.0):
screensForSliceandscreensOwnedByin the preview host, and asliceScreenMissingpreview warning for a slice that owns no screen. - Arc (Release v22.134.2): Chronicle 19.91.0: The kernel accepts appends with an idempotency key (
AppendOnce,AppendManyOnceand their named-tags variants): a retried append with the same key and content is reported as already appended instead of writing the event again, and the same key with different content is refused with a conflict. Clients can detect support through theidempotent-appendskernel capability (part of cratis/chronicle#4809) - Arc (Release v22.134.2): Chronicle 19.92.0:
IdempotencyKey, a key of 1 to 512 characters that identifies one logical append. Keys must not contain personal data. (part of cratis/chronicle#4809) - Arc (Release v22.134.2): Chronicle 19.92.0:
AppendOnceandAppendManyOnceonIEventSequenceandIEventLog, plusAppendOnceWithNamedTagsandAppendManyOnceWithNamedTags.AppendManyOncederives a key per event from the batch key withIdempotencyKey.ForIndex. (part of cratis/chronicle#4809) - Arc (Release v22.134.2): Chronicle 19.92.0:
EventForEventSourceId.IdempotencyKey, so a batch that spans event sources can key each event, and keyed and unkeyed events can be mixed in one batch. (part of cratis/chronicle#4809) - Arc (Release v22.134.2): Chronicle 19.92.0:
AppendResult.OutcomeandAppendManyResult.Outcomesreport whether each event wasAppended,AlreadyAppendedorAlreadyAppendedAfterErasure.IdempotencyConflictsreports a key reused for different content or event generation, or a match that can no longer be checked. Observers in the client are notified only for events that were actually appended. (part of cratis/chronicle#4809) - Arc (Release v22.134.2): Chronicle 19.92.0:
IEventSequence.SupportsIdempotentAppendstells you whether the connected kernel accepts keyed appends. Against a kernel that does not, keyed appends throwIdempotentAppendsNotSupportedbefore an - Chronicle (Release v19.100.0): Webhook target validation, configured under
Webhooks: - Chronicle (Release v19.100.0):
Validationchooses the mode.Warn, the default, logs a violation and still delivers.Enforcerejects the registration and blocks the connection.Enforcewill become the default in the next major release (see https://github.com/Cratis/Chronicle/issues/5151). - Chronicle (Release v19.100.0): The rules: HTTPS only, no private, loopback, link-local, multicast or unspecified addresses (checked again when connecting, so DNS rebinding cannot get around it), and a host allow-list.
AllowedHostssets the list for all event stores, andEventStoreAllowedHostsreplaces it for one event store. Entries are exact hosts or*.example.com. - Chronicle (Release v19.100.0): The same rules apply to the OAuth authority and its token endpoint. (part of #5107)
- Chronicle (Release v19.100.0):
Webhooks:AllowInsecureHttpallows plain HTTP to local and Docker host receivers, but only when the kernel runs in Development. (part of #5107) - Arc (Release v22.134.0): Read protection can require generated key metadata for commands. Set
ReadProtection:RequireGeneratedMetadatatotrueto fail withCommandReadModelKeysMissinginstead of reading a command’s key properties through reflection; NativeAOT applications always use this mode, and startup reports protected commands that have no generated metadata. (part of #3321) - Screenplay (Release v4.237.0):
PlayFileCompiler.CompileFolderandCompileApplicationaccept documents held in memory, as relative paths and source texts (PlayFileContent), with the same cross-file resolution and diagnostics as compiling the folder on disk. A command’sstream Account.Ledgerbinds to aneventsource Accountdeclared in another document, so hosts such as editors and importers no longer need to write the documents to a temporary folder first. See Compiling documents in memory. (#963) - AI (Release v7.97.0): The UI profile and theme reference explains the
identityblock (name,logo initials|icon|image,show name) and thecornersandfontlines ofappearance, with a domain-logo example. (#831) - AI (Release v7.97.0): The diagnostics and screen authoring references point to the identity rules (1-2 initials, closed icon set, PNG/JPG/SVG/WebP data URI up to 400 KB; PLAY0797 for unknown corners).
- AI (Release v7.97.0): The corpus compiles against Screenplay 4.235.0, which carries the identity block (contract, version pin and product sync updated).
- Chronicle (Release v19.99.0): The Testing client can drop the reply of a keyed append (
AppendOnce,AppendManyOnceand their named-tag variants) withDropNext(DroppedReply.Append), so a scenario can lose the reply after the kernel committed the append and retry with the same idempotency key. (#5099) - Chronicle (Release v19.98.0): Optional OAuth
scopeon webhook and external-service OAuth authorization, in the .NET client builders, the gRPC contracts and the Workbench forms. Existing registrations without a scope keep working unchanged (#5139) - Arc (Release v22.133.0): The source generator now emits read-model key metadata for every
[Command]and everyCommandValidator<T>command type when the assembly references Arc’s Chronicle integration. This prepares read protection to look up command read-model keys without reflection. (part of #3321) - Arc (Release v22.133.0): New info diagnostic
ARC0031reports a command whose read-model key metadata cannot be generated because generated code cannot name its type; read protection keeps using reflection for such commands. See ARC0031. (part of #3321) - Chronicle (Release v19.97.0): SQL storage now creates the
MembershipVersionsandMembershipEntriestables in the cluster database, the storage for a SQL Server or PostgreSQL backed Orleans membership table. Multi-node clustering on SQL storage is not enabled yet; that arrives with the clustering configuration in a later release (part of #5127) - Stage (Release v4.187.0): A query a performer answers renders as the query its shape states: the read model record, the query method with its route, parameters (filters in declaration order, optional ones defaulted) and the
[Authorize]policy the model names. The generated method throwsNotImplementedExceptionnaming the performer file; what the query answers is the performer’s code. (#596) - Stage (Release v4.187.0): A read model that a performer answers a query for needs no projection or reducer. The semantic runtime lists the read model and does not run the query.
- Stage (Release v4.187.0): A performer query Stage cannot preserve (a policy implemented by code, a composite
bykey, an unresolved argument type, an observable single result, a required argument after an optional one) refuses its read model withSTAGE-ESM-007, naming the query and why. - Chronicle (Release v19.96.0):
authenticationsettings on the HTTP storage connection resolver:ClientCredentials(token endpoint, client id, secret and scope) andAzureCredential(managed identity, workload identity or default Azure credential, with a scope). Resolvers configured without authentication behave as before (#5154) - Screenplay (Release v4.236.0): A query answered by a performer carries who may call it on its
QueryShape:SemanticPerformedQueryShape.Authorizationholds the policies of the module, the feature path and the query, combined as for any bound query, and is null when no policy applies. A policy that is anonymous access stays recognizable by name in the application’s policies. (#995) - Screenplay (Release v4.236.0): The MCP
implementation-requirementsview reports it asqueryShape.authorization(a policy name, or a combination of them) and the reference documents it. - Chronicle (Release v19.94.0): The built-in reactor side-effect handlers append returned events with an idempotency key built from the delivery identity, the reactor’s effect epoch and the event’s position. A key you set yourself on an
EventForEventSourceIdis kept. See Duplicate protection for returned events. (part of #4809) - Chronicle (Release v19.94.0):
[Reactor("id", effectEpoch: n)]and[Reactor("id", "sequence", effectEpoch: n)]start a new key space for a reactor whose returned output changed;ReactorDelivery.EffectEpochexposes it. The existing constructors are unchanged. (part of #4809) - Chronicle (Release v19.94.0):
ReactorDelivery.IdempotencyKeyFor("effect-name")derives a stable key for an effect you append yourself. (part of #4809) - Chronicle (Release v19.94.0):
Cratis.Chronicle.Testingadvertises idempotent appends, so scenarios using the real side-effect handlers exercise keyed appends. (part of #4809) - Stage (Release v4.184.0):
CratisPlanOptions.RepositoryRootandCratisRenderingOptions.RepositoryRoot(defaultfalse). When the application root is the repository root, the scaffold also emits.github/workflows/build.yml(a backend job that builds, runs the specifications and builds Release, and a frontend job that generates the Arc proxies and builds the frontend) and.github/dependabot.yml, with every action pinned by commit hash. A profile and options that disagree on the option are refused withSTAGE-CRATIS-001. See Repository-root option. (part of #401) - AI (Release v7.96.0): The toolchain skill explains observation comparison: what it answers compared with model-to-model and model-to-code comparison, how to read the
HasDriftverdict,Complete, coverage, and the Drift, Informational, Unknown and Excluded findings, and the pitfalls around absence and partial coverage. (#783) - AI (Release v7.96.0): The render-and-gap-fill skill adds a read-only post-deploy check with
cratis screenplay conform-namespace, covering the access it needs and what to do for each exit code; the Chronicle CLI operations skill points to it. (#783) - AI (Release v7.95.0): Pi’s
cratis-mcpextension starts every MCP server in the corpus whose profile is explicitly listed in.cratis/ai.json, not only Screenplay, so selectingcratis/playwrightorcratis/codescenemakes their tools available in Pi. Each server runs on its own connection with its tools prefixed by the server id; a server that fails, hangs or sends an invalid descriptor is skipped with a message and does not affect the others. (#812) - AI (Release v7.95.0):
.cratis/ai.jsoncan turn off any corpus MCP server for Pi withmcpServers.<id>.enabled: false. (#812) - AI (Release v7.95.0): The extension declares that it loads every selected-profile server, so the Cratis CLI can route those servers to Pi. (#812)
- Stage (Release v4.182.0): Rendering of
add/subtractby a product of two event members (Money x Quantity and other decimal or concept operands) as a derived event member plus an Add/Subtract with that member, socratis renderoutput computes the same totals as Play. - Stage (Release v4.182.0): Specs covering decimal and concept operands and the generated projection running in the Chronicle projection engine.
- AI (Release v7.94.0): A
discoverabilityrule for published content: documentation pages, site pages and content collections. It keeps readability first and adds what the docs voice rules do not cover: definition-first openings for landing pages, product index pages, glossary entries, READMEs and package descriptions; hand-written titles and descriptions within search-result lengths; one name per product; canonicalhttps://www.cratis.iolinks; image alt text; and no keyword stuffing (#827) - AI (Release v7.94.0): A
cratis-discoverabilityskill with a pre-publish procedure per content type (docs page, blog post, landing page, README, package metadata), references for structured data, package metadata and canonical entity names, and a checker for built static sites. It is installed with thecratis/documentationandcratis/contentprofiles (#827) - AI (Release v7.94.0): A
pre-publish-checkprompt that runs the discoverability check on what you are about to publish (#827) - AI (Release v7.94.0): Advisory hook hints for links to the bare
cratis.iohost, images with empty alt text and NuGet project URLs that point at GitHub instead of the docs (#827) - cli (Release v3.91.0):
cratis render --migrate-reducer <ReadModel>migrates a read model built by a classic reducer to a self-reducing read model that keeps the existing Chronicle observer. The option takesModule.Feature.Slice.ReadModelor the read model’s semantic id and can be repeated. The old reducer file is removed in the same publication as the new files, and an interrupted publication restores it. See Migrate a classic reducer. (#415) - cli (Release v3.91.0):
CLI-RENDER-025refuses a publication when a file it must remove changed since planning or Stage reports the removal as unsafe; nothing is written or deleted.CLI-RENDER-026refuses a migration request that cannot be honored (unknown read model, no or several classic reducers, an edited reducer file, or combined with--scope). Both exit with 5. (#415) - Screenplay (Release v4.234.0): A query answered by a
performernow describes its shape on itsQueryPerformerimplementation requirement, so a host can generate the query route, its performer hook and screen bindings: the read model it returns (name, semantic id and address), its cardinality (One,ZeroOrOneorMany), whether it isLiveor aSnapshot, and the caller-suppliedbykeys and filters with their types and optionality. It is available fromCompilationResult.ImplementationRequirementsand asqueryShapein the MCPread-workspaceimplementation-requirementsview. The executable semantic model and its version are unchanged. See Queries. (#981) - cli (Release v3.90.0):
cratis ai installandcratis ai updateregister every MCP server whose profile is selected (for examplecratis/playwrightregistersnpx -y @playwright/mcp@0.0.83 --headless --isolated) in Claude Code, Copilot, Cursor, Codex and OpenCode, and remove it when the profile is deselected or oncratis ai uninstall. Entries you registered yourself are left untouched and reported as a conflict, with how to resolve it (rename or remove your entry, or setmcpServers.<id>.enabledtofalsein.cratis/ai.json). A selected server whose descriptor can’t be used (unsupported transport, incomplete entry, invalid or duplicate id, or an unknown descriptor schema major version) is skipped with a message instead of failing the install. Pi keeps registering only Screenplay through its native extension and reports other servers as unsupported. (#410) - Scene (Release v4.75.0): A navigation region carries application-level toolbar buttons (
NavigationRegion.Buttons,NavigationButton: id, title, slice, emphasis, icon, authorize) in the C# and TypeScript models and the canonical JSON. - Scene (Release v4.75.0): The engines resolve the effective buttons per region and module with the items’ inherit, extend and override rules (
EffectiveNavButton), asserted against the sharednavigation-inheritance-fixtures.jsonin both languages; diagnostics report a duplicate button id and a button that opens a slice the structure does not have. - Scene (Release v4.75.0):
NavigationRegionViewdraws the buttons and opens the slice’s task dialog over the current page, as a screen’s toolbar button does;isAuthorized(policy)of the navigation model hides a button that names a policy. The default blueprint styles them. - Arc (Release v22.131.0): Bearer-token authentication for
HttpConnectionResolver: configureClientCredentialswith a token endpoint, client id, client secret and optional scope, and the resolver caches the token until shortly before it expires, refreshes it once when the endpoint answers 401, and never logs it (#3453) - Arc (Release v22.131.0):
Cratis.Arc.Connections.Azurepackage that authenticates the resolver with Microsoft Entra ID through an Azure credential, such as a managed identity or workload identity, using theAzureCredentialauthentication type (#3453) - Arc (Release v22.131.0): An extension point,
IConnectionResolverAccessTokenProvider, for supplying resolver tokens from your own identity system (#3453) - AI (Release v7.93.0): The model-authoring and streams-and-consistency skills teach renaming a composite stream-id part with
propose-rename, which rewrites everypart = ...mapping and keeps stored stream ids. (#796) - AI (Release v7.93.0): Model review covers the
SMELL006modeling smell and the correctedSMELL005count fromfind-modeling-smells. (#799) - AI (Release v7.93.0): The specifications and scenario-coverage skills explain where a specification given that has no event source belongs. (#819)
- AI (Release v7.93.0): The command-surface and toolchain skills explain the
PLAY0803warning formatchespatterns that can backtrack exponentially, and how to rewrite them. (#789) - Screenplay (Release v4.233.0): VS Code can show the completeness checks and the negated-claim warning that only the C# tool reports (PLAY0530–PLAY0537, PLAY0546 and the other completeness codes) while you edit. Run Screenplay: Run C# Completeness Checks, or turn on
screenplay.verdicts.onSave, and the extension asks the nativescreenplayserver it already uses for repairs. Findings appear in their own diagnostic collection labelled as C# checks and clear when the document changes. The feature is off by default and uses the samescreenplay.repairs.*configuration as repairs. See VS Code and decision 0104. (#527) - AI (Release v7.92.0): The model-authoring and streams-and-consistency skills teach how to remove a property from an inline event with
newGeneration: true: the result is a source-only evolution draft (evolutionDraft,extractedInlineEvents,PLAY0469) that needs a migration before it can be deployed. (#823) - AI (Release v7.92.0): The model-authoring skill teaches the
propose-inline-eventrefactoring, which folds a slice-level event with exactly one production back into an inline event, including when it refuses. (#816) - AI (Release v7.92.0): Model review uses
trace-lineageto check where each read-model field comes from. (#804) - AI (Release v7.92.0): The read-surface, specifications and model-review skills cover
require anonymous: anonymous queries, omittinggiven callerin specifications, and flagging anonymous access the business did not name public. (#821) - Stage (Release v4.179.0): Commands whose response carries a composite
typevalue now render: the response is the app-local record and serializes as the same JSON object. Collection responses are still refused withSTAGE-ESM-038, and its message now names the reason (#454) - Chronicle (Release v19.92.0):
IdempotencyKey, a key of 1 to 512 characters that identifies one logical append. Keys must not contain personal data. (part of #4809) - Chronicle (Release v19.92.0):
AppendOnceandAppendManyOnceonIEventSequenceandIEventLog, plusAppendOnceWithNamedTagsandAppendManyOnceWithNamedTags.AppendManyOncederives a key per event from the batch key withIdempotencyKey.ForIndex. (part of #4809) - Chronicle (Release v19.92.0):
EventForEventSourceId.IdempotencyKey, so a batch that spans event sources can key each event, and keyed and unkeyed events can be mixed in one batch. (part of #4809) - Chronicle (Release v19.92.0):
AppendResult.OutcomeandAppendManyResult.Outcomesreport whether each event wasAppended,AlreadyAppendedorAlreadyAppendedAfterErasure.IdempotencyConflictsreports a key reused for different content or event generation, or a match that can no longer be checked. Observers in the client are notified only for events that were actually appended. (part of #4809) - Chronicle (Release v19.92.0):
IEventSequence.SupportsIdempotentAppendstells you whether the connected kernel accepts keyed appends. Against a kernel that does not, keyed appends throwIdempotentAppendsNotSupportedbefore anything is sent. (part of #4809) - Chronicle (Release v19.92.0): Documentation for appending once and appending many events once. (part of #4809)
- AI (Release v7.91.0): The Screenplay command-surface skill teaches
require anonymousfor a public command or query (Screenplay 4.231.0): it must be the whole authorization, with the diagnostics that enforce that and specifications that may omitgiven caller. (#808) - AI (Release v7.91.0): The Screenplay model-authoring skill describes moving a single command, event, read model, projection, query, reaction or capture to another slice with
propose-move(Screenplay 4.230.0): which specifications move with it, what is refused, and that screen actions are repaired while slice-level events and identities stay as they are. (#817) - AI (Release v7.91.0): The MCP tool reference covers
trace-lineageandpropose-inline-event, each with the Screenplay version it needs. - Screenplay (Release v4.232.0):
propose-propertywithaction: removeandnewGeneration: truenow drafts the next event generation for an inline event too: the event is extracted in the same proposal, its original generation keeps the removed member, its contract and property identities stay intact, and only the new generation drops the member and its mappings. This is how to remove a command identifier copied into an event payload (PLAY0469) from a contract that may have been stored. (#342) - Screenplay (Release v4.232.0):
propose-propertyreportsevolutionDraft(true when any generation is drafted withnewGeneration) andextractedInlineEvents. An evolution draft is a source draft only: no migrator is declared,deployableWithoutTransformationstays false, and nothing claims deployment, replay or migration readiness. The documentation describes the Chronicle migrator capability this still needs. (#342) - Screenplay (Release v4.231.0): A policy can say
require anonymousto let a command or query be called without an identity, so a generated application can expose a public surface such as sign-up or a public verification page. The condition is admitted in ESM v31 as{"kind":"anonymous"}; models without an anonymous policy keep the ESM version they select today. See decision 0103. (#951) - Screenplay (Release v4.231.0): New diagnostics keep an anonymous policy the whole effective authorization of a command or query:
PLAY0804(combined with another condition inrequire),PLAY0805(negated; useauthenticated),PLAY0806(combined with another policy inauthorize) andPLAY0807(under or above another module, feature, command or query gate). (#951) - Screenplay (Release v4.231.0): Specifications of a command or query whose only authorization is an anonymous policy may omit
given caller. (#951) - Screenplay (Release v4.231.0): The Invoicing sample gains a
PublicVerificationmodule that lets anyone confirm an invoice number was issued. (#951)
Changed
Section titled “Changed”- Screenplay (Release v4.250.0):
PLAY0035is retired and no longer reported. Attached handlers without unconditionalproduces, or without a resolved nonempty body or a known file language, keep reportingPLAY0800. - Screenplay (Release v4.250.0): A command that declares more than one attached
handler, including across composed command fragments, now reports a duplicate declaration (PLAY0168) instead of letting one body replace the other. - cli (Release v3.103.0):
cratis renderand other commands exit with10(unexpected_error) on an unexpected failure instead of-1; scripts that matched-1must match10. (#469) - cli (Release v3.102.0): Bundles Stage 4.201.1 (from 4.196.0) and Screenplay 4.247.3 (from 4.240.2):
cratis runstartscratis/stage:4.201.1by default andcratis renderplans with the same renderer. A reaction can now map$eventSourceIdinto a produced event or a command argument, so models that do this run instead of failing withSTAGE-ESM-013; the Stage host no longer lists its own/stageand/workbenchendpoints in the OpenAPI document and the Scalar reference. - cli (Release v3.102.0):
cratis renderadmits ESM v1 through v32 (from v30), including typed capture identities. - cli (Release v3.102.0): Rendered code uses short, idiomatic type names, and the generated application compiles its specifications in Debug instead of a separate specifications project.
- cli (Release v3.102.0): Local public events render through the outbox and inbox instead of being refused with
STAGE-ESM-032. - AI (Release v7.121.0): Source-code quality, framework-contribution and glossary guidance loads for matching files rather than every session. History, release, authorization and work-artifact safety requirements remain always on. (part of #815)
- Fundamentals (Release v7.27.0): Ratio samplers now stop startup with
InvalidOpenTelemetrySamplerArgumentwhenOTEL_TRACES_SAMPLER_ARGis missing, invalid or out of range, instead of sampling everything. Samplers set through the standardOTEL_TRACES_SAMPLER*settings take precedence overConfigureTracingcallbacks, andOTEL_PROPAGATORSis honored. An application’s own global propagator is kept whenOTEL_PROPAGATORSis unset. (#1173) - cli (Release v3.101.0):
cratis renderandcratis runuse Stage 4.198.0 and Screenplay 4.241.0. Generated C# uses short type names withusingdirectives instead of fully qualifiedglobal::names, generated files no longer carry a Cratis copyright header, and a new application has a single project: specifications live beside the slices and compile into the application project in Debug builds, with no separate.Specsproject. - cli (Release v3.101.0):
cratis renderadmits models up to ESM v32. - AI (Release v7.120.0): Screenplay guidance now directs supported query performer bodies through Stage rendering instead of hand-written gap-fill. It explains body syntax, available query context and explicit implementation gaps, and distinguishes Stage 4.197.0 support from older CLI bundles. (#886)
- Stage (Release v4.200.0): Stage now builds against Screenplay 4.247.3; a capture sees the facts that came before it when a run settles reactions.
- Stage (Release v4.200.0): Reaction invocations carry the event source id (#789).
- Stage (Release v4.199.0): Only the specification’s own slice runs: its reactions, clock, triggers, captures and outbound publications. Other slices’ behavior no longer runs, so their facts never reach
then, read-model or query assertions. - Stage (Release v4.199.0): A command another slice owns, invoked by the slice’s reaction, is still decided through Arc, so validation, authorization, constraints and
on refusedbehave as before, but its events are not kept. - Stage (Release v4.199.0): A rendered reaction specification whose invocation belongs to another slice asserts that the command succeeds, not its events.
- Stage (Release v4.199.0): Upgrade: a specification that stated another slice’s events now fails; move the event to the owning slice’s specification, or state
then invokes. - Stage (Release v4.199.0): Requires Cratis.Screenplay 4.247.0.
- Stage (Release v4.199.0): A running application now publishes its public events through its outbox, as Chronicle does. A local public event is registered with public visibility and appended to the application’s outbox, never to its event log; a foreign event is registered with the event store it comes from.
- Stage (Release v4.199.0): A restart over an event log is no longer refused for holding a local publication, because the log no longer holds one.
- Orleans (Release v1.32.0): After a job grain is reactivated, a stage that completes before
OnBeforeResumingJobStepshas succeeded no longer starts the next stage, and the job does not complete while that stage waits. The watchdog’s resume runs the hook and then starts the held stage. With the watchdog turned off, cold activations keep advancing stages as before. (#157) - AI (Release v7.119.0): New Screenplay models start with
command reads protectedat the application root. Models whose reads cannot be protected keep leaving it out. (#883) - AI (Release v7.119.0): The Screenplay skills no longer say the language is frozen. They describe ESM v32 typed capture identities, the
propose-moverefusals the workspace API shares with MCP (reported asProposalRejected), and theCratis.Screenplay.Matchingpackage that generated .NET apps use for conceptmatchesrules. (#892) - AI (Release v7.119.0): The Screenplay skills mark clock operands, time zones and command calendars as parsed but not runnable, refused by binding with PLAY0268, and list PLAY0812–PLAY0814. (#903)
- AI (Release v7.119.0):
javais listed as a built-in inline body language, which the Cratis render target refuses. Performer queries refuse context-sourcedbyandfilterarguments with PLAY0810. (#907) - AI (Release v7.119.0): When a protected read changed and a uniqueness constraint is violated in the same commit, the skills say the observable refusal is the constraint refusal, not the concurrency conflict. (#918)
- Arc.Kotlin (Release v7.10.0): A class annotated only with the Fundamentals
@DerivedTypeis now written with_derivedTypeIdby Arc’s JSON mapper and can be read back polymorphically. Readers outside Arc that deserialize such a class with Jackson’sFAIL_ON_UNKNOWN_PROPERTIESenabled reject the new property: upgrade those readers first, or disableFAIL_ON_UNKNOWN_PROPERTIESfor them. (part of #301) - Arc.Kotlin (Release v7.10.0): When a class carries both the Arc and the Fundamentals
@DerivedTypewith different identifiers, the Arc identifier is still used and code generation reports warning ARCKSP0303. (part of #301) - Stage (Release v4.198.0): Generated C# uses short type names and
usingdirectives instead of fully qualifiedglobal::names. A name stays qualified only where a short name could bind to a different type. Existing applications see a one-time text change the next time they are generated. (#424) - Stage (Release v4.198.0): Generated files no longer start with a Cratis copyright header; without a
FileHeaderthey have no header at all. - Stage (Release v4.198.0): The application scaffold no longer creates a separate
{Project}.Specsproject. Specifications live beside the slices and compile into the application project in Debug builds, anddotnet test {Project}.csprojruns them, as in the Cratis template. - AI (Release v7.117.0): Stage rendering and sandbox guidance follows Stage 4.197.0: the matched language and semantic version pairs it admits, atomic rendering and execution, rendered validation bodies, Translate execution and rendering, composite keys, reducer migration and the current refusals and implementation gaps (part of #820)
- AI (Release v7.117.0): Screenplay toolchain, render and gap-fill guidance says what
cratis renderadmits: CLI 3.100.0 accepts models up to ESM v30, and its bundled Stage then applies its own admission rules; a v32 model needs Stage 4.197.0 called directly (part of #820) - AI (Release v7.117.0): Screenplay lifecycle, streams, automation and translation guidance follows the current Stage boundaries (part of #820)
- AI (Release v7.117.0): UI composition guidance follows Scene 4.82.0: exact query identity, outlets, UI profile parsing and serialization and the generated query input forms (part of #820)
- Screenplay (Release v4.247.1): Specification routes now appear as an information badge beside the specification title and in the slice header, with the full routing in a tooltip; long titles use the board’s original styling. (#496)
- Screenplay (Release v4.247.1): The warning on an event a State View slice references from a later slice now uses the board’s standard warning marker, with its explanation in a tooltip. (#1056)
- Orleans (Release v1.31.0): A job resumed while it sits between two stages now runs
OnBeforeResumingJobStepsbefore starting the next stage, like every other resume path. (#155) - Orleans (Release v1.31.0): While a job activation’s resume hook has not succeeded, the window fill and the restart of steps whose owner is gone start no steps. A cold
Runningactivation resumes itself on its first watchdog tick, so it keeps working after the job grain is reactivated on another silo. With the watchdog turned off, cold activations keep dispatching as before. (#155) - AI (Release v7.116.0): The CI-gate skill now requires the done gate to run its tier’s CI shards unfiltered. A dependency or analyzer bump is gated on the exact CI Release build. A change to a command, read model or query shape runs the proxy and API regeneration checks, and a package bump regenerates version-pinning snapshots in the same commit. (part of #857)
- AI (Release v7.116.0): The release-notes skill covers
no-releasepull request bodies, which close no issue on their own. It also says to write the body file in a separate step beforegh pr create. Before re-running a cancelled publish, it checks whether a release already contains the change, and confirms that the release’s publishing jobs completed before reporting the change as shipped. (part of #857) - AI (Release v7.116.0): The GitHub Actions rule forbids merging a workflow change while a release has not yet created its tag. It requires release-verify jobs to assert that the
v<version>release exists, and it forbids skip tokens in pull request titles because the merge commit inherits them. (part of #857) - AI (Release v7.116.0): The C# specification rule says that a change to a widely substituted interface runs the whole affected spec project, and the CI sharding guidance says to confirm a new shard split on one CI run before merging. (part of #857)
- AI (Release v7.115.0): Chronicle client guidance covers append outcomes when the result is uncertain, keyed retries, completion ownership and the partition delivery settings, each with the minimum version it needs (part of #820)
- AI (Release v7.115.0): Constraint and decision-read guidance explains how Chronicle repairs or refuses after an index failure, replacing the old claim that a failed index permits duplicates (part of #820)
- AI (Release v7.115.0): Reactor and reducer guidance covers concurrent partition delivery, receipts for returned events and replay sink promotion (part of #820)
- AI (Release v7.115.0): Projection and read-model guidance covers full-history evolution, root-removal warnings, MongoDB window and parent-history repair, and SQL, composite, descending, nested-path and PostgreSQL GIN indexes with their kernel and client floors (part of #820)
- AI (Release v7.115.0): Read-model specification guidance covers real appended event contexts and folds over seeded state (part of #820)
- AI (Release v7.115.0): Hosting guidance covers SQL membership and schema actions, the Localhost single-writer lease (MongoDB 5.0 or later), separate liveness and readiness routes, Azure managed identity, the abandoned-delivery hold and webhook validation, retry and quarantine probes (part of #820)
- AI (Release v7.115.0): Compliance guidance covers the Azure Key Vault purge requirements (part of #820)
- Chronicle (Release v19.111.0): Dropping, renaming or clearing a read model collection that a projection generation owns is refused. (part of #5159)
- Chronicle (Release v19.111.0): SQLite read models now store an order-preserving key next to each decimal property, so paging, indexes and exact lookups on decimal values follow numeric order instead of text order, while values still round-trip with every significant digit. (#5200)
- Chronicle (Release v19.111.0): Projection replay batches parent history reads per page while preserving the parent state applicable to each child event. (#5328)
- Chronicle (Release v19.111.0): Projection replay batches MongoDB sink-document reads per page while preserving position-bounded parent resolution. (#5317)
- Specifications (Release v5.1.0): The native runner,
Cratis.Specifications.Runner, is no longer experimental. Its package, options and behavior now follow the same versioning as the rest of the Specifications packages. The documentation also states that a hard IDE stop suppresses the skipped results for facts that never started. (#77) - Arc (Release v22.140.0): Controller-based commands now complete their unit of work before responding, so a refused append returns a non-success result instead of 200 OK. (#3254)
- Arc (Release v22.140.0): The publish workflow now waits until every npm package of a release is visible on the registry before it triggers downstream dependency updates. Installs started by those updates no longer fail on a sibling package that is not yet visible. (#3062)
- Screenplay (Release v4.246.0): Only the specification’s own slice runs: its reactions, captures and outbound publications. Other slices’ reactions, captures and publications no longer run, so their facts never reach
then, read-model or query assertions. A command another slice owns is still decided when the slice’s reaction invokes it, so refusals andon refusedbranches behave as declared, but its events are not kept. State that hand-over withthen invokes. See decision 0115. - Screenplay (Release v4.246.0): PLAY0285 follows only the reactions, invocations and publications of the specification’s own slice, so a specification that states another slice’s event is refused at compile time.
- Screenplay (Release v4.246.0): Upgrade: a specification that stated another slice’s events now fails. Move a published event to the outbound
Translateslice’s specification (when append <PrivateEvent>), and replace an invoked command’s events withthen invokes <Command>. - Screenplay (Release v4.246.0): The Acme Commerce sample specifies each slice on its own, with new specifications in the slices that own the moved facts.
- Screenplay (Release v4.246.0): The canonical reactions, Acme admissions, protected command reads and described command handlers corpora are restated under the new rule.
- AI (Release v7.114.0): Arc guidance follows 22.139.0: public-only query discovery,
UpsertAsync, protected validators, calendar-bound live queries, shared MongoDB watches, opt-out of custom authentication handlers on anonymous endpoints, scenario disposal and incremental proxy generation, each with the minimum Arc version it needs (part of #820) - AI (Release v7.114.0): Orleans job guidance follows 1.30.0: local
IJobs, recovery keys and backoff, durable plans, stop and drain, execution windows and retries, step test runs and independent controller and worker placement (part of #820) - AI (Release v7.114.0): Cratis CLI guidance follows 3.100.0: refusal-aware job actions, retained-job deletion, observer-wide failed-partition retry, closed-stream repair, namespace metadata comparison and AI conformance checks (part of #820)
- AI (Release v7.114.0): The store-mutation guard names
chronicle observers retry-failed-partitions,chronicle jobs deleteandchronicle streams closed reopenas store mutations and states their effect when it stops them, instead of refusing them as unknown commands. Runcratis ai updateto pick up the hook change (part of #820) - Fundamentals (Release v7.26.2): The type discovery documentation now explains NativeAOT behavior: an assembly that contributes only through reflection and is never referenced from compiled code can be trimmed away. Root it explicitly with
TrimmerRootAssemblyor[DynamicDependency]. (#1217) - Specifications (Release v5.0.4): The native runner documentation now describes what happens when a Microsoft.Testing.Platform session is stopped. Running specification classes finish their cleanup once, queued classes do not start, and the platform does not deliver results after a hard cancellation. (part of #77)
- Arc.Kotlin (Release v7.9.0): Arc uses the naming policy from Cratis Fundamentals for Kotlin (
io.cratis.fundamentals.serialization.NamingPolicyandDefaultNamingPolicy). The Spring Data MongoDB and Chronicle auto-configurations now register the Fundamentals types under the same bean names, andTenantContextMongoAccessaccepts a FundamentalsNamingPolicy. Collection names are unchanged, and existing Arc naming policies keep working (part of #301) - Arc.Kotlin (Release v7.9.0): Arc depends on
io.cratis:fundamentals0.7.0 - AI (Release v7.113.0): Screenplay guidance and the pinned Screenplay contract move to 4.245.0 (part of #820)
- AI (Release v7.113.0): Specifications guidance teaches Cratis.Specifications 5.0.3 on xUnit v3, including the lifecycle and migration from 4.x (part of #820)
- AI (Release v7.113.0): Chronicle.Kotlin guidance covers the 7.x migration and the 7.1.0 correlation context, and Arc.Kotlin guidance covers 7.8.1 concept validation (part of #820)
- AI (Release v7.113.0): Components guidance covers 4.38.0, with the minimum version each data-table capability needs (part of #820)
- AI (Release v7.113.0): The Chronicle clients are current: Chronicle.TypeScript 6.53.1, Chronicle.Go 0.11.1 and Chronicle.Elixir 3.14.3 (part of #820)
- AI (Release v7.113.0): Fundamentals 7.26.1, AuthProxy 2.32.4, Templates 1.8.1, Prologue 2.0.5 and release-action 1.5.1 guidance follows their latest releases (part of #820)
- AI (Release v7.113.0): Arc.Go, Fundamentals.Go, Screenplay.CritterStack, Screenplay.Generation, Narrator and Architecture are recorded as reviewed at their latest releases (part of #820)
- cli (Release v3.100.0):
cratis ai testreports a fixture check with an inconsistent shape as an error and names the reason, for example acommandcheck withoutrun, or acommandcheck that also declarespath,globorpattern. (part of #204) - AI (Release v7.112.0):
IAgentExecutionis now registered as transient, so it uses the caller’s scope. With a scoped agent source, services that depend onIAgentExecution,IAIChatClientsor a managed language model must be scoped or transient themselves. (#902) - Specifications (Release v5.0.3): The native runner reports a failing
Destroy, disposal or scope end as one separate failed result for the specification class, and the run fails. Facts that already completed keep their own outcomes, matching the xUnit and NUnit packages; before, every fact in the class was marked failed. The teardown result can be selected to rerun its class. (part of #77) - AI (Release v7.110.0): The conformance fixture schema now rejects the same fixtures the corpus verifier rejects. It refuses a command check in the install phase, a fixture without a required result check, and a check missing its type’s fields or carrying another type’s keys. A spec fails if the schema and the verifier drift apart. (#919)
- Screenplay (Release v4.245.0): When a command’s protected read changed and its uniqueness constraint is violated in the same commit, the reference evaluator now reports the constraint refusal, as Chronicle does, and race vectors V1R2 pin this outcome. (#919)
- Chronicle.Kotlin (Release v7.1.0): The ambient
correlationIdManagernow stores its per-thread correlation identifier in the sharedCorrelationIdContextfrom Cratis Fundamentals for Kotlin and Java 0.6.0, so other libraries that use that context see the same identifier.CorrelationIdManagerkeeps its UUID API; separately constructed managers stay independent. (part of #151) - Arc (Release v22.139.0): Documented that a validator and
Handle()share one read-model fold per command execution, whether they take the model as a plain parameter or asDecisionRead<T>, and that a separate/validaterequest folds the model again by design. See Validators. (#3243) - AI (Release v7.108.0): The engineering CI-gates skill requires a repository-specific executable check that every specification project actually runs in CI. The check accounts for matrices, conditional jobs and test filters, rejects empty discovery and missing execution results, and reports projects omitted by otherwise-green jobs. (#913)
- AI (Release v7.107.0): The Screenplay skills cover
key <property> is event sourceon a single-propertysource events fromcapture. The skills explain what it promises about the producer’s stream, how a fixture’sformust match the key, and the PLAY0809 error for any other capture. They also cover ESM v33 and include an inbound translation example that uses the marker. (#891) - AI (Release v7.107.0): The corpus pins the Screenplay tool and its published contract to 4.244.0, so examples using event-source capture keys compile. (#891)
- Arc.Kotlin (Release v7.8.0):
io.cratis.arc.concepts.ConceptAsnow extends the FundamentalsConceptAs; existing concepts and validators keep compiling and linking unchanged, and Arc’s concept JSON format is unchanged (part of #301) - Arc.Kotlin (Release v7.8.0): Builds use Gradle 8.14.6, Hibernate Validator 9.1.5.Final, OpenTelemetry API 1.67.0 and PostgreSQL JDBC 42.7.14
- AI (Release v7.106.0): A
majorpull request is merged by a human after an explicit yes; an agent never merges it, even after confirmation. (#909) - AI (Release v7.106.0): Test hang and crash dump recommendations ask for a mini dump and say to delete the
.dmpfile once its stack has been read. (#909) - cli (Release v3.96.0): Bundles Stage 4.196.0 (from 4.192.0):
cratis runstartscratis/stage:4.196.0by default andcratis renderplans with the same renderer, matching the Stage version Studio uses. Stage 4.196.0 is built against Screenplay 4.240.2 (unchanged). Rendered authorization policies are now named after the modeled policy ({Name}Policy, registered as{Name}) instead of carrying hashes, a validation message that uses$stringswithout a strings catalog is refused withSTAGE-ESM-019, and the semantic specification runner runs Translate slices and many projection shapes it used to report as unsupported (#446) - Ante (Release v1.4.0): Ante refuses to start when an invitation token signing key is shorter than 2048 bits, in any of the current, additional or previous key settings. Replace a shorter key before upgrading. (#117)
- Ante (Release v1.3.9): Readiness diagnostics name the unavailable host event store and reactor in the health report and logs; the public health endpoints still answer with only a status word. (#162)
- Ante (Release v1.3.9): Ante’s specifications now run from the Debug application executable with
--specifications; Release builds and published applications contain no specifications or test dependencies. (#189) - Stage (Release v4.197.0): Applications whose performer bodies cannot be verified now render with explicit implementation gaps and a not-fully-runnable marker instead of aborting rendering. (part of #743)
- Stage (Release v4.197.0): The semantic specification runner keeps
Decimalvalues and whole numbers of 2^53 or more exact inside composite and collection event properties, so projections that copy or read them run instead of being refused; only recursive composite types are still refused. (#749) - Stage (Release v4.197.0): A semantic specification whose child event or child removal has no parent in the run now gets the reference result (the child is never materialized) instead of being reported unsupported. A child that arrives before its parent, or whose event also changes the projection in other ways, is still reported unsupported. (#750)
- Stage (Release v4.197.0): NuGet packages now link to the documentation on cratis.io and include the Cratis icon. (#688)
- Stage (Release v4.197.0): Stage now builds on Cratis.Screenplay 4.241.0, Cratis.Chronicle 19.99.1, Cratis.Arc 22.131.0 and Cratis.Fundamentals 7.26.1.
- AI (Release v7.104.0):
cleankeeps local package stamps that a registered consumer still references, and the local-packaging skill documents per-worktree NuGet caches, when to use local packages, migrating a hand-rolled feed and HTTP feed caching. (part of #885) - Fundamentals.Kotlin (Release v0.3.0): Existing supported concept types retain their JSON wire format while construction moves to the core descriptor path.
- Fundamentals.Kotlin (Release v0.3.0): LocalTime concepts now write seven fractional-second digits, truncating finer nanoseconds; reads accept ISO local times.
- Fundamentals.Kotlin (Release v0.3.0): Builds use Kotlin 2.4.21, Jackson 3.2.4 and Gradle 8.14.6.
- Chronicle.Kotlin (Release v7.0.0): Breaking: import
ConceptAsfromio.cratis.fundamentals.conceptsand implementvalue()instead of a property/getter; Java record accessors now satisfy the interface directly. (part of #151) - Chronicle.Kotlin (Release v7.0.0): Breaking: import
CorrelationIdfromio.cratis.fundamentals.executionand useNOT_SETandvalue(). Recompile consumers; see the migration guide. (part of #151) - Arc (Release v22.138.3): Arc now builds against Cratis Chronicle 19.110.1, together with SharpCompress 0.50.7 and Microsoft.Orleans.Reminders 10.4.0, which that Chronicle release requires.
- Arc (Release v22.138.3): The remaining specifications run as xUnit v3 executables instead of through
dotnet test, and the samples reference only the xUnit v3 attribute package for their inline specifications. (part of #3518) - AI (Release v7.103.7): Screenplay skills explain how to read stored enum-number changes in
semantic-diffand treat number changes, removals and reuse as breaking. (#781) - AI (Release v7.103.7): Screenplay skills describe the
PLAY0516timeline repair’s explicit import-list fallback and its editor quick fixes. (#793) - AI (Release v7.103.7): Screenplay skills show how a
ui profilenames a package theme by its quoted display name. (#813) - AI (Release v7.103.7): Screenplay skills describe safe MCP model-root discovery and sibling model-folder selection. (#839)
- Orleans (Release v1.28.2): PostgreSQL and SQL Server job storage now leave out stopped jobs with a finalized stop in the database, so rehydration no longer loads and deserializes every job ever stopped. In a local PostgreSQL benchmark with 10,000 finalized stops, the read fell from about 314 ms and 123 MB allocated to about 8 ms and 1.3 MB (#147)
- Arc (Release v22.138.1): Update the Cratis.Fundamentals and Cratis.Metrics.Roslyn dependencies to 7.26.1.
- Screenplay.CritterStack (Release v0.26.1): NuGet packages now list Cratis as author, link to the documentation on cratis.io and include tags, icon and README (#93)
- Screenplay.CritterStack (Release v0.26.1): Run specifications as native .NET 10 executables using Specifications 5 and xUnit v3. (#98)
- AuthProxy (Release v2.32.4): Invitation pages now show an email address only when it is made of ASCII letters, digits and
._+-@; any other address leaves{{invitedEmail}}and{{assertedEmail}}blank instead of inserting an encoded value. See Error pages. (#189) - Orleans (Release v1.28.0): The jobs manager now reads rehydration candidates through
GetJobsExcludingFinalizedStops. The in-memory provider filters before building its result; the MongoDB provider filters in the query and adds astatus_stopFinalizedindex to the jobs collection; the SQL provider filters in the query on SQLite. PostgreSQL, MySQL/MariaDB and SQL Server keep filtering after the read. With 10,000 finalized stopped jobs and 100 live jobs, rehydration reads went from about 112 ms to 7.6 ms on SQLite and from about 219 µs to 72 µs in memory. No schema migration is needed, and rolling upgrades are supported. (#125) - Stage (Release v4.195.0): Generated authorization policies are named after the modeled policy: operations bound to the same authorization share one
{Name}Policyclass registered as{Name}, and differing bindings are qualified with the operation and, if needed, the feature path. Names are the same for scoped and application renders and contain no hashes. (#495) - Stage (Release v4.195.0): A validation message that uses
$stringswhen no strings catalog is supplied is refused withSTAGE-ESM-019naming the missing catalog, and canonical golden vectors render$stringsvalidation messages. (#539) - Stage (Release v4.195.0): Rendering specifications reuse generated applications across assertions instead of repeatedly rendering the same application. (#726)
- Stage (Release v4.195.0): A projection mapping that adds or subtracts a product of two event values (
add total by unitPrice * quantity) is now converted to a Stage projection definition instead of being refused.PropertyMappinggains an optionalFactorthat carries the second operand, so a consumer such as Studio can hold the whole mapping. - Stage (Release v4.195.0): Play still cannot run such a mapping: Chronicle’s
$addand$subtracttake one event property, so building the Chronicle definition from a mapping with a factor now fails with a clear message instead of adding the first operand alone. - Ante (Release v1.3.7): Update Cratis.Fundamentals to 7.26.1.
- Ante (Release v1.3.7): Run specifications with Specifications 5 and dedicated xUnit v3 executables. (#187)
- cli (Release v3.95.1): Run CLI and templating specifications as xUnit v3 executables with Cratis.Specifications 5, including the platform checks in CI. (#455)
- cli (Release v3.95.1): Update the CLI’s bundled Cratis.Fundamentals dependency to 7.26.1.
- AI (Release v7.103.6): Local package closure commands derive packing and consumption steps from the dependency map, reject missing or mismatched packages, and restore temporary npm references before checking for leaks. (#895)
- AI (Release v7.103.6): C# specification guidance now covers Specifications 5 and xUnit v3 executable runners, lifecycle isolation, and runner-specific filters. Cratis.AI uses Fundamentals 7.26.1. (#893) (#879)
- AI (Release v7.103.6): Follow-up issues created by agents now include concrete, testable acceptance criteria. (#533)
- AuthProxy (Release v2.32.3): Update Cratis.Fundamentals to 7.26.1.
- AuthProxy (Release v2.32.3): Run specifications with Specifications 5 and xUnit v3 executables. (#212)
- Prologue (Release v2.0.5): Update the Prologue runtime to Cratis.Fundamentals 7.26.1.
- Prologue (Release v2.0.5): Run Prologue specifications with Cratis.Specifications 5 and xUnit v3, with dedicated Extractor and Interpreter specification projects. (#57) (#58)
- Prompter (Release v0.2.5): Update the Prompter runtime to Cratis.Fundamentals 7.26.1.
- Prompter (Release v0.2.5): Run Prompter specifications with Cratis.Specifications 5 and xUnit v3. (#40)
- Screenplay.Generation (Release v0.18.2): NuGet packages now list Cratis as author, link to the documentation on cratis.io and include tags, icon and README. (#77)
- Screenplay.Generation (Release v0.18.2): Run specifications as .NET 10 executables using Cratis.Specifications 5 and xUnit v3, while retaining Release compilation of the libraries for .NET 8, 9, and 10. (#82)
- Arc (Release v22.138.0): Command scenarios cache constraint and command-dependency discovery, so each scenario no longer re-scans them. (#3496)
- Orleans (Release v1.27.4): The Cratis.Orleans packages now depend on Cratis.Fundamentals 7.26.1. (#142)
- Specifications (Release v5.0.0): All packages target
net10.0only. Specification projects on .NET 8 or .NET 9 stay on 4.x. (part of #74) - Specifications (Release v5.0.0): xUnit v2 and v3 run
EstablishandBecauseonce per specification class by default, as NUnit, TUnit and the native runner already did. Remove any hand-written[assembly: Xunit.TestFramework(...)]that registers Cratis Specifications; opt a class, assembly or project out with[PerFactSpecificationLifecycle]orCratisSpecificationsSharedLifecycle=false. (part of #74) - Specifications (Release v5.0.0):
CRSPEC0008(a fact modifies the shared specification context) is an error. Move the change intoEstablishorBecause, or opt the class out of the shared lifecycle. (part of #74) - Specifications (Release v5.0.0): Specifications show readable names in every package (
Author › when registering › should keep the name). SetCratisSpecificationsReadableNames=falseto keep the original names. (part of #74) - Specifications (Release v5.0.0): The
Should*assertions andSpecificationAssertionExceptionlive inCratis.Specificationsand behave the same in every package; types are forwarded, so recompile against 5.0. KeepCratis.Specificationsand the framework package on the same version. (part of #74) - Specifications (Release v5.0.0): Assertions taking
Predicate<T>takeFunc<T, bool>, and NUnit 4ShouldEqual(params)compar - Screenplay (Release v4.241.0): The Screenplay language is no longer frozen at ESM v28: new constructs can be admitted again, each byte-changing change with its own ESM version, delivered once Stage admits it or refuses it with a typed refusal. See https://github.com/Cratis/Screenplay/blob/main/decisions/0105-lift-the-screenplay-language-freeze.md (#1035)
- Screenplay (Release v4.241.0): Moving a declaration through the C# workspace API now refuses the same cases as the MCP
propose-movetool: a specification shared with a declaration that stays, or a move that leaves a specification obligation unmet. Carried specifications are computed automatically; a supplied list must match them. (#965) - Screenplay (Release v4.241.0):
propose-moverefusals now report the standardProposalRejectedfailure kind with the usual rejection fields. (#965) - Screenplay (Release v4.241.0): Admissible samples and the new-model examples start with explicit protected command reads. (part of #1007)
- Screenplay (Release v4.241.0): NuGet packages now include the Cratis icon, and packages without their own tags get Screenplay tags. (#1020)
- Screenplay (Release v4.241.0): The
@cratis/screenplay-languagenpm package now lists Cratis as author and links to the Screenplay documentation. (#1020) - Specifications (Release v4.5.0): The CRSPEC analyzers ship only in the
Cratis.Specificationspackage, so a project referencing several Cratis.Specifications packages loads them once. (#84) - Specifications (Release v4.5.0):
ShouldContainOnlychecks collections of 16 or more items with a counted lookup instead of a quadratic search in the xUnit, TUnit and runner packages; failure messages are unchanged. (#84) - Specifications (Release v4.5.0): The native runner’s source generator skips its work in projects that do not reference
Cratis.Specifications.Runner. (#84) - AI (Release v7.103.4): The Go rule now carries guidance on API design, error types,
Closeownership, generics,errgroup, security, regression tests, and compatibility and releases, so Go repositories no longer need a locally edited copy of it. (#888) - AI (Release v7.103.2): The hook specifications (
test:hooks) run in under a minute, because the large guard and quality-gate spec files are split so they run in parallel. (#872) - Specifications (Release v4.4.0): Refresh the vendored Cratis AI corpus, adding the .NET performance, diagnostics, MSBuild, Orleans, testing and refactoring skills.
- AI (Release v7.103.1): The Screenplay skills now warn about the traps found in SoloCRM run 2: generated identifiers for new entities and the
forpin in specifications, a STAGE-ESM-017 checklist with bisecting throughrender --check, where hand-written queries go, managed-artifact refusals, PLAY0269 not being evidence of rendering, application titles, footers and action labels, a run-and-verify recipe, and running the specs before calling a model done (#854) - AI (Release v7.103.1): The Stage admission reference now says that a projection may map onto the identifier when the mapping restates the key: the key’s own event property,
$eventSourceIdfor an event-source key, or the same literal. - AI (Release v7.103.1): The
ai-verificationtest suite no longer runs the full corpus verification eight times. Frontmatter variants are checked directly against the real skill, and three end-to-end runs (accepted corpus, a rejected trigger, CI without a base) run side by side. (#875) - AI (Release v7.103.1): The agent-harness entrypoint fixtures run through one runner,
Source/AgentHarnesses/run-entrypoint-fixtures.sh, that runs independent fixtures concurrently and keeps every exit code. On a non-Linux developer machine the four Linux-only fixtures report SKIPPED with the reason; on Linux and in CI they always run. (#876) - AI (Release v7.103.0): The secrets guard now also blocks
env-style dumps behindcommand -p, attached and clustered short options such asgrep -ePATTERN .envandgrep -nT x .env, whole-objectjsonpath='{.}'/go-template='{{.}}'projections, redirects to/dev/stdout,/dev/stderror file descriptors, redirects placed before a subcommand such askubectl get 2>&1 secrets, and environment dumps redirected to a file. Piped shells and recursive searches with no named file stay documented limits insecrets.md. (#871) - AI (Release v7.103.0): The write guard spawns far fewer subprocesses on every tool call (about half the time per call), and the slow guard specs run their cases concurrently. (#870)
- AI (Release v7.103.0):
yarn testholds the full verification suite to a wall-time budget (1200 s by default,CRATIS_TEST_BUDGET_SECONDSto override); over budget it warns locally and fails in CI. (#870) - AI (Release v7.103.0): A Screenplay version mismatch now names the command that fixes it, and the publish workflow installs the tool through the same script. (#869)
- AI (Release v7.103.0):
cratis-check-prrun directly in a Cratis repository with no policy caller now exits non-zero with remediation text instead of checking against the reviewed pin. (#855) - AI (Release v7.103.0): Pull-request guidance now says a release that changes a hook must tell consumers to run
cratis ai update. (#855) - AI (Release v7.103.0): Hook scripts changed in this release: r
- Arc (Release v22.136.7): Command scenarios whose command declares read protection or protected decision dependencies now build only the decision event store instead of also building and discarding a full in-memory event scenario, cutting per-scenario setup allocation by roughly 40%. In this automatic decision mode
Context["Chronicle.EventScenario"]is absent and theEventScenariofacade is unavailable. (#3509) - Arc (Release v22.136.6): Arc now takes its per-universe derived types from Cratis Fundamentals’
DerivedTypes.Forand requires Cratis.Fundamentals 7.26.0 or later. (#3503) - Specifications (Release v4.2.0):
Establish,BecauseandDestroynow run through a cached invoker shared by all packages, so specifications start faster (part of #61) - Specifications (Release v4.2.0):
Should*assertion failure messages are only formatted when an assertion fails (part of #61) - Specifications (Release v4.2.0): The specification analyzers do less work per symbol, so builds with many specifications are faster (part of #61)
- AI (Release v7.102.0): NuGet packages now list Cratis as author, link to the documentation on cratis.io and include tags, license, icon and README (#848)
- AI (Release v7.102.0): The
@cratis/aiand@cratis/pinpm packages now link to the documentation on cratis.io, and@cratis/aiships a README (#848) - Chronicle (Release v19.108.1): Projection replay now reports handled-event counts once per page instead of once per event, and stores the counts for many partitions in one bulk write. Replays make far fewer observer calls and storage writes and finish much faster (#5263)
- Arc (Release v22.136.5): Command and query scenarios initialize faster: Arc now builds the derived types and the discoverable validator types once per type universe and reuses them across every
AddCratisArcCorecall that holds the same universe, roughly halvingCommandScenariosetup time. (part of #3503) - Fundamentals (Release v7.26.0):
GetDerivedTypeForonDerivedTypesresolves a derived type by identifier with a direct lookup instead of scanning the registrations. (#1203) - AI (Release v7.101.0): Reviewer agents (
code-reviewer,security-reviewer,performance-reviewer,screenplay-reviewer,repository-investigation-reviewer) now use the reviewer tier and must run on a different provider than the author; where the harness cannot select one, the review statessingle-provider, and a provider error yieldsincompletewith one fallback rather than a failed verdict (#859) - AI (Release v7.101.0): Corpus agent definitions no longer say they inherit the session model; bind a tier to a concrete model in a project-level agent override (#859)
- Chronicle (Release v19.107.0): A node that cannot exchange grain calls with an older node now logs a critical message naming the startup step and saying that every node must be stopped before starting the new version, instead of failing only with
Unable to resolve type alias. Upgrading from a 19.x release before 19.106, or to a new major, still needs a full stop. See Roll out a new version to a multi-node Chronicle cluster. (#4325) - Chronicle (Release v19.107.0): The rolling deploy guide now covers
MongoDBclustering as well asSql, and starts with which versions can run side by side. - Chronicle (Release v19.106.7): The kernel resolves every materialized read-model read (paged, by key, all instances and observed) through one read-binding seam. Reads still address the same collection and the same explicit occurrence as before, so behavior is unchanged; this prepares serving several projection generations side by side. (part of #5163)
- Chronicle (Release v19.106.6): A kernel state reset keeps every event store’s generation floor. (part of #5223)
- cli (Release v3.94.0): Bundles Stage 4.192.0 (from 4.190.12):
cratis runstartscratis/stage:4.192.0by default andcratis renderplans with the same renderer. Rendered applications and the live Stage now use React Aria through@cratis/componentsby default; a Screenplay that wants PrimeReact lists it in its ui profile (packages→PrimeReact). Stage 4.192.0 is built against Scene 4.80.2 and@cratis/components4.34.0 (#445) - cli (Release v3.94.0):
cratis renderscaffolds a PrimeReact application, with its packages and provider, when the Screenplay’s ui profile listsPrimeReact, and the React Aria application otherwise; Stage accepts the rendered application in both cases (#445) - Chronicle (Release v19.106.4): MongoDB read-model sinks never clear, drop or rename the collection that is serving queries, or any collection other than the one they own in the current replay or promotion phase. A promotion re-checks the replay collection’s identity before renaming it into place. A refused operation fails loudly instead of touching the wrong collection. (part of #5158)
- Stage (Release v4.191.0): Without
PrimeReactin the ui profile, the generated frontend no longer installs or loads PrimeReact, primeicons or the PrimeReact theme, and shows no PrimeReact licence banner. Components such asdataTableresolve to@cratis/components. A Screenplay that uses PrimeReact-only components, such asinputText, listsPrimeReactin its ui profile to keep them. (#707) - Stage (Release v4.191.0): Stage resolves component names in one fixed package order: core, then
Cratis.Components, then the libraries the profile lists, then blueprints, using Scene’shostProfilePackages. (#707) - Stage (Release v4.191.0): Stage uses Scene 4.80.2 and
@cratis/components4.34.0. (#707) - Chronicle (Release v19.106.0): Stored, active webhooks are checked against the current target policy before their observer subscribes, including after a restart. In
Enforce, a rejected target or OAuth authority puts the observer in quarantine with the reason logged. The webhook definition and its active flag are left unchanged. InWarn, the default, the violation is logged once per activation and delivery continues. (#5107) - Chronicle (Release v19.106.0): Clearing a webhook observer’s quarantine checks the policy again first, so the observer stays paused while its target is still not allowed. Fix the target, the allowed hosts or the validation mode, then clear the quarantine. (#5107)
- Chronicle (Release v19.106.0): A delivery rejected by the target policy when connecting, for example because the host now resolves to a private address, pauses the webhook observer as a configuration problem instead of being retried for the 24-hour retry budget. (#5107)
- cli (Release v3.93.10): Bundles Stage 4.190.12 (from 4.190.8):
cratis runstartscratis/stage:4.190.12by default andcratis renderplans with the same renderer. Stage 4.190.12 is built against Screenplay 4.240.2 (unchanged) and Scene 4.79.1. Its semantic specification runner now runs specifications it used to report as Unsupported, and rejection specifications pass or fail on the expected rejection (part of #446) - Stage (Release v4.190.12): The semantic specification runner refuses only the specifications that reach a Translate slice or a public or foreign event; other specifications in the same model now run instead of all ending as Unsupported (part of #721)
- Screenplay (Release v4.240.3): Acme Commerce, Sales / Orders: the module declares
toolbar actionswith Approve order (Decision.ApproveOrder, primary) and Cancel order (Fulfilment.CancelOrder, quiet, asks first) - a module toolbar reaches every screen of the module; the Approval feature declares its own with Reject order (asks first) and Apply discount. - Screenplay (Release v4.240.3): Acme Commerce, Warehouse / Stock: Receiving declares Receive shipment (
ReceiveStock) and Dispatch declares Dispatch shipment (DispatchShipment). - Screenplay (Release v4.240.3): New MCP spec: an agent gives a module an empty toolbar and then adds a button linked to a command of one of its features through the typed nodes. The docs say an empty
toolbaris valid. - Screenplay (Release v4.240.3): Conformance golden
invoicing-sample.syntax.json: the sample note that leaves the default colour unsaid (since #1026) isnullin the golden, so the C# and TypeScript compilers agree again. - Screenplay (Release v4.240.3):
render-blueprint-samples.cjsloads each published blueprint package as the ES module it ships;@cratis/componentsis ES-only since 4.34 and the CommonJS build of the blueprints failed withERR_PACKAGE_PATH_NOT_EXPORTED: './Common', which failed the Render Blueprint Samples check for every pull request. All 15 packages checked locally. - Arc (Release v22.136.0):
Observe,ObserveSingleandObserveByIdonIMongoCollectionnow use the shared per-database change stream owned byIMongoDBWatcher, with no configuration. A page with 30 observable queries holds one change stream instead of 30. - Arc (Release v22.136.0): Observations attach to the shared stream before their initial query, so a change made while it runs is applied afterwards instead of lost.
- Arc (Release v22.136.0): Inserts into an observed collection are now checked against the observed filter with one lookup by id, as updates already were, because the shared stream cannot be narrowed by it. Observations that take every document skip the lookup.
- Arc (Release v22.136.0):
IMongoDBWatcherhas a newGetChanges(string databaseName)member that exposes the shared stream. Custom implementations of the interface must add it. - Arc (Release v22.136.0): A failed shared stream reconnects with backoff and resumes from its last change, so a transient connection failure no longer ends collection observations.
- Stage (Release v4.190.10): A row of a read model is keyed
id, while a command acts on that entity by<entity>Id(productIdfor the rows ofProductReadiness). A row now also answers to the key named after each word of its query’s name, so a feature toolbar button that opens a slice’s task dialog finds the row that is its entity: the button waits, disabled with “Select a row first”, until a row is selected, and the dialog no longer asks for the key but submits the selected row’s id. The same keyed rows serve the guarded action and the confirm dialog. A row that already carries a property of that name keeps it, and rows of another entity do not hold the button back. - Scene (Release v4.80.0): The default blueprint shell (sidebar, topbar, user menu and configuration panel) is built on
@cratis/componentsand React Aria, and no longer installs or loads PrimeReact. (#250) - Scene (Release v4.80.0):
@cratis/scene.blueprint.defaultand@cratis/scene.componentsno longer depend on PrimeReact or primeicons. Apps that use PrimeReact list it in their UI profile (packages→PrimeReact). (#250) - Scene (Release v4.80.0):
@cratis/scene.blueprint.defaulttakes@cratis/components(^4.34.0),@cratis/arc,@cratis/arc.react,@cratis/fundamentalsandreflect-metadataas peer dependencies that the app provides, so an app gets a single copy of the component library. (#250) - Scene (Release v4.80.0): A template that needs a package its own package does not depend on, such as the PrimeReact-based gallery templates, is offered only when the profile includes that package. Otherwise a diagnostic explains how to add it. (#250)
- cli (Release v3.93.9): Bundles Stage 4.190.8 (from 4.188.2) and Screenplay 4.240.2 (from 4.239.0), the set Studio runs in production:
cratis runstartscratis/stage:4.190.8by default andcratis renderplans with the same renderer, built against Screenplay 4.240.2 and Scene 4.78.6. The CLI no longer trails Stage by two releases (Cratis/cli#446, Cratis/StudioIssues#1078). - cli (Release v3.93.9): Documented bundled versions updated (
runandscreenplayreferences). - Stage (Release v4.190.9): Scene 4.79.1 (NuGet engine and model, npm runtime, shipped frontend package set and its lock file): no change to what Play draws; Studio follows with the same release.
- Chronicle (Release v19.105.0): SQL joins and child removals filter candidate rows in the database before loading documents, while preserving existing path and value matching. (#5196)
- Chronicle (Release v19.105.0): The Connections, Contracts, Workbench and Infrastructure NuGet packages now have descriptions, and Infrastructure has tags. (#5235)
- Chronicle (Release v19.105.0): The Maven
io.cratis:chronicle-contractsartifact is now described as generated gRPC contracts instead of a Kotlin client, and the Maven, Hex and Python contracts packages link to the documentation on cratis.io. (#5235) - Stage (Release v4.190.8): With the sandbox identity enabled, the identity request a Stage page makes as soon as it loads (
/.cratis/me) is authenticated as the persona being played - the default persona when nothing selects another - as the/apirequests are, instead of being the one request without a persona. - Stage (Release v4.190.7): A toolbar button that opens the task dialog of a slice (a button a feature adds to the toolbar of its screens, such as Acme Catalog’s Approve product and Withdraw product) now acts on the row the person selected when the screen lists rows that carry the key the slice’s command acts on: the button waits, visible and disabled with the title “Select a row first”, until a row is selected, and its dialog no longer asks for the key but submits the selected row’s. A command whose key no row of the screen carries is not held back, and the dialog still asks for a key nobody supplies.
- Arc (Release v22.135.0): The
@cratis/eslint-plugin-arcnpm package now links to the Cratis Arc documentation (#3483) - Scene (Release v4.78.5): NuGet packages now list Cratis as author, link to the Screenplay documentation on cratis.io and include the Cratis icon (#245)
- Scene (Release v4.78.5): npm packages now link to the documentation on cratis.io, and the
@cratis/scene.componentsdescription no longer claims PrimeReact and Tailwind dependencies it does not have (#245) - Scene (Release v4.78.4):
NavigationActivationPolicy.leftOut: a host can say a destination’s screen is left out on purpose. Such a destination resolves (a navigation item for it draws nonavTargetMissingmarker) and, when activated, is reported withnavigated: falseinstead of being opened. - Scene (Release v4.78.4):
ScenePreviewHostsets it for a preview of one slice, which draws only the screens the slice owns and those nobody owns. Module, feature and application previews are unchanged: a missing target is still marked there. - cli (Release v3.93.8): Bundles Screenplay 4.239.0 (from 4.236.0);
cratis screenplay validateandcratis renderaccept personagoallines andsticky noteblocks on the personas canvas (Cratis/Screenplay#1014). Needed so the Screenplay domain samples with persona goals and notes render in the blueprint sample job. - Screenplay (Release v4.239.0): The five Acme Commerce domains, Commerce, TimeTracking, Invoicing and Library now state goals and carry sticky notes (context, pain points, success, open questions) on their personas canvas.
- Stage (Release v4.190.3): Hand-written command handler code now renders with a return type that follows its body:
voidwhen it returns nothing, the event type when it returns onenewevent, andIEnumerable<object>foryield return, collections or anything else, so a handler that returns a single event compiles. (#668) - Stage (Release v4.190.3): Stage Play and generated applications now use Scene 4.78.3.
- Arc.Kotlin (Release v7.7.1): Maven artifacts now use canonical Cratis Arc names and link to the Kotlin documentation on cratis.io (#296)
- cli (Release v3.93.7): The Cratis CLI NuGet package now lists Cratis as author and links to its repository (#442)
- Components (Release v4.34.1): The adapter, conformance, migrator and ESLint npm packages now link to the Cratis Components documentation and the adapter, conformance and migrator packages have keywords (#447)
- Arc.Go (Release v0.1.2): The package documentation on pkg.go.dev now opens with a clearer summary, and the README links to the documentation on cratis.io (#89)
- Fundamentals.Go (Release v0.3.3): The package documentation on pkg.go.dev now opens with a clearer summary, and the README links to the documentation on cratis.io (#62)
- Chronicle.Go (Release v0.11.1): The package documentation on pkg.go.dev now opens with a clearer summary, and the README links to the documentation on cratis.io (#110)
- Templates (Release v1.8.1): NuGet packages now list Cratis as author, link to the documentation on cratis.io, declare the MIT license and include an icon and README (#89)
- AuthProxy (Release v2.32.1): NuGet packages now list Cratis as author, link to the documentation on cratis.io and include tags, icon and README (#206)
- Chronicle.Elixir (Release v3.14.3): The Hex package now uses the canonical Cratis Chronicle description and links to the Elixir client documentation on cratis.io (#178)
- Ante (Release v1.3.5): NuGet packages now list Cratis as author, link to the documentation on cratis.io and include an icon (#180)
- Orleans (Release v1.27.2): NuGet packages now list Cratis as author, link to the documentation on cratis.io and include tags, icon and README (#134)
- Prologue (Release v2.0.4): NuGet packages now list Cratis as author, link to the documentation on cratis.io and include tags, icon and README (#53)
- Specifications (Release v4.1.3): NuGet packages now include the Cratis logo as package icon (#58)
- Narrator (Release v3.0.3): The Marketplace listing now links to the Cratis Chronicle documentation (#38)
- Chronicle.Kotlin (Release v6.15.1): Maven artifacts now use canonical Cratis Chronicle names and link to the Kotlin client documentation on cratis.io (#147)
- Fundamentals (Release v7.25.2): NuGet packages now include the Cratis logo as package icon (#1201)
- Architecture (Release v1.0.3): NuGet packages now list Cratis as author, link to the documentation on cratis.io and include tags, icon and README (#43)
- Stage (Release v4.190.0): The toolbars a feature and a module declare (Screenplay
toolbar <name>in afeature/modulebody) become the buttons of thetoolbarslot (oractions) of the template every screen beneath them fills, after the screen’s own toolbar. A template the document declares tells whether it has such a slot; a template of a package is taken to have the usual one; Level-1 screens and templates without a toolbar slot get nothing. - Stage (Release v4.190.0):
confirmon a toolbar item and a button is carried tocore:toolbarItem(written only when set, so a toolbar that never asks keeps its Scene bytes). - Stage (Release v4.190.0): Run Screenplay 4.238.0 and Scene 4.78.0 (confirm in the toolbar item), Studio-facing docs and the conformance matrix follow.
- Stage (Release v4.190.0): Audit entries for the new
ToolbarsandConfirmmembers. - Stage (Release v4.189.6): A screen that fills a dialog template (
QuickCreateDialog,ConfirmDialog,SideSheet, …) is ordered after the pages of the Scene, so an application or a feature opens on a page, never on the dialog of a command that precedes its list on the board. (#678) - Screenplay (Release v4.238.0): A
featureand amodulebody accepttoolbar <name>with the sameitem/buttonlines as a screen toolbar. The entries are the feature’s own buttons for thetoolbarslot of the screens beneath it, each linked to a command of the feature (item <id> action <Command>) or to a State Change slice (button). - Screenplay (Release v4.238.0):
confirm "<text>"(or a$strings.token) on a toolbar item and on a button: the question the user answers before the command runs or the dialog opens. - Screenplay (Release v4.238.0): C# and TypeScript compilers, printer (round trip), syntax walker, folder merge, syntax JSON/schema (members omitted when empty, so existing documents keep their bytes), contract golden,
grammar.md,screens.md,diagnostics.md. - Screenplay (Release v4.238.0): New diagnostic
PLAY0808(warning): a feature/module toolbar item links a command no slice of the feature declares. - Screenplay (Release v4.238.0): New conformance vector
feature-toolbars(TypeScript golden agrees with C#). - Scene (Release v4.78.0):
core:toolbarItemtakes an optionalconfirmtext. The item asks first (accessiblealertdialog: the question, Cancel, and the button’s title as the accept action; Escape cancels) and only then opens the slice dialog or announces the command. Withoutconfirmnothing changes. - Scene (Release v4.78.0): The toolbar item descriptor lists
confirm(“Confirmation”) so design mode can edit it; the default blueprint styles the confirmation card. - Scene (Release v4.78.0): Documented with the other toolbar item properties.
- Chronicle (Release v19.104.0): Webhook retry deadlines, retry counts and the resume position are stored, so a restart or reactivation no longer makes delivery retry early or use up an extra attempt. A manual partition retry overrides a pending deadline. (#5106)
- Chronicle (Release v19.104.0): A
429or503with a validRetry-After(seconds or HTTP date) defers the partition until that time without using up a retry attempt. (part of #5108) - Chronicle (Release v19.104.0): A
4xxresponse other than408,410and429is treated as a configuration problem: the webhook observer pauses instead of retrying the same request. Fix the configuration and clear the quarantine to resume. (part of #5108) - Chronicle (Release v19.104.0): A
410 Goneresponse parks the partition immediately, with no automatic retries. (part of #5108) - Chronicle (Release v19.104.0): Each webhook delivery makes a single HTTP attempt. Retries are handled by the observer instead of retrying inside the HTTP client, so a failing receiver no longer ties up a worker.
Webhooks:RetryDelaySecondsis kept for compatibility but no longer has any effect. (#5106) - Chronicle (Release v19.104.0): Catch-up and replay jobs wait for a partition’s pending retry deadline instead of delivering around it. (#5106)
- Chronicle (Release v19.102.0): The ASP.NET Core request unit of work no longer resolves its event store when the request starts. It binds on the first operation that needs the store, so a claim-based namespace resolver sees the authenticated user, and requests that never use Chronicle or are rejected by authorization no longer need a namespace. See Authentication and tenant namespaces. (#5194)
- Scene (Release v4.77.0):
kanbanBoardreads its cards from the properties a row actually has:cardId,cardTitle,cardColumn,cardAssigneename the row properties that identify the card, name it, hold its column and its assignee, andcardFieldslists up to three more properties to show on the card (field,label). A name left out reads the card shape’s own (id,title,column,assignee), so existing boards and templates are unchanged. - Scene (Release v4.77.0): The properties are in the component’s descriptor (editor, Studio import/export, MCP) and documented in
foundation-components.mdwith the Screenplay form. - Stage (Release v4.189.0): Scene is now 4.76.0, which adds
Screen.ownerand loads only the previewed slice’s screens in the preview host. - Chronicle (Release v19.101.3): Kernel projections can no longer be declared with global scope. During a rolling upgrade, the global statistics projection registered by older kernels is ignored with a warning and retired, so it is not recreated once the registration runs on the new version.
- cli (Release v3.93.6): Bundles Stage 4.188.2 (from 4.188.1);
cratis runstartscratis/stage:4.188.2by default, andcratis renderplans with the same renderer. A played details screen waits for a selection instead of showing an empty record (Stage#653). - Scene (Release v4.76.0): Previewing a slice loads exactly the screens that slice owns plus the screens no slice owns; the shell, layouts, root template and screen templates still come with the document. A screen another slice owns is neither composed nor routable. Module and feature previews are unchanged, and a document without owners behaves as before.
- Chronicle (Release v19.101.1): The proposed projection generations decision record now describes a backward-compatible path: generations are off by default behind a kernel feature flag, promotion stays automatic by default, and existing read-model collections and tables are adopted as the first generation without conversion or downtime. See 0014 — Projection generations. (part of #5157)
- Chronicle (Release v19.101.0): Unique-constraint claims derived from personal data now record the subject they belong to, and erasing that subject removes its claims from every event sequence. If removing a claim fails, the erasure is reported as incomplete instead of succeeding. (part of #4389)
- Chronicle (Release v19.101.0): Upgrading rebuilds the unique-constraint indexes that cover personal data so that existing claims record their subject. Values held by subjects erased before this release become available again. (part of #4389)
- Chronicle (Release v19.101.0): While such a constraint rebuilds after the upgrade, appends governed by it are refused until the rebuild completes. (part of #4389)
- AI (Release v7.98.0): The discoverability rule and skill cover sourced “at a glance” fact blocks and careful download claims: counted per product through entry packages, including predecessor packages, rounded down, dated, and never presented as users. (#844)
- AI (Release v7.98.0): Publishing guidance covers package and repository metadata (Cratis as author, documentation as project URL, GitHub About and Docker Hub descriptions, canonical help links), keeps docs lint baselines and LLM export budgets intact, and limits structured data to approved public founder facts. (#844)
- cli (Release v3.93.5): Bundles Stage 4.188.1 (from 4.188.0);
cratis runstartscratis/stage:4.188.1by default, andcratis renderplans with the same renderer. A played screen on a blueprint template no longer draws the template’s demo copy in the slots it does not fill (Stage#641). - Stage (Release v4.188.3): A modeled specification whose given or appended event has no event source is now refused with STAGE-ESM-051, which names the specification and the event, instead of the generic STAGE-ESM-011. When rendering around refusals, Stage still renders the application and omits only that specification. (#630)
- Chronicle (Release v19.100.0): In every mode, webhook and OAuth requests no longer follow redirects, cloud metadata addresses (
169.254.169.254,fd00:ec2::254) are never contacted unless allow-listed, and registration errors no longer include the receiver’s response body. (part of #5107) - Stage (Release v4.188.2): A
screen.keys.<name>binding (adata ... by <name>declaration) that neither the address nor the session carries now reads the property of the row the user selected. A master-detail screen whose details query is readby supplierIdtherefore waits (empty) until a master row is selected and then shows that row’s details. - cli (Release v3.93.4): Bundles Stage 4.188.0 (from 4.187.2);
cratis runstartscratis/stage:4.188.0by default, andcratis renderplans with the same renderer. Aseedblock with a DateTime written as"2026-10-10T08:00:00Z"no longer leaves its event source unseeded when played (STAGE-SEED-005, Stage#650). - Chronicle (Release v19.99.1): Azure Key Vault used as the encryption key store must allow purging deleted secrets: grant the purge permission and do not enable purge protection on that vault, otherwise erasing a subject fails. (#3674)
- Arc (Release v22.134.0): Read protection now takes command key properties and read-model key types from the metadata Arc’s source generator emits, falling back to reflection only for types without generated metadata and logging a warning once per type when it does. Key selection,
[LookUpBy], and the invalid and ambiguous lookup errors behave as before. (part of #3321) - cli (Release v3.93.2): Bundles Stage 4.187.2 (from 4.187.1);
cratis runstartscratis/stage:4.187.2by default, andcratis renderplans with the same renderer. A command form of a Stage served under a path prefix posts under that prefix instead of to the root of the host (Stage#618). - cli (Release v3.93.1): The Screenplay MCP server and other Screenplay commands now use
<project>/Screenplayas the model folder whenSourceorsrcholds no.playfiles or Screenplay state, instead of treating the application’s source folder as the model. (#428) - AI (Release v7.97.1): When Claude Code words a failure itself (a message from its own synthetic model, for example “There’s an issue with the selected model”), a short credential-free excerpt of that text is kept in the failure reason, alongside the vendor’s own error message from the API error body. Text of ordinary assistant messages is still dropped.
- cli (Release v3.93.0): Bundles Stage 4.187.1 (from 4.186.0) and Screenplay 4.236.0 (from 4.226.0);
cratis runstartscratis/stage:4.187.1by default, andcratis renderplans with the same renderer. Rendering now accepts a read model that a performer answers a query for (the query is generated as a stub naming the performer file, with the route, parameters and authorization the model states), where it used to be refused withSTAGE-ESM-007(Cratis/Stage#596). - Chronicle (Release v19.98.0): The kernel caches client-credentials access tokens per token endpoint, client, scope and secret, shares one in-flight token request between concurrent senders, refreshes a token shortly before it expires, and retries a webhook delivery once with a fresh token when the receiver answers
401 Unauthorized(#5139) - Stage (Release v4.187.0): Moves to Screenplay 4.236.0, which carries the performer query’s authorization on its shape (Cratis/Screenplay#995) and ESM v31. Stage still admits ESM v1 to v30 pairs, so v31 models keep the
STAGE-ESM-016refusal; the conformance matrix records those cells against Cratis/Stage#635, and the semantic surface ledger names the new members. - Scene (Release v4.75.3): An action (
core:action) that names no label is labelled with its command read as a sentence (ChangeBasketQuantitybecomesChange basket quantity, an acronym keeps its shape) instead of the bare command name, and is drawn as a button with the default blueprint’s toolbar look (scene-toolbar-button) and the command it runs ondata-scene-command, instead of unstyled text. (Cratis/StudioIssues#946: the row actions of the Acme Commerce Storefront basket) - Chronicle (Release v19.96.0): The Chronicle server now uses Cratis Arc 22.131.0 (#5154)
- Chronicle (Release v19.96.0): Validation failures returned by the server’s management commands now report member names in camelCase (for example
nameinstead ofName), matching Arc’s validation contract (#5154) - AI (Release v7.96.2): The Claude Code failure reason includes a short excerpt (at most 300 characters, credential patterns removed) of the vendor’s own error message from the API error body the CLI echoes, for example the tool definition or model it refused. Text outside that error body is still dropped.
- Arc (Release v22.132.1): The HTTP connection resolver refuses a
ClientCredentialstoken endpoint that does not use HTTPS, so the client secret is never sent in clear text. HTTP stays allowed on loopback hosts for local development. (#3469) - cli (Release v3.92.0): Bundles Stage 4.186.0 (from 4.178.2);
cratis runstartscratis/stage:4.186.0by default, andcratis renderplans with the same renderer. A rendered command form presents an enumeration as a choice, a record as a group of its members and a collection as a list, and a form that populates via a query starts from what the query answered; a property binding or data declaration anywhere on a page (the basket count in a shell’s topbar) runs and follows a command (Stage#610, Stage#613). - Chronicle (Release v19.95.0): SQL storage serializes schema provisioning across kernel processes with a database lock, so several kernels starting at once against one SQL Server or PostgreSQL database no longer race to create or upgrade the same tables (#5137)
- Chronicle (Release v19.95.0): SQL storage persists observer in-flight events and handled counts in the database, so they survive a kernel restart and are shared between kernels using the same database (#5136)
- Chronicle (Release v19.95.0): Groundwork for running the kernel as a multi-node cluster on SQL storage (part of #5127)
- Chronicle (Release v19.94.0): Against a kernel with idempotent appends, a reactor that returns different events for a delivery whose events are already appended now fails the partition instead of appending a duplicate. The failure message names the remedy: raise the reactor’s effect epoch, or mark the handler
[OnceOnly]. Build returned events from the triggering event and stable state, not from a freshGuidor the current time. (part of #4809) - Chronicle (Release v19.94.0): Against a kernel without idempotent appends, returned events are appended unkeyed as before and one warning is logged per reactor; a key the handler set itself throws
IdempotentAppendsNotSupported. (part of #4809) - Stage (Release v4.186.0): A specification that appends an event the event log refuses because of a constraint (
when append <event>thenthen error "<the constraint's message>") renders: the generated scenario seeds the given events, appends the event through the in-process event log and asserts that the append failed with that constraint, with that message, and that nothing else was appended. The given events must really make the append violate the constraint; anything else keeps theSTAGE-ESM-011refusal, now naming why. - Stage (Release v4.186.0): A reaction refusal scenario renders when the command it invokes has generated properties pinned with
given generated <Command>.<property>, reads (reads) or has constraint-target events among its productions: the scenario pins the generated values, runs in a scenario typed by the command (so Arc reads the decision state the given events seed), the real command pipeline enforces the constraint, and the events the reaction appends are read back from the event log. A constraint-target event among a refusal branch’s productions is still refused. - Stage (Release v4.186.0):
given generated <Command>.<property> = <value>on a specification whose action is that command pins the generated value of the action; renderer, admission and the specification executor all read it so. - AI (Release v7.96.1): A provider failure that reaches a pooled chat call names the provider, its vendor and the model it was asked for, so “No AI provider could serve the Modeling agent” says which member failed and why.
- AI (Release v7.96.1): A Claude Code member that answers with an authentication, billing or invalid-request failure no longer ends the whole pool: the call moves on to the next member and, when none can serve it, the first refusal is the answer.
- Stage (Release v4.185.0): A command form presents an enumeration as a choice among its values, a record as a group of its members and a collection as a list the shopper adds to and removes from. The form schema now carries the members of records, the elements of collections and the values of enumerations.
- Stage (Release v4.185.0): A form that populates via a query starts from what the query answered - every member the answer carries, the members the form does not list included - so a review step submits what the earlier steps gathered. An enumeration the read model stored by position is brought to the name the command takes.
- Stage (Release v4.185.0): A command dialog closes once its command succeeded, so the next step of a wizard is reachable again.
- Stage (Release v4.185.0): Stage reads every query that a property binding or a data declaration names, wherever on the page it sits (the basket count in a shell’s topbar, the summary of a product page), and reads it again after a command; what the rendered components publish reaches the bindings and interactions of the page; a required uuid property a form does not show is the session’s identity for that concept (from #611).
- Stage (Release v4.185.0): The Stage runs and renders Scene 4.75.0: a storefront’s own shell puts a
barand anindicatorButtonin its topbar (from #620). - Stage (Release v4.183.0): The Stage runs and renders Scene 4.75.0 (includes the storefront shell bar and indicator button of Scene 4.73.0, from #620 which this carries): a storefront’s own shell can put a
barin its topbar and anindicatorButton(the basket count) in it. - Stage (Release v4.183.0): An application toolbar button declared in a
navigation topbarregion of a layout or module (decision 0098) is carried into Scene’s navigation model (NavigationButton: slice written as the qualified id, emphasis, icon,authorizeas the policy expression) and drawn by the region, which opens the slice’s task dialog over the current page. The converter no longer reportsSTAGE-SCENE-NAV-001. (Cratis/Scene#215) - Screenplay (Release v4.235.0):
ui profilegets anidentityblock:name "...",logo initials "AB"|logo icon box|logo image "data:image/svg+xml;base64,...",show name true|false. - Screenplay (Release v4.235.0):
appearancegetscorners sharp|default|roundandfont <font id>besidecolor schemeandaccent. - Screenplay (Release v4.235.0): Parser, printer (canonical round trip), syntax tree and syntax JSON (TypeScript schema regenerated), validator (Scene’s identity rules: 1-2 initials, closed icon set, PNG/JPG/SVG/WebP data URI up to 400 KB; corners set, PLAY0797), grammar and ui-profile docs, diagnostics wording, contract golden, Monaco completions and docs, VS Code grammar, invoicing sample.
- Cast (Release v0.2.2): Member profile and CV pages on cast.cratis.io now ask search engines not to index them, since members have not opted in to having their personal data indexed. The home page and
/joinstay indexed. (#22) - Cast (Release v0.2.2): Member profile and CV pages on cast.cratis.io no longer publish job title, email, home town or interests in their structured data; those details stay on each member’s own site. (#22)
- Chronicle (Release v19.93.0): The .NET client now logs a Warning at startup when a projection removes its root read model through a join (
RemovedWithJoinat the root in a fluent, model-bound or explicit projection). Root removal through a join is not supported and removes nothing; the warning points toRemovedWithfor root removal andRemovedWithJoinon a children collection. (part of #4263) - Ante (Release v1.3.4): The
ghcr.io/cratis/anteimage is published for both linux/amd64 and linux/arm64, so it pulls and runs natively on Apple Silicon without--platform linux/amd64. (#168) - Stage (Release v4.181.0): A model’s
seedblocks are appended when a Play sandbox starts, so a played application begins with the reference data and demo records it declares (a shop starts with its products). Each event source id is seeded once: a source that already has events is left alone, so a restart never doubles the data. The seeded events flow through the projections like any other event, and the semantic world is established from them directly. - Stage (Release v4.181.0): A seed entry the model cannot hold (an event the model does not declare, a property the event lacks, a value that is not a literal, a required value left out, or an event the evaluator cannot replay) is left out whole and reported as a
STAGE-SEED-001..005note on/stage/statusand in the log, instead of refusing the application or putting a wrong fact in the log. - cli (Release v3.91.0): The bundled Stage is 4.178.2, so
cratis runandcratis renderdefault to the Stage 4.178.2 container. After migrating a destination, upgrade every CLI that renders it: older CLIs refuse to render a migrated destination withCLI-RENDER-021. (#415) - Scene (Release v4.75.1): An application toolbar button of a navigation region is activated through the host’s navigation activation policy, as an item is: a design host that selects instead of navigating selects the button and does not open its dialog, and
onActivateButtontells the host. Outside a navigation host the button still announces the slice withcratis.scene.command. (Cratis/Scene#215, follow-up of #222) - Arc (Release v22.132.0): Read protection resolves protected read-model parameters, per-stream read models and Measure-mode decision reads through typed dispatch registered once per read model by
AddReadModels, instead of building a generic method per request. Three of read protection’s native-AOT warnings go away and request-time reflection is lower. (part of #3321) - Chronicle (Release v19.92.2): The storage connection resolution documentation lists the supported Entra modes, explains that an access token from a resolver must not be combined with
Authentication=or a password in the connection string, and shows Azure Database for PostgreSQL with a token. The clustering documentation states that single-node deployments must stop the old instance before starting the new one. (#5126) - Scene (Release v4.75.0):
EffectiveNavigationRegionhas abuttonslist. - Stage (Release v4.180.0): Generated Cratis applications now depend on the
@cratis/stage.runtimenpm package, pinned to the Stage release that rendered them, instead of a copied.frontend/stageruntime and.frontend/styledPrimeReact.ts. Render existing applications again to migrate: unchanged copies are removed; edited copies stop the render until you delete or restore them. The generated frontend now declares Vite’s client types in.frontend/vite-env.d.ts. (part of #499) - Stage (Release v4.180.0): Generated applications pin Vite 8.3.2 to match the runtime’s peer dependency. (part of #499)
- AI (Release v7.93.0): A query
performeris now taught as an opaque read that the compiler reports asPLAY0270information and leaves out of the executable model, rather than as aPLAY0268refusal. Render emits nothing for it, so the skills list it as code to write by hand; older compilers still reportPLAY0268. (#798) - Scene (Release v4.74.0): A card or a table row of a
dataListwithselectionModesingle is selected by pressing it, not only its radio button. - Scene (Release v4.74.0): A
dataList’son selectbehaviors run once the selected value has been published as the list’svalueoutput, socomponent.<id>.valueread by a behavior (for examplenavigate to ProductPage with sku from component.productList.value) is the row just selected, not the previous one. - Scene (Release v4.73.1): A sidebar clips the application name it still shows with an ellipsis instead of letting it spill out.
- AI (Release v7.92.0): The corpus pins Screenplay 4.232.0.
- Stage (Release v4.179.0): A multi-field command response record that would collide with another generated type, a namespace or one of its own fields is rendered as
<Command>Response_(also in the TypeScript proxy) and reported asSTAGE-ESM-050information, instead of being refused. Response field names stay the same on the wire (#454) - Stage (Release v4.179.0): A generated concept named
Newnow renders: its factory implementsIGeneratable<New>.Newexplicitly instead of being refused (#454) - Chronicle (Release v19.92.0): Idempotency keys are refused on events staged in a unit of work and on appends that carry effect receipts; those appends throw
IdempotentAppendsNotSupportedinstead of dropping the key. (part of #4809) - Chronicle (Release v19.92.0): The new public types
IdempotencyKey,AppendOutcome,IdempotencyConflictReasonandIdempotencyKeyConflictlive inCratis.Chronicle.EventSequences; an application that declares a type with one of these names and imports that namespace needs to qualify it. (part of #4809) - Scene (Release v4.73.0): An application’s own root template that fills a slot itself (for example a storefront’s
topbar) now says what is drawn there: the host’s default chrome only seeds the slots the template leaves empty. A blueprint root template’s content stays placeholder seed that the host’s chrome replaces. - Scene (Release v4.73.0): New
barcomponent of the default blueprint: a horizontal bar for an application’s own shell (startbrand,center- or the topbar navigation region when empty -,endactions), needing no sidebar or layout configuration. - Scene (Release v4.73.0): New
indicatorButtoncomponent: an icon button with a live count badge (icon,label,count) said in words as well as in the badge; the count is a query result and pressing it runs the attached behaviors. Newcartandbellfoundation icons. - AI (Release v7.91.0): The corpus is verified against Screenplay 4.231.0 and its published contract.
- Stage (Release v4.178.3): A warm Stage now runs on the semantic engine outside the deprecated
eventmodelhost, and its handoff status always reports thesemanticengine (part of #23) - Arc (Release v22.130.0): A command whose returned events for one event source id carry different legacy-routed concurrency guards is no longer rejected: Arc sends every distinct guard to Chronicle in event order, and the append succeeds only when each one holds. Guards for the same stream and event types collapse to one. Mixing legacy-routed guards with a guard Chronicle derives from an event source definition for the same id is still rejected with
IncompatibleConcurrencyScopesForEventSource. Requires a Chronicle kernel 19.84 or later. (#3439)
- cli (Release v3.103.3):
cratis rendernow resolves file bodies referenced by imported slice and feature files by bundling Screenplay 4.250.0. (#473) - cli (Release v3.103.2):
cratis rendernow passes the model’s companion<base>.<locale>.stringsfiles to the renderer. Without them Stage refused every$strings.<key>validation message withSTAGE-ESM-002(a concept) orSTAGE-ESM-011(a specification that expects the message), so a localized model could not be rendered. The default locale isenwhen a file for it exists, otherwise the first locale in ordinal order. - Screenplay (Release v4.249.2):
AttachmentFiles.LoadandAttachmentFiles.Referencesnow resolve the file references of a document that animportplaces in a module or feature (the usualmodule->feature->slicefile layout). They parsed every document on its own, so a slice or feature file was never a whole document, its references were silently dropped, and the implementation body of itsfileattachments was reported as unresolved (STAGE-ESM-020in a render). The set is now assembled the way a folder is, with the old per-document parse kept as the fallback when the set does not assemble. - cli (Release v3.103.1):
cratis renderon a folder composed throughimportno longer reportsPLAY0001(“Unexpected ‘feature’ at the top level”) for every imported feature and slice file. The scene compile resolved an import’s folder through a file listing that ignored the folder it was asked for, so nested imports never found their targets. The listing now reports files relative to the folder requested, as a disk does. - Screenplay (Release v4.249.1): Projection outputs that publish a uniquely declared local event are indexed as event references instead of phantom read models, so comparison and dependency views show the event correctly. (#1070)
- cli (Release v3.103.0):
cratis renderreports an unexpected renderer failure asCLI-RENDER-027and exits with the new code10(unexpected_error) instead of printing a stack trace and exiting with-1; add--debugto see the trace. (#469) - Orleans (Release v1.32.1): Jobs whose stored request is missing are no longer silently admitted when admission policies are registered.
StartandResumenow reportUnknownwithout changing the job, and a later stage keeps waiting and retrying, instead of running work that no policy approved. Without registered policies, such jobs still run as before. (#162) - Arc.Kotlin (Release v7.10.1): Fluent validation metadata extraction supports processors running on full JDK 17 or JDK 21, while retaining the supported embedded Kotlin parser and failing with actionable diagnostics on unsupported environments. (#309)
- Stage (Release v4.201.1): The renderer applies a specification’s slice isolation too (decision 0115). A command specification whose event another slice reacts to now renders as a plain command specification asserting only its own events, instead of being refused as an unrenderable cascade (STAGE-ESM-011). The command’s slice and the reacting slice both generate again.
- Stage (Release v4.201.1): Reaction, projected-fact and translation specifications consider only the reactions, captures and publications of their own slice, and the events of a command another slice owns are not counted as a deeper cascade.
- Stage (Release v4.201.1): A rendered application built in Release after a Debug restore (
dotnet build -c Release --no-restore) no longer fails withCS7022, the test SDK generating a second entry point.GenerateProgramFileis nowfalsein every configuration, not only Debug. - Fundamentals (Release v7.27.0): Implementations marked
[IgnoreConvention]no longer make an interface convention ambiguous, in both the source-generated and the reflection binding paths, soIFoostill binds toFoowhen a test double lives in the same assembly. (#1178) - Fundamentals (Release v7.27.0): Shared OpenTelemetry log export honors
OTEL_BLRP_*and the per-signal OTLP timeout and compression settings, exportsexception.typeonly unless exception details are opted in, and skips health and readiness requests in ASP.NET Core tracing by default (overridable). (#1175) - Fundamentals.Kotlin (Release v0.7.1): Concepts whose value is another concept can be constructed from that value and read back from JSON. (#20)
- Stage (Release v4.199.0): The runtime advances its known event-log tail only by what reached the event log. A published public event goes to the outbox, so counting it moved the tail past the log and the next command could stop the host with a tail-changed fault.
- AI (Release v7.119.1): Hook scripts no longer test values with
printf … | grep -qunderpipefail. That pattern could turn a true test false whengrepexited early, which could make the slice-scope report skip its specification check. The slice-scope report, the type-reference self-test and the worktree-cleanup self-test now use here-strings, and a corpus check fails if a hook script reintroduces the pattern. Runcratis ai updateto get the fixed hooks. (#938) - Orleans (Release v1.32.0): A job interrupted while preparing or starting its steps whose
OnBeforeResumingJobStepsthrows no longer stays inPreparingStepsorStartingStepswith nothing retrying it. The watchdog now retries the resume with the same growing back-off as forRunningjobs until startup finishes. (#157) - Screenplay (Release v4.247.3): A live host that settles reactions with
SemanticReactionSettlementnow gives captures what they have already seen. Before, every settled event was a first observation of its key, so an unchanged repeat of an event captured again; now a capture appends only for a new or changed state, as it does in a specification run. - Arc.Kotlin (Release v7.10.0): Arc’s JSON mapper accepts the
_derivedTypeIdit writes when a derived type is read as its concrete class. (part of #301) - Screenplay (Release v4.247.2): A projection that publishes a public event (
projection X => PublicEventin an outbound translation) no longer shows up in the authoring index as an implicit read model named after the event. Comparing a model that has one no longer reports an uncomparable indexed group, so such models can be compared without that gap. - Chronicle.Kotlin (Release v7.2.1): Class-level
@OnceOnlyreactors and webhooks built withnotReplayable()ornotActive()are now registered as not replayable or inactive. The client sends the kernel’sIsNotReplayableandIsInactivefields alongside the existing flags. Kernels before 19.33.0 ignore the new fields and behave as before. (#126) - AI (Release v7.116.1): The Codex hook bridge no longer denies a command when a guard exits before reading its whole input and the platform reports that as a connection reset rather than a broken pipe. The guard’s exit status decides, as it already did for a broken pipe. Run
cratis ai updateto get the fix. (#931) - AI (Release v7.116.1): The quality-gate spec for per-directory timeouts no longer fails on a heavily loaded machine. (#933)
- Orleans (Release v1.31.0): A
Runningjob whoseOnBeforeResumingJobStepsthrows no longer staysRunningforever with nothing dispatched. The watchdog retries the resume with a growing back-off for as long as the job staysRunning, and stops retrying once it is stopped or removed. (#155) - Arc (Release v22.140.1): Screenplay recovery keeps the protected reads of a command whose read model is keyed by a
stringorGuid, even when the read model’s by-key query takes anEventSourceId. The recovered query now states the key with the read model’s own key type, which is what Arc’s runtime lookup uses. A command reading it by a primitive key therefore binds instead of being refused with PLAY0283, and its read-backed requirement and read-path mapping are recovered too. (#3536) - Chronicle (Release v19.111.0): A replay triggered by a projection definition change now runs with the new definition, so history for added events (for example a child collection added back) reaches the read model. (#5071)
- Chronicle (Release v19.111.0): Clients and kernels built without a release version (for example from a CI or local build) no longer get refused on connect for purely additive contract differences; when either side’s version is unknown, the connection is accepted if the two contracts are compatible in either direction. (part of #5353)
- Chronicle (Release v19.111.0): Read models with composite keys stored in SQL databases now return their key when read through
IReadModels, instead ofnull. (#4719) - Chronicle (Release v19.111.0):
Cratis.Chronicle.Aspirerestores on .NET 8 and .NET 9 without package downgrade errors. (#5358) - AI (Release v7.114.1): The technical-examples guidance on version notes now uses a placeholder version in its example, so the skill itself stays free of concrete release numbers.
- Fundamentals (Release v7.26.3): Services registered by convention or as self bindings now resolve in applications published with NativeAOT. The generated type discovery code now tells the trimmer to keep the public constructors of every implementation type it binds. Before, those constructors could be trimmed, and resolving the service failed with “A suitable constructor … could not be located”. Rebuild assemblies that use type discovery with this version to get the fix. (#1220)
- Arc (Release v22.140.0): Model-bound queries accept string-keyed dictionary arguments with primitive, concept, enum or
Guidvalues, and the generated TypeScript proxy sends them as JSON instead of dropping them. (#3527) - Screenplay (Release v4.246.0): A command specification no longer passes while stating an event another slice publishes, such as
SetProductPricestatingProductPriceChanged. - Fundamentals (Release v7.26.2):
AddTypeDiscovery(), and the generated-provider registration behind it, no longer throwsPlatformNotSupportedExceptionin an application published with NativeAOT. NativeAOT already runs every compiled module initializer beforeMain, so type discovery skips the assembly-reference walk there. Under JIT, discovery behaves as before. (#1217) - Specifications (Release v5.0.4): The experimental native runner now reports a cancelled
Establish,BecauseorDestroythe same way whether the specification uses generated or reflection-based lifecycle calls. Both raiseSpecificationCancelledExceptionwith the phase and the original exception. (part of #77) - AI (Release v7.111.0): When the PR-body guard can’t find the
--body-file, its message says why: a file written in the same batch of parallel tool calls as the command isn’t on disk yet when the check runs, so write it in an earlier step. (#517) - AI (Release v7.111.0): The C# specifications guidance says disposable specifications share the class lifecycle (constructed once, disposed after the last fact) as of Cratis.Specifications 4.4.0, and use
[PerFactSpecificationLifecycle]for a fresh instance per fact. (#915) - AI (Release v7.111.0): The application profiles that install the C# specifications skill also install the
run-tests,filter-syntax,platform-detectionandcoverage-analysisskills it links to, without engineering rules. (#921) - Specifications (Release v5.0.2):
CRSPEC0008no longer reports calls made inside an NSubstituteReceived.InOrder(...)delegate as shared-state mutations; they record verification expectations. Assignments and increments inside the delegate are still reported, because NSubstitute runs it. (#90) - Arc.Kotlin (Release v7.8.1):
ConceptValidationExclusionregistrations now also suppressFundamentalsConceptValidatorrules on the excluded edge, so concepts that implement only the Cratis FundamentalsConceptAscan opt out of concept validation the same way legacy Arc concepts can. Applications that combine exclusions withFundamentalsConceptValidatorwill see those rules stop running on excluded edges. (#302) - AI (Release v7.105.1): A request to an Anthropic model of generation 5 or later (such as
claude-sonnet-5-5) no longer fails withtemperature is deprecated for this model: the sampling temperature is left out of the request for those models and sent as before for earlier ones - Screenplay (Release v4.244.0): An incomplete specification example now names its specification instead of the
givenstep in the missing-property diagnostic. (#972) - Screenplay (Release v4.244.0): A performer query refuses context-sourced
byandfilterarguments with the new diagnostic PLAY0810, instead of silently dropping them. (#1038) - Ante (Release v1.3.9): The lobby now restarts itself when its connection to a host inbox stays down longer than a configurable grace period (
Ante:Health:HostInboxRecoveryGracePeriod, three minutes by default), instead of staying unready until someone restarts it. Short disconnects are tolerated. (#162) - Orleans (Release v1.29.0): A removal no longer counts a step twice, or finishes before a step is done, when a stop from an earlier execution arrives after the job grain was reactivated (#148)
- Stage (Release v4.197.0): A semantic specification whose projection multiplies two event values no longer becomes unsupported when the run never appends that product’s event. (#721)
- Stage (Release v4.197.0): A projection over a recursive composite type is now reported as unsupported by name instead of crashing the specification run. (#749)
- Ante (Release v1.3.8): Organization setup, invitation acceptance and self-service registration no longer fail when Chronicle refuses public events in the local event log. Earlier onboarding history keeps working, and hosts keep receiving the same contracts through the outbox. (#183) (part of #179)
- Orleans (Release v1.28.3): SQL jobs storage on SQLite can list jobs again. Listing a page of jobs no longer fails with “SQLite does not support expressions of type ‘DateTimeOffset’ in ORDER BY clauses”, so the jobs manager stops logging “Unable to get all jobs” (#150)
- Chronicle.Kotlin (Release v7.0.1): Write Kotlin and Java enum values in event content and read-model state as ordinal numbers, matching their schemas. Previously stored names remain readable; new events use numbers. Undefined ordinals, including numeric strings, are rejected because JVM enums cannot represent them (#152)
- AI (Release v7.103.7): Pi MCP servers configured with
npxnow start on Windows without enabling a shell. (#834) - Orleans (Release v1.28.2): The jobs documentation no longer lists a MySQL/MariaDB jobs storage provider, which does not exist (#147)
- Arc (Release v22.138.2): A page that opens many observable queries at once now loads them side by side. The WebSocket hub used to run each subscribe to completion before reading the next message, so a slow query held up every query behind it, and a ping or unsubscribe too. Subscriptions now establish concurrently, up to 8 per connection.
- Arc (Release v22.138.2): The WebSocket hub client sent every subscription twice on connect, once without a revision and again with one when the server’s
Connectedmessage arrived. The server ran every query twice and the client discarded the first answers. Subscriptions now wait forConnectedand are sent once. A server that never announces itself gets them after one second, without a revision, as before. - Arc (Release v22.138.1): Observable query subscriptions report unexpected authorization-policy resolution failures as query errors consistently, including the first subscription. (part of #3518)
- Arc (Release v22.138.1): Embedded Screenplay export includes generated xUnit v3 and Microsoft Testing Platform compiler inputs, so valid test projects are no longer rejected for missing generated types or
Main. (Cratis/Samples#667) - Chronicle (Release v19.110.1): The .NET packages for this release are published to NuGet again. 19.110.0 was tagged but never published because the Chronicle packages pinned older
Cratis.FundamentalsandSharpCompressversions than theirCratis.Orleansdependency requires, so restoring them failed with a package downgrade error. This release contains all of 19.110.0. (#5357) - Orleans (Release v1.28.1): Starting a staged job whose first stage continues on failure now reports
FailedStartingSomeJobStepswhen every step in that stage fails to start but a later stage starts. Before, it reportedAllJobStepsFailedStarting, so callers treated a running job as not started. It still reportsAllJobStepsFailedStartingwhen no stage gets a step running. (#113) - Orleans (Release v1.28.1): Removing a job no longer stops retrying while a step that could not be reached still has to be told about the removal. The removal retry is armed again, so the removal finishes without waiting for rehydration. (#127)
- Orleans (Release v1.28.1): Two job removal specifications no longer fail intermittently: they wait for the job state and the job step states to be removed instead of reading them once. (#146) (#144)
- Components (Release v4.35.1): Checkboxes rendered through the PrimeReact 11 and PrimeReact 10 presentation adapters no longer draw a tick when they are unchecked. (#444)
- Components (Release v4.35.1):
DataPage,DataTableForQueryandDataTableForObservableQuerykeep the selected row in step with updated query results: the selection follows the refreshed row by itsdataKeyand clears when the row disappears. A controlled selection is reported throughonSelectionChangeand is never overridden. (#458) - AuthProxy (Release v2.32.4): The tenancy documentation now states that bearer routes forward the tenant as
x-cratis-tenant-id, withTenant-IDkept as a deprecated copy. (#190) - Specifications (Release v5.0.1): Prevent OpenAPI XML documentation failures when multiple assemblies use Specifications assertion registration, while preserving automatic native assertion exceptions. (#87)
- cli (Release v3.95.1): Refresh managed AI guidance to 7.103.5 so worktree cleanup batches GitHub lookups instead of exhausting the API quota. Run
cratis ai updateto receive the hook fix in existing repositories. - AI (Release v7.103.6): Worktree cleanup no longer removes a replacement lock when concurrent processes reclaim a stale lock. Run
cratis ai updateto receive the hook fix. (#897) - Arc (Release v22.138.0): Direct (WebSocket/SSE) observable queries now send source errors to the client as a failed result instead of closing silently. (#3413)
- Arc (Release v22.138.0): A deleted
index.tsis recreated the next time proxies are generated. (#3524) - AI (Release v7.103.5): The worktree cleanup hook makes at most one cached GitHub lookup per repository every 15 minutes and keeps every worktree when that lookup fails, so it no longer exhausts the GitHub API quota. Set
CRATIS_CLEANUP_NO_GH=1to switch the lookup off (#894) - Stage (Release v4.194.0): DateTime read-model values compare as the same instant and offset, so a specification written with
Zno longer fails against the+00:00the run materializes. - Stage (Release v4.194.0): Text event sources that hold a Uuid are accepted as keys of Uuid read models in semantic specification runs.
- Stage (Release v4.194.0): Removal of a child instance in a semantic run reports the missing parent the same way a child update does.
- Orleans (Release v1.27.3): Observing jobs with the MongoDB jobs storage works on Cratis.Arc 22.136 and later, which share one change stream per database through a process-wide watcher.
AddCratisOrleansMongoDBJobsStorageregisters that watcher, and the jobs collection is watched on the jobs storage’s own MongoDB client. - Arc (Release v22.137.0):
Observe(),ObserveSingle()andObserveById()on a collection from a client other than the application’s configured one now watch the deployment the collection lives on, instead of the same database name on the configured server. - Arc (Release v22.137.0): An observation no longer fails when a document outside its filter is changed and cannot be read as the observed type, such as a record of a kind the filter excludes.
- Arc (Release v22.137.0): Observing a collection no longer fails with
No service for type 'Cratis.Arc.MongoDB.IMongoDBWatcher' has been registeredin a host that registers only the watcher. - Specifications (Release v4.5.0): The native runner reports the real return type of a fact (
void,TaskorValueTask) in its test identity. (#84) - Fundamentals (Release v7.26.1): Type discovery no longer breaks the build when a referenced assembly exposes types marked
[Experimental]: the generated source now disables those diagnostic ids, as it already did for obsolete types (#1211) - Specifications (Release v4.4.0): Native runner: when
Destroy,Disposeand facts fail, every failure is reported instead of only the first. (part of #65) - Stage (Release v4.193.0): The semantic specification runner now runs specifications whose projection keys are concepts over the same primitive as the event source identity, instead of refusing them as a key-type mismatch (part of #721)
- Stage (Release v4.193.0): The semantic specification runner now seeds and compares events with composite and collection values, instead of refusing every specification that uses them (part of #721)
- Stage (Release v4.193.0): The semantic specification runner now runs projections keyed by a constant or by an event property, and counts on optional values starting from zero, so summary read models are verified instead of refused (part of #721)
- Stage (Release v4.193.0): The semantic specification runner now reports the same refusal on every run when several projections cannot run (part of #721)
- Stage (Release v4.193.0): The semantic specification runner now runs projections with identified children and joins, instead of refusing them (part of #721)
- Stage (Release v4.193.0): The semantic specification runner now accepts reactions that produce or invoke with collection values (part of #721)
- Stage (Release v4.193.0): The semantic specification runner now names DateTime round-trip loss as the reason it refuses such projections (part of #721)
- Stage (Release v4.193.0): The semantic specification runner now refuses projections whose joins read events with a different identity type than the joined key, instead of matching a text key with a numeric identity (part of #721)
- Stage (Release v4.193.0): Command forms show each validation message once, next to its field. (#719)
- release-action (Release v1.5.1): A hotfix waiting alongside a pending major release now fails only the run started by merging the hotfix itself. Scheduled ticks and other merge runs warn and keep the batch pending. (#218)
- release-action (Release v1.5.1): Batched release notes now combine the summaries of every pull request into one leading
## Summary, instead of repeating a summary per pull request. (#218) - release-action (Release v1.5.1): Batched releases now warn once for each merged pull request that has no release-intent label. (#218)
- release-action (Release v1.5.1): Markdown reference-link definitions in a pull request description are kept when release notes are aggregated. When two pull requests define the same label, the first definition is kept and a warning names the duplicate. (#218)
- Specifications (Release v4.3.0): xUnit v3 specifications are now disposed even when
Destroythrows - Specifications (Release v4.3.0): Sequence comparisons in the TUnit package’s assertions now dispose the enumerators they create
- Specifications (Release v4.2.0):
Establish,BecauseandDestroydeclared on a base specification no longer run twice (#61) - Specifications (Release v4.2.0): Exceptions thrown from
Establish,BecauseandDestroyare reported as thrown, not wrapped inTargetInvocationException(part of #61) - Specifications (Release v4.2.0): Lifecycle methods returning
ValueTaskare now awaited (part of #61) - Specifications (Release v4.2.0): Building the repository works on any .NET 10 SDK feature band;
global.jsonno longer pins an unavailable SDK version (#50) - AI (Release v7.101.0): The Pi quality gate recognises a directory outside any Git repository on a separate volume as “not in a Git repository” instead of reporting that the working tree could not be checked (#868)
- Arc (Release v22.136.4): Proxy generation no longer reopens each assembly’s metadata for every attribute check during discovery. On a large application (469 commands, 167 queries) generation drops from about 4.5 minutes to 12 seconds with identical output. (#3497)
- Chronicle (Release v19.108.0): The kernel now closes a client connection whose keep-alive has lapsed, so the client registers again instead of staying attached to a dead connection. (#5240)
- Chronicle (Release v19.106.5): Removing a child from a projection read model whose root was removed, or never created, no longer recreates that root in MongoDB. The removal is now a no-op, as when the root exists without a matching child. On earlier kernels the recreated root had no child array, so a nested removal in the same window failed with MongoDB error 2 (“The path ’…’ must exist in the document in order to apply array updates”) and the projection partition failed on every retry (#5271)
- Screenplay (Release v4.240.6): Histories that contain events published by outbound Translate projections can be re-established and used as specification fixtures, so a host can rebuild its world after a restart. (#1008)
- Chronicle (Release v19.106.2): Read-model lookups by key keep returning the primary state while a replay rebuilds the model, instead of returning missing or partial replay state. During bulk catch-up, lookups show only flushed updates, matching read-model lists. (#4391)
- Chronicle (Release v19.106.1): Reactor and reducer handlers no longer run inside the execution context of the code that delivered their events. Since 19.90.0, a reactor appending events could inherit the finished HTTP request that triggered it, so Arc’s identity provider failed with “IFeatureCollection has been disposed” and the reactor’s partition failed. (#5259)
- Arc (Release v22.136.3): Work that starts during an HTTP request and runs after the request has ended no longer sees that request as current. Examples are a Chronicle reactor dispatched from an append made in the request, a background task, or a timer. Reading the current user from such work used to throw
ObjectDisposedException(“IFeatureCollection has been disposed”), which failed every event the reactor appended. It now resolves the identity as it does outside a request. (#3501) - Chronicle (Release v19.106.0): Adding a new generation to an event type now builds the backfilled content of a revised event from its latest revision instead of the content it was first appended with, the same way on MongoDB, SQL and in-memory storage. Observers that read the backfilled generation now see the revised values. (part of #4976)
- Scene (Release v4.80.2): PrimeReact buttons, cards, panels, tags and progress bars inside a Scene application shell now take their colours from the Scene theme, so they keep readable contrast in light and dark mode (#259)
- Arc (Release v22.136.2): Observable MongoDB queries no longer miss documents written right after the query starts while the shared change stream is still opening (#3498)
- Stage (Release v4.190.12): The semantic specification runner executes projections that set literal values, add or subtract event values and count, so these specifications run instead of ending as Unsupported (part of #721)
- Stage (Release v4.190.12): The semantic specification runner checks only the projections a specification actually reaches, so an unrelated projection in the same model no longer makes it Unsupported (part of #721)
- Stage (Release v4.190.12): Rejection specifications in the semantic runner pass or fail on the expected rejection instead of failing with a conversion error on the key (#722)
- Arc (Release v22.136.1): A command is no longer failed with the concurrency violations of other writers: an append without correlation counts as the command’s only when it is made from within the command’s own flow, so a read-only command no longer returns “has new events since the command read it” for event sources it never touched (#3493)
- Arc (Release v22.136.1): Live MongoDB queries no longer build up an ever-growing backlog of database changes when the server is slow to answer: pending changes are coalesced per document, and paged queries read their page once per batch instead of once per change (#3495)
- Screenplay (Release v4.240.5): The Screenplay board in VS Code no longer spins forever on a
.playfile with specification cases when the Todo Tree extension is installed (#1030) - Scene (Release v4.80.1): The preview of a slice whose screen’s template fits the slot
contentthat the application’s own root template also declares (Acme StorefrontProductBrowse,ProductPage,CheckoutProgress: templatesProductGrid,SideSummary,WizardScreen) no longer answers “This preview cannot be shown: templateUnplaced … FullPage and StorefrontShell all declare”. A screen on the chrome-less full-page layout opted out of the root, so the root template is not a container its template can be placed in. (#252) - Scene (Release v4.80.1): The dialog card a slice preview opens for a screen built from a dialog template is titled with the slice’s name when the template has a
headerslot the screen leaves empty, instead of starting with a blank band. - Stage (Release v4.190.11): Rendered command forms no longer show inputs for generated properties such as new record ids, matching live Stage. (#704)
- Stage (Release v4.190.11): Table columns for enum properties show the member names instead of raw numbers, in rendered apps and in live Stage. (#705)
- Stage (Release v4.190.11): The rendered project pins its Yarn version (
packageManagerand a.yarnrc.yml), and its README starts withcorepack enable, so installing works on a fresh machine without a global Yarn. (#706) - Screenplay (Release v4.240.4): A module’s or feature’s
templateassignment is kept when a folder is merged, wherever its file sorts; before, only the assignment in the first file of the module or feature survived. The same reference written in two files counts once. - Screenplay (Release v4.240.3): The sample showed feature toolbars only in Catalog; no module toolbar and nothing in Sales or Warehouse.
screenplay --warnaserror Samples/AcmeCommerce: 0 errors, 0 warnings;screenplay test: 177 passed. - Stage (Release v4.190.10): Stage#700: on production (Studio 0.271.1, Stage 4.190.7) the Approve product button of the Acme Catalog Publication toolbar was enabled with no row selected and opened a “Product Id” field left empty, because the rows are keyed
idand the first fix looked for aproductIdproperty. - Scene (Release v4.80.0): The shell uses the design-token sans-serif font stack, shows one brand in the sidebar header, and sizes avatar groups so initials are not clipped. (#250)
- Scene (Release v4.80.0): The Dashboard gallery template lays its key figures out as a responsive grid of stat cards. (#250)
- Ante (Release v1.3.6): The registration introduction has the same side margins as the header and the form, on wide and narrow screens.
- Ante (Release v1.3.6): The highlights show as a check-marked list in a subtle panel, the links use the theme’s primary color, and a divider separates the introduction from the form.
- Stage (Release v4.190.9): Cratis/StudioIssues#1068: Studio can pin Scene 4.79.1 without running ahead of the Stage release it starts Play sessions from.
- Chronicle (Release v19.105.0): Several kernel nodes starting at the same time against SQL storage no longer fail when they race to create databases, run migrations or register the same system state. (part of #5127)
- Chronicle (Release v19.105.0): The kernel now refuses to start when MongoDB clustering is configured with SQLite, SQL Server, PostgreSQL or in-memory storage, or SQL clustering with storage other than SQL Server or PostgreSQL, instead of failing later at runtime. (part of
- AuthProxy (Release v2.32.2): A signed-in user on /register with no registration pending is forwarded to the service behind the proxy, so the lobby’s registration page loads after signing in. Anonymous callers and pending registrations are still answered by AuthProxy, and invitations are unchanged.
- Stage (Release v4.190.8): Stage#711: Play of every Acme Commerce domain logged a 401 “Failed to load resource” console error for
GET /api/play/<session>/.cratis/meon every start, since Arc is given the prefix the Stage is served under and its identity request reaches the Stage. - Scene (Release v4.79.1): A preview of a slice (
ScenePreviewHostwith a{ slice }target) no longer draws the application shell - root template, navigation regions, feature page - around the slice: its screens are composed on the chrome-less full-page layout. Module, feature and application previews keep their shell. (Cratis/Scene#252) - Scene (Release v4.79.1): The command of a State Change slice is presented once: the screen the slice owns when that screen presents the command (a screen built from a dialog template is drawn as an opened dialog card on a neutral backdrop), else the task dialog - never both, so the form is no longer drawn twice with a dialog on top. (Cratis/Scene#252)
- Scene (Release v4.79.1): An action that executes the command of a form the same screen hosts is that form’s submit: one submit button, carrying the action’s label. (Cratis/Scene#252)
- Arc (Release v22.135.1): Entity Framework Core observable queries now fault with an error when re-running the query after a change fails, so connected clients get an error and can resubscribe instead of silently keeping stale data. Later changes no longer run the query, cancellation and disposal during teardown stay quiet, and an error handler that throws can no longer leak the observation or throw into the
SaveChangescaller. (#3456) - Stage (Release v4.190.7): Stage#700: the Publication feature toolbar of the Acme Catalog sample opened the command form with an empty, typed “Product Id” field because a slice button was not tied to a row.
- Stage (Release v4.190.6): Play and generated applications run Scene 4.78.6: an application toolbar button whose label a compact topbar hides keeps its title as tooltip and accessible name. (Cratis/StudioIssues#1011)
- Stage (Release v4.190.5): Play loads models that Studio exports with event-source positions, canvas sticky notes or named seed blocks, instead of answering 404. Stage now parses with Screenplay 4.240.2. (#702)
- Arc (Release v22.135.0): Chronicle claim-based tenancy now selects the namespace on first event-store use rather than when the request unit of work begins, avoiding premature anonymous-tenant binding before authentication. Explicit unit-of-work manager registrations remain supported. (#3479)
- Scene (Release v4.78.6): The application toolbar buttons of a navigation region have a tooltip and an accessible name when a compact topbar hides their label, instead of an unnamed icon button. (Cratis/StudioIssues#1011)
- Screenplay (Release v4.240.2): The notes on the persona canvases of the samples (Acme Commerce, Invoicing and the domain samples) no longer sit on top of the persona cards: the first row of notes starts at 650 (1130 under a second row of personas), below the card height Studio lays personas out with. Part of #1014.
- Scene (Release v4.78.5): In the slim and compact navigation rails, an item whose label is hidden shows its title as a tooltip and keeps it as its accessible name; an item without a target names itself in its tooltip too. (#229)
- Stage (Release v4.190.4): In Play, the selected row of a table is highlighted and stays highlighted while hovered, rows that can be selected show a pointer, and a wide table scrolls inside its card instead of running past its border. (#695)
- Stage (Release v4.190.4): A modeled screen that names a template which fits inside another one (such as the master/detail) is drawn on its own in Play, at the full content width, instead of beside an empty “Nothing here yet” region. (#699)
- Stage (Release v4.190.4): A ConfirmDialog decision dialog in Play uses the theme’s buttons, with the first decision emphasized, and has a Cancel that leaves the dialog without running a command. (#697)
- Stage (Release v4.190.4): The live Stage’s own Arc requests, such as the signed-in identity, now go to the Stage when it is served under a path prefix such as Studio’s Play. (#691)
- Stage (Release v4.190.4): A specification that expects a missing read model from a command whose reaction reads the same read model by the same key now renders, instead of being refused with STAGE-ESM-011. (#685)
- Scene (Release v4.78.4): A Preview of a slice drew the warning marker on every navigation item that leads to another slice’s screen (for example the compact rail item
Warehousein the Warehouse Stock Levels preview), although those targets exist in the application and resolve in Play. (part of Cratis/StudioIssues#1021; Studio pins this Scene version next) - Screenplay (Release v4.240.1): The checked-in contract golden lacked the keywords
eventsources,givencontextsandseeddatathat #1016 introduced, so the contract spec failed on main. The golden is regenerated; the contract spec passes (105 of 105). - Stage (Release v4.190.3): A toolbar action on a list in Play waits for a selected row and acts on that row, instead of submitting an invented or previously held identifier, so commands such as Dispatch no longer fail with “does not exist”. (#670)
- Stage (Release v4.190.3): A screen on the ConfirmDialog blueprint plays as a decision dialog: one button per decision, only the chosen decision’s inputs, no raw
Execute ...Formcaptions, and the declared navigation runs after the command succeeds. (#672) - Stage (Release v4.190.3): Synthesized screens now bind their tables to the exposed query and their actions to the command’s POST route, instead of showing ‘No query is exposed’. (#680)
- Stage (Release v4.190.3): Navigation rail items, sidebar entries and toolbar buttons now draw their authored icons in Play; generated applications install the Lucide icon library the icons come from. (#681)
- Stage (Release v4.190.2): Modeled queries now answer when the Stage is served under a path prefix, such as Studio’s Play, instead of every table showing “The query could not be answered” (#689)
- Orleans (Release v1.27.2): Test projects are no longer packed as NuGet packages (#134)
- Specifications (Release v4.1.3): Sample test projects are no longer packed as NuGet packages (#58)
- Fundamentals (Release v7.25.2): The Fundamentals test project is no longer packed as a NuGet package (#1201)
- Scene (Release v4.78.3): A command field in a preview that no shown row carries no longer starts with generated words: a free-text field (a label, a reason) starts empty, and a code-like field (
locationCode,sku,orderNumber) starts with a code built from its name, such asLOCATION-1001. Ids, numbers, dates, names and emails still start with a generated value. (part of Cratis/StudioIssues#1006) - Scene (Release v4.78.3): A command field in a preview no longer starts with a module navigation section label: command fields take values only from the rows the application’s own screens show. (part of Cratis/StudioIssues#1006)
- Stage (Release v4.190.1): Date fields in generated command forms now submit the calendar day the user picked (
yyyy-MM-dd) instead of a time-zone-shifted timestamp, so commands with a date-only property no longer fail with “incompatible with its target type” in Stage Play or in generated applications. Date-and-time fields keep submitting a timestamp and now show a time picker. (#684) - Scene (Release v4.78.2): The preview host now also resolves seed queries declared by the blueprint templates a screen is composed with, such as the
ModuleSectionsmodule navigation of theWorkspaceScreenfoundation template, so sample data packs that supply those rows fill the navigation instead of leaving it on “Nothing here yet” (part of Cratis/StudioIssues#999) - Stage (Release v4.190.0): A toolbar declared once on a feature had to be copied into every screen of it.
- Scene (Release v4.78.1):
NavigationRegionViewtreats a bare icon name as a key ofCratis.Icons.Lucide(the library the built-in icons come from), so the compact and slim rails and the application toolbar buttons of a Screenplay-made application show their icon instead of an empty box. A qualified reference (library#key) is read as before, and an item with no icon stays markeddata-scene-iconless. - Stage (Release v4.189.7): Playing a model with several modules in the Stage sandbox no longer answers role-gated queries and commands with 403. Stage now picks a persona for each API request from the authorization of the operation being called, including requirements from its module, feature and the operation itself. It prefers the user menu’s persona when that persona qualifies, otherwise the first declared persona that qualifies, and otherwise the persona it chose before. Incoming
x-ms-client-principalheaders are still removed and forwarded-identity trust stays off, so callers still cannot choose an identity. This applies only in sandbox mode, which the Stage Docker image turns on. (#676) (part of #599) - Stage (Release v4.189.6): A guarded action (
action "Approve" when item.status == "draft" execute ...) beside a collection is read against the row selected in the table, as the Screenplay documentation says, instead of staying disabled withSTAGE-SCENE-ACTION-001; it is offered once a row is selected and only for rows its guard holds for. (#677) - Screenplay (Release v4.238.0): A toolbar could not be declared on a feature or a module (
PLAY0024); the same buttons had to be copied into every screen. - Screenplay (Release v4.238.0): A toolbar item could not carry a confirmation (
PLAY0103). - Scene (Release v4.78.0): A toolbar button linked to a command that changes things could not ask before it ran.
- Chronicle (Release v19.104.0): A webhook receiver that keeps failing or throttling no longer holds up delivery to other webhook targets. (#5106)
- Stage (Release v4.189.5): Projections can remove a read model by a required scalar event property whose type matches the read-model identifier. Rendered applications, the Host and the specification executor remove only the instance at that key and keep instances at other keys. Optional, missing, composite and parent removal keys are still refused. (part of #512)
- Stage (Release v4.189.5): Generated specifications that assert a read model is absent can now seed complete scalar
givenread models for independent projections, and can assert presence at another key beside the absence, with or without an action. Partial or null seeds, seeded decision reads, reducers, dependent scopes and seeded query combinations are still refused withSTAGE-ESM-011. (part of #512) - Stage (Release v4.189.5): A property-keyed removal whose event has no event source is refused with
STAGE-ESM-051when anallblock observes the read model, instead of rendering a projection with an invented event source. (part of #512) - Stage (Release v4.189.4): Stage Play and generated applications run and render Cratis Scene 4.77.0:
kanbanBoardtakescardId,cardTitle,cardColumn,cardAssigneeandcardFields, so a Screenplay board can show the cards of a query row (Screenplay#968), a grid child spans the columns its arrangement gives it (#659, supersedes #669 which conflicted with main), rail layouts keep the label of an icon-less navigation item (Scene#230), a slice owns the screen it declares (#207). - Stage (Release v4.189.3): Models that declare no
ui profile, layout or screens now play in the default shell with navigation to their generated screens, instead of a blank page showing “Unresolved component: Application”. (#656) - Stage (Release v4.189.2): A toolbar action such as Dispatch on a list screen submits the selected row’s identifier (
orderId) instead of a freshly invented uuid, so commands on an existing entity no longer fail with “does not exist” (Cratis/Stage#670). An address parameter still wins, and rows that disagree supply nothing. - Stage (Release v4.189.1): The Stage sandbox (Play) now answers role-gated queries and commands as a persona from the model instead of returning 403. Stage picks the persona named by the user menu’s
role. Without one, it picks the persona that the modules’authorizerequirements admit, and otherwise the first declared persona. The persona’s roles and claims come from its policies. Incomingx-ms-client-principalheaders are removed and Arc’s forwarded-identity trust stays off, so a caller cannot choose another identity or add roles. This applies only in sandbox mode, which the Stage Docker image turns on. Rendered applications and hosted deployments are unchanged. SetStage__Sandbox__Identity=falseto turn it off. (#664) (part of #599) - Scene (Release v4.77.1): A command field in a preview starts with the value of the same property in the rows the screens show (an SKU, a currency, an order number the application seeds) before a value generated from its name. A SKU field no longer starts with “Fornyelse gjennomgang kunde avtale rapport”. Cratis/Scene#236, Cratis/StudioIssues#1006
- Scene (Release v4.77.0): Screenplay#968: a Screenplay
boardcould not say its cards, because a query row (productId,name,status) has noid/title/column; the Acme pricing board, orders pipeline and picking queue had to fall back to a table. They can now usecomponent Cratis.Blueprint.Default.kanbanBoardwithproperty cards from query ...and these field names, the same waydataListtakesidField/titleField. - Chronicle (Release v19.101.3): Replaying the kernel’s event-type statistics no longer lets one namespace’s replay redirect or clear the shared store-wide statistics of every other namespace. Statistics are now kept per namespace, and the store-wide statistics combine every namespace’s rows, with the same query and response as before. (#5172)
- Chronicle (Release v19.101.3): Replaying a globally scoped projection, in full or for a single partition, is now refused before anything is written, including a partition replay resumed after a restart.
- Chronicle (Release v19.101.2): Projections with nested children no longer get stuck when a parent is removed. A change to a nested child whose parent collection is no longer in the read model is now skipped, the same way it already was when the child itself is gone, instead of failing with MongoDB error 2 on every catch-up and replay. (#5190)
- Arc (Release v22.134.3): A
ReadOnlyDbContext(and other Entity Framework Core contexts) resolved through Arc now uses theIConnectionResolver-based connection resolution configured withWithEntityFrameworkCore, instead of Arc’s convention bindings silently replacing it. The MongoDB and core connection resolvers are protected the same way. (#3478) - Stage (Release v4.188.6): Screens in a rendered application read modeled queries through their generated Arc query proxies instead of raw requests, so the configured API base path, origin, microservice and authorization headers apply to every query (part of #499)
- Stage (Release v4.188.6): Live tables in a rendered application keep their rows when Arc delivers later updates as change sets; added, replaced and removed items now update the table instead of emptying it (part of #499)
- Stage (Release v4.188.6): The live Stage host reads queries through Arc’s direct query mode, including synthesized slice tables and same-named queries in different slices, which are resolved by the route the host attaches to each element (#499)
- Stage (Release v4.188.5): The task dialog of a toolbar slice button and the fields of an auto form no longer ask for a generated property such as a new entity’s identifier; the schema they are built from leaves it out, as the command routes already did (#662).
- Stage (Release v4.188.4): The semantic sandbox no longer refuses a whole application because it contains public events, foreign events or Translate slices. Local commands and queries run, public events are published into the sandbox’s own event log only, foreign events arrive through seeds, and each rendered-around artifact appears as a
renderedAroundentry on/stage/semantic/admissionwith a startup warning. A restart over a log that holds published events is refused with an explicit message; start a fresh session (#655) - Stage (Release v4.188.4):
/stage/scene,/stage/routesand/stage/localesstay available when the host is in refused mode, so the browser shows the refusal instead of “Unable to render this Stage — 404” (#655) - Chronicle (Release v19.101.1): Changing a projection definition so that it maps event types that already have history no longer replays only the affected partitions on top of the live read model, where events could be rejected or applied twice. With the
Automaticreplay policy the projection is now fully rebuilt; withPartialOnlyorManuala full replay is recommended. Explicit partition replay is unchanged. (#5171) - Scene (Release v4.75.6): In the slim and compact layouts the label of a navigation item is hidden because a rail shows the icon; an item without an icon was therefore an empty square (the Acme Warehouse sidebar on production: every entry invisible). An item without an icon is now marked (
data-scene-iconless) and keeps its label, small and wrapped, in the rail. Cratis/Scene#230 - Arc (Release v22.134.1): Claim-based tenancy (
UseClaimTenancy) now resolves the tenant after authentication even when something read the tenant earlier in the request, for example middleware registered through a startup filter. Previously the first, unauthenticated read pinned the request to no tenant. (#3475) - Scene (Release v4.75.5): The preview now lays out a grid arrangement with the column spans its template gives: a workspace screen’s module content takes three of its four columns and a master/detail screen’s details take two of three, instead of every slot squeezing into one equal narrow column. (part of Cratis/StudioIssues#986)
- Chronicle (Release v19.100.1): An observer’s stored position no longer moves backwards when it changes state while a batch is still being handled, so a later catch-up no longer delivers those events again or counts them twice (#5078)
- Chronicle (Release v19.100.1): Observers no longer keep partitions marked as in flight forever after an upgrade: a marker left by an earlier version is cleared once its partition has been handed to catch-up, replay or failed-partition recovery, and only stays when that recovery could not start (#5078)
- Chronicle (Release v19.100.0): A webhook delivery that runs longer than the observer’s subscriber timeout is now cancelled, and the retry for that partition starts only after the abandoned request has finished. Before, a slow receiver could get the same events several times, some of them concurrently. (part of #5014)
- Chronicle (Release v19.100.0): Deactivated webhooks no longer come back as active when read from MongoDB or SQL storage. (#4581)
- Stage (Release v4.188.2): The details panel of a master-detail screen no longer shows “The query could not be answered.” straight after the screen opens (Cratis/Screenplay#987): the details query that needs a key was fetched without one.
- Chronicle (Release v19.99.1): Provisioning an encryption key is now atomic on every key store. Two kernels that provision the same subject’s key at once always end up using the same key: SQL and MongoDB no longer return a key that was never stored, HashiCorp Vault writes with check-and-set, and Azure Key Vault elects one key among concurrent writers. If the winning key cannot be read back, provisioning fails instead of encrypting with a key that would be lost. (#3745)
- Chronicle (Release v19.99.1): Erasing a subject on Azure Key Vault now purges every revision of the encryption key instead of only soft-deleting it, so the key cannot be recovered from the vault’s deleted secrets. If the vault refuses the purge (purge protection, or a missing purge permission), erasure fails instead of reporting success. (#3674)
- Stage (Release v4.188.1): A screen on a blueprint template no longer draws the template’s demo copy in the slots it does not fill: a list screen shows its header and its table, without the blueprint’s “Search deals” box and the “Nothing here yet” empty-state blocks beside them. A slot a screen leaves unfilled is explicitly empty, as the Studio preview already draws it. (#641)
- AI (Release v7.97.2): Headless Claude workers are no longer blocked by a repository’s
askpermission rules, such as the Cratis corpus asking beforegit pushandgh pr. The worker answers those prompts itself, while the repository’sCLAUDE.md, skills, hooks anddenyrules still apply. - Stage (Release v4.188.0): A
seedDateTime written as"2026-10-10T08:00:00Z"no longer leaves the whole event source unseeded (STAGE-SEED-005). Values of a DateTime property, also through concepts, lists and composites, are stored in the round-trip form the runtime rebuilds from, so a played Sales, Purchasing or Warehouse model starts with its seeded data. (#650) - Stage (Release v4.187.3): A projection that adds or subtracts a product (
add total by unitPrice * quantity,subtract stock by size * count) is now refused with a message naming the factor when Stage converts it to a projection definition or renders it as a model-bound read model, instead of silently summing only the first operand. Applications rendered through the semantic renderer keep computing the product. (#627) - cli (Release v3.93.3): The CLI now bundles Prologue 2.0.3: interpreting a capture without a language model produces a model that passes executable validation, and
prologue startprints thecratis/prologue-extractor:2.0.3image. (#434) - Scene (Release v4.75.4): The application toolbar buttons of a topbar region were drawn on a second line under the region’s items, outside the 64px topbar and covered by the item row, so a press hit the item instead of the button (found on production 0.253.0 with Acme-style
buttonlines). The topbar region now lays its items and its buttons out in one row, inside the bar. (Cratis/Scene#215) - Stage (Release v4.187.2): A command form (add to basket, the checkout wizard) in a Stage served under a path prefix, such as Studio’s Play at
/api/play/{id}/, posted to the root of the host and was refused with405: the form is Arc’s ownCommandForm, which builds its command from Arc’s default configuration, whose base path is empty, so the earlier fix in the command executor (#634) never reached it. The form now points its command at the path the page is served under before it executes (#618). - cli (Release v3.93.1):
prologue startnow prints an Extractordocker runcommand that mounts your captures folder into the container, so captures are no longer lost when the container exits, and publishes the OpenTelemetry ports 4317 and 4318 when you capture from OpenTelemetry. The command pins the Extractor image to the bundled Prologue version, andcratis-prologue.jsonkeeps the captures folder you chose, soprologue interpretfinds the captures without a path. (#426) - Prologue (Release v2.0.3): Each inferred command produces only the events its own correlated transaction recorded, also when similar routes such as nested
/owners/{id}/pets/neware merged into one slice. - Prologue (Release v2.0.3): An event used by several slices is declared once, so models no longer report it as ambiguous or as a duplicate stored name.
- Prologue (Release v2.0.3): An insert followed by an update of the same table inside one transaction is read as one creation instead of a separate edit.
- Prologue (Release v2.0.3): Required numeric properties, such as foreign keys, no longer get a text-only
not emptyrule. - Prologue (Release v2.0.3): Every read model that a generated query or projection uses is declared, keyed explicitly on its row identity. (#46)
- Screenplay (Release v4.236.1): Screenplay MCP no longer selects a project’s code-only
Sourceorsrcdirectory as its model root. A server started on a model-free code folder can open a sibling model folder without relaxing other fixed-root boundaries. (#992) - Chronicle (Release v19.98.0): Testing an OAuth authorization from the Workbench now uses the configured scope, and a webhook is no longer sent with an empty
Bearerheader when no token could be acquired (#5139) - Stage (Release v4.187.1): A slice dialog asks for an identifier nothing supplies, such as the product a basket line names, instead of submitting without it. The identity the command itself acts on (its
identifier) stays hidden and is created for the session. (part of #613) - Stage (Release v4.187.1): A screen keeps its session identities out of its own parameters, so a dialog no longer copies them into the address. (part of #613)
- Stage (Release v4.187.1): A screen keeps its components’ outputs while a dialog publishes its own. (part of #613)
- Stage (Release v4.187.1): Commands from a Stage served under a path prefix (Studio Play) now go to that prefix even when no Arc base path is configured. Arc’s default empty base path is treated as unset, and a configured base path still wins. (part of #618)
- Stage (Release v4.186.0): The five Acme Commerce Purchasing and Warehouse specifications refused with
STAGE-ESM-011(AutoReplenishDraftsAnOrderForThePreferredSupplier,AutoReplenishSkipsWhenAnOpenOrderCoversTheSku,AutoReplenishReportsAMissingPreferredSupplier,OfferingAProduct,AShipmentIsDispatchedOnce) render, build and pass: the Purchasing + Warehouse variant renders with an empty drop list,dotnet build0 warnings / 0 errors,dotnet test292/292. (#598) - AI (Release v7.96.1): The Claude Code transport reported every API failure that was not a rate limit as “Claude Code’s model request failed.” It now reads the CLI’s failure code (
authentication_failed,billing_error,invalid_request,server_error, or an unrecognized identifier-shaped code) and the HTTP status of the retries before it gave up, and says what to do. Only the code and the status are used - never the vendor’s own message text. - AI (Release v7.96.1): A Claude Code
server_erroris treated as transient, so another pool member can serve the call. - Stage (Release v4.185.0): The basket count in a storefront’s topbar stayed empty and did not follow add to basket (#610).
- Stage (Release v4.185.0): A form for a command with an enumeration, a record or a collection was a text box, a refused field or an unusable dialog; a review step did not start from the draft built by the earlier steps (#613).
- Chronicle (Release v19.93.1): A client whose event-store registration failed (for example on a schema rejection) no longer keeps retrying the registration in the background: the retry stops when creating the event store fails and when the client is disposed, so the event-store graph is no longer leaked. (part of #5053)
- Stage (Release v4.183.1): Play no longer refuses an application on restart when its store already holds the events from model seed blocks. Stored seed events are now rebuilt with the same checks used when they were seeded, and all other stored events keep exact validation. (part of #612)
- Stage (Release v4.183.0): The default blueprint’s own topbar no longer replaces the topbar a screenplay shell declares (Cratis/Scene#217). Part of #610.
- Stage (Release v4.182.1): A command submitted from a form in a Stage served under a path prefix, such as Studio’s Play at
/api/play/{id}/, is posted under that prefix instead of to the root of the host, where it was refused with405and nothing ran. (#618) - Screenplay (Release v4.235.0): A Screenplay document could not carry a domain’s logo, so every Studio export dropped it and every import started from initials (#966).
- Stage (Release v4.182.0): STAGE-ESM-050 no longer refuses projections that add or subtract a product of two event values.
- Screenplay (Release v4.234.1): Proposing and applying a change through the Screenplay MCP server is faster on large models: a proposal reuses the syntax index and reference layout it has already built for each revision, and applying it reuses the proposal’s workspaces instead of rebuilding them for the recovery journal. On a 260-file model, a propose uses roughly a quarter to a third less CPU time and an apply about seven times less. (#978)
- Scene (Release v4.75.2): The preview no longer refuses every screen of an application whose UI profile has its own root template with “The template … fits the slot ‘content’, which
and all declare (templateUnplaced)”. The preview diagnosis now places screen templates against the shell the screen is composed in, the same one the composition uses, so a root template that declares the same slot names as the screen’s layout is the one container. Cratis/Scene#225 - Stage (Release v4.181.0): A played Acme Commerce shop started empty because
seedblocks were never appended. (#612) - Prologue (Release v2.0.2): The Extractor, Interpreter and Receiver images are now published for both
linux/amd64andlinux/arm64, sodocker pullanddocker runwork on Apple Silicon Macs without--platform linux/amd64. (#45) - Chronicle (Release v19.92.2): Microsoft Entra ID authentication modes in SQL Server connection strings (
Authentication=Active Directory Managed Identity,Active Directory Default,Active Directory Workload Identity,Active Directory Service Principal) now work. Since Microsoft.Data.SqlClient 7 these providers ship inMicrosoft.Data.SqlClient.Extensions.Azure, which the kernel now includes. (#5126) - Chronicle (Release v19.92.2): The SQL Server and PostgreSQL health checks now connect with the identity from storage connection resolution, so a kernel whose credentials or access token come from a resolver no longer reports itself unhealthy. (#5138)
- Scene (Release v4.74.0): Selecting a product card in the storefront navigated with an empty key; a basket line could not be picked for a quantity change. (#217)
- Scene (Release v4.73.1): In the default AppShell’s compact rail the application name was drawn beside the logo over the breadcrumb and the first content; compact now draws the mark only, like slim and slim plus. (#220)
- Screenplay (Release v4.232.1): Proposing and applying changes, and the diagnostics that follow an edit, are much faster on large models. On a 260-file model,
propose-sourceandapplynow take about 15 seconds of CPU instead of about a minute and half a minute, and diagnostics after an edit take under a second instead of about five. Checking each command’sreads … byno longer resolves every query’s read model again for every read, and authoring reference checks no longer scan every declaration for each reference. Results are unchanged. (#949) - Chronicle (Release v19.92.1): Releasing a read model composed in code no longer logs a “no subject could be resolved” warning when every subject-scoped (
[PII]or secret) value on it is null. The warning still appears when a subject-scoped value is present and no subject can be resolved. (#4940) - Chronicle (Release v19.92.1): A
[NotProjected]member on a read model projected throughIProjectionFor<T>no longer registers a second, empty model-bound projection for it, so the extra observer that stayed Disconnected is gone. (#4964) - Stage (Release v4.179.1): Projections whose root scope only removes read models (removal blocks and nothing else, without a
fromblock) now render instead of being refused withSTAGE-ESM-017, and the Host and the specification executor run them when the removal is keyed by the event source. (part of #512) - Arc (Release v22.130.2): Observable MongoDB queries no longer drop a change silently when it cannot be applied. The query now ends with an error, so the client gets an error frame and can resubscribe, and the error log names the collection and document type. (#3414)
- Scene (Release v4.73.0): An own root template’s
content topbarwas replaced by the host’s default topbar. (#217) - Arc (Release v22.130.1): Arc releases no longer publish its spec fixture projects to NuGet. Any project under a
.Specsdirectory is now never packed. (#3452) - Arc (Release v22.130.1): The Entity Framework Core specs for tenant database resolution now pass on macOS. (#3356)
- Orleans (Release v1.27.1): Removing a job no longer finishes one report early when a step’s earlier execution reports its stop before the step’s current run succeeds or fails with no attempt left. The job now counts each step once. (#124)
- Orleans (Release v1.27.1): When an earlier execution’s stop arrives while the step’s current run is still alive, the job tells that run that the job is removed, so the run stops and deletes its own step record. (#124)
- Orleans (Release v1.27.1): A job whose removal could not be finished now retries finishing it automatically, starting after 1 second and backing off to once a minute, instead of waiting for another call to remove it. (#124)
- Chronicle (Release v19.91.2): A catch-up over many partitions no longer fails steps whose events were already delivered, or leaves the catch-up job running forever, when the per-step handled-event reports queue up on the observer. Reports are now cheap in-memory updates written together, a report resent after a timeout is not counted twice, a late report no longer fails a handled step, and any other step failure records a failed partition so it is retried. (part of #4954)
- AI (Release v7.90.1): The pull-request rule and the ship-changes prompt name the combined
policy / verifycheck that runs the release-note rules, instead of the retiredverify-release-notescheck. (#824) - Chronicle (Release v19.91.1): Projection and reducer writes to MongoDB that fail during a bulk flush are no longer silently dropped. Every affected partition is recorded as failed and retried, failed partitions carry the event source id instead of the read-model key, and a catch-up whose final flush has an unknown outcome fails instead of moving the observer past writes that may have been lost. (part of #4605)
Removed
Section titled “Removed”- No updates
Security
Section titled “Security”- AuthProxy (Release v2.32.3): Update frontend tooling dependencies to address high-severity undici and zod advisories. (#213)
- AuthProxy (Release v2.32.1): The web frontend now builds with vite 7.3.7, which fixes the high-severity launch-editor advisory GHSA-587h-7wmj-h5pm (#206)
- Prologue (Release v2.0.1): The Extractor and the Library sample now use
System.Security.Cryptography.Pkcs10.0.13, which fixes the .NET denial-of-service advisories GHSA-846f-f764-76mx and GHSA-2fmv-rv2c-59x7 in the versions they previously pulled in (#43)
Deprecated
Section titled “Deprecated”- Arc.Kotlin (Release v7.10.0):
io.cratis.arc.polymorphism.DerivedType: useio.cratis.fundamentals.serialization.DerivedTypeinstead. Classes that keep the Arc annotation work unchanged, with the same_derivedTypeIdvalues. (part of #301) - Arc.Kotlin (Release v7.9.0):
io.cratis.arc.naming.NamingPolicy,io.cratis.arc.springdata.mongodb.DefaultNamingPolicyand the constructors and auto-configuration factory methods that take the ArcNamingPolicy: useio.cratis.fundamentals.serialization.NamingPolicyandio.cratis.fundamentals.serialization.DefaultNamingPolicyinstead (part of #301) - Arc.Kotlin (Release v7.8.0):
io.cratis.arc.concepts.ConceptAsandArcCamelCase: useio.cratis.fundamentals.concepts.ConceptAsand the FundamentalstoCamelCaseinstead (part of #301) - Chronicle.Kotlin (Release v7.0.0): The old Chronicle
ConceptAsandCorrelationIdnames remain warning-level Kotlin typealiases for this major version; migrate imports to Fundamentals. (part of #151)