Release digest: October 12 - 19, 2026 (Week 42)
Version movement
Section titled “Version movement”- cli (Release v3.89.0):
cratis newuses the Cratis templates installed under~/.cratis/templates: the first run downloads the latest set from NuGet,--versionstill picks another version for a single run, and without network access an already downloaded set is used. See Template catalogue. (#164) - cli (Release v3.89.0):
cratis updatealso installs newer Cratis templates when they work with the installed CLI, never downgrading and never failing the update when templates cannot be refreshed;--no-templatesskips the check. (#164) - Screenplay (Release v4.229.0): The canonical corpus has a
SourcelessGivensCorpusvector that pins how specifications treatgivenevents withoutfor, across four source layouts. It covers constraint outcomes and the refusal to invent an event source identity. (#579) - Screenplay (Release v4.228.0): The MCP tool
propose-inline-eventfolds a slice-level event that has exactly one production into an inline event on that production, the inverse ofpropose-extract-inline-event. Executable bytes, identities and diagnostics are preserved, and canonical formatting consent is required. The tool refuses whenever the move could change meaning, for example a conditional production, incomplete mappings, generations, a public or external event, cross-slice or cross-document use, handlers, opaque text, comments that would be lost, or any other reference to the event. (#343) - Stage (Release v4.178.0): Applications rendered with classic reducers can migrate individual read models to self-reducing read models. A per-read-model override in
.cratis/stage/rendering.json(version 2) selects the self-reducing form, and the read model then carries[Reducer("<previous reducer full name>")]on every render, so Chronicle keeps the existing observer instead of starting a new one. See Migrating a classic read model. (#464) - Stage (Release v4.178.0):
ArtifactRenderPlan.RequiredRemovalslists files a publisher must delete together with the plan’s writes (path, expected SHA-256 and read model), andReducerMigrationEvidence.FromExistingFilebuilds migration evidence from the existing reducer file. Migration is refused withSTAGE-REDUCER-001toSTAGE-REDUCER-004when the override, evidence, removal capability or plan scope does not allow it. (#464) - Stage (Release v4.178.0):
CratisRendering.CheckPublicationreturnsUnsafeRemovals(STAGE-REDUCER-005) when a file to remove has changed since the evidence was taken, or when a migrated read model’s previous reducer file would be left behind. (#464) - Orleans (Release v1.26.0):
IJobStopFinalization, implemented by every job:FinalizeStop()finishes a stop or removal that the job’s silo went away before finishing. Rehydration calls it for every stopped or removing job whose stop is not yet finished. - cli (Release v3.87.0):
cratis release-notesshows the release notes of the CLI in the terminal:--since <version>lists every release after a version,--version <version>shows one, and-o jsonreturns them for scripts. Notes for every earlier release ship inside the CLI, so it works offline. See Release notes. (#153) - cli (Release v3.87.0): After
cratis update, the CLI shows the notes of every release you skipped; when there are several it asks before opening them. (#153) - AI (Release v7.89.0): An opt-in
cratis/playwrightprofile that declares a pinned, headless and isolated Playwright MCP server for exploratory browser checks. The installer and Pi do not register it yet, so each user registers it in their own MCP configuration; the profile documentation gives the command. (part of #364) - Screenplay (Release v4.227.0): A
ui profilecan name a package-provided theme by its quoted display name, such astheme "Scene Default Light". A quoted name that the document does not declare refers to a package theme and is not reported as unknown (PLAY0231); a quoted name that matches a declared theme resolves to it and is checked for compatibility. Empty, blank or unterminated quoted names reportPLAY0229. Identifier theme names are unchanged. (#880) - Components (Release v4.34.0): The paginator range text (“1–10 of 32”) can be localized: set
range(start, end, total)on the provider’s paginator messages or onTablePaginator’sariaLabels. The English default is unchanged. (#420) - cli (Release v3.85.0):
cratis screenplay conform-namespace <model> --event-store <store> --namespace <namespace>compares a.playmodel with what a running Chronicle namespace actually holds: registered event types, appended events and their producing commands and reactors, and the namespace’s observers. It reads event metadata only (never payloads, event source ids or command values), scans up to--max-events(100000 by default) or a--from/--torange up to the tail captured at the start, and reports a partial scan as such. Output is Screenplay’s observation report in human or JSON form; drift exits non-zero only with--fail-on-drift. (#200) - Components (Release v4.33.0): The dialog provider messages accept
refused, the text announced when a confirm is refused and the dialog stays open. The default is “The action was not completed. Review the dialog and try again.” (#424) - Components (Release v4.32.0):
DataTableCore,DataTableForQuery,DataTableForObservableQueryandDataPageaccept afilteredEmptyMessage, shown instead ofemptyMessagewhen a search or column filter is active and no rows are shown. The defaults come from the provider’s data table messages:filteredEmpty(“No rows on this page match the search.”) when the table filters the loaded page, andfilteredEmptyServer(“No rows match the search.”) in server mode. (#423) - Components (Release v4.32.0):
DataTableForQuery,DataTableForObservableQueryandDataPageacceptonGlobalFilterChange, called with the search text as the user types, so an application can tell that a search is active. (#423) - Components (Release v4.31.0):
GuidField, an opt-in command form field forGuidproperties, exported from@cratis/components/CommandForm. It keeps nativeGuidvalues, lets the user type partial drafts, shows format and required errors, and never generates identifiers. On Arc and Arc React 22.19.1 or later an invalid draft blocks submission; on older Arc it shows the error and leaves the value empty. It is not registered by default: register it withregisterFieldTypeProviderto use it inAutoCommandForm, as shown in GuidField. Errors you set on the field yourself are left intact. (#314) - Stage (Release v4.176.0): Stage admits ESM v29 and v30 (Screenplay 4.226.0).
decimals <= Nrules run in the executor and the Host and render as generated validators, so a third decimal onMoneyis refused where it enters. - Stage (Release v4.176.0): A specification can pin the generated values of a command a reaction invokes with
given generated <Command>.<property> = <value>: the executor feeds each invocation the next pinned value, and the generated reaction specification carries it, so reactions that create records with generated ids are specified instead of left unsupported. - Stage (Release v4.176.0): A command that appends to several event sources runs and renders like any other command.
- Stage (Release v4.175.0): The Cratis renderer renders the specification of a command that is rejected by a concept rule on one of its own literal inputs even when the command a reaction invokes carries the same concept and message. The input fails while binding, before any event is appended, so no reaction can run. Such specifications were refused with STAGE-ESM-011 (“generated CommandScenario specifications do not settle reactions yet”). (part of #503)
- Stage (Release v4.174.0): The Cratis renderer renders models whose generated C# names would collide instead of refusing them with STAGE-ESM-012. A command property named like its command or like a reserved member (such as
HandleorToString) gets a trailing_(for exampleText_), and its JSON field, generated proxy property and form field becometext_. A query named like its read model or one of its properties gets a trailing_on the method and proxy name, while its HTTP route keeps the original name. Only colliding names change; every escape is reported as the information diagnostic STAGE-ESM-050 naming the declaration and the emitted name. (#502) - Stage (Release v4.173.0): Commands whose individual productions name their own event source, stream or stream id (
produces ... to <stream>) now run in specifications and the semantic Host, and render to Arc commands that append each event to the route the model names. (#262) - Chronicle (Release v19.90.0): New
MaxConcurrentPartitionsoptions for reactors and reducers inChronicleOptionsset how many partitions of one reactor or reducer the .NET client handles at the same time. The default is the processor count, capped at 8;1restores one-at-a-time handling. (part of #4664) - Stage (Release v4.172.0): Live (
observable) queries now push updates from the Stage Host and the generated and Host-served frontends: list screens update as the read model changes, including after commands from another client, without a refresh. Snapshot queries still answer once. (#366) - Arc (Release v22.127.0): Observable queries now report metrics for active subscriptions and pushed updates, and trace each push with a
cratis.arc.query.pushspan. The metric and span names are available as constants onWellKnownTelemetryNames. (part of #2915) - Stage (Release v4.171.0): Rendered specifications assert that a read model is absent (
then no <ReadModel> <key>) for scalar keys, so models with absence assertions render instead of being refused with STAGE-ESM-027. Absence on composite or other non-scalar keys is still refused with STAGE-ESM-027. (#508) - Arc (Release v22.126.0):
ProtectedDecisionServiceProviderFactoryandBuildProtectedDecisionServiceProvider()build a Microsoft DI provider that Arc can certify. In a[ProtectedDecision]command running in a scope of that provider, discoverable validators whose constructors takeDecisionRead<T>, the command-awareIDecisionReads, or freshly constructed transient collaborators are constructed per invocation and run. Previously these validators were refused. See https://github.com/Cratis/Arc/blob/main/Documentation/backend/csharp/chronicle/consistency/certified-validators.md. (#2831) - Arc (Release v22.126.0):
AddProtectedDecisionValidator<TValidator>(configure)registers a validator whose extra rules, added inconfigure, apply to that fresh instance. Use it instead of a factory or instance registration, which protected decisions still refuse. (#2831) - Stage (Release v4.169.0): Stage now renders read models with composite keys instead of refusing them. Projections key each instance by all of its key parts through Chronicle’s typed composite keys, and
fromandremove withblocks and list queries with equality filters work over such read models. Single-instance queries by key parts stay refused until Chronicle supports them (STAGE-ESM-047). (#481) - Screenplay (Release v4.224.0):
Samples/Catalog,Samples/Vendors,Samples/Billing(the Invoicing blueprint;Samples/Invoicingis the living language sample),Samples/CustomerPortal,Samples/Contracts,Samples/WorkOrders,Samples/Bookings: each an application whose every screen fills a template of its blueprint (template blueprint Cratis.Blueprint.<Name> <Template> version "^1.0"), with the navigation declared in the layout, the blueprint’s own sample-data pack as the preview data, events feeding the list, board, calendar, timeline, dashboard, inbox and profile views, and a specification for each slice. - Screenplay (Release v4.224.0): The conformance vectors (golden syntax) for the seven samples and their entries in the sample list.
- Screenplay (Release v4.224.0): The blueprint render check (
render-blueprint-samples.sh) renders the seven samples with the published packages. - AI (Release v7.86.0):
cratis-engineering-consolidation-guardskill: when folding several pull requests into one, re-landing reverted work or restoring commits by cherry-pick, prove nothing was dropped — per-commit pairing by patch-id andrange-diff, per-file content checks that catch merge resolutions which revert or lose files, and a specification-file ratchet. Ships a portableverify-consolidation.sh(with--discoverand--self-test) and the pattern for running it as a required pull request check, with accepted losses recorded as commit trailers. (#413) - AI (Release v7.86.0): A GitHub Copilot
plugin.jsonat.cratis/ai, so the Cratis skills can be submitted to github/awesome-copilot. Itsversionis the plugin manifest version, kept equal to the marketplace manifests by corpus verification. (#503) - Screenplay (Release v4.223.0): A new MCP tool,
trace-lineage, traces one read-model property back to its sources. It follows every projection or reducer mapping, AutoMap, join and child mapping to the event property, then to the command property or capture source that produces it, and returns the result as a paged tree. A missing mapping or producer is reported at the hop where the chain breaks, several sources appear as branches, and code the model cannot see into is marked as opaque instead of guessed. The tool is read-only and advisory. (#388) - Screenplay (Release v4.222.0): The TypeScript compiler’s completeness API reports privilege (PLAY0652), purpose (PLAY0602–PLAY0606) and persona (PLAY0574–PLAY0576) findings when
privilege,purposes,personas, one of their codes orallis selected, matching the C# compiler, so browser and VS Code editors can show them without the native compiler. (part of #527) - Components (Release v4.30.0):
DataTableForQueryandDataTableForObservableQueryaccept an opt-inserverQuerythat filters and sorts the complete server result before paging: the table’s sort is sent as ArcsortBy/sortDirection(optionally renamed throughsortFields), column filters and search text become query arguments through yourtoArgumentsfunction, rows are shown as the server returns them, and any change goes back to the first page with search debounced (300 ms by default).DataPagepasses it through. WithoutserverQuerythe tables keep filtering and sorting the loaded page only. The query must return anIQueryableor use MongoDBObserveand apply the filter arguments itself; see Data tables. (#178) - Scene (Release v4.71.0):
@cratis/scene.blueprint.catalog- catalog overview dashboard, products list, product page (variants, price history), categories list;catalog-enpack. Tracks #167. - Scene (Release v4.71.0):
@cratis/scene.blueprint.vendors- vendors list, vendor page (contacts, purchase orders, certificates), onboarding board, performance dashboard;vendors-en. Tracks #168. - Scene (Release v4.71.0):
@cratis/scene.blueprint.invoicing- receivables overview, invoices list, invoice page (lines, payments, record-payment dialog), payments list, due-date calendar;invoicing-en. Tracks #169. - Scene (Release v4.71.0):
@cratis/scene.blueprint.customer-portal- portal home, orders and order page, invoices, support inbox, profile;customer-portal-en. Tracks #170. - Scene (Release v4.71.0):
@cratis/scene.blueprint.contracts- contracts list, contract page (parties, obligations, amendments), terms timeline, needs-attention inbox;contracts-en. Tracks #171. - Scene (Release v4.71.0):
@cratis/scene.blueprint.work-orders- work orders list, work order page (tasks, parts, time), board, visit schedule;work-orders-en. Tracks #172. - Scene (Release v4.71.0):
@cratis/scene.blueprint.bookings- bookings calendar, list, booking page, resources as cards, new-booking wizard;bookings-en. Tracks #173. - Scene (Release v4.71.0): Every package: navigation, thumbnails, category
Business / <Domain>, specifications for the definition of done of every template, the screen set, the application behaviour, every forced standard state, and the Chromium audit at desktop, tablet and phone widths in both themes with colour contrast. - Scene (Release v4.71.0): Docs
blueprints/<domain>-blueprint.md, the table of contents and the index; the packages join the browser specifications of the JavaScript build; the rootblueprintCatalog.jsonlists all fifteen domain blueprints. - AI (Release v7.85.0): A committed Screenplay model can be marked as generated evidence with
"modelFirst": { "frozen": true, "reason": "…" }in.cratis/ai.json. The model-first status check then reports it as not opted in (frozen-model), and agents leave it alone unless a request names it explicitly. (#514) - AI (Release v7.85.0): A
processblock in.cratis/ai.jsonroutes the Screenplay lifecycle to the project’s own stores.decisionssets the decision folder and id pattern,workItemsthe backlog,acceptancethe split between the person who confirms the model’s meaning and the person who commits it, andagentslists project addenda that the Screenplay modeler, reviewer and renderer read after their own instructions. Addenda can only narrow what an agent does. (#514) - AI (Release v7.85.0): The P6 acceptance step supports split acceptance, recorded as
Model-Meaning-Accepted-By:andModel-Committed-By:commit trailers with role and GitHub handle. (#514) - Chronicle (Release v19.88.0): Fluent
FromEveryandFromAllmappings can set a constant withToValue(...), matchingSet(...).ToValue(...)for concepts, enums andnull. (#4663) - Stage (Release v4.164.0): Run modeled specifications with composite event values in given, appended and produced events, in both the specification executor and the semantic Host; expected events match composite members regardless of member order. (#441)
- Arc (Release v22.125.0): Composite keys of protected read models are validated through accessors the Arc source generator produces, with no reflection. Key types the generator cannot see — partial, external, derived or from experimental assemblies — can be registered with
ProtectedReadModelKeyAccessors.Register<T>(...). See Protected key accessors. (#3392) - Arc (Release v22.125.0):
ProtectedReadModelKeyOptions.Strictrejects composite key types that have neither a generated accessor nor a registration, instead of falling back to reflection. Under NativeAOT this is always the behavior. (#3392) - Arc (Release v22.125.0): Analyzer diagnostic ARC0030 reports a composite key type the generator cannot produce an accessor for. (#3392)
- Stage (Release v4.163.0): Rendered applications and
ui profileresolution can use the default blueprint’sDashboardShellandMinimalShelllayouts, which ship with Scene 4.70.1. - Screenplay (Release v4.221.0):
find-modeling-smellsreports a new advisory rule,SMELL006, which asks about an event property that no mapping, AutoMap, reaction, condition or specification reads. (part of #393) - Chronicle (Release v19.87.0):
AddCratisChronicleoverloads with a trailingconnectionStringNameparameter that choose whichConnectionStringsentry to read, for an Aspire resource that is not namedchronicle. (#4917) - Chronicle (Release v19.86.0): Reactor and reducer deliveries carry a delivery id, which the .NET client returns with each result. Clients that do not return it keep working: their results complete the oldest outstanding delivery for the partition. (part of #4664)
- Stage (Release v4.161.0): Behaviors, interaction actions, composition values, contributions, forms, screen directives, screens, UI profiles, command form schemas and UI syntax now report unsupported model content as typed conversion diagnostics (code, severity, construct, path and source location) instead of aborting the whole Scene conversion; the rest of the Scene still converts. New codes:
STAGE-SCENE-BEHAVIOR-*,STAGE-SCENE-ACTION-002/-003,STAGE-SCENE-COMPOSITION-*,STAGE-SCENE-CONTRIBUTION-*,STAGE-SCENE-FORM-*,STAGE-SCENE-DIRECTIVE-*,STAGE-SCENE-SCREEN-*,STAGE-SCENE-PROFILE-*andSTAGE-SCENE-SCHEMA-*. (#532) - Chronicle (Release v19.84.0): A batch append, a unit of work and
AppendManycan now carry one concurrency guard for each stream of the same event source, for example a guard onREPORT / SendApprovalsand another onREPORT / Corrections / <id>. The kernel validates them all before writing anything, so the batch stays atomic. Events for several streams of one event source previously kept only the first stream’s guard, or failed withIncompatibleConcurrencyScopesForEventSource. (#4818) - Chronicle (Release v19.84.0): New
AppendManyoverloads onIEventSequencetake a list of event source id and concurrency scope pairs, so one event source id can appear with several scopes. (#4818) - Chronicle (Release v19.84.0): A concurrency violation now reports which guard failed (
ScopeIndexandScope). (#4818) - Screenplay (Release v4.220.0):
propose-renamecan rename a composite stream id part. It renames the part declaration and everypart = …mapping in command routes, specification routes, examples and redelivery locators. Part order and stored stream ids stay the same, and the rename is refused when the new name collides with another part of the same stream. (#575) - Screenplay (Release v4.219.0): The
PLAY0516timeline-order repair can now replace a folder glob import with an explicit, ordered list of imports when no safe move or pin fixes the order. Every document the glob reached is kept, and the reordered model is verified before it is offered. (#573) - Screenplay (Release v4.219.0): The TypeScript compiler offers a quick fix for
PLAY0516, including edits in the importing document, and the web editor shows it as a code action. (#573) - Screenplay (Release v4.219.0): VS Code offers the
PLAY0516repair as a reviewed code action, with the same preview, drift checks and recovery as the other saved-file repairs. (#573) - Stage (Release v4.158.0): Given read-model state in a specification seeds that read model per key: the seed replaces earlier projected state for its key, later events still fold into it, other keys keep their history, and commands invoked during the run see the same seed. (part of #15)
- Stage (Release v4.158.0): Seeded read models that have no projection are returned exactly as seeded in read-model and query assertions. (part of #15)
- Stage (Release v4.158.0): Query assertions that supply equality filters run against the projected and seeded read models: filters combine with the key, omitted optional filters do not narrow the result, and rows are matched regardless of order. (#546)
- Orleans (Release v1.25.0):
Job.OnBeforeDispatchingJobSteps(JobStepDispatchContext), an optional hook that runs before any step starts, both when a job starts and when it resumes.JobStepDispatchContext.InitializationMayBeIncompleteistruewhen the job is recovering from a crash during startup, so the job can finish or repeat its own one-time initialization (#40) - Orleans (Release v1.25.0):
CannotResumeJobError.MissingStepPlan: a job saved by an earlier version while it was preparing or starting its steps cannot be resumed safely and now fails with this reason instead of being planned again (#40) - Orleans (Release v1.25.0):
StartJobError.InvalidStepPlan: starting a job fails early when a step request cannot be saved and read back as JSON (#40) - Screenplay (Release v4.218.2): A new warning,
PLAY0803, reports amatchespattern that can backtrack exponentially in browser engines, such as(a+)+$,(a|a)*or(a*)*, and names the ambiguous subexpression with a simpler rewrite where one exists. The C# compiler, the TypeScript compiler, Monaco and VS Code report it identically; very large patterns are not analyzed. (#806) - AI (Release v7.84.0):
PreviewAgentTierquery shows, beforeConfigureAgentis applied, what a proposed tier resolves to on the agent’s provider or on each member of its pool: the model, where it comes from (configured, derived, borrowed or subscription alias) and whether the tier would be refused, with the reason (#759) - AI (Release v7.84.0):
PreviewProviderTierModelsquery resolves every tier against a proposed provider tier mapping beforeSetAIProviderTierModelsis applied; a tier left out derives from the provider’s catalog, exactly as it would after applying the mapping. See provider harnesses (#759) - Stage (Release v4.157.0): The Stage frontend runtime is published to npm as
@cratis/stage.runtimewith every Stage release, at the same version as the Stage packages, with provenance. It carries the Stage application shell, command execution through Arc proxies, data sources, navigation and Stage components, with Arc, Scene, Cratis Components and React as peer dependencies. Rendered applications still embed the runtime for now; switching them to the package follows. (part of #499) - AI (Release v7.83.0): The Screenplay modeling skills teach the explicit author-intent
PLAY0470repair: discover repair intents, page both destination report views, choose a destination for every production, then apply. The corpus pins Screenplay 4.216.0 and its compiler contract (#784) - AI (Release v7.83.0): The streams, command-surface, model-authoring and toolchain skills teach
PLAY0802(ReservedStoredName): a stored event stream namedAllor stored event source namedDefaultis refused while authoring, a pin away from the reserved name is valid, andPLAY0273remains the binding backstop (#776) - Screenplay (Release v4.218.0): The TypeScript compiler’s completeness API reports conflicting screen data bindings (PLAY0530) and screen data that does not match its query (PLAY0531) when
data-bindings, either code orallis selected, matching the C# compiler, so browser and VS Code editors can show them without the native compiler. (part of #527) - cli (Release v3.80.0):
cratis chronicle streams closed listlists the closed stream scopes of an event sequence with their dimensions, origin, owning constraint, sequence number and closing time, filtered by event source id or type and event stream type or id; table, plain and JSON output. Requires Chronicle 19.39.0 or later. (#304) - cli (Release v3.80.0):
cratis chronicle streams closed reopen --reason <text>repairs a mistaken manual close of one exact scope, after confirmation (--yesto skip); the kernel records the reason and actor as aStreamScopeReopenedevent and refuses closures owned by a closing event. (#304) - Stage (Release v4.155.0): Execute
AllGreaterThanandAllGreaterThanOrEqualcollection validation rules in modeled specifications and the semantic Host, with rule-specific refusals for unsupported operands or collection types. (#523) - Screenplay (Release v4.217.0):
GenerationFixturesCorpus.V21R2andGenerationFixturesCorpus.SourceFormsV21R2: an additive ESM v21 generation fixture revision whoseTenantOrderIdgeneration body is portable, compilable C#.GenerationFixturesCorpus.V21andSourceFormsstay byte-identical, and both revisions have the same canonical ESM bytes, semantic revision and specification outcomes. Consumers that render the fixture should switch toV21R2. (#836) - AI (Release v7.82.0): Codex can run the Cratis store-mutation and pull-request shell guards through a native
PreToolUsehook. Adapter failures deny the command; file and patch writes, Stop and session hooks, and installation throughcratis ai installare not covered yet. (part of #401) - Screenplay (Release v4.216.0):
propose-repairaccepts adestinationIntent(version 1) for PLAY0470. The intent names one explicitforexpression and route confirmation for every event production of the command. Existing explicit destinations are confirmed, never retargeted, and nothing is guessed or fixed in bulk. See MCP authoring tools. (#397) - Screenplay (Release v4.216.0):
read-workspaceviewrepair-intentslists PLAY0470 commands with every production a host must collect a destination for. Repair capabilities advertise the repair underintentActions, separately from the existing no-input repairs. (#397) - Screenplay (Release v4.216.0):
read-proposalviewsproduction-destinationsandproduction-destination-identitiespage the retained routing report. The report states that no executable baseline existed, so it makes no routing-preservation claim. (#397) - cli (Release v3.79.0):
cratis chronicle observers retry-failed-partitions <OBSERVER_ID>retries every failed partition of an observer in one operation. The kernel recovers a bounded batch at a time; the command returns once recovery is started and reports how many partitions were failed. Requires Chronicle 19.80.0 or later. - AI (Release v7.81.0): Changes to the instruction corpus, harness adapters and distribution manifests are routed to
@Cratis/corefor review through CODEOWNERS. (#755) - AI (Release v7.81.0): Verification warns about package sources, registry URLs, install commands, MCP server launch commands and dependency declarations that a change adds to instruction files, with file and line. The warning flags supply-chain changes for human review and never fails the build. (#755)
- Screenplay (Release v4.215.0):
ObservationComparison.Comparecompares a model with a host-suppliedObservationSnapshotand returns anObservationReport. The snapshot holds registered event types and generations, append counts, command and reaction edges attributed by causation, and registered consumers. The report gives typed findings (Drift, Informational, Unknown or Excluded), the coverage behind them and per-slice evidence. Absence is never reported as drift when coverage is partial, conditional or opaque. Productions are reported as Unknown with a stated reason. See Observation comparison. (#294) - Screenplay (Release v4.215.0):
ObservationIdentityMap.FromModelmaps events by their stored name and generation and commands by unique name; hosts add reactor and other target-specific identifiers withWith. (#294) - Screenplay (Release v4.215.0):
ObservationReportJsonwrites the report as stable JSON, so every host reports the same result. (#294) - Stage (Release v4.154.0): Semantic specification runs (the SpecRunner semantic engine and the Host’s specification endpoint) execute specifications that fire application, startup and shutdown triggers and that advance the clock through interval and schedule reactions, matching the Screenplay reference evaluator. Live Host runs and rendered applications still refuse these triggers. (part of #343)
- Arc (Release v22.122.0): The Screenplay generator states exact collection values in specification fixtures: collection expressions, arrays,
List<T>initializers andArray.Empty<T>()whose elements are all constants or concept values. A collection with a spread, a computed element, or a set or sorted target still leaves the scenario out with SP0039. (#3383) - Arc (Release v22.122.0): The Screenplay generator reads exact collection checks in event assertions,
e.Tags.SequenceEqual(...)and!e.Tags.Any()for an empty collection, so a scenario whose event carries a collection can state the whole event. (#3383) - Stage (Release v4.151.0): Opt-in render-around: set
CratisPlanOptions.RefusalstoArtifactRefusalMode.RenderAround(carried as thecratis-render:refusalsprofile input) to render the application while dropping only specifications refused withSTAGE-ESM-011orSTAGE-ESM-024. Any other refusal keeps the whole plan refused. (part of #500) - Stage (Release v4.151.0):
ArtifactRenderPlan.Outcome(Complete,Partial,Refused) andArtifactRenderPlan.Refusalslist every dropped specification with its codes;CratisPlanResultexposes both. A partial plan keeps its error diagnostics, soSuccessstays false and consumers must checkOutcometo use it. A new information diagnosticSTAGE-PLAN-007reports how many specifications were rendered around. (part of #500) - Screenplay (Release v4.214.0): Model comparison reports changes to stored enum numbers:
ModelDifference.Enumerationslists each enum member whose number changed (for example after inserting or reordering members of an unnumbered enum), was removed, had its number reused by another member, or was renamed while keeping its explicit number. Each change says whether an event stores the enum and whether it breaks the stored contract. See decision 0094. (#667) - Screenplay (Release v4.214.0): The MCP
semantic-diffandread-proposal view=semantic-difflist these changes asenum-*items in thememberssection, withbeforeNumber,afterNumber, their numbering andstored. Other items are unchanged. (#667) - Screenplay (Release v4.214.0): An enum with duplicate member names or numbers is reported as not comparable instead of being compared. (#667)
- AI (Release v7.77.0): The always-loaded rules state that the user’s instructions take precedence over guidelines in a skill. This never overrides safety rules or hooks. (#754)
- AI (Release v7.77.0): The skill-authoring lint warns when two skills’
Use whentriggers overlap strongly (token Jaccard similarity of 0.4 or higher). The warning is advisory and never fails verification. (#754) - AI (Release v7.77.0): The rules now carry three safeguards that previously lived only in skills, so a competing skill can no longer drop them: never copy secrets or personal values into models, notes, state or briefs, or use real data in examples; legacy extraction uses Git read-only; and committed or applied EF Core migrations are append-only. (#754)
- Stage (Release v4.149.0): Screenplay conversion can now report unsupported model content as typed diagnostics instead of throwing. New overloads on
ProjectionConverter,ReadModelConverter,SliceConverterandArrangementConverter, plusScreenplayEventModelVisitor.Convert, collectConversionDiagnosticentries (code, severity, construct, path and source location, convertible to a ScreenplayDiagnostic) and convert the rest of the model. The existing overloads keep throwing as before. (#531) - Stage (Release v4.149.0): Diagnostic codes
STAGE-PROJECTION-001toSTAGE-PROJECTION-008andSTAGE-SCENE-ARRANGEMENT-001toSTAGE-SCENE-ARRANGEMENT-004, documented in the Stage rendering reference. (#531) - Arc (Release v22.120.0):
[ExplicitOffset]accepts concepts overDateTimeOffsetandDateTime, refusing values without an explicit offset exactly as for the primitive types. Concepts overDateOnlyare refused with a configuration error, because a calendar date has no offset. Requires Arc’s default JSON options. See Require explicit date-time offsets. (#3350) - Arc (Release v22.120.0): Generated Screenplay models include date comparisons on concept-backed
DateOnly,DateTimeandDateTimeOffsetcommand properties and validator rules and concept-wrapped date literals; both sides must resolve to the same date type. (#3350) - Arc (Release v22.119.0):
ArcOptions.QueryHealth(QueryHealthOptionswithRequireAuthenticationandRoles, bound fromCratis:Arc:QueryHealth) controls who may observe query health. (#2873) - Chronicle (Release v19.82.2): Event sequences report how far their constraint indexes lag behind the log as a metric, alongside metrics for repairs and unknown append outcomes. (#4895)
- AI (Release v7.75.0): Quality gates accept
timeoutSecondsandtimeoutHint. A gate that runs past its deadline is stopped together with its child processes. It is reported as a named NOT VERIFIED failure that suggests a narrower command to run instead. The shipped backend-specs gate has a 120-second deadline. (#753) - Scene (Release v4.70.0): The
core:toolbarItemdescriptor describespresentation: what the item shows (mode: icon and text, icon only, text only) and aplacementhint, as an open object, so an editor’s generic Object editor can author the hints the toolbar already reads and a host or theme styles by (part of Cratis/StudioIssues#631) - Chronicle (Release v19.82.0):
ReadModelScenario<T>.ProcessAppendedEvents(IEnumerable<AppendedEvent>)folds appended events with their originalEventContext. Projections and reducers see each event’s real sequence number and occurred time, so decisions that compare revisions behave as they do against the event store. Events from several event sources are folded in sequence-number order with the same key resolution asProcessEventsFor. (#5034) - Arc (Release v22.117.0):
IOccurrenceCommandExecutorin Arc’s Chronicle integration runs a command for anOccurrenceContextunder an effect name. It records an effect receipt atomically with the command’s events, so a redelivered occurrence returns the recorded outcome without running the handler again. Validation, rule and constraint refusals are recorded as final; authorization failures, concurrency conflicts and exceptions are left unrecorded, so a later attempt can retry them. Kernels without effect-receipt support are refused. See Executing commands for occurrences. (#3288) - Chronicle (Release v19.81.0):
IUnitOfWork.RefuseImmediateAppends()refuses every immediate append in the current flow before anything is sent, while transactional appends still enroll in the unit. Use it when a unit of work must commit atomically with other state, such as an effect receipt, so a retry never repeats an append that escaped the unit. The returned frame owns completion when the unit has no other owner; inside an ASP.NET unit of work or with read protection enforced, completion stays with the existing owner. Read admission is unchanged. See Effect receipts. (#5019) - Chronicle (Release v19.80.0): Stopping or resuming a job now answers whether the job took the request and why not (
StopJobResponseandResumeJobResponsewith anAcceptedflag and aJobCommandRefusal), through the contracts, the .NET client (IJobs.StopandIJobs.Resumereturn aJobCommandResult) and the Workbench, which reports a refusal as an error. The proto changes are additive. (part of #4991) - Chronicle (Release v19.80.0):
RetryFailedPartitionscommand and gRPC operation that retries every failed partition of an observer through per-partition jobs started a bounded batch at a time, without reopening a concluded replay job. (part of #4991) - Scene (Release v4.69.0): Preview regions for a design host:
identity,shell,menu,contentandaccentare marked withdata-scene-region,ScenePreviewHostreportsonRegionHoverandonRegionActivate,regions.regionRectmeasures a drawn region in the preview’s own pixels,describeRegionssays which regions each mode draws and the fallback, and the designer contract gains rule N9 (#193) - Scene (Release v4.69.0): Profile identity: a name, a logo (initials, one of eight icons or an inline image) and whether the name shows, resolved by
resolveProfileIdentityand drawn by the default shell in every menu mode (#194) - Scene (Release v4.69.0): Profile appearance:
corners(sharp, default, round) andfontfrom a licensed font catalog with a sample line, resolved byresolveAppearance, with the newtext.fontFamilytoken read by the default blueprint and the PrimeReact bridge (#195) - Scene (Release v4.69.0): Typed
navigationModeandmenuThemeshell options with eight modes and three menu themes, the behavior of each mode and the touch regime, the legacyslim-plusstring mapped without rewriting stored profiles, and a default menu mode per shell with the status line for a shell switch (#196) - Scene (Release v4.69.0): Profile problems with a severity, a section and a one-click fix: theme needs a package, accent too light, own shell has no value, logo image missing and Reveal needs hover, with
applyProfileFixand a contrast function that grades an accent against white (#197) - Scene (Release v4.69.0): The package list answers for a designer: rows with reasons and locks, what can be added, moves, removal that never silently changes the theme, and choosing a blueprint or a theme (#198)
- Scene (Release v4.69.0): Picker metadata: Cratis Default, Dashboard and Minimal shell cards with wireframes checked by
verify-blueprints, theme cards with the package selecting one adds, the colour scheme switch, eight menu mode schematics, the version rule with its status chip, and the value of my own shell (#199) - Scene (Release v4.69.0): Sample data pack descriptions with columns and a status classification for pills, a description of the generic pack, and the rule that production builds never include sample data (#200)
- Scene (Release v4.69.0): Documentation for every new rule in the designer contract, with the decisions and the questions that remain open, and an updated
scene-ui-profileskill and rules (#201) - Screenplay (Release v4.212.0):
open-workspacereturnsapplicationIdentity, so you can build a typedpartstarget for a model note from names. (#784) - Stage (Release v4.144.0): Rendered backend pins (Cratis, Arc, Chronicle, Specifications and the test packages) come from Stage’s own central package versions, so a package update moves what generated applications pin without a separate edit; the daily package update also moves the
@cratis/*frontend pins and the framework name catalog. (#493) - Orleans (Release v1.23.0): Bounded jobs:
JobsOptions.MaxActiveStepsPerJob(orJob.MaxActiveSteps) keeps a sliding window of active steps and starts the next one as each step reaches an outcome. A resumed job rebuilds its window from storage. Off by default. - Orleans (Release v1.23.0): Step attempts:
JobsOptions.MaxStepAttempts,StepRetryBackoffandMaxStepRetryBackoff, withJob.ShouldRetryStepdeciding per failure. A failed attempt is scheduled again by the job with exponential backoff and counts as a failure only when its attempts run out. Default is one attempt. - Orleans (Release v1.23.0):
IJobsManager.RetryFailedSteps(jobId)andJob.CanRetryFailedStepsrun the failed steps of a job that completed with failures again. Opt-in per job type; resuming such a job is unchanged. - Orleans (Release v1.23.0): Optional step leases:
JobsOptions.StepLeaseTimeoutmakes running steps record a heartbeat. The watchdog restarts a step only when its owner silo has left the cluster and its lease has expired; steps from older releases are left alone for one lease period. - Orleans (Release v1.23.0):
IJobStepStorage.CountByStatus(jobId)as a default interface member, implemented for MongoDB, SQL and in-memory storage. Persisted steps gain an optionalAttemptandLease; existing data reads as attempt 1 with no lease. - Orleans (Release v1.23.0):
JobsOptions.JobWatchdogInterval,StepDeliveryMaxAttempts,StepDeliveryRetryDelayandMaxStepDeliveryRetryDelay. - Arc (Release v22.116.0): The new
IsSnapshotproperty onObservableQueryEmissionContexttells an emission guard that it is admitting a one-shot snapshot result rather than a stream emission. (#2955) - Arc (Release v22.116.0):
IEndpointFallbackAuthorizationevaluates the host’s default authorization for a request. Arc Core requires an authenticated caller when authentication handlers are registered. ASP.NET Core hosts evaluate the configuredFallbackPolicy. (#2952) - Stage (Release v4.143.0):
CratisRendering.ResolveProfileInputs(scene, approvedPackages)resolves every ui profile with the Scene engine’s planner and returns aCratisProfileInputFindingfor each profile input the target cannot honor: an unknown package, a missing layout, packages that cannot be used together, a missing theme, an invalid root template and an unresolved blueprint template reference. The findings carry stableSTAGE-PROFILE-001toSTAGE-PROFILE-006codes. (Cratis/Screenplay#722) - Chronicle (Release v19.79.0): Projection registrations now carry the client’s software version. The .NET client sends
ChronicleOptions.SoftwareVersion, which defaults to the entry assembly’s version and can be set with theCratis:Chronicle:SoftwareVersionconfiguration key (Cratis__Chronicle__SoftwareVersion). The client logs a warning at startup while the version is the default1.0.0. An older kernel ignores the version and registers as before, so the guard takes effect once the kernel runs this release. See the registration lifecycle. (#5012) - Arc (Release v22.114.0): Generated Screenplay models now include
==and!=comparisons between Uuid values, Guid-backed concepts and proven canonical Uuid literals in command guards and protected read paths at ESM v28. The generator refuses unsupported operands, such as optional values, type-changing casts and constructors whose forwarding cannot be proven, and withholds them below ESM v28. (#3344) - Stage (Release v4.141.0): The Cratis renderer renders Date and DateTime comparisons in command
requireclauses,produces whenconditions and property validation rules. Dates are compared as calendar days (DateOnly) and DateTimes as UTC instants (DateTimeOffset), as the reference evaluator compares them. Each compared DateTime command property carries Arc’sExplicitOffsetmarker, so input without an offset orZis refused. (#473) - Stage (Release v4.141.0): A compared DateTime property typed through a concept is bound as a
DateTimeOffsetand converted to the concept where an event, rule or response uses it, until Arc accepts concept-wrapped dates (Cratis/Arc#3350). - AI (Release v7.72.0): Inspect each provider’s effective tier model through
ProviderTierResolution.ResolveTiersFor, also available asResolveTiersForfrom@cratis/ai. Results identify stored, derived, borrowed and subscription-alias models, or explain why a tier cannot be served. (part of #345) - Scene (Release v4.68.3): A specification that renders the MasterDetail, Dashboard and ProfileSettings templates through the effective package set
resolvePackageHostresolves for a UI profile listingCratis.Blueprint.Default- the profile the live-Stage / generated-React vector uses (Cratis/Stage#504): no findings, every shipped template offered to a template browser as usable, the same components as the registry the browser audit renders with, and the vector’s slot contents present by id. - Scene (Release v4.68.3): Documentation in
blueprints/template-set.md: configuring a template from the screen that uses it (exposure andinstancecontribution, what the shipped templates expose), and how Studio’s template browser, the Stage and the vector share one package set. - Chronicle (Release v19.78.0):
EventStoreForTestingandDefaultsinCratis.Chronicle.Testinghave new constructors that take anEventStoreNameand anEventStoreNamespaceName, so scenarios that need their own identity no longer sharetesting/default.ReadModelScenario,ReactorScenarioandOccurrenceScenariobuilt from such aDefaultsuse its identity too, and reactors see it in their event context. The existing constructors keeptesting/default. (#5018) - Orleans (Release v1.22.0):
step.BeginTestRun()lets a specification run a job step’sPerformStepunder a real run, without a running job: callbacks posted throughTryInvokeOnActivationare admitted and run, one at a time, on a stand-in activation scheduler.JobStepTestRun<TState>.Perform(state)returns what the step returned,Stop()cancels the work while admission stays open,CloseAdmission()refuses callbacks, andIsOnActivationtells a spec whether code runs on the activation. A test run records and delivers nothing.JobStepAlreadyHasALiveRunandJobStepTestRunWasSupersededreport misuse. See Testing your job steps. (#85) - Screenplay (Release v4.208.0):
PLAY0268(not admitted by the executable model) carries asubjectargument naming the innermost declaration that contains the refused construct, and anissueargument when the refusal cites a tracking issue. See decision 0086 and the diagnostics reference. (#838) - Screenplay (Release v4.208.0):
PLAY0367,PLAY0699andPLAY0787(match patterns) carry the owning command or concept assubject, theproperty, thepatternand, for the first two, theoffsetin the pattern; the C# and TypeScript compilers report the same arguments. (#838) - Scene (Release v4.68.1): A real-Chromium accessibility audit of every screen template the default blueprint ships (business, foundation, state, support, auth, status, nesting chain): axe-core WCAG 2.0/2.1/2.2 A and AA including colour contrast and target size, no horizontal overflow, and landmark structure (one
main, no duplicate/nested landmarks, unique names, all content in a landmark, a level-one heading) - in every data state, at desktop/tablet/phone widths, in the light and dark theme (1,000+ browser specifications), against the registry of a host with the blueprint’s dependencies (core, PrimeReact with a theme preset, the blueprint). It runs in the JavaScript Build workflow’s existing browser step, so a regression fails the Scene CI. - Scene (Release v4.68.1): A control specification that breaks the page it just judged (pale text, a second
main, content outside a landmark, two tiny adjacent buttons) and expects each finding, so a clean audit is never vacuous. - Scene (Release v4.68.1): Documentation in
blueprints/template-set.md(“In a real browser”). - Orleans (Release v1.21.0):
IJobAdmissionlets a job’s owner allow or refuse a job’s execution. Register it withsiloBuilder.AddJobAdmission<T>()on every silo that can host the owner’s job types.MayRun(JobAdmissionRequest, CancellationToken)receives the job’s key, id, type and request; every registered admission must allow, and with none registered every job runs. See Admit or refuse a job’s execution. (#81) - Orleans (Release v1.21.0):
StartJobError.NotAdmittedis returned when the owner refuses a job’s start, andCannotResumeJobError.NotAdmittedwhen it refuses a resume.IJobsManager.Resumereturnsfalsefor a refused job. (#81) - Screenplay (Release v4.207.0): The protected command read diagnostics PLAY0781–PLAY0785 carry typed arguments, so tools can read why a read could not be protected instead of parsing message text. They identify the command and the read, and PLAY0781 adds the read model and a
reasonkeyword (reducer,join,no-removal,key-type, …). Every refused read gets its own diagnostic, and messages are unchanged. See diagnostics. (#851) - Scene (Release v4.68.0):
applyShellSwitch(document, plan, templates?)(@cratis/scene.engine) andShellSwitchApplier.Apply(C#,Cratis.Scene.Engine.Shell) apply aplanShellSwitchplan as a pure function over the document: the content of a moved outlet is appended to the target outlet in order, dropped content is removed, kept outlets are untouched. A screen template that fits a moved outlet fits the new outlet instead (a name qualified with the old shell’s is requalified with the new shell’s, and a dropped outlet leaves the template placed explicitly), so the screens built from it move with it. The result carries the review list of what changed (screen or template, outlet, action, target, element count, a sentence with real names). A plan with blockers is not applied. - Scene (Release v4.68.0):
templatePlacement/ShellPlacement.PlacementOfexpose where a screen template’s chain lands in the shell;outletsUsedBynow uses it. - Scene (Release v4.68.0):
shell-switch-apply-fixtures.json, asserted by both engines: keep, same shell, an outlet nobody uses, primary following to a differently named primary outlet, moving into an occupied primary outlet, mapping, several outlets into one, dropping, a template that fits the lost outlet (moved, mapped, dropped), qualified templates (moved, requalified), a nested template chain and a blocked plan. - Scene (Release v4.68.0): Documentation in
blueprints/root-template.md(“Applying the switch”). - Arc (Release v22.112.0): When a command’s effective read protection is
On(from the command, an inherited base, the assembly or theCratisReadProtectionMSBuild property), the generator writes its keyed read-model reads, therequireconditions over them and the event mappings from them as ESM v25 output under thecommand reads protectedpreamble. This covers nullable[LookUpBy]reads guarded by a leading null check, non-nullable reads, and guards inProvideandHandle(includingOneOfandResultreturns). See Generating a Screenplay. (#3298) - Arc (Release v22.112.0): A read Screenplay does not admit (for example a view without a removal, a stream-scoped read model, an ambiguous key or a nullable read without a null check) is left in code and reported with the new
SP0079diagnostic and its reason, instead of being written as an unprotected read. - Stage (Release v4.138.0): The Cratis renderer renders protected command reads. Each command with
readsgets[ReadProtection(On)], a nullable read-modelHandleparameter per read looked up with[LookUpBy], the reference “<View> '<key>' does not exist.” rejection, and all of its requirements evaluated inHandleafter the reads. Read paths inrequireand produced-event mappings render, and generated specifications run protected commands in decision mode. (part of #440) - Stage (Release v4.138.0): Command specifications whose command triggers exactly one invoke-only reaction are rendered as a command half and a reaction half instead of being refused; a rejected one is rendered only when the triggering command cannot reject on its own. (part of #440)
- Stage (Release v4.138.0): A new reference page, Protected reads rendering, describes the rendered shape and where a rendered application differs from the reference. (part of #440)
- AI (Release v7.69.0): The Screenplay skills teach Uuid
==and!=in commandrequireandproduces whenconditions (ESM v28), with an executable authorization example: concepts and identities over Uuid compare when both sides are the same concept, a bare Uuid compares with any Uuid concept, protected read paths are allowed inrequire, and literals must be canonical lowercase hyphenated Uuids. They also list what stays refused (ordering, different concepts, optional operands, Uuid validation and concept rules, read paths inproduces when). The compiler is pinned to Screenplay 4.205.0. (#746) - Chronicle (Release v19.77.0): Typed triggers: a record marked
[Trigger("id")]is registered with its JSON payload schema, andIEventStore.Occurrences.Record(trigger, idempotencyId)records it once per idempotency id. See https://github.com/Cratis/Chronicle/blob/main/Documentation/occurrences/triggers-and-handlers.mdx. (part of #4911) - Chronicle (Release v19.77.0):
IOccurrenceHandler<TTrigger>handlers are discovered like reactors and run under fenced leases: the client claims due occurrences, renews the lease while the handler runs, completes or fails it, and backs off according to the kernel’s retry settings.OccurrenceContextcarries the occurrence id, attempt, epoch and theEffectKeyto send to external systems. (part of #4911) - Chronicle (Release v19.77.0): Effect receipts in the unit of work:
IUnitOfWork.UseEffectReceipt(key)writes the receipt in the same storage transaction as the events, also when the unit appends no events but holds protected reads, and a repeated effect returns the stored outcome instead of appending again. Against a kernel without theeffect-receiptscapability the unit fails withEffectReceiptsNotSupportedrather than appending without a receipt. See https://github.com/Cratis/Chronicle/blob/main/Documentation/occurrences/effect-receipts.mdx. (part of #4911) - Chronicle (Release v19.77.0): Lifecycle hooks: the built-in
StartupandShutdowntriggers fire once per logical activation (ChronicleOptions.ActivationId) or once per process (ActivationScope.PerProcess), for the application or for every namespace (LifecycleScope.AllNamespaces).IOccurrences.EndActivationrecords the shutdown of a logical activation. ASP.NET Core and generic hosts register the lifecycle service automatically. See https://github.com/Cratis/Chronicle/blob/main/Documentation/occurrences/lifecycle.mdx. (part of #4911) - Chronicle (Release v19.77.0): The kernel records an all-namespaces lifecycle occurrence as a durable fan-out intent over a fixed namespace snapshot, so a crash part-way through completes after restart without duplicates. (part of #4911)
- Chronicle (Release v19.77.0): Testing:
EventStoreForTestingand the scenarios gainOccurrences,Capabilities(current, old or unknown kernel), a deterministicScenarioTime, a reply-dropping interceptor for commit-then-lose-the-reply cases,OccurrenceContextBuilderandOccurrenceScenario<THandler>for driving a handler step by step. See https://github.com/Cratis/Chronicle/blob/main/Documentation/occurrences/testing.mdx. (part of #4911) - Screenplay (Release v4.206.0):
SemanticEvaluator.Decidereturns aSemanticDecisionwith itsBoundary, itsDependencies(aSemanticDecisionDependenciesof read keys and event contracts) and aCommitthat can be called again against a later world; a read-only request is refused with a Contract rejection. See decision 0089. (#833) - Screenplay (Release v4.206.0):
SemanticEvaluator.ExtendWorldextends an established world with facts that already hold in the log, giving the same world as establishing all facts at once. (#833) - Screenplay (Release v4.206.0):
Cratis.Screenplay.CanonicalCorpuspublishesProtectedCommandReadRaceVectors: 16 race cases with their model, run only through the public API, so a host can prove it matches the reference. (#833) - Screenplay (Release v4.206.0): The host loop is documented: decide, extend, commit, settle reactions, then write the whole settled batch guarded on the world it was settled against, and when a retry is allowed. (#833)
- Orleans (Release v1.20.0):
IJobs.StopAndDrain(key, jobId, timeout)stops a job and waits until its steps are drained. It answersDrainedonce no step code runs for the job, each step’s outcome and final checkpoint are persisted, andOnStepCompletedOrStoppedandOnStoppedhave finished; otherwiseTimedOut(call again to continue),Completed,NotFoundorUnknownJobType. PassTimeSpan.Zeroto poll without blocking. This adds a member toIJobs, so a hand-writtenIJobsimplementation must add it. See Jobs. (part of #81) - Orleans (Release v1.20.0):
IJobDrainlets a job grain be drained directly, andIJobStepDrainis the protocol the job uses to drain its steps. (part of #81) - AI (Release v7.68.0): The Screenplay skills explain warning
PLAY0690: a reducer instance is always keyed by the event-source id of the events it reduces, so a reducer-backed view looked upbyanother identity type, or fed by producers with different identity types, is reported. They show the fix (a projection keyed on eachfrom, or a join) and what the check does not compare. (#702) - AI (Release v7.68.0): The toolchain and modeling-lifecycle skills teach the
screenplay.jsonvalidation gate at the model root: the standalonescreenplaytool andcratis screenplay validateread checks, warnings as errors, scope and open-questions mode from it,--print-gateshows the effective gate, and a refused gate file counts as “could not run”. (#691) - Screenplay (Release v4.205.0): Command
requireandproduces whenconditions accept==and!=between Uuid values, including concepts and identities over Uuid, protected read paths inrequire, and canonical Uuid literals, as ESM v28. When both sides are concepts or identities they must be the same concept. Non-canonical literals are refused with PLAY0273; ordering, Uuid validation rules and Uuid concept rules stay refused. See decision 0090. (#844) - Arc (Release v22.111.0): The Screenplay generator reads chronological comparisons of
DateOnly,DateTimeandDateTimeOffsetproperties in command guards (require/produces when) and literal comparisons in command validation rules as ESM v26 date ordering. Literals are written in Screenplay’s canonical form:yyyy-MM-ddfor dates, UTC with seven fractional digits andZfor date-times. Comparisons Screenplay does not admit (offset-less date-time literals, mixing dates with date-times, clock values such asDateTime.Now, date rules on concepts, date ordering in reactions, property-to-property validation rules) are reported with the property named instead of being emitted. WhenMaximumExecutableModelVersionis below v26, date comparisons are withheld and reported. See Generating a Screenplay. (part of #3339) - Chronicle (Release v19.76.0): A concurrency violation now names the event that caused it:
ConcurrencyViolationand theDecisionConflictvalues returned byGetDecisionConflictscarryConflictingEventTypeIdandConflictingEventSequenceNumberfor the first event that matched the guard after the position it expected. Both are null when connected to a kernel that does not report them (#4926) - Chronicle (Release v19.76.0):
IUnitOfWork.SuspendReadRegions()lets a host that runs nested invocations under read protection suspend the read regions the nested invocation inherited, and restore them when the returned scope is disposed (#4953) - Arc (Release v22.110.0):
[property: ExplicitOffset]on aDateTimeOffsetorDateTimecommand property (nullable too) refuses date-time input that has no offset orZ, with the validation messageDateTime command property '<member>' requires an explicit offset or Z.ADateTimeOffsetkeeps its offset and aDateTimeis converted to UTC. The accepted spellings match Screenplay’s date comparison contract (ESM v26). See Command input binding. (part of #3339) - Arc (Release v22.110.0):
IResourceFreeRequirementmarks an ASP.NET authorization requirement that never reads the command, so its policy also runs when the body cannot be bound. Built-in role, claim, name and authenticated-user requirements count as resource-free already. (#3341) - Chronicle (Release v19.75.0):
DecisionReadRefusalReason.DefinitionMissingseparates “the kernel has no definition for this read model or its projection” fromDefinitionMismatch, and the refusal message now names what differs. - AI (Release v7.67.0): The Screenplay skills teach composite read-model keys: a read model with two or more
keyproperties, projection rootfromandremove withblocks with akeyblock naming every part, list queries narrowed by equality filters, an optional single-instance query with abyblock naming every part, and specifications that state every part. They also cover the constructs that stay refused on such a read model (joins, children,every,all,nested,variant, reducers, protected command reads by parts) and how to choose between a composite key and a composite-typed single key. The compiler is pinned to Screenplay 4.204.0. (#743) - AI (Release v7.67.0): Hosts that execute Screenplay commands themselves are pointed to Screenplay’s public
SemanticDateComparisonsAPI for chronological Date and DateTime checks. - cli (Release v3.73.0):
cratis renderrenders a new application’s reducers as self-reducing read models: the read-model record holds its staticReducemethods, with no separateIReducerFor<T>class. A destination without a render ownership manifest is a new application; the choice is saved in the managed.cratis/stage/rendering.jsonand kept on every later render, including--scope,--workspaceand--check. Existing applications keep separate reducer classes and unchanged output. An edited, missing or unreadable reducer configuration is refused (CLI-RENDER-021,CLI-RENDER-022,CLI-RENDER-023) and nothing is written; changing the convention of an existing application is not supported. See Reducer rendering convention. (#376) - Components (Release v4.29.0):
Property.schemaKeywordsandProperty.itemSchemaKeywordscarry the standard JSON Schema keywords the schema editor does not model, for the property and for its arrayitems. Hosts that own the properties in the tree layout carry them through likevendorKeywords. (#426) - Orleans (Release v1.19.0):
JobStep.TryInvokeOnActivationlets step work run a callback on its own activation, also while the activation is deactivating. Use it instead of calling the step’s own grain reference, for example to save a checkpoint. It returnsActivationCallbackRejected(NoRun,StaleRun,Closed,Cancelled) when the run is gone or the step is stopping. See Jobs. - Orleans (Release v1.19.0):
JobsOptions.StepStopTimeout(default 10 seconds) bounds how long stopping a step waits for its work, andJobStepError.StopTimedOutreports that the work had not settled in time. The step still reports its stop exactly once when the work settles. - Stage (Release v4.135.0): Stage now accepts Screenplay models compiled to executable model version 26. The specification runner and the host compare
Datevalues as calendar dates andDateTimevalues as instants at tick precision inrequire,produces whenand validation rules, sorequire to >= fromworks across time zones, matching Screenplay. (part of #473) - Stage (Release v4.135.0): The specification runner and the host reject a
DateTimecommand value without an offset orZwhen it takes part in such a comparison, after authorization and before any rule runs. (part of #473) - Screenplay (Release v4.204.0): Read models with two or more
keyproperties bind and execute: projections key rootfromblocks with akeyblock naming every part, list queries narrow them with equality filters, and an optional single-instance query looks one up with abyblock naming every part. Models that use them select ESM v27; every other model keeps its version and bytes. See decision 0088. (#599) - Screenplay (Release v4.204.0):
remove withaccepts akeyblock with onepart = exprline per key part, so a composite-keyed instance can be removed and later recreated. (#599) - Screenplay (Release v4.204.0): Specifications state every key part in
given readmodel,then readmodelandthen no readmodel, and query arguments supply everybypart; a missing part is reported as PLAY0661 and an unknown or ill-typed part as PLAY0662. (#599) - cli (Release v3.71.0):
CLI-RENDER-020: atemplate blueprint <Package> <Template>reference to a template the approved blueprint’s manifest does not list - no such template, a version outside the pin, or a blueprint that is not approved - stopscratis render, andcratis runbefore Docker starts, naming the blueprint and the template. The resolution is Scene’s own template resolver, run by Stage’s render planner over the approved package set. - cli (Release v3.71.0): A specification that checks a screen naming a template the blueprint does not ship while another one it does ship is accepted.
- Screenplay (Release v4.203.0): Hosts that execute commands themselves can now apply the reference evaluator’s exact Date and DateTime comparison semantics through public .NET APIs instead of copying them.
SemanticDateComparisonsprovidesParticipants,TryParseInstant,Compare,CheckandCheckInputs, andSemanticConditionEvaluator.Evaluateevaluatesrequireandproduces whenconditions, including protected read operands. See Check command date comparisons. (#842) - Stage (Release v4.132.0): A specification that only projects facts - events given as history, optionally one more appended with
when append, thenthen readmodel- renders as a generated read-model scenario (STAGE-ESM-011no longer refuses the 37Listing...specifications of the samples). An append an event reaction or constraint governs is still refused, and so is an instance no given event reaches, because the generated scenario could not prove it. - Stage (Release v4.132.0): A root projection block keyed by a constant (
key "global") renders asUsingConstantKey, with itssummaryId = "global"mapping, so a one-row summary projection (SalesFigures,SupportFigures,InventoryFigures) renders. - Stage (Release v4.132.0):
RenderFindingKind.TemplateReferenceUnresolved: atemplate blueprint <Package> <Template>reference the approved blueprint’s manifest does not list is reported with the blueprint and template named, through Scene’s own resolver (Cratis/Scene#182). It is no longer possible to render a screen that silently has no template. - Stage (Release v4.132.0):
when_planning_the_domain_blueprint_samplesplans each sample (kept inVerification/live-blueprints/models, the Screenplay samples) as authored;when_executing_projected_fact_specificationsbuilds and runs the generated application of a model using all of the above, andwhen_refusing_unprovable_projected_factspins what stays refused. - AI (Release v7.66.0): The Screenplay skills teach the
ui profileshell:root template(an own layout or application-scope screen template, orblueprint <B> <Name>with aversionpin), shelloptionlines,appearance(color scheme,accent) andnew screens use template.cratis-screenplay-ui-compositioncarries compiled worked examples, the PLAY0788 to PLAY0799 error and fix table and a legacylayoutnegative example (PLAY0791, with its quick fix). The toolchain diagnostics and diagnostic-arguments references list the new codes, andcratis-screenplay-model-authoringteaches the newui-profilesMCP read tool (44 tools) and the typed nodes that edit the shell. (#733) - Components (Release v4.28.0):
SchemaEditortree layout: a “Generated” toggle that marks a property withx-generated: true. Hosts offer it withallowGeneratedProperty(a flag or a per-property predicate), or withonSetGeneratedPropertyin controlled mode. Its labels can be overridden throughlabels, and it is styled through thegeneratedpart. (#425) - Components (Release v4.28.0): A generated property shows a read-only marker when the toggle is not offered, for example in
readOnlymode. Schemas that already containx-generated: trueshow this marker without any host change. (#425) - Components (Release v4.28.0):
Property.isGenerated,Property.vendorKeywords,Property.itemVendorKeywordsand theGENERATED_KEYWORDconstant. (#425) - Chronicle (Release v19.74.0):
storage.connectionResolutionresolves the connection for every event store, namespace and read model database, on MongoDB and SQL alike, using Arc’s connection resolution contract:TemplateandHttpresolvers from configuration, orCustomwhen hosting the kernel in-process. A resolved connection string or database is used as given, without deriving a name or recording aDatabaseNamesbinding. The cluster database staysconnectionDetails. (#4948) - Chronicle (Release v19.74.0): The
Httpresolver calls a language-neutral REST endpoint, the same for every storage type and specified at https://github.com/Cratis/Arc/blob/main/Documentation/connection-resolution-contract.md. Chronicle sendskind,eventStoreandnamespaceas its scope. (part of #4948) - Chronicle (Release v19.74.0): Schema changes connect for the
Schemapurpose and data access forRuntime, so migrations can run as a different database user than the one reading and writing data. This covers creating databases and schemas, migrations, table migrations and the replay table swap. (#4949) - Chronicle (Release v19.74.0):
storage.createIfMissing: set it tofalseand a missing database or schema fails withDatabaseDoesNotExistorSchemaDoesNotExistinstead of being created. (#4947) - Chronicle (Release v19.74.0):
storage.schemakeeps Chronicle’s SQL tables in a schema of your choice. On PostgreSQL it is put first on the search path. On SQL Server the database user’s default schema must match, or migration fails withDefaultSchemaMismatch. (#4946) - Chronicle (Release v19.74.0): MongoDB storage resolves the server, database name and identity of the event store, namespace and read model databases. Access tokens are used as MONGODB-OIDC credentials. (#4950)
- Chronicle (Release v19.74.0): Documentation for storage connection resolution, including a database-per-tenant setup with Entra managed identities: https://github.com/Cratis/Chronicle/blob/main/Documentation/hosting/configuration/storage-connection-resolution.md (#4951) (#4945)
- Screenplay (Release v4.202.0):
BrowserHarness/render-blueprint-samples.shrenders all eight domain blueprint samples with the installedcratisand the approved package set of each blueprint’s published npm package (render-blueprint-samples.cjswrites the set from the manifest the package publishes), and fails when one does not render. - Screenplay (Release v4.202.0):
.cratis/ai/rules/project/samples.mddocuments it. - AI (Release v7.64.0): The Screenplay skills teach chronological
DateandDateTimecomparisons (ESM v26):==,!=,>,>=,<and<=between same-primitive values inrequire,produces whenand command or property validation rules. They coverDateTimecompared as a UTC instant, the Validation rejection for aDateTimeinput without an offset, PLAY0273 for offset-less or unparsable literals, and the forms that stay PLAY0268 (today,$contextoperands, mixedDate/DateTime, concept rules and reactionwhere). Stage guidance says Stage refuses ESM v26 with STAGE-ESM-016. (#735) - Scene (Release v4.66.0): Four cases in the shared
template-applicability-fixtures.json(a manifest-only blueprint resolves a screen template, a dialog template and a layout it lists, and diagnoses one it does not), asserted by both engines. - Stage (Release v4.129.0): The specification runner and the host now run protected command reads (
command reads protected, Screenplay 4.193.0): a command whose required read does not exist is rejected with ”' ' does not exist.” before anything else runs, and requireconditions and produced-event values can use the read’s properties, matching Screenplay’s own evaluation. Rendering protected reads is still refused with STAGE-ESM-044. (part of #440) - Scene (Release v4.65.0):
CrmActivityCreateFormandCrmActivityEditFormscreen templates (the foundationFormScreenfor an activity, create with Save and new, edit showing the record), with their thumbnails and thecrm.activities.new/crm.activities.editready-to-use screens. The blueprint now has twenty screen templates and five dialog templates. - Scene (Release v4.65.0):
ActivitySectionsandActivityRecordshapes in both sample-data packs (crm-nordic-smb,crm-enterprise-en), so each new form is answered by the data of either pack. - AI (Release v7.63.0): Atomic reaction batches (
reaction batches atomic, ESM v22): when to declare them, what one batch covers, the rollback and budget rules, and that new models start with them. (#717) - AI (Release v7.63.0): Described command handlers (ESM v23): the payload-only result contract, PLAY0695–PLAY0698, and how specifications and Stage treat a pending handler. (#722)
- AI (Release v7.63.0): First-class text rules
contains,starts withandends withon properties (ESM v24), the PLAY0787 repair for legacy text-rule patterns, and thePortableMatchPattern.Check/checkPortableMatchPatternAPIs. (#724) - AI (Release v7.63.0): Protected command reads (
command reads protected, ESM v25): which reads qualify,read.propertypaths inrequireand produced events, absence and concurrent-change rejection, and PLAY0780–PLAY0786. (#720) - AI (Release v7.63.0): Reading the typed
argumentsof compiler diagnostics instead of parsing message text, with the codes that carry them and how to tolerate older responses. (#728) - AI (Release v7.63.0): Mapping
$eventSourceIdor$eventContext.eventSourceIdinto an invoked command from a reaction. (#734) - AI (Release v7.63.0): Captures over public events in specifications (PLAY0700, PLAY0701) and the PLAY0694 warning for a directionless Translate slice that reacts to its own capture. (#712)
- AI (Release v7.63.0): Added-only first observations in record captures. (#716)
- AI (Release v7.63.0): MCP generation details:
generation.arguments, exact support counts and entropy,derivedPattern, and per-rule proof status with witnesses and repairs. (#698) - AI (Release v7.63.0): Generated values:
generate patternwith optional checksums,generate randomranges andgenerate rule, rule proofs (PLAY0688, PLAY0689),validate checksum, the target-neutral generation context, and theGenerationStrategyCatalog,SemanticConceptCheck.CheckandSemanticValidationRules.CheckAPIs for tool authors. Fundamentals 7.25.0GenerateValue.Pattern,IntegerandHasValidChecksumin the concept skill. (part of #576) - Stage (Release v4.128.0): A new application can choose to have its reducers rendered as self-reducing read models, the default that Chronicle’s documentation recommends. In that form, the read model record holds its queries and its static
Reducemethods together, with no separateIReducerFor<T>class. - Stage (Release v4.128.0): Opting in:
CreateNewApplicationProfileselects the self-reducing form and persists the choice with the application. On later renders,ReducerConventionInput.Readloads it back andWithReducerConventionpasses it to Stage. - Stage (Release v4.128.0): Existing applications: anything that doesn’t select the self-reducing form keeps today’s separate reducer classes with unchanged output. Moving an existing application to self-reducing read models is not available yet.
- Cast (Release v0.2.0): Directory member pages render the full profile of Core and Partner members from their
/cast.json, and a profile from public GitHub data for everyone else, each with the terminal, command palette, themes and a printable/<login>/cv/(#10) - Cast (Release v0.2.0):
/cast.jsonversion 2 carries the complete, render-ready profile, with a published JSON Schema (cast-json.schema.json) and a format guide so sites not built with Cast can produce it (#10) - Cast (Release v0.2.0): An optional
profilefield in the registry points the directory at a member’scast.jsonwhen it does not live at<site>/cast.json(#10) - Scene (Release v4.64.0):
planShellSwitch(TypeScript) /ShellSwitchPlanner.Plan(C#): the pre-flight of switching the application’s shell. Default mapping by outlet name, the current primary outlet andcontentfollowing to the new shell’s primary outlet; every outlet of the current shell (and any a screen uses that it lacks) gets amove(keep,primary,unused,unresolved, and the user’smoveToPrimary/mapTo/droppassed back as remaps). An outlet that needs a decision is a blocker withprofileSlotUnplacedand a message naming the screens and outlets; the candidate’s own problems (rootTemplateUnknown,rootTemplateVersionNotSatisfied,rootTemplateNotApplicable,rootTemplateMissingContentSlot,rootTemplateCycle) block too; the blueprint to add and warnings are listed. - Scene (Release v4.64.0):
findProfileBlockers(TypeScript) /ProfileBlockers.Find(C#): the rules Studio kept infindProfileBlockers(missing packages, version conflicts, dependency cycles, unusable shell, incompatible theme, unavailable default screen template, layouts, screen templates, dialog templates and slots the screens still use), moved into the engine with messages that name what they are about. Studio keeps only the presentation (REN2). - Scene (Release v4.64.0):
describeUiProfile/UiProfileNodeKind: component descriptors, in the existing format, for the nodes of a UI profile (Application, Shell withroot.options.*, Theme with colour scheme and accent, Packages, Sample data), with the choices the application supplies; a theme the packages do not support stays on offer with the reason. - Scene (Release v4.64.0):
placeableScreenTemplates/ShellPlacement(shared by the resolver and the planner), Engine-owned codesShellOutletActionandProfileBlockerCode. - Scene (Release v4.64.0): Shared corpora
shell-switch-fixtures.json(27 cases) andprofile-blockers-fixtures.json(20 cases), each asserted byte-for-byte by C# (for_ShellSwitchPlanner,for_ProfileBlockers) and TypeScript (for_planShellSwitch,for_findProfileBlockers), including a regression vector that no message carries an id or an unsubstituted placeholder (the{subject}defect). - Scene (Release v4.64.0): Tests:
for_describeUiProfile(18). - Scene (Release v4.64.0): Docs: “Switching the shell”, “What stops a profile from being applied” and “Describing the profile for a designer” in
blueprints/root-template.md. - Screenplay (Release v4.199.0): Chronological ordering of
DateandDateTimewith==,!=,>,>=,<and<=inrequireandproduces whenconditions (a command property against a command property or a literal) and in command and property validation rules (against a literal). Both sides must have the same primitive.DateTimevalues are compared as UTC instants at tick precision, so one instant written with different offsets is equal. Models that use it select ESM v26; every other model keeps its version and bytes. See decision 0087. (#803) - Screenplay (Release v4.199.0): A
DateTimecommand input that takes part in a date comparison must carry an offset orZ; without one the command is rejected with a Validation outcome before any rule runs. (#803) - Screenplay (Release v4.199.0): A
DateTimeliteral without an offset, or a date literal that does not parse, is reported as PLAY0273. Date ordering with$contextoperands,today, protected read paths, mixedDateandDateTime, on concept rules or in reactionwherestays refused with PLAY0268. (#803) - Arc (Release v22.109.0):
Cratis.Arc.Connections: a connection resolution contract (IConnectionResolver,ConnectionRequest,ResolvedConnection,ConnectionIdentity,ConnectionPurpose). Every part of a resolved connection is optional, so a resolver can answer for the connection string, the database, the schema, the identity, or any combination. (#3314) - Arc (Release v22.109.0): Built-in
Default,Template,HttpandCustomresolvers, with aConnectionslot and anIdentityslot that use the same shape and are applied in order. Resolutions are cached in memory per request, honorexpiresAt, and are dropped when a login fails. (#3314) - Arc (Release v22.109.0):
ArcOptions.ConnectionResolution, configurable in code or underCratis:Arc:ConnectionResolution, resolves connections for MongoDB and Entity Framework Core alike. An integration’s ownConnectionResolutionreplaces it for that integration. (#3314) - Arc (Release v22.109.0):
ConnectionPurposeScope.Begin(ConnectionPurpose.Schema)so migrations can connect with a different identity than data access. (#3314) - Arc (Release v22.109.0):
MongoDBOptions.ConnectionResolution, configurable in code or underCratis:MongoDB:ConnectionResolution. A resolved user name and password becomes a SCRAM credential, and a resolved access token becomes a MONGODB-OIDC credential that refreshes through the resolver. (#3315) - Arc (Release v22.109.0):
EntityFrameworkCoreOptions.ConnectionResolution. Arc-registered contexts resolve the connection for the current tenant and purpose every time it opens, so pooled contexts stay correct across tenants. Access tokens becomeSqlConnection.AccessTokenon SQL Server and the password on PostgreSQL. (#3316) - Arc (Release v22.109.0): A language-neutral REST specification, with an OpenAPI description, of the endpoint the
Httpresolver calls: https://github.com/Cratis/Arc/blob/main/Documentation/connection-resolution-contract.md (part of #3317) - Arc (Release v22.109.0): Documentation for connection resolution, with how-to pages for MongoDB and Entity Framework Core: https://github.com/Cratis/Arc/blob/main/Documentation/backend/csharp/tenancy/connection-resolution.md (#3317) (#3313)
- Arc (Release v22.108.0): A documentation snippet of a protected command for the Cratis documentation site (#3324)
- Stage (Release v4.127.0): Stage now accepts Screenplay models compiled to executable model version 25 (Screenplay 4.193.0) wherever an equivalent earlier model was accepted. (part of #440)
- cli (Release v3.69.0): A spec checks a
ui profilenamingCratis.Blueprint.Crm: refused withCLI-RENDER-007until approved, accepted once approved with the manifest the package publishes (with itsblueprintandsampleDatamembers). - Scene (Release v4.63.0):
migrateLegacyProfile(legacy, library)(TypeScript,@cratis/scene.engine) andProfileMigrator.Migrate(legacy, library)(C#,Cratis.Scene.Engine.Profiles): one pure function that turns a legacy profile - the blueprint (shell) andlayoutname plus the Studio-onlynavigationMode,colorScheme,accentanddefaultScreenTemplate- into the new shape:root(blueprint reference pinned to^major.minor, or own reference),root.options.navigationMode,appearance,defaults.newScreenTemplate. - Scene (Release v4.63.0): Idempotent: a migrated profile comes back unchanged (
changed: false) with or without the legacy fields; a value already in the new shape wins. Once a root exists the legacylayoutis dropped (readers accept both shapes, writers emit the new one). - Scene (Release v4.63.0): Six engine-owned diagnostics for what cannot be mapped, with real names:
legacyLayoutUnknown,legacyShellNotInstalled,legacyShellHasNoLayout,legacyColorSchemeUnknown,legacyNavigationModeWithoutRoot,legacyDefaultScreenTemplateUnknown. - Scene (Release v4.63.0): Shared corpus
profile-migration-fixtures.json(29 permutations incl. idempotence) asserted byfor_ProfileMigrator(C#) andfor_migrateLegacyProfile(TS) with identical profiles (canonical JSON) and identical diagnostics. - Scene (Release v4.63.0): Docs: “Migrating a legacy profile” and the compatibility rules in
blueprints/root-template.md. - Cast (Release v0.1.0):
@cratis/cast, an Astro integration that turns onecast.yamlinto a complete profile site with a career replay, live public GitHub data, writing, talks, projects, a printable/cv, a terminal, a command palette and light and dark themes (#1) - Cast (Release v0.1.0):
@cratis/create-cast, run withnpm create @cratis/cast, scaffolds a site prefilled from your public GitHub profile, with an hourly GitHub Pages deploy workflow (#1) - Cast (Release v0.1.0): Cast badges: Core and Partner come only from the reviewed registry in this repository, Contributor is earned from merged public pull requests in the Cratis organization, and every badge links to its verification page in the directory (#1)
- Cast (Release v0.1.0): Every Cast site publishes
/cast.json, a JSON Resume/resume.jsonand/llms.txt, so people, directories and AI agents read the same profile (#1) - Cast (Release v0.1.0): The Cast directory for https://cast.cratis.io, with Core, Partner and Contributor sections, a verification page and embeddable badge for every member, and a guide to joining (#1)
- Scene (Release v4.62.0):
for_effectiveShell/when_composing_with_a_root_template(blueprint shell, per-screen layout ignored, FullPage opt-out, unknown root falls back with a diagnostic, root screen template with its own primary outlet, legacy profile). - Scene (Release v4.61.0):
TemplateRole.RootandTemplateMetadata.role/.primaryOutlet(C# + TS + shape contract). A screen template with the root role is an application shell like a layout: offered only at theApplicationscope, never fits a slot, never a dialog template.ApplicableTemplates(Application)returns layouts and root screen templates; the template-applicability corpus has 6 new vectors and a root screen template in the library. - Scene (Release v4.61.0):
resolveEffectiveShell(TS,@cratis/scene.engine) andShellResolver.Resolve(C#,Cratis.Scene.Engine.Shell) returningEffectiveShell(reference, template, kind, source, package + version, pin evaluation, outlets, primary outlet, options, diagnostics). Order:profile.root-> legacyprofile.layout-> first installed blueprint default -> built-in Bare (singlecontentoutlet). - Scene (Release v4.61.0): Diagnostics
rootTemplateUnknown,rootTemplateVersionNotSatisfied,rootTemplateNotApplicable,rootTemplateMissingContentSlot,rootTemplateCycle,rootTemplateBlueprintNotInstalled,profileThemeIncompatible,profilePackageMissing,profileSlotUnplaced, each with a fixture vector and a message with real names. - Scene (Release v4.61.0): Shared corpus
effective-shell-fixtures.json(own, blueprint, pinned, drifted, unknown, legacy, none; 31 cases) asserted byte-for-byte by C# (for_ShellResolver) and TS (for_resolveEffectiveShell). - Scene (Release v4.61.0):
blueprintCatalog.jsonentries describe a shell’soutlets,primaryOutletandrole. - Scene (Release v4.61.0): Docs:
blueprints/root-template.md(resolution order, root role, diagnostics table, catalog). - Chronicle (Release v19.73.0):
IEventStore.RemoveNamespacein the .NET client and aRemoveNamespacegRPC command remove a namespace: its observers are unsubscribed and removed (which unregisters the reminders that used to bring the namespace back at the next start), the MongoDB event store namespace database is dropped, the namespace is forgotten and aNamespaceRemovedevent is appended to the system event sequence. The default namespace cannot be removed, removing an unknown namespace does nothing and an interrupted removal can be repeated (#4942). - Chronicle (Release v19.73.0):
IEventStoreStorage.DropNamespacelets a storage provider drop the data of a removed namespace; the SQL and in-memory providers keep their data for now. - AuthProxy (Release v2.31.0):
Session:CookieDomainshares the session cookie with every host under a parent domain, for example.example.com. Sign-out deletes it for the whole domain, and the stale host-only copy that an earlier deployment left in a browser is deleted on sign-in, on sign-out, when the cookie arrives twice and when it cannot be read. (#194) - AuthProxy (Release v2.31.0):
Session:CookieNamerenames the session cookie, so two AuthProxy deployments under one domain do not read each other’s sessions. The default stays.Cratis.AuthProxy.Auth.v2. - AuthProxy (Release v2.31.0):
SignIn:CallbackHostruns every OAuth or OIDC handshake on one host. A sign-in or sign-out that starts elsewhere is sent there and returns to the original address, so the provider needs one callback and one post-logout address. It requiresSession:CookieDomain. - AuthProxy (Release v2.31.0): A sign-in may return to an absolute address only when
SignIn:CallbackHostis set, and only for an origin of a declared service host, a configured frontend, the lobby orLogout:AllowedRedirectOriginsthat lies inside the cookie domain, on the scheme the request arrived on. Anything else is reduced to a path on the host it started on. Sign-out uses the same list. - AuthProxy (Release v2.31.0): Aspire:
WithHosts,WithPathPrefix,WithSessionCookieDomain,WithSessionCookieNameandWithSignInCallbackHost. - AuthProxy (Release v2.31.0): A startup warning when
Session:CookieDomainis set whileAllowedHostsaccepts every host, and when the cookie name uses the__Secure-prefix. - AuthProxy (Release v2.31.0): A how-to, One proxy, several hosts, with the migration from several instances.
- Screenplay (Release v4.196.0):
Samples/Orders: an application whose four screens fill theOrdersList,OrderPage,OrdersFulfilmentBoardandOrdersDeliveryCalendartemplates and whose quick-create fillsOrdersQuickCreateOrder, with the navigation declared in the layout, five specifications and a README. - Screenplay (Release v4.196.0): The
orders-sampleconformance vector (golden syntax) and its entry in the sample list. - Scene (Release v4.59.0):
@cratis/scene.blueprint.orders: the orders list, the order page (key facts, lines, shipments, activity), the fulfilment board, the delivery calendar (the foundationcalendarGrid) and the new-order quick-create dialog, with navigation, thumbnails, theorders-ensample-data pack and theBusiness / Orderscategory. - Scene (Release v4.59.0): Specifications for the definition of done of every template, the screen set, the application behaviour, every forced standard state, and the Chromium audit at desktop, tablet and phone widths in both themes with colour contrast.
- Scene (Release v4.59.0): Docs
blueprints/orders-blueprint.md, the table of contents and the index; the Orders package joins the browser specifications of the JavaScript build. - Chronicle (Release v19.72.0): Analyzer CHR0065 warns when a read model has a method that is plainly meant to fold an event into it but will never be discovered as a self-reducer. This catches a fold whose name is not
Reduce(for exampleReducerorreduce) and a fold that is notstatic. Previously such a read model never folded and nothing said why. The diagnostic names the reason and shows the expectedReducesignature, and also recognizes historical event generations and event types that inherit[EventType]. See CHR0065. (#4962) - Stage (Release v4.125.0): The Stage ships
PrimeReactandCratis.Blueprint.Defaultin the catalog aui profileis resolved against, next tocore,scene.webandCratis.Components. A domain blueprint (@cratis/scene.blueprint.crm,.ticketing,.approvals,.inventory,.hr,.project-tracker,.administration) now only needs approving itself. The declarations are generated from the real package manifests (shippedPackages.spec.tsfails whenRendering.Cratis/Shipped/ShippedPackages.jsonis stale), andcore:*component names resolve. - Stage (Release v4.125.0): A live Stage and a generated React application load the screen and dialog templates of the approved blueprints, so
template blueprint <Package> <Template>renders the blueprint’s template. A live Stage maps@cratis/scene.blueprint.default,@cratis/scene.engineand@cratis/scene.modelto its own instances, as it does for React. - Stage (Release v4.125.0):
Verification/live-blueprintsruns the Stage image against all seven published blueprints at 4.53.1 (approved set made from the published manifest as written) and asserts in a browser that every screen the blueprint’s templates build mounts with content, with no load diagnostics and no sample data served. It is a new step of thelive-custom-packagesCI job. - Screenplay (Release v4.195.0):
Calendarfeature underTimeOffinSamples/Hr: aTeamCalendarEventsread model projected fromTimeOffRequestRegistered, a screen on theHrTeamCalendartemplate, a specification, and a Team calendar entry in the sidebar. - Screenplay (Release v4.195.0):
Timelinefeature inSamples/Projects: aProjectTimelineItemsread model projected fromProjectRegistered, a screen on theProjectTimelinetemplate, a specification, and a Timeline entry in the sidebar. - Screenplay (Release v4.195.0): The golden syntax of both samples regenerated for the conformance vectors
hr-sampleandprojects-sample; the sample READMEs describe the new features. - Scene (Release v4.57.0):
RootTemplate(Template: TemplateReference, Options),ProfileAppearance(ColorScheme?, Accent?),ProfileDefaults(NewScreenTemplate?)and theColorSchemeenum (Light,Dark,System), and the optional membersUiProfile.Root,.Appearance,.Defaults- in C# (Cratis.Scene.Model) and mirrored in TypeScript (@cratis/scene.model). The root template reuses the existingTemplateReference(own or blueprint, id, blueprint, version pin). - Scene (Release v4.57.0):
UiProfileJson(C#Cratis.Scene.Engine.Profiles) andparseUiProfile/serializeUiProfile(TypeScript engine): lenient reading, one canonical writing, byte-identical in both languages. - Scene (Release v4.57.0): Shared fixture corpus
ui-profile-fixtures.json(own, blueprint + pin, options, legacy layout only, nothing new, appearance, defaults, everything, lenient enum case, non-ASCII, unknown members) run by both toolchains;scene-model-shape.jsonextended for the new types and enum. - Scene (Release v4.57.0): Documentation: new
blueprints/root-template.md,layouts.mdlinks to it. - Screenplay (Release v4.194.0):
Diagnostic.Argumentscarries the subjects of a diagnostic as named values: text, keyword, index or declaration path. Each code declares its arguments, with their kinds and meanings, in the diagnostic catalog and the published contract. The names, kinds and meanings are permanent. Sixteen codes carry arguments in this release, among them PLAY0524 (an incomplete specification step), which names the specification, the step role and position, the missing property and its type, and the example or case. MCP and thescreenplaytool include the arguments in their JSON output. See Diagnostics. (#804) - Stage (Release v4.124.0): Stage now accepts Screenplay models compiled to executable model version 24 (Screenplay 4.188.0), including the text validation rules
contains,not contains,starts withandends with. Generated validators, the specification runner and the host check them exactly as Screenplay does: case-sensitive, and an absent value passes. (#448) - Scene (Release v4.56.0):
ProjectTimelinescreen template and theprojects.timelinescreen in@cratis/scene.blueprint.project-tracker: every project as a bar in a lane for its owner with progress, two milestones and dependencies, built on the foundationtimelineGrid; the scale is kept in the address and on a phone the schedule is the table. - Scene (Release v4.56.0): Timeline items and columns, and the day the schedule counts from, in the
project-tracker-ensample-data pack. - Scene (Release v4.56.0): A
Timelineentry in the navigation, a thumbnail, and the docs inblueprints/project-tracker-blueprint.md(the not-in-delivery note is removed). - Scene (Release v4.55.0):
HrTeamCalendarscreen template and thehr.timeoff.calendarscreen in@cratis/scene.blueprint.hr: who is away and when on a month, a week or as an agenda, built on the foundationcalendarGrid; a filter by person or kind of leave; the people away listed beside it; one column on a phone. - Scene (Release v4.55.0): Calendar events, columns and filter fields in the
hr-nordicsample-data pack, made from its time-off requests (a declined request is left out). - Scene (Release v4.55.0): A
Team calendarentry beneath Time off in the navigation, a thumbnail, and the docs inblueprints/hr-blueprint.md(the not-in-delivery note is removed). - AI (Release v7.61.0): The
cratis/engineeringprofile now tells agents to claim an issue when they start work on it: for a numbered issue in a known repository with nobody assigned, the agent assigns the currentghuser, and it never replaces or adds to an existing assignee. - Scene (Release v4.54.0): Components in
@cratis/scene.blueprint.default:calendarGrid(month, week, agenda; keyboard; the busy day listed in full; day and view in the address),timelineGrid(Gantt-style lanes with progress, milestones, dependencies and conflicts told in words; a table alternative) andinboxList(grouped by day, unread told in words, filter and category in the address, keyboard, mark read or unread). - Scene (Release v4.54.0): Foundation screen templates:
CalendarScreen,TimelineScreen,InboxScreen,SettingsScreen,ProfileScreen,ReportViewerandImportWizard, each with a thumbnail and preview data from the foundation sample-data pack. - Scene (Release v4.54.0): The template types
Calendar,Timeline,Inbox,Settings,Profile,ReportandImportin the type vocabulary of both the TypeScript and the C# engine, with the shared verification fixture. - Scene (Release v4.54.0): Specifications: behaviour of each component, definition of done and preview of each template, and the Chromium audit of every new component at desktop, tablet and phone widths in both themes.
- Scene (Release v4.54.0): Docs:
blueprints/foundation-components.mdandblueprints/foundation-templates.md. - Screenplay (Release v4.193.0): Application-root
command reads protectedpreamble opts a model into protected command reads, bound as ESM v25. Declare it once in the root document; imported commands inherit it. See Commands and decision 0085. (#129) - Screenplay (Release v4.193.0): Under the preamble,
read.propertypaths qualify single-level read-model values inrequireconditions and in produced-event mappings. (#802) - Screenplay (Release v4.193.0): The reference evaluator rejects a command with
Validationwhen a required read-model instance is absent, and withConflict(DecisionStateChanged) when a matching fact is appended between decision and commit. (#129) - Screenplay (Release v4.193.0): Diagnostics
PLAY0780toPLAY0785report a misplaced or duplicate preamble, a read that cannot be protected (with its closed reason), a read without a key, reads combined withconcurrency, and unknown or ambiguous read paths. (#129) - Screenplay (Release v4.193.0): Informational
PLAY0786on eligible legacy models, with a typed workspace and MCP repair that previews inserting the preamble for individual review before apply. (#129) - Screenplay (Release v4.193.0): Syntax, highlighting, completion and diagnostics for the preamble in the TypeScript compiler, the Monaco editor and the VS Code extension. (#129)
- Screenplay (Release v4.192.0): A runnable application shell vector.
ScreenCompositionCorpus.V1publishesscreen-shell-navigation-runnable: the shell constructs (a topbar and sidebar that inherit, extend and override per module, item targets and slots, a toolbar button that starts a State Change slice, a sample data pack the ui profile selects) with the queries, projections and screens the generated backend needs. The structure-onlyscreen-shell-navigation-positivecase is not a backend model -cratis renderanswersPLAY0268andPLAY0269for it - so the CLI leg reads this case; both stay in the corpus. - Screenplay (Release v4.192.0):
BrowserHarness/screen-shell-cli-render.sh, also ashell-clistep ofrun-public-acceptance.sh: it renders the case, from the published corpus package whenSCREENPLAY_CORPUS_PACKAGE_VERSIONis set, with the installed publiccratis(3.67.0 or later, which bundles Stage 4.119.1) and requires the module navigation targets and the toolbar slice inscene.jsonand no sample data anywhere in the generated application. - Orleans (Release v1.18.0):
IJobs, a service for starting, stopping and deleting jobs without routing generic job types through the shared jobs manager:Start<TJob, TRequest>(key, [jobId,] request)starts the job from the calling silo, so it is placed only on silos that know its type, and the job stays recoverable. See Jobs. (#76) - Orleans (Release v1.18.0):
IJobs.Stopreturns aStopJobResultandIJobs.DeleteaDeleteJobResult: stopped or deleted, not found,UnknownJobTypewhen the stored job belongs to a release this silo does not have, or refused with the job’s own error. A job is never reported as stopped or deleted unless it was. (#76) - Orleans (Release v1.18.0):
IJobStorage.GetJobType(jobId)reads a stored job’s type without reading its request, in MongoDB, SQL and in-memory storage. Custom stores keep compiling through a default implementation. (#76) - Orleans (Release v1.17.0):
IJobsManagerKeys: implement it to list the job scopes and namespaces your host runs jobs in (for example event store × tenant namespaces), so recovery can find every interrupted job. Without one, recovery covers only the scopes this silo has used and logs a startup warning. See Jobs. (#63) - Orleans (Release v1.17.0):
AddCratisOrleansJobsRecovery()onISiloBuilderregisters job recovery for silos not set up throughAddCratisOrleans(such asTestClustersilos). (#63) - AI (Release v7.60.0): A MongoDB rule (
mongodb.md): query withBuilders<T>,FindandAggregatepipelines instead ofAsQueryable(), which fails at request time withExpression not supportedfor anything the driver cannot translate. It is registered with the backend developer and code reviewer agents and the rule index. - AI (Release v7.60.0): Guidance in
cratis-arc-query-pagingfor paging MongoDB without LINQ: returncollection.Observe(<FilterDefinition>)and let Arc apply the client’s sort, page and size. Sorting resolves the BSON element name, so concept-typed members sort by their stored value, and ties break on_id. - AI (Release v7.60.0): An eval and a trigger for a paged MongoDB query that fails with
Expression not supported. - Stage (Release v4.122.0): Stage now accepts Screenplay models compiled to executable model version 23 (Screenplay 4.182.0) wherever an equivalent earlier model was accepted. (part of #316)
- AI (Release v7.59.0): A shell step in
Source/Verification/screens-smoke/screens-smoke.sh: it installs the CLI pinned asshellCli(3.67.0, the first release that bundles Stage 4.119.1), rendersscreens-smoke/shell/application.play- a sidebar and topbar that inherit, extend and override per module, item targets and slots, a toolbar button that starts a State Change slice and a sample data pack - and requires the module navigation targets and the toolbar slice inscene.jsonand no sample data anywhere in the generated application. - AI (Release v7.59.0): A
Shell CLIrow in the screens release vector ofDocumentation/compatibility.md; the screens authoring spec compares it with theshellClipin the way it already does for the Smoke CLI. - Screenplay (Release v4.191.0):
GenerationStrategyCataloginCratis.Screenplay.Semanticslists every generation strategy and what it accepts: - Screenplay (Release v4.191.0): the ESM kind, primitives and the version that introduced it;
- Screenplay (Release v4.191.0): whether it is admitted or reserved, and whether it needs an implementation;
- Screenplay (Release v4.191.0): its fixed entropy;
- Screenplay (Release v4.191.0): each option’s placement, kind, limits, choices, default and conditions.
- Screenplay (Release v4.191.0):
SemanticConceptCheck.Checkchecks one concept, given as syntax or from an executable model, and returns: - Screenplay (Release v4.191.0): its findings, each pointing at the generation, an option or a rule rather than a source location;
- Screenplay (Release v4.191.0): its rule proofs;
- Screenplay (Release v4.191.0): its generation support and entropy;
- Screenplay (Release v4.191.0): the ESM version it requires.
- cli (Release v3.68.0): A spec evaluates every
plan.*assertion the canonical corpus pins for its application shell vector (screen-shell-navigation-positive, StageDesktopplan) - topbar and sidebar regions at application level and in three modules (inherit, extend, override), hierarchical items with target and slot, toolbar buttons that invoke State Change slices, blueprint template references, slice kinds, and no served sample data - against the Scene the CLI hands to its renderer for that document. A path the corpus adds is refused until the CLI understands it. (part of #367) - AI (Release v7.58.0): A
cratis-screenplay-ui-compositionreference,references/application-shell.md, built on the canonicalscreen-shell-navigation-positivevector: how a module inherits, extends or overrides a topbar or sidebar region, item targets, slots and sub-items, why a module’s own items may only target that module (PLAY0750) and what that means when a region switches from inherit to override, toolbarbuttonlines that start a State Change slice (PLAY0762for anything else), blueprint references with a version range and the profile listing the blueprint, categories, and the sample data pack chosen once in theui profile. Every example compiles with--warnaserror, and four refusal blocks assertPLAY0750,PLAY0747,PLAY0762,PLAY0721andPLAY0722throughexpectfences. - AI (Release v7.58.0): A section in the skill with the same rules in short form and a checklist row;
cratis-screenplay-model-authoringgains the MCP edit loop for the shell (read the typed nodes, propose, stale revision, apply, reopen) inreferences/screen-authoring-workflow.md, and the model-authoring and read-surface routing tables name the new constructs. - AI (Release v7.58.0): Two evaluation tasks (module navigation modes with slice buttons; blueprint template with sample data), three trigger queries folded into the existing ones, and verification assertions for the reference.
- Scene (Release v4.53.0):
@cratis/scene.blueprint.approvals, a blueprint package (domainapprovals, categoryBusiness / Approvals): seven screen templates, two dialog templates and seven ready-to-use screens. - Scene (Release v4.53.0):
ApprovalInbox: the requests waiting for the signed-in person as cards (the foundation list’s Cards variant) with Approve, Reject and Request changes as buttons on each card; a decision opensDecisionDialog. - Scene (Release v4.53.0):
MyRequests(draft, submitted, approved, rejected as chips, and a New request button),AllRequestsandRequestTypes(the request types an organisation offers, for administrators). - Scene (Release v4.53.0):
NewRequestWizard: request type, details, attachments (a file uploader), then review and submit, on the foundationWizardScreen. - Scene (Release v4.53.0):
RequestPage: summary, the approval chain (approvalChainStepper), the request’s fields, attachments and the comments as the page’s activity, and the decision buttons. - Scene (Release v4.53.0):
RequestTypeEditForm, and dialogsDecisionDialog(a confirmation with the decision and a comment) andRequestTypeQuickCreate. - Scene (Release v4.53.0): Each template carries its
scopes, so a template picker offers it only where it fits. - Scene (Release v4.53.0): Navigation: a topbar naming the
approvalsmodule and the module’s sidebar (Inbox, My requests, All requests, Templates), the application structure andapprovalsApplication(). - Scene (Release v4.53.0): Sample-data packs
approvals-general(en-GB, GBP) andapprovals-nordic(nb-NO, NOK) answering the same shapes, with five request types as presets (Leave, Expense, Purchase, Travel, Invoice approval). - Scene (Release v4.53.0): Specifications: definition of done per template and package, screen set consistency, applicability by level, every screen previewed in both packs with no accessibility violation, standard states forced on seven screens, the behaviors of the application (decide from the inbox, start and step through the wizard, open a request and its chain, edit a request type), and a Chromium audit of every screen and dialog at desktop, tablet and phone widths in light and dark themes (56 specs, in CI).
- Scene (Release v4.53.0): Docs:
blueprints/approvals-blueprint.md. - Screenplay (Release v4.190.0):
Samples/Approvals/approvals.play: requests and approvals - an inbox of decision cards, my requests, a new-request wizard, a request page with its approval chain, every request and an administrator’s request types - in one file of 6 slices, each with a specification (6 of 6 pass underscreenplay test). Every screen fills a template of the blueprint (template blueprint Cratis.Blueprint.Approvals ApprovalInbox version "^1.0"); the decision dialog and the wizard give theiractionsslot the command they issue; the layout declares the topbar and sidebar; theui profileactivates the blueprint’s English pack withactive blueprint approvals-general. It compiles with no error and no warning. - Screenplay (Release v4.190.0): The conformance manifest lists the sample (
approvals-sample) with its golden syntax, so the TypeScript and C# compilers are held to the same tree for it. - Screenplay (Release v4.190.0): Docs:
Samples/Approvals/README.md, the samples table and the samples rule. - Scene (Release v4.52.0):
dataListacceptsrowActionStyle(menu, the default, orbuttons). Withbuttonseach row action is a button of its own in the row or card, named for its request (“Approve: Leave: Isla Morgan”), publishes the sameactionoutput as the menu, and follows the action permission rule (disabled buttons say why on hover, hidden ones are not drawn). - Scene (Release v4.52.0): Docs:
blueprints/foundation-components.md(Deciding from a list). - Screenplay (Release v4.189.0):
Samples/Inventory(warehouse: items, an item gallery, locations, movements, check in and out, suppliers, a dashboard),Samples/Hr(directory, org chart, time off with balances, onboarding),Samples/Projects(projects, my tasks, a board by status and by person, a task side sheet) andSamples/Administration(users, roles and permissions, settings, audit log). Each is one file with a persona and policy, the layout’s topbar and sidebar navigation, aui profilethat activates the blueprint’s pack (active blueprint inventory-warehouse,hr-nordic,project-tracker-en,admin-default) and Given/When/Then specifications for every slice (screenplay testpasses). They compile with no error and no warning under--warnaserror. - Screenplay (Release v4.189.0): The conformance manifest lists the four samples with their golden syntax, so the TypeScript and C# compilers are held to the same tree for them (
SCREENPLAY_REGENERATE_SYNTAX_VECTORS=1). - Screenplay (Release v4.189.0): Docs: a README for each sample, the samples table and the samples rule.
- Scene (Release v4.51.0):
@cratis/scene.blueprint.ticketing, a blueprint package (domainticketing, categoryBusiness / Ticketing): nine screen templates, six dialog templates and nine ready-to-use screens. - Scene (Release v4.51.0):
SupportDashboard: open tickets, overdue and the average first response; open tickets by priority and by assignee; the overdue tickets; my next steps. - Scene (Release v4.51.0):
TicketQueue(id, subject, requester, priority and status chips, assignee, age; saved views Unassigned, Mine and Overdue),MyTicketsandCustomerList. - Scene (Release v4.51.0):
TicketBoard: a column for each status with a card for each ticket. - Scene (Release v4.51.0):
TicketPage: the conversation as the page’s activity, the properties in the aside, and the quick actions Assign, Change status, Escalate and Merge, each opening its dialog. - Scene (Release v4.51.0):
TicketCreateFormand the public-facingTicketPortalForm(full-page layout, no application chrome, a notice about what happens next, only what a customer can say). - Scene (Release v4.51.0):
KnowledgeBase: a search box and a tree of categories and articles beside the chosen article; a navigation stack on a phone. - Scene (Release v4.51.0): Dialogs
TicketQuickCreate,CustomerQuickCreate,AssignTicket,ChangeTicketStatus,EscalateTicketandMergeTickets. - Scene (Release v4.51.0): Navigation: a topbar naming the
supportmodule and the module’s sidebar (Dashboard, Queue with List and Board, My tickets, Customers, Knowledge base), the application structure andticketingApplication(). - Scene (Release v4.51.0): Sample-data packs
ticketing-helpdesk(en-GB) andticketing-service-desk-de(de-DE) answering the same shapes. - Scene (Release v4.51.0): Specifications: definition of done per template and package, screen set consistency, applicability by level, every screen previewed in both packs with no accessibility violation, standard states forced on seven screens, the behaviors of the application (quick create, open a ticket, the four quick actions, board moves, the portal form without chrome), and a Chromium audit of every screen and dialog at desktop, tablet and phone widths in light and dark themes (92 specs, in CI).
- Scene (Release v4.51.0): Docs:
blueprints/ticketing-blueprint.md. - Screenplay (Release v4.188.0): Canonical application shell vector.
ScreenCompositionCorpus.V1publishesscreen-shell-navigation-positive: an application with a sidebar and a topbar at application level and in three modules (inherit, extend, override), hierarchical items with target and slot, toolbar buttons that invoke State Change slices, blueprint template references and a sample data pack the ui profile selects. Seven rejection vectors pin the diagnostics of the shell rules (PLAY0710,PLAY0714,PLAY0721,PLAY0722,PLAY0744,PLAY0747-PLAY0749,PLAY0761,PLAY0762) five MCP edit expectations that name the transcripts editing each construct, and aDesktopStage plan pinning what the published Stage imagecratis/stage:4.119.1serves for the document (navigation, toolbar buttons, blueprint references; no sample data). - Screenplay (Release v4.188.0): Revision-checked MCP transcripts for navigation regions, toolbar buttons and blueprint template references: read the typed nodes, propose, refuse a stale revision, apply, reopen. Switching a module’s region mode, copying the application’s items (retargeted to the module,
PLAY0750otherwise), adding and removing sub-items, pointing a button at a State Change slice (PLAY0762for anything else) and changing a template version range are all ordinarypropose-astedits. See Author the application shell. - Screenplay (Release v4.188.0): The MCP
syntax-schemadescribes every new kind (NavigationRegionSyntax,NavigationItemSyntax,NavigationTargetSyntax,NavigationLogoSyntax,ToolbarButtonSyntax, template references, sample data), asserted by the transcript spec. - Screenplay (Release v4.188.0): The shared TypeScript conformance vectors hold the whole shell document and module and feature template assignments, so both compilers accept what the C# compiler accepts.
- Scene (Release v4.50.0):
@cratis/scene.blueprint.administration, a blueprint package (domainadministration, categoryBusiness / Administration) built only on the foundation set’s public templates and components: five screen templates, two quick-create dialogs and five ready-to-use screens. - Scene (Release v4.50.0):
AdministrationUserList: name, email, role, status and last active; filters; row actions; Invite user. - Scene (Release v4.50.0):
AdministrationUserPage: profile, role assignments and sessions (a session can be signed out), key facts and account history. - Scene (Release v4.50.0):
AdministrationRoles: the roles on the left; on the right the permission matrix of the chosen role (usesfocusRolefrom #145), every role side by side while none is chosen; the chosen role lives in the address. - Scene (Release v4.50.0):
AdministrationSettings: the foundation form in Settings mode - general, branding and notifications, each section with its own Save. - Scene (Release v4.50.0):
AdministrationAuditLog: time, actor, action and target, read only, with filters and Export. - Scene (Release v4.50.0): Dialogs
AdministrationInviteUserandAdministrationQuickCreateRole. - Scene (Release v4.50.0): Navigation: a topbar naming the
adminmodule and the module’s sidebar (Users, Roles, Settings, Audit log), the application structure andadministrationApplication(). - Scene (Release v4.50.0): Sample-data pack
admin-default(en-GB): twelve users in three states, five roles with grants over ten permissions in four groups, twelve audit entries, an organization’s settings. - Scene (Release v4.50.0): Specifications as for every blueprint, including a Chromium audit of every screen and dialog at desktop, tablet and phone widths in the light and dark themes.
- Scene (Release v4.50.0): Docs:
blueprints/administration-blueprint.md. - Screenplay (Release v4.187.0):
Samples/Ticketing/ticketing.play: a support team’s help desk - dashboard, queue, board, ticket page, customers, knowledge base and a public portal form - in one file of 12 slices, each with a specification (12 of 12 pass underscreenplay test). Every screen fills a template of the blueprint (template blueprint Cratis.Blueprint.Ticketing TicketQueue version "^1.0"); the four quick actions of the ticket page fill the blueprint’s dialog templates and issue their commands; the board’stoolbarslot issues the status change; the layout declares the topbar and sidebar with Board nested under Queue; theui profileactivates the blueprint’s English pack withactive blueprint ticketing-helpdesk. It compiles with no error and no warning. - Screenplay (Release v4.187.0): The conformance manifest lists the sample (
ticketing-sample) with its golden syntax, so the TypeScript and C# compilers are held to the same tree for it. - Screenplay (Release v4.187.0): Docs:
Samples/Ticketing/README.md, the samples table and the samples rule. - Scene (Release v4.49.0):
@cratis/scene.blueprint.project-tracker, a blueprint package (domainproject-tracker, categoryBusiness / Project tracker) built only on the foundation set’s public templates and components: five screen templates, three dialog templates and five ready-to-use screens. - Scene (Release v4.49.0):
ProjectList: each project as a card with owner, a progress bar, due date and status. - Scene (Release v4.49.0):
ProjectPage: status, progress, open tasks and days left as key facts, the project’s fields, its task list (choosing a task opens it in a side sheet), members and activity. - Scene (Release v4.49.0):
ProjectMyTasks: the user’s tasks grouped by when they are due. - Scene (Release v4.49.0):
ProjectTaskBoardandProjectTaskLanes: a column for each status; the second with a lane for each assignee (uses the swimlane option from #142). - Scene (Release v4.49.0): Dialogs
ProjectQuickCreateProject,ProjectQuickCreateTaskandProjectTaskSheet, a side sheet that shows one task with its subtasks and conversation. - Scene (Release v4.49.0): Navigation: a topbar naming the
projectsmodule and the module’s sidebar (Projects, My tasks, Board with By status and By person), the application structure andprojectTrackerApplication(). - Scene (Release v4.49.0): Sample-data pack
project-tracker-en(en-GB): eight projects, twenty-two tasks, members, a task with subtasks and a conversation. - Scene (Release v4.49.0): Specifications as for every blueprint, including a Chromium audit of every screen and dialog at desktop, tablet and phone widths in the light and dark themes.
- Scene (Release v4.49.0): Docs:
blueprints/project-tracker-blueprint.md. - Scene (Release v4.48.0):
@cratis/scene.blueprint.hr, a blueprint package (domainhr, categoryBusiness / HR) built only on the foundation set’s public templates and components: seven screen templates, two quick-create dialogs and seven ready-to-use screens. - Scene (Release v4.48.0):
HrEmployeeDirectory: each person as a card with photo, name, title, department and contact; filters by department, location, status and manager. - Scene (Release v4.48.0):
HrEmployeePage: time-off balance as key facts, personal and job information, documents and time-off requests as related lists, history and open tasks. - Scene (Release v4.48.0):
HrOrgChart: the company as a tree of who reports to whom, with titles and report counts; the chosen person lives in the address. - Scene (Release v4.48.0):
HrTimeOffList(approve or decline one row or many, Request time off),HrTimeOffBalanceList(entitlement, taken and left with a progress bar of how much is used, read only). - Scene (Release v4.48.0):
HrOnboardingList(new hires with a progress bar of their checklist) andHrOnboardingChecklist(sections of tasks, each with an owner and a due date). - Scene (Release v4.48.0): Dialogs
HrRequestTimeOffandHrQuickCreateEmployee. - Scene (Release v4.48.0): Navigation: a topbar naming the
hrmodule and the module’s sidebar (Directory, Org chart, Time off with Requests and Balances, Onboarding), the application structure andhrApplication(). - Scene (Release v4.48.0): Sample-data pack
hr-nordic(nb-NO, NOK): sixteen people in six departments with a reporting line, twelve time-off requests, balances, five new hires and a three-part onboarding checklist. - Scene (Release v4.48.0): Specifications as for every blueprint: definition of done per template and package, screen set agreeing with the manifest, structure and navigation, applicability by level, every screen previewed without an accessibility violation, every standard state forced, the behaviors of the application, and a Chromium audit of every screen and dialog at desktop, tablet and phone widths in the light and dark themes.
- Scene (Release v4.48.0): Docs:
blueprints/hr-blueprint.md. - cli (Release v3.67.0):
cratis runreports compiler errors about the application shell - a navigation item that targets nothing or a slot no layout declares (PLAY0747-PLAY0750), a toolbar button that names a slice that is not a State Change slice (PLAY0762), a sample data selection no pack satisfies (PLAY0714) - with their code andfile(line,column)location and exit code 5, before it starts Docker. (part of #367) - cli (Release v3.67.0): The CLI’s CI runs an application shell fixture (
Integration/Cli/Shell: three modules that inherit, override and extend the sidebar, a toolbar button that opens a State Change slice as a task dialog, a sample data pack) throughcratis runon a live Stage and throughcratis render, a build and a launch, and drives both with one browser scenario: topbar and sidebar per module, active module and feature, dialog fields from the command schema, cancel posts nothing, submit posts the command, deep link and back navigation, no sample row in anything that ships. (part of #367) - cli (Release v3.67.0): Documentation for the application shell in the
runandscreenplayreferences. (part of #367) - Scene (Release v4.47.0):
kanbanBoardswimlane: assignee: the board is laid out in a lane for each person (in the order they first appear in the cards, the unassigned last), each across the same columns. A card moves between columns within its lane by dragging or by its Move-to menu; each column’s count and total are for its lane, the over-the-limit warning counts every lane. Lane headings are one level above the columns’ so the outline stays in order. - Scene (Release v4.47.0): Docs:
blueprints/foundation-components.md(Boards). - Scene (Release v4.46.0):
@cratis/scene.blueprint.inventory, a blueprint package (domaininventory, categoryBusiness / Inventory) that depends on the foundation set only through its public templates and components: eight screen templates, three quick-create dialogs and eight ready-to-use screens. - Scene (Release v4.46.0):
InventoryDashboard: low stock count, stock value and movements this week; top movers; recent movements; items to reorder. - Scene (Release v4.46.0):
InventoryItemList(sku, name, category, location, quantity, status; low stock tinted and marked in words; filters; choosing a row opens the item) andInventoryItemGallery(the same items as cards with their picture). - Scene (Release v4.46.0):
InventoryItemPage: key facts, the item’s fields and supplier, stock by location and movement history as related lists, cycle counts; Adjust stock and Check out. - Scene (Release v4.46.0):
InventoryLocations: the location tree beside what is stored in the chosen location and beneath it; the choice lives in the address. - Scene (Release v4.46.0):
InventoryMovementList(read only),InventorySupplierListandInventoryCheckInOut, a mobile-first single-column form to scan or search an item and check it in or out. - Scene (Release v4.46.0): Dialogs
InventoryAdjustStock(item, quantity change, reason),InventoryQuickCreateItemandInventoryQuickCreateSupplier. - Scene (Release v4.46.0): Each template carries its
scopes, so a template picker offers it only where it fits and hides the blueprint where nothing applies. - Scene (Release v4.46.0): Navigation: a topbar naming the
inventorymodule and the module’s sidebar (Dashboard, Items with Table and Gallery, Locations, Movements, Suppliers), the application structure andinventoryApplication(). - Scene (Release v4.46.0): Sample-data pack
inventory-warehouse(en-GB, GBP): sixteen items, fourteen movements, five suppliers and a three-level tree of locations. - Scene (Release v4.46.0): Specifications for the definition of done per template and package, the screen set agreeing with the manifest, structure and navigation, applicability by level, every screen previewed with no accessibility violation, every standard state forced, the behaviors of the application, and a Chromium audit of every screen and dialog at desktop, tablet and phone widths in the light and dark themes.
- Scene (Release v4.46.0): Docs:
blueprints/inventory-blueprint.md. - Screenplay (Release v4.186.0):
Samples/Crm/crm.play: a sales team’s CRM - leads, contacts, companies, deals with a pipeline and a grouped list, activities and a dashboard - in one file of 18 slices, each with a specification. Every screen fills a template of the blueprint (template blueprint Crm CrmLeadList version "^1.0"), the layout declares the topbar and sidebar with Deals holding the Pipeline and the List, and theui profileactivates the blueprint’s Nordic pack withactive blueprint crm-nordic-smb. It compiles with no error and no warning, also under--check all. - Screenplay (Release v4.186.0): The conformance manifest lists the sample (
crm-sample) with its golden syntax, so the TypeScript and C# compilers are held to the same tree for it. - Screenplay (Release v4.186.0): Docs:
Samples/Crm/README.md, the samples table and the samples rule. - Scene (Release v4.45.0):
dataListimageField: each card shows the row’s picture (initials when it has none), decorative because the title names the row. - Scene (Release v4.45.0):
dataListcolumnkind: progress: a 0-100 value drawn as a progress bar named by its column with the figure in words. - Scene (Release v4.45.0):
dataListtoneField: tints a row by its tone; pairs with a status column so colour is never the only cue. - Scene (Release v4.45.0):
orgTreeurlKey: the chosen node is kept in the address (a refresh restores it). - Scene (Release v4.45.0): Docs:
blueprints/foundation-components.md(Lists of records). - Scene (Release v4.44.0):
@cratis/scene.blueprint.crm, a blueprint package (domaincrm, categoryBusiness / CRM) that depends on the foundation set only through its public templates and components: eighteen screen templates, five dialog templates and eighteen ready-to-use screens. - Scene (Release v4.44.0):
CrmDashboard: open pipeline value, won this month and conversion rate; leads by source and deals by stage as a funnel; deals closing soon; my tasks. - Scene (Release v4.44.0):
CrmLeadList,CrmContactList,CrmCompanyList,CrmActivityList: name, company, owner, status and last contact; filters by owner, status, source and created date; row actions edit, assign, convert (leads) and delete; choosing a contact or company opens its page. - Scene (Release v4.44.0):
CrmDealPipeline(a column for each stage with the stage’s value in its header, a card for each deal) andCrmDealList(the same deals grouped by stage with subtotals). - Scene (Release v4.44.0):
CrmContactPage,CrmCompanyPage,CrmDealPage: key facts, tabs, the record, related lists, activity and next steps. - Scene (Release v4.44.0):
Crm<Entity>CreateFormandCrm<Entity>EditFormfor leads, contacts, companies and deals, andCrmQuickCreate<Entity>dialogs for those and activities. - Scene (Release v4.44.0): Each template carries its
scopes, so a template picker offers it only where it fits and hides the blueprint where nothing applies. - Scene (Release v4.44.0): Navigation of the application: a topbar naming the
crmmodule and the module’s sidebar (Dashboard, Leads, Contacts, Companies, Deals with Pipeline and List, Activities), the application structure, andcrmApplication()that assembles the document. - Scene (Release v4.44.0): Sample-data packs
crm-enterprise-en(en-GB, GBP) andcrm-nordic-smb(nb-NO, NOK) answering the same shapes; the pack’s one-rowCrmSettingsshape gives every figure and date its locale and currency. - Scene (Release v4.44.0): Specifications for the definition of done per template and package, the screen set agreeing with the manifest, structure and navigation, applicability by level, every screen previewed in both packs with no accessibility violation, every standard state forced on the main screens, the behaviors of the application (open a quick-create dialog, choose a row, edit, move a deal between stages), and a Chromium audit of every screen and dialog at desktop, tablet and phone widths in the light and dark themes.
- Scene (Release v4.44.0): Docs:
blueprints/crm-blueprint.md. - Scene (Release v4.43.0):
kanbanBoardcan total a numeric card field in each column header: name the field intotalField(a deal’samount) andformat(currencywith acurrencycode,percent,compactor a plain number); the totals are formatted in the element’slocaleand follow a card as it is moved, by dragging or by its Move-to menu. - Scene (Release v4.43.0): Docs:
blueprints/foundation-components.md(Boards). - Screenplay (Release v4.185.0):
SemanticValidationRules.CheckinCratis.Screenplay.Semanticschecks a value against one rule, against every rule of a concept, or against a type, walking composites and collections. EachSemanticRuleChecksays whether the rule was satisfied, failed or could not be evaluated, and carries the rule, its message and, formatches, the pattern check. It is the same implementation the reference evaluator uses: absent values pass every rule except not-empty, text compares ordinally, numbers compare as exact decimals, and Studio text-rule patterns evaluate as their first-class rule. See Check values against validation rules. (#811) - Screenplay (Release v4.184.0): Concept and command rules
contains "x",not contains "x",starts with "x"andends with "x"on text values. They compare UTF-16 code units ordinally, an absent value passes, and they are written to the executable model in a new ESM version; models that do not use them keep their bytes and version. See Commands. (#810) - Screenplay (Release v4.184.0): Public pattern admission checks
PortableMatchPattern.Check(pattern)in .NET andcheckPortableMatchPattern(pattern)in@cratis/screenplay-compiler. They report whether amatchespattern is admitted, deprecated, refused or invalid, with the diagnostic code, the construct and its offset, a suggestion, and the first-class replacement for a Studio pattern. (#810) - Stage (Release v4.119.0): Concepts with an ESM v21
generate pattern(optionally with a checksum) orgenerate random a..bstrategy now render: generated applications create values with Cratis.FundamentalsGenerateValue.PatternandGenerateValue.Integer, dated patterns take their date from the generation context at run time, and Stage’s executor and Host check pinned specification values against the pattern or range with the same semantics as Screenplay. (part of #414) - Arc (Release v22.107.0): Screenplay generation recovers pattern and signed integer random strategies, checksum validation, and self-contained C# generation rules using
Now,Tenant, andGenerateValuecontext overloads. (#3116) - Arc (Release v22.107.0): Generated-value pins are checked against recovered generation contracts, while executable model version caps retain unsupported validation in source rather than silently dropping it.
- Stage (Release v4.118.0): Concepts with an ESM v21
validate checksumrule (Luhn, Mod11 or Mod97) now render: the generated concept validator checks the checksum with Cratis.Fundamentals, and Stage’s executor and Host evaluate the rule with the same semantics as Screenplay. Pinned specification values that fail the checksum are refused when the model is admitted. (part of #414) - Screenplay (Release v4.182.0): A command can declare a pending
handler implementationintent with orderedhints beside unconditionalproduces. The body owns only the event payload values. Which events, their order, destinations, tags, generated values, the response, authorization and validation stay declarative, and event-property mappings become non-normative hints, so required event properties may be left unmapped. See Commands. (#782) - Screenplay (Release v4.182.0): The executable semantic model version 23 carries a described command’s handler requirement (
handler { requirementId, resultVersion }), and the requirements sidecar reports it as a Pending CommandHandler requirement with its hints and provisional/ambiguous flags. Models without a described command keep their previous version and bytes, and consumers that do not admit version 23 refuse the model rather than dropping the described logic. (#782) - Screenplay (Release v4.182.0): Diagnostics PLAY0695 (a command is described but not implemented), PLAY0696 (a described command has no productions or only a response), PLAY0697 (conditional productions under a pending intent) and PLAY0698 (a pending intent next to another handler, in both compilers). (#782)
- Screenplay (Release v4.182.0): Reference execution reports a specification that reaches a described command’s body as Unsupported (
ImplementationBody), naming the command and its requirement, directly and through reactions. Authorization and validation outcomes are evaluated as before. (#782) - Screenplay (Release v4.182.0): The MCP
handler-intentsandimplementation-requirementsviews report pending requirements with their hints and flags, and whether each described command is admitted. (#782) - Arc (Release v22.106.0): Read protection modes
Off,MeasureandOn, set with[assembly: ReadProtection(...)],[ReadProtection(...)]on a command or the MSBuild property<CratisReadProtection>.ReadProtection:MaximumModelowers the mode at runtime and logs a warning at startup (#3268) - Arc (Release v22.106.0): Under
On, read-model parameters ofHandle()and of aCommandValidator<T>constructor are read fresh from the event log and guard the command’s append. If one changed before the commit, nothing from the command is written and the caller gets a 400 saying which read model changed and to submit again (#3268) - Arc (Release v22.106.0):
[Unprotected("why")]marks a read-model parameter, type or method body as context that does not guard the write (#3268) - Arc (Release v22.106.0):
[LookUpBy(nameof(Command.Property))]names the command property that is the key of a read-model parameter when it is not the event source id (#3268) - Arc (Release v22.106.0): Under
On, reads that cannot be protected are refused with a message that says why and what to do instead, including raw collection reads, filtered or constructor-dependent reducers, immediate appends and shared validator instances (#3268) - Arc (Release v22.106.0):
Measureleaves behaviour unchanged and reports which readsOnwould guard, refuse or find changed, through startup warnings, periodic log summaries and telemetry (#3268) - Arc (Release v22.106.0): Read models declared with
[EventStream<TSource>(stream)]can be plain parameters of a command or validator: Arc reads them from the stream the command’s route points to, so a monthly limit is guarded by that month only (#3306) - Arc (Release v22.106.0): Analyzers ARCCHR0024, ARCCHR0028 and ARCCHR0033 to ARCCHR0038 report reads that cannot be protected, aggregates and reads on the same source, unprotected method bodies, early aggregate commits, unproven exact scopes, read-model streams that are not on the command route and stream guards that widen (#3268) (#3306)
- Arc (Release v22.106.0): A guide to keeping command decisions correct: choosing a mechanism, getting started, adopting with Measure, protected and advisory reads, validators, refusals, how guards are derived, and scenarios from a single entity to per-stream limits and processes (#3268)
- Stage (Release v4.116.0):
ArtifactImplementationGap,ArtifactImplementationStub,ArtifactImplementationContextandArtifactImplementationBodyLocatordescribe a gap, its requirement id, role, hints, and each typed stub with its file, signature, body location and acceptance specifications. (part of #316) - Stage (Release v4.116.0):
ArtifactRenderPlan.ImplementationGaps, forwarded throughCratisPlanResult. A plan with gaps includes them in its digest; a plan without gaps keeps its existing digest. (part of #316) - Stage (Release v4.116.0):
ImplementationGapMode(RefuseorStub) onCratisPlanOptionsandCratisRenderingOptions. It defaults toRefuseand has no effect until a target supports stubs. (part of #316) - Scene (Release v4.42.0): Dialog templates in
@cratis/scene.blueprint.default, categoryFoundation / Dialog:QuickCreateDialog(six fields at most, Cancel and Create),LookupDialog(search and a list, single or multiple selection),SideSheet(a drawer from the inline end hosting a form or record) andFilterDialog(the filter builder; fills the page on a phone).ConfirmDialognow lists the consequences, takes adangertone and names its verb on the confirming button;FormDialogandDetailDialoggain the same frame. - Scene (Release v4.42.0): Auth and state screens fitting the full-page layout, categories
Foundation / AuthandFoundation / State:LoginScreen(logo, form, identity-provider slot, live-region error area, help link),NotFoundScreen,ForbiddenScreen(binds no data, so nothing leaks) andErrorScreen(retry and the support reference id). - Scene (Release v4.42.0): Foundation components:
dialogFrame(heading, message, consequences, close button; gives the host’s dialog element its accessible name, focus on open, a Tab trap, Escape, focus restored on close, placementcenter/side/full, a phone filling the page, RTL mirroring),actionButton(permission rule enabled/disabled/hidden, behaviors, danger emphasis) andnotice(a live-region message); apasswordfield type and asaveAndNewswitch on the form. - Scene (Release v4.42.0): Cancel and Close carry a
CloseDialogaction as data, so the same document closes the dialog in Scene, Stage and the preview. - Scene (Release v4.42.0):
GalleryDialogPreview, stories for each dialog state, sample-data pack shapes for the dialogs and screens, thumbnails for every template. - Scene (Release v4.42.0):
verifyTemplateDefinitionOfDonenow also takes a dialog template. - Scene (Release v4.42.0): Docs:
blueprints/foundation-templates.md(dialogs, auth and state screens, aliases),foundation-components.md,template-set.md,pattern-coverage.md. - Stage (Release v4.115.0): Stage admits ESM v21 models. Concepts that use
generate pattern,generate randomorgenerate ruleare refused withSTAGE-ESM-028, naming the strategy, until Stage renders them. (part of #414) - Stage (Release v4.115.0):
validate checksumrules are refused with the new codeSTAGE-ESM-042until Stage renders them. (part of #414) - Scene (Release v4.41.0): Eight foundation screen templates in
@cratis/scene.blueprint.defaultunderfoundation/templates, categoryFoundation / <type>:WorkspaceScreen(moduleNav,moduleContent),DashboardScreen,ListScreen(header, toolbar, filters, list, bulkBar, footer),BoardScreen,MasterDetailScreen(fits the qualified slotWorkspaceScreen.moduleContent, offers themaster-detail.detailoutlet),RecordPage(tabs, related, activity, aside),FormScreenandWizardScreen. Each fits theAppShellcontentslot (or its container’s qualified slot), so any of them is placed in the shell without per-template shell code; each carries a compact arrangement (list to cards, master/detail to a stack, section rail to tabs), the five standard states through the foundation components, permission rules on action controls, address-reflected filters/sort/page/selection/step, and a keyboard alternative on the board. - Scene (Release v4.41.0): Preview data is the sample-data pack
sampleData/foundation-en.json(templates only declare query bindings), a thumbnail for each inthumbnails/, and the pack and thumbnails ship in the package. - Scene (Release v4.41.0):
verifyTemplateDefinitionOfDonein@cratis/scene.engine: the Part B 6 per-template checklist (metadata, type, category, one-sentence description, thumbnail in the package, every slot arranged and none undeclared, placed by the slot resolver, no inline sample rows, every bound query answered by the pack), with specs and used for each foundation template. - Scene (Release v4.41.0): Gallery screens for the eight templates (breadcrumbs, nesting through the workspace for the qualified slot), the preview host takes a sample-data pack and forced state.
- Scene (Release v4.41.0): Docs:
blueprints/foundation-templates.md,template-set.mdandpattern-coverage.md(Board, Record page and Wizard no longer deferred). - Scene (Release v4.40.0):
dataList: the records of a collection as a table, as cards, or grouped with subtotals, with search, sort, paging, selection (one or many), row actions and a filter (the filter builder’s value). Search, sort, page and selection live in the address under aurlKeyprefix, so a shared link or a refresh restores the list. Sorting cycles ascending, descending, none, and the header says so in words and inaria-sort. A table becomes cards on a phone, with nothing hidden. Real table elements: a screen reader announces row and column. Cells are text, number, currency, date (all locale-formatted) or status (tone + icon + text). - Scene (Release v4.40.0):
tabSet(the ARIA tabs pattern, the active tab in the address, the content of taboverviewis the slotoverview) andsubNavigation(a module’s sections as tabs or a left rail,aria-current, a deep link restores the section). - Scene (Release v4.40.0):
bulkBar: appears only while records are selected, says how many politely, offers bulk actions with permission rules, clears the selection. - Scene (Release v4.40.0):
globalSearch(asearchlandmark; text is the output and can live in the address; Escape clears) andnotificationsButton(the unread count said in words, the badge hidden from assistive technology). - Scene (Release v4.40.0):
kanbanBoard: columns mapped to a status with cards that move by dragging and by each card’s own “Move to” menu (the keyboard and screen-reader path), every move announced, per-column limits that say “Over the limit” in words, collapsible columns, read-only without the move permission; a card whose column is gone is shown in the first column rather than lost. - Scene (Release v4.40.0):
wizardProgress: linear steps, Back/Next/Finish and Save draft; Next is blocked while the step is not valid; the last step is the review; completed steps are revisitable but a step cannot be opened before those ahead are done; the current step (address) and completed steps (session) survive a refresh and a refresh cannot land past a step that was not done. Storage access is guarded, so a sandboxed frame loses only the memory (the Chromium audit caught this). - Scene (Release v4.40.0):
formScreenBody: titled sections in a 1-3 column grid with eleven field types (text, number, currency, date, select, multi-select, lookup, toggle, file, rich text, address), inline validation on blur and a summary on submit that takes focus, server errors mapped onto fields (an error for an unknown field becomes a general one, never lost), required marked by asterisk and word, four modes (create, edit, read-only, settings with a save per section), a sticky action bar, and an unsaved-changes guard (beforeunload+ Discard). It collapses to one column on a phone. - Scene (Release v4.40.0): Shared:
useUrlState(state that lives in the address without - cli (Release v3.66.0):
cratis renderadmits Screenplay ESM v20: validation rules on generated concepts render with both the concept’sNew()factory and its validator. Specifications using such a concept must pin its generated value; a pin that fails the rules is refused withSTAGE-ESM-011, and warning or information rules on generated concepts withSTAGE-ESM-038. ESM v21 is still refused withCLI-RENDER-004. (#372) - cli (Release v3.66.0): When Stage’s default
eventmodelengine refuses a model only for capabilities the semantic engine runs,cratis runwithout--enginerestarts once onsemanticand says so. An explicit--enginenever switches; refusal suggestions give the exactcratis run <path> --engine semanticcommand with your other options. (part of #324) - cli (Release v3.66.0):
cratis runrefusals are grouped by kind into Fix your model, Not supported by this engine yet and Ignored by this engine, with counts and the first three locations;--verboselists every issue, and JSON output keeps every issue plus the groups. (part of #324) - cli (Release v3.66.0):
cratis runshows the compiler notes Stage reports as ignored: a one-line count when the session is ready (listed with--verbose), grouped under Ignored by this engine on a refusal, and as a rawnotesarray in JSON output. - Scene (Release v4.39.0): Manifest (
ScenePackage.blueprint, C#ScenePackage.Blueprint):BlueprintMetadata-domain,description,thumbnail,screenSet(namedBlueprintScreens with template, parent, order and icon, i.e. the navigation) anddefaultSampleData. Sample-data packs stay the existingsampleDatareferences.TemplateMetadata.thumbnailfor each template. There is deliberately no second version on the blueprint: the packageversionis the blueprint’s version. The sharedscene-model-shape.jsonkeeps C# and TypeScript in step. - Scene (Release v4.39.0):
verifyBlueprintPackage(C#BlueprintVerification.Verify), the definition of done: manifest kind and version; domain slug, description (at most 200 characters), thumbnail path and presence in the package; a non-empty screen set with unique names, titles, existing templates, parents in the set, no ancestor cycle and every screen provided; sample data present, references valid and in the package, a declared default when there are several; every template with display name, description, type from the vocabulary, aBusiness / <domain>category and a thumbnail, on top of the provenancedescribeTemplateCatalogalready checks; every screen template placed by the slot resolver (unplaced, ambiguous and self-nested are reported); a dependency on the foundation set. A package with noblueprintblock (a foundation blueprint) is held to the template, placement and sample-data rules only, or to all of them withrequireBlueprintMetadata. - Scene (Release v4.39.0): Version pin semantics:
evaluateBlueprintPin(C#BlueprintVersionPin.Evaluate) decides Current / UpdateAvailable / UpdateBlockedByPin / NotSatisfied / Invalid for a reference’s pinned range against the installed and latest versions;defaultBlueprintPinis the caret range of the installed version.compareVersions/PackageVersionRange.CompareVersionsare new in both engines. - Scene (Release v4.39.0): Gallery data:
describeBlueprintCatalog(C#BlueprintCatalog.Describe) and theBlueprintCatalogFileshape (blueprintCatalog.json): per domain blueprint its description, thumbnail, version, license, dependencies, screen set in navigation order, templates with type, category and thumbnail, and sample-data packs with the default marked. Every domain blueprint ships its entry; the repository rootblueprintCatalog.jsoncollects them. - Scene (Release v4.39.0):
blueprint-verification-fixtures.json, a shared corpus (27 verification cases, 5 catalog cases, 17 pin cases, 8 version comparisons) asserted byEngine.Specs/for_Blueprints(C#) andengine/for_blueprints(TypeScript), plus a specification that fails when a rule has no case. - Scene (Release v4.39.0): Scaffold: `yarn new-
- Scene (Release v4.38.0):
SceneNavigationModel.moduleOf(screen): the host says which module a screen belongs to. Absent, the first segment of the qualified id decides, as before. - Scene (Release v4.37.0):
approvalChainStepper: the steps a request goes through, who decides each and where it stands. The chain applies its own rules, so a request page needs none: a rejection stops the chain and the steps after it read “Not reached”; with no step marked current the first undecided step is the current one; only one step is current. The overall outcome is stated, every step says its state in words as well as by icon and color, the current step carriesaria-current="step", and the list reads vertically on a phone. - Scene (Release v4.37.0):
orgTree: an organization as an expandable tree built from flat rows (id,label,title,parentId) as a query returns them - someone whose manager is missing becomes a root and a reporting cycle is cut instead of looping. It follows the ARIA tree pattern with one tab stop and the full keyboard set, says how many reports each person has in words, and publishes the selected id asvalue. - Scene (Release v4.37.0):
permissionMatrix: roles across, permissions down (optionally grouped), a checkbox where they meet, named “Grant permission to role”; every header is a real header cell. Grants of a role or permission that does not exist are ignored; changes are published asvalue. Without the edit permission each cell says “Allowed” or “Not allowed” in words and by icon. Wide matrices scroll in a keyboard-focusable region with the permission column kept in view. - Scene (Release v4.37.0): Descriptors, categories, stories (every state, light and dark, a rejected chain, a read-only matrix), docs, and specifications for the chain rules, the tree building and the grant handling.
- Scene (Release v4.37.0): CI: the JavaScript build now installs Chromium and runs
yarn workspace @cratis/scene.blueprint.default test:browser, which audits every foundation component in every state at desktop, tablet and phone widths in the light and dark themes with colour contrast and page overflow (Part B 6), so a regression fails the build. - Scene (Release v4.36.0):
checklistSection: sections of tasks with owner and due date, a labelled progress bar per section (“2 of 5 complete” is read, not only seen), “Overdue” said in words for an open task past its due day, ticking publishes the done task ids asvalue; read-only without the edit permission. - Scene (Release v4.36.0):
activityFeed: what happened to a record, grouped under a heading for each calendar day in a chosen time zone (newest first, ororder: ascending), each entry naming its kind in words as well as by icon; times and days formatted for the locale. The application supplies the content; the component only lays it out. - Scene (Release v4.36.0):
avatarStack: overlapping avatars with initials or a picture, a “+N” chip announced as “N more”, the stack labelled “N people”. - Scene (Release v4.36.0):
fileUploader: a drop zone and a labelled button over a real file input (keyboard and screen-reader operable), checked againstaccept,maxSizeMbandmultiplebefore anything is sent, with the reason for each refusal announced. The selection is published asvalue. Sending goes through the host’sFileUploaderHandlerProvider- the same(files, serverUrl) => Promise<void>signature the PrimeReactfileUploaduses, so one host function serves both - with uploading, done and failed (with retry) states in words. - Scene (Release v4.36.0): Descriptors, categories, stories (every state, light and dark), docs, specifications for each model (reading, grouping, overdue, selection checking) and each control, and the Chromium audit on desktop, tablet and phone in both themes.
- Scene (Release v4.35.0):
ApplicationHost.scope(navigation, children): what a host provides around everything that renders - the screen on the page and the dialog over it - inside the navigation providers. - Scene (Release v4.35.0):
ApplicationHost.renderDialogTemplate(template, content, navigation): the host draws a dialog template the document declares, in place of the plain one; called insidescope. - Scene (Release v4.35.0): What a host draws through
renderScreenandrenderDialogTemplateruns as part of the application, so a hook it uses runs under the providersscopeput in place. - Scene (Release v4.33.0):
chartWrapper: line, bar, stacked bar, donut and funnel charts drawn as scalable vector graphics from the theme tokens (no chart library, so it renders in Stage, Scene and Studio alike). The drawing is hidden from assistive technology and followed by a table of the same numbers (“Chart data”); series are told apart by marker shape, dash and hatch as well as color; the chart draws at the width it is shown at, so labels keep their size on a phone. The scale, donut and funnel arithmetic are pure functions with their own specifications. - Scene (Release v4.33.0):
filterBuilder: field/operator/value conditions joined by AND or OR in groups nested three deep, operators by field type. The filter is published as thevalueoutput ({ operator, conditions, groups }); a bound-infilteris read back with conditions on unknown fields dropped and operators repaired. Read-only without the edit permission. - Scene (Release v4.33.0):
columnChooser: show/hide and reorder columns with buttons (no drag-and-drop needed), locked columns, Escape closes and returns focus. Publishes the ordered visible ids asvalue. - Scene (Release v4.33.0):
savedViewsMenu: the ARIA menu pattern (arrows, Home/End, Enter, Escape, focus returns to the button), the chosen view asvalue, and “Save current view” / “Manage views” on theactionoutput, each with its own enabled/disabled/hidden permission rule. - Scene (Release v4.33.0): Descriptors, categories, stories (every state, light and dark, every chart kind), docs in
blueprints/foundation-components.md. - Scene (Release v4.33.0): Chromium audit extended to the new components, including every disclosure open, on desktop, tablet and phone in both themes.
- Scene (Release v4.32.0): Foundation components in
@cratis/scene.blueprint.defaultunderfoundation/:emptyState,statCard,trendChipandstatusChip, registered, categorised (CMP1: Feedback / Data display), described with property descriptors (data properties accept a query result, a data context or a component output - they declare a shape, never values) and iconed. - Scene (Release v4.32.0): The five standard states of Part B 1.4 as one frame,
FoundationFrame: a skeleton while loading (announced,prefers-reduced-motionrespected), an explanation with the primary action when empty, a message with a retry on error, what is missing and none of the data when the user has no permission, and the loaded part with the failed regions named when partial. Astateproperty forces a state for previews; otherwise the state followsloading,error,forbiddenandfailedRegionsand whether the component has data. - Scene (Release v4.32.0): Cross-cutting rules of Part B 1.5 in shared helpers: every text a component says comes from a strings table merged with the element’s
strings(localization), numbers, currency and dates are formatted withIntlfor the element’slocale, direction-sensitive CSS uses logical properties (right to left),densitycomfortable/compact, and every action control takes an enabled/disabled/hidden permission rule (ActionButton; disabled stays visible and says why). - Scene (Release v4.32.0): Theme tokens
status.{success,warning,danger,info}{Color,Background}in both shipped themes, and the foundation section of the stylesheet, built only from theme tokens and one spacing scale. - Scene (Release v4.32.0):
FoundationStatesand Storybook stories showing every state in the light and dark themes (and right to left). - Scene (Release v4.32.0): Specifications: every component in every state audited with axe-core (WCAG 2.2 AA), no data leaked in the no-permission state, state derivation, strings, locale, right to left, permission rules, and a stylesheet scan that fails on a hard-coded color or spacing.
yarn test:browserruns a Chromium audit at desktop, tablet and phone widths in both themes with colour contrast enabled (it found and fixed a contrast failure on the trend comparison). - Scene (Release v4.32.0): Docs:
blueprints/foundation-components.md, status tokens inblueprints/theme-tokens.md. - Screenplay (Release v4.181.0): A model can declare
reaction batches atomic: each trigger occurrence’s directproduces, and each selected refusal branch’sproduces, then append all or none, so a rejected production admits none of the batch’s facts, matching how Chronicle appends a reactor’s returned events; invoked commands stay separate, and earlier batches and commands are kept when a later one fails (#769) - Screenplay (Release v4.181.0): Executable model version 22 carries the declaration as
reactionProductionMode: "atomic"; models without it keep per-fact production and their version, bytes and outcomes (#769) - Screenplay (Release v4.181.0):
PLAY0693reports a duplicate or conflictingreaction batchesdeclaration (#769) - Scene (Release v4.31.0):
ScenePreviewHost({ document, structure, navigation, target, sampleData, registry, invoker, ... }): a module target renders the application shell with the module’s effective navigation and its first feature, a feature target that feature in the shell, a State Change slice target its task dialog over a minimal host page (the feature’s own page when it has one), a State View slice target its data fragment. Navigation keeps to an in-memory history, so a preview never touches the hosting page’s address, and going to another module swaps the effective navigation (effectiveNavigation, not re-implemented). It reportsonBreadcrumbChange(Sales › Orders) and callsonExiton Escape when no dialog is open - the strip itself is the embedding application’s. - Scene (Release v4.31.0): Read-only and never blank (PRV8):
diagnosePreviewjudges the model with the engine’s own validators and returnsPreviewProblementries (code,severity,message,nodeId). Errors (targetNotFound,moduleWithoutFeatures,sliceNotPreviewable,screenMissing,layoutMissing,templateMissing,templateUnplaced) replace the render with a problem list; warnings (structureInvalid,navigationInvalid,toolbarInvalid,sampleDataInvalid,sliceFragmentMissing) are reported and the preview renders.onProblemsandonSelectProblemare the host’s hooks. - Scene (Release v4.31.0): Dry run (PRV5): a submitted dialog validates and sends nothing; a toast says “Command would be sent” with the payload in an expandable detail. A real
invokercan be passed instead. - Scene (Release v4.31.0): Sample data (PRV6):
createPreviewSampleDataasksresolveSampleData- bound pack, the application profile’s active pack, the blueprint’s default pack, generated data - for the queries the document binds and the commands its slices accept;sessionActivePackis the strip’s session-only override of the profile’s choice. The same seed gives the same rows. - Scene (Release v4.31.0): One composition for preview and Stage (PRV9, REN2):
composeApplicationScreen(shell, chrome, the screen inside its template chain with every arrangement applied, name resolution, effective configuration),composeOutletScreen,composeDialog,collectDestinations,previewProfile, andApplicationHost, which runs it - shell, nested outlets, navigation regions, routes and dialogs. A host decides only what is its own throughCompositionOptionsandrenderScreen. The template wrapper (Scene:template) and the flow arrangement view Stage kept to itself now live here, so Stage can delete its copies. - Scene (Release v4.31.0):
SliceCommandField.initialValue: a task dialog’s field can start with a value - a preview fills it from the active sample data pack. - Scene (Release v4.31.0): Docs: `Documentation/blueprints/previ
- Stage (Release v4.113.0):
GET /stage/statusreturns an optionalnoteslist with the compiler’s information and warning diagnostics (code, message, source and severity), so clients can show what the engine ignored without treating it as a failure. (#430) - Chronicle (Release v19.71.0): Declare a source-keyed, implicitly passive read model with
[EventStream<TSource>(stream)], read its stream instance throughIReadModels, and protect decisions within the declared route. (#4932) - Chronicle (Release v19.71.0): CHR0064 identifies invalid stream declarations and attribute misuse, with a monthly-withdrawal guide showing guarded decisions and plain queries. (#4932)
- Arc (Release v22.102.0): The Screenplay generator now recovers per-production
forandstreamroutes for commands that returnEventForEventSourceIdwrappers, as single results, collections, tuples, or mixed with plain events, so each production keeps its own event source and stream in the generated model instead of the command’s default route. Wrappers whose destination cannot be proven (for example copies made withwith) are withheld and keep reporting SP0051 or SP0054. See Generating a Screenplay. (#3299) - Stage (Release v4.111.0): Stage converts Screenplay’s
sample datapacks and aui profile’ssample dataselection to Scene’s sample data model. A pack becomes aSampleDataPackowned by the user, with a lower-case hyphenated id derived from its name (NordicDemobecomesnordic-demo), its title, locale and rows with the authored literals; the profile’s active pack, shape mappings and read model bindings are carried as the profile’sSampleDataSelection.active blueprint <id>keeps the blueprint’s id as written and is resolved by the build. Sample data is design and preview time only and never reaches a production build. (#406) - Stage (Release v4.111.0): The render plan reports Scene’s own sample data validation as
SampleDataInvalidfindings, for example two pack names that derive the same id or an invalid locale. See the render plan findings. - Stage (Release v4.111.0): The Billing sample declares a pack and selects it once in the desktop profile.
- Stage (Release v4.110.0): Stage converts a Screenplay application’s
navigation topbar|sidebarregions to Scene’s navigation model: the application’s regions and logo from the layout, and each module’sinherits/extends/overridesregion, with item targets, slots, icons and sub-items. A document without regions serializes exactly as before. (part of #406) - Stage (Release v4.110.0): Toolbar
buttons become toolbar items that carry the slice, emphasis and icon the Scene engine reads, with the slice written as its qualified id. - Stage (Release v4.110.0): Template assignments, own and blueprint with their version range, are carried as Scene template references, and the slice kinds of a
scopes slicetemplate travel in its metadata. - Stage (Release v4.110.0): The render plan reports Scene’s own structure, navigation and toolbar validation as findings -
StructureInvalid,NavigationInvalidandToolbarButtonInvalid- for example a navigation target that does not exist, or a toolbar button that names a State View slice. See the render plan findings. - AI (Release v7.57.0): Guidance for decision reads:
Chronicle.decide/2,DecisionReads.get/2,get_detached/2andadmit/2, theDecisionConflictretry, and which read model shapes cannot be guarded. - AI (Release v7.57.0): Guidance for
ConcurrencyScopebuilders,at_tail/2,expecting_no_matching_event/1and theconcurrency: [default: :optimistic]client option. - AI (Release v7.57.0): Guidance for
Chronicle.Testing(Case, assertions,wait_for_observers/1,Integration.setup_isolated_client/2) and what the in-memory kernel does not model. - AI (Release v7.57.0): Guidance for captures, standalone constraint modules,
remove_constraint/2andConstraintViolation.details/1. - AI (Release v7.57.0): Guidance for the discovery report,
:drift_policy, id pinning,mix chronicle.discover,generation_for:,strict_validationand pinned generation delivery. - AI (Release v7.57.0): Guidance for
childrencollections (one-line form,removed_with_join/2,clear_with/2, unique nested ids), read modelsubscribe/2andobserve_stream/2,Chronicle.Projectionsquery/2,preview/2andwait_for/3,Chronicle.Patterns, prepared events, and OpenTelemetry and:telemetryevents. - AI (Release v7.57.0): An evaluation task for decision reads and a trigger query for in-memory testing.
- Fundamentals (Release v7.25.0):
GenerateValue.Pattern(pattern, checksum)andGenerateValue.Pattern(pattern, context, checksum)generate a value from a pattern such asORD-[A-HJ-NP-Z2-9]{4}-#{4,6}orINV-{yyyy}-#{7}. Every distinct value the pattern allows is equally likely, date segments come fromcontext.Nowin UTC, and an optionalChecksum(Luhn,Mod11,Mod97) appends check digits;Mod11never produces the excluded check value 10. See Patterns. (part of #1176) - Fundamentals (Release v7.25.0):
GenerateValue.Integer(minimum, maximum)draws an unbiased number from an inclusivelongrange, including the fulllongrange. (part of #1176) - Fundamentals (Release v7.25.0):
GenerateValue.HasValidChecksum(value, checksum)checks that a value ends with the correct Luhn, mod 11 or ISO 7064 MOD 97-10 check digits. (part of #1176) - AI (Release v7.56.3): The Arc command skill teaches
ICommandExceptionMapperfor turning an integration’s exceptions into aCommandResult, including declining, rollback and correlation behavior. (#710) - Screenplay (Release v4.180.0): Top-level
sample data <Name>block: optionaltitle, optional BCP 47locale, andshape <ReadModel>blocks ofrowblocks with<field> = <literal>lines (string, number,true,false,null). Design and preview time only: binding reports it as deferred (PLAY0269), it adds nothing to the executable model or ESM output and is never part of a production build. - Screenplay (Release v4.180.0): The
ui profilegains an optionalsample datablock:active <Pack>oractive blueprint <id>, the rareshape <Shape> maps to <ReadModel>andbind <ReadModel> to <Pack>. The active pack is chosen once, there, for the whole application; there is no per-screen, per-slice or per-component selector (decision 0081, which supersedes the spec’s per-screen placement). - Screenplay (Release v4.180.0): Diagnostics
PLAY0702-PLAY0715: invalid or duplicate pack, repeated title, locale, shape, field or selection line, a shape naming no read model (warning), a field that is not a property of the read model, a literal that does not fit the property type, an active, mapped or bound pack or read model the document does not declare. - Screenplay (Release v4.180.0): The canonical printer, the syntax walker and index, the folder merge, the typed JSON schema, the contract catalogue (
sampleconstruct, admission probe), the MCPread-ast/propose-asttyped nodes (SampleDataPackSyntax,SampleDataSelectionSyntax,SampleDataSetSyntax,SampleDataRowSyntax,SampleDataFieldSyntax, …) and the canonical screen composition corpus all carry sample data. - Screenplay (Release v4.180.0): Monaco (highlighting, hover, completion in the root, the pack, its shapes and the profile block) and the VS Code grammar and spelling dictionary know the new words; the TypeScript compiler skips the block whole.
- Screenplay (Release v4.180.0): Documentation page
sample-data.md(grammar,ui-profile.md,diagnostics.md), the Invoicing sample and decision 0081. - Screenplay (Release v4.179.0): Toolbar buttons that invoke State Change slices. A screen
toolbaracceptsbutton <id> title "<text>" [slice <Module>.<Feature>.<Slice>] [emphasis primary|secondary|quiet] [icon <name>]beside itsitementries - the Screenplay form of Scene’sToolbarButton. The slice names the command and the dialog that opens over the page, so the button needs no command of its own.sliceis a dotted path or any unambiguous suffix; the title is a quoted string or a$strings.<key>token. See Toolbar buttons. - Screenplay (Release v4.179.0): Diagnostics
PLAY0760-PLAY0765: a malformed button line, a slice the document does not declare, a slice that is not a State Change slice (a button invokes State Change slices only), a button without a slice (warning), an ambiguous slice reference, and a duplicate id. They mirror Scene’stoolbarButtonSliceNotFound,toolbarButtonSliceNotStateChangeandtoolbarButtonSliceEmpty. - Screenplay (Release v4.179.0): The syntax tree carries
ToolbarButtonSyntaxonScreenToolbarSyntax.Buttons; it is omitted from the JSON when empty, so existing documents keep their bytes. The printer round-trips every button, and the TypeScript compiler reads buttons into the same tree with a shared conformance vector (toolbar-buttons). - Screenplay (Release v4.179.0): Monaco and VS Code highlight, document and complete buttons; the Invoicing sample uses them.
- Chronicle.Go (Release v0.11.0):
reactors.StartAtTail()option. The first time Chronicle sees the reactor, it begins at the tail of the event sequence and observes only what is appended afterwards. A reactor that already has a position keeps it, and an explicit replay still replays from the beginning. See https://github.com/Cratis/Chronicle.Go/blob/main/Documentation/reactors.md#skipping-history-on-first-registration. (part of Cratis/Direct#1875) - Chronicle.Go (Release v0.11.0): Generated contracts for the new Chronicle
occurrencesservice. - Chronicle.Kotlin (Release v6.15.0):
@StartAtTailannotation for reactor classes. The first time Chronicle sees the reactor, it begins at the tail of the event sequence and observes only what is appended afterwards. A reactor that already has a position keeps it. See https://github.com/Cratis/Chronicle.Kotlin/blob/main/Documentation/reference/annotations.md#startattail. (part of Cratis/Direct#1875) - Chronicle.TypeScript (Release v6.53.0):
@startAtTail()class decorator for reactors. The first time Chronicle sees the reactor, it begins at the tail of the event sequence and observes only what is appended afterwards. A reactor that already has a position keeps it. See https://github.com/Cratis/Chronicle.TypeScript/blob/main/Documentation/reactors.md#start-at-the-tail. (part of Cratis/Direct#1875) - Chronicle.Elixir (Release v3.14.0):
start_at_tail: trueoption onuse Chronicle.Reactors.Reactor. The first time Chronicle sees the reactor, it begins at the tail of the event sequence and observes only what is appended afterwards. A reactor that already has a position keeps it. See https://github.com/Cratis/Chronicle.Elixir/blob/main/Documentation/reactors.md#starting-at-the-tail. (part of Cratis/Direct#1875) - Screenplay (Release v4.178.0): Navigation regions in the language. A
layoutdeclares the application’snavigation topbarandnavigation sidebarwith an optionallogo image "<path>" title "<text>"anditem <id> title "<text>" [icon <name>] [target <Module>[.<Feature>]] [slot <name>]lines; sidebar items nest sub-items. Amoduledeclares only what it changes:navigation sidebar extends,navigation topbar overrides, orinherits(the default when absent). The blocks are the Screenplay form of Scene’sNavigationModel;contribute to Navigationstays valid and independent. See the new Navigation regions page. - Screenplay (Release v4.178.0): Diagnostics
PLAY0740-PLAY0752for malformed blocks and items, duplicate regions, application-only logos, modes where they are not allowed, topbar sub-items, and the findings that mirror Scene’snavDuplicateId,navTargetMissing,navSlotUnknown,navTargetOutOfScopeandnavModuleWithoutFeatures, plus a warning for an override without items. - Screenplay (Release v4.178.0): The syntax tree carries
NavigationRegionSyntax,NavigationItemSyntax,NavigationTargetSyntaxandNavigationLogoSyntaxonLayoutSyntax.NavigationandModuleSyntax.Navigation. They are omitted from the JSON when empty, so existing documents keep their bytes. The printer round-trips every item, id, icon, slot, target and mode; the executable model reports the blocks as deferred (PLAY0269). - Screenplay (Release v4.178.0): Monaco and VS Code highlight, document and complete the new words and blocks; the Invoicing sample uses them.
- Screenplay (Release v4.177.0):
template blueprint <Blueprint> <Name> [version "<range>"]references a template a blueprint package ships, beside the owntemplate <Name>. It is valid wherevertemplateis: as a module, feature or slice assignment and inside a screen. The optionalversionis the semver range of the blueprint the author accepts - Scene’s subset (*, an exact version,^,~,>=,>,<=,<), the same one Scene’sTemplateReference.versionandresolveTemplateReferenceuse.PLAY0721reports a range Scene cannot read;PLAY0722reports a blueprint noui profilelists underpackages(checked only when a profile declares packages). Version drift and unknown blueprint templates are reported where the blueprint is installed (SceneTemplateReferenceResolver), because the compiler cannot see a package’s catalog. - Screenplay (Release v4.177.0):
scopes slice statechange,scopes slice stateviewandscopes slice statechange|stateviewnarrow a slice-scoped template to slice kinds - Scene’sTemplateMetadata.sliceKinds. Using a restricted template on an excluded slice kind, or on an automation or translate slice (which present nothing), isPLAY0631. The conformance vectorwhen_checking_template_applicability_against_the_scene_vectorsrestates the cases of Scene’s sharedtemplate-applicability-fixtures.json(ApplicableTemplates) as Screenplay source. - Screenplay (Release v4.177.0):
PLAY0720(warning): alayout,screen templateordialog templatewithout acategory. A blueprint package build treats warnings as errors, so there it fails; an own template only warns. (#761) - Screenplay (Release v4.177.0): The new members round-trip through the C# and TypeScript compilers, the printer (including comments on
category), the syntax schema and the MCP contract; keywords, hover documentation and diagnostics reach Monaco and the VS Code grammar; the TypeScript compiler and C# are held to the sametemplate-referencesconformance vector. (#761) - Chronicle (Release v19.70.0):
[StartAtTail]attribute for .NET reactors. The first time Chronicle sees the reactor, it begins at the tail of the event sequence and observes only what is appended afterwards. A reactor that already has a position keeps it, so the attribute is safe to leave in place. See https://github.com/Cratis/Chronicle/blob/main/Documentation/reactors/start-at-tail.mdx. (part of Cratis/Direct#1875) - Chronicle (Release v19.70.0): Optional
StartAtTailfield on the reactor definition in the gRPC contract. Clients that do not send it behave as before. - Stage (Release v4.109.0): Stage admits ESM v20 models: a concept that declares
generatemay carry validation rules, and the rendered concept has both itsNew()factory and itsConceptValidator. ESM v21 is still refused. (#393) - Stage (Release v4.109.0): A rendered specification that uses a rule-bearing generated concept must pin its generated value, and a pinned value that fails the concept’s rules is refused with
STAGE-ESM-011. (#393) - Stage (Release v4.109.0): A generated concept rule with warning or information severity is refused with
STAGE-ESM-038, because the rendered application only rejects error-severity failures. (#393) - Scene (Release v4.30.0):
SliceInvoker(invoke(sliceId, payload, command)returning anInvocationResultwithsucceeded,validationErrors,message,payload,dryRun),SliceInvokerProvideranduseSliceInvoker. Without a provider the command is announced ascratis.scene.command, as a toolbar action always was (createAnnouncingInvoker). - Scene (Release v4.30.0):
createDryRunInvoker({ onInvoked, validate }): validates, sends nothing and returns a result carrying the would-be payload, for the Studio preview’s toast (PRV5). - Scene (Release v4.30.0):
SliceDialogViewand thecore:sliceDialogcomponent: a modal card with the button title, the subtitleState Change · <Slice>, a labelled field per command property,Canceland a submit button labelled with the title. The first field takes focus, Tab stays inside, Escape cancels and focus returns to the button. Required fields are checked before invoking, and the validation errors an invoker reports are shown against their fields (aria-invalid,aria-describedby) or for the whole form. Success closes the dialog and signals the result. - Scene (Release v4.30.0):
SliceCommandFieldsProvider: the host tells the dialog a command’s fields, so@cratis/scene.reactstays free of Arc and transport imports. - Scene (Release v4.30.0):
core:toolbarItemresolves its slice against the navigation model, opens the dialogsliceDialogForpicked through the navigation host (sliceDialogDestination; an authoreddialogstemplate wins over the built-in dialog), carries itsemphasisasdata-scene-emphasisandscene-toolbar-button-<emphasis>, and shows a warning badge for a button without a slice only when the host asks (SliceInvokerProvider warnEmptySlices, implied by a dry-run invoker). Without a navigation model it announces the command as before. - Scene (Release v4.30.0):
SceneNavigationHostcarries the dialog’s parameters (currentDialogParameters) and names the dialog after its title. - Scene (Release v4.30.0):
blueprint.defaultstyles the primary, secondary and quiet buttons, the warning badge and the dialog over its scrim, and has a Storybook story. - Scene (Release v4.30.0): Docs: “Running a slice button: the task dialog and the
sliceInvoker” inblueprints/application-hierarchy.md. - Scene (Release v4.29.0):
NavigationRegionViewin@cratis/scene.react, driven byeffectiveNavigation(...)for the module of the screen on the page, so a module swap recomputes the items in place without remounting thenav. A sidebar nests, collapses and expands the parents of the active item (expand='all'shows everything); a topbar is flat. - Scene (Release v4.29.0): Active state follows the navigation host: an item is active (
aria-current,data-active) when the screen it opens is shown in the slot it renders into, so items rendering into different slots are active at once. - Scene (Release v4.29.0): Render-into-slot: activating an item calls
navigatewithnavigationItemDestination(item)(module/feature identity, screen, slot asoutlet).navigationDestinations(...)lists every destination so deep links resolve. - Scene (Release v4.29.0):
SceneNavigationHosttakesnavigationModel(structure, navigation,screenFor,isVisible) and aframethat wraps the primary outlet in chrome that stays mounted across navigation;SceneNavigationModelProviderdoes the same without a host. - Scene (Release v4.29.0): Hooks for the layers around it:
isVisible(item)hides items (never disables), items carrydata-origin/data-read-only, andrenderAdornment(item)lets Studio draw the lock of an inherited item. No design chrome is rendered. - Scene (Release v4.29.0): Keyboard: roving tab stop, arrows (left/right in a topbar, up/down in a sidebar), Home/End, and right/left to expand/collapse a sidebar parent.
- Scene (Release v4.29.0):
blueprint.defaultTopbarandSidebarshow the region as the shell menu (thelayout-menuclasses, with the active underline and pill of the specification) when a navigation model is in scope and the element has nomenu/contentslot of its own;regionNavigation: falseopts out. A Storybook story shows the hierarchical sidebar and two slots. - Scene (Release v4.29.0): Docs: “Rendering the regions” in
blueprints/navigation-regions.md. - Screenplay (Release v4.176.0): Warning PLAY0694 when a Translate slice without
directionhas a reaction (without afromroute) to an event that a capture in the same slice appends, including appends in capture children and nested scopes. The message names the events and tells you to keep the capture in the Translate slice and move the reaction to an Automation slice; there is no automatic repair. Ordinary compilation is unaffected, but builds that treat warnings as errors (for example--warnaserror) fail on such models until the slice is split. Both compilers and the editors report it. See decision 0079 and PLAY0694. (#760) - Chronicle (Release v19.69.0): Kernel occurrence queue: triggers register with a JSON payload schema,
RecordOccurrencestores each occurrence once per idempotency id (Recorded,AlreadyRecorded,OccurrenceIdConflict,OccurrencePayloadInvalid), and workers claim, renew, complete and fail occurrences under leases fenced by an epoch. A superseded worker getsOccurrenceLeaseLost; a repeated completion getsAlreadyCompleted. (part of #4911) - Chronicle (Release v19.69.0): Failed occurrences back off and are quarantined after the configured maximum attempts without blocking later occurrences;
RetryQuarantinedOccurrencere-arms one and records the authenticated principal. Retry settings live in the newOccurrencesconfiguration section, documented at https://github.com/Cratis/Chronicle/blob/main/Documentation/configuration/chronicle-options.mdx. (part of #4911) - Chronicle (Release v19.69.0): A disconnected client’s leases expire, and occurrence queues resume after a kernel restart.
GetOccurrenceandObserveOccurrencesreport state, attempts, lease, last error, next attempt and the receipts written for an occurrence, with their namespace. (part of #4911) - Chronicle (Release v19.69.0): Effect receipts: every append command (
Append,AppendMany,AppendManyForEventSourcesand their named-tag variants) accepts an optional effect receipt that is written in the same storage transaction as the events. A repeated effect returnsEffectAlreadyRecordedwith the stored outcome and response and appends nothing. A zero-event append with concurrency scopes records aNoEventsreceipt only when the scopes hold.RecordEffectReceiptrecords aNoEventsorRefusedoutcome on its own, andGetEffectReceiptreads one back. An unknown commit result is settled by lookup, or fails retryably withEffectReceiptUnsettled. See https://github.com/Cratis/Chronicle/blob/main/Documentation/concepts/effect-receipts.md. (part of #4911) - Chronicle (Release v19.69.0): The kernel advertises the
occurrencesandeffect-receiptscapabilities, and the newOccurrencesgRPC service is part of the generated Kotlin, TypeScript and Elixir contracts. (part of #4911) - Scene (Release v4.28.0):
ToolbarButton(id,title,slice,emphasis,icon,target),ToolbarandToolbarEmphasis(primary,secondary,quiet) inCratis.Scene.Model.Toolbarand@cratis/scene.model, mirrored inscene-model-shape.json. A spec button is acore:toolbarItemwithkind: Actionplussliceandemphasis. - Scene (Release v4.28.0):
validateToolbarButtons/ToolbarButtonValidation.ValidatewithtoolbarButtonSliceNotFoundandtoolbarButtonSliceNotStateChange(errors) andtoolbarButtonSliceEmpty(warning for a button without a slice). - Scene (Release v4.28.0):
sliceDialogFor/SliceDialogs.ForandresolveToolbarButton/ToolbarButtons.Resolve: a slice-backed button resolves to its command and task dialog - the slice’s owndialogTemplate, else the defaultFormDialog- so the dialog is decided once, in Scene. - Scene (Release v4.28.0):
toolbarButtonFromItem/ToolbarButtons.FromItemread a button from acore:toolbarItem’s properties, andnormalizeToolbarButtonconverts a hand-authoredkind: Action+targetcommand to the one state change slice that accepts it. A command no single slice accepts stays a legacy button and still validates. - Scene (Release v4.28.0):
SliceNode.commandandSliceNode.dialogTemplate, andApplicationStructureIndex.findSlicesByCommand. - Scene (Release v4.28.0): The
core:toolbarItemdescriptor: title,slice(editorslice, kindsStateChange),emphasis(enum chips),iconand the legacytarget. - Scene (Release v4.28.0):
toolbar-slice-fixtures.json(state change ok, state view and automation rejected, missing slice, empty slice warning, dialog template resolution, conversion from atargetcommand, reading buttons from items) asserted by bothEngine.Specs/for_ToolbarButtonValidationandengine/for_validateToolbarButtons. - Scene (Release v4.28.0): The toolbar section of
blueprints/application-hierarchy.mddocuments the button, validation, resolution and compatibility. - Screenplay (Release v4.174.0):
RuleConsistency.Check(SemanticConcept concept, int? utcAssessmentYear = null)returns the compiler’s proof status for each validation rule of a generated concept, in rule order, from a deserialized executable model. A renderer can let a concept whose rules are all Proven use unpinned generation and keep requiring pinned fixtures only for Unproven rules. The status is deliberately not serialized: it is derived from the concept and the UTC assessment year. See proof status for renderers. (#775) - Scene (Release v4.27.0):
NavigationModel,ApplicationNavigation,ModuleNavigation,NavigationRegion(topbar/sidebar,inherit/extend/override),NavItem(id,title,icon,target,slot,children) andApplicationLogoinCratis.Scene.Model.Navigationand@cratis/scene.model, mirrored inscene-model-shape.json. - Scene (Release v4.27.0):
effectiveNavigation/EffectiveNavigation.Resolve: the ordered items of a region for the application or a module, each withorigin(application | module),readOnly, areasonand its target resolved against the application structure (a module target goes to the module’s first feature), plus the region’s effectivemodeandsourcestag (defined here,inherited,Application + Sales,Sales only). Sub-items are sidebar-only. - Scene (Release v4.27.0): Edit helpers
switchRegionMode(inherit clears the module items; inherit → override withcopycopies the application items first),addNavItem(adding to an inheriting region switches it to extend first; sub-items under a parent) andsetApplicationLogo(refused for a module), withapplyNavigationEdits. - Scene (Release v4.27.0):
diagnoseNavigationRegionsand the new diagnostic codesnavTargetMissing,navSlotUnknown,navDuplicateId,navModuleWithoutFeaturesandnavTargetOutOfScope;diagnoseNavigationruns them when its graph carriesstructureandnavigation. - Scene (Release v4.27.0): The
replacecollection operation andInstanceContribution.replaceOwnerItems: an instance can hide the items it inherits so only its own remain. It is howoverrideis expressed in the exposure model. Withoutreplaceexposed the contribution is ignored and reported, and the server check refuses a document that sets it. - Scene (Release v4.27.0): Shared fixtures
navigation-inheritance-fixtures.jsonandnavigation-targets-fixtures.json, the new codes innavigation-diagnostic-fixtures.jsonand two server cases indocument-change-fixtures.json, asserted by both the C# and the TypeScript engines. - Scene (Release v4.27.0): The documentation page
blueprints/navigation-regions.md; the exposure and navigation diagnostics pages are extended. - Scene (Release v4.26.0): Sample-data model in C# and TypeScript (and
scene-model-shape.json):SampleDataPack,SampleShape,SampleShapeField,SampleFieldKind,SampleDataSelectionandScenePackage.sampleData(a Blueprint package ships its packs assampleData/*.json). - Scene (Release v4.26.0):
UiProfile.sampleDataselects the active pack once for the whole application (own or from a blueprint), plus the rare shape-to-read-model mappings and per-read-model bindings. There is no per-screen, slice or component selector; the preview strip’s choice is the session-onlysessionActivePackof the resolve context. - Scene (Release v4.26.0):
resolveSampleData/SampleDataResolver.Resolveimplement the resolution order bound pack, UI profile active pack (or session override), blueprint default pack, generated data; nothing resolves unlessisDesignOrPreviewis true, so a Stage production build gets no sample data. - Scene (Release v4.26.0):
generateSample/SampleDataGenerator.Generate: a seeded xoshiro128** generator typed by field kind (ids, names, companies, emails, phones, cities, text, numbers, amounts, booleans, dates, enums), honouring nullability,min/maxand pack locale (en-GB,en-US,nb-NO,sv-SE,de-DE), byte-identical in both engines for a seed. - Scene (Release v4.26.0):
validateSampleDataPack,validateSampleDataSelection,validateSampleDataPackagesanddescribeSampleDataCatalog(C#:SampleDataValidation,SampleDataCatalogs) check what blueprint packages ship and build the selector content (generated, own, then each blueprint’s group). - Scene (Release v4.26.0):
findDescriptorSampleRowLiterals/findTemplateSampleRowLiteralsdetect row literals in component descriptors and templates;verify-package-contents.jsfails when sample data is packed outsidesampleData/. - Scene (Release v4.26.0):
sample-data-resolution-fixtures.json, asserted independently byEngine.Specs/for_SampleDataandengine/for_sampleData, and the documentation pageblueprints/sample-data.md. - Scene (Release v4.25.0):
ApplicableTemplates.Compute/applicableTemplates(library, target): own templates by category, then only the blueprints that have at least one applicable template (TPL2). A target is a scope, an optional slice kind, the container whose slots the template must fit, and the chain of templates already chosen above (no loops, TPL6). It composesTemplateApplicabilityandScreenTemplateResolverwith the per-level defaults of spec 4.2; explicitscopes/sliceKindsoverride and category never implies a scope.ApplicableTemplates.Validate/validate*ForTargetgive the reason a template does not apply. - Scene (Release v4.25.0):
TemplateReference(sourceOwn | Blueprint,id,blueprint,versionsemver range, default^<installed>) andTemplateReferenceResolver.Resolve/resolveTemplateReferencewithResolved,Malformed,UnknownBlueprint,VersionNotSatisfied(drift) andUnknownTemplate. - Scene (Release v4.25.0):
TemplateMetadata.sliceKinds(reusingSliceKindfrom the application structure) narrows which slice kinds a template applies to. - Scene (Release v4.25.0): Catalog entries carry
warnings. - Scene (Release v4.24.0):
ComponentDescriptorgainscategory,icon(anIconReference),badge,keywordsanddesignMode.ComponentCategoryholds the eight categories of the spec (Navigation, Data display, Input, Actions, Layout, Feedback, Overlay, Forms); a package may add its own. - Scene (Release v4.24.0):
ComponentDesignModeDescriptordeclares, as data, where a component’s items are (itemsPath, aCollectionproperty), the “add” affordances and the floating item toolbar.availabilityandreadOnlyReasonare rule names, never functions; every edit is an ordinary collection edit, so undo/redo and the dirty state need nothing of their own.navigationDesignMode()andtoolbarDesignMode()build the actions of spec DM3. - Scene (Release v4.24.0): The property-editor vocabulary (
PropertyEditorKind:text,number,boolean,enum,select,color,icon,list,reference,navigationTarget,renderingSlot,slice,inheritanceMode,template,sampleData,field,columnList, plus the structured kinds that already existed) andPropertyDescriptor.editorOptions(multiline,placeholder,unit,step,kinds,referencefilter,fieldKinds,tokensOnly). - Scene (Release v4.24.0): Engine rules shared by every host:
validateComponentDescriptors(componentCategoryMissingerror,componentCategoryUnknownwarning,componentDesignModeInvalid,propertyEditorOptionsInvalid),matchComponentQuery(the picker filter: name/keyword substring, category by word start, highlight ranges, keyword hint),rankFrequentlyUsedComponents(top 6, count then recency) andcomponentBadge. All are asserted against the shared corpuscomponent-metadata-fixtures.json. - Scene (Release v4.24.0): Every component of the core, Cratis.Components, PrimeReact and both blueprint packages (164 components) now has a descriptor with category, icon, keywords and display name; Topbar, Sidebar, Toolbar and the navigation bar declare a design mode.
validateComponentMetadata(bundle)checks a bundle (CMP1) and is run by a specification in each package and by a repository-level specification (registry.conformance) that enumerates all package registries. - Scene (Release v4.24.0): The third-party fixture
Acme.Inspectionsdeclares a category, icon, keywords and design mode using only public packages; documentation inDocumentation/editing/descriptors.mdanddesign-time-extensions.md. - Scene (Release v4.23.0):
ApplicationStructure,ModuleNode,FeatureNode,SliceNodeandSliceKind(StateChange,StateView,Automation) inCratis.Scene.Model.Structureand@cratis/scene.model, mirrored inscene-model-shape.json. The structure is a reference input supplied by the host (Stage’s converter, Studio); it is not persisted in a scene document. - Scene (Release v4.23.0):
ApplicationStructureIndexinCratis.Scene.Engine.Structureandengine/structure:findModule,findFeature,firstFeature/firstFeatureId,findSlice,kindOf,findFeaturesByNameand the diagnosticsstructureDuplicateIdandstructureAmbiguousName. Pure, no DOM. - Scene (Release v4.23.0):
application-structure-fixtures.json(qualified lookup, nested features, first feature, module without features, unknown/wrongly typed ids, same-named features in different modules, duplicate ids, ambiguous names) asserted by bothEngine.Specs/for_ApplicationStructureIndexandengine/for_applicationStructureIndex. - Scene (Release v4.23.0): The documentation page
blueprints/application-structure.mdexplains the input and who supplies it. - Stage (Release v4.107.0): The scaffold emits a
<Project>.Specsproject next to the web project. It compiles the generated slice specifications in place, so slice files keep their paths, and runs them withdotnet test. (part of #401) - Stage (Release v4.107.0): The scaffold enables central package management:
Directory.Packages.propspins every package version and the projects reference packages without versions. (part of #401) - Stage (Release v4.107.0): The scaffold’s
Directory.Build.propssets nullable reference types, the latest C# version, warnings as errors and code-style enforcement for every project, and an.editorconfigthat allows specification-style names in specifications. NuGet’s machine-dependent restore warnings (NU1507,NU1900–NU1904) stay warnings. (part of #401) - Stage (Release v4.107.0): The scaffold adds a
README.mdwith run instructions for Chronicle, the backend, the frontend and the specifications. (part of #401) - Chronicle (Release v19.68.0): Read protection for units of work: an enforcing unit owned by one invocation, protected decision reads that enrol before they return (
IDecisionReads.GetFor), guards on every public read and append entry point, owner-only completion, read allowances for advisory reads, and the append conditions a commit sends (GetAppendConditions) (#4888) - Chronicle (Release v19.68.0): Protected decision reads of reducers and self-reducing read models, folding with the handler’s declared event generation; filtered reducers and reducers with constructor dependencies are refused (#4888)
- Chronicle (Release v19.68.0):
CHR0062reports an event source definition or stream whose concurrency leaves outEventSourceId, with a code fix (#4888) - Chronicle (Release v19.68.0):
CHR0063reports an explicit concurrency scope for one stream passed to an append routed to another stream of the same event source (#4899) - Chronicle (Release v19.68.0): A documentation page on read protection, and decision read documentation for reducers, pinned delivery and detached reads under read protection (#4888)
- Arc (Release v22.101.0): The Screenplay generator recovers a generated concept’s validator rules together with its built-in generation strategy, using Screenplay ESM v20. Generated values, identities, responses, mappings and pins are no longer withheld just because the concept has a
ConceptValidator. - Arc (Release v22.101.0): Rules the compiler proves against the strategy are emitted.
- Arc (Release v22.101.0): Rules it cannot decide are kept and reported as
SP0078. - Arc (Release v22.101.0): A refuted rule withholds that concept’s generation and is reported as
SP0073with a counterexample. - Arc (Release v22.101.0): Below an ESM v20 version cap, the generation is withheld but the rules are kept.
- Screenplay (Release v4.172.0): Concepts can generate values from a
patternwith digits, letters, ASCII classes, bounded repeats and UTC date segments ({yyyy},{yy},{MM},{dd}), optionally followed by achecksum luhn,mod11ormod97check digit; generation draws uniformly from the exact set of values the pattern and checksum can produce, and a pattern whose set is empty for any date in the next hundred years, or too large to count, is a binding error (PLAY0692,PLAY0691) (part of #616) - Screenplay (Release v4.172.0): Int concepts can generate a
random <min>..<max>value, andgenerate rule Namenames a value generator implemented in code, which receives the current time and tenant (part of #616) - Screenplay (Release v4.172.0):
validate checksum luhn|mod11|mod97checks a String concept’s check digits, and is proven to hold for values the matchingchecksumstrategy generates (part of #616) - Screenplay (Release v4.172.0): Rules on concepts with these strategies are proven like the other strategies’ rules, including length and
min/maxagainstrandom, and specification fixtures are checked against the pattern, its date segments (usinggiven clock) and the checksum (part of #616) - Screenplay (Release v4.172.0): Executable model version 21 carries these strategies and checksum validations; models without them keep their version, bytes and outcomes (part of #616)
- AI (Release v7.56.1): The agent worker result contract is published as a JSON Schema, a sample payload and a checker under Source/AgentHarnesses/contracts, so the harness and Studio test against the same artifact. (#711)
- cli (Release v3.65.0):
cratis screenplay validatereads the validation gate a repository declares inscreenplay.jsonat the model root: thechecks,warningsAsErrors,scopeandopenQuestionsthe standalonescreenplaytool also reads, through the same Screenplay library. A command-line option overrides only its own setting, and a missing file keeps today’s defaults. An invalid or unreadable file is refused with its location and exit 1 before anything compiles. See the screenplay.json reference. (#347) - cli (Release v3.65.0):
cratis screenplay validate --print-gateprints the effective gate and where each value came from without compiling,--no-gate-fileignores the file for one run, and the JSON result carries agateobject in the same shape as the standalone tool’s. (#347) - cli (Release v3.65.0):
cratis renderaccepts Screenplay ESM v18 models: a specification that queries with an out-of-rule key or filter value and expectsthen errorrenders as a specification asserting the query’s validation failure. Shapes Stage cannot reproduce exactly are refused with Stage diagnostics; ESM v20 models are still refused withCLI-RENDER-004. - Screenplay (Release v4.171.0): A specification drives a capture over events by presenting the consumed event itself:
given <Event>andwhen append <Event>for an event a capture readsfrom. The capture keeps one state per key, folding earlier events in order, and appends what its rules map: the first event for a key counts as added, an event that changes nothing appends nothing, andwhen <field>and transitions hold only on a change.foron such a fixture is optional. See capturing from public events and decision 0077. (#483) - Stage (Release v4.106.0): Stage admits Screenplay ESM v18. A specification that queries with an out-of-rule key or filter value and expects
then errorrenders as a companion specification asserting the query’s validation failure, and Stage’s semantic runs and the Stage Host reproduce the reference’sValidationrejection. (#370) - cli (Release v3.64.0):
cratis run --engine <eventmodel|semantic>starts the Stage sandbox on the chosen runtime engine.semanticruns the Screenplay executable model, enforcing validation, requirements, authorization, conditional production and constraints, and running models with named event sources and streams. Without the option, Stage’s default engine runs as before. (#368) - Chronicle (Release v19.67.0): Kernel storage for application occurrences in MongoDB, SQL and InMemory. A replayed ingress id is recognized, and a mismatched payload is refused. (part of #4911)
- Chronicle (Release v19.67.0): Kernel storage for fenced occurrence leases. A worker whose lease epoch has been superseded can no longer renew, complete or fail the occurrence. (part of #4911)
- Chronicle (Release v19.67.0): Kernel storage for schedule definitions and cursors. The start time is written together with the first registration, and each cursor moves forward in versioned, atomic turns. (part of #4911)
- Chronicle (Release v19.67.0): Effect receipts stored in the same transaction as the events they cover, in every provider, including receipts for batches without events. (part of #4911)
- Chronicle (Release v19.67.0): SQL migrations that create the occurrence, schedule and receipt tables when the kernel upgrades. (part of #4911)
- AI (Release v7.56.0): The Stage sandbox skill describes an optional behavior walk after V3: a domain expert walks each persona’s commands and screens on Stage’s semantic engine and records what changes, producing findings for the model owner (actions that change nothing visible, screens nothing feeds, work queues that never empty, refusals the model lacks) without changing code or the model. (#682)
- AI (Release v7.56.0): The legacy-extraction skill explains when Arc’s Screenplay generator states literal-row specifications as one case table and why it otherwise reports
SP0076. Requires Arc.Screenplay 22.99.0. (#707) - Arc (Release v22.100.0): The fresh-identifier guard now also covers events written directly through the command’s unit of work:
IUnitOfWork.AddEvent,AddEventWithNamedTagsandAddEvents, andeventLog.Transactional.Append,AppendManyand their named-tag variants. It covers nested commands too. Writing to an occupied generated identifier fails withConcurrencyViolationandGeneratedIdentifierCollision, and the whole unit of work is rolled back. See Fresh identifiers. (#3245) - Arc (Release v22.100.0):
ICommandExceptionMapperlets an integration turn an exception thrown while a command runs into aCommandResult. Mappers are discovered by convention. (#3245) - Stage (Release v4.105.0): A slice that declares screens now gets its own
Screens.scene.jsonin its folder, listing that slice as its source, so a consumer such as Studio’s slice Preview can show a slice’s screens. The application’sscene.jsonis assembled from the same fragments and stays byte-identical. Slice- and feature-scoped plans emit the selected slices’ fragments, byte-identical to an application plan, and leave out the application-wide Scene files with an informational diagnostic, so a scoped write never leaves them partial. Screen ownership supplied by a caller is checked against the compiled model: an owner that doesn’t declare the screen, or a stale screen payload, fails planning. (#400) - Chronicle (Release v19.66.0): Event store subscriptions can now opt in to forward every event into the target inbox in the generation the target application declared. This applies to live forwarding, catch-up, replay and partition retries. Opt in with
WithGenerationDelivery(EventGenerationDelivery.Pinned)on the .NET subscription builder; typed registrations send their declared generation, andWithEventType(eventTypeId, generation)names one explicitly. The kernel stores those generations with the subscription and selects, decrypts and, when needed, migrates each event to that generation before appending it to the inbox. Subscriptions that do not opt in are unchanged. See explicit subscriptions (part of #4710) - Arc (Release v22.99.0): The Screenplay generator states a scenario run over a fixed set of literal cases once, as a Screenplay case table. An abstract base specification with primary-constructor parameters and body-less concrete rows (
class Ada() : Registering("Ada")) becomes one specification with typedparameterlines and onecaserow per concrete class. Rows are folded only when substituting each row’s values into the base reproduces that row’s steps, outcomes and caller exactly; otherwise every row is stated individually as before and InformationSP0076names why. See Generating a Screenplay. (#3197) - Chronicle.Elixir (Release v3.13.0): Decision reads for the dynamic consistency boundary.
Chronicle.ReadModels.DecisionReadsget/2,get_detached/2,admit/2and their stream-scoped variants enroll a read into the unit of work, andChronicle.decide/2commits it, returning{:error, %Chronicle.ReadModels.DecisionConflict{}}when a concurrent append invalidated the read. Passive reducers can be read this way too. See Dynamic Consistency Boundary. (#140) - Chronicle.Elixir (Release v3.13.0):
Chronicle.Testing: an in-memory kernel with concurrency and constraint checks, in-process reactors and reducers,wait_for_observers/1,assert_appended/refute_appended,Chronicle.Testing.Case, an isolated-store helper for integration specs, andChronicle.Behaviourso theChroniclefacade can be mocked with Mox. See Testing. (#149) - Chronicle.Elixir (Release v3.13.0): Captures:
use Chronicle.Captures.Capturedeclares a capture that compiles to Capture Declaration Language, with compile-time errors for a missing source, key or append condition.Chronicle.Capturesregisters, starts, stops, lists and validates captures, and the client registers them throughcaptures:orotp_app:discovery. (#148) - Chronicle.Elixir (Release v3.13.0): Discovery report and artifact identity drift:
Chronicle.Client.discovery_report/1,identity_drift/1, adrift_policy: :ignore | :warn | :failoption (default:warn, never fails startup), a one-time warning for reactor, reducer and projection ids defaulted from the module name, andmix chronicle.discover. (#147) - Chronicle.Elixir (Release v3.13.0): Standalone constraint modules with
use Chronicle.Events.Constraint, registered throughconstraints:or discovery, plusremove_constraint/2with per-value removal properties,:scopeand:event_sequencesonunique_event_type, violation message callbacks, andChronicle.Events.ConstraintViolation.details/1. (#143) - Chronicle.Elixir (Release v3.13.0): Projections: a one-line
childrenform,removed_with_join/2,clear_with/2, a default:onfor joins insidechildren, and compile-time errors for a rootjoinwithout:on, a duplicate property target and an unknown field. (#127) - Chronicle.Elixir (Release v3.13.0): Read models: shared, self-reconnecting subscriptions with
Chronicle.ReadModels.subscribe/2andunsubscribe/1,:filterand:sortonobserve/2,observe_stream/2, andChronicle.Projections.query/2,preview/2andwait_for/3. (#144) - Chronicle.Elixir (Release v3.13.0):
ConcurrencyScopepipe helpers (with_sequence_number/2,with_event_types/2,with_event_stream_id/2and more) andat_tail/2, and an opt-in client-wideconcurrency: [default: :optimistic, check_first_append: true]strategy. (#134) - Chronicle.Elixir (Release v3.13.0): Prepared events with
EventLog.prepare/2andappend_prepared/3,get_metadata_at/2 - AI (Release v7.55.0):
cratis-screenplay-modeling-lifecycleshipsscripts/model-first-status.mjs, which decides whether a repository is opted in to model-first work: it reports the model root, why it is or is not opted in, drafts and model changes in progress, with exit 0 when opted in, 1 when not and 2 when it cannot decide, plus--json,--rootand a self-test. Test and specification fixtures, samples and documentation.playfiles do not opt a repository in. (#677) - AI (Release v7.54.0): Event modeling skill: a section and a reference on event log hygiene (no ticks, signal events, “last looked” timestamps, telemetry or non-answers; orchestrate with jobs, state machines, reminders, command operations or
ICommandPipeline), zero repeats,…Changednaming, and measuring the log for identical consecutive events. - AI (Release v7.54.0): Event modeling skill: a reference for rolling out a release that removes or reshapes many event types (scale to zero, backup, dry run with fuses, wipe the whole schema registry, BSON
NumberLong, replay verification). - AI (Release v7.54.0): Glossary entries for observation command and signal event.
- Screenplay (Release v4.170.0):
PLAY0690warns when a reducer-backed read model cannot be keyed the way it is queried: a single-instance query looks the view upbya type that is not the event-source identity type of the events the reducer observes, or the reducer observes events whose producers have different identity types. Reducer instances are keyed by each event’s event-source id, so the warning points to a projection with property keys, or a join, instead (part of #132) - Screenplay (Release v4.170.0): The warning compares declared identity types only where every producer is known (commands with
for, implicit or generated identifiers, and reactions with an explicitfor), applies the reducer’sfromfilters first, and stays silent for events from reactions withoutfor, captures, seeds, code or other applications;screenplay check, MCP diagnostics and the editor host report it, and--warnaserrorturns it into an error (part of #132) - AI (Release v7.53.0): Every skill now has trigger evaluations (should-trigger requests and near misses that name the sibling skill that should win) and output evaluations with checkable assertions, covering the 70 skills that had none; the list of unevaluated skills is empty, so new skills cannot ship without evaluations. (#676)
- AI (Release v7.53.0): The legacy-extraction skill explains when Arc’s Screenplay generator writes
then deniedfor a specification assertingShouldNotBeAuthorized(), and why it otherwise withholds the specification withSP0039. Requires Arc.Screenplay 22.98.0. (#699) - Screenplay (Release v4.168.0):
screenplay_declaration_detailsdescribes a generated concept’s rules:generation.derivedPatternis the anchored regular expression the strategy provably produces (or null withderivedPatternUnknownReason), andgeneration.ruleslists every validation rule in authored order with its proof status (proven,refutedwith a witness value, orunprovenwith a reason), plusdiagnosticCodeandrepairwhen the compiler reported PLAY0688 or PLAY0689 at that rule. The proofs come from the same rule-consistency check the compiler uses. See declaration details. (part of #618) - Screenplay (Release v4.167.0): The canonical corpus publishes the reference clock’s schedule behavior as a versioned JSON fixture,
clock-schedules.v1.json: the rules for epoch-counted intervals and daily, weekly and monthly UTC schedules, and boundary vectors with their expected due instants, including starts before the epoch, offset normalization, months without a 31st, 29 February in leap and non-leap years, the last calendar day and the occurrence limit (#754) - Screenplay (Release v4.167.0):
ClockScheduleVectorsinCratis.Screenplay.CanonicalCorpusexposes the fixture bytes with its version and SHA-256, so a consumer can pin it by hash; the file can also be fetched from the repository at the release tag (#754) - AI (Release v7.52.0):
cratis-multi-service-architecture: designing several Cratis services with their own event stores on one Chronicle kernel: store and namespace boundaries, public contract events through the outbox, the three ways a consumer subscribes, at-least-once delivery and consumer idempotency, personal data across stores, Arc per service, and what the products do not provide. (#693) - AI (Release v7.52.0):
cratis-multi-service-local-orchestration: running several services from one repository with a contracts project, a .NET Aspire AppHost usingCratis.Chronicle.Aspire, or Docker Compose, with explicit connection strings, ports, health checks, startup order and per-storecratisCLI contexts. (#693) - AI (Release v7.52.0): The Screenplay boundaries skill explains how to model several services: one model folder per service, public events, foreign event copies, directed Translate slices and what Stage renders today. (#693)
- AI (Release v7.52.0): Screenplay
then no eventsandwhen redeliveredspecifications (ESM v17). (#668) - AI (Release v7.52.0): Query argument validation against concept rules and
then errorafter a query (ESM v18). (#684) - AI (Release v7.52.0): Reaction refusal branches and
$refusalvalues (ESM v19). (#681) - AI (Release v7.52.0): One origin per capture and the
PLAY0687error. (#663) - AI (Release v7.52.0): The Screenplay MCP proposal summary, authoring diagnostic counts and exact-source proposals. (#666)
- Arc (Release v22.98.0): The Screenplay generator states a command specification asserting
result.ShouldNotBeAuthorized()asthen deniedwhen the denial is explained by the stated authorization: the command has an emittedauthorizegate with exactly recovered roles or policies, the scenario has an exactly recoveredgiven caller, the pinned Screenplay reference runner denies that caller, and no other outcome is asserted. See Generating a Screenplay. (#3185) - Screenplay (Release v4.165.0): A repository can declare its Screenplay validation gate in a committed
screenplay.jsonat the model root: thechecks,warningsAsErrors,scopeandopenQuestionsthescreenplaycheck command runs, so scripts and CI no longer repeat the options. The model root is the nearest folder at or above the target that holdsscreenplay.jsonor.screenplay/. A command-line option overrides only its own value,--no-gate-fileignores the file for one run, and a file with an unknown key or check name is refused with its location rather than ignored. See decision 0076 and thescreenplay-v1JSON schema. (#739) - Screenplay (Release v4.165.0): The
screenplaycheck command gains--format json, which writes one JSON report with the diagnostics, open questions and the effective gate, and--print-gate, which prints the effective gate and where each value came from without compiling. (#739) - Screenplay (Release v4.165.0):
ScreenplayValidationGate.Read,ValidationGateRoot.ResolveandValidationGateResolver.ResolveinCratis.Screenplaylet other tools read and apply the same gate. (#739) - cli (Release v3.63.0):
cratis renderaccepts Screenplay ESM v17 models:then no eventsrenders for commands and single production-only reactions, andwhen redelivered <Event> to <Reaction>renders for a single named reaction trigger with event productions or one supported command invocation. Fan-out, deeper cascades and other shapes Stage cannot render yet are refused withSTAGE-ESM-011. (#365) - cli (Release v3.63.0):
cratis renderaccepts Screenplay ESM v19 models: reaction invocations can declareon refused,on refused by validation,on refused by constraint [Name]andon refused by authorizationbranches thatproduceevents from$refusal.reason,$refusal.constraintand$refusal.messageoracknowledgethe refusal. Shapes Stage cannot reproduce exactly are refused withSTAGE-ESM-039. Models newer than v19 are refused withCLI-RENDER-004. (#365) - Arc (Release v22.97.0): The Screenplay generator extracts reactors that handle command refusals with
Invoke.Command(...).OnRefused(...)andAcknowledge(...)intoinvokes … on refused [by validation | authorization | constraint …]branches. Branches appear in declaration order. Branches that produce events mapCommandRefusal.Messageto$refusal.message, and the constraint name to$refusal.constraintunder constraint selectors. A reactor whose callbacks cannot be proven pure, or whose output is capped below ESM v19, keeps itsfilereference and reportsSP0071. (#3094) - Arc (Release v22.97.0): New analyzer
ARCCHR0027warns when anOnRefusedbranch returns something the runtime rejects, such as a command, a non-event object or an empty collection. See ARCCHR0027. (#3094) - Screenplay (Release v4.164.0): Concepts that declare
generatecan carry validation rules: the compiler proves each rule against the generation strategy, binds a proven rule silently, reports a rule the strategy can break asPLAY0688with an example value that breaks it, and reports a rule it cannot decide as aPLAY0689warning with the reason (part of #616) - Screenplay (Release v4.164.0): Length,
not empty,equal,not equalandmatchesrules are decided exactly for the regular-expression subset described in the generated-values documentation;matchesis proven only for patterns a backtracking regex engine matches without ambiguity, so a proven rule never times out on a generated value (part of #616) - Screenplay (Release v4.164.0): Generated and specification fixtures are checked against their concept’s rules as well as the strategy’s shape; a fixture that breaks a rule is a contract violation (part of #616)
- Screenplay (Release v4.164.0): A repair replaces a refuted rule with the
matchespattern derived from the strategy (part of #616) - Screenplay (Release v4.164.0): Executable model version 20 carries rules on generated concepts; models without them keep their version, bytes and outcomes (part of #616)
- Chronicle (Release v19.65.0):
RegistrationOutcome.IsRegisteringsays that the .NET client is registering its artifacts again, after a reconnect or a manualRegisterAll. The other members still describe the previous run, soHasRunandIsSuccesskeep their meaning. (#4875) - Screenplay (Release v4.163.0):
ScreenplayWorkspace.Rehome(documents, RehomeScope.Subset)re-homes a workspace’s identities onto a document set that holds only part of its model, such as the features a host has generated so far. Every declaration the documents contain keeps its semantic ID and its event contract ID, revision and origin; assignments for left-out declarations are dropped, soScreenplayModelRoot.Openandscreenplay baseline admit/checkaccept the state. Declarations the workspace does not know and documents that do not compile on their own are still refused.Rehome(documents)keeps its behaviour. See Call these from your own tooling. (#749) - Stage (Release v4.103.0): Rendered specifications now cover
when redelivered <Event> to <Reaction>for a single named reaction trigger with productions, or with one supported command invocation. The generated scenario records the givens with Chronicle’sHistoryand redelivers the located occurrence with its original sequence number, correlation and stream routing, so the input is never appended again. Fan-out, deeper cascades, constraints, read-model or query expectations, and redelivery combined with refusal branches are still refused withSTAGE-ESM-011, which names the reason. (#371) - Arc (Release v22.96.0): The Screenplay generator reads the application’s react-router route table (
<Routes>/<Route path element>declarations, orcreateBrowserRouter,createHashRouterandcreateMemoryRoutercalls with literal route objects) and states navigation between screens: a menu item’snavigate('/literal')becomesitem <name> navigate to <Screen>, and aCommandDialogonSuccessnavigation becomes the action’snavigate to <Screen>. Required route parameters such as:idare bound withparameter id from literal "42", and a screen in another slice is referenced by its qualified name. See Generating a Screenplay. (#3203) - Arc (Release v22.96.0): Navigation is stated only when the destination is proven: the route table is the application’s root table (it renders or creates the router, or it is the only file declaring routes), and exactly one known route can match the literal path. Ambiguous, computed, lazy, wildcard and nested route tables,
<Link to>, relative navigation and navigation with options stay reported with SP0028. (#3203) - Stage (Release v4.102.0): Stage accepts Screenplay ESM v19 models. A reaction’s invocation can declare ordered
on refusedbranches (any, validation, constraint, a named constraint, or authorization) that acknowledge the refusal or produce events from$refusal.reason,$refusal.constraintand$refusal.message. Rendered reactors use Arc’sOnRefused/Acknowledge. Stage’s semantic runs and the Stage Host settle them as Screenplay does: the first matching branch handles the refusal and stops the rest of that trigger, and a bareon refusednever catches authorization. (#214) - Stage (Release v4.102.0): Refusal branches Stage can’t reproduce exactly fail with
STAGE-ESM-039, which names the reason. That covers several refusing triggers on the same event,$refusal.messagefrom a command with localized messages, and$refusal.constraintwhen several constraints can fail together. (#214) - Screenplay (Release v4.162.0):
ScreenplayWorkspace.Rehomere-homes a workspace’s identities onto a different document split of the same model, so a host that writes its model to a repository in its own folder layout can produce a.screenplay/identities.jsonthatScreenplayModelRoot.Openandscreenplay baseline admit/checkaccept. Every semantic ID and event contract ID, revision and origin is kept; re-homing refuses added or removed declarations, source that does not compile, and any document set a model root could not hold and discover again. See Call these from your own tooling. (#747) - Screenplay (Release v4.162.0):
ModelRootDocumentKeys.Forreturns the stable document key model-root discovery assigns to a path. (#747) - Screenplay (Release v4.161.0):
then errorafterwhen query(or afterthen query … argumentsin a specification with no action) asserts that the query was rejected with a validation error, for example a lookup by an invoice number its concept’s rules refuse. The form is admitted in executable semantic model version 18, and only models that use it select that version. (#682) - Arc (Release v22.95.0): When a command appends to an event source whose id was generated by a
[GeneratedValue]parameter in the same invocation, the append requires the whole event source to be empty. If it already has events, the command fails withConcurrencyViolationandReasonDetailGeneratedIdentifierCollision, andHandle()is not run again. This covers returned events (includingEventForEventSourceId,(id, event)tuples andEventsWithConcurrencyScopes) and aggregates. See Fresh identifiers. (#3129) - Arc (Release v22.95.0):
[GeneratedValue(Freshness = GeneratedValueFreshness.Unguarded)]opts a generated value out of the guard. (#3129) - Chronicle (Release v19.64.0): The .NET client declares the global seeds it discovers from
ICanSeedEventsas its program’s authoritative set, keyed byChronicleOptions.ProgramIdentifier, or by the entry assembly name when that is not set. Removing a seeder, or moving its seeds intoForNamespace(...), therefore stops them reaching namespaces created afterwards. Events already appended stay where they are. See seeding with C# (#4869) - AI (Release v7.51.0): An authoring rule for skills, rules, agents and prompts that loads when one of them is being written or reviewed: what a skill is, how a description routes (what it does, when to use it, what it is not for), size targets and progressive disclosure, timeless text, instruction style, one source of truth, MCP tool naming, scripts for deterministic steps, evaluations, what belongs in always-on files, and a review checklist. Harnesses without path-scoped rules find it through
general.md. (part of #674) - AI (Release v7.51.0): Verification checks that every skill description says when to use the skill and is written without “I” or “you”, that every file in a skill is reachable from its
SKILL.md, thatgeneral.mdstays within 200 lines, and that every skill either has evaluations or is listed as unevaluated with a reason; new skills cannot be added to that list. (part of #674) - AI (Release v7.51.0): Warnings, ahead of a later switch to failures, for descriptions without a “Not for” boundary or with process words, skills close to the size cap, time words, versions and issue references in rules, agents and prompts, and provenance pages in skills. (part of #674)
- Arc (Release v22.94.0): The Screenplay generator now writes a screen’s
action, toolbaritem … actionanddata … via queryreferences to commands and queries of another slice, qualified with the shortest slice scope that names exactly one declaration (for exampleaction Authors.Registration.RegisterAuthor). The owning slice is found through the component’s import. See Generating a Screenplay. (#3204) - Arc (Release v22.93.0): Analyzer ARCCHR0023 reports a read model parameter that Arc cannot match to a single command property by its key type (#3251)
- Arc (Release v22.93.0): Analyzer ARCCHR0025 reports a command with no event source key that injects a read model. The read model is looked up by a newly generated id on every call and is never found (#3251)
- Arc (Release v22.93.0): Analyzer ARCCHR0026 reports a command or command validator that reads a Chronicle-backed read model through
IMongoCollection<T>(#3251) - Chronicle (Release v19.63.0):
[ReactorSideEffect]marks a type as a reactor side-effect return type, so analyzer CHR0054 accepts reactor handlers that return it synchronously, or return an array orIEnumerable<T>of it. Hosts that register anIReactorSideEffectHandlerfor their own return types, such as Arc’s command invocations, put it on those types. The marker only informs the analyzer; a registered handler still processes the value. See CHR0054 (#4882) - Stage (Release v4.101.0): Stage accepts Screenplay ESM v17 models. Stage’s semantic specification runs execute
when redelivered <Event> to <Reaction>: the given event is delivered again to the named reaction only, without being appended again, and what follows is settled. They also executethen no eventsfor commands, reactions and appends. (part of #371) - Stage (Release v4.101.0): Rendered command specifications and single production-only reaction specifications with
then no eventsassert that nothing was appended or produced. Rendered redelivery, fan-out, deeper cascades and appends with no observer are refused withSTAGE-ESM-011, which names the reason; rendering redelivery needs https://github.com/Cratis/Chronicle/issues/4873. (part of #371) - Arc (Release v22.92.0):
IAsyncCommandExecutionScope: a command execution scope can now await work inBeginAsync. It runs after the command context is built and before filters and validators. Validate-only calls do not run execution scopes (#3257) - Arc (Release v22.92.0):
CommandScenariocan simulate a competing append withAppendConcurrentlyin commands that do not use decision reads (#3257) - Stage (Release v4.100.0): Unique constraints now render on generated text values (
uuid,uuidv7,ulid,typeid,nanoidandbytesconcepts backed by String). A collision rejects the command with the named constraint violation, as in Screenplay. Each new attempt generates a fresh value; nothing is retried automatically. Specifications that assert a collision pin the generated values involved. (#377) - Chronicle (Release v19.62.2): Observers report when their position moves past a live event with no evidence that it was delivered: the
chronicle-observer-events-suspected-skippedcounter and a rate-limited warning log name the observer, partition, sequence number and reason. Failed queue dispatches to an observer are counted bychronicle-appended-events-queue-events-possibly-undelivered. Delivery behaviour is unchanged; the troubleshooting guide explains how to investigate and recover a suspected skip (#4820) - Chronicle (Release v19.62.0): Units of work accept enrollment contributors:
IUnitOfWork.AddEnrollmentContributor(IUnitOfWorkEnrollmentContributor)returns a handle that removes the contributor when disposed. A contributor states the concurrency scope an event source must carry before any event for it is staged, throughAddEvent,AddEventWithNamedTags,AddEventsand everyeventLog.Transactionalappend. Equal scopes merge; a conflicting scope is rejected withConflictingEnrollmentScopeand nothing from that call is staged. This lets a host such as Arc guard appends that user code makes directly on the unit of work. See Transactions. (#4861) - Stage (Release v4.98.2): A guide, Generated values, that follows a small shop model from
.playto rendered code and runtime. It covers choosing a strategy and when not to generate a value, and every snippet comes from Stage’s real output. The generated-values rendering reference links to it. (part of #175) - Screenplay (Release v4.160.0): Reaction refusal branches are executable:
invokes <Command>can carry orderedon refused [by validation | by constraint [Name] | by authorization]branches thatproducesevents oracknowledge; the first matching branch wins, a bareon refusedcovers validation and constraint refusals but never authorization, and a handled refusal stops the trigger’s remaining invocations while other reactions continue (#433) - Screenplay (Release v4.160.0):
$refusal.reason,$refusal.constraintand$refusal.messagecan be mapped in branch productions: the refusal kind, the first violated constraint’s name, and the error messages joined with a newline exactly as authored (#433) - Screenplay (Release v4.160.0): Executable model version 19 carries refusal branches as
onRefusedon invocations and refusal values asrefusalexpressions, written only when used; models without them keep their version, bytes and outcomes (#433) - Screenplay (Release v4.160.0): The Invoicing sample records a refused payment reconciliation as
PaymentReconciliationRefused(#433) - AI (Release v7.50.0): Legacy extraction keeps its analysis history, where each feature lives in the code and the decisions that span a feature as committed model notes, with open assumptions as anchored questions, so re-runs and drift checks have a baseline after the working area is gone; line-level code locations stay in the evidence file, and a client can keep evidence out of the repository. (part of #672)
- AI (Release v7.50.0): Legacy extraction maps how the existing system realizes each slice today, with targeted ways to read the code for it, and adds pass discipline and question wording for expert interviews. (part of #672)
- AI (Release v7.50.0): Model review explains an existing feature or walks a planned change through the model, and the Screenplay Reviewer has a walkthrough mode. (part of #672)
- AI (Release v7.50.0): Discovery reads documents with certainty marks and exact numbers, keeps source documents unchanged, records suspected source typos with their locator, and can produce a read-only blueprint summary for people who don’t read models. (part of #672)
- AI (Release v7.50.0): Method skills add story order when declaring slices, decision state with one field per fact a scenario branches on, guidance for choosing a durable process or a plain automation, and further slicing, scenario and stream-design checks. (part of #672)
- AI (Release v7.50.0): Delivery guidance covers redelivery against commands that refuse duplicates, temporal and fan-out cases for automations, reading all of a command’s scenarios together, frontend slice isolation, query-isolation specifications, append-only committed migrations and authenticated webhook captures with a published inbound contract. (part of #672)
- AI (Release v7.50.0): The quality gate reports which slices a change touches, as advisory output that never fails the gate. (part of #672)
- AI (Release v7.50.0): Hand-written code changed since it was last verified is investigated per delivery, with findings routed to restoring the code or to a model change request. (part of #672)
- Chronicle (Release v19.61.0):
ReactorScenariocan redeliver a recorded occurrence with its original context.Given.ForEventSource(id).History(...)(also afterOnStream(...)) records events without invoking the reactor and returns aRecordedOccurrencewith the event and itsEventContext;scenario.Redeliver(occurrence)delivers it again with the same sequence number, correlation, occurred time and stream routing, so aReactorDeliveryparameter sees the same identity as for the original delivery. Observer filters, read-model seeding and produced-event recording behave as forEvents(...), for class-based and fluent reactor scenarios. See Reactor scenarios. (#4873) - Chronicle (Release v19.60.0): Webhooks can opt in to receive every event in the generation they subscribed to, on live delivery, catch-up, replay and partition retries alike. Opt in with
WithGenerationDelivery(EventGenerationDelivery.Pinned)on the .NET webhook builder, or setGenerationDeliverytoPinnedwhen registering webhooks directly. The kernel records each subscribed event type’s generation with the webhook and selects, decrypts and, when needed, migrates the event to that generation before posting it; the payload envelope is unchanged. Webhooks that do not opt in are unchanged. See webhooks (part of #4710) - Screenplay (Release v4.159.0):
ScreenplayModelRoot.OpenandScreenplayModelRoot.OpenForReleaseBaselineCheckinCratis.Screenplayopen a model root read-only with its persisted identities and release baseline, or return a typed failure such asPendingOperation,PersistedIdentitiesRequired,IdentityStateConflict,MetadataPermissionsorUnreadableModelRoot. Renderers and tools can now assess a release baseline on exactly the model they compile, through the same code the MCP server andscreenplay baseline checkuse. See Call these from your own tooling. (#740) (#741) - Screenplay (Release v4.159.0):
PersistedIdentityStateSerializerreads and writes.screenplay/identities.json, so consumers no longer need to copy its format. (#741) - cli (Release v3.61.0):
cratis render(publish,--checkand--scope) reports Stage’s release-baseline warnings when a render would change (STAGE-BASELINE-001) or drop (STAGE-BASELINE-002) an event revision admitted to the model’s release baseline, or when the baseline cannot be read (STAGE-BASELINE-003) or checked (STAGE-BASELINE-004). The warnings cover the whole application, also for scoped renders, and never change the exit code, the written artifacts or the receipt; keepcratis screenplay baseline checkas the gate in CI. See Release-baseline warnings. (#356) - cli (Release v3.61.0):
cratis render --workspace <FILE> --baseline <FILE>selects the release baseline for workspace input; without it, render uses.screenplay/release-baseline.jsonbeside the workspace file. PATH input reads the baseline from the model root’s.screenplay/folder. (#356) - AI (Release v7.49.0): Legacy extraction reads tests as evidence for rules, error messages, permissions and example data, and re-runs read only what changed since each feature was last analyzed, which also checks that an agreed freeze held. (part of #672)
- AI (Release v7.49.0): Legacy extraction works breadth first: a whole-system outline, then one feature per pass with a detail budget, steered by the domain expert; features not yet extracted are listed in the loss report. (part of #672)
- AI (Release v7.49.0): The extraction evidence keeps a decision trail, a code-term to business-term glossary and where each feature lives in the code, and covers generic engines, reference data, event order and outbound outcomes. Experts verify through plain-language retellings and a keep, change, new or remove view per slice. (part of #672)
- AI (Release v7.49.0): Discovery marks how certain each item taken from a document is, keeps numbers and dates exact, and records contradictions as questions. (part of #672)
- AI (Release v7.49.0): Command cards name the values each rule reads, field lineage is checked while editing, and a business-rule test decides which rejections and duplicates earn a specification. (part of #672)
- AI (Release v7.49.0): Model review offers an optional stressor analysis and a trace of one piece of information through the whole model. (part of #672)
- AI (Release v7.49.0): Render and gap-fill checks hand-written code that changed since it was last verified against the accepted model, and keeps a per-slice record of where each declaration lives in code. (part of #672)
- AI (Release v7.49.0): The Slice Implementer looks for an existing realization before writing one, mirrors the nearest delivered slice, and records non-behavioral assumptions instead of stopping on them; slice specifications explain how to turn a
.playspecification into C# specs. (part of #672) - AI (Release v7.49.0): The write guard hook stops agents from editing their own settings,
.mcp.json, hook configuration and, in repositories with an installed corpus, the managed.cratis/aifiles and installed adapters. (part of #672) - Stage (Release v4.98.0): A conditional production renders as a guarded event in the generated command handler. The condition is evaluated over the command’s values and generated values, and productions whose condition does not hold are skipped. When every production is skipped, the command is accepted without appending. (#360)
- Stage (Release v4.98.0): Freshness guards on generated event sources (ESM v15) apply only to productions that are taken, so a skipped production never causes a false concurrency rejection. (#360)
- Stage (Release v4.98.0): The Stage Host and the spec runner execute only taken productions, matching Screenplay’s reference evaluation. (#360)
- Stage (Release v4.98.0): A state-change slice may declare several commands; each renders with its own record, validator and response, alongside the slice’s shared events and read models. (#360)
- cli (Release v3.60.0):
cratis screenplay baseline check [ROOT]andcratis screenplay baseline admit [ROOT] --release <LABEL> [--from-esm <FILE>]check a model against its committed release baseline and admit a release into it, using Screenplay’s own baseline rules. They exit 0 when clean or admitted, 1 on violations and 2 when they could not run, so a CI job can gate oncheckand a release job can runadmit --release $TAG. See the Screenplay command reference. (#351) - cli (Release v3.60.0):
cratis screenplay validate --open-questions report|failreads the model’s open questions from its notes.reportprints them and keeps the validation result;failexits 5 while an open question remains, and unreadable notes exit 1. (Cratis/Screenplay#694) - cli (Release v3.60.0):
cratis renderadmits ESM v16: an event’sidpin keeps its stored event type name when you rename the event. (#353) - Arc (Release v22.90.0): Arc.Chronicle recognizes Chronicle self-reducing read models, so injecting one into a command, validator or
Provide()reads it through Chronicle, including personal-data release, instead of falling back to reading MongoDB directly. Requires Chronicle 19.58.0 or later in the application. (#3233) - Arc (Release v22.90.0): Screenplay recognizes self-reducing read models as reducer-built, including reducers whose event parameter is an interface or base class, and reports when it cannot list every observed event. (#3233)
- Stage (Release v4.97.0):
StageReleaseBaseline.Checkbuilds aReleaseBaselineAssessmentfrom a Screenplay workspace or a compilation and a release baseline, using Screenplay’s own baseline comparison.SemanticModelLoaderreads.screenplay/release-baseline.jsonfrom the model root (it never writes it) and exposes the result asReleaseBaseline. Callers that already hold an assessment pass it onArtifactRenderRequest.ReleaseBaselineor throughPlanFrom. (#375) - Stage (Release v4.97.0): Render plans that carry an assessment report warnings for the whole application, whatever the render scope:
STAGE-BASELINE-001when an admitted event revision changed,STAGE-BASELINE-002when it is missing,STAGE-BASELINE-003when the baseline cannot be read or belongs to another application, andSTAGE-BASELINE-004when the check could not run or was made for a different model revision. A plan with only these warnings still succeeds with the same artifacts. Without an assessment, plans are unchanged. (#375) - Stage (Release v4.97.0): The rendering guides explain where the baseline comes from, how these warnings relate to the
screenplay baseline checkgate and to the publication check, and that callers that pass only an executable model get no baseline warnings. (#375) - Components (Release v4.27.0):
TablePaginatorcan show numbered page links with an ellipsis between previous and next (for example ‹ 1 2 [3] 4 5 … 12 ›). Turn it on withpageLinks(orpageLinks={{ siblings, boundaries }}to choose how many pages show around the current one and at each end); it is off by default, so existing tables render as before. The current page carriesaria-current="page", and theinfotext («2 / 4») is not shown while page links are on. (#421) - Components (Release v4.27.0):
DataPage,DataTableForQueryandDataTableForObservableQuerypasspageLinksthrough to their paginator. (#421) - Components (Release v4.27.0): New paginator parts
pages,pageandellipsisfor styling throughpt, and new paginator messagespage(n)(the accessible name of each page button, «Page 3» by default) andpages(the name of the page list), so the labels can be localized (for example «Side 3»). (#421) - Components (Release v4.27.0):
paginatorPages(page, pageCount, siblings, boundaries)andPaginatorPageItemare exported, for apps that render their own pager with the same page window. (#421) - Screenplay (Release v4.157.0):
then no eventsis executable: it asserts that the action produced no new facts, including everything its reactions appended, and afterwhen appendit asserts that no reaction appended anything (part of #433) - Screenplay (Release v4.157.0):
when redelivered <Event> to <Reaction>is executable: the located given event is delivered again to the named reaction only, without appending it again, and the ordinary cascade settles; an unhandled refused invocation stays assertable withthen error(part of #433) - Screenplay (Release v4.157.0): Executable model version 17 carries both forms as
thenNoEventsandwhenRedeliveredmembers, written only when used; models without them keep their version, bytes and outcomes (part of #433) - Arc (Release v22.89.0): The Screenplay generator recovers event source and stream model names from Stage-rendered
{Model}EventSourceclasses and from directly referenced stream constants, and states a differing stored name withid. (#3218) - Arc (Release v22.89.0): Reactions that append through an explicit
EventForEventSourceIddestination, including list accumulator bodies, become reaction productions with their route when the route is provable. (#3218) - Stage (Release v4.96.0): Events with a stored name that differs from their model name (
id "Original"in the model, carried asstoredNamein ESM v16) render as[EventType("Original")], while the generated class follows the current name. Unpinned events and models below v16 render exactly as before. The Host registers, appends and rebuilds these events under the stored name. (#372) - Stage (Release v4.96.0):
CratisRendering.CheckPublicationrefuses a plan that would change the Chronicle[EventType]id of an existing event class in the destination, or whose existing id cannot be read. The new outcome isCratisPublicationCheck.ChangesEventTypeIds, which lists each change and reportsSTAGE-EVENT-002. Publishers that switch overCratisPublicationCheckmust handle this new case. For scoped plans the aggregate policy layout check still runs first, so publishers that refuse onlyRequiresApplicationScopekeep refusing those plans.cratis renderadopts the new refusal in Cratis/cli#354. (#372) - Stage (Release v4.96.0): A plan where two events would get the same Chronicle event type id, for example a pinned
id "RecordedEvent"beside an unpinnedRecorded_event, fails withSTAGE-ESM-012. (#372) - Stage (Release v4.96.0): Protected observable list queries now render their success specifications with Arc’s
QueryScenarioand its default Chronicle read models. Scoped projections and protected snapshot list successes are still refused withSTAGE-ESM-011. (part of #278) - Chronicle (Release v19.59.4):
Cratis:Chronicle:Shutdown:DrainTimeout(environment variableCratis__Chronicle__Shutdown__DrainTimeout) (default 8 seconds) bounds how long the kernel spends finishing in-flight observer work when it stops; the effective budget is capped below the host shutdown timeout and logged at startup (#4790) - Stage (Release v4.95.0): Command specifications with a
given clocknow render and run instead of being refused as unsupported time. The rendered specification fixes Arc’s scenario clock to the stated instant, and Stage’s semantic specification runs use it as the command’s occurrence. So$context.occurredvalues can be asserted exactly, and generated time-ordered values are checked against that instant. The clock must be a whole number of milliseconds and no earlier than 1970.when clock, clocks on reaction specifications, and query-only and direct-append specifications are still refused. (#381) - AI (Release v7.48.0): A shared reference on choosing how a rule holds, reached from the decision-read, command, validation, constraint, read-model, reducer and Screenplay consistency skills. It contains:
- AI (Release v7.48.0): routing steps and a decision matrix by rule shape, with what never to use and what is too much
- AI (Release v7.48.0): plain reads by backing, and constraint limits
- AI (Release v7.48.0): Arc and Chronicle traps, costs, and a checklist for generated code (#661)
- AI (Release v7.48.0): Evaluation cases for the common traps (#661):
- AI (Release v7.48.0): a plain or passive read used as a guard
- AI (Release v7.48.0): a validator used as a guard
- AI (Release v7.48.0):
concurrency: true - AI (Release v7.48.0): rules that span two keys
- AI (Release v7.48.0): uniqueness through a constraint
- AI (Release v7.48.0): refused decision-read shapes
- AI (Release v7.48.0): unit-of-work commit timing in ASP.NET Core
- AI (Release v7.48.0): when not to use decision reads
- Screenplay (Release v4.154.0):
ReleaseBaselineCommands.Check(root)andReleaseBaselineCommands.Admit(root, release, fromEsmPath)inCratis.Screenplay.Mcprun the same baseline check and journaled admission asscreenplay baseline check|admitand return aReleaseBaselineOutcomewith the exit code, violations, refusal reason, and the admitted entry count and baseline revision. (#720) - Screenplay (Release v4.154.0):
ModelNoteQuestions.Read(root, scope)returns the open questions thatscreenplay check --open-questionsreports, including orphaned questions and absent or unreadable notes, withGetExitCode(failOnOpenQuestions)for report and fail modes. (#694) - Arc (Release v22.88.0):
Invoke.Command(command)returns a command invocation from a reactor, with.OnRefused(Refused.X, refusal => …)branches that append the returned events and.Acknowledge(Refused.X)to record that a refusal was handled. The first matching branch wins, and a handled refusal stops the remaining invocations of that reactor call (#3058) - Arc (Release v22.88.0):
Refused.ByValidation,Refused.ByConstraint(name),Refused.ByAnyConstraint,Refused.ByAuthorizationandRefused.Anyselect refusals;Refused.Anycovers validation and constraint refusals but not authorization (#3058) - Arc (Release v22.88.0):
CommandResult.GetRefusal()classifies a refused command as a validation, constraint (with all violated constraint names) or authorization refusal. Concurrency conflicts, exceptions, authorization configuration failures and framework failures are not refusals, so they still fail the observer and are retried (#3058) - Arc (Release v22.88.0): Decision record https://github.com/Cratis/Arc/blob/main/decisions/0010-declarative-reactor-command-refusals.md describes the contract (#3058)
- Stage (Release v4.93.0): Stage’s semantic specification runs (SpecRunner
--engine semanticandPOST /stage/semantic/specifications/run) now executeeveryandallprojection blocks whose mappings set event-source identities, with the same results as the Screenplay reference runner. Literal, empty and child-scoped blocks are still reported as unsupported. (part of #15) - AI (Release v7.46.0): “Choosing a strategy” and “When not to” sections in the Fundamentals concept, Arc command, Screenplay command-surface, model-authoring, specifications, legacy-extraction and Stage rendering skills, built on a shared shop example:
CustomerId(cus_+ ULID),OrderId(TypeID, time from the generation context),InviteCode(NanoID) andApiKey(32 random bytes kept as a secret). Each skill shows only what its product releases; context-based and secret generation in Screenplay are marked as not yet available (part of #576) - AI (Release v7.46.0): Guidance for recovering generated values from legacy code, gated on the Arc.Screenplay adapter version the CLI bundles (part of #576)
- AI (Release v7.46.0): Evaluations for choosing a strategy, refusing generation for a gapless invoice number, writing a pinned Screenplay specification and recovering legacy generation (part of #576)
- Chronicle (Release v19.59.0):
EventScenario.ReadModelsreads and observes the read models built from the scenario’s own events: projections, including children and joins, and reducers. Tools that build on anEventScenariocan now callGetInstanceById,GetInstancesandObserve<T>()over the same store they appended to, instead of the shared default store, where model-bound children failed with “Could not resolve parent key”. See event scenarios (#4816) - Screenplay (Release v4.153.0):
screenplay baseline admit <root> --release <label>records every current and historical event revision with its resolved stored shape in.screenplay/release-baseline.json, a committed sidecar with a published JSON schema.--from-esm <file>admits from the canonical model a release shipped. Admission only ever adds entries, refuses a changed revision, and never runs implicitly. (#686) - Screenplay (Release v4.153.0):
screenplay baseline check <root>exits 1 when a baselined revision changed or is missing and 2 when the baseline is unreadable, so CI can gate edits made outside the MCP tools. (#686) - Screenplay (Release v4.153.0): MCP:
screenplay_list_release_baselinepages the admitted revisions with their current status,read-proposal view=release-baselineshows a proposal’s effect on them, andopen-workspaceandworkspace-statereport the baseline’s status, revision and violations. (#686) - Screenplay (Release v4.152.0): ESM v16: an event contract carries
storedNamewhen itsidpin differs from its name. Models with such a pin select v16, and consumers must explicitly admit v16; earlier strict readers refuse it. A pin equal to the event name changes nothing and keeps the model’s version and bytes. (#704) - Chronicle (Release v19.58.0): Self-reducing read models: a class that does not implement
IReducerand declarespublic static Reduce(TEvent @event, TSelf? current[, EventContext context])returningTSelforTask<TSelf>is discovered as a reducer for itself. No marker attribute or new registration API is needed;[Reducer],[Passive], event-sequence, event-store, tag and route attributes on the model configure it, and the existingRegisterReducer<T>()andRegisterReducer(Type)accept these models. (#4731) - Chronicle (Release v19.58.0): Optional static replay hooks on a self-reducing read model:
BeginReplay,EndReplay,BeginReplayPartition(Partition)andEndReplayPartition(Partition)returningTask, with trailing services resolved from the notification’s scope and no model instance created. (#4731) - Chronicle (Release v19.58.0): Analyzers for self-reducing read models:
CHR0058warns about near-missReducesignatures,CHR0059reports malformed replay hooks,CHR0060reports equally specificReducemethods, andCHR0061reports a model that is also maintained by a projection or another reducer. (#4731) - Chronicle.Go (Release v0.10.0):
FastForwardon the observation service and itsFastForwardResult. Requires Chronicle 19.56.0 or later. - cli (Release v3.58.0):
cratis chronicle observers fast-forward <observer-id>: skips every event the observer has not yet handled and discards its failed partitions. Requires Chronicle 19.56.0 or later. - cli (Release v3.58.0): A fast forward action (W) on the observers view of the TUI workbench.
- Chronicle.TypeScript (Release v6.52.0):
observers.fastForward(observerId)and theFastForwardResultit returns. Requires Chronicle 19.56.0 or later. - Chronicle.Kotlin (Release v6.14.0):
store.observers.fastForward(...)by identifier or by reactor/reducer class, theFastForwardResultit returns, and a Java bridge. Requires Chronicle 19.56.0 or later. - Chronicle.Elixir (Release v3.12.0):
Chronicle.Observers.fast_forward/2and theFastForwardResultit returns. Requires Chronicle 19.56.0 or later. - Chronicle (Release v19.56.0): Fast forward for observers: an observer can be moved to the tail of its event sequence, skipping every event it has not yet handled. Its failed partitions are discarded and the state it already built is kept.
- Chronicle (Release v19.56.0): A Fast forward action in the Workbench observers view.
- Chronicle (Release v19.56.0):
FastForwardon the .NETIReactors,IReducersandIProjections, andObservers.FastForwardon the gRPC contract. - Chronicle.Elixir (Release v3.11.0):
Chronicle.Events.EventContext, shared by reactors and reducers: the causing identity (caused_by, withon_behalf_of),causation,correlation_id,tags,hash,subject, event type, event stream andreplaying?. It is still a map, so existing pattern matches keep working. (#125) - Chronicle.Elixir (Release v3.11.0):
delivery_idin the reactor context: a stable identity of one delivery of an event to a reactor, the same on every redelivery, built like the .NETReactorDelivery.Idfor idempotency keys. (#137) - Chronicle.Elixir (Release v3.11.0): Reactor replay control:
once_only: trueregisters a reactor as not replayable,once_only: [Event]skips those events while replaying, and an optionalhandle_replay/2handles replayed events. (#136) - Chronicle.Elixir (Release v3.11.0):
get_for_event_source/3andget_from_sequence_number/2acceptdecode: trueand returnChronicle.Events.AppendedEventstructs holding the event struct, its context, the raw payload and redaction details. (#130) - Chronicle.Elixir (Release v3.11.0):
append_with_result/3andappend_many_with_result/3return the assigned sequence numbers and structured constraint and concurrency violations, pluswait_for_completion/2. (part of #133) - Chronicle.Elixir (Release v3.11.0):
ConcurrencyScope.expecting_no_matching_event/1for creation-only guards. (part of #134) - Chronicle.Elixir (Release v3.11.0):
Chronicle.Compliance.allow_new_encryption_key_for/2. (part of #135) - Chronicle.Elixir (Release v3.11.0): Event type options
subject:,tags:,tombstone:,public:andcompensation_for:; the declared subject is resolved on append. (part of #138) (part of #146) - Chronicle.Elixir (Release v3.11.0):
childrenblocks in read models and projections for child collections (nested, withfrom,join,removed_with), andclear:to set a scalar back to no value. (part of #127) - Chronicle.Elixir (Release v3.11.0):
closes_streamdeclarations on event types, unique constraintmode: :per_value, andChronicle.EventSequences.Streamsto list, close, reopen and check closed stream scopes, read event metadata and verify stored content. (part of #142) (part of #143) - Chronicle.Elixir (Release v3.11.0):
Chronicle.ReadModels.query/2options:filterand:sort, evaluated by the client with a:max_scanlimit. (part of #126) - Chronicle.Elixir (Release v3.11.0):
Chronicle.ReadModels.observe/2for collections andChronicle.ReadModels.Reactorfor reacting to read model changes. (part of #144) - Chronicle.Elixir (Release v3.11.0):
Chronicle.Middlewarefor reactors and reducers, configured globally or per module. (part of #145) - Chronicle.Elixir (Release v3.11.0):
Chronicle.Observers.retry_partition/3,clear_partition_quarantine/3andclear_observer_quarantine/2. (part of #141) - Chronicle.Elixir (Release v3.11.0):
Chronicle.Client.registration_status/1,await_registration/2and a:registrationoption for backoff, jitter and maximum attempts; an invalid definition now fails once instead of retrying forever. (part of #131) - Chronicle.Elixir (Release v3.11.0): Operations:
observer_lag:publishes a[:chronicle, :observer, :lag]telemetry event per observer, and `watc - Screenplay (Release v4.150.0): A warning, PLAY0686, on an event
idpin: the pin is not yet carried to renderers, so generated code stores the event under its new name.screenplay_propose_renamereports the same caveat for event renames, and the VS Code extension and Monaco editor show it. (part of #704) - Arc (Release v22.87.0):
QueryScenariocan run observable queries backed by Chronicle read models: a query returningIReadModels.Observe<T>(filter)emits the read models built from the scenario’s given events and given read models, and emits again when a command in the scenario appends events (#3221) (part of #3154) - Arc (Release v22.87.0): A given read model whose key cannot be read from the instance cannot be observed, and
Observefails withPinnedReadModelCannotBeObservedexplaining how to seed it instead (part of #3154) - AI (Release v7.43.0): The Screenplay model-authoring skill teaches the MCP surface for concept generation strategies: reading a concept’s
generationsummary fromscreenplay_declaration_details(strategy, modifiers, entropy, collision estimate and whether it is executable), setting or removinggeneratethrough typed proposals, and the PLAY0683/PLAY0684 repairs that raise entropy or add a unique constraint. Thecratis screenplay mcpbundled in CLI 3.57.0 does not have this surface yet (#645) - AI (Release v7.42.0):
cratis-cleanup-worktrees.shremoves linked worktrees and local branches only when their work is verifiably on the default branch (merged, merged with upstream gone, or a merged PR at the same commit). It never forces and reports what it kept and why. - AI (Release v7.42.0): Claude Code and Pi run it after delivering commands such as
gh pr mergeand at session start, so orphans from earlier sessions are collected. - Chronicle (Release v19.55.0):
Workbench:BasePath(Cratis__Chronicle__Workbench__BasePath) serves the Workbench page, its assets and the API it calls under a path prefix, for a reverse proxy that routes by path. It works whether the proxy strips the prefix or passes it through. See https://github.com/Cratis/Chronicle/blob/main/Documentation/hosting/configuration/workbench.md (#4822) - Chronicle (Release v19.55.0):
MaxReceiveMessageSizeandMaxSendMessageSizeon the kernel, set throughCratis__Chronicle__MaxReceiveMessageSizeandCratis__Chronicle__MaxSendMessageSize. - AI (Release v7.41.0): Concept generation strategies (ESM v15): UUID, UUIDv7, ULID, TypeID, NanoID and bytes, with their encodings, entropy diagnostics (PLAY0683/PLAY0684), strict fixtures and generated-value freshness, and what Stage 4.89.1 renders of them (#643)
- AI (Release v7.41.0): Response names in UI continuations: a form’s
on submitandexecute ... on successcan use the command’s returned names, with the scoping rules and PLAY0685; rendered applications do not bind them yet (Cratis/Scene#53) (#642) - Screenplay (Release v4.149.0):
screenplay_declaration_detailsreturns agenerationobject for concepts that declaregenerate: the strategy, its modifiers, the exact entropy in bits, the number of values at a 1% collision probability, and whether the compiler admits it (admitted,refusedwith the diagnostic codes, ornotAssessedwith a reason). Setting, changing and removinggeneratego through the existing typed proposals and report the compiler’s refusals. (part of #618) - Screenplay (Release v4.149.0): Two repairs for low-entropy generation through
screenplay_propose_repair: raise ananoidsize orbytescount to at least 64 random bits (PLAY0683, PLAY0684), and add a unique constraint for the generated property (PLAY0683).screenplay_repair_capabilitieslists them. (part of #618) - Chronicle.Kotlin (Release v6.13.1):
maxReceiveMessageSizeonChronicleOptions, andwithMaxReceiveMessageSize()to change it. Passnullto keep grpc-java’s own default. - Chronicle.TypeScript (Release v6.51.1):
maxReceiveMessageSizeandmaxSendMessageSizeonChronicleOptionsand its factory methods. Passnullto keep gRPC’s own default. - Stage (Release v4.91.0): Screenplay
allprojection blocks whose mappings set event-source identities now render as ChronicleFromAll, including for events of unrelated types and event sources.allblocks with literal mappings (Cratis/Chronicle#4663) or with no mappings still fail withSTAGE-ESM-017. (part of #117) - Stage (Release v4.90.0): An
observablecollection query renders as an Arc observable query returningISubject<IEnumerable<T>>from Chronicle’sIReadModels.Observe. Abykey and ESM v14 equality filters become the observation’s filter, and a missing required text filter is still refused. (#278) - Stage (Release v4.90.0): A snapshot collection query renders as a one-time query returning the current list, with or without a
bykey and equality filters. (#278) - Arc (Release v22.86.0): The Screenplay generator states a concept’s generation strategy from its
New()factory:GenerateValue.UuidV7()andGuid.CreateVersion7()becomegenerate uuidv7,Ulid()becomesgenerate ulid,TypeId("p")becomesgenerate typeid "p",NanoId(size, alphabet)becomesgenerate nanoidwith its size and alphabet,Bytes(count, encoding)becomesgenerate byteswith its encoding, andRandomNumberGenerator.GetHexString(n, lowercase)becomesgenerate bytes n/2 hexwith its case. Plain UUID factories keep nogenerateline (part of #3116) - Arc (Release v22.86.0):
[GeneratedValue]parameters of concepts with a recovered strategy, including string-backed concepts, becomegeneratedproperties, and scenarios can pin them with text values that match the strategy’s shape (part of #3116) - Stage (Release v4.89.0): A reaction
from <Source>renders[EventSourceType("<Source>")]on its reactor, andfrom <Source>.<Stream>renders[FromEventSource<TSource>("<Stream>")], the same attributes filtered reducers use. Events the reaction produces stay unrouted. (#297) - Stage (Release v4.89.0): Rendered
when appendreaction specifications take the filter into account. An append the filter excludes is refused withSTAGE-ESM-011instead of rendering a specification that cannot pass, and a filtered-out sibling reaction no longer counts as fan-out. (#297) - Stage (Release v4.87.0): Concepts with a v15 generation strategy render
New()with the matching FundamentalsGenerateValuefactory, includingprefixandcasemodifiers on String-backed concepts. (#357) - Stage (Release v4.87.0): At v15, a command that produces facts on a generated event source guards it with a
BeforeFirstconcurrency scope, so a source that already has facts rejects the whole command withConcurrencyViolation. This matches Screenplay’s freshness rule; earlier facts without a destination never make a source stale. (#357) - Stage (Release v4.87.0): The Stage Host generates values with the concept’s strategy and reports the freshness rejection as a concurrency violation. The specification executor checks v15 fixture shapes and freshness with the reference messages. (#357)
- Chronicle (Release v19.54.0):
IReadModels.Observe<T>()returns anISubject<IEnumerable<T>>that emits the whole read-model collection and emits again whenever it changes, on MongoDB, SQL and in-memory storage. It uses Chronicle’s own collection naming and keys, so read models need noIdproperty, and personal data arrives decrypted. Pass a filter expression to observe a subset. Return it from an observable query to keep a list current. See observing read models (#4759) - Chronicle (Release v19.54.0): The testing services support
IReadModels.Observe<T>()too: they rebuild the read models from the scenario’s events and emit again after each append (#4759) - Stage (Release v4.86.0): A reaction with
runs asrenders its Chronicle reactor with Arc’s[ExecuteCommandsAsSystem(roles)], so the commands it invokes run as the system with exactly the declared roles. (#292) - Stage (Release v4.86.0): A
when appendspecification whose appended event fires one reaction renders as a ChronicleReactorScenariochained into an ArcCommandScenario. It asserts the events the reaction produces (payload, destination and an exact count) or the invoked command’s outcome. The invoked command runs under the identity declared on the reactor itself, and the specification’s caller is not forwarded. (part of #207) - Arc (Release v22.85.0): The Screenplay generator states a collection query parameter as a
filter <name> <Type>line when the query provably compares it for equality with the same-named read-model property: in LINQWhereand MongoDBFind/Wherechains, Arc’s observableObservequeries, and Entity Framework Core chains awaited throughToListAsync,ToArrayAsyncorAsAsyncEnumerable. A nullable parameter whose comparison is skipped when it is null becomes anoptionalfilter. Models with filters bind as Screenplay ESM v14 (#3196) - Arc (Release v22.85.0): Query parameters that are not provable equality filters (other names,
!=, ranges,Contains, computed values, repeated comparisons) stay out of the model and are reported withSP0019, and aMaximumExecutableModelVersionbelow v14 withholds filters with a locatedSP0019(#3196) - Screenplay (Release v4.148.0): Names returned by a command can be used in a form’s
on submitand in theon successcontinuation ofexecute:with … from, theon submit navigate to … byshorthand,set … toand message operands resolve a bare name to the command’s response once it is not a form field or behavior parameter (#303) (part of #300) - Screenplay (Release v4.148.0): PLAY0685 reports a returned name used under the returning command’s
on failure, where the command returned nothing; an outer command’s successful response stays available there (part of #300) - Screenplay (Release v4.148.0): Editor completion and hover for returned names inside
on submitandon success(part of #300) - Arc (Release v22.83.0): A
[GeneratedValue]parameter whose concept implementsIGeneratableInContext<T>from Cratis Fundamentals 7.24 is created with aGenerationContextholding the command’s received time and the current tenant (the default tenant maps toGenerationContext.DefaultTenant). When a concept implements bothIGeneratable<T>andIGeneratableInContext<T>, the context form is used. A command without a received time fails instead of falling back to the system clock (#3165) - Arc (Release v22.83.0):
CommandScenario.Clock(DateTimeOffset)andCommandScenario.Tenant(TenantId)fix the time and tenant a scenario’s commands run with, including nested commands. SetClockbefore the firstExecuteorValidateandTenantbefore the firstExecute; later changes throw (#3165) - Arc (Release v22.83.0):
ARC0027warns when a generated parameter’s type implements both generation interfaces, since Arc only calls the context form (#3165) - Arc (Release v22.83.0):
ARC0028reports a generatable concept created insideHandle(X.New()orGenerateValue.*) and offers a code fix that moves it to a[GeneratedValue]parameter, so scenarios can pin the value (#3165) - Arc (Release v22.83.0):
ARCCHR0022warns when a command injects an aggregate keyed by the command’s event source while appending its events to a generated event source (#3165) - Stage (Release v4.85.0): The Stage Host (Play and the spec runner) now protects personal-data and secret concept values in its own event store, as rendered applications do. Chronicle encrypts them at rest and releases them on read, and personal data can be erased through Chronicle’s key deletion keyed by the event source. Events stored before this release stay in plain text. (#346)
- Stage (Release v4.84.0): Equality filters render on observable collection queries, with or without a
bykey. Required filters become non-nullable query parameters and are refused when missing. Optional filters default tonulland narrow only when supplied. All filters and the key combine with AND. (#348) - Stage (Release v4.84.0): The semantic Stage Host passes query filters to Screenplay’s reference evaluator, which applies them to live queries. (#348)
- Stage (Release v4.84.0): Generated query specifications pass filter values by name and assert the number of returned rows for filtered queries. (#348)
- Screenplay (Release v4.147.0): A concept can declare
generate uuid,uuidv7,ulid,typeid "<prefix>",nanoid [size]orbytes <count> base64url|hex|base32, with theprefix,caseandalphabetmodifiers;generatedproperties now accept any generatable concept, not onlyUuidconcepts (part of #616) - Screenplay (Release v4.147.0): Concepts with a declared strategy bind into the executable model as ESM v15, as an optional
generationmember on the concept; models without one, including an unmodifiedgenerate uuidon aUuidconcept, keep their exact executable-model bytes and revision (part of #616) - Screenplay (Release v4.147.0): From ESM v15 the reference evaluator checks every generated fixture against its strategy’s exact shape, and rejects a command that appends to a generated identifier whose event source already has events, with the new
Concurrencyrejection (part of #616) - Screenplay (Release v4.147.0): Entropy diagnostics: a generated value below 64 random bits warns with the number of values at a 1% collision probability, unless a unique constraint covers it, and a generated identifier below 64 bits is refused (part of #616)
- Screenplay (Release v4.147.0):
generate pattern,randomandruleparse and print in both compilers but are not yet executable, andgenerate sequenceis reserved (part of #616) - Screenplay (Release v4.147.0): New diagnostics PLAY0672 to PLAY0684 for malformed strategies, modifiers, prefixes, alphabets and sizes, in both compilers (part of #616)
- Screenplay (Release v4.147.0): Editor completion, hover with entropy and strategy notes, and syntax highlighting for
generate(part of #616) - Screenplay (Release v4.147.0): Documentation: generated values, choosing a strategy and a strategy reference, plus ESM v15 in the interoperability table, golden vector and canonical corpus (part of #616)
- Stage (Release v4.83.0): The generated-React and live-custom-package browser scenarios assert the responsive shell (
browser.responsive.*): at 1440px the navigation sits beside the content with no horizontal overflow; at 390px it is parked off the canvas, nothing overflows, the “Open the menu” toggle exists, pressing it brings the navigation into the window and the toggle then offers to close it. (part of #237) - Arc (Release v22.82.0): The Screenplay generator states a Cratis Components
DataPagemenu item as atoolbaritem (item <name> action <Command>, with its literal label) when the item’s command provably opens theCommandDialogof a command in the same slice; that dialog is then not repeated as a separate screen action. (#3049) - Arc (Release v22.82.0): The Screenplay generator reports
SP0077for screen composition Screenplay cannot express yet: adetailsComponentpane, a screen opened as a dialog throughuseDialog, and menu item enablement such asdisableOnUnselected. (#3049) - cli (Release v3.55.0):
cratis run --package-set <file> [--packages <folder>]hands the approved package set (the same documentcratis render --package-settakes) to the live Stage: the set is mounted read-only at/packages/approved-packages.jsonand the folder of each approved package,<packages folder>/<npm name>, read-only at/packages/<npm name>- never the folder that holds them. The Stage loads each package at runtime from its browser (ES module) build, with the Stage’s own React, and refuses to render when a package is missing or differs from its declaration. A package without a folder, a set that is missing or invalid and--packageswithout--package-setare refused before Docker starts. (part of #284) - cli (Release v3.55.0):
cratis runresolves theui profileof the model before Docker starts. A package that is neither shipped (core,scene.web,Cratis.Components) nor approved is refused withCLI-RENDER-007(exit code 5) and says to approve it with--package-set; nothing is started, so a typo or a forgotten approval no longer produces a sandbox that shows a placeholder where the package’s component belongs. A model that does not compile is left to the Stage. (part of #284) - cli (Release v3.55.0): The packed-CLI check in CI now also runs the same package set live:
cratis runwithout the set refuses withCLI-RENDER-007, and with the set the Stage container renders the custom component, its property and style sheet beside the shipped components in a browser, using the same scenario as the rendered application. (part of #284) - cli (Release v3.55.0): Documentation:
run.md#custom-packagesand thescreenplay.mdcustom package section describe the live package folder, the browser-build contract and what is refused. - AI (Release v7.39.0): A preferred-syntax reference for Screenplay: for each construct, the form the corpus uses, the older forms Screenplay still accepts, and the diagnostic that flags them; corpus verification now fails when an example uses a legacy, redundant or deprecated form, selected from the pinned Screenplay contract so new codes are picked up automatically (#636)
- AI (Release v7.39.0): Running a proposal’s specifications read-only before
applywithrun-specificationsandproposalId, and thescreenplay testexit codes (#633) - AI (Release v7.39.0): Caller-supplied equality filters on collection queries (ESM v14, Screenplay 4.143.0), with the remaining
PLAY0268refusals, query arguments in specifications and order-insensitive collection results; rendering waits for a Stage that admits v14 (#626) - Screenplay (Release v4.146.0):
Cratis.Screenplay.CanonicalCorpusships the golden executable semantic model vectors for every released ESM version (full-esm-v1tofull-esm-v14, plus thepolicy-negation-v7extension).EsmGoldenVectors.Versionslists them, andEsmGoldenVectors.Get(version)returns the exact released bytes and their semantic revision, so consumers can test against the published contract instead of copying files from a tag. New ESM versions add their vector automatically (#677) - cli (Release v3.54.0):
cratis renderadmits ESM v11 (lossless Double-mode number literals), v12 (explicit enum member numbers) and v13 (concept compliance markers such aspiiandsecret). ESM v14 query filters stay refused withCLI-RENDER-004until the bundled renderer admits them. (#332) - cli (Release v3.54.0):
cratis screenplay mcpserves the model-notes tools from Screenplay 4.144:list-model-notes,propose-model-notes,read-proposalwithview: "notes", andrun-specificationswith aproposalIdto run a retained proposal’s candidate model beforeapply. The reference explains that.screenplay/notes.jsonis owned by the server, committed with the model, and never blocks opening a model, and shows where to gate on open questions withscreenplay check --open-questions report|fail. (#340) - Fundamentals (Release v7.24.0):
IGeneratableInContext<TSelf>inCratis.Concepts: a concept implementsstatic TSelf New(GenerationContext context)when its value depends on the operation’s time or tenant; when a type implements both interfaces, callers use the context form (part of #1176) - Fundamentals (Release v7.24.0):
GenerationContext(Now, Tenant): the instant the operation was received and the portable tenant identifier, withGenerationContext.DefaultTenant(the zero GUID) for the default tenant (part of #1176) - Fundamentals (Release v7.24.0):
GenerateValue.Ulid(): 26 uppercase Crockford base32 characters with a millisecond timestamp and 80 random bits (part of #1176) - Fundamentals (Release v7.24.0):
GenerateValue.TypeId(prefix): a TypeID with a validated lowercase prefix and a UUID v7 suffix (part of #1176) - Fundamentals (Release v7.24.0):
GenerateValue.NanoId(size, alphabet): characters drawn uniformly from the default URL-safe alphabet or a custom one (part of #1176) - Fundamentals (Release v7.24.0):
GenerateValue.Bytes(count, encoding): random bytes as unpadded base64url, lowercase hex or unpadded RFC 4648 base32 (part of #1176) - Fundamentals (Release v7.24.0):
GenerateValue.UuidV7(context),Ulid(context)andTypeId(prefix, context)take their timestamp fromcontext.Now, so a pinned clock pins the time part of the value (part of #1176) - Fundamentals (Release v7.24.0): Documentation on choosing a strategy and on context-aware generation: https://github.com/Cratis/Fundamentals/blob/main/Documentation/csharp/generating-values.md (part of #1176)
- Stage (Release v4.81.0): The specification executor settles event-triggered reactions after each command or appended event:
whereguards, productions (checked against constraints), invocations,runs assystem identities,fromfilters, triggers that both produce and invoke, cascades and the 1000-fact limit. An invoked command never receives the specification’s caller. (part of #207) - Stage (Release v4.81.0): Projection checks cover every event a reaction can append, so a projection over reaction-produced events is either verified or refused, never built from mismatched keys. (part of #207)
- Stage (Release v4.80.0): The Host reads a packages folder (
Stage:Packages:Path,/packagesin the image):approved-packages.jsonand one folder per approved package, named by its npm name. The set is validated with Scene’sApprovedPackageSetJson(malformed sets and a set reusing a shipped package name are refused), the package entry module is resolved from itspackage.json(exports,module,main, orindex.js), andGET /stage/packagesdescribes the set, where each module is served from, the style sheets and any diagnostics. Only the files inside the approved packages’ folders, of the types a package ships, are served under/stage/packages/files/**; the set document and other folders are not reachable. (part of #237) - Stage (Release v4.80.0): The frontend loads the packages before the first render through Scene’s
loadApprovedPackages, with an importer for each package the Stage reported - never an address a scene supplied - and renders them next to the shipped Cratis components with the package catalog resolvingPackage.componentnames. A package that is missing, does not load, lacks its export or differs from its declaration stops the Stage with the reasons on the page; a profile is never rendered with a package missing. A Stage handed no set renders the shipped packages exactly as before. (part of #237) - Stage (Release v4.80.0): A shared import map in the Stage page maps
react,react/jsx-runtime,react/jsx-dev-runtime,react-domandreact-dom/clientto shim modules emitted by the build that re-export the Stage’s own React, so a custom package’s hooks and contexts are the Stage’s. (part of #237) - Stage (Release v4.80.0):
StageShippedPackagesin the contracts is the one list of shipped package names the renderer’s catalog and the live package host both use. - Stage (Release v4.80.0):
Verification/live-custom-packagesruns the built image against a model namingAcme.Chartswith the package mounted (the authored component renders from the package, its property, its style sheet, shipped components beside it, no diagnostics) and again with the package folder missing (the Stage refuses to render and names the package), and a newlive-custom-packagesCI job runs it. - Stage (Release v4.80.0): Documentation:
Documentation/reference/custom-packages.mddescribes the live Stage’s package folder, endpoints and import map in place of the former limit. - AI (Release v7.38.2): The corpus verification job runs the edited model with
cratis runand checks the edited column and a created row in Chromium, using a pinned Playwright (part of Cratis/AI#536). - Scene (Release v4.22.0):
PropertyEditorKind(stringList,numberList,stringOrList,scalar,stringMap) names the editor for a value that has no fields to describe: a list of words or numbers, a word-or-list, a scalar, a record under the author’s own names. - Scene (Release v4.22.0):
CollectionItemDescriptor.positionallets a collection of authored data (chart datasets, tree nodes, columns) hold records without anid; items are told apart by position. - Screenplay (Release v4.145.0):
run-specificationsaccepts an optionalproposalIdand runs a retained proposal’s candidate model, including its identity changes, through the same reference evaluator beforeapply. It is read-only: the proposal stays applicable, and continuation pages pin the candidate’s source revision (#610) - Screenplay (Release v4.145.0): The MCP docs gain an “Edit a specification” recipe: find the specification with
read-ast, change its steps, cases or examples withpropose-ast, check changed expected outcomes withread-proposalview: "semantic-diff", run the candidate withrun-specifications, thenapply(#610) - Arc (Release v22.80.0): The Screenplay generator states the caller of a command scenario as
given caller: a specification that registers a substitutedICurrentPrincipalAccessorreturning aClaimsPrincipalbuilt from constant claims becomesauthenticated,roleandclaimlines in the same order. A scenario of an authorized command is stated only when its caller and every policy the command uses are recovered exactly; otherwise it is left out withSP0039. A scenario of a command without authorization whose caller setup cannot be stated keeps the scenario without a caller and reportsSP0075. (#3098) - Arc (Release v22.80.0): The Screenplay generator reports
SP0076for every[Theory]scenario, including reactor scenarios, instead of leaving them out silently. Case tables for such scenarios are tracked in https://github.com/Cratis/Arc/issues/3197. (#3098) - AI (Release v7.38.0): The Screenplay skills teach model notes (Screenplay 4.144.0): recording open modeling questions as
questionnotes anchored to model elements withlist-model-notesandpropose-model-notes, citing and resolving them through external decisions, re-anchoring orphaned notes, keeping secrets and personal data out of committed notes, and the--open-questions failgate of the standalone tool (#627) - AI (Release v7.38.0): Copilot path instructions are generated as
.cratis/ai/harnesses/copilot/instructions/<rule>.instructions.mdwithapplyTo, so GitHub Copilot discovers the path-scoped rules (#631) - Arc (Release v22.79.0): Analyzer
ARCCHR0020(warning) reports anEventForEventSourceIdwhose literal routing names an event source definition together with a stream that definition does not declare, so a typo no longer sends events to a route the command does not describe. Routes that differ from the command’s route on purpose stay supported. (part of #2987) - Arc (Release v22.79.0): Analyzer
ARCCHR0021(info) reports legacy string routing on anEventForEventSourceIdthat spells out a declared definition stream, and offers a code fix that rewrites it toEventSource = typeof(...)andEventStream, so the definition and its concurrency dimensions are kept. (part of #2987) - Stage (Release v4.79.0): The semantic Stage Host settles event-triggered reactions after each command, including
where,runs as,from, productions, invocations, mixed effects and cascades, using Screenplay’s reference settlement. The command’s events and the reactions’ events are appended in one tail-guarded batch; a rejected, denied or unsupported reaction refuses the whole command and appends nothing. (part of #207) - Screenplay (Release v4.144.0): Model notes:
question,taskandnoteentries anchored to a model element’s semantic ID or the application, with an open or resolved state, free-text author, and references to external decisions such asD123. A question can be resolved by a specification, a description, a decision, an external decision, or dismissed. Notes on an element without its own identity attach to its owning slice, feature, module or the application (#391) - Screenplay (Release v4.144.0): MCP tools
list-model-notes(filter by anchor, scope, kind, state or reference;view: "findings"returns onemodel-note.open-questionfinding per open question) andpropose-model-notes(add, edit, resolve, reopen, reanchor and remove), reviewed withread-proposalview: "notes"and written byapplyunder the same recovery journal as the model (#391) - Screenplay (Release v4.144.0): Source, AST, rename, move and property proposals report
orphanedNoteswhen they would retire an element that notes are anchored to. Orphaned notes are kept and listed until they are re-anchored or resolved (#391) - Screenplay (Release v4.144.0):
screenplay check --open-questions report|faillists open questions and, withfail, exits 1 while any remain in the checked scope (#391) - Screenplay (Release v4.144.0): The notes file format is published as
notes-v1.schema.json(#391) - Chronicle (Release v19.52.0):
RegisterEventType<T>()andRegisterEventType(Type)register event types, with optionalWithId,Generation,Public,Private,ForEventStoreandPublishTosettings. Defaults match the identifiers markers produce today. (#4732) - Chronicle (Release v19.52.0):
RegisterReactor,RegisterReducer,RegisterConstraint,RegisterEventSourceandRegisterMigrationregister plain classes withoutIReactor,IReducerFor<T>,IConstraint,IEventSourceor migration markers. A reducer’s read model is inferred from its methods, and a constraint only needsDefine(IConstraintBuilder). (#4732) - Chronicle (Release v19.52.0): A plain migration class with typed
UpcastandDowncastmethods can be registered explicitly, andEventTypeMigration<TUpgrade, TPrevious>gains a constructor that takes the store’sIEventTypes, so migrations between unmarked event generations resolve their identifiers from the owning store. (#4732) - Chronicle (Release v19.52.0):
IReactorsandIReducersgainType-basedRegister,GetStateForandReplayoperations, plus generic extension methods for plain observer classes. (#4732) - Chronicle (Release v19.52.0):
IJsonSchemaGeneratorgains overloads that take the store’sIEventTypes, so compensation schemas resolve explicitly registered target events. Existing generators keep their current output. (#4732) - Chronicle (Release v19.52.0):
ReadModelScenario,ReactorScenarioandEventScenariohonor explicitly registered artifacts, andReactorScenarioaccepts plain reactor classes. (#4732) - Chronicle (Release v19.52.0): Analyzers CHR0001, CHR0002, CHR0003, CHR0005 and CHR0007 accept event types registered through
RegisterEventTypein the same compilation. (#4732) - AI (Release v7.37.0): New skills:
cratis-fundamentals-telemetry(generated metrics and spans with Cratis.Metrics.Roslyn, OpenTelemetry export),cratis-orleans-jobs(durable jobs, steps, storage and lifecycle in Cratis.Orleans),cratis-components-common-controls(ComboBox, ToggleGroup, Tabs, TagGroup, Breadcrumbs) andcratis-components-data-surfaces(PivotViewer, TimeMachine, Canvas, Chat) (#624) - AI (Release v7.37.0): Trigger and behavior evaluations for the Kotlin and Java skills (#625)
- AI (Release v7.37.0): Go evaluations covering older Go minimums, wrapped errors, canceled streams, early iterator exit, borrowed gRPC connections, ambiguous append retries, HTTP HEAD/JSON and v2 import migration, and specs proving the Go rules and skills reach every supported harness (part of #479)
- AI (Release v7.36.0): The Screenplay model-authoring skill teaches
propose-propertyin full: add (Screenplay 4.142.0) with owner, source hops and fixture values, alongside rename and remove, how to choose between a new event generation andeventNeverPersisted, how to readincomplete,needsDecisionandchainCandidates, and the add refusals; evaluations cover add, rename, remove and a refused event change (#597) - Arc (Release v22.78.0): The Screenplay generator recovers generated values from
[GeneratedValue]Handle parameters. A parameter whose concept creates a UUID v4 (Guid.NewGuid()orGenerateValue.Uuid()) becomes ageneratedproperty, orgenerated identifierwhen the command returns it as the event source, andPinGeneratedValuepins in scenarios becomefor "<guid>"andgenerated name = "<guid>"fixtures, so those scenarios round-trip into the model. Other strategies (UUID v7, hex bytes, customNew()bodies, generation context) keep their source form and report information diagnosticSP0073until Screenplay can state them. Commands that create identifiers inline without[GeneratedValue]keep today’s output. See Generating a Screenplay. (part of #3116) - Stage (Release v4.78.0): Event-triggered reactions render as Chronicle reactors:
[Reactor("<semantic id>")]keeps the observer stable across renames,[OnceOnly]keeps replays from repeating effects, awherecondition becomes a guard, invoked commands are returned for Arc to execute, and produced events are appended to the triggering event source without a stream. (part of #207) - Stage (Release v4.78.0): Automation slices render their own commands (zero or more), events, read models, projections, reducers and queries. (part of #207)
- Stage (Release v4.78.0):
STAGE-ESM-039refuses a reaction whose condition, mapping or destination cannot be rendered without changing its meaning, such as a condition on an optional, composite or enumeration value, or a production that does not map every event property. (part of #207) - Stage (Release v4.78.0): The rendering reference has a new page on reaction rendering, covering the reactor identity, replay, ordering and how live retries differ from Screenplay’s reference evaluation: https://github.com/Cratis/Stage/blob/main/Documentation/reference/reaction-rendering.md (part of #207)
- Screenplay (Release v4.143.0): Equality
filterclauses on collection queries bind into the executable model as ESM v14: a filter keeps the rows whose same-named read-model property equals the supplied value, combines withbyas AND, and an optional filter may be omitted (part of #140) - Screenplay (Release v4.143.0): Only models with a query filter select ESM v14; models without filters keep their exact executable-model bytes and revision (part of #140)
- Screenplay (Release v4.143.0): Specifications supply filter values as query arguments in both
then query … argumentsandwhen query, and a query call is identified by its query, key and supplied filter values (part of #140) - Screenplay (Release v4.143.0): ESM v14 golden vector and query filters canonical corpus for consumers to verify against (part of #140)
- Screenplay (Release v4.143.0): Decision record 0069 on admitting equality query filters as ESM v14: https://github.com/Cratis/Screenplay/blob/main/decisions/0069-admit-equality-query-filters-as-esm-v14.md (part of #140)
- Stage (Release v4.77.0): Stage admits exact ESM v13 language/semantic pairs (Screenplay 4.141.0) in the renderer, the Host runtime and the specification executor. Later and mixed versions are still refused with
STAGE-ESM-016. (#345) - Stage (Release v4.77.0): Generated concepts carry their compliance from the model: personal data renders
[PII](also when the concept is a secret too), and a secret renders[Encrypted]with its scope plus[NotAudited].[ComplianceDetails]is not emitted from the executable model. (#345) - Stage (Release v4.77.0): Command inputs that contain personal-data or secret concepts, directly or inside collections, optional values and nested types, render
[property: NotAudited], so their values stay out of the causation chain. (#345) - Stage (Release v4.77.0):
STAGE-ESM-040refuses personal-data or secret concepts used as identities (command and read-model identifiers, event destinations, projection, join and child keys, event-source and stream identifier types) and on enumeration concepts. (#345) - Screenplay (Release v4.142.0):
propose-propertycan add a property along its chain withaction: "add": name the owning declaration, thetype, whether it isoptional, and thehopsthat add the property to other declarations or map it in aproduces,fromorappendblock. A projection that AutoMaps the same name needs no hop. Producers or projections left without a mapping refuse withSourcesRequired, and a required property needs afixtureValuefor every existing specification and example occurrence, or the proposal refuses withFixtureValueRequired. Adding to an event needsnewGenerationoreventNeverPersisted, as rename and remove do (#389) - Arc (Release v22.77.0): The Screenplay generator reports
SP0071when a reactor executes a command and handles its outcome in code (reading, matching or discarding theCommandResult), andSP0072when a reactor recovers from redelivery throughReactorDeliveryreceipts, instead of keeping itsfilereference without saying why. (part of #3094) - AI (Release v7.35.0): A product sync ledger (
.cratis/ai/product-sync.json) records, for each Cratis product, the release the corpus was last synced to and the skills and rules that depend on it; verification keeps it complete and well formed (#619) - AI (Release v7.35.0): A drift report (
yarn workspace @cratis/ai-verification run drift) and a weekly workflow keep one “AI corpus product drift” issue up to date with the releases not yet read into the corpus; private repositories without access are listed as not checked, and an optionalPRODUCT_DRIFT_TOKENsecret lets the workflow check them - AI (Release v7.35.0): New skills:
cratis-arc-hosting,cratis-chronicle-hosting,cratis-chronicle-decision-reads,cratis-arc-testing-kotlin,cratis-arc-identity-and-tenancy-kotlinandcratis-arc-spring-data-kotlin - AI (Release v7.35.0): Experimental Go guidance:
cratis/language/go,cratis/engineering/go,cratis/chronicle/client-goandcratis/arc/goprofiles with Go rules and skills for Chronicle.Go 0.9.1, Arc.Go 0.1.1 and Fundamentals.Go 0.3.2 (part of #479) - AI (Release v7.35.0): An
elixir.mdlanguage rule, so the Elixir language profile carries guidance - AI (Release v7.35.0): The Screenplay skills teach
propose-propertyrename and remove (Screenplay 4.140.0) (part of #597) - AI (Release v7.35.0): Specification examples typed by an event, command or read model imported from another document, with PLAY0520 (#604)
- AI (Release v7.35.0): The auth skill names AuthProxy and its header contract; the application profile points to
dotnet new cratistemplates; the C# rules name the Cratis architecture analyzers (CRARCH)
Changed
Section titled “Changed”- Stage (Release v4.178.1): The semantic Host’s
STAGE-ESM-028refusal for a command that generates agenerate rulevalue now names the concept’s rule as well as the command, property and concept, and the documentation states that this refusal is by design: the Host never runs implementation bodies, so render the application to run a rule generator. The supported Host generation subset is the built-in strategies (uuid,uuidv7,ulid,typeid,nanoid,bytes,patternandrandom). (#510) - Screenplay (Release v4.229.0): The specification documentation now defines where a
givenevent withoutforbelongs: the event source the specification acts on. It also covers how constraints count it, when the reference evaluator reportsUnsupportedinstead of inventing an identity, and how runners that append to real event streams should place it. See Givens without an event source. (#579) - cli (Release v3.88.0): Bundles Stage 4.177.2 (from 4.177.1);
cratis runstartscratis/stage:4.177.2by default, andcratis renderplans with the same renderer. The renderer now takes projections keyed by a payload property or with severalfromblocks (the warehouse movement history of Acme Commerce), which it refused with STAGE-ESM-008 and STAGE-ESM-009 before; the five Acme Commerce domains render, build and pass their 459 generated specifications. - Orleans (Release v1.26.0):
OnStoppedalso runs when the resume hook of a stopped job throws, so it can release whatever the failed hook began. - Orleans (Release v1.26.0): Custom job storage providers must persist the new
StopFinalizedproperty ofJobState. - Orleans (Release v1.26.0): Jobs stopped before this release run
OnStoppedonce more on the first rehydration after upgrading. - AI (Release v7.89.0): The application rules now cover recurring design failures: whether an action is allowed is a read-model property rather than a client-side derivation, settings events record one decision each instead of a whole configuration object, each consumer scenario gets its own read model and dispatch never reads a UI model, provider clients stay behind reactors, a reactor never reacts to its own consequences, prompts live as content rather than string literals, and the third copy of a job shape becomes a shared template. (#411)
- Scene (Release v4.72.0): A Screenplay table (
core:table) draws a row for each row its host supplies for the read model it shows (typeName), and a summary (core:summary) draws the first row’s value beside each field’s label. A host supplies rows as query results keyed by the read model’s name; with none supplied the table still draws only its headings, as before, so a running application whose host binds data its own way is unchanged. - Scene (Release v4.72.0): The preview host gives each read model a Screenplay screen shows (the
typeNameof its data, table and summary elements) the rows of that read model from the sample data pack in effect - a pack’s shapes are the rows of a read model by its name - and gives the query a data element names (core:dataquery) the same rows. A preview of the Acme Commerce screens now lists the sample products, orders and shipments instead of “Nothing here yet” over bare column headings. (collectTypeNamesis exported besidecollectQueryNames.) - AI (Release v7.88.0): The Stage rendering admission reference states what the renderer now takes in projections: a constant key at the root of a scope, running totals (zero start, optional totals, concept-to-number and concept-to-concept conversions, what is still refused), the event source identity in a block keyed by an event property, joins inside children, events declared in a state-view slice, and commands that append to several event sources
- cli (Release v3.86.0): Bundles Stage 4.177.1 (from 4.174.0) and Screenplay 4.226.0 (from 4.216.0);
cratis runstartscratis/stage:4.177.1by default, andcratis renderplans with the same renderer.cratis rendernow admits ESM v29 and v30 models. The renderer takes running totals that start with a zero add or may be absent, running totals that add a concept into a number or into another concept, projections keyed by an event property that read the event source identity, joins inside children, events a state-view slice declares, and commands that append to several event sources; a product operand of a running total is still refused with STAGE-ESM-050 and published events and Translate slices are still refused. All five Acme Commerce domains (Catalog, Storefront, Sales, Purchasing, Warehouse) render with these: the generated application builds with 0 warnings and its 447 generated specifications pass. - Stage (Release v4.177.0): A running total that may be absent (an optional whole number or concept) now renders for add, subtract, increment and decrement; it is refused only when the same total is also cleared or set from a value that may be absent, which Chronicle cannot add to (part of #558)
- Stage (Release v4.177.0): A running total can add a concept into the number it holds, a number into a concept, and a concept into another concept of the same number (the target concept then declares the implicit conversion); a concept into an optional number, or a total of any other type, is refused as STAGE-ESM-017 because Chronicle reads the added event property from a direct member access (part of #558)
- Stage (Release v4.177.0): A projection keyed by an event property can read the event’s source identity (
sku = $eventSourceId) when every command that produces the event addresses it with a value of the target’s type; otherwise it is still refused as STAGE-ESM-017 (part of #558) - Stage (Release v4.177.0): A join inside a children block renders (Chronicle takes the element identity as the join key, so no
Onis emitted) and its mappings count towards the required properties of the element, whichever of the element’s own event and the joined event arrives first; recursive children stay refused (part of #558) - Stage (Release v4.177.0): Events a state-view slice declares are generated with the slice, so a projection can remove with an event no command of the slice produces (part of #503)
- Stage (Release v4.176.0): Projections that add or subtract a product of two event values (
add total by unitPrice * quantity) are refused withSTAGE-ESM-050, because Chronicle’s projection engine adds one event property; the Host and the reference run them. - Stage (Release v4.176.0): An application toolbar button in a layout’s
navigation topbaris reported as omitted withSTAGE-SCENE-NAV-001until Scene’s navigation regions can carry buttons. - Stage (Release v4.176.0): The comparer’s “expected Accepted, got Rejected” failure now carries the rejection details like the reference does.
- cli (Release v3.84.0): Bundles Stage 4.174.0 (from 4.167.1);
cratis runstartscratis/stage:4.174.0by default, andcratis renderplans with the same renderer. The renderer now renders models whose generated C# names collide (a command property named like its command, a query named like its read model or a property of it) by escaping the colliding member with a trailing_and reporting it as STAGE-ESM-050, instead of refusing them with STAGE-ESM-012. It also renders read models with composite keys, scalar absence assertions (then no <ReadModel> <key>), per-run projections with optional scalar properties, per-production event source and stream overrides, and live (observable) queries that push updates to the generated frontend. - AI (Release v7.87.1): The GitHub Actions rule now allows
[skip ci]on a bootstrap commit that changes only bootstrapped wrapper workflow files whose content the source repository’s CI already verified, once the same content has landed with CI running in one canary repository. Package-update bots and any commit touching other files keep normal CI. (#809) - Stage (Release v4.174.0): The conformance matrix no longer lists STAGE-ESM-012 refusals for the renderer where names are now escaped.
- Stage (Release v4.173.0): Two production route shapes are still refused with STAGE-ESM-036 until they are proven equivalent to the reference: an override onto an unkeyed stream under a keyed command route, and an override whose literal stream id is
Default. - Arc (Release v22.128.0): With command read protection enabled, a missing required read model now rejects the command with reason
ruleand the message<ReadModel> '<key>' does not exist., instead ofdependencyUnavailable. Nullable parameters still receive null when the model is missing, and unprotected reads retain their existing behavior. (#3347) - Chronicle (Release v19.90.0): The .NET client now handles different partitions of a reactor or reducer concurrently, while batches for one partition still run in order. Catch-up deliveries no longer time out while they wait behind other partitions in the client. Handlers for different partitions can run at the same time, so a handler that shares non-thread-safe state across partitions must protect it, or set
MaxConcurrentPartitionsto1to keep one-at-a-time handling. (#4664) - Stage (Release v4.172.0):
/stage/routesmarks live query routes with?waitForFirstResult=true, and a plain GET of a live query answers with its current result. - Stage (Release v4.172.0): A live query whose subscription is refused, or whose runtime faults, shows the error instead of loading forever or keeping stale rows.
- Stage (Release v4.170.0): Specifications and the Stage host now run per-run projections whose read models have optional scalar properties. An optional value that no event sets reads back as null instead of 0, false or an empty UUID. Read models with an optional identifier, collections or composite-type properties are still refused, each with its own reason. (part of #512)
- Arc (Release v22.126.0): The new capability refuses anything it cannot certify: cloned, wrapped or root providers, disposed scopes, application-registered readers or validator factories, collections of readers or read tokens, and dependency graphs with cached or opaque services. It runs on JIT only and is refused where dynamic code is unavailable. Parameterless validators, commands with read protection switched on and unprotected commands behave as before. (#2831)
- cli (Release v3.83.0): Bundles Stage 4.167.1 (from 4.159.0);
cratis runstartscratis/stage:4.167.1by default, andcratis renderplans with the same renderer. The release renders protected command reads on commands with append-time constraints, read-backed requirements next to validated request concepts, unique-value constraints fed by a read, projections that set a collection or composite whole, atomic reaction batches, and the specifications of commands whose own rejection or denial precedes a reaction, a refusal of protected reads of a view whose key is not namedid(Chronicle’s guard admits onlyid), the read-absence rejections of reaction-triggering commands, and the replacement of the seeded content of a template slot a screen fills (Scene 4.70.1). - Stage (Release v4.169.1): Stage now builds against Screenplay 4.209.0. (part of #543)
- Screenplay (Release v4.226.0): A command can append to several event sources: a production’s
formay name any required scalar command property, so one accepted command appends an event to the order and another to the product (#859) - Screenplay (Release v4.226.0): A specification can pin the generated values a reaction-invoked command takes with
given generated <Command>.<property> = <value>, so a reaction that creates a purchase order with a generated id is specified, not left unsupported (#858) - Screenplay (Release v4.226.0): A capture over events carries a list across a context boundary whole (
lines = $.lines) or fans out one private event per element withchildren lines identified by sku, andnestedscopes into an object (#857) - Screenplay (Release v4.226.0): The golden, canonical corpus, contract probes, conformance syntax vector and documentation carry them; several event sources and pinned values select ESM v30 (decision 0098)
- Screenplay (Release v4.226.0): The Acme Commerce sample uses all eight admissions (decimals, products, concept conversion, application toolbar buttons, published events, several event sources, pinned generated values, list fan-out) and its workarounds are gone: 173 of 173 specifications pass with no unsupported and no warnings
- Stage (Release v4.169.0): Stage now builds against Chronicle 19.83.4.
- Screenplay (Release v4.225.0): A
Decimalconcept or property can limit its decimal places withdecimals <= N(0 to 28, trailing zeros do not count), so a third decimal onMoneyis refused where it enters (#867) - Screenplay (Release v4.225.0): A projection
addorsubtractcan take the exact product of two event values withby <a> * <b>, so a basket total needs no precomputed line total (#864) - Screenplay (Release v4.225.0): A value of one concept maps to a property of another concept over the same primitive, when the target declares no rule or compliance the source lacks, so an id keeps its own concept on each side of a context boundary (#861)
- Screenplay (Release v4.225.0): The layout’s
navigation topbarregion takes application-levelbutton <id> title "..." slice <Slice>lines with an optional indentedauthorize <Policy>(#868) - Screenplay (Release v4.225.0): A command specification can state the public event its outbound Translate slice publishes, and
PLAY0285no longer calls it unreachable (#866) - Screenplay (Release v4.225.0): The conversions,
decimals <= Nand products select ESM v29; the golden, canonical corpus, contract probes, conformance syntax vector, Monaco completion and documentation carry them (decision 0098) - AI (Release v7.87.0): Documents the Screenplay ESM v29 and v30 admissions of decision 0098: the
decimals <= Nrule,add/subtractby a product, mapping between concepts over one primitive, application toolbar buttons, command specifications that state the published event, several event sources,given generatedfor reaction-invoked commands, and list copy and fan-out in captures over events (#805) - AI (Release v7.87.0): Corrects the statements that fanning out to another event source does not run and that reaction-invoked generated values cannot be pinned
- Stage (Release v4.168.0): Modeled specifications and the semantic Host now run models whose generated C# names would collide, such as a command property named like its command or a read-model property named like one of its queries. Only the Cratis renderer still refuses these, naming the colliding declaration; the run surfaces keep refusing property names that differ only by case and names Chronicle cannot map. (part of #502)
- AI (Release v7.86.0): The pull request rule’s guidance on grouping related changes now points to the consolidation guard. (#413)
- Stage (Release v4.167.1): The Cratis renderer refuses
STAGE-ESM-044for a command that reads a view whose key property is not namedid. Chronicle’s decision-read guard looks for anidproperty in the read model’s schema and refuses anything else (KeyConversion), so the rendered command could never succeed: every execution failed with “give the read model a string or Guid Id”. The refusal names the command, the read and the key property, and says to rename the key property and the query’s key argument toid. (#557) - Stage (Release v4.167.0): A specification that expects a protected read to find nothing (
<ReadModel> '<key>' does not exist.) renders although the command’s event triggers a reaction: a refused command appends nothing, so no reaction runs (STAGE-ESM-011no longer refuses it). The refusal stays when a command a reaction invokes reads the same read model, because the message is then ambiguous. (#503) - Chronicle (Release v19.88.1): The kernel’s MongoDB, SQL and in-memory storage can now hold the state that observer type-set changes and failed-partition recovery will need. That is type-set membership and per-connection registrations, retirement results, the pending type-set change, and the recovery cursor, owner and handler holds for failed partitions. It also covers definition-change progress, restart plans, inventory and terminal outcomes. Nothing writes this state yet, and existing observer and failed-partition data keeps loading unchanged. SQL gets one nullable observers column and a definition-change rows table. (part of #4955)
- Chronicle (Release v19.88.1): The kernel refuses to activate an observer whose stored state needs a newer kernel. That is an observer that has started or finished type-set initialization, or one in an event store whose observers are initialized. The kernel logs an error naming the observer instead of reading the state. Existing stores are not affected. (part of #4955)
- Chronicle (Release v19.88.1): Updated Cratis.Orleans to 1.23.4. Job recovery retries failed manager initialization after a rolling restart, and resuming a job continues starting other steps when one step fails to start. Stopping or removing a job after a kernel restart now works, and a job cancelled without a result no longer reports an empty partial result.
- Stage (Release v4.166.0): The Cratis renderer emits projections that set a collection or composite read-model property whole from an event property of exactly the same required type (
lines = lines,shipTo = shipTo) instead of refusing them withSTAGE-ESM-017; a whole compositeSetnow counts as establishing the composite for the required-properties check. Optional collections and element-level mappings stay refused. (#558) - Stage (Release v4.166.0): A command can map a required collection or composite value read through a protected read into an event property of the same type instead of being refused with
STAGE-ESM-044. (#557) - Stage (Release v4.166.0): A specification that expects the caller to be denied by the triggering command’s authorization renders although the command’s event triggers a reaction: a denied command appends nothing (
STAGE-ESM-011). (#503) - Stage (Release v4.165.0): Stage loads a model whose execution plan has problems confined to one slice instead of refusing the whole model with
STAGE-PLAN-004. Specification runs, the Host and the renderer run the supported artifacts and refuse only the affected commands, queries and read models with a typedSTAGE-PLAN-004refusal; problems that affect the whole model, such as concept validation, still refuse loading. (#501) - Stage (Release v4.165.0): A keyed query with cardinality
Oneis refused per query with a typed refusal instead of blocking every other slice; a specification can no longer pass on such a query only because it has no events and expects no results. (#501) - Stage (Release v4.165.0): The Host’s read-model browser API and snapshot queries report a refused read model as refused instead of returning it as empty. (#501)
- Arc (Release v22.125.0): On JIT, a composite key type without a generated accessor or registration is still validated through reflection, and Arc now logs a warning once per such type naming it, so it can be registered before strict validation becomes the default in a future major release. (#3392)
- Stage (Release v4.162.0): The Cratis renderer now renders ESM v22 models that declare
reaction batches atomic. Each generated reactor handler returns a trigger occurrence’s direct productions as one event collection, which Chronicle appends as one all-or-none batch; a selected invocation refusal branch appends as its own batch. Atomic reactions with several production triggers on the same event, and routed direct productions, still refuse withSTAGE-ESM-043, naming the reaction. Models without the declaration render unchanged. (#422) (part of #503) - cli (Release v3.82.0): Bundles Stage 4.159.0 (from 4.154.1);
cratis runstartscratis/stage:4.159.0by default.cratis renderand Studio keep rendering with the same Stage. The release carries the arrangement conversion Studio needs to export an own shell with its arrangement (Cratis/StudioIssues#816) and the Chronicle 19.83.0 pin of the generated solutions - Stage (Release v4.161.0): Rendering refuses a Scene with error conversion diagnostics instead of failing with an exception, and the scene synthesizer and Host routes collect the diagnostics so an unsupported construct no longer aborts the request. (#532)
- Stage (Release v4.160.0): The Cratis renderer no longer refuses
STAGE-ESM-044for a command that has protected reads and produces an event under an append-time constraint. The rendered application, the Stage executor and the reference evaluator fail in the same order: a missing read, then the requirements, then the constraint. Still refused withSTAGE-ESM-044: a read path in aproduces whencondition or destination, a read-path mapping to an optional/collection/composite/differently typed property, and reads combined with generated-value freshness scopes. (#557) - Stage (Release v4.160.0): A command whose event takes a unique-value constraint’s value from a protected read renders (the validator no longer assumes the constrained mapping is a command property).
- Stage (Release v4.160.0): A protected command may now combine its read-backed requirements with validated request concepts (
STAGE-ESM-005no longer refuses it). Requirements of a protected command are guards inHandle, so the order is concept validation, then the reads, then the requirements, the same as the reference. Commands without reads keep the refusal. (#409) - Stage (Release v4.160.0): A specification that expects the triggering command’s own rejection (a message only that command declares) renders although the command’s event triggers a reaction: a rejected command appends nothing, so no reaction runs (
STAGE-ESM-011no longer refuses it). (#503) - Stage (Release v4.159.0):
ArrangementConverter.ToSyntaxconverts a Scene flow or freeform arrangement (layouts, screen templates and dialog templates) back into the ScreenplayArrangementSyntaxit is written as, the inverse ofArrangementConverter.Convert, so a host that holds Scene declarations (Studio’s own shell exported as a screen template) can write the arrangement as typed Screenplay instead of dropping it (part of Cratis/StudioIssues#816) - Screenplay (Release v4.220.1): A query with a
performerblock is now an opaque read: it is listed as code the model needs (PLAY0270information) and left out of the executable model, instead of making every declaration and specification of the applicationunbound(PLAY0268). A specification that reads such a query is left out; everything else keeps running withscreenplay test. (#862) - Screenplay (Release v4.220.1): The Acme Commerce Purchasing dashboard is now composed by a performer; the workaround is gone.
- Chronicle (Release v19.84.0): The .NET client sends several guards for one event source only to a kernel that advertises support for them. Against an older kernel it keeps refusing with
IncompatibleConcurrencyScopesForEventSource, and never drops a guard. (#4818) - Arc (Release v22.124.1): The proxy generator no longer re-reads every type of every project assembly for each type it collects, and no longer scans lists for membership or all generated files per index directory, which made generation grow quadratically with solution size (#3400)
- Arc (Release v22.124.1): Embedded Screenplay document generation is skipped when none of the sources, references, analyzers, settings or generator it depends on changed since the last build; the previous documents are reused. A build that reported a warning always runs again so the warning is shown again (#3399)
- Arc (Release v22.124.1): Embedded Screenplay documents for each scope are produced in parallel, and sources and references are parsed and loaded in parallel, keeping the same output and diagnostic order (#3399)
- Arc (Release v22.124.0): The generated Screenplay now omits properties whose type a Screenplay document cannot name — dictionaries, constructed generics such as
KeyValuePair<TKey, TValue>, interfaces, abstract or plain classes, and collections of them — with WarningSP0030naming the property and its original type, instead of substituting another type or a name nothing declares. Representable sibling properties remain. Commands, projections, reactions, queries, screens and scenarios that depend on an affected type are withheld withSP0030orSP0039rather than restated over fewer fields. See Properties without a Screenplay type. (#2527) - Stage (Release v4.158.0): Specifications whose seeds cannot be represented faithfully are refused with a typed reason instead of running: partial or null seeds of projected read models, and seeds of read models built by an opaque reducer. (part of #15)
- Stage (Release v4.158.0): Stage now uses Chronicle 19.83.0, and the Host image runs the matching Chronicle kernel. (part of #15)
- Stage (Release v4.157.0): A Stage release now publishes the npm runtime package before the NuGet packages, and the release fails when any of its npm, NuGet or Docker publications fails. (part of #499)
- Screenplay (Release v4.218.1): When a query policy names one of the query’s filters, PLAY0273 now says that policies read only the query’s
byargument, not filters, and suggests declaring that argument withby, instead of reporting that the path does not resolve. (#789) - cli (Release v3.81.0): Bundles Stage 4.154.1 and Screenplay 4.216.0;
cratis runstartscratis/stage:4.154.1by default (#402) - cli (Release v3.81.0):
cratis renderadmits ESM v1 through v28: Uuid==and!=comparisons inrequireandproduces whenrender; ESM v29 and later are refused withCLI-RENDER-004(#402) - cli (Release v3.81.0): Resolved C# validation rule bodies now render into validators instead of being refused with
STAGE-ESM-005; bodies that do not compile or read members Stage does not supply reportSTAGE-ESM-019,STAGE-ESM-022orSTAGE-ESM-015(#402) - cli (Release v3.81.0): The Stage Host defaults to the semantic engine and the
eventmodelengine is deprecated;cratis run --engine eventmodelstill works but Stage warns at startup (#402) - Arc (Release v22.123.0): Generated TypeScript proxies take their file header from the
CratisProxiesFileHeaderMSBuild property, or else from the project’s.editorconfigfile_header_template, and are written without a header when neither is set. SettingCratisProxiesFileHeadertononeturns the header off. Projects that relied on the Cratis MIT header without configuring one now get no header; addfile_header_templateto.editorconfigto keep it. See Proxy generation configuration. (#3329) - AI (Release v7.83.0): The toolchain, specifications and scenario-coverage skills describe reference-runner refusals of unadmitted projections (
UnsupportedEventContext,UnsupportedProjectionBlock) as scoped per specification: only specifications that reach the projection or its read model report unsupported, the rest run, andplanIssueslists the deferred issues (#779) - Stage (Release v4.156.0): The specification executor and the semantic Host now run ESM v22 models that declare
reaction batches atomic. Each trigger occurrence’s direct productions, and each selected refusal branch, are validated as one unit before anything is appended: a mapping failure, constraint violation, projection refusal or exhausted fact budget appends none of that unit, while earlier successful units remain in the executor. Invoked commands stay separate units, constraint refusals keep their authored message and constraint name, and property-value claims reserved within a batch stay reserved until the batch ends. The live Host keeps its stricter boundary and rolls back the whole initiating command if any unit fails. Models without the declaration keep per-fact reaction execution. The Cratis renderer still refuses atomic batches withSTAGE-ESM-043. (part of #422) - Arc (Release v22.122.1):
Cratis.Arc.ChronicleandCratis.Arc.Chronicle.Testingnow require Chronicle 19.82.0. - cli (Release v3.79.0):
cratis chronicle jobs stopandjobs resumenow report why the kernel refused the request (job not found, already concluded, not running, not persisted, nothing took it forward) in text and JSON output, and exit non-zero. They no longer claim success when the kernel refused. The Workbench job actions show a refusal as a failure too. - cli (Release v3.79.0): Updated to Chronicle 19.83.0 client packages.
- AI (Release v7.81.0): The contribution guide asks for changes to rules, skills, agents, hooks and prompts to be reviewed with the same care as code, and explains what the new check flags. (#755)
- AI (Release v7.80.0): The corpus pins Screenplay 4.213.0. The model-authoring skill teaches that application, module, feature and slice containers get identities before the model binds, so notes anchor to them while modelling. It also covers:
- AI (Release v7.80.0): reading the identity and incomplete-document reports from
open-workspaceandworkspace-state; - AI (Release v7.80.0): why the notes tools refuse targets;
- AI (Release v7.80.0): preferring
propose-renameandpropose-moveover manual renames, which needsemanticRenames. - AI (Release v7.79.0): The code, security and performance review skills, the reviewer agents and the review prompts and coordinators share one report shape: Blockers, Suggestions, Dismissed (with reason), Verdict, and what the review did not examine. An empty Blockers section is a complete review, a blocker states its consequence, and the blocking marker is reserved for issues that must be fixed before merge. Each skill keeps its own risk categories, mapped onto the shared verdict. (#366)
- Stage (Release v4.153.0): Command rules and concept rules with a resolved C# body that returns
boolnow render into the generated command and concept validators through an app-local typed context, instead of being refused withSTAGE-ESM-005. A rule without a message gets the defaultA value does not satisfy the '<kind>' rule.(part of #513) - Stage (Release v4.153.0): A validation rule body that reads
Tenant,CausedByorOccurredis refused withSTAGE-ESM-015, naming the member; bodies must pass the same pure gate as reducer and policy bodies. (part of #513) - Stage (Release v4.153.0): Rendering an inline
generate rulefactory requires the implementation requirements and resolved contents from the same Screenplay compilation; the documentation now says so. (part of #513) - Stage (Release v4.153.0): Command and concept code-validation bodies written as iterators (
yield returnof messages) now render into the generated validators; interpolated messages are formatted with the invariant culture so they do not change with the host culture. Other constructs the pure gate refuses stay refused. (part of #513) - AI (Release v7.78.0): Stage skills cover releases through 4.146.0. This adds exact ESM schema admission through v27 and rendered chronological command comparisons (
DateOnly,DateTimeOffset, explicit offsets), including the comparison shapes Stage still refuses. (#773) - AI (Release v7.78.0): Arc and Chronicle skills cover Arc through 22.117 and Chronicle through 19.81.1. New guidance covers occurrence command execution, storage resolution, namespace removal, projection rollout and reconciliation,
StartAtTail, and conflict details with refusal recovery. Corrected guidance covers internal static query exposure, validation member casing, React query-key state, and all-event child mappings. (#773) - AI (Release v7.78.0): The Screenplay skills explain model notes split across files and checks aligned with Screenplay 4.212. (#768)
- AI (Release v7.78.0): The corpus pins Screenplay 4.212.3. The toolchain skill documents PLAY0801
DuplicateEventInProjectionScope. The projections skill explains that a projection uses each event type once per level (the root, onechildrenblock, onenestedblock or one variant). If the domain has a genuinely different second fact, model it as its own event instead of reusing one event in twofromblocks. (#769) - Stage (Release v4.152.0): The Stage runtime executes every command through the registered Arc command proxy, configured like
useCommand, instead of its ownfetch. Arc now checks required command properties in the browser before the call, the same rule the server enforces. (part of #499) - Stage (Release v4.152.0): The live Stage’s
/stage/routesalso returns each command’s JSON schema, keyed by the command’s full name, so the Stage can build a proxy for every command, including commands with the same name in different modules. (part of #499) - Stage (Release v4.151.0): Plans rendered without the opt-in, and their digests, are unchanged; a partial plan’s digest includes its refusals. (part of #500)
- AI (Release v7.77.0): Twelve skill descriptions have sharper, distinct triggers and point to their sibling skills, so similar skills no longer compete. This covers the Chronicle Elixir, Kotlin and TypeScript clients, Arc validation and queries across languages, the React and slice specification skills, and the CodeScene refactoring and safeguarding skills. (#754)
- Stage (Release v4.150.0): Admit ESM v28 models (Screenplay 4.206.0): Uuid
==and!=in commandrequireconditions andproduces whenguards now run in the semantic Host and specification executor, comparing canonical lowercase hyphenated Uuids ordinally, including through concepts and protected read paths; non-canonical Uuid input is rejected before any requirement runs. The Cratis renderer renders these comparisons as Guid comparisons, including protected read paths inrequire, and turns a Uuid literal intoGuid.Parse(...)instead of comparing a Guid with text. The legacy engines refuse Uuid comparisons withSTAGE-ESM-049. (#487) - Arc (Release v22.121.0): Only
publicstatic methods on a[ReadModel]become query endpoints and get generated proxies.internal,protectedandprivatestatic methods are no longer exposed, also when they carry the query marker. Apublicstatic query on aninternalread model type still works. The new analyzer warning ARC0029 reports a non-public method that looks like a query, so an endpoint that disappeared after upgrading is explained at build time. (#3368) - Stage (Release v4.149.0): A read model whose projection uses an unsupported construct (for example a projection
sequenceorvariant) is kept without its projection and records the projection’s name; each unsupported construct is reported as an error. Additional projections on a read model are now reported as a warning instead of being dropped silently. (#531) - Stage (Release v4.149.0): Unknown arrangement nodes, container kinds, place sizes and size classes are reported as diagnostics, and render planning reports an unsupported arrangement as a finding instead of throwing. Rendering refuses a model with conversion errors. (#531)
- Chronicle (Release v19.83.0):
ReadModelScenario<T>:Given.ForEventSourceId(id).ReadModel(instance)now seeds the starting state for that read-model key. Events for the key apply on top of the seeded instance (setters, arithmetic and children), a reducer receives it as its current state for the key’s first event, other keys start from the normal initial state, and a seeded key is returned byInstancesandInstanceForEventSourceIdeven without events. Previously the seed was only returned byIReadModels.GetInstanceByIdand was ignored by the fold. Read models without a projection or reducer keep the lookup-only behavior. (#4846) - Chronicle (Release v19.83.0):
ReadModelScenario<T>: seeding the same key twice throwsReadModelAlreadySeeded. (#4846) - Stage (Release v4.148.0): The Stage Host (and the Stage Docker image) runs the semantic engine when no engine is configured. To keep the previous behavior, start the Host with
--engine=eventmodelor setStage__Runtime__Engine=eventmodel. The SpecRunner default is unchanged. (part of #23) - AI (Release v7.76.0): The corpus pins Screenplay 4.212.4. The projections skill explains that
automaporno automapon a joined event decides auto-mapping for that joined event alone; without one, it follows its level. Warning PLAY0380 is described as covering onlyallinsidechildrenornested. (#772) - Arc (Release v22.119.0): The query health endpoint (
QueryHealth.ObserveHealth) now requires an authenticated user outside Development, over HTTP and both observable-query hub transports. It stays anonymous in Development. SetCratis:Arc:QueryHealth:RequireAuthenticationtofalseto keep it anonymous everywhere, or setRolesto restrict it further. (#2873) - Chronicle (Release v19.82.2): An append whose stored outcome the kernel cannot confirm now fails with the
AppendOutcomeUnknownerror instead of reporting success or a plain failure. The events may or may not be stored, so do not retry blindly. Read the event source’s events and append again only if none carries the attempt’s correlation id. See Appending events. (#4895) - Chronicle (Release v19.82.2): While a unique or closing constraint index that governs an append still needs repair, the append fails with the
ConstraintIndexUnavailableerror and nothing is stored. Retry it unchanged after a short delay. (#4895) - Chronicle (Release v19.82.2): A constraint reindex no longer requires appends to stop. The rebuild hands its progress back to the event sequence, which restores claims and closures written while it ran. (#4895)
- Screenplay (Release v4.213.0): Modules, features and slices get identities as soon as the model parses, even when it does not bind yet, so model notes anchor to the element you name while you are still modeling. The identity an element has before binding is the one it keeps once the model binds; renames and moves before the first binding keep it through migrations, as for bound models. See decision 0093. (#885)
- Screenplay (Release v4.213.0): A container address claimed by more than one declaration, or whose identity collides with another, gets no identity and is reported; note requests that target it are refused. While a document does not parse or place, no new identities are assigned and the incomplete documents are reported. (#885)
- Screenplay (Release v4.213.0): Renaming an identified module, feature or slice by hand through
propose-astorpropose-sourceneeds explicitsemanticRenames, now also on models that do not bind. (#885) - AI (Release v7.75.0): The general rule, the Pi quality-gate tool description and the hooks README name both configuration files:
- AI (Release v7.75.0): the shipped defaults in
.cratis/ai/hooks/scripts/quality-gates.json; - AI (Release v7.75.0): project overrides in
.cratis/ai/quality-gates.project.json. - Arc (Release v22.118.0):
IOccurrenceCommandExecutorrefuses an immediate (non-transactional) append inside a keyed occurrence command before it is sent; the attempt fails with nothing appended and no effect receipt. Use the unit of work (.Transactional) for appends in occurrence commands. See Executing commands for occurrences. (#3354) - Arc (Release v22.118.0): Updated Cratis.Chronicle to 19.81.0. (#3354)
- cli (Release v3.78.0): Bundles Stage 4.146.0 and Screenplay 4.212.2;
cratis runstartscratis/stage:4.146.0by default (#395) - cli (Release v3.78.0): A model
cratis renderrefuses now lists every independent refusal at once, so fixing it no longer reveals new refusals one render at a time (#395) - cli (Release v3.78.0):
cratis runon the semantic engine refuses only the commands and queries that reach a reducer or code-bodied validation, withSTAGE-IMPL-003, and runs the rest of the model (#395) - cli (Release v3.78.0): Rendered applications pin Arc 22.112.1 and Chronicle 19.78.0 (#395)
- Stage (Release v4.147.0): The specification executor and the semantic Host no longer refuse a whole model because a command has a described handler (ESM v23). A specification or command that reaches the handler body is reported as Unsupported with the new
ImplementationBodycapability, after authorization and validation have run, so denied and invalid outcomes for that command, and every specification that does not reach the handler, still run. The Cratis renderer still refuses described handlers withSTAGE-IMPL-002. (part of #316) - Stage (Release v4.147.0): Specification run reports can now carry the
ImplementationBodycapability. A reader built against an earlier Stage version rejects that value. - Stage (Release v4.146.0): The Cratis renderer runs every independent admission check — version features, implementation envelopes, typed contexts, event lineage, slice and specification admission — and lists all their refusals together, so fixing a model no longer reveals new refusals one render at a time. A model refused by the target profile or by an unaudited ESM version still stops at that refusal first. A refusal reported by two checks is listed once. Refusals collected before an unexpected model shape is reached are no longer lost. Plans that render are unchanged. (part of #500)
- AI (Release v7.74.0): A decision call no longer appends
DecisionUsageRecorded, and a provider usage refresh no longer appendsAIProviderUsageSnapshotRecorded. Decision usage is reported on theCratis.AI.Decisionsmeter: the counterscratis.ai.decision.input_tokens,cratis.ai.decision.output_tokens,cratis.ai.decision.calls,cratis.ai.decision.decisionsandcratis.ai.decision.choices, taggeddecision.engine,modelandtopic. Provider usage is reported on theCratis.AI.Providers.UsageReportingmeter as the gaugecratis.ai.provider.consumed_tokens, taggedproviderandavailability. Add both meters to your OpenTelemetry setup to collect them. (#651) - AI (Release v7.74.0):
AllAIProviderUsageSnapshotskeeps its name and result shape. It is now served from the in-process usage cache and only returns the providers configured in the current namespace. After a restart it is empty until each provider’s usage is refreshed again. - AI (Release v7.74.0):
DecisionUsageForLastThirtyDaysno longer receives new data, because nothing appendsDecisionUsageRecordedany more. - AI (Release v7.74.0): The constructors of
ProviderUsageLevelsandDecisionUsageRecorderno longer takeICommandPipeline, andIRecentUsageSnapshotshas a newObserve()member. This only matters if you construct these types or implement the interface yourself. - AI (Release v7.74.0): Cratis.AI now depends on Cratis.Fundamentals 7.25.1 (was 7.19.4).
- Stage (Release v4.145.0): The specification executor refuses only the specifications that reach a reducer or a validation implementation body, and the semantic Host refuses only the commands and queries that reach one. Previously a single such body anywhere refused every specification and every command. A body is reached through the command under test, commands invoked by reactions, concept rules on command properties and query arguments, and reducers fed by given, appended or produced events, including events from an action expected to be refused. (part of #513)
- Stage (Release v4.145.0): These refusals carry the new diagnostic code
STAGE-IMPL-003, naming the body the specification or command reaches. (part of #316) - Arc (Release v22.117.0): Updated Cratis.Chronicle to 19.77.2 and Cratis.Metrics.Roslyn to 7.25.0. (part of #3288)
- Chronicle (Release v19.80.0): Cratis.Orleans is updated to 1.23.0.
- Chronicle (Release v19.80.0): A step that times out is run again, up to five attempts, before its partition is reported as failed, so a busy observer no longer turns into a cascade of failed partitions. (part of #4991)
- Chronicle (Release v19.80.0): A failed job step records one short message instead of a multi-kilobyte stack trace. (part of #4644)
- Chronicle (Release v19.80.0): Replay keeps at most 16 partition steps active at once instead of starting all of them. (part of #4991)
- Chronicle (Release v19.80.0): A job recorded as Running whose steps all concluded more than two minutes ago is no longer treated as running, so
observers replaystarts a real job and a replaying observer without a live job is routed again. (part of #4991) - Chronicle (Release v19.80.0): The replay-complete notification to the observer is retried instead of being fired once and forgotten. (part of #4991)
- Chronicle (Release v19.80.0): Observers coalesce handled-event counts and failure follow-up writes, which takes load off the observer grain. (part of #4991)
- Chronicle (Release v19.80.0): The kernel statistics projections are no longer fully replayed on every restart, and superseded read model generations are deleted after a replay. (part of #4692) (part of #4644)
- Scene (Release v4.69.0): The
Drawermenu mode now opens an off-canvas menu over a dimming scrim, andOverlayno longer dims; the hover-driven rail isRevealalone. A touch width now always resolves to Drawer (#196) - cli (Release v3.77.0): Bundles Stage 4.143.0 and Screenplay 4.211.2, so the rendered application scenarios require the custom two-column manual command form (part of Cratis/Screenplay#721)
- cli (Release v3.77.0): Rendering refuses an unknown runtime package or a missing layout through Stage’s own profile input resolution, so Studio and the CLI refuse identically (part of Cratis/Screenplay#722)
- Stage (Release v4.144.0): Generated applications pin Arc 22.112.1 for both the .NET and the frontend packages, Chronicle 19.78.0 with the
cratis/chronicle:19.78.0-developmentkernel image, and on the frontend Fundamentals 7.25.1 and Components 4.29.0. Existing applications see the new versions on their next regeneration. (#493) - Stage (Release v4.144.0): Stage itself builds and ships with Arc 22.112.1, Chronicle 19.78.0 and Fundamentals 7.25.1, and its bundled kernel image is
cratis/chronicle:19.78.0-development. (#493) - Orleans (Release v1.23.0):
IJobsManager.Stopnow returnsResult<StopJobError>instead ofTask; update callers that await it as a plain task if they need the outcome. - Orleans (Release v1.23.0): A running job is watched: it counts its steps in storage and finalizes itself when every step is done, counting
FailedandCompletedWithFailureas failed, instead of stayingRunningwhen a step’s report never arrived. - Orleans (Release v1.23.0): A step persists its terminal status first and then delivers it to the job, retrying with backoff until acknowledged. A delivery that never succeeds no longer marks the step failed; the job accepts each outcome once per step and attempt.
- Arc (Release v22.116.0): Subscribing to a query without
[AllowAnonymous]or a guest policy over the hub’s WebSocket or SSE transport now applies the host’s default authorization before the query runs, as a direct request to that query does. A caller the host would turn away receives an Unauthorized frame, and SSE subscribe returns 401.[AllowAnonymous]and guest-policy queries stay reachable anonymously. (#2952) - Arc (Release v22.116.0): Non-observable queries performed over the hub now pass the registered emission guards before their result is sent. A guard that denies sends Unauthorized; a guard that suppresses sends nothing. (#2955)
- Arc (Release v22.115.0): Validation results now always report their members as camelCase field paths (
name,address.street,items[0].name), the same form command and concept validators already used. Server-side assertions againstValidationResult.Membersmust use the camelCase field path instead ofnameof(Property). - AI (Release v7.73.0): The model-authoring skill teaches that one proposal may remove and add unrelated references together, that only a reference with the same text both removed and added is refused, and how to read the located conflict’s document, path and occurrences instead of splitting the batch. Use
propose-moveor a semantic migration to keep a moved reference’s identity. (#762) - AI (Release v7.73.0): The Screenplay skills describe a file or inline command handler as refused with
PLAY0800, whose requiredsubjectargument names the command: a permanent limitation that is gap-filled in code, not something a later ESM version adds.PLAY0268keeps meaning “not representable in a supported ESM version yet”. (#761) - AI (Release v7.73.0): The pinned Screenplay compiler, standalone tool and contract move to 4.211.1.
- Stage (Release v4.142.0): The semantic Host decides a command on the session world, then reads the facts other writers appended since and commits the decision against them. Only an outside fact the decision depends on turns the command into a concurrency conflict; unrelated outside facts are absorbed and the session continues. Refusals keep their outcome. A batch whose write loses the race is retried with the same decision only when its reactions invoked no commands. (#474)
- Stage (Release v4.142.0): Stage now builds against Screenplay 4.206.0.
- Arc (Release v22.114.0): Protected-read refusals PLAY0781–PLAY0785 are attributed to the affected command and read through Screenplay’s typed diagnostic arguments, and each refused read is reported separately. (#3344)
- Arc (Release v22.114.0): Updated Cratis.Screenplay to 4.208.0. (#3344)
- Stage (Release v4.141.0): Applications Stage renders and scaffolds now target Arc 22.112.0.
- Stage (Release v4.141.0): The renderer still refuses, with
STAGE-ESM-046naming the property, a compared DateTime concept that carries compliance or is optional, and a compared DateTime property whose name is not camel case. - Stage (Release v4.141.0): For a command with an authorization policy, an unauthorized caller sending an unbindable date body gets a validation error rather than 403, because Arc binds the body before evaluating Stage’s named policies (Cratis/Arc#3341).
- Screenplay (Release v4.211.2): The canonical screen-composition corpus renders a manual two-column command form (1fr and 2fr columns, a 24px gap and a field spanning both columns) so live Stage and generated React are held to the same grid geometry. (#721)
- Screenplay (Release v4.211.0):
propose-source,propose-astand the other authoring tools accept a batch that removes one reference and adds an unrelated one, the same as proposing the two edits one after the other. A batch is refused only when a reference with the same text is both removed and added, because its identity cannot be told apart from a move; usepropose-moveor semantic migrations for a real move. See reference continuity. (#783) - Screenplay (Release v4.211.0): MCP responses write document identities and document paths as plain strings:
conflicts[].document,conflicts[].pathandconflicts[].otherPath, and the document fields in apropose-movereport. A conflict without a document reportsnull. (#783) - Screenplay (Release v4.210.0): A file or inline command handler is now refused with its own error code
PLAY0800(command handler requires a constrained implementation attachment) instead ofPLAY0268, with a requiredsubjectargument naming the command.PLAY0268keeps meaning a construct is not representable in a supported executable model version yet, so tools can tell a permanent limitation from one that a later version admits. Tools that matched the handler refusal byPLAY0268and its message text switch toPLAY0800. See the diagnostics reference. (#852) - AI (Release v7.71.0): The Screenplay command-surface skill teaches that, from Screenplay 4.209.0, a protected read whose key (or any part of a composite key) is a shape the event store refuses rejects as missing state, even when an instance is stored at that key. The refused shapes are empty, whitespace-only, exactly
*, containing#, and leading or trailing whitespace. Only protected reads change, and the skill shows how to keep such keys out of read keys. (#756) - Stage (Release v4.140.0): Bundles Scene 4.68.2 (engine and model NuGet,
@cratis/scene.*and the default blueprint on npm), which carries the template layout and contrast fixes this vector found; the frozen render digests that embed the scene pin are refreshed. - Stage (Release v4.140.0): A new
Verification/blueprint-templatesvector: the default blueprint’s MasterDetail, Dashboard and ProfileSettings screen templates are applied to screens inmodel/templates.playand rendered (a) on the live Stage image (nothing approved, the blueprint ships in the Stage) and (b) in a generated React application built the way its author would (Debug backend with generated Arc proxies, npm install, frontend build). The browser scenario asserts, per template, that every slot is filled, the page does not overflow, the grid layout holds and axe finds no WCAG A/AA violation. Both run in CI (livejob step and a newgenerated-react-blueprint-templatesjob). - Screenplay (Release v4.209.0): A protected command read whose key, or any part of a composite key, is a shape the event store refuses (empty, whitespace-only, exactly
*, containing#, or with leading or trailing whitespace) now rejects with the sameValidationoutcome and message as a missing view, even when the world holds an instance at that key. Other uses of such a key, including command identifiers, are unchanged. The canonical protected-reads corpus gains vectors for these shapes so hosts can prove they map their store’s refusal to this outcome. See decision 0091 and Keys the event store refuses. (#843) - AI (Release v7.70.0): The Screenplay and Stage skills teach that rendering admits concepts with
generate ruleand emits the attached C# body as the concept’s generation factory, withSTAGE-ESM-019,STAGE-ESM-020andSTAGE-ESM-022for bodies it refuses, while the Host and the legacy syntax engine still refuse commands that generate such a value withSTAGE-ESM-028. (#752) - AI (Release v7.70.0): The skills teach ESM v27 composite read-model keys downstream: the semantic Host runs them, the specification executor refuses specifications over them, and rendering refuses them with
STAGE-ESM-047andSTAGE-ESM-048.cratis renderfrom CLI 3.75.0 admits ESM v1–v27 and blocks v28 withCLI-RENDER-004. (#752) - AI (Release v7.70.0): The skills teach that Stage 4.138.0 renders protected command reads as Arc read protection, which reads it still refuses with
STAGE-ESM-044, and thatcratis rendergets this from the first CLI that bundles Stage 4.138.0. (#752) - AI (Release v7.70.0): The skills describe
cratis run’s semantic engine as the default (CLI 3.73.0;--enginesince 3.64.0) and the EventModel engine as legacy, no longer recommending it as a fallback. (#752) - AI (Release v7.70.0): The toolchain and event-modeling skills state that the language is frozen at ESM v1–v28 and link the freeze decision: model with what v1–v28 offers and report a typed refusal downstream as a platform gap. (#752)
- AI (Release v7.70.0): The protected-reads reference lists the typed arguments of PLAY0781–PLAY0785 and the published
reasonkeywords, so tools read the arguments instead of parsing message text. (#751) - Arc (Release v22.113.0): A read-protection conflict now says which event changed the read model when Chronicle reports it, for example “BookStock ‘isbn-1’ changed after BorrowBook read it (BookBorrowed at 1042)”, and the validation result’s state carries the event type and sequence number (#3242)
- Arc (Release v22.113.0): Arc uses Chronicle’s public
SuspendReadRegions()for nested commands instead of reflection, and requires Chronicle 19.76.0 (#3242) - Stage (Release v4.139.0): Stage now audits ESM v22 models (
reaction batches atomic) instead of refusing them as an unknown version withSTAGE-ESM-016. Rendering and the Host refuse atomic reaction batches withSTAGE-ESM-043, and the rest of the model is checked as for v23 and later models. Running and rendering atomic batches follows in a later release. (part of #422) - cli (Release v3.76.0): Bundles Stage 4.138.0:
cratis renderuses its renderer andcratis runstartscratis/stage:4.138.0by default. (#388) - cli (Release v3.76.0):
cratis renderrenders ESM v25 protected command reads (command reads protected) as Arc read protection: each command withreadsgets[ReadProtection(On)]and a read-modelHandleparameter per read. Reads Stage cannot render faithfully, such as reads combined with constrained events or read paths inproduces when, are still refused withSTAGE-ESM-044, which now names the reason. See cratis render. (#388) - cli (Release v3.76.0): Generated single-instance queries keyed by a text or UUID value now take an event source id; UUID keys are matched as text, so callers send the canonical lowercase form. (#388)
- Orleans (Release v1.21.0): Admission is asked before
Start, before everyResume(explicit,IJobsManager.Resume, rehydration after a silo dies, and recovery), and before every stage after the first. A refused job that is running is stopped and drained, and it is not resumed while the owner keeps refusing. A refused stage stops the job. (#81) - Orleans (Release v1.21.0): An exception or timeout in
MayRunfails the start or resume and changes nothing. It is never a refusal. A stage whose admission cannot be answered is asked again on a timer. (#81) - Orleans (Release v1.21.0):
MayRunruns inside the job’s turn, so it must not call the job, its steps, or a non-interleaving method of a grain that may be waiting on the job’s start or resume. To change what running jobs may do, callStopAndDrainfirst, then refuse them fromMayRun. Silos older than 1.21 do not ask, so the guarantee holds once every silo runs 1.21 or later. (#81) - cli (Release v3.75.0): Bundles Stage 4.137.0:
cratis runstartscratis/stage:4.137.0by default, and its defaultsemanticengine runs ESM v27 models with composite read-model keys. Theeventmodelengine refuses them. (#386) - cli (Release v3.75.0): The CLI’s Screenplay compiler (
cratis screenplay,cratis renderand the Screenplay MCP server) is now Screenplay 4.204.0, which reads ESM v27. (#386) - cli (Release v3.75.0):
cratis renderadmits ESM v1 through v27. Stage 4.137.0 does not render composite read-model keys yet: read models and projections keyed by several parts reportSTAGE-ESM-048, single-instance queries by key parts reportSTAGE-ESM-047, and nothing is published. ESM v28 and later are blocked byCLI-RENDER-004. See cratis render. (#386) - cli (Release v3.75.0): Generated applications now reference Arc 22.109.0 and Chronicle 19.71.0. (#386)
- Arc (Release v22.112.1):
useQuery: changing an optional argument now fetches again, as changing a required argument already did. (#3312) - Chronicle (Release v19.77.3): Repeated strongly consistent reads of the same key no longer reuse earlier work. Each read costs roughly what a first read costs, and that cost grows with the number of events for the key. Prefer a materialized projection for long histories that are read often, or that a reactor reads on every event. (part of #4844)
- Arc (Release v22.112.0): Generated default output for applications whose commands use read protection
Onis now an ESM v25 document. Reads underOff,Measureor[Unprotected]stay advisory and are not written asreadsin a document that declares protected reads. WhenMaximumExecutableModelVersionis below v25, the output is unchanged and a warning names the version needed. - Arc (Release v22.112.0): In authoring output, a read is named after its view when the parameter name matches it (
reads Current by sourceId), and[LookUpBy]is honored in every read protection mode. - Stage (Release v4.138.0): Generated single-instance queries keyed by a plain text or UUID value now take an event source id, which fixes Arc analyzer ARC0015 in generated applications. UUID keys are matched as text, so callers must send the canonical lowercase form. (part of #440)
- Stage (Release v4.138.0): Protected reads that cannot be rendered faithfully, such as reads combined with constrained events or read paths in
produces when, are still refused with STAGE-ESM-044, now naming the specific reason. (part of #440) - Chronicle (Release v19.77.2): The Kernel runs on Cratis.Orleans 1.20.0. Stopping or deactivating a catch-up or replay job step now drains it within the job step stop timeout instead of waiting for the grain deactivation timeout; a step stopped mid-checkpoint resumes from its last durable checkpoint. (#5004)
- Stage (Release v4.137.0): Stage now uses Screenplay 4.204.0 and admits ESM v27 models. The semantic Host runs read models with composite keys end to end: projections keyed by named parts, removals, list queries that filter on any part, modeled queries by parts, and the read-model browser, which shows each key as an object of its parts. Composite-keyed read models get no conventional
Get<ReadModel>ByIdquery. (part of #481) - Stage (Release v4.137.0): The specification executor refuses specifications over composite-keyed read models as unsupported (projection), naming the composite key. (part of #481)
- Stage (Release v4.137.0): Rendering refuses composite read-model keys with typed diagnostics instead of failing:
STAGE-ESM-048for a read model with several key parts or a projection keyed by parts, andSTAGE-ESM-047for a single-instance query by parts until Chronicle can look up composite keys (https://github.com/Cratis/Chronicle/issues/4265). The legacy syntax engine refuses composite-keyed read models withSTAGE-ESM-048. (part of #481) - AI (Release v7.69.0): The render skills say
cratis renderaccepts models up to ESM v26 from Cratis CLI 3.74.0, with Stage refusing the constructs it cannot render yet through typedSTAGE-ESM-*diagnostics, and explain what a CLI reports for a newer model:CLI-RENDER-004, or the binder’sPLAY0268when its bundled compiler predates the construct. - Chronicle (Release v19.77.0): Testing scenarios now register precise event and read-model schemas, because the in-process kernel advertises current capabilities by default. (part of #4911)
- Chronicle (Release v19.77.0): SQL stores get an additive event-store migration,
ES-Occurrences-v19_76_0, for lifecyc - Orleans (Release v1.20.0): A job whose silo dies during a drain finishes the drain when it next activates and is never resumed;
Resumeis refused while a drain is pending. (part of #81) - Orleans (Release v1.20.0): A step’s stop report from before a
Resumeno longer counts against the resumed job, and a step stopped just before the resume is started again in the resumed execution. Silos older than 1.20 keep the earlier behavior. (part of #81) - Orleans (Release v1.20.0):
OnStepCompletedOrStoppedcan run again for a step after a crash, or not at all, so it must be idempotent and owners should not take results from it alone. UseStopAndDrainonly once every silo runs 1.20 or later. (part of #81) - Stage (Release v4.136.0): Rendering now admits concepts that use
generate rule(ESM v21). Stage compile-checks the attached C# body against the BCL and Fundamentals and emits it as the concept’sIGeneratableInContext<T>.New(GenerationContext)factory, so the rendered application generates the value with the tenant and time of the operation. A body that does not compile or that produces a compiler warning is refused withSTAGE-ESM-019at its source location; type or namespace shadowing is refused withSTAGE-ESM-022, and a missing attachment withSTAGE-ESM-020. The Host and the legacy syntax engine still refuse commands that generate agenerate rulevalue withSTAGE-ESM-028. (#414) - cli (Release v3.74.0):
cratis renderadmits ESM v21 through v26. Stage plans each model and refuses the constructs it cannot render yet with typedSTAGE-ESM-*diagnostics, so nothing is published for them; for example, models compiled to ESM v22 reportSTAGE-ESM-016with Stage 4.135.0. ESM v27 and later are still blocked byCLI-RENDER-004. See cratis render. (#384) - cli (Release v3.74.0): Bundles Stage 4.135.0:
cratis renderuses its renderer andcratis runstartscratis/stage:4.135.0by default. (#384) - Arc (Release v22.111.0): The generator requires Cratis.Screenplay 4.203.0.
- Arc (Release v22.111.0): A concept
Matchesrule that uses regex lookaround is withheld and reported, because Screenplay cannot express it. - Arc (Release v22.110.0): A command body that cannot be read is reported only after the command’s authorization has run, on both the execute and the
/validateendpoint. An unauthorized caller now gets403instead of400. Policies with a requirement that reads the command cannot run without it, so for those commands an unbindable body still gives a validation error. (#3341) - Arc (Release v22.110.0): A body that cannot be read now gives a
malformedRequestvalidation result naming the failing member (for examplefromoritems[2].when). The message stays generic, so no parser or type details are exposed. (#3341) - Arc (Release v22.110.0): Controller-based commands report model binding errors with plain member names (
from) instead of JSON paths ($.from). (#3341) - AI (Release v7.67.0): The Stage and Screenplay skills say Stage admits ESM v26: its Host and specification executor run Date and DateTime comparisons in command conditions and validation rules, while rendering them is refused with
STAGE-ESM-046, so delivery goes through gap-fill. - Stage (Release v4.135.1): Applications Stage renders and scaffolds now target Arc 22.109.0 and Chronicle 19.71.0, and the Stage Host image runs the Chronicle 19.71.0 kernel. This prepares rendering of protected command reads with Arc read protection. (part of #440)
- cli (Release v3.73.0):
cratis runruns models on Stage’s semantic engine when--engineis omitted, for files and folders. To keep the previous behavior, run with--engine eventmodel; it stays available as an explicit fallback. See Runtime engines. (#324) - Orleans (Release v1.19.0): Deactivating a job step cancels its work and waits for it within Orleans’ deactivation timeout. The step stays recoverable: it writes no final status and reports nothing to the job, and recovery runs it again. (#74)
- Orleans (Release v1.19.0): A job step reports exactly one outcome per run, after
Stophas returned. A stop from the job no longer waits for the step’s report, so stopping a job no longer loops back through the step. - Orleans (Release v1.19.0): A step’s state snapshot is copied with the Orleans
DeepCopier<TState>. Silos register it through the serializer; a specification host such as Orleans.TestKit must register it, otherwise the step fails with a message naming the missing registration. - Orleans (Release v1.19.0): Steps that still call their own grain reference from their work make deactivation wait for that work, up to Orleans’ deactivation timeout. Move those calls to
TryInvokeOnActivation. - Stage (Release v4.135.0): Rendering a model that compares
DateorDateTimevalues in commands is refused with STAGE-ESM-046, on the renderer and the default sandbox engine, until generated applications can compare them exactly. (part of #473) - cli (Release v3.72.0): Bundles Stage 4.134.0 (a navigation item authored with
slot siderenders into the slot the layout declares, Cratis/Stage#467, Cratis/Stage#456) and Screenplay 4.201.0. - cli (Release v3.72.0): The
Integration/Cli/Shellscenario clicks theKnowledge baseitem (slot side) of the Support sidebar and asserts the page stays in the primary outlet, the target renders in the side pane, both items are active, andCloseleaves only the page active - on a livecratis runStage (own root and blueprint root) and on the applicationcratis rendergenerated. - Screenplay (Release v4.204.0): Joins, children,
remove via join,every,all,nested,clear with,variantand reducers on a composite-keyed read model, and list queries with abyblock over one, are refused with PLAY0268 instead of the whole read model being refused. (#599) - cli (Release v3.71.0): Bundles Stage 4.132.0 (and the
cratis/stage:4.132.0imagecratis runstarts), which renders the specifications, one-row summary projections and live collections of the CRM, Ticketing, Approvals, Inventory, HR, Project tracker, Administration and Orders samples without simplifying them (Cratis/Stage#478). - Stage (Release v4.134.0): The Stage draws a navigation item that names a slot the shell declares (
slot side) in a closable pane beside the page, through Scene 4.67.0’sApplicationHost(Cratis/Scene#184): both items are active,Closeempties the pane, the pane survives navigation of the page and is restored from a reload or a deep link; a shell without the slot opens the target in the primary outlet. - Stage (Release v4.134.0): A new
uiprofile-rootconformance vector: the canonical corpus’ui-profile-root-positivedocument (own layout root with options, appearance and a new-screens default, own application-scope screen template root, blueprint root with a version pin) is translated by Stage’s converter and resolved to an effective shell by the .NET Scene engine and by the TypeScript engine against the same checked-in expectations (Source/Conformance.Specs/for_UiProfileRootVector,Source/Frontend/src/uiProfileRootVector.spec.ts). - Stage (Release v4.134.0): Screen templates that declare
scopes applicationand fit no slot carry the root role, so Scene’s resolver accepts them as the application’s shell, as Screenplay’s validator already does. - Stage (Release v4.134.0): Bundles Scene 4.67.0 and Screenplay 4.201.0; frozen digests refreshed.
- Stage (Release v4.133.0): Stage’s specification runner now runs specifications for concepts that use
generate rule(ESM v21) when the generated value is pinned. Like the reference evaluator, it checks the pinned String against the concept’s rules and never runs the generation body; unpinned generation stays unsupported. A model whosegenerate ruleconcepts are used by no command is no longer refused. (part of #414) - Stage (Release v4.133.0): The Host refuses only the commands that generate a
generate rulevalue, withSTAGE-ESM-028naming the command, property and concept, because its interpreter never runs implementation bodies; render the application to run them. Rendering still refusesgenerate rulewithSTAGE-ESM-028. (part of #414) - Stage (Release v4.132.0): A protected live collection over a multi-block projection renders. The refusal named Chronicle#4816, which is fixed in the pinned Chronicle.
- Stage (Release v4.132.0): Running totals (
add,subtract,increment,decrement) establish a required whole number from nothing, so a projection that only counts is complete. An optional whole number still cannot accumulate. - Stage (Release v4.132.0): The live blueprint scenario now covers all eight samples (Orders added), runs them against the published blueprint packages 4.66.0, and fails instead of noting a template the package does not ship.
- Stage (Release v4.132.0): Cratis.Scene.Engine and Cratis.Scene.Model 4.66.0.
- AI (Release v7.66.0): The Screenplay pin and the byte-identical compiler contract are 4.201.0.
- AI (Release v7.66.0): The profile examples name the shell with
root templateinstead of the legacylayoutline, which now warns PLAY0791 and joins the preferred-syntax style codes. - Chronicle (Release v19.74.0): Resolved SQL identities are applied each time a connection opens, so rotated passwords and refreshed access tokens take effect without a restart. A failed login drops the cached resolution and is retried. (part of #4948)
- Chronicle (Release v19.74.0): Requires Cratis Arc 22.109.0 or later. (part of #4948)
- Screenplay (Release v4.202.0):
Samples/Crm,Samples/TicketingandSamples/Inventory:CurrentFiguresis anobservablelist query over the oneglobalfigures row instead of anobservable ... optional by summaryIdlookup. A keyed live lookup is not something the generated application can serve, and a one-row live list keeps the dashboard live without changing what it shows. The conformance syntax vectors of those three samples follow. - Screenplay (Release v4.202.0):
Samples/Crm/README.mdsays so and counts the blueprint’s twenty screen templates (Cratis/Scene#181). - Stage (Release v4.131.0): Commands that route their events to an event stream can now also return a response, including a generated value: Stage runs and renders them in the Host, the specification runner and generated code, and the generated TypeScript proxy carries the response type. STAGE-ESM-038 no longer refuses commands for combining routing, responses and generated values. (#451)
- cli (Release v3.70.0): Bundles Stage 4.130.0 (renders a ui profile’s
root template, shelloptions andappearance, Cratis/Stage#466) and Screenplay 4.200.0 (root template language and diagnosticsPLAY0790-PLAY0799). - cli (Release v3.70.0):
cratis runreports the compiler’s root template errorsPLAY0790-PLAY0799with their code andfile(line,column)before Docker starts, and a version pin no installed blueprint satisfies - and any other root template that cannot be the shell - as the newCLI-RENDER-019, whichcratis renderreports too. - cli (Release v3.70.0): The
Integration/Cli/Shellfixture roots its profile on an own template withoption showFooter falseand a darkappearancewith an accent; the CI script runs it on a live Stage twice (own root and the default blueprint’s root), asserts the shell options and appearance in the browser, and checks thatcratis runandcratis renderrefuse an unsatisfied pin. - cli (Release v3.70.0): Documentation for the root template in
run.mdandscreenplay.md. - Scene (Release v4.67.0): A navigation item authored with
slot <name>, where<name>is an outlet the shell declares (not a nestedcore:outletof a screen), renders its target into that slot:ApplicationHosthosts the outlet (CompositionOptions.hostedOutlets),placeInOutletkeeps the primary screen and places the target beside it (shellOutletOwner), and both items are active. - Scene (Release v4.67.0): The default
AppShelldraws any slot beyond its own regions as a side pane; a hosted outlet has aClosebutton backed by the newcloseOutlet(name)on the navigation context. - Scene (Release v4.67.0): Documentation in
preview-host.md. - AI (Release v7.65.0): The Stage skills separate what Stage runs from what it renders. Since Stage 4.129.0, the specification runner and host run protected command reads: a missing read is rejected first, and
requireand produced values use the read’s properties. Rendering protected reads is still refused with STAGE-ESM-044. A protected command with a requirement below Error severity is refused with STAGE-ESM-045, and the host refuses outside appends while it decides a protected command. (#739) - AI (Release v7.65.0): The Stage skills teach the opt-in for rendering reducers as self-reducing read models in new applications (Stage 4.128.0), and the root-template shell guidance follows Stage 4.130.0. (#739)
- AI (Release v7.65.0): The generated-values skills teach that a
generate rulebody’s generation context is a language-neutral contract (Now,Tenant, a String result) that each target binds to its own type, with the Cratis C# binding to Fundamentals’GenerationContext. The legacy-extraction skill recovers compound rule bodies as far as the Arc generator does. (#721) - Screenplay (Release v4.201.0): The canonical
screen-composition/v1corpus carries the ui profile root template vectors (theuiprofile-root-*set of the Scene shared fixtures):ui-profile-root-positive(own layout, own application-scope screen template and blueprint template with a version pin as the root template, shell options, appearance, new screens default),ui-profile-root-legacy-layout, and the rejection vectorsui-profile-root-unknown(PLAY0790, PLAY0792, PLAY0798),ui-profile-root-not-a-shell(PLAY0794, PLAY0795, PLAY0799) andui-profile-root-invalid(PLAY0796, PLAY0797), with their exact diagnostics pinned. Every vector prints canonically, compiles again and round trips through syntax JSON losslessly in C#; the TypeScript compiler reads them all and reports the legacylayoutline (PLAY0791) like the C# compiler does. Docs: the ui profile page describes the conversion contract and the corpus (#827) - Screenplay (Release v4.201.0): MCP: the new read tool
ui-profilesreturns each ui profile’s root template with its pin and options, the appearance, the new screens default, the legacy layout line and the shell diagnostics, plus the own templates applicable as the root template or the new screens default and the accepted appearance values. The compiler’s own rules back it (ProfileShellValidator), so a refused edit and the read agree. The edits are the typed nodesRootTemplateSyntax,ShellOptionSyntax,ProfileAppearanceSyntaxandNewScreenTemplateSyntaxthroughread-ast/propose-ast, which refuse an invalid reference with its PLAY0790-PLAY0799 code. Thewhen_authoring_the_ui_profile_shelltranscript runs on the corpus vector; tool reference, authoring guide and the contract golden are updated (part of #828) - AI (Release v7.64.0): The Screenplay compiler pin is 4.199.0.
- Scene (Release v4.66.0):
resolveTemplateReference(TypeScript) andTemplateReferenceResolver.Resolve(C#) answer from the names the blueprint’s manifest lists (screenTemplates,dialogTemplates,layouts) when its source carries no template bodies, with the sameResolvedkind and the sameBlueprint '<name>' has no template '<id>'diagnostic otherwise. A source that carries its templates is answered from them, as before. - Stage (Release v4.130.0): The converter carries a ui profile’s
roottemplate (own or blueprint, with the version pin and shell options),appearance(colour scheme, accent) anddefaults(new-screens template) into the Scene document the Stage serves, and the render planner asks Scene’sShellResolver(throughRootShell.Resolve) what the root resolves to, so an unknown root, a blueprint that is not installed or a pin no installed version satisfies is a build-time finding (RenderFindings). - Stage (Release v4.130.0): The Stage runtime starts the shell
resolveEffectiveShellnames (the function the Studio preview uses), applies the profile’s shell options (navigationMode,menuTheme,showFooter) and appearance (light/dark/system scheme, accent as the theme’s primary colour), and states an unresolved root or an option it does not understand instead of drawing another shell or a blank page. - Stage (Release v4.130.0): Scene 4.53.1 -> 4.62.0 and Screenplay 4.188/4.193 -> 4.197.0; frozen digests and pins refreshed; documentation in
reference/stage-rendering.md. - Stage (Release v4.129.0): While a protected command is being decided, the host refuses any event appended to the session’s event log from outside, rather than only events that affect the command’s reads. (part of #440)
- Stage (Release v4.129.0): A protected command with a requirement below Error severity is refused with STAGE-ESM-045, also when a reaction invokes it, until Screenplay defines how such requirements behave. (part of #440)
- Scene (Release v4.65.0):
blueprintCatalog.json(package and repository root) lists the two new templates; the CRM documentation counts them. - AI (Release v7.63.0): The
matchesrule is taught as Screenplay’s portable match dialect, including its anchors, character classes, whitespace set and PLAY0699 refusals, instead of as a platform regular expression. (#723) - AI (Release v7.63.0): Stage guidance states what Stage 4.127.0 admits (ESM v1–v21 and v23–v25), what it refuses (v22, described handlers, atomic batches, protected reads) and which generated-value strategies it renders. Statements that described handlers never bind or that every read is unprotected are corrected.
- AI (Release v7.63.0): The Screenplay compiler pin is 4.198.0.
- Screenplay (Release v4.200.0): Root template diagnostics
PLAY0790-PLAY0799(unknown template, legacylayout, unknown blueprint, unsatisfied version pin, template not applicable as shell, no content outlet, unknown shell option, invalid appearance, duplicate root template, new-screens template not applicable to a feature). One rule set,ProfileShellValidator, run by the compiler (document facts) and byUiProfileShellBinder.Bind(installed blueprint catalog facts); the rules restate Scene’sShellResolver/TemplateApplicabilityshared vectors. (#826) - Screenplay (Release v4.200.0): The TypeScript compiler reports the legacy profile
layoutline (PLAY0791, shareddiagnostics.jsonvectors hold C# and TS to the same code/line) andQuickFixesoffers the mechanical fix-it:layout Xbecomesroot template X, or the ignoredlayoutline is removed beside a root template. Monaco and VS Code code actions pick it up. (#826) - Screenplay (Release v4.200.0): Contract golden regenerated (the new codes and their arguments); docs: diagnostics table, ui-profile page.
- Cast (Release v0.2.0): Tiers on member pages always come from the registry; a member’s
cast.jsoncannot change a tier, and profiles for another login are ignored (#10) - Cast (Release v0.2.0): A member’s profile that cannot be read or rendered falls back to the GitHub profile instead of stopping the directory build (#10)
- AI (Release v7.62.0): Arc C# guidance starts new code with read protection
On(<CratisReadProtection>On</CratisReadProtection>): the state rule goes in aCommandValidator<T>with the read model as a constructor parameter, andHandle()returns the events. UnderOff, the default, a validator over a plain read is a hint.[ProtectedDecision]withDecisionRead<T>is described as the older per-command opt-in, not obsolete (#731) - AI (Release v7.62.0): The “choosing how a rule holds” reference is rewritten around the rule shapes (unique value, one entity, two entities with
[LookUpBy], per-stream read model, stream decision, aggregate, explicit scope, repair reactor and[Unprotected("why")]), with the refusals, the Measure rollout and how to test the race (#731) - AI (Release v7.62.0): C# specification guidance uses a plain
new CommandScenario<T>(),AppendConcurrentlyandShouldHaveValidationErrorBecauseOf(ValidationResultReason.ConcurrencyViolation);UseDecisionReads()is no longer taught (#731) - AI (Release v7.62.0): Reducer guidance states that unfiltered reducers without constructor dependencies are admitted by decision reads and read protection (#731)
- AI (Release v7.62.0): Evaluation cases cover the rule shapes, the Measure rollout,
ReadChangedhandling, the race test and the negative case of a validator underOff(#731) - AI (Release v7.62.0): Validator guidance states that a caller sending
X-Allowed-Severity: Errorcan remove validator Error results underOffandMeasureunless the command declares[BlockOnValidationSeverity], and that from Arc 22.108.0 a command declaredOnblocksErrorandUnknownwhatever the caller sends (#731) - Stage (Release v4.127.1): Stage’s specification runner and fixture checks now evaluate concept and command value rules, including
validate checksum, with Screenplay’s public value-rule check (the same implementation as the reference evaluator) instead of Stage’s own copies. Results are unchanged; rejection messages for deprecated Studio lookaround patterns now use Screenplay’s wording. Generated applications are unchanged. (#455) - Arc (Release v22.109.0):
EntityFrameworkCoreOptions(ConnectionString,AutoDiscoverDbContexts,ConnectionResolution) now bind from theCratis:EntityFrameworkCoreconfiguration section. TheconfigureOptionscallback runs afterwards and wins. (part of #3316) - Chronicle (Release v19.73.1): The namespace selector, breadcrumb and home page no longer depend on shared MVVM singleton state; the last chosen namespace per event store is remembered in the browser for event store level pages.
- Arc (Release v22.108.0):
ShouldAdmitDecisionReadsOfandShouldAdmitDecisionReadsInalso check commands declaredOn, the read models their validators take, and per-stream read models (#3330) - Stage (Release v4.127.0): A model that declares protected command reads (
command reads protected) is now refused with STAGE-ESM-044 by the renderer, the specification runner, the host and the default sandbox engine, including when only part of the model is rendered, instead of running or rendering the commands without their reads. (part of #440) - cli (Release v3.69.0): The CLI bundles Stage 4.125.0, whose catalog ships
PrimeReactandCratis.Blueprint.Defaultand whose live Stage and generated React application load the templates of approved domain blueprints;cratis runstartscratis/stage:4.125.0by default. Scene 4.53.1 accepts a blueprint manifest in the approved package set. - cli (Release v3.69.0): Two scope specs that used a generated-concept collision as their example of a construct Stage refuses now use an interval reaction (
STAGE-ESM-024), since Stage 4.121 onward renders the former. - Screenplay (Release v4.198.0): The Library, Commerce and TimeTracking samples declare
reaction batches atomicat their root, so a model copied from them starts with all-or-none reaction production batches. Invoicing already did. (#771) - Screenplay (Release v4.198.0): The getting-started walk-through, the MCP authoring guide and the
open-workspacetool description tell new models to declarereaction batches atomic, and present per-fact production as legacy behavior kept for existing models. See Atomic production batches. (#771) - Screenplay (Release v4.197.0):
ui profilegainsroot template [blueprint <Blueprint>] <Name> [version "<range>"]withoption <name> <value>lines, anappearanceblock (color scheme light|dark|system,accent "<#hex>") andnew screens use template <ref>.layout <Name>stays readable beside it. - Screenplay (Release v4.197.0): New syntax nodes
RootTemplateSyntax,ShellOptionSyntax,ProfileAppearanceSyntax,NewScreenTemplateSyntax; parser (ProfileShellParser), printer (byte-identical round trip), walker, transport schema (C# and TS generated files), docs (grammar, ui-profile, templates, diagnostics), Monaco completion/keyword docs, VS Code TextMate grammar, Invoicing sample. - Screenplay (Release v4.197.0): Diagnostics PLAY0788 (malformed/repeated shell lines), PLAY0789 (malformed/repeated appearance), PLAY0798 (second root template); a bad version range reuses PLAY0721.
- Screenplay (Release v4.197.0): Template renames stay refused (layouts/templates are not rename targets), so a profile’s reference cannot go stale; folder merge needs no change (a profile lives in one file).
- Scene (Release v4.62.0):
composeApplicationScreen(preview host and Stage’s composition) resolves the shell through the engine’sresolveEffectiveShell(effectiveShellOf) instead ofshellComponentForLayout(screen.layout) ?? screen.layout; the template chain’s placement and the outlet a screen lands in are the resolved shell’s outlets / primary outlet. With a profileroot, that template is the shell of every screen (a screen may still opt out with the chrome-lessFullPagelayout); without one, behaviour is unchanged (legacy layout). - Scene (Release v4.62.0): A root screen template (role Root) is drawn by the template component with its own arrangement/content; the screen goes in its primary outlet.
- Scene (Release v4.62.0):
previewProfilenow carriesroot,appearanceanddefaults. - Scene (Release v4.62.0):
CompositionOptions.templateLibrarylets a host hand over the installed blueprints. - Scene (Release v4.62.0): Docs:
blueprints/preview-host.md. - Stage (Release v4.126.0): Commands that route their events to an event stream can now also have generated properties: Stage runs and renders them in the Host, the specification runner and generated code, including a generated identifier as the event source of a routed stream. Generated commands that return results now check their stream id the same way as other routed commands. A route combined with a command response is still refused with STAGE-ESM-038. (part of #451)
- Scene (Release v4.61.0):
TemplateMetadatagainsroleandprimaryOutlet;ApplicableTemplatesdefault scopes treat a root screen template as application-scope. - Scene (Release v4.60.0): Storybook story
Blueprint/Gallery navigation(click an entry, select mode, destinations list) for the SC4 navigating shell controls. - Scene (Release v4.60.0):
locationTrailanduseShellLinkare exported from the shell barrel, so hosts and other blueprints can reuse them. - Templates (Release v1.8.0): New C# applications from the
cratisandcratis-aspiretemplates start with Arc read protectionOn, so read models that commands and validators take guard the command’s append. The README explains how to switch toMeasureorOff(#80) - Chronicle (Release v19.73.0): Application read model databases are not dropped by the removal; the application owns that data.
- AuthProxy (Release v2.31.0): AuthProxy now refuses to start when
Session:CookieDomainis combined with theSubHosttenant resolution, when a declared service host or the callback host is outside the cookie domain, when the domain is an address, a top-level domain, a wildcard or carries a port, when the cookie name is not a valid name, and when the name uses the__Host-prefix together with a domain. None of these can occur unless you set the new options. - AuthProxy (Release v2.31.0): Invitations, credential links and registration still run on the host they start on. With a callback host, register a provider callback for every host where one of them can start.
- Scene (Release v4.58.0): Shell controls navigate through the navigation context (spec N1, N2):
menuItem,breadcrumbcrumbs,logo,userMenuentries and the topbar/sidebar region items activate via the newuseNavigationActivation(@cratis/scene.react). A click renders the target in its slot and records it in the host history; the address of the hosting page is never written. Outside a host they stay plain hash links. - Scene (Release v4.58.0): Active state is derived from the history location (N1): a menu entry is current while its screen is the primary screen (
useShellLink), no document-keptisActiveneeded. - Scene (Release v4.58.0): The breadcrumb follows the location (N4):
locationTrailderives module › feature trail from the structure; default application chrome now includes a breadcrumb; authoreditemsstill win. - Scene (Release v4.58.0): Activation policy (N1/N2):
NavigationActivationProvider,navigationMode(navigate|select| per-control function), Alt-click selects,onActivate,onNavigate;ApplicationHosttakesnavigationPolicy. - Scene (Release v4.58.0):
ScenePreviewHost: new{ application }target,initialDestination(screen or dialog),navigationMode,onActivate,onNavigate. - Scene (Release v4.58.0):
listDestinations(document)(N3/N5): Pages / States / Dialogs for the Showing picker;galleryApplication()+galleryCompositionmake the blueprint gallery a navigable application. Listing pinned by a JSON fixture. - Scene (Release v4.58.0): Docs:
Documentation/blueprints/preview-host.md. - Stage (Release v4.125.0): Bumped
Cratis.Scene.Engine,Cratis.Scene.Modeland the@cratis/scene.*packages to 4.53.1, which re-pins the digests of the generated frontend bytes. - Stage (Release v4.125.0):
CratisRendering.ShippedPackagesis composed from the generated manifests;ShippedPackageNameshas five entries, so an approved package may not reusePrimeReactorCratis.Blueprint.Default. - Scene (Release v4.57.0):
UiProfile.Layoutis documented as legacy: it stays readable and writable,Rootsupersedes it. Existing documents without the new members load and write back unchanged. - Stage (Release v4.124.0):
matchesvalidation rules now give the same result as Screenplay 4.188 everywhere. The specification runner and the host use Screenplay’s own pattern matching, and generated validators match characters the same way (for example.no longer matches a line separator); a pattern that generated code cannot express exactly is refused with STAGE-ESM-005 instead of being rendered with different behavior. (#448) - Stage (Release v4.124.0): The default sandbox engine (
cratis runwithout the semantic engine) does not enforce the four new text rules; they are added to its documented list of rules it does not enforce. (#448) - Orleans (Release v1.18.0): The generic
IJobsManager.StartandGetJobsOfTypemethods now document that they are not safe while two releases share a cluster; useIJobsinstead. (#76) - Stage (Release v4.123.0): Commands whose generated property names clash with names the Cratis renderer uses inside the generated
Handlemethod (such asoperation,occurredorsource) now render: the renderer renames its own locals instead of refusing the model with STAGE-ESM-038, and the Stage Host and specification runner no longer refuse these models. Generated code is unchanged for commands without such clashes. (part of #451) - AI (Release v7.60.1):
module-navigation-modes-and-slice-buttonsandblueprint-template-and-sample-datatell the agent there is no model file and to write the declarations from scratch. Before, the blueprint task ended with the agent asking for the repository (the skill was never loaded). - AI (Release v7.60.1): The two navigation assertions of the first task are worded as what the answer declares (Sales
extends, Supportoverrides, Reports nothing; each item targets its own module), not as “lists only its own item”, which graders read both ways for anextendsregion. - AI (Release v7.60.0): A query never writes
Skip,Take,LimitorOrderByto serve the client’s page or sort. The old advice to give every list a defaultOrderByis removed; an initial order is the frontend’ssortingargument touseWithPaging. - AI (Release v7.60.0): The
AsQueryable()examples in the paging skill andvertical-slices.mdnow showObserve, andIQueryable<T>is described as the shape for LINQ-native providers such as Entity Framework Core. - AI (Release v7.60.0): The React, code review, performance review and read-model query guidance, and the performance reviewer agent, no longer present
IQueryable<T>as the only paged shape orSkip/Takeas how a query pages. - AI (Release v7.60.0): The paging skill documents the
Expression not supported ... Skip(0).Take(30).Cast()failure: Arc before 22.50.6 appended aCastthat MongoDB cannot translate to every pagedIQueryablerequest. - Stage (Release v4.122.0): A model that describes a command handler without supplying its implementation is now refused with STAGE-IMPL-002 by the renderer, the specification runner and the host, instead of being rendered or run without the handler. (part of #316)
- Stage (Release v4.122.0): A model that declares atomic reaction batches (
reaction batches atomic) is now refused with STAGE-ESM-043 on every path until Stage supports them. (part of #316) - cli (Release v3.68.0): The CLI bundles Stage 4.120.0 and Screenplay 4.188.0 (including its MCP server);
cratis runstartscratis/stage:4.120.0by default. - AI (Release v7.58.0): The pinned Screenplay moves from 4.164.0 to 4.188.0 with its compiler contract. The
translate-example,invoicing-dues-exampleandinvoicing-dues-designexamples keep the capture in theTranslateslice and put the translator reactions in anAutomationslice beside it (a reaction in the capture’s own directionless slice isPLAY0694), and append the first record of a key withwhen added, so they compile and run clean again. - AI (Release v7.58.0): The
preferred-syntaxspec counts ten non-error style diagnostics, now includingPLAY0787. - Stage (Release v4.121.0): Generated
Commonconcept, type and enum files now use short type names withusingdirectives instead ofglobal::-qualified names. The usings sit inside the file-scoped namespace and are rooted withglobal::, so code you add inCustomizations/cannot change what a generated name refers to; names that cannot be proven safe stay qualified. Existing generated applications see a one-time text change in these files on their next regeneration; other generated files follow in later releases. (part of #424) - Stage (Release v4.121.0): The rendered scaffold’s
.editorconfigplacesusingdirectives inside the namespace for generated code. (part of #424) - Stage (Release v4.121.0): Do not declare your own types inside generated namespaces; see https://github.com/Cratis/Stage/blob/main/Documentation/guides/customize-rendered-application.md. (part of #424)
- Screenplay (Release v4.188.0): The
propose-asttool description names the application shell edits and their diagnostics; the capability matrix, the release acceptance matrix and the MCP guides gain the new rows. - Stage (Release v4.120.0): Commands with generated properties can now also have command rules and requirements: Stage runs and renders them in the Host, the specification runner and generated code, checking the requirements on the request values before any value is generated, as Screenplay does. STAGE-ESM-038 is now reported only when a rule or requirement reads a generated property. (part of #451)
- cli (Release v3.67.0): The CLI bundles Stage 4.119.1 (built on Screenplay 4.180.1);
cratis runstartscratis/stage:4.119.1by default. Generated applications pin Arc 22.104.0, and validation rules of every severity on generated concepts now render instead of being refused withSTAGE-ESM-038(an unpinned generated value Stage cannot prove still is). - Screenplay (Release v4.184.0):
matchespatterns in the exact shapes Studio generated for equals, not equals, contains, not contains, starts with and ends with (both the$and the(?![\s\S])forms) now bind as the matching first-class rule with warning PLAY0787 and a quick fix, instead of failing with PLAY0699. Executable models already holding these patterns evaluate them as the first-class rule. Every other lookaround is still refused. (#810) - Stage (Release v4.119.0): STAGE-ESM-028 now refuses only
generate ruleamong the ESM v21 generation strategies. (part of #414) - Stage (Release v4.118.0): STAGE-ESM-042 is now reported only for concept rule kinds Stage does not know; the legacy event-model engine still refuses checksum rules. (part of #414)
- Stage (Release v4.117.0): Stage and the rendered backend scaffold use Arc 22.104.0 (with Cratis.Fundamentals 7.25.0). Generated values that fail a concept rule of any severity are now rejected by the rendered application at run time. (part of #414)
- Stage (Release v4.117.0): Generated values guarded by warning- or information-severity concept rules now render instead of being refused with STAGE-ESM-038; concepts with unproven or refuted rules still need pinned fixture values. (part of #414)
- Screenplay (Release v4.183.0): A
matchespattern is now a flagless JavaScriptRegExprestricted to a portable linear dialect. Both compilers refuse lookarounds, backreferences,\b,\p{…}, .NET-only syntax (\A,\z, inline options, class subtraction) and patterns over the size budget with PLAY0699. The message names the construct and suggests an equivalent where one exists. Existing models that use one of these constructs no longer compile: rewrite the pattern as the message suggests, for example\A/\zas^/$or a length-only lookahead as a counted repeat. See Commands. (#800) - Screenplay (Release v4.183.0):
matchesrules are evaluated by Screenplay’s own linear-time matcher instead of .NET’s regular expression engine. Verdicts no longer depend on how busy the host is, on the target framework or on runtime settings, and there is no timeout. (#800) - Screenplay (Release v4.183.0): A few
matchesverdicts in the reference evaluator now agree with JavaScript where they used to differ:\sno longer matches Unicode spaces such as the no-break space U+00A0 (this also affects the built-inemailrule),.no longer matches\r, U+2028 or U+2029, and\wno longer matches U+0130. (#800) - Screenplay (Release v4.183.0): Executable models saved by earlier versions still load when a pattern is outside the dialect. The evaluator reports such a rule as an unsupported validation, and generation checks report it as Unproven instead of timing out. (#800)
- Screenplay (Release v4.182.0): A pending handler intent without
producesnow fails executable binding with PLAY0696 instead of PLAY0268. Its source stays valid. (#782) - Arc (Release v22.106.0):
new CommandScenario<T>()enables decision reads automatically when the command needs them;UseDecisionReads()is no longer needed (#3276) - Arc (Release v22.106.0): Commands routed through event source definitions pass their declared routing to Chronicle under
On, so the append is checked against the definition’s concurrency (#3283) - Arc (Release v22.106.0): ARCCHR0002, ARCCHR0011, ARCCHR0012 and ARCCHR0013 follow the read-protection rules, and
[LookUpBy]lookups are checked against the command a validator belongs to (#3268) - Arc (Release v22.106.0): Requires Chronicle 19.
- Arc (Release v22.105.0): The Screenplay generator now states reactors that return several events whose append constraints could reject the batch, by declaring
reaction batches atomic(Screenplay ESM v22). Chronicle appends such a batch all or nothing, and the generated model now says the same. Batches that close a stream, and batches whose rejecting constraint is not in the generated document (such as a class-level[Unique]), keep their code reference with SP0070. WithMaximumExecutableModelVersionbelow 22 the output is unchanged. Arc now depends on Cratis.Screenplay 4.181.0. See Generating a Screenplay. (#3093) - Scene (Release v4.42.0): Nothing is renamed. The spec names stand beside the earlier templates, which keep working:
LoginScreenbesideLogin,NotFoundScreenbesideNotFound,ForbiddenScreenbesideAccessDenied,ErrorScreenbesideError,QuickCreateDialogbesideFormDialog(foundationTemplateAliases). TheConfirmDialogof the components blueprint and this one are kept apart because a template reference names its blueprint. - Stage (Release v4.115.0): A rendered specification may leave a generated value unpinned when every rule on its concept is proven by Screenplay’s rule consistency check; unproven or refuted rules still require a pin (
STAGE-ESM-038). (#423) - Screenplay (Release v4.181.1): The version-1 generation context for
generate rulebodies is a language-neutral contract (Now,Tenant, String result) that the selected provider binds to its own type. The Cratis C# target binds Fundamentals’Cratis.Concepts.GenerationContext, so compound bodies such asreturn $"{context.Tenant}:{GenerateValue.Ulid(context)}";compile, andCratis.Screenplay.Contexts.GenerationContextstays dependency-free. The context reference lists the portable subset and the target-bound uses (#799) - Stage (Release v4.114.0): Shared composition and host.
App.tsxcomposes every screen throughcomposeApplicationScreenand runs it inApplicationHost(@cratis/scene.blueprint.default4.38). The Stage decides only what is its own: shell chrome, the command form, the status line, data sources (decorate), and ascopeproviding its data, interactions, theme and slice invoker around the screen and every dialog. Deleted:FlowArrangementView,useSizeClass, theStage:templatewrapper,StageNavigationTreeand its CSS - Scene owns them (REN2). - Stage (Release v4.114.0): Navigation regions. A model with
navigation topbar|sidebargets the blueprint shell’s regions drawing the effective navigation (inherit / extend / override per module); module swap, active state in both regions, render-into-slot, first feature for a module target come from Scene.screenForandmoduleOf(Scene #134) are the Stage’s: the screen declared in a feature, the first of a screen’spath. A model with no regions keeps the authoredNavigationcontributions / flat screen list. - Stage (Release v4.114.0): Toolbar slice dialogs with the real invoker. A toolbar button naming a State Change slice opens Scene’s
SliceDialogView; fields come from the command’s JSON schema (schemaPropertiesOf, shared withStageCommandForm); submit posts to the route the Stage registered throughcreateStageSliceInvoker, validation results return against their fields, success closes and refreshes data. - Stage (Release v4.114.0): Deep links. Hash history (
createHashSceneHistory) restores module, feature and slots on reload; asserted in a browser. - Stage (Release v4.114.0): Permission-hidden items.
ApptakesisVisible(item), fed to the regions: hidden, never disabled, at every level. - Stage (Release v4.114.0): Wire.
SceneApplication.Structureis now serialized in the runtime document and the live scene when a toolbar button names a slice (otherwise byte-identical to before: plan digests move only for the Scene 4.38 pin and the frontend files);commandSchemascarries each command’s JSON schema in the same case. - Stage (Release v4.114.0): SD6.
SceneApplication.ForRuntime()andStageSceneDocumentstrip sample data packs, blueprint packs and the profile’s selection from the runtime document and/stage/scene. - Stage (Release v4.114.0): Scene packages pinned to 4.38.0 (frontend, scaffold package set, specs); NuGet
Cratis.Scene.*stays on the latest published (4.36.0) until 4.38 is indexed. - Stage (Release v4.114.0): Docs:
Documentation/reference/stage-rendering.md(navigation regions, slice dialogs, no sample data, one composition). (part of #407) - Scene (Release v4.41.0): Existing templates (
Dashboard,CrudList,MasterDetail,DetailView,FormPage,ModuleWorkspace, …) are unchanged and keep their names: the foundation set is added alongside rather than renamed, so nothing breaks. As with the components (see #105) the set lives in the publishedblueprint.defaultrather than a new package (a new npm package cannot be published until a trusted publisher exists). - Arc (Release v22.104.0): A generated or scenario-pinned
[GeneratedValue]now fails withGeneratedValueRejectedwhen it breaks any rule of its concept validator, including Warning and Information rules. Before, those severities let the command run with the value. The server chose the value, so a failing rule is a server defect; this matches the Screenplay reference. Validation of caller-supplied input is unchanged. See Generated values. (#3304) - Arc (Release v22.104.0): Arc now depends on Cratis.Fundamentals 7.25.0, which adds
GenerateValue.Pattern,GenerateValue.Integer,GenerateValue.HasValidChecksumand theChecksumenum. (#3308) - Arc (Release v22.103.0): The Screenplay generator no longer accepts “Query reference … is ambiguous across slices” as a known binder limit. Queries that share a name in different slices, such as
Allon several read models, now bind by slice, and a generated document that is still ambiguous fails verification instead of passing. Arc now depends on Cratis.Screenplay 4.180.1. See Generating a Screenplay. (#3301) - cli (Release v3.66.0): The CLI bundles Stage 4.113.0 and Screenplay 4.180.1 (including its MCP server);
cratis runstartscratis/stage:4.113.0by default. Rendered applications are two-project solutions with a<Project>.Specsproject, and validation rules on optional whole-number, decimal and Boolean concept properties now render. - cli (Release v3.66.0): A render whose bundled renderer breaks its own contract is refused with
CLI-RENDER-005, naming the error to report to Cratis/Stage, instead of crashing; nothing is published. - Scene (Release v4.34.0):
ScenePreviewHost,ApplicationHost,composeApplicationScreen,composeOutletScreen,composeDialog,diagnosePreview,resolvePreviewPlan,createPreviewSampleData,previewProfile, theScene:templatewrapper and the flow arrangement view are exported from@cratis/scene.blueprint.defaultinstead of the unpublished@cratis/scene.preview. Nothing else about them changes; the specs moved with them. - Scene (Release v4.34.0): The preview host’s stylesheet is part of
@cratis/scene.blueprint.default/styles.css. - Scene (Release v4.34.0): The docs page
Documentation/blueprints/preview-host.mdnames the new import. - Scene (Release v4.32.0): The foundation set lives in the published
@cratis/scene.blueprint.defaultrather than a newblueprint.foundationpackage: a brand-new npm package cannot be published by the release workflow until a trusted publisher is configured for it on npm, and a failed publish fails the run for every other change. The code sits in its ownfoundation/folder with its own barrel, so moving it into a package later is mechanical. - Scene (Release v4.32.0): The light theme’s
text.mutedColoris#5b6472(was#6b7280), which keeps muted text AA-contrast on the page background as well as on cards. - Chronicle (Release v19.71.0): Models that declare an event stream refuse key-only reads and mismatched decision-read routes rather than mixing streams. (#4932)
- Stage (Release v4.112.0): Stage now renders command validation rules on optional whole-number, decimal and Boolean concept properties, which it used to refuse with STAGE-ESM-005. An absent value passes, a present value is compared by value exactly as Screenplay specifies, and Boolean equality compares the actual true or false value.
not emptyrules, collections and concepts with named values are still refused with a specific reason. (#419) - Chronicle.Elixir (Release v3.14.2): Returning
{:error, reason}from theChronicle.decide/2function now rejects the decision: nothing the function appended is written, and{:error, reason}is returned as-is instead of{:ok, {:error, reason}}. Code that matched{:ok, {:error, _}}should match{:error, _}instead. (#161) - Stage (Release v4.111.0): Stage moves to Cratis.Screenplay 4.180.1. A protected query whose specification has no
given calleris now refused by the language itself (PLAY0389) before Stage plans the model. - Stage (Release v4.110.0): Stage moves to Cratis.Scene 4.30.0 and Cratis.Screenplay 4.179.0, and the generated frontend pins the matching
@cratis/scene.*packages. - Stage (Release v4.110.0): The Billing sample demonstrates navigation regions and toolbar buttons.
- AI (Release v7.57.0): The skill now documents the reactor and reducer context as a
Chronicle.Events.EventContextstruct instead of a six-key map, and no longer says the client emits no telemetry. - AI (Release v7.57.0): The Elixir rule and the product ledger are synced to Chronicle.Elixir v3.13.0.
- Chronicle.Elixir (Release v3.14.1): The shared Chronicle pages show Elixir code for decision reads, the dynamic consistency boundary, closing streams, replay notifications and the testing scenarios.
- Chronicle.Elixir (Release v3.14.1): The Dynamic Consistency Boundary page now says correctly that only the .NET client refuses reducer-backed decision reads.
- AI (Release v7.56.3): The Stage sandbox guidance now states exactly what the default engine checks: missing required properties and simple literal
validaterules on top-level properties of commands that produce events. It also lists the rules it evaluates with the wrong meaning (numericmin/max,not emptyon nested properties) and everything it skips (other rules, concept rules,require, constraints, command and query authorization, the/validateroute). Skills previously said it enforced no validation at all. (#709) - AI (Release v7.56.3): The Arc command and decision-read skills teach that the fresh-identifier guard also covers events written directly through the command’s unit of work (
IUnitOfWork.AddEvent,AddEventWithNamedTags,AddEvents,eventLog.Transactional.Appendand its variants) and nested commands, how a conflicting scope is reported asConflictingConcurrencyScopes, and that Arc 22.100.0 requires Chronicle 19.65.2 or later. (#710) - Screenplay (Release v4.179.0): Renaming or moving a slice, feature or module that a toolbar button names is refused with an explicit message instead of leaving the button’s
slicestale. - Chronicle.Go (Release v0.11.0): Contracts and the verified decision-guard profile move to Chronicle 19.70.0. Run a Chronicle server of 19.70.0 or later: an older server ignores
reactors.StartAtTail()and the reactor catches up from the beginning, and decision guards are only supported against the verified 19.70.0 profile. - Chronicle.Kotlin (Release v6.15.0): Requires
io.cratis:chronicle-contracts19.70.0 and a Chronicle server of 19.70.0 or later. Upgrade the server first: an older server ignores@StartAtTailand the reactor catches up from the beginning. - Chronicle.TypeScript (Release v6.53.0): Requires
@cratis/chronicle.contracts19.70.0 and a Chronicle server of 19.70.0 or later. Upgrade the server first: an older server ignores@startAtTail()and the reactor catches up from the beginning. - Chronicle.Elixir (Release v3.14.0): Requires
cratis_chronicle_contracts19.70 and a Chronicle server of 19.70.0 or later. Upgrade the server first: an older server ignores the option and the reactor catches up from the beginning. - Screenplay (Release v4.178.0): Renaming or moving a module or feature that a navigation item targets is refused with an explicit message instead of leaving the
targetstale. The TypeScript compiler recognizes modulenavigationblocks and skips them, as it skips layouts, so the reference checks are C# only. - Screenplay (Release v4.177.0): Every sample, canonical-corpus source and fixture that declares a layout or template now declares a
category, so they compile warning-free. - Screenplay (Release v4.177.0): Docs:
templates.md(own and blueprint templates, category, applicability),grammar.md,ui-profile.md,diagnostics.md, the capability matrix. (#761) - Chronicle (Release v19.70.0): Upgrade the Chronicle server before the clients: a server that predates this release ignores
StartAtTailand the reactor catches up from the beginning. - Stage (Release v4.109.0): A value that Stage’s Host generates and that fails its concept’s shape or rules is reported as a server error after authorization and input validation, never as a validation error, and appends nothing. (#393)
- Stage (Release v4.109.0): The specification executor reports a generated fixture that fails its concept’s rules with the reference evaluator’s message, checking each fixture’s shape and then its rules in fixture order. (#393)
- Chronicle (Release v19.69.0): SQL stores get additive event-store and namespace migrations for trigger definitions and indexed effect receipts. (part of #4911)
- Screenplay (Release v4.175.0): Specifications of record captures (
source api, polls and other outside sources) now treat the first record of a key as added, as Chronicle does:when addedholds on it, whilewhen <field>andand/orcombinations of field changes need an earlier record of the same key fromgiven capture. This applies at root, child and nested level; expression guards,mapand unguarded appends are unchanged. A specification that relied on the old rule now reports the events it expected: add a separate append withwhen addedfor behavior on first sight and keep the field-guarded append for later updates, or seed the key withgiven capturewhen the scenario is an update. See decision 0080. (#767) - Stage (Release v4.108.1): Generated applications now use Arc 22.100.1 and Chronicle 19.66.0, and the Stage Host and packages are updated to match.
- Stage (Release v4.108.1): Generated commands keep their freshness behavior on Arc 22.100. Stage still guards freshly generated identifiers itself, and generated values in older models stay unguarded rather than being refused by Arc’s new default guard.
- Screenplay (Release v4.174.0):
RuleConsistency.Check(generation, primitive, rule)assesses date patterns with the current UTC year, like the compiler, so it gives the same Proven, Refuted or Unproven status as the PLAY0688/PLAY0689 diagnostics. (#775) - Scene (Release v4.25.0):
categoryis required:TemplateCatalog.Describe/describeTemplateCatalogreport a missing category (templateCategoryMissing) as a problem for a template in aBlueprintpackage and as a warning for an own template. - Scene (Release v4.25.0): Every template in
blueprint.default(Foundation / <type>) andblueprint.components(Business / <domain>) now has a category; the components list/detail/command templates declare their slice kinds. - Scene (Release v4.25.0):
template-applicability-fixtures.jsonnow covers each level, explicit scopes, slot-nesting failure, hidden blueprints, the slice-kind split, category error/warning and version-pinned references, asserted by bothEngine.Specsandenginespecs.scene-model-shape.jsonand docs (template-applicability.md,template-provenance.md) updated. - Scene (Release v4.24.0): Components that had no hand-written descriptor now have one with no editable properties (their name, category and icon), so a picker can list them. A package written before categories still loads: the category rule is checked by
validateComponentMetadata, not byvalidatePackageBundle. - Screenplay (Release v4.173.0):
screenplay_declaration_detailsdescribes the ESM v21 strategiespattern,randomandgenerate ruleas executable. Their authored values are now undergeneration.arguments, which replacespreviewArguments:patternandchecksumare strings,rangecarries exact Int64minimumandmaximum, andruleis the rule name. See generated values and responses. (part of #618) - Screenplay (Release v4.173.0): Pattern and random strategies report the compiler’s exact
supportCount, withentropyBitsand the 1% collision count computed from it. Date tokens use the minimum support over the compiler’s 100-year UTC horizon. Malformed patterns or ranges, support-budget exhaustion (PLAY0691) and empty support (PLAY0692) give null entropy and the compiler’s message instead of an error. Rule generation reports unknown entropy because the implementation is opaque. (part of #618) - Screenplay (Release v4.173.0):
generation.derivedPatterncoverspatternstrategies, using the same expression the PLAY0688 repair writes, andchecksumvalidation rules are listed with their proof status. (part of #618) - Stage (Release v4.108.0): Stage now renders commands with an optional scalar concept property whose validation rules all accept absence (comparisons,
lengthandmatches). An absent value is accepted and a present value is validated exactly as Screenplay specifies. Optional concepts with absence-rejecting rules such asnot empty, optional collections of validated concepts and optional named-value concepts are still refused with STAGE-ESM-005, and the message now says which of these applies. (#409) - Stage (Release v4.107.0): A generated application ignores
.editorconfigand.globalconfigfiles in parent folders, so it builds the same inside another repository. (part of #401) - Chronicle (Release v19.68.0): An explicit concurrency scope whose tail was unavailable now guards an empty stream instead of being skipped;
ConcurrencyOptions.SkipIncompleteExplicitScopesrestores the old behaviour (#4898) - Chronicle (Release v19.68.0): An explicit concurrency scope built for one stream of an event source is refused when passed to a single-route append to another stream of it;
ConcurrencyOptions.AllowRouteScopeStreamMismatchrestores the old behaviour (#4899) - Chronicle (Release v19.68.0): The concurrency and Dynamic Consistency Boundary documentation states that revising or redacting an event is not detected by append conditions (part of #4900)
- Arc (Release v22.101.0): Validators whose constructor registers rules as an expression body (
public MyValidator() => RuleFor(...)) now have those rules recovered. (part of #3116) - Arc (Release v22.101.0): Arc requires Cratis Screenplay 4.164.0 or later. (part of #3116)
- Screenplay (Release v4.172.0):
PLAY0268no longer refusespattern,randomandrulegeneration; generated secrets remain refused (part of #616) - Screenplay (Release v4.172.0): The generated-values documentation covers patterns, checksums, ranges and rule generators with the shop example (part of #616)
- cli (Release v3.65.0): The CLI bundles Stage 4.106.0 and Screenplay 4.170.0; rendered applications use Chronicle 19.64.1 and Arc 22.95.0, rendered queries take concept-typed keys and filter values again so out-of-rule arguments answer with a validation error, and
cratis runstarts thecratis/stage:4.106.0image. - Screenplay (Release v4.171.0): New error
PLAY0700: a capture over events must key by a property that everyfromevent declares as required; a context key such askey $eventSourceIdis refused. Chronicle fails the partition for an event without the key, so the model now says so at compile time. (#483) - Screenplay (Release v4.171.0): New error
PLAY0701:given captureandwhen capturecannot name a capture over events, because a record does not say which event arrived. When the capture reads exactly one event, the quick fix in the editors and through MCP rewrites the step togiven <Event>/when append <Event>with the same lines. (#483) - Stage (Release v4.106.0): Rendered queries take concept-typed
bykeys and filter values again, so Arc’s concept validators answer an out-of-rule argument with a 400 instead of an empty result. Nested and collection concept values are validated too, so they are no longer refused. A valid key that matches nothing still returns no result. (#370) - Stage (Release v4.106.0): Stage builds against Screenplay 4.170.0. ESM v20 models remain refused with
STAGE-ESM-016. (#370) - Stage (Release v4.106.0): An optional concept key or filter with a
not emptyrule fails withSTAGE-ESM-010, because Arc skips validation for a null argument while the reference validates it. Query rejection specifications with prior events or read-model state, and composite query arguments that leave out members, are refused with their own diagnostics rather than rendered differently from the reference. (#370) - Chronicle (Release v19.67.0): Decision 0009 now records two clarifications. A unit of work with protected reads and no events stores its receipt through the same validate-only append, so the decision’s scopes are still checked. Each schedule cursor tracks the revision registration announced (
RegisteredRevision) separately from the one it has applied (AppliedRevision), so a schedule change is migrated exactly once. (part of #4911) - Stage (Release v4.105.1): Commands that Stage can’t render now say exactly why. Instead of one generic
STAGE-ESM-005: Command '<X>' exceeds the first Cratis command capability, each failing condition gets its ownSTAGE-ESM-005diagnostic that names the event, property, validation rule, requirement or concept involved, explains why, and says what to change in the model. All failing conditions are reported, not just the first. For example, an optional event property now reads: Cratis events have no optional properties; make it required (in Studio’s model board, tick “Required”) or remove it. The same models are refused as before. (part of #409) - Arc (Release v22.100.0): An enrollment scope that conflicts with a generated identifier’s guard is reported as
ConflictingConcurrencyScopes, without the identifier or scope values in the message. (#3245) - Arc (Release v22.100.0): Arc requires Cratis Chronicle 19.65.2 or later. (#3245)
- Chronicle (Release v19.66.0): Registering an opted-in subscription fails, before anything is recorded, when it names a generation that the source or the target event store has not registered, or two generations of the same event type (part of #4710)
- Chronicle (Release v19.66.0): When the target event store does not have the pinned generation at forwarding time, the subscription appends nothing and fails the batch without moving past the failing event, so it is retried instead of being skipped. Events forwarded before the failure stay acknowledged (part of #4710)
- Chronicle (Release v19.66.0): Changing only the generation or the opt-in of an existing subscription rebinds it in place, without unsubscribing it first (part of #4710)
- AI (Release v7.55.0): Skills, rules, agents and prompts point to
general.md’s Model first definition and the status script instead of restating the opt-in test, and verification fails when an instruction restates it. (#677) - AI (Release v7.54.0): Vertical slices rule: observation commands append only changes, compared against a
[Passive]model or the stream’s own events, with two specifications each; counters built with[Increment]/[Decrement]need commands that refuse non-transitions. - AI (Release v7.54.0): Reactors rule and skill: a reactor added in a release catches up the whole history on first registration and
[OnceOnly]does not cover that; sweeps must not decide from read models that are replaying. - AI (Release v7.54.0): Projection skill points to the counter transition requirement.
- Stage (Release v4.104.0): Reducer and specification artifacts in a render plan now also list their declaring slice among their sources, so a consumer such as Studio’s slice Preview can find a slice’s files by filtering on the slice id. Existing sources are kept, and the slice of an event a reducer reads never becomes an owner. Plan digests change; file contents don’t. The render plans reference now lists which artifacts each slice owns. (part of #400)
- Screenplay (Release v4.169.0): The Proposed view marks what a proposal adds and changes, and the Current view marks what it removes, with an Added, Changed or Removed badge that also carries the text for screen readers. The Current and Proposed buttons show the counts, for example “Proposed · 3 added, 1 changed”. Elements the board cannot badge on their own (queries, screens, specifications, triggers and persona lanes) mark the slice or module that contains them as changed. See the board view. (#709)
- Screenplay (Release v4.169.0): The board opens scrolled to the first change, and scrolls to it again when you switch between Current and Proposed or the model is refreshed. (#709)
- Screenplay (Release v4.169.0): Bump
@cratis/event-modelsand@cratis/sceneto 0.172.0 in the MCP App, the event models package and the VS Code extension. - Stage (Release v4.103.2): Generated applications use Cratis Arc 22.95.0. (#392)
- AI (Release v7.52.1): Documentation guidance and the technical-examples skill now say published pages may state version requirements and pin what the reader runs, but must not carry the author’s verification log (exact SDK builds, image digests or SHAs, test dates, “tested with” lines, which samples were not run). Those belong in the change summary.
- AI (Release v7.52.0): The skills check examples against the Screenplay 4.164.0 compiler and describe what Stage 4.103.0 and the cratis CLI 3.62.0 render. (#668) (#684) (#681)
- AI (Release v7.52.0): Arc and Chronicle skills describe Arc 22.97.0 and Chronicle 19.65.0, including reactor command invocation with refusal handling and read-model collection observation. (#695)
- AI (Release v7.52.0): Skills link to documentation pages with absolute
https://www.cratis.ioURLs, and verification fails on a documentation-site path that an agent cannot open. (#696) - Arc (Release v22.98.0): Denial specifications that cannot be stated truthfully stay reported with SP0039, and the warning now names the reason: caller not recovered, policy not recovered exactly, the stated caller satisfies the stated authorization, the denial cannot be decided from the stated caller, the denial is combined with another outcome, no stated policy explains it, or the command’s own code can return an authorization denial. (#3185)
- Chronicle (Release v19.65.2):
ConflictingEnrollmentScopenow carries the conflict as typed properties:EventSourceId,Effective,Requiredand, when known,EventSequenceId. Hosts that translate enrollment conflicts, such as Arc’s fresh-identifier guard, can now classify them without parsing the message. (#4909) - Screenplay (Release v4.166.0): The event model board in the MCP App takes the theme from the MCP Apps host when it connects and whenever the host changes it; a host that sends no theme, or one the board does not know, still gets dark. See the view documentation. (#710)
- Screenplay (Release v4.166.0): Bump
@cratis/event-modelsand@cratis/sceneto 0.171.14 in the MCP App, the event models package and the VS Code extension, and@cratis/fundamentalsto 7.24.1, so the board’s chrome uses theme tokens and the page loads one copy of@cratis/fundamentals. - AI (Release v7.51.5): The legacy-extraction skill explains which navigation Arc’s Screenplay generator recovers from react-router route tables (
item <name> navigate to <Screen>from menu items andnavigate to <Screen>after a command dialog succeeds), what it needs to match a route to a screen, and what still has to be written by hand. Requires Arc.Screenplay 22.96.0. (#692) - cli (Release v3.63.0): The CLI bundles Stage 4.103.0 and Screenplay 4.160.0; rendered applications use Chronicle 19.64.1 and Arc 22.88.0, and
cratis runstarts thecratis/stage:4.103.0image. - Arc (Release v22.97.0):
CommandInvocationcarries Chronicle’s[ReactorSideEffect]marker, so reactors that return command invocations synchronously no longer raiseCHR0054. (#3094) - Arc (Release v22.97.0): Arc requires Cratis Chronicle 19.63.0 or later and Cratis Screenplay 4.160.0 or later. (#3094)
- Screenplay (Release v4.164.0):
PLAY0268no longer refuses rules on generated concepts (part of #616) - Screenplay (Release v4.164.0): The generated-values documentation follows one shop example through strategies, choosing a strategy, rule consistency and when not to generate (part of #616)
- AI (Release v7.51.4): Every skill body now stays under the 16,000-character authoring target: tables, extended examples and long procedures in 34 skills (most of the Screenplay skills, the Chronicle clients, reactors, reducers and projections, and the Arc command, query and identity skills) moved into
references/, each with a pointer that says when to read it. No guidance was removed. (#686) - AI (Release v7.51.4): Verification warns when a skill body grows past the 16,000-character target, instead of at 18,000. (#686)
- AI (Release v7.51.4): Verification fails when a relative link in a skill or one of its references does not resolve from the file it is in. (#686)
- Chronicle (Release v19.65.0): The ASP.NET Core Chronicle health check reports the configured failure status (“Registration is in progress”) while the client re-registers. After a kernel restart, readiness therefore stays down until observers, projections and constraints are registered again, instead of routing traffic to a pod that is not ready. (#4875)
- Chronicle (Release v19.65.0):
WaitForRegistrationnow waits for a registration that is in progress and returns its outcome, instead of returning the previous outcome at once. (#4875) - Stage (Release v4.103.0): Stage, the Stage Host image (
cratis/chronicle:19.64.1-development) and the rendered backend scaffold use Chronicle 19.64.1. (#371) - AI (Release v7.51.3): Verification fails when a skill carries release history: versions outside a
Requiresline, issue or pull request numbers, source-line citations, commit hashes or history wording.SKILL_HYGIENE_MODE=warnreports them without failing. (#662) - AI (Release v7.51.3): The authoring rule explains how to decide what a version marks before removing it: release history goes, while the release that introduced a behavior, or one that changed it, stays as a
Requiresline. (#662) - Stage (Release v4.102.0): Stage uses Screenplay 4.160.0, and the rendered backend scaffold uses Arc 22.88.0. (#214)
- AI (Release v7.51.2): Rules that only matter for certain files now load when those files are touched, instead of in every session; rules a task needs before any file is touched, such as committing, opening a pull request or writing a work record, stay loaded in every session. Harnesses without path-scoped rules reach each scoped rule through
general.md. (#675) - AI (Release v7.51.2): Path-scoped profile rules cover every supported language and Screenplay models, and the Pi package keeps them for single-language repositories. (#675)
- AI (Release v7.51.2): Verification warns when the rule bytes a harness loads at session start grow past the current budget. (#675)
- AI (Release v7.51.1): The Screenplay method and language skills, slice conformance and slice specifications, the event-model diagram, reactor and read-model specification skills, and the React page skill describe current behavior without release history, probe results, source citations or issue numbers; a minimum version appears only as a
Requiresline, naming the release that introduced the behavior, where older releases behave differently. (part of #662) - AI (Release v7.51.1): Legacy extraction lists what
cratis screenplay generaterecovers from a slice’s screens: file, data bindings, title, tables and columns, actions and toolbar actions from Cratis Components, with qualified references for cross-slice actions, toolbar items and data bindings. (part of #662) - Screenplay (Release v4.161.0): A query’s
bykey and every supplied filter value are now checked against their concept’svalidaterules after authorization, as Arc does at runtime. An out-of-rule argument is a validation rejection with the rule’s message instead of a lookup that finds nothing; a valid key that matches nothing still answers no result, and an omitted optional filter is not checked. This applies to every executable model version. (#682) - Screenplay (Release v4.161.0):
PLAY0465also reports a query rejection that is combined withthen no result, a result, a denial or more than one query. (#682) - Arc (Release v22.95.0): A command that supplies an explicit
BeforeFirstscope for a generated target keeps working. A conflicting explicit scope for that target is rejected withConflictingConcurrencyScopesbefore anything is appended. (#3129) - Arc (Release v22.95.0): Arc requires Cratis Chronicle 19.59.4 or later. (#3129)
- Chronicle (Release v19.64.0): When several programs share an event store, each one replaces only its own declaration. Seeds added by hand, and other programs’ declarations, are kept. Identical seeds declared by more than one program are applied once, in the order they were declared. Set
ProgramIdentifierwhen several programs share a store (#4869) - Chronicle (Release v19.64.0): Global seeds stored by earlier versions are cleared by the first authoritative registration after both the client and the kernel are upgraded. To clear stale development seeds without resetting the store, upgrade both, remove the seeder or scope it with
ForNamespace(...), then start the application once (#4869) - Chronicle (Release v19.64.0): If a seeder cannot be activated, the client keeps the previously stored declaration instead of replacing it with an incomplete one, and logs which seeders failed (#4869)
- cli (Release v3.62.0):
cratis render <PATH>now renders with the model root’s persisted identities when.screenplay/identities.jsonexists, so generated event and type ids match the ones Studio and the Screenplay MCP use. Generated output changes for roots with persisted identities: earlier releases ignored those identities and rendered temporary ones, which diverged from the rest of the toolchain. To see the change, render the same root with the previous CLI and with this one into two folders and diff them. Roots without persisted identities render exactly as before. Existing destinations still face the stored event type id check (CLI-RENDER-016). See Render options. (#361) - cli (Release v3.62.0): For a root with persisted identities,
--namemust equal the saved application name; a different name is refused withCLI-RENDER-018. If the root cannot be opened (for example a pending operation or conflicting identities), render refuses withCLI-RENDER-017and the reason instead of falling back to temporary identities. (#361) - cli (Release v3.62.0): Release-baseline warnings for PATH input now come from the same opened workspace the render uses, so their model revision always matches the rendered model. (#361)
- cli (Release v3.62.0): The CLI bundles Stage 4.99.0.
- AI (Release v7.51.0): The README’s skill-authoring guidance and the skill review prompt follow the new rule; skills no longer carry version pins. (part of #674)
- Arc (Release v22.94.0): A screen binding is written only when its import resolves to a slice that declares the command or query. Imports from outside any slice directory, or from a module path that cannot be resolved, are still reported with SP0028 and left out, also when the screen’s own slice declares a command or query of the same name. (#3204)
- Chronicle (Release v19.62.4): The seeding documentation now states the scope of global seeds:
- Chronicle (Release v19.62.4): A global seed reaches every namespace of the event store, including ones created later, once.
- Chronicle (Release v19.62.4): Opening a store for a new namespace creates it, and the kernel then applies the stored global seeds. This usually happens before the application’s first write, but the order is not guaranteed.
- Chronicle (Release v19.62.4): Development or sample data belongs in
ForNamespace(...). - Chronicle (Release v19.62.4): Removing a global seed from code does not remove the stored entry yet (part of #4869)
- Chronicle (Release v19.62.3): SQL storage records which physical database each event store, namespace and read-model set uses, in a new
DatabaseNamestable in the cluster database, and never moves a database once it is recorded. Existing deployments with short names keep their databases unchanged. An existing deployment whose PostgreSQL names were already truncated keeps the shared database where ownership is clear; where data could be stranded, the kernel stops withDatabaseOwnershipUnresolvedand the SQL database names documentation describes how to move the data and record the binding. A configured cluster database name longer than the provider limit now fails startup instead of being truncated. (#4849) - cli (Release v3.61.1): The CLI bundles Screenplay 4.159.0.
- Stage (Release v4.99.0): Stage builds on Screenplay and its canonical corpus 4.159.0. Models that use ESM v17 (explicit no-event assertions and recovery redelivery, Screenplay decision 0074) are still refused with
STAGE-ESM-016until Stage renders them (see #371). (#388) - Chronicle (Release v19.62.0): A unit of work that has had a contributor keeps every required scope until it completes, accepts events for only one event sequence, rejects changes made from inside a contributor with
UnitOfWorkMutatedDuringEnrollment, and refuses to commit withUnitOfWorkEnrollmentNotificationFailedwhen a contributor’sEnrollednotification fails. Units without contributors behave as before. CustomIUnitOfWorkimplementations keep compiling and throwUnitOfWorkEnrollmentContributorsNotSupportedonly when a contributor is attached. (#4861) - Screenplay (Release v4.160.0): A mixed refusal is classified as authorization first, then constraint, then validation; concurrency conflicts, exceptions and unsupported outcomes are never refusals and keep failing the reaction, matching Arc reactors (#433)
- Screenplay (Release v4.160.0):
PLAY0268no longer reports reaction refusal handling, and the editor no longer describes refusal branches as syntax-only (#433) - AI (Release v7.50.0): Read models that mix kinds of computation are split by default; keeping them together needs a written reason. (part of #672)
- Chronicle (Release v19.60.0): Registering an opted-in webhook fails, before anything is recorded, when it names an unregistered generation or two generations of the same event type, the same rule that applies to opted-in reactors, reducers and projections (part of #4710)
- Chronicle (Release v19.60.0): When a pinned event cannot be released in its pinned generation, the webhook sends no request and fails the batch without acknowledging it, so it is retried instead of being skipped (part of #4710)
- cli (Release v3.61.0): The CLI bundles Stage 4.97.0.
- Chronicle (Release v19.59.7): On startup the SQL storage upgrades existing per-event-source constraint tables to a unique index. On SQL Server the value column is bounded to 200 characters first; the change is skipped, never truncating data, when a table holds longer values or values stored before constraint values were hashed, and a warning names the table and links to https://github.com/Cratis/Chronicle/issues/4866. A table that already contains duplicate values keeps every row, keeps a non-unique index and logs a warning once per process; remove the duplicates and restart to get the unique index. (part of #3744)
- Stage (Release v4.98.1): Stage and the rendered backend use Arc 22.88.0, Chronicle 19.59.4 (the Stage Host image bundles
cratis/chronicle:19.59.4-development) and Screenplay 4.156.1. - Stage (Release v4.98.1): The daily package update no longer bumps the .NET reference pack that Stage embeds to check pure reducer transitions. That pack stays on its pinned version.
- Arc (Release v22.91.0): In the default scenario mode,
QueryScenarioobserves Chronicle read models over the scenario’s own storage, so read models built with[ChildrenFrom<T>], joins and reducers emit correctly instead of failing (#3154) - Arc (Release v22.91.0): Arc requires Cratis Chronicle 19.59.1 or later, and references Cratis.Metrics.Roslyn 7.24.0 and FluentValidation 12.2.0 as Chronicle requires (#3154)
- Stage (Release v4.98.0):
STAGE-ESM-004now refuses only state-change slices without commands.STAGE-ESM-006still refuses expression conditions and enumeration operands in production conditions. (#360) - AI (Release v7.48.4): Agents now choose how to build a Chronicle read model with one ladder that matches the Chronicle documentation: model-bound attributes first, fluent
IProjectionFor<T>when the mapping needs structure, and a reducer when the logic reads better as code, as a normal choice rather than a last resort. (#660) - AI (Release v7.48.4): Agents write Chronicle self-reducing read models (static
Reducemethods on the read model, Chronicle 19.58.0 and later) as the default reducer form in .NET, useIReducerFor<T>when the fold needs injected services or must live apart from the model, and nominate a plain class only when the contract assembly cannot reference Chronicle. The guidance covers marker-free discovery on upgrade, near-miss warnings, replay hooks, ownership conflicts, testing, and that decision reads do not admit reducers. (#660) - AI (Release v7.48.4): Arc guidance keeps the read model, its
Reducemethods and its queries on one record, withRequireQueryAttributeand[Query]only for Arc versions before 22.90.0. (#660) - cli (Release v3.60.0): Every
cratis render, at application scope and for selected scopes, including--check, now runs Stage’s publication check against the destination before writing. A render that would change an existing Chronicle event type id, or cannot read one safely, is refused withCLI-RENDER-016and Stage’sSTAGE-EVENT-002diagnostic; nothing is written and--forcedoes not bypass it. Pin the event’sidto keep its stored name. (#354) - cli (Release v3.60.0): An existing destination file that cannot be read for that check is refused instead of failing with an unhandled error. (#354)
- cli (Release v3.60.0): The CLI bundles Screenplay 4.154.0 and Stage 4.96.0, which brings Chronicle 19.55.2 and Arc 22.87.0 to rendered applications.
- Arc (Release v22.90.0): A static method on a
[ReadModel]that takes the read model itself as a parameter, such as a self-reducing read model’sReduce(event, current), is no longer exposed as a query endpoint or generated proxy. The rule applies the same way to runtime discovery, the TypeScript proxy generator, query metadata, Screenplay and the analyzers; marking such a method[Query]is reported as an error.RequireQueryAttributekeeps working as before. (#3239) - Arc (Release v22.90.0):
ARCCHR0019no longer warns that a self-parameterReducemethod would become a query endpoint. (#3239) - AI (Release v7.48.3): The
cratis-screenplay-toolchainskill is rewritten as guidance for running and checking models: locating the model, the command behind each verdict and what a pass looks like, reading diagnostics, executable and renderable constructs, and traps. It no longer carries version tables, probe history or source citations; where a construct needs a minimum tool version, the reference that teaches it says so in oneRequiresline. (part of #662) - AI (Release v7.48.3): Skills that sent agents to the toolchain’s version table now point to how to read the installed versions (
screenplay --version,cratis --version) or to the capability reference that answers the question. (part of #662) - Screenplay (Release v4.158.0):
propose-sourcewithformatting: "PreserveExactSource"now writes your source text exactly as supplied, including structural edits such as an addedimportor an appendedfeature. Comments, column alignment, blank lines and line endings are kept, a replaced document keeps its BOM policy, and the proposal goes through the same parse, identity, reference and compilation checks as canonical printing.CanonicalizeTouchedDocumentsstill reprints touched documents canonically, andpropose-astis unchanged. (#708) - Screenplay (Release v4.158.0): A
propose-sourcestructural change refused underPreserveTrivianow namesPreserveExactSourceas the way to keep the supplied text. (#708) - Stage (Release v4.97.0): Stage builds on Screenplay and its canonical corpus 4.154.0. (#375)
- Screenplay (Release v4.157.0):
PLAY0268now names only reaction refusal branches and$refusalvalues, which remain syntax-only (part of #433) - Stage (Release v4.96.1): Stage no longer pins
Microsoft.Orleans.Remindersdirectly. It now resolves together withMicrosoft.Orleans.ServerthroughCratis.Orleansand the Chronicle testing packages, so automated package updates can’t move it to a different Orleans version than the server. (#217) - Stage (Release v4.96.0): Stage builds on Screenplay and its canonical corpus 4.152.0, Chronicle 19.55.2 and Arc 22.87.0. Generated applications, the Docker images and the spec runner pin the same Chronicle and Arc versions. (#344)
- Stage (Release v4.96.0): A semantic
not emptyrule on text now rejects whitespace-only values, for both concept and command validation, following Screenplay decision 0071. (#344) - Stage (Release v4.96.0): Non-text
secretconcepts (Int,Decimal,Bool,Date,DateTime,Uuid) now render and run instead of failing withSTAGE-ESM-041. Chronicle 19.55.2 encrypts them at rest and returns them in their original type. (#344) - Stage (Release v4.96.0): The rendering guides now explain how event ids are chosen, which publishers enforce
STAGE-EVENT-002, and that renaming an event without a pin still loses access to its stored events. They now recommend the Screenplay rename tool, which adds the pin. (#372) - AI (Release v7.48.1): The Stage rendering and sandbox skill reads as guidance only: how to render, what is admitted and refused with the diagnostic you will see, how to recover, and how to verify a render. Release history, probe results, source citations and per-version listings are gone, and the one version requirement is a single
Requiresline (part of #662) - AI (Release v7.48.1): Scaffold and CLI bundle version pins moved from the skill to a maintainer compatibility page (part of #662)
- Screenplay (Release v4.156.0): Every MCP proposal result now carries a short human
summary, also returned as a second text block after the JSON: which documents change, which modules, features, slices, commands, events, read models, screens and reactions are added or removed, what the authoring checks reported, how many comments are dropped and whether the result is executable. (#711) - Screenplay (Release v4.156.0): Proposal results explain their
authoringDiagnosticCount: the newauthoringDiagnosticSeveritiessplits it into errors, warnings and information with the distinct codes, and a note says it counts checks run while proposing, including thePLAY0288canonical-printing notice, whileafter.readinesscounts diagnostics of the resulting source alone. (#711) - AI (Release v7.48.0): The rules and skills no longer recommend a passive read model for command-side decisions without saying it guards nothing. Passive is current, not protected (#661)
- AI (Release v7.48.0): Corrected guidance (#661):
- AI (Release v7.48.0): which command property Arc uses as the event source
- AI (Release v7.48.0): when ARCCHR0002 fires
- AI (Release v7.48.0): that
[RemoveConstraint]also releases a[Unique]event type - AI (Release v7.48.0): what a decision guard detects when another writer has no guard
- AI (Release v7.48.0): what an empty protected commit validates
- Screenplay (Release v4.155.0): A capture whose
source eventsconsume events from more than one origin is now refused at design time withPLAY0687, matching the runtime rule that one capture reads one event store; split such a capture into one capture per origin (#706) - AI (Release v7.47.1): The shop example’s
ApiKeyis identified by a separateApiKeyId, because an event-source ID is plaintext metadata that cannot be encrypted;ApiKeystays a secret value property (part of #576) - AI (Release v7.47.1): The generated-values reference explains how Chronicle checks generated-value freshness: a batch’s scopes once, all or nothing, before the batch, and again on a storage retry that renumbers the append (part of #576)
- Chronicle (Release v19.59.2): The concurrency documentation explains how a generated identifier is guaranteed to be new with a scope that expects no prior events, how batches and storage retries check that scope, what happens on a collision, and when to use a unique constraint or a deterministic identifier instead (#4713)
- Stage (Release v4.94.0): Time-ordered generated values (
uuidv7,ulidandtypeidconcepts in ESM v15 models) now take their time from the command’s receipt time instead of the wall clock, in rendered applications and in the Stage Host. A value and$context.occurredof the same command come from the same instant. Rendered concepts implementIGeneratableInContext<T>, so hand-written code that calledNew()on one of them now passes aGenerationContext. (#376) - Stage (Release v4.94.0): Rendered command specifications with an unpinned time-ordered value fix Arc’s scenario clock and check that the value’s time part matches the receipt time. (#376)
- Screenplay (Release v4.154.0):
screenplay baseline admit --from-esmrecords the stored name that shipped ESM v16 carries for renamed events, instead of refusing every shipped event name that differs from the current pinned name; a shipped stored name that differs from the current one still refuses withShippedStoredNameMismatch. (#719) - Arc (Release v22.88.0): Validation results that Arc composes itself after stream completion use the new reason
frameworkFailureinstead ofrule(#3058) - AI (Release v7.47.0): Renaming a Screenplay event while keeping stored events readable: pin the old stored name with
id "<old name>", which ESM v16 now carries to renderers as the event’s stored name. The skills cover the pin rules (PLAY0472), the end of the interim PLAY0686 caveat, and what Stage and the cratis CLI render today (#654) - AI (Release v7.47.0): The Screenplay release baseline: run
screenplay baseline admitin the release job andscreenplay baseline checkin CI, read the baseline through the MCP, and which event edits a baselined revision accepts; this replaces the earliereventNeverPersistedguidance (#655) - AI (Release v7.47.0): The standalone Screenplay tool pin and pinned language contract move to 4.153.0 (part of #655)
- AI (Release v7.45.0):
cratis-guard-writesallows writes to dependency manifests, lockfiles,global.jsonand NuGet configuration by default when the file belongs to a repository whoseoriginisgithub.com/Cratis/*. SetallowDependencyManifestWritesin that repository’s.cratis/ai.jsontofalseto keep the block, or totrueto allow these writes in any other repository. Generated files and.envfiles stay blocked everywhere, andCRATIS_HOOKS_ALLOW_PROTECTED_WRITES=1still allows a single protected write (#520) - AI (Release v7.45.0): The dependency-manifest rule lets Cratis organization repositories bump versions as needed, without unrelated churn and with bumps called out in the pull request; other repositories still change them only when asked (#520)
- Screenplay (Release v4.153.0):
screenplay_propose_propertyandscreenplay_propose_renamereport each event revision’smutability. Without a baseline nothing changes. Revisions outside the baseline are edited in place without choosingnewGenerationoreventNeverPersisted, and their renames add no pin. Baselined revisions refuse in-place edits andeventNeverPersistedwithBaselinedRevisionImmutableand accept onlynewGeneration. (#686) - Screenplay (Release v4.153.0): Every proposal and every apply checks the candidate against the baseline: a change to a baselined revision’s stored shape, including through a concept, composite type or enum it uses, refuses with
BaselinedRevisionChanged, a removed one withBaselinedRevisionMissing, and a baseline that changed since the proposal withStaleReleaseBaseline. An unreadable baseline blocks only proposals that change event contracts. (#686) - cli (Release v3.59.0): The CLI bundles Stage 4.92.0, and
cratis runstarts the matchingcratis/stage:4.92.0image. - cli (Release v3.59.0): Observable collection queries render as Arc observable queries that push every change to subscribers, and snapshot collection queries now render instead of being refused, with or without a
bykey and equality filters. - cli (Release v3.59.0): Screenplay
allprojection blocks whose mappings set event-source identities render as ChronicleFromAll;allblocks with literal mappings or no mappings are still refused withSTAGE-ESM-017. - cli (Release v3.59.0): Event sources with PascalCase names render as
{Name}EventSourceclasses with a public constant per stream, and every generated stream reference uses that constant; the stored stream names Chronicle sees are unchanged. A constant that collides with another member or a C# keyword is refused withSTAGE-ESM-012. - Screenplay (Release v4.152.0): Event
idpins are validated: a pin must be an event-name identifier, every generation of an event must share one stored name, and two events in one application cannot share a stored name (PLAY0472). (#704) - Screenplay (Release v4.152.0): Warning PLAY0686 is retired: event pins are carried to renderers instead of being reported as dropped, and
screenplay_propose_renameno longer reportseventPinWarningsentries. (#704) - Screenplay (Release v4.152.0): Generated-value freshness and fixture-shape checks in the reference evaluator now apply to models that declare concept generation, rather than to every model at ESM v15 or later, so a model that moves to a later version for an unrelated reason keeps its evaluation. (#704)
- Chronicle (Release v19.58.0): Upgrade effect: an existing class that does not implement
IReducerand already has apublic static Reducemethod of exactly that shape becomes a self reducer after upgrading. A staticReducethat only nearly matches logs a warning and is skipped; types implementingIReducerorIReducerFor<T>keep their current behavior. With Arc, mark such a model[ReadModel(RequireQueryAttribute = true)]and its query methods[Query]soReduceis not exposed as a query endpoint. (#4731) - Chronicle.Go (Release v0.10.0): Contracts are regenerated from Chronicle 19.56.0, and the verified decision-guard profile and the integration workflow image move from 19.32.3 to 19.56.0. The full integration suite passes against a 19.56.0 kernel.
- AI (Release v7.44.0): Screenplay specifications can pin a child projection event that arrives before its parent: the reference evaluator holds the child until the parent exists, and a child whose parent never arrives stays out of the read model (#648)
- AI (Release v7.44.0): A stream whose stored name is
Allis refused (PLAY0273), and an eventidpin now warns (PLAY0686) because renderers do not carry it yet, so a renamed event renders under its new name (#650) - AI (Release v7.44.0):
not emptyon text rejects whitespace-only values in every ESM version, while collections still need one element and identity parts are unaffected; specifications that relied on whitespace being accepted now fail (#652) - AI (Release v7.44.0): The standalone Screenplay tool pin and pinned language contract move to 4.151.0 (part of #652)
- Chronicle.TypeScript (Release v6.52.0): Moved to
@cratis/chronicle.contracts19.56.1, filling the newIsNotReplayable,IsInactiveandGenerationDeliveryfields on registrations. - Chronicle.Kotlin (Release v6.14.0): Moved to
chronicle-contracts19.56.0. - Chronicle (Release v19.57.0): Captures over public events name the events they consume with
from <Event>lines, the same syntax as Screenplay; the inbox to read is derived from the events’ originating event store (#4700) - Chronicle (Release v19.57.0): Chronicle uses Cratis.Screenplay 4.149.0 and takes Screenplay updates again with the other scheduled package updates (#4799)
- Screenplay (Release v4.151.0):
not emptyon text now rejects whitespace-only text as well as null and empty text, for concept rules and command property rules alike and in every executable model version, matching Arc: whitespace is the Unicode White_Space set (U+0085 and U+00A0 count, U+FEFF does not). Specifications that relied on whitespace-only text being accepted now expect a rejection. Collections keep “at least one element”, and event-source and stream-id parts still treat whitespace as a value (#680) - Stage (Release v4.92.0): An event source whose model name is a PascalCase identifier renders as
{Name}EventSource. Each stream with such a name becomes a public constant on that class holding its stored name, and every stream reference uses that constant:EventStreamattributes, command stream attributes, reducer and reactorfromfilters, and generated specification routes. Chronicle sees exactly the same stored names as before. Other names render as before. (#368) - Stage (Release v4.92.0): A stream constant that would collide with another member or a C# keyword fails
STAGE-ESM-012. (#368) - Stage (Release v4.92.0): The renderer guide and rendering reference warn that renaming an event in a model that already has stored data renames its Chronicle event type, until Screenplay carries the stored event name. (#368)
- Screenplay (Release v4.150.0): A stream whose stored name is
All(its name, or anid "All"pin) is refused with PLAY0273, as the stored source nameDefaultalready is. Models that use it must rename the stream; events already stored underAllread as source-only appends. This narrows what earlier releases bound.alland other spellings remain valid. (#700) - Arc (Release v22.87.0): Arc requires Cratis Chronicle 19.54.0 or later (part of #3154)
- Arc (Release v22.87.0): In the default scenario mode, observing a read model built with
[ChildrenFrom<T>]is not supported yet and fails with Chronicle’s error; use decision mode (EnableDecisionReads) for those read models until https://github.com/Cratis/Chronicle/issues/4816 ships (part of #3154) - AI (Release v7.43.0): The standalone Screenplay tool pin and pinned language contract move to 4.149.0 (part of #645)
- AI (Release v7.42.0):
ship-changesends with a mandatory cleanup step, which is the trigger for harnesses without hooks. - AI (Release v7.42.0): The worktree rule points to the script instead of manual removal.
- Chronicle (Release v19.55.1): The kernel and clients build against Cratis Arc 22.86.0, Cratis Fundamentals 7.24.0, Orleans 10.4.0 and Cratis.Orleans 1.16.3, along with the other dependency updates from the reverted 2026-10-12 package update (part of #4799)
- cli (Release v3.57.1): The
validatehelp and the Screenplay reference list every--checkname (includingpersonas,purposes,privilegeandenum-pinning) and the exit codes: 0 valid, 1 missing or invalid input or scope, 5 validation failed. (part of #339) - Chronicle (Release v19.55.0): The kernel now accepts gRPC messages up to 100 MB by default, matching what every client allows itself to send. It was limited to 4 MB.
- AI (Release v7.41.0): Rendering guidance follows CLI 3.57.0 / Stage 4.89.1: observable equality filters, reaction
runs asfor role and authenticated identities, semantic observer filters and single-hop reaction append specifications now render; the refusals that remain are listed exactly as Stage emits them (part of #643) - AI (Release v7.41.0): The rendered-application pin table lists the Stage 4.89.1 scaffold: Arc 22.83.0 and Chronicle 19.54.0 (part of #643)
- AI (Release v7.41.0): The
cratis/stagesandbox section describes Stage 4.89.1, including Host encryption of personal-data values (part of #643) - AI (Release v7.41.0): The standalone Screenplay tool pin and pinned language contract move to 4.148.0 (part of #643)
- Screenplay (Release v4.149.0): The
EventRoutescanonical corpora use the streamArchiveinstead ofAll, so Cratis renderers can run them, and the observer-filter specifications assert through a projected read model that a reaction did not fire for unrouted facts or facts on another stream. (#699) - Chronicle.Kotlin (Release v6.13.1):
ChronicleOptions.copy()and its constructor take one more trailing parameter,maxReceiveMessageSize; the existing constructor overloads are unchanged. - Stage (Release v4.90.0): The generated frontend asks observable queries for their first result (
waitForFirstResult=true), so list screens load as before. Screens still refresh after commands; pushing live updates to the generated frontend and the Stage Host is tracked in https://github.com/Cratis/Stage/issues/366. (#278) - Stage (Release v4.90.0): A protected observable list specification that expects rows is refused with
STAGE-ESM-011until Arc’s command scenario can observe read models (https://github.com/Cratis/Arc/issues/3221). Denial specifications still render. (#278) - cli (Release v3.57.0): The CLI bundles Stage 4.89.1 and Screenplay 4.147.1, and
cratis runstarts the matchingcratis/stage:4.89.1image. (#345) - cli (Release v3.57.0):
cratis renderadmits ESM v14 and v15: equality query filters render on observable collection queries, and concepts with a generation strategy (UUID v4/v7, ULID, TypeID, NanoID, random bytes) render with freshness scopes on generated event sources. Models newer than v15 are still refused withCLI-RENDER-004. (#345) - cli (Release v3.57.0): Reactions declaring
runs asand reactions with afromobserver filter now render through the bundled Stage instead of being refused withSTAGE-ESM-034/STAGE-ESM-035;STAGE-ESM-034remains only for system-identity reactions that invoke commands whose authorization reads claims or uses opaque policies. (#345) - AI (Release v7.40.0): Rendering guidance follows CLI 3.56.0 / Stage 4.83.0: render admission covers ESM v1 to v13, so models with UUID-concept generated values, command responses, explicit enum numbers and concept compliance (v13) render through the CLI. ESM v14 collection filters and later versions are still refused (
CLI-RENDER-004) (#623) - AI (Release v7.40.0): The refusals that remain are stated exactly as Stage 4.83.0 emits them, including event-triggered Automation limits, validated query keys and routed companion replay (#623)
- AI (Release v7.40.0): The rendered-application pin table lists the Stage 4.83.0 scaffold: Arc 22.78.0, Chronicle 19.45.0 and Scene 4.22.1 (#623)
- AI (Release v7.40.0): The
cratis/stagesandbox section describes Stage 4.83.0: the semantic engine admits ESM v1 to v13 and runs event-triggered reactions (#623) - Stage (Release v4.89.1): Stage, the Stage Host image (
cratis/chronicle:19.54.0-development) and the rendered backend scaffold use Chronicle 19.54.0, which adds observable read-model queries. (part of #278) - Arc (Release v22.86.0): Generation strategies need Screenplay ESM v15: models that use them select ESM v15, and a
MaximumExecutableModelVersionbelow v15 keeps the previous output and reports the withheld strategy. In a v15 model, UUID pins must be version 4 UUIDs; other pins are left out withSP0039(part of #3116) - Arc (Release v22.86.0): Factories the generator cannot read as one strategy call, generation that uses the generation context’s time or tenant, and concepts with validation rules keep their legacy command and are reported with
SP0073(part of #3116) - Arc (Release v22.86.0): The Screenplay generator uses Cratis Screenplay 4.148.0 (part of #3116)
- Stage (Release v4.89.0):
STAGE-ESM-035no longer applies to reactions in the semantic renderer. The legacy syntax engine still refuses observer filters withSTAGE-ESM-035. (#297) - Stage (Release v4.88.0): A command form element placed on a screen is now the runtime command form for its command in the position and with the id it was authored with: it takes the form the screen has for the command (or the form that follows the command’s schema), keeps its authored properties such as its label, and that form is no longer appended a second time after the screen’s other elements. Before, only a screen’s own forms reached the runtime, at the end of the screen. (part of Cratis/Scene#7)
- Stage (Release v4.87.0): Stage pins Arc 22.83.0 and Screenplay 4.147.1 and admits ESM v1–v15. Models below v15 render and run as before. (#357)
- Stage (Release v4.87.0): At v15, a pinned generated fixture must match its strategy’s shape. An implicit UUID pin must be a lowercase version-4 UUID, so a pin such as
11111111-1111-1111-1111-111111111111failsSTAGE-ESM-011. (#357) - Stage (Release v4.87.0): Unknown generation strategies fail
STAGE-ESM-028, and the legacy syntax engine refuses every explicit strategy withSTAGE-ESM-028. Slices with several commands and conditional productions remain refused (STAGE-ESM-004,STAGE-ESM-006), tracked in https://github.com/Cratis/Stage/issues/360. (#357) - Chronicle (Release v19.54.0): Custom
IReadModelsimplementations keep compiling:Observe<T>()has a default implementation that throwsReadModelCannotBeObserved. Passive read models and read models that target an event sequence throw the same exception, because they have no stored collection to observe (#4759) - Stage (Release v4.86.0):
STAGE-ESM-034now refuses onlyruns asreactions that invoke commands whose authorization reads claims or uses opaque policies. Arc’s system principal carries subject claims that Screenplay treats as unknown, so such a command could be allowed in the rendered application and denied by the model. (#292) - Stage (Release v4.86.0): Reaction appends that fan out to several reactions, cascade further, use
$context, expect read-model or query state, or produce events that constraints check still failSTAGE-ESM-011. (part of #207) - Arc (Release v22.85.0): The Screenplay generator uses Cratis Screenplay 4.146.0 (#3196)
- Screenplay (Release v4.148.0): Feeding a returned value into another command’s generated input still reports PLAY0485 (part of #300)
- Screenplay (Release v4.148.0): The Invoicing sample navigates to the registered invoice from a returned value, and the forms, interactions and commands documentation describe the continuation scope (part of #300)
- Arc (Release v22.83.0): Arc requires Cratis Fundamentals 7.24.0 or later (#3165)
- Arc (Release v22.83.0):
ARC0022accepts concepts that implementIGeneratableInContext<T>(#3165) - Screenplay (Release v4.147.2):
run-public-acceptance.shruns the Studio production vector with Studio’s scratch proof (import the published corpus, edit and save a screen, export, Play) instead of the generic-selector harness, whenSCREENPLAY_STUDIO_CHECKOUTpoints at a Studio checkout. The Studio URL defaults to the production principal-header proxy onhttp://127.0.0.1:5156when it answers, so the vector no longer reportsblocked-missing-studio-url(part of #173). - Screenplay (Release v4.147.2): The blocked state names what to set (the URL, the checkout and the production proxy) instead of a stale deploy note.
- Stage (Release v4.85.0): Secret concepts that aren’t text (
Int,Decimal,Bool,Date,DateTime,Uuid) are refused withSTAGE-ESM-041, both when rendering and in the Host, because Chronicle can’t yet store them (see https://github.com/Cratis/Chronicle/issues/4813).pii secretconcepts use personal-data protection and are not affected. (part of #346) - Stage (Release v4.84.0): Stage uses Screenplay 4.146.0 and admits ESM v1–v14. Models without filters render exactly as before. (#348)
- Stage (Release v4.84.0): Filters on snapshot collection queries or DateTime properties fail
STAGE-ESM-010. Filter parameter names that collide with other generated names failSTAGE-ESM-012. The specification executor refuses filtered query assertions withSTAGE-ESM-010instead of ignoring the filters. (#348) - cli (Release v3.56.0): The CLI bundles Stage 4.83.0 (from 4.80.0), so
cratis rundefaults to thecratis/stage:4.83.0image andcratis renderplans with the Stage 4.83.0 renderer. The packed-CLI check now also runs Stage’s responsive-shell assertions against the rendered application, which keeps the narrow-window menu working in what the CLI renders. (part of #284) - Screenplay (Release v4.147.0): Generated values in specifications can be text, not only UUIDs (part of #616)
- Screenplay (Release v4.147.0): Decision 0054 records the delivery phases of #616 and the encoding details fixed at admission (part of #616)
- Stage (Release v4.83.0): The Scene packages are pinned at 4.22.1 (from 4.21.0) in the Stage frontend, the Host and the generated frontend package set.
- Arc (Release v22.81.0): Completing a stream from a command now closes it only for the command’s event source, so another event source using the same stream type and stream id stays open. A command without a key property or
ICanProvideEventSourceIdstill closes the stream for every event source. Completing a stream from a reactor closes it for the observed event’s event source. Owner-qualified stream id templates such as{Owner}:{Month}are no longer needed to keep a close from reaching other event sources. Requires Chronicle 19.39 or later; an older Chronicle server fails the completion instead of closing the stream for every event source (#3126) - cli (Release v3.55.0): The CLI bundles Stage 4.80.0 (from 4.79.1), the release whose live Stage loads approved packages at runtime, so
cratis rundefaults to thecratis/stage:4.80.0image. - Stage (Release v4.82.0): Rendered backends and Stage itself pin Arc 22.78.0, including the Cratis metapackage. (part of #175)
- Stage (Release v4.82.0): Generated TypeScript proxies for commands with a response are typed with it, for example
Command<IRegisterProject, Guid>for a scalar UUID response orCommand<IRegisterReceipt, RegisterReceiptResponse>for a named one, instead of exposing the event wrapper. (part of #175) - Stage (Release v4.82.0):
STAGE-ESM-037now explains why reactions that both produce events and invoke commands are still refused. A refused command would make Chronicle redeliver the trigger and append the reaction’s events again. The refusal stays until reactor appends are idempotent across redelivery (https://github.com/Cratis/Chronicle/issues/4809, https://github.com/Cratis/Arc/issues/3207). (part of #342) - AI (Release v7.39.0): Commands that own their event use inline
produces event <Name>, which defaults its destination to the command identifier; shared events keep a standaloneeventand useproduces <Name>with an explicitfor - AI (Release v7.39.0): Compliance markers are written as bare
piiandsecretthroughout - AI (Release v7.39.0): The standalone Screenplay pin moves to 4.145.0 with its published contract
- cli (Release v3.54.0): Bundles Stage 4.79.1 and Screenplay 4.145.1, and runs
cratis/stage:4.79.1by default. Server-generated UUID values, scalar and named command responses, and event-triggered reactions now render instead of being refused. - cli (Release v3.54.0):
cratis ai installandcratis ai updatelink.github/instructionsto the corpus’s generated Copilot adapters (.cratis/ai/harnesses/copilot/instructions), so Copilot applies the Cratis rules by path. An older corpus without those adapters keeps the link to.cratis/ai/rules, andcratis ai updaterelinks existing installs. (#341) - Stage (Release v4.81.0): Event-triggered reactions no longer fail
STAGE-ESM-024in the spec runner. Clock, application, startup and shutdown triggers and opaque reaction bodies still do, and a reaction mapping that reads the occurrence time without agiven clockis rejected with the reference’s message. (part of #207) - AI (Release v7.38.2): The screens smoke pins the current public vector: CLI 3.53.1 and
Cratis.Screenplay.CanonicalCorpus4.145.0, so the MCP edit and render replay on the vector that carries history, guarded actions, toolbar and module navigation (part of Cratis/AI#536). - AI (Release v7.38.2): The screens authoring workflow and UI-composition skills say the browser run passes on CLI 3.53.1 and that it now runs in corpus CI.
- Scene (Release v4.22.0):
chartdescribesdata(labels, datasets),optionsandstyle;treeTabledescribescolumns,items(nodes down four levels, a node’sdataa map) andselection;dataScrolleritemsandmultiStateCheckboxoptions,iconsandvalueare described. Structured values stay bindable to a data context, a query result or a component property. - AI (Release v7.38.1): The Stage rendering skill states that Stage 4.79.1 renders keyed lookups and filtered observable collections whose scalar key concept has validation rules, converting the key inside the query so an out-of-rule key finds no instance; earlier Stage releases, including the one bundled with cratis CLI 3.53.1, still refuse a validated snapshot-lookup key (#635)
- AI (Release v7.38.0): The standalone Screenplay pin moves to 4.144.0 with its published contract
- Arc (Release v22.79.0): For commands routed through an event source definition, appending a returned
EventForEventSourceIdwhose legacy routing names a registered definition and a stream it does not declare now fails withEventStreamDoesNotBelongToEventSource, as typed routing already did, instead of appending to an undeclared stream. (part of #2987) - Arc (Release v22.79.0): The public constructors of
SingleEventForEventSourceIdCommandResponseValueHandler,EventsForEventSourceIdCommandResponseValueHandlerandEventsWithConcurrencyScopesCommandResponseValueHandlerthat do not takeIEventSourcesare obsolete; they skip routing validation. Dependency injection uses the new constructors. (part of #2987) - Stage (Release v4.79.0):
STAGE-ESM-024for event-triggered reactions now applies only to the specification executor, which still does not run reactions. Clock, application, startup and shutdown triggers and opaque reaction bodies still failSTAGE-ESM-024in both the Host and the specification executor. (part of #207) - Stage (Release v4.79.0): The reaction rendering reference explains how the Host, rendered Chronicle reactors and the specification executor each handle event reactions: https://github.com/Cratis/Stage/blob/main/Documentation/reference/reaction-rendering.md (part of #207)
- Chronicle (Release v19.53.0): Analyzer
CHR0039now reports a discarded awaitableShould*assertion from a Cratis testing surface as an error instead of a warning. Such an assertion throws on aTasknobody observes, so the spec passes whatever the code does. This can turn a test project’s build red where it contains such vacuous specs: await each flagged assertion and make the containing memberasync Task. While migrating, you can temporarily downgrade the rule in your repository’s.editorconfigwithdotnet_diagnostic.CHR0039.severity = warning; see https://github.com/Cratis/Chronicle/blob/main/Documentation/code-analysis/CHR0039.mdx. (#4177) - Screenplay (Release v4.144.0):
open-workspaceandworkspace-statereport the notes revision and whether the notes file is readable. A malformed or conflicted notes file never blocks opening a model; note tools refuse to write until it is fixed (#391) - Screenplay (Release v4.144.0): Recovery journals that include notes are written as version 2, which older servers refuse instead of rolling back without the notes file (#391)
- Chronicle (Release v19.52.0): Conflicting explicit registrations, such as two different identifiers or generations for the same type, or two types sharing an identifier and generation, now fail at startup with
ConflictingArtifactDeclarationorConflictingArtifactKindinstead of registering silently. (#4732) - Chronicle (Release v19.52.0): A store registers nothing with the kernel until all of its artifacts have been prepared successfully. A preparation failure is reported through the registration outcome and is not retried as a connection failure. (#4732)
- AI (Release v7.37.0): The Templates guidance reflects Templates 1.7.4 (toaster placement and port defaults), and the Stage guidance explains semantic execution in Stage 4.78.0, which cratis CLI 3.53.1 does not expose yet (#460)
- Screenplay (Release v4.143.1): Browser history: selecting a work item and clearing the selection are history entries. Back restores the selection and its comments, forward clears it, and a refresh on the selected address restores the selection from the address alone.
- Screenplay (Release v4.143.1): Guarded actions on a freshly seeded work item (so no other assertion depends on its state): double click on an open row navigates, Close is offered and enabled only while the item is open and posts
CloseWorkItemfor it, the projection shows it closed, Close is hidden afterwards, and double click on the closed row notifies and stays on the list. - Screenplay (Release v4.143.1): Against the installed CLI 3.53.1 and
cratis/stage:4.73.1with the repository corpus the harness passes with no blockers; the 17 new assertions arebrowser.history.*andbrowser.guarded.*. (part of #173) - AI (Release v7.36.0): Concept compliance (
pii/personal,secret) is taught as binding in ESM v13 with the standalone compiler, with the remaining PLAY0268 refusals for enum and identity concepts and explicitsubjectmarks, report-only reasons (PLAY0270), and the boundaries that cratis CLI 3.53.1 still refuses markers and Stage admits up to v12 (#621) - AI (Release v7.36.0): The standalone Screenplay pin moves to 4.142.0 with its published contract
- Stage (Release v4.78.0): Clock, application, startup and shutdown triggers and opaque reaction bodies still fail
STAGE-ESM-024, now naming the trigger kind; reactions that both produce and invoke, including different triggers on the same event, failSTAGE-ESM-037. (part of #207) - Stage (Release v4.78.0): A command specification whose events would trigger a reaction fails
STAGE-ESM-011, because the generated command specification does not settle reactions. (part of #207) - Screenplay (Release v4.143.0): PLAY0268 now names the specific reason a query is not executable (a context-sourced filter, a filter on a single-result query, a filter without a matching scalar property,
scoped toorperformer) instead of one combined message (part of #140) - Screenplay (Release v4.143.0): PLAY0468 reports unknown, repeated or missing required query arguments in both specification forms, and repeated query arguments are no longer silently dropped while parsing (part of #140)
- Screenplay (Release v4.143.0): The query and specification documentation states that collection results compare without regard to row order (part of #140)
- Stage (Release v4.77.0): The compliance rendering reference explains the mapping, the identity rule and its surrogate-identifier fix, and why concepts should be marked before their events are first published. Models without compliance render exactly as before.
- Stage (Release v4.77.0): Play and the Stage Host do not encrypt or redact values of personal-data concepts: the Host’s own event store keeps them in plain text (see https://github.com/Cratis/Stage/issues/346).
- AI (Release v7.35.0): Synced with Arc 22.76.0, Chronicle 19.51.0, Fundamentals 7.23.0, Specifications 4.1.1, Orleans 1.16.3, Components 4.26.4, Chronicle.TypeScript 6.51.0, Arc.TypeScript 0.57.2, Chronicle.Kotlin 6.13.0, Arc.Kotlin 7.7.0, Chronicle.Elixir 3.10.2, cratis CLI 3.53.1 and Chronicle.Mcp 2.0.0; each skill’s verified sources name the release read (#620)
- AI (Release v7.35.0): The standalone Screenplay pin moves to 4.141.0 with its published contract; Stage 4.74.0 to 4.76.0 capabilities are taught as standalone Stage, since cratis CLI 3.53.1 still bundles Stage 4.73.1
- AI (Release v7.35.0): The Chronicle MCP skill states the exact effect of each Chronicle.Mcp 2.0.0 tool, its read-only default and the mutation profile, and warns that it targets the active
cratiscontext - AI (Release v7.35.0): The CLI operations guard treats
observers removeandobservers clear-partition-quarantineas mutating commands - AI (Release v7.35.0): Concurrency guidance teaches decision reads (
IStreamReads,[ProtectedDecision]withDecisionRead<T>,IDecisionReads) instead of advisory read-model injection - AI (Release v7.35.0): Scene packages are named
@cratis/scene.*in the Stage scaffold tables
- cli (Release v3.89.0):
cratis updateshows the release notes after the CLI, template and Stage results, and builds include the notes of 3.87.0 and 3.88.0, which those releases did not keep. (part of #153) - Arc (Release v22.129.1): Stopping a host whose read-protection measurement queue was already disposed, or stopping it twice, no longer fails shutdown with
ObjectDisposedException: The CancellationTokenSource has been disposed.(#3442) - Chronicle (Release v19.90.1): Changing only the
detailstext of a[ComplianceDetails]/[PII]or[Encrypted]marking on an existing event type no longer counts as an event schema change, so the kernel no longer refuses the registration withEventTypeSchemaChanged. A change of the compliance metadata type or the encryption scope, or an added or removed marking, still counts as a schema change. (#4660) - Arc (Release v22.129.0): Without a command transaction, events a command returns for one event source on several routes (streams, or a definition route next to a legacy route) are now appended as one batch that carries a guard for each route. A concurrency violation on any route now appends none of them, instead of leaving some appended. This needs a Chronicle kernel 19.84 or later; Arc now requires Cratis.Chronicle 19.90.0. (#3423)
- Ante (Release v1.3.2): Signed-in users keep their identity after the update to Arc 22.128: Ante opts in to trusting the identity headers AuthProxy forwards, which Arc no longer trusts by default. Ante must only be reachable through AuthProxy. (part of #174)
- Ante (Release v1.3.2): Requests other than GET and HEAD to a path the lobby does not serve, such as a CORS preflight, are refused again instead of receiving the application shell with a 200. (part of #174)
- Ante (Release v1.3.2): Projects that reference Ante, such as the integration specifications and the browser end-to-end host, build again in Debug: embedded Screenplay documents are turned off for every project, since Ante has no Screenplay model. (part of #174)
- Arc (Release v22.128.2): Embedding Screenplay documents with
Cratis.Arc.Screenplay.Embeddedno longer fails with a circular target dependency (MSB4006) in projects that reference Roslyn (directly or throughMicrosoft.CodeAnalysis.Analyzers) and contain a.resxfile. Such projects can turn embedding back on if they disabled it withCratisEmbeddedScreenplayEnabled=false. (#2979) (#3440) - Orleans (Release v1.26.0): A job stopped or removed while its silo went down is finished after recovery: steps that never reported are told to stop again,
OnStoppedruns once they have, and a job being removed is removed. See Rehydration. (#118) - Orleans (Release v1.26.0): A step’s stop is counted once per execution, so a late or repeated stop report no longer makes the job’s progress count it twice.
- Scene (Release v4.72.0): Lists and details of imported Screenplay screens showed only their column headings and labels in the Studio preview although the application’s sample data pack held rows for the read model. (Cratis/StudioIssues#895)
- Specifications (Release v4.1.2): CRSPEC0004 and the fact naming rule now recognize test attributes derived from xUnit and NUnit test attributes, such as a conditional
[DockerFact]built on[Fact], instead of reporting such specs as never running. (#52) - Screenplay (Release v4.227.1): Proposing changes through the MCP server no longer slows down sharply as a model grows: fixture references in specifications are resolved against declarations computed once per workspace snapshot instead of rescanning every declaration for each reference. On a 56-file model
propose-sourcedrops from about 30 seconds of CPU to about 3, and a 260-file model that never finished now completes. (#938) - Stage (Release v4.177.2): A projection with several
fromblocks, a key that is a payload property of events sourced by something else (a movement id on an event sourced by the SKU), or a constant mapping (increased = true) renders instead of being refused as STAGE-ESM-008 or STAGE-ESM-009. Screenplay keeps these as flat transitions; the renderer now reads them as the scope that says the same, so the scoped admission and renderer decide (part of #558) - release-action (Release v1.4.3): When GitHub refuses to create the release with 403 because the release commit’s
.github/workflowsdiffer from the default branch (another pull request changed workflows while this release was pending), the action now fails with an error that names that cause and the recovery: run the publish workflow withworkflow_dispatchfrom the current default branch with the pull request’s release notes instead of re-running. Other 403s keep their original error. (#215) - Components (Release v4.33.0):
DialogandCommandDialogkeep keyboard focus inside the dialog while busy: the confirm button stays focusable asaria-disabledand ignores activation, so it can no longer drop focus to the page or be submitted twice. After a refused confirm, such as a validation failure, focus returns to the confirm button (or to the title when confirm is disabled), the outcome is announced through a polite status region, and a held Enter or Space no longer submits again. (#424) - Stage (Release v4.177.1): A command whose productions address different event sources (
for orderIdandfor productId, ESM v30) renders instead of being refused as STAGE-ESM-006: each event is appended to the event source its own destination names, and the generated command specification asserts each event on its own source (part of #503) - Stage (Release v4.177.0): A zero start of a running total (
add delivered by 0,subtract x by 0on a required whole number or decimal) now renders instead of being refused as STAGE-ESM-017; the renderer emits nothing for it because Chronicle’s Add builder takes an event property only and a required number is 0 until its first real operation. A concept total does not start at 0 (a never-set concept is null) and is refused (part of #558) - Arc (Release v22.128.1): The generated Screenplay no longer states a scenario fixture value that a concept’s implicit conversion changes at runtime. A scalar constant, collection element or expected event value converted to a concept is stated only when the conversion operator and the constructor it calls are proven to pass the value through unchanged, including operators declared in another project of the application and the Cratis framework’s own concept conversions; otherwise the whole scenario is left out with
SP0039. Date comparisons keep their existing, stricter proof. See Generating a Screenplay. (#3385) - Arc (Release v22.128.0): Protected command reads reject empty, whitespace-only, wildcard (
*), hash-containing and whitespace-padded keys, including invalid composite key parts, before accessing the store. These failures use the same validation outcome as a missing read model rather than an unhandled server error. Composite key parts are checked through the AOT-safe protected-key accessors, so withProtectedReadModelKeyOptions.Strict(or under native AOT) a composite key type without registered accessors fails withProtectedReadModelKeyAccessorMissinginstead of being read. (#3347) - Arc (Release v22.127.0): An enumerable observable query over WebSocket now ends when the client disconnects while no item is ready, instead of keeping the connection handler waiting. (part of #2915)
- Chronicle (Release v19.89.0): .NET client calls that take a
CancellationTokenno longer block the calling thread while the client reconnects, and they honor the token while they wait for the connection. Previously such a call made while disconnected blocked synchronously for up to the connection timeout and ignored cancellation. (#4758) - Stage (Release v4.169.1): The live semantic Host refuses protected command reads with empty, whitespace-only, padded,
*or#-containing keys before looking up projected state, matching the specification executor and the Screenplay reference evaluator, even when an instance exists at that key. (#543) - Chronicle (Release v19.88.5): A unit of work that enforces read protection no longer reports a conflict on historical events when its declared routing only matched events older than the read. Against a kernel without support for several guards per event source, the merged guard took the routing’s filtered tail instead of the read boundary, so the commit was refused and its events were not stored. (#5070)
- Arc (Release v22.125.4): An observable query over MongoDB no longer stays on “Loading…” when the database is unreachable or the change stream fails. The MongoDB watch now ends the observable with an error, logged at Error level, instead of completing silently. Cancellation and normal unsubscribe still complete quietly. (#2916)
- Arc (Release v22.125.4): The SSE and WebSocket hub connections in
@cratis/arcdeliver a query error from the server as a failed query result (hasExceptionswith the error message), souseObservableQueryshows the failure instead of only writing it to the console. (#2916) - Stage (Release v4.167.1): Rendered applications no longer contain protected-read commands that are refused at run time (Acme Commerce Sales:
ApproveOrder,CheckOut,AddToBasketand others failed 30 generated specifications). - Chronicle (Release v19.88.4): An observer no longer keeps partitions marked in flight forever, or undercounts its handled events, when events are handled while it changes state, for example during a large catch-up. Handled counts reset by a replay that starts during the change stay reset. (part of #4972)
- Arc (Release v22.125.3): Observable MongoDB queries keep updating after a Chronicle projection replay. When a collection is renamed into place, or the change stream reports
invalidate, the shared watcher now sends fresh results to the observers of the affected collections. (#3407) - Arc (Release v22.125.3): When MongoDB rejects an expired or invalid resume token, the shared watcher reopens the change stream without the token and resynchronizes every observer. Previously the stream kept retrying with the bad token and observers silently stopped updating. (#3407)
- Arc (Release v22.125.3): A failed snapshot for an observable MongoDB query is logged and retried a bounded number of times, and the subscription stays open instead of ending with an error. (#3407)
- Stage (Release v4.167.0): Acme Commerce Sales
AnApprovedOrderCannotBeApprovedAgain(a rejection by the decision read ofApproveOrder, whose event triggersConfirmApprovedOrder) was the last refusal of the Catalog + Storefront + Sales slice. - Arc (Release v22.125.2): Data annotation attributes such as
[Range],[Required],[StringLength]and customValidationAttributes on ordinary parameters of model-bound queries are now evaluated, the same way they are on command properties. Previously only concept-typed parameters were validated, so for exampleTop([Range(1, 100)] int count)accepted any value. An omitted parameter with a declared default still uses its default. (#3378) - Components (Release v4.30.0):
DataTableForQuery,DataTableForObservableQueryandDataPageshow the failure message, not the empty message, when a query completes without success, for example on an HTTP 400 problem-details response. The query-bound chat sidebar likewise shows its failed state. An unauthorized result still shows access denied. (#406) - Chronicle (Release v19.88.3): Projections no longer fail a partition with “Collection was modified; enumeration operation may not execute.” when many events are handled in parallel. Values taken from a projection’s initial state or from an event’s content are now copied before they become part of one read model’s state, so another partition can no longer change them while the MongoDB sink saves. (part of #4965)
- Arc (Release v22.125.1): Commands executed inside
ISystemExecution.As(principal)without an HTTP request, including from Chronicle reactors, now record that authenticated principal as the event’scausedByinstead of System. Events appended during an HTTP request and identities explicitly selected on Chronicle are recorded as before. (#3152) - Stage (Release v4.166.1): Specifications whose
givenevents have no event source now run in Stage like they do in the Screenplay reference evaluator, instead of being refused for identity allocation. The events land at an empty event source; projections that need a typed event source are still refused. (part of #511) - Chronicle (Release v19.88.1): SQL observer state now preserves failed-partition quarantine and retry-budget resets when saved and reloaded. (#5039)
- Stage (Release v4.166.0): Acme Commerce Sales (
OrderStateProjection,ConfirmOrder) can be planned for rendering without stripping: its projection and decision read of the order lines and shipping address were refused. - Chronicle (Release v19.88.0): Registering a reactor, reducer or self-reducing read model whose only handlers take
[EventTypeGenerationFor]types now fails withObserverHasOnlyGenerationHandlers, naming the artifact and the generation types. Such an observer previously registered without any event types and never became active. (#4922) - Chronicle (Release v19.88.0): A projection declaration that uses an
$eventContextmember or path that does not exist on the event context is now rejected when it is compiled. It was previously accepted and failed only when the projection was built. (#4702) - Stage (Release v4.164.0): The semantic Host’s JSON binder keeps omitted composite members omitted instead of turning them into
null, and keeps the supplied member order, so nested concept validation fails only on an explicitnulland reports failures in the order the members were sent. (#441) - AI (Release v7.84.2): The local release-note check (
cratis-check-pr) and the pull-request body guard recognize repositories that call the combinedverify-pull-request-policyworkflow, and take the release-note rules from that workflow at the caller’s pinned ref. Repositories switched to the combined caller had silently stopped getting the local check. (#797) - Stage (Release v4.163.0): A screen that fills a blueprint template slot now replaces that slot’s seeded placeholder content instead of appearing next to it, so rendered applications no longer show the template’s sample header, search box and empty states beside the authored content. Slots the screen does not fill keep their seeded content. (#506)
- Screenplay (Release v4.221.0):
SMELL005no longer counts every known event as a feeder of a read-model property set in a projectionallblock. It counts only the events that actually feed it. (part of #393) - Chronicle (Release v19.87.0): The .NET client now connects to the kernel Aspire references with
WithReference(chronicle). With no Chronicle connection string configured, it readsConnectionStrings:chronicle(the value Aspire injects) instead of falling back tolocalhost:35000, so a referenced project no longer needs the kernel on host port 35000. A connection string set inCratis:Chronicleor in code still takes precedence. (#4917) - Screenplay (Release v4.220.2): Renaming a composite stream-id part whose name equals its type, or an event source or stream whose name also appears in a trailing comment, now succeeds under
PreserveTriviaand keeps the rest of the line byte-for-byte, instead of refusing with “No unique supported identifier”. (#572) - Chronicle (Release v19.86.0): A reactor or reducer result now completes only the delivery it answers. The kernel matched results by partition alone, so a late result for a timed-out delivery could complete the wait of that partition’s retry, and completing one delivery could drop the next one for the same partition and leave it blocked until the client reconnected. A duplicate result no longer breaks the result stream. (part of #4664)
- AI (Release v7.84.1): Publishing works again: the check that the GitHub release exists now runs after release-action has created the release, instead of before it, so a release-labelled merge publishes Cratis.AI, @cratis/ai, the Pi package and the images under its own GitHub release. (#785)
- Stage (Release v4.160.0): Acme Commerce commands
ApproveProductForSale,WithdrawProduct(reads plus a unique constraint),AddToBasketandCheckOut(read-backed requirement plus validated concepts) were refused by the renderer although the executor ran them. - Chronicle (Release v19.85.1): SQLite: a development reset no longer races with database migrations. Before, the reset could leave a database that failed every later request with
DatabaseMigrationIncomplete(“table already exists”). Migrations and resets of the same database file are now serialized, and the reset drops its tables in one transaction. (#5007) - Chronicle (Release v19.85.1): SQLite: concurrent first-time migrations of the same database through different connection strings no longer fail with
DatabaseMigrationIncomplete. (#4894) - Scene (Release v4.70.2): The Cratis Components command form’s
Generate fieldsaction, its command property editor and its layout editor submittedSetPropertyedits addressed by the bare element id, and the action’s generated fields carried no item id. A host applies edits to the document by node id (element:<id>,elementNodeId) and the editing engine refuses a collection item without an id ('Fields': every item needs an id), so the editor refused the batch and nothing changed. The edits now address the element by its node id and each generated field has an id, so Generate fields applies and is one undo step in the host’s history (part of Cratis/StudioIssues#863) - Stage (Release v4.158.1): Specifications in a rendered application’s separate Specs project now compile and run in Release as well as Debug. They are no longer excluded by
#if DEBUG, while the web application continues to exclude the specification files. (part of #498) - Stage (Release v4.158.1): Rendered specifications declare repeated and complex fixture values once as named fields and use separate facts for expected properties, instead of repeating literals in long predicates. (part of #498)
- Stage (Release v4.158.1): Rendered authorization-denial specifications assert that the command is denied and appends no events, rather than merely checking policy registration. (part of #498)
- Chronicle (Release v19.83.4): The in-memory sink used by the testing scenarios no longer merges distinct composite read-model keys whose parts contain
_. Each distinct composite key keeps its own instance. (#5057) - Scene (Release v4.70.1): A screen that fills a blueprint template slot now replaces that slot’s seeded placeholder content instead of adding to it, so rendered applications no longer show the template’s sample header, search box and empty states next to the authored content. Slots the screen does not fill keep their seeded content. See Cratis/Stage#506.
- Orleans (Release v1.25.0): A job whose silo died while it was preparing or starting its steps is recovered: it keeps the same step IDs, prepares only the steps that were not prepared yet, never runs
PrepareStepsor the start hook twice, and never counts a step’s outcome twice. A saved but unstarted job is no longer removed as dead during rehydration, and a job left in a starting state after a restart is no longer reported as already running (#40) - Components (Release v4.29.1):
DataTableForQueryandDataTableForObservableQueryshow loading when their query arguments change, instead of the previous arguments’ rows or unauthorized, failed or loaded status, and show cached results again without a loading flash when returning to earlier arguments. Requires@cratis/arcand@cratis/arc.react22.122 or later. (#354) - Chronicle (Release v19.83.3): A projection definition change now takes effect on every silo. A silo could keep using the previous definition until it restarted, so events of a newly added event type were skipped during live handling, catch-up and even a full replay, while the observer still advanced past them. (#4935)
- Chronicle (Release v19.83.3): A silo no longer reads an outdated projection definition after another silo changed or deleted it. Definitions are now always read from shared storage rather than a per-silo cache. (#5021)
- Chronicle (Release v19.83.3): Replaying or catching up a projection that is not registered now fails instead of reporting success without handling any events. An event the current projection definition does not include is logged at information level rather than debug. (#4935)
- Orleans (Release v1.24.3): Removing or stopping a job no longer hangs when a step’s notification fails, for example because the step’s grain is still routed to a silo that died. The job retries the notification with backoff (1 s doubling to 60 s) until the step reports, and a repeated
Removesends it again to every step that has not reported (#101) - Chronicle (Release v19.83.2): Projection futures (child events stored until their parent exists) now resolve when the parent is matched on a composite or object key. Key comparison threw
InvalidCastException: Object must implement IConvertiblefor such keys, so the future never resolved, the child event stayed missing from the read model, and the same warning was logged on every pass. A future that keeps failing now logs one warning and then logs at debug level. (#5045) - Arc (Release v22.122.1): In decision mode,
CommandScenariorebuilds read models from the scenario’s appended events with their originalEventContext. Projections and reducers see each event’s real sequence number and occurred time, so specs that compare revisions no longer report false conflicts. (#3351) - Arc (Release v22.122.1): Each decision-mode
CommandScenariouses its own generated event store name and namespace, so scenarios no longer share one event store identity. (#2991) - Screenplay (Release v4.216.1): The TypeScript compiler, Monaco and VS Code now report
PLAY0345,PLAY0346andPLAY0348for guarded interaction alternatives (on click,double clickandselectwithwhenbranches), including named behaviors attached withuses, with the same messages, locations and order as the C# compiler. (#625) - Chronicle (Release v19.83.1): An all-event mapping (
[FromEvery],[FromAll], a declarativeFromEvery, or@fromAllEventsin TypeScript) no longer clears its read model property when an event without the mapped payload property arrives. The property keeps its last value, as documented, for root mappings, child mappings and projections that subscribe to all events. A source property that is present with a null value still maps null. (#5026) - Stage (Release v4.154.1): Semantic specification runs reject protected command reads with empty, whitespace-only, padded,
*or#-containing keys before looking up projected state, even when an instance exists at that key. Live Host behavior is unchanged. (part of #492) - Screenplay (Release v4.214.3): A capture specification that presents a numeric key to an event with a text event source still fails, but the failure now names the capture, the key, its value, the event and the correction, for example
write "1201", instead of only reportingExpected Accepted, got Rejected. The capture documentation states that the key must match the event source type. (#788) - Screenplay (Release v4.214.2): Compilation now reports
PLAY0802when an event stream’s stored name isAllor an event source’s stored name isDefault, including through anidpin, because Chronicle reserves those names. Before, the model compiled and only executable binding or rendering refused it. A pin to another stored name, such asstream Allwithid "Archive", remains valid, and the editors show the error as you type. (#893) - Screenplay (Release v4.214.1):
screenplay testand the MCP run-specifications tool no longer report every specification as unsupported when one projection cannot be executed by the reference evaluator, for example one that maps$eventContext.occurred. Only specifications whose events reach that projection, or that supply, read, query or assert its read model, report unsupported; the others run. Plan issues are still listed. (#863) - Arc (Release v22.122.0): The Chronicle sample’s Approvals specifications state their approval identity and the whole
ApprovalRequestedevent, so both scenarios round-trip into the generated Screenplay instead of being left out with SP0039. (#3383) - Stage (Release v4.152.0): Commands sent from a rendered application lost the API base path, the microservice and the identity headers that Arc adds, so they could reach the wrong route or arrive unauthenticated. (part of #499)
- Arc (Release v22.121.2): Data annotations on concept-typed (
ConceptAs<T>) command properties and model-bound query parameters are now evaluated against the concept’s value:[Required]rejects a concept wrapping an empty string,[Range]accepts valid values, and[StringLength]no longer throws. The validation metadata is source-generated, so it stays trim- and AOT-safe. Types without generated metadata, such as types from other assemblies, keep the previous behavior. (#2944) - Orleans (Release v1.24.2): Automatic job recovery now retries a jobs manager key provider that fails to construct during startup, instead of skipping its scopes until another recovery pass. Construction failures use the existing recovery backoff and stop when the silo shuts down. (#108)
- Orleans (Release v1.24.1): Jobs with some steps that fail to start now enter the running state and keep their watchdog active until the remaining steps finish. They no longer remain stuck starting when a completion report is lost.
FailedStartingSomeJobStepsstill reports the partial failure; the other steps continue running. (#104) - Arc (Release v22.121.1): Controller-based observable queries whose arguments fail validation over a direct WebSocket or SSE connection now accept the connection, send one query result with the validation results and close, instead of answering HTTP 400 before the upgrade, which browsers report only as a failed connection. Plain HTTP requests keep their existing response. (#3230)
- Screenplay (Release v4.213.4): Events produced only by a reaction’s refusal branch (
on refused ...) now count as producers: the destination type of an event source without an identifier is inferred from them, and a specification’s expected route orfortype is no longer refused as contradicting the command under test when a refusal branch also produces the event. (#744) - Orleans (Release v1.24.0): Removing a job no longer reports success when the removal cannot be saved. Before, a storage error left the job running in storage, and a silo restart could resume a job you had deleted. Remove now refuses with the new
RemoveJobError.CouldNotPersistRemoval, andIJobs.Deletereturns it as a refusal you can retry. (#105) - Screenplay (Release v4.213.3): Compilation now reports
PLAY0168at the second declaration when one document declares the same policy name twice. Before, the duplicate compiled cleanly and surfaced only at executable binding as an unlocatedPLAY0273. (#787) - Screenplay (Release v4.213.3): The TypeScript compiler, and so the editors, now report
PLAY0173when one policy name is declared in two files, as the C# compiler already did. (#787) - Orleans (Release v1.23.5): A finished job no longer stays running in storage when clearing or writing its final state fails during a storage outage. The job now writes its final status before clearing its state, and keeps retrying that write (from 1 second up to 60 seconds) until it succeeds. If the clear fails, the job is still recorded as finished and retention cleanup removes the leftover record. A finished job is not completed a second time after a restart. (#100)
- Arc (Release v22.120.1): PostgreSQL migrations that add a JSON column with
AddJsonColumnnow run. The CHECK constraint and the GIN index are emitted as separate, terminated statements instead of one invalid statement (42601), the index name is quoted, and the index works whatever store type the column uses by indexingcolumn::jsonb. Constraint and index names longer than PostgreSQL’s 63-byte limit are shortened deterministically with a stable hash suffix. (#3369) - Screenplay (Release v4.213.2):
ComparedModel.FromSourcesaccepts documents in subfolders, such asFeatures/Register.play, so split models can be compared from in-memory sources. Each document keeps its relative path. (#628) - Screenplay (Release v4.213.1): Executable binding (
screenplay test,cratis screenplay validate --executable) now reports every independent semantic contract failure (PLAY0273) in one run, each at the declaration that failed, instead of only the first failure at line 1 of an unrelated file. (#860) - Screenplay (Release v4.213.1): A condition that compares an optional property, such as
require level.status == "active"on an optional read-model property, is now refused withPLAY0268at the comparison instead of aPLAY0273without a location. (#860) - Orleans (Release v1.23.4): Resuming a job no longer stops at the first step whose start fails with an error, for example because its silo is unavailable or the call times out after a pod crash. The remaining steps still start, and the job’s watchdog starts the failed step again on its next check, without step leases or another recovery pass. (#102)
- Chronicle (Release v19.82.2): Unique constraints and closing constraints stay consistent with the event log when updating their index fails after an append, or when the kernel stops in between. Each event sequence persists how far its constraint indexes are confirmed in MongoDB, SQL and in-memory storage. Before validating an append, it repairs any gap from the log, and it catches older indexes up in the background without blocking live appends. (#4895)
- Chronicle (Release v19.82.2): Constraint index repairs write only the claims that actually differ, report a budget expiry or a failing constraint in their results, and recover from transient storage failures instead of leaving the index partly updated. (#4895)
- Orleans (Release v1.23.3): Job recovery now retries a jobs manager key provider or a manager rehydrate that failed, for example a key catalog that times out while a rolling deployment starts. It retries only the failed providers and managers, after 1 second, doubling the delay up to 60 seconds, until they succeed or the silo stops. Jobs left running by a silo that went away are no longer stuck until another silo dies. (#99)
- AI (Release v7.75.0):
failFast: falsein a gate configuration is honored. Previously it was read astrue. (#753) - Screenplay (Release v4.212.4):
automapandno automapwritten on a joined event now decide auto-mapping for that event in the executable model and the reference evaluator, as they do in Chronicle; a joined event without one follows its level’s auto-map. WarningPLAY0380no longer reports them and now covers onlyallinsidechildrenornested. (#613) - Arc (Release v22.117.1): MongoDB observations no longer drop updates, replacements and deletions of documents with a composite
_id: the change-stream id is now read with the id member’s own serializer, so it compares with the observed documents for any id type. (#3236) - Arc (Release v22.117.1): Observing a collection inside a single-result query no longer leaks the collection’s paging and total count into the query result.
ObserveSingleandObserveByIdnever apply query paging or counting, and observable query results report paging only for collection results. TheignoreQueryContextparameter onObserveSingleandObserveByIdis kept and has no effect. (#3023) - Chronicle (Release v19.82.1): SQL storage now returns the revised content, generation and hash when it reads an event that was revised at a generation lower than the highest generation stored for it, matching MongoDB and in-memory storage. Before, reactors, reducers, webhooks, event-store subscriptions, passive projections, event reads, export and constraint reindexing could see the pre-revision content. Events revised before Chronicle recorded which generation was revised keep returning their highest generation. (#4751)
- Chronicle (Release v19.82.1): Redacting an event in SQL storage no longer leaves it marked as revised. (#4751)
- Screenplay (Release v4.212.3): Compilation now reports
PLAY0801when a projection uses one event more than once at the same level. Before, the error only appeared at executable binding, as the genericPLAY0273. A level is the root, onechildrenornestedblock, or one variant. Within a level,from,remove with,remove via joinandclear withshare one set of events, andjoinevents have their own. Chronicle allows one use of an event type per projection level. (#675) - Screenplay (Release v4.212.3): The task-tracking counter example in the projections documentation no longer uses the same event in two
fromblocks. (#675) - AuthProxy (Release v2.31.2): An identity too large for a cookie (over 3072 encoded characters) is no longer written to
.cratis-identity: browsers drop such a cookie and a reverse proxy answers 502 “upstream sent too big header” for the whole response. Any stale identity cookie is expired and a warning is logged instead. - Chronicle (Release v19.81.1): Projections and captures are subscribed in every namespace, including one created at runtime. Ensuring a namespace returns once its healthy projections and captures are subscribed, and a namespace created implicitly by its first append is subscribed within one watchdog interval, without depending on the namespace-added notification. (#4696) (#4455)
- Chronicle (Release v19.81.1): A projection that lost its subscription in a namespace, for example after a retirement or replay in the same registration, is subscribed again instead of staying dark until the next change. (#4423)
- Chronicle (Release v19.81.1): Captures follow the same reliable namespace reconciliation, so a pattern or events capture is subscribed in namespaces an application starts using after registration. (#4521)
- Chronicle (Release v19.81.1): Automatic reconciliation never lifts an observer’s quarantine, never revives a retired observer, and never subscribes a capture that is being stopped or deleted; a failed setup is retried, and one broken projection or capture no longer blocks the others or namespace creation. A Kernel restart and a newly added namespace still end projection quarantine as documented.
- Scene (Release v4.69.3): The gallery chrome drew a fixed Contoso logo and name, so a host that gives the preview its own
chromecould not show the profile’s identity.galleryCompositionFor(identity)draws the resolved identity - its name, initials, icon or image and whether the name shows - in the topbar, the sidebar and the footer, andgalleryCompositionis unchanged for a host that has no identity - Screenplay (Release v4.212.2):
find-specification-obligationsnow counts the documented read-only denial form,then query <Query>withargumentsand no result followed bythen denied, as the authorization denial specification for that query (SPEC004), the same aswhen query <Query>withthen denied. Such a specification no longer counts as asserting the read model (SPEC006). (#786) - Scene (Release v4.69.2):
PreviewRegionHandle,PreviewRegionRectand the region helpers were left out of the default blueprint’s exports, so a host that passesregionstoScenePreviewHostcould not type the ref. They are exported from@cratis/scene.blueprint.defaultnow - Orleans (Release v1.23.2): A job step that is stopped without a partial result no longer reports an empty string as its partial result:
HasPartialResultis false andTryGetPartialResultreturns false for it. (#93) - cli (Release v3.77.1):
cratis ai installandcratis ai updatelink.pi/agentsto the corpus’s Pi-native agent adapters (.cratis/ai/harnesses/pi/agents) when the corpus ships them, so Pi agent loaders other than Cratis’ own, such as@tintinweb/pi-subagents, give Cratis agents their read, search, edit and shell tools. An unchanged Cratis-owned link is moved on update; corpora without the adapters keep the canonical.cratis/ai/agentslink. (#391) - Scene (Release v4.69.1): Adding the identity, corners, font, sample data pack description, template shell card text and problem severity to positional records removed the constructors an earlier package was compiled against, so
UiProfile,ProfileAppearance,SampleDataPackReference,TemplateMetadata,SampleDataCatalogEntryandProfileBlockerthrewMissingMethodExceptionfor callers built before. Each keeps the constructor it had, the new one is marked for the JSON serializer, and a specification names every shape that must stay - Arc (Release v22.116.2): Aggregate roots resolve event types from the registered event types instead of the
[EventType]attribute, so events registered explicitly without the attribute can be applied, rehydrated and appended. Applying an event that is not registered still fails. (#3234) - Arc (Release v22.116.2): A command started from an execution context captured during an earlier, finished command is no longer refused because the finished command’s identity still looked active. (#2888)
- Chronicle (Release v19.80.0): Catch-up that produces no work no longer loops between Routing, CatchUp and CaughtUp without backoff. (#4592)
- Screenplay (Release v4.212.1):
--check query-keys(PLAY0535) no longer warns when a collection query’sbyparameter names a declared read-model field of a compatible type, or when abyparameter is markedoptional. A single-result query’sbymust still match the read model’s identity, and the identity is now inferred only from single-result queries, as executable binding does. (#676) - Arc (Release v22.116.1):
useObservableQuerysubscribes again with the new page, page size or sort order when they change, instead of staying on the first page. Hooks observing different pages of the same query no longer share one subscription. (#2869) - Arc (Release v22.116.1):
useQuery,useQueryWithPaginganduseObservableQueryno longer show the previous arguments’ data or status while results for new arguments, pages or sort order load: they show the cached result for the new arguments, or the initial not-ready state while the request is in flight. (#2872) - Orleans (Release v1.23.1): Stopping or removing a job after a silo restart, before its steps have started again, now finishes: each step reports its stop to the job, so the job counts it, finishes its stop and, for removal, clears its state. Previously the step reported to no one and the job never completed its stop or removal. (#92)
- Orleans (Release v1.23.1): A step that cannot find its job when it is stopped no longer pretends the stop was reported: a direct stop returns
JobStepError.FailedToReportToJob, the reason is logged, and the step keeps its state. Removing a step whose job no longer exists deletes it. See Jobs. (part of #92) - Screenplay (Release v4.212.0): Model-note targets that name a Module, Feature or Slice by dotted address resolve on split models, where the container is repeated across files as an import placement or an explicit header, instead of failing with “Unknown or ambiguous note address.” (#784)
- Screenplay (Release v4.212.0): When a note’s requested anchor has no identity yet, for example a Slice on a model that does not bind, the proposal reports in
substitutionsthe owner the note actually lands on, also for reanchor, instead of silently attaching it to the application. (#795) - Orleans (Release v1.23.0):
Job.Stopno longer reports a stop that was not persisted. It restores the job’s state and answers the newStopJobError.CouldNotPersistStop. - AI (Release v7.73.1): Corpus agents such as Screenplay Modeler keep their file and shell tools in Pi when the external
Agenttool from@tintinweb/pi-subagentslaunches them..pi/agentsnow points at generated Pi-native copies of the corpus agents with Pi tool names, and the Pi package ships them for that loader. Generating them fails when an agent names a tool that has no Pi equivalent. (#519) - Arc (Release v22.115.0): Rejections from data annotations, and
ValidationResults returned from a command’sProvide()orHandle()with[nameof(Property)]members, now show under the matching form field instead of disappearing. (#2945) - Stage (Release v4.141.1): Specification runs now resolve
$context.occurredin event-triggered reactions from the scenario’s authoredgiven clock, the same way Screenplay’s reference execution does. The value reaches direct and cascading productions, invocation arguments, the invoked command and refusal-branch productions. Specifications that combine an authored clock with reactions are no longer refused, and a reaction that mapsoccurredwithout a clock is rejected as in the reference execution. (#505) - Chronicle (Release v19.79.0): During a rolling deploy, an older client that registers its projections after a newer one no longer overwrites the newer definitions. The kernel compares versions by semantic-versioning precedence, prerelease identifiers included. It ignores a definition older than the one it has stored and logs a warning. It also raises a Workbench recommendation naming the projection and both versions. An older full-set registration no longer retires projections that a newer version added, and the kernel no longer writes a stale definition back while it resubscribes projections. To roll back on purpose, give the older release a
SoftwareVersionhigher than the stored one. Clients that send no version register as before. (#5012) - Orleans (Release v1.22.3): A state machine no longer drops a transition when a second one is requested while another transition is still in progress. Requests made during a transition now run in the order they were made, once the current transition completes. A queued transition is checked again against the state it would leave if another state was entered first, and is skipped if that state does not allow it. A transition the current state refuses still does nothing and is not an error; call
CanTransitionTofirst to branch on it. See State machines. (#58) - Chronicle.TypeScript (Release v6.53.1): A child or nested read-model property decorated with
@fromAllEvents(or@fromEvery) is populated again, including on the event that creates the child. The compiler now declares these mappings on the child itself instead of on the root, so root properties are never copied into children and a property with the same name on the root and on a child is mapped independently. Requires Chronicle 19.78.1 or later for root-only all-event mappings to stay off new children; replay affected projections to rebuild child values that were already materialized. (#257) - Orleans (Release v1.22.2): A failed resume hook now restores a fully accounted-for stopped job to Stopped before any new steps start, so a later resume can retry instead of adopting a job left Running with no new work. Existing running jobs and incomplete stops are not rolled back. (#62)
- Screenplay (Release v4.211.1): Incompatible property mappings in command productions, reaction productions and reaction invocations now report PLAY0273 at the offending mapping, naming the property and its source and target types, instead of pointing to the first line of an unrelated file. (#785)
- AI (Release v7.72.1): Completions on Claude models of generation 5 and later (such as
claude-sonnet-5-5) no longer fail with a 400 sayingthinking.type.enabledis not supported. Those models are now asked for adaptive thinking with an effort level instead of a thinking budget. - Screenplay (Release v4.211.0): A refused authoring proposal now names the offending document and path in the conflict and lists every offending reference occurrence (text, member, document path and line:column, capped at ten), instead of returning a conflict with no location. (#783)
- Chronicle (Release v19.78.1): A child read-model property marked
[FromAll](or[FromEvery]) under[ChildrenFrom<T>]or[Nested]is populated again, including on the event that creates the child. The .NET client now declares these mappings on the child itself, and parent all-event mappings are never copied into children. (#4934) (#4524) - Chronicle (Release v19.78.1): Projection definitions registered by older .NET clients (and the current TypeScript client), which declare child all-event mappings on the root, populate the child as long as the root read model does not declare a property with the same name. When both the root and the child declare it, the mapping stays on the root until the client is upgraded. Replay affected projections to rebuild child values that were already materialized. See From all events.
- AI (Release v7.72.0): A stored tier mapping whose model is absent from the provider’s last successfully discovered catalog is refused with a reason instead of calling that model. Pools try the next member without recording a rate limit. Before upgrading, inspect production providers with
ResolveTiersForand change or clear refused mappings, including mappings saved automatically during initial discovery. (#345) - Arc (Release v22.113.1):
useQuery: a component whose request was cancelled by another component reading the same query no longer keeps its query scope performing after it unmounts or starts a newer request, and no longer updates its state after it has unmounted. The other component’s request still completes and shows its data. (#3349) - Chronicle (Release v19.77.6): In a multi-silo kernel, a projection definition saved through one silo no longer looks missing on the others. A changed projection now evolves and replays as it should, instead of keeping its old definition. Projection grains now start with their stored definition, and removing a projection’s observer now also removes the projection. (#4985)
- AI (Release v7.70.1): The pull-request body guard no longer blocks
gh pr createorgh pr editwhen it cannot read a Cratis repository’s release workflows, for example because the ambient GitHub credentials are invalid. It warns and checks the body against the bundled reviewed release-note rules instead, so a valid body goes through and an invalid one is still rejected. (#509) - Scene (Release v4.68.2): The darkened tag severity colours were written with
light-dark(). The Stage’s CSS pipeline lowerslight-dark()for older browsers into a pair of custom properties that stays unset there, so a severity tag had no background (white text on the page, 1.09:1) in the Stage. The shell now sets the light values and overrides them under the Scene configuration’sdata-scene-color-scheme='dark'(Lara’s own dark values), with nolight-dark()in the stylesheet (a specification keeps it that way). - Scene (Release v4.68.2): The real-browser template audit did not draw the dark page: its host kept the colour scheme of its first render, so the “dark theme” rows re-judged the light page. The host now remounts per scheme (and a specification alternates light and dark to prove it); the whole dark matrix - every template, state and width - passes.
- Ante (Release v1.3.1): Registration and organization setup no longer delete the identity cookie, which nothing writes any more, so Ante builds against current Arc.
- Ante (Release v1.3.1): A collection expression is indented as the style analyzer expects.
- Orleans (Release v1.22.1): The error enums nested in
IJobTypesdocument their items, so the package update builds again. - AI (Release v7.70.0): The provider capacity documentation no longer claims every path parks a provider that ran out of quota:
ProviderAwareLanguageModelandPooledChatClientpark it, while the standaloneIAIProviderPoolDispatcheronly fails over. (#569) - Arc (Release v22.113.0): Under read protection
On, a read model injected outside the command’s decision, such as into a custom command filter, is refused with a message that names the fix; a read model marked[Unprotected("why")]there is an advisory read (#3242) - Chronicle (Release v19.77.5): A new event store is now announced reliably when a client connects while the kernel is still starting. Before, the announcement could be refused because the System event types weren’t registered yet. The client’s registration then failed and was retried in the background, which could re-apply an older projection definition over a newer one. (#4998)
- Scene (Release v4.68.1): The bare
core:buttonwas 21 pixels high (WCAG 2.2 target size): the shell now gives a button in the content area, in the application and the full-page shell, a 2rem minimum. - Scene (Release v4.68.1): Two
searchlandmarks on one page (topbar and list) had no accessible names:foundation:globalSearchnow names its form with its label. - Scene (Release v4.68.1): A grid item kept
min-width: auto, so a widget holding a wide table pushed its track past the window: a phone scrolled sideways and, on a desktop, the dashboard’s primary column overlapped its secondary one. Every item of a template slot now shrinks to its track and the table scrolls inside itself. - Scene (Release v4.68.1): PrimeReact’s Lara tag severities (info, success, warn, danger) paint white on a mid-tone in the light scheme (2.3 to 3.8:1): the blueprint darkens them to meet WCAG AA, the dark scheme’s values are unchanged.
- Chronicle (Release v19.77.4): When two versions of an application are connected at once and the newer one’s observer registration replaced the older one, the observer no longer stops when the newer client disconnects: it hands over to the still-connected older client, which carries on from where processing stopped. The newest registration still wins while both are connected, and events of types only the departed client handled are not delivered to the client that takes over. (#4987)
- Arc (Release v22.112.1):
useQuery: when two components read the same query with the same arguments, the one whose request was cancelled by the other now receives the result instead of staying “not ready” with no data. A failed request settles both components as failed, and neither keeps reporting that it is performing.useQueryWithPaginggets the same fix. (#3312) - Arc (Release v22.112.1):
useQuery: a component whose arguments, paging or sorting change no longer shares a query instance, or a cached result, with components that use the previous values, so a request for new arguments can no longer cancel or overwrite another component’s request. (#3312) - AI (Release v7.69.1): An AI pool now fails over when a member rejects a call outright, such as a 400 for a bad key, a retired model or an account with no credit. Before, the first rejection ended the whole completion and the remaining members were never tried, so one broken provider took down every agent that used the pool. The rejecting provider is remembered as failing so it ranks lower next time, and when every member rejects the call the first rejection is still reported.
- Chronicle (Release v19.77.3): Strongly consistent per-key projection reads (passive projections, stream-scoped reads, reads with the
*key and session reads) now fold the key’s events from the start on every read. Redactions, revisions and the erasure of personal data joined from another subject show up immediately. Before, a warm read kept returning the old content until the grain was deactivated. (#4844) - Chronicle (Release v19.77.1): An event store of a namespace other than the default one asks the kernel whether the namespace still exists when it reconnects. If the kernel no longer lists it, the event store lets go of it instead of registering, and the client creates a new one if the namespace is used again. If the kernel cannot be asked, it registers as before (#4942).
- Chronicle (Release v19.76.1):
RemoveNamespacestops listing the namespace before removing its observers, and unsubscribes and removes an observer again, up to five times, if a subscription already on its way subscribed it in between (#4942). - AI (Release v7.68.1): Provider error bodies no longer leak secrets: the calling provider’s configured key is withheld by exact value (also when echoed URL-encoded) before any pattern runs, long tokens containing
/are withheld, and only the failed request’s exact model and provider ids stay readable, so a short model id inside a longer secret no longer lets that secret through. (#575) - AI (Release v7.68.1): A pooled chat call now treats HTTP 402 or a vendor
insufficient_quotacode as a spent quota and fails over to the next provider, instead of failing permanently. (part of #569) - AI (Release v7.68.1): Agent-harness workers report a spent Claude Code allowance only for the known subscription-limit phrases, and a Copilot worker reads a spent quota only from its error or result events, not from the agent’s own text. (part of #569)
- AI (Release v7.68.1): When the pull-request body guard cannot read a
--body-file, it now says which path it tried, whether the file and its folder exist, the working directories and which checker script ran, instead of a bareENOENT. (part of #517) - AI (Release v7.68.0): The skills no longer say
cratis screenplay validatelacks--open-questions; the CLI has it. - Chronicle (Release v19.76.0): Returning
GetDecisionConflicts()as a response body, for example withResults.Conflict(...), no longer throws. ADecisionConflictnow serializes with System.Text.Json as the read model identifier (ReadModel), the key and the conflicting event, without the CLR type (#4984) - Chronicle (Release v19.75.1):
RemoveNamespacenow finds the namespace’s remaining observers through the persistent reminder table and unsubscribes and removes them too, so no reminder is left to bring the namespace back (#4942). - Chronicle (Release v19.75.0): A decision read refused because the kernel’s projection definition did not match the client’s no longer stays refused until the application restarts. Refusals are not cached, a read checks the kernel’s definitions once more before refusing, and the agreement is checked again after the client connects or disconnects. Protected reads and Arc protected commands therefore recover by themselves after a kernel restart or upgrade. (#4992)
- Components (Release v4.29.0): The tree layout of
SchemaEditorno longer loses schema details when a schema is edited. A property the user did not change is written back exactly as it was read, including: - Components (Release v4.29.0): annotations such as
title,descriptionanddeprecated - Components (Release v4.29.0):
default,enum,constandexamples - Components (Release v4.29.0): string, number, array and object constraints
- Components (Release v4.29.0):
integerand nullable type arrays - Components (Release v4.29.0):
formatvalues other thandateandtime - Components (Release v4.29.0):
$refand composition keywords - Components (Release v4.29.0): array
itemsin every form - Components (Release v4.29.0): the order of keys and of
required - Components (Release v4.29.0): Changing a property’s type in either layout now drops only the keywords that no longer apply to the new type: annotations stay, and constraints stay when the new type belongs to the same family. Before, the tree layout dropped everything and the table layout left constraints from the old type behind. (#426)
- Chronicle (Release v19.74.2): The 19.74.0 and 19.74.1 kernels fail to start (
Unable to resolve service for type 'System.String' while attempting to activate 'Cratis.Chronicle.Configuration.StorageConnectionResolution'). The storage connection resolution is now created only from the configured storage, so the kernel starts again with MongoDB and with SQL storage. (#4994) - Fundamentals (Release v7.25.1): The type discovery generator no longer emits
typeofexpressions for types nested in open generic types (for exampleKey<T>.Part) declared in referenced Cratis packages, which failed the build with CS0246 (#1188) - Stage (Release v4.134.0):
slot sideno longer replaces the page in the primary outlet (Cratis/Stage#456). - Orleans (Release v1.18.1): A job that was stopped and then resumed no longer stays
Runningforever when the silo dies before the resume has restarted its steps. Automatic recovery now restarts the steps that were stopped before the resume, using the job’s own status history rather than clocks; a durable stop still wins. (#77) - Chronicle (Release v19.74.1): Event stores first created by a read now get their kernel projections. Until now, if a read reached a new event store before the store was set up, the store was created without its kernel projections, including the event-type statistics projection. A common trigger is the .NET client’s identity-drift check, which runs before artifact registration. Those projections then never handled any event, and waiting for completion after an append could stall on them until the kernel restarted.
- Chronicle (Release v19.74.1): Setup: it now runs exactly once per event store, even when several silos ensure the store at the same time.
- Chronicle (Release v19.74.1): Existing stores: stores that were already affected are repaired the next time a client connects.
- Chronicle (Release v19.74.1): Reconnects: reconnecting to a store that is already set up does no extra projection work.
- Components (Release v4.28.0): The tree layout keeps every
x-vendor keyword when the schema is edited: on properties, on arrayitemsand in nested objects. Root keywords,definitionsand other root keys are kept, and so is the original key order. Before this, onlyx-conceptandx-keysurvived an edit. Changing a property’s type drops the annotations of its old array items. (#425) - Chronicle (Release v19.74.0): SQL table, column and index lookups only consider the schema the connection uses. Before, a table of the same name in another schema of a shared database could be taken for Chronicle’s own. (part of #4946)
- Chronicle (Release v19.74.0): MongoDB clients are no longer shared between different credentials on the same servers. (part of #4950)
- cli (Release v3.70.0): The changed-profile planning spec follows the corpus’
root templateline instead of the legacylayoutline it no longer contains. - Scene (Release v4.67.0): Stage’s
slot sideitem no longer replaces the page in the primary outlet (Cratis/Stage#456). - Stage (Release v4.130.0): Production runtime scenes still carry no sample data (asserted for the new profile members too).
- Cast (Release v0.2.1): When a member removes their
cast.json, their directory card falls back to GitHub data instead of keeping the old title and tagline (#12) - Cast (Release v0.2.1): A merged pull request total that was not fetched from GitHub is labelled self-reported, never live (#12)
- Cast (Release v0.2.1): Taglines with accent markup show as text on directory cards and in the terminal, without literal asterisks (#12)
- Cast (Release v0.2.1): Stat numbers keep their suffix on the same line, GitHub-only intros read as sentences, the search field shows a focus ring, and the 404 heading fits on small screens (#12)
- Cast (Release v0.2.1): Verification badges show the since date as month and year, matching the directory cards (#12)
- Screenplay (Release v4.200.0): Spec line expectations of the root template specs (they pointed one line off) and the PLAY0799 spec now follows Scene: a dialog template that declares no
scopesis not restricted at feature scope. - AuthProxy (Release v2.31.1): A signed-in user arriving on
/registeris now passed through to the lobby instead of starting another registration and being sent to sign in again, so the sign-up wizard opens after the provider login. - Arc (Release v22.109.0): MongoDB clients created through
IMongoDBClientFactoryare no longer shared between different credentials on the same server. (part of #3315) - Arc (Release v22.109.0): The scoped
IMongoClientandIMongoDatabaseno longer capture the client factory in static fields, which leaked state across hosts. (part of #3315) - Chronicle (Release v19.73.1): The Workbench keeps the selected namespace when the page is refreshed or a link is shared, because the address is now the only source of truth for the event store and namespace.
- Chronicle (Release v19.73.1): Switching namespace now restarts the page you are on, so open queries in event sequences and read models show the data of the namespace you picked.
- Arc (Release v22.108.0): ARCCHR0032 no longer reports
[ReadProtection(ReadProtectionMode.On)]on a[ProtectedDecision]command as redundant:Onchanges how validators are built, protects plain read-model parameters and changes theReadChangedrefusal (#3330) - Arc (Release v22.108.0): A read through an unsupported reducer now names what made it unprotectable instead of telling you to wait for reducer support (#3330)
- Arc (Release v22.108.0): The docs explain that refusal messages with status 500 reach clients only in Development or with
ExposeExceptionDetails, show how a frontend handlesReadChangedandReadIncompletethroughreasonDetail, and correct the monthly-limit query and the overbooking repair examples (#3330) - cli (Release v3.69.0):
cratis render --package-setof an application that uses a domain blueprint no longer fails withCLI-RENDER-009/CLI-RENDER-002. - Screenplay (Release v4.197.1): A reaction
invokesmapping such as= $eventSourceId(or$eventContext.eventSourceId) now binds to the triggering event’s source instead of failing with PLAY0268, in both compilers and in the reference evaluator. Models that do not use it keep their executable-model bytes and version. (#790) - Screenplay (Release v4.197.0): Part of Cratis/Screenplay#825; epic Cratis/Scene#157. Validator checks against Scene (template/option existence) follow with #826.
- Scene (Release v4.60.0): The SC4 acceptance asked for a Storybook story; it was missing from #165.
- Chronicle (Release v19.72.1): A reactor or reducer whose stream fails with
ClientIsNotConnectedafter a kernel node restarts now makes the whole client reconnect, with a new connection id and every reactor and reducer registered again, instead of retrying the same stale registration every two seconds indefinitely (#4941). - Scene (Release v4.58.0): Menu entries, crumbs, logo and user-menu entries were dead hash links in a preview (a click only changed the hash, or nothing); the sidebar/topbar items with no target did nothing and gave no hint.
- Scene (Release v4.58.0): Entries pointing at a screen the host does not render are now marked
navTargetMissing(N8) instead of silently doing nothing. - Stage (Release v4.125.0):
cratis renderof an application using a domain blueprint no longer fails withCLI-RENDER-009(dependency onCratis.Blueprint.Default/PrimeReactunsatisfied) orCLI-RENDER-002. - Scene (Release v4.53.1):
ApprovedPackageSetJsonrefused theblueprintandsampleDatamembers of a domain blueprint package’s manifest, so the manifest of@cratis/scene.blueprint.*had to be hand-edited before a host could approve it. Both are design-time only: they are now read and left out of the canonical runtime document (sample data never reaches a rendered application). Covered bywhen_reading_a_blueprint_manifest. - Chronicle (Release v19.71.2): The Aspire hosting client no longer depends on MessagePack 2.5.302, which has a known vulnerability (GHSA-qhrr-8q5h-9q3h). It uses 2.5.307, so the NuGet packages build and publish again
- Orleans (Release v1.17.0): A persisted
Runningjob whose silo crashed is resumed: its unfinished steps are started again under the same job id, scope and namespace, completed steps stay completed and a stopped job stays stopped. Recovery runs when a silo becomes active and, on one surviving silo, when a cluster member is declared dead. A step that was interrupted runs again from the start, so step work must be safe to repeat. (#63) - Orleans (Release v1.17.0):
Resume()no longer reportsJobAlreadyRunningfor a job whose steps have no live work, and a job interrupted while it was still being prepared returns an explicit failure instead of success. (#63) - Orleans (Release v1.17.0): A
Rehydrate()that arrives while a rehydration is in progress now runs another pass afterwards instead of being dropped. - Orleans (Release v1.17.0): A step outcome that reaches a job after it already completed no longer changes its progress or recreates its stored state.
- Chronicle (Release v19.71.1): Switching namespace in the Workbench now takes effect in the Sequences query editor and in Read Models. Previously an open query kept running against the namespace it was opened in, so a namespace with events could show “No events found”
- Stage (Release v4.121.1): Generated code no longer silently leaves out a validation rule whose kind Stage does not know. The renderer, the specification executor and the semantic host now refuse such a model with STAGE-ESM-005, naming the rule kind, instead of rendering or running it without that rule. (part of #448)
- Stage (Release v4.121.1): The default sandbox engine (
cratis runwithout the semantic engine) now refuses a model that uses an unknown rule kind, with a clear reason, instead of ignoring the rule. The rules it already documents as not enforced are unchanged. (part of #448) - Scene (Release v4.51.0): The page header of the foundation shell no longer overflows a phone when it carries several actions: the header and its action row wrap (found by the Chromium audit of the ticket page’s four quick actions).
- Screenplay (Release v4.188.0):
propose-astcould not add the first child of a member the node JSON leaves out while empty: the firstnavigationregion of a module, the firstbuttonof a toolbar, the first sub-item of an item and the first contribution of a screen were refused with “Unknown typed syntax member”. The edit now accepts any member the node kind declares. - Screenplay (Release v4.188.0): The TypeScript compiler reported
PLAY0022orPLAY0024for a module or featuretemplate <Name>assignment the C# language accepts. It now skips the line like the other constructs it does not model. - cli (Release v3.67.0):
cratis renderno longer publishes sample data. Thescene.jsonit writes is a content file of the generated application that the .NET SDK copies to the publish folder, and it carried the authored sample data packs and the profile’s selection; it is now written without them (spec SD6: production output never includes sample data). - Scene (Release v4.45.0): A
globalSearchand thedataListsharing its address parameter did not follow each other (the address was replaced in place, which raises no event), so typing in a list’s search box did nothing. Components writing an address parameter now tell every component using it. - Arc (Release v22.107.1): With
CratisProxiesUseSourceFileAsOutputFileenabled, generated proxies now import each type from the file generated for that type’s full name. Previously, when two types shared a simple name in different namespaces (for example a type from a referenced package and an unrelated type in the application), an import could point at the other type’s file and the frontend failed to compile with TS2307. (#3322) - Stage (Release v4.119.1): The specification executor behind
cratis runand the Stage spec runner now runs commands with composite inputs instead of reporting them as unsupported. Nested concept rules are checked in the same order and with the same messages as Screenplay’s reference, malformed composite inputs are rejected before any rule runs, and only composites that are present are validated. (part of #441) - Stage (Release v4.119.1): The renderer, the specification executor and the semantic host now decide which composite values they accept from one shared rule, so a model the renderer accepts is no longer refused when you run its specifications. (part of #441)
- Stage (Release v4.116.2): Commands with
==or!=validation rules on a concept with named values now render instead of being refused with STAGE-ESM-005. The generated code compares enum members, including for optional concepts, where an absent value passes. (#420) - Stage (Release v4.116.2): Requirements that compare a named-value concept with one of its members, or with another property of the same concept, now render, including combinations with
andandor. Ordering, other rule kinds, collections and comparisons across different concepts are still refused with a specific reason. (#420) - Screenplay (Release v4.183.0): A
matchesrule no longer rejects a valid value, and a generation check no longer reports PLAY0689, because the host was too slow to finish matching within a second. (#800) - Stage (Release v4.116.1): Commands whose composite property contains an optional validated concept now render instead of being refused with STAGE-ESM-005, as long as every rule on that concept accepts an absent value. This includes optional parent composites, collections of composites and recursive types. A concept with
not empty, a nested collection or named values is still refused. (#418) - Stage (Release v4.116.1): A composite value that omits an optional member now renders that member as
nullinstead of failing to render. (#418) - Stage (Release v4.116.1): Specifications that use composite values now render. A rejection specification whose composite input lists members in a different order from the type’s declaration is refused, because the reported first failure would otherwise differ from the model. (#418)
- Stage (Release v4.115.0): The legacy renderer refuses validation rules it cannot render instead of writing a
// TODOcomment into the generated validator. (part of #414) - Screenplay (Release v4.181.1):
TenantIdnow formats as its value, so agenerate rulebody that interpolatescontext.Tenantproduces the tenant identifier instead ofTenantId { Value = … }(#798) - Stage (Release v4.113.1): The default sandbox engine now checks
minandmaxon numbers by value instead of by text length, soquantity min 1rejects0andamount max 100rejects99999. Text bounds still measure length. (#425) - Stage (Release v4.113.1):
not emptyon a nested property such ascustomer.address.nameno longer rejects every command in the default sandbox engine. (#425) - Stage (Release v4.113.1): The default sandbox engine no longer half-enforces
all >andall >=: they are dropped, like equality and rules with non-literal operands, and rules whose path crosses a collection are skipped instead of refusing every payload. The sandbox documentation now lists which rules the default engine enforces and which it ignores. (#425) - Screenplay (Release v4.180.2): Parsing a valid model no longer fails with a regular-expression timeout when the host is busy. The compiler’s own patterns now run on .NET’s linear-time regular expression engine with no wall-clock timeout, so they stay safe against hostile input without depending on how fast the machine is. Parsing the samples is also about twice as fast. (#796)
- Screenplay (Release v4.180.2): Import globs are matched folder by folder without regular expressions, so a glob with many wildcards or
**segments can no longer exhaust memory or the stack. (#796) - Stage (Release v4.113.0): The semantic engine (
cratis runwith the semantic runtime, and the Stage Host) no longer reports Screenplay’s informational notes as blocking refusals. Report-only metadata such as descriptions, personas, documentation and deferred screens used to appear among theUnsupported(Plan) model:refusals, burying the real errors. Only errors block now. (#430) - Stage (Release v4.112.1): Planning a model whose specification pins a value for a generated concept with an opaque (code) rule no longer throws
InvalidSemanticContract; the specification is refused withSTAGE-ESM-005, naming the concept and the rule, like the concept itself. (#429) - Chronicle.Elixir (Release v3.14.2): When the commit inside
Chronicle.decide/2fails, for example because the kernel is unreachable, the unit of work is rolled back. Later appends from the same process go to the event log instead of being buffered into the failed unit of work and lost. (#161) - Chronicle.Elixir (Release v3.14.2):
Chronicle.decide/2andwith_unit_of_work/2stop the unit of work’s process when they return, so a long-lived caller no longer collects one linked process per call. (#161) - Chronicle.Elixir (Release v3.14.1): The client’s Logger filter now removes the API key, the OAuth bearer token and the gRPC and Mint state that holds request headers from
gen_server,proc_liband supervisor crash reports, so you no longer need an application-level filter. This covers the Mint connection process, which kept the API key in its HPACK table, andGRPC.Client.Connection. See Crash reports. (#79) - Chronicle.Elixir (Release v3.14.1): Warning and error log text no longer contains the API key, password or tokens the client authenticated with. (#79)
- Screenplay (Release v4.180.1): The executable binder accepts queries with the same name in different slices, such as Arc’s
AllandGetAllon several read models, instead of refusing them with PLAY0268. A specification’sthen queryandwhen queryresolve like other references: its own slice first, then the enclosing feature, module and document, or a qualified name; a reference that still matches several queries is reported as ambiguous (PLAY0198) at that reference. (#624) - Screenplay (Release v4.180.1): A specification that asserts an authorized query declared in a later slice now requires
given caller, like any other authorized specification (PLAY0389 was skipped for such queries). (#624) - Stage (Release v4.109.1): Generated specification classes and test names now split single-letter words and the end of an acronym. For example,
RegisteringAGreetingrenders aswhen_registering_a_greetinginstead ofwhen_registering_agreeting, andHTTPRequeststill renders ashttp_request. Re-rendering renames the affected generated specification classes and files. (#417) - Stage (Release v4.109.0): Stage decides whether generated values are guarded for freshness and shape by whether the model declares a generation strategy, matching the reference evaluator, instead of by ESM version. Models that only use implicit UUID generation are no longer guarded. (#393)
- Screenplay (Release v4.173.0): Generated-concept rule proofs in MCP declaration details use the same UTC assessment year as the compiler, so date patterns get the same proven, refuted or unproven status as the PLAY0688/PLAY0689 diagnostics. (part of #618)
- AI (Release v7.56.2):
dotnet buildanddotnet testinside the agent harness images exit cleanly on multi-project solutions: the images disable MSBuild node reuse and the build server, so leftover worker nodes no longer keep build output open and hang an agent or the harness reading it. (#714) - Chronicle (Release v19.68.0): Events revised on SQL storage now report their revised generation to clients, so a client reading over gRPC can tell the content was revised instead of using the stale stored generation (#4888)
- AI (Release v7.56.1): The agent harness always delivers a result Studio accepts: non-string
gapsandselfChecksitems written by the agent are converted to text, nulls are dropped, long text and long lists are capped to Studio’s limits, and verbose advisory metadata is trimmed to fit with a marker saying how much was dropped. Usage and correlation values are forwarded byte for byte. (#711) - AI (Release v7.56.1): A result that still cannot meet Studio’s contract fails the worker with the clause it breaks, instead of being rejected by Studio without a reason. (#711)
- Screenplay (Release v4.171.0): A specification that appended an event a capture over events reads, and expected
then no events, passed even though Chronicle would append; the capture now receives the event and its appends are compared. (#483) - Arc (Release v22.100.2): The Screenplay generator no longer emits a model that fails binding when a command’s generated value has a generation strategy it cannot recover (
SP0073) and that value feeds a required event property. Productions that need the value for a required property are withheld (SP0012). Mappings to optional properties are omitted with a warning. Dependent responses, conditions, destinations, routes, operations and scenarios are withheld with their existing diagnostics. Everything independent of the value is kept, and the command falls back to itsfilereference only when no production survives. (#3219) - cli (Release v3.64.0):
cratis runno longer reports a model as ready when Stage refuses to run it. It waits for Stage’s status, lists every refusal issue, stops the container and exits 5. A routed model refused by the default engine (STAGE-ESM-030) suggests--engine semantic. (#368) - Arc (Release v22.100.1): The Screenplay generator no longer drops an xUnit
[Theory]that builds a localReadModelScenario,CommandScenario,EventScenarioorReactorScenariowithout a trace: it is now reported with InformationSP0076like every other omitted scenario theory, so the generated document accounts for every specification it leaves out. (#3295) - AI (Release v7.53.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.
- Stage (Release v4.103.2): The plan-from-sources reference links to Screenplay’s tool page again; the links pointed at a page that does not exist.
- Screenplay (Release v4.168.0): The repair-capabilities schema lists PLAY0688 among the repairable diagnostics.
- Stage (Release v4.103.1): A freshly scaffolded application’s frontend now type-checks and builds before any slice is rendered. The scaffold’s entry point loads the Scene module only when it exists, and until the first render creates it, shows “Nothing to show yet” instead of failing with
Cannot find module '../src/stage'. Fully rendered applications load their Scene module exactly as before. (#399) - Chronicle.TypeScript (Release v6.52.1): A read-model field that no event has set yet now reads as the value the class declares (for example
null), instead ofundefined, so a projection and a reducer give the same result for the same history. An absent array still reads as an empty array. Requires@cratis/fundamentals7.24.1. (#251) - Fundamentals (Release v7.24.1):
JsonSerializerno longer overwrites a class’s default value withundefinedwhen a field is missing from the input; the field keeps what the constructor gave it. Fields present in the input, explicitnullvalues and missing collections (which become empty arrays) behave as before. (#1184) - Arc (Release v22.95.1): A
CommandScenariothat seeds events for an event source and pins the same id as a guarded generated value, withoutUseDecisionReads(), now fails fast withGeneratedIdentifierCollisionRequiresDecisionReads. Before, the command silently succeeded, because the default mode does not put seeded events in the event log. The fresh-identifier and generated-value testing docs show the workingnew CommandScenario<T>().UseDecisionReads()setup. (#3280) - Chronicle (Release v19.64.1): Resetting a development kernel, and the reset between integration specs, now also clears the in-memory appended-event queues and live observers. Previously they survived the reset, so a projection registered at runtime in a later spec could receive events from an earlier one, skip its own events and return no read model. A reset that cannot clear them now fails instead of continuing with stale delivery. (#4815)
- Chronicle (Release v19.63.0): The CHR0054 reference and the reactor side-effects documentation no longer say that a synchronous custom side-effect type cannot be used: the runtime accepts it when a registered handler claims the type (#4882)
- Chronicle (Release v19.62.4): The .NET client sends the global event seeds discovered from
ICanSeedEventsonce per event store on each connection, instead of again for every namespace store it opens. Seeds added throughForNamespace(...)and seeds queued by hand are still sent every time (part of #4869) - Arc (Release v22.91.1): The Cratis.Arc NuGet packages for 22.91.0 were never published. This release publishes them. In the default scenario mode,
QueryScenarioobserves Chronicle read models built with[ChildrenFrom<T>], joins and reducers, and Arc requires Cratis Chronicle 19.59.1 or later. - Chronicle (Release v19.62.3): On PostgreSQL, an event store and its namespace no longer share one database when their names are longer than PostgreSQL’s 63-byte limit. Long database names are now a readable prefix plus a hash and stay distinct, so every namespace migration runs and observers no longer fail with
relation "FailedPartitions" does not exist. On SQL Server, names longer than 128 characters are created the same way instead of failing. (#4849) - Chronicle (Release v19.62.3): A migration that reports “already exists” while migrations are still pending now fails with
DatabaseMigrationIncompleteinstead of marking the database as migrated. (#4849) - cli (Release v3.61.1):
cratis screenplay baseline checkandcratis render’s release-baseline warnings for PATH input no longer refuse a model root whose.screenplayfolder has mode0755, which is what a git checkout creates. They previously failed withMetadataPermissionsin fresh clones and CI. Folders that are group- or other-writable are still refused. (#360) - Stage (Release v4.99.0):
SemanticModelLoaderandCratisRendering.PlanFromaccept a model root’s own.screenplay/identities.jsonasCatalogPath, the file the Screenplay MCP andscreenplay baseline admitwrite, as well as a bare identity catalog. Stage reads it through Screenplay’s publicScreenplayModelRootandPersistedIdentityStateSerializer. Loading a whole root also computes the release-baseline assessment for the same workspace that is rendered, soSTAGE-BASELINEwarnings work from a real model root. A root that cannot be opened (pending recovery, conflicting identity state, unreadable metadata) reportsSTAGE-BASELINE-003orSTAGE-BASELINE-004without throwing. (#388) - Stage (Release v4.99.0): In model-root mode,
.playfiles under folders Screenplay does not read (.git,.ai-work,bin,obj,node_modules) are left out of folder selections, asscreenplay baseline checkdoes. A file named explicitly that the root does not read is refused withSTAGE-PLAN-001and is never silently dropped. (#388) - Chronicle (Release v19.62.1): Read-model watchers and observable queries are no longer notified when a reducer fails to fold an event. Previously they received the state from before the failure, and were told the read model was removed when the first event of a batch failed; successful folds, including removals, notify as before. (#4817)
- Chronicle (Release v19.62.1): Events forwarded from another event store’s outbox into the inbox now keep their tags, so tag-filtered reactors, reducers and projections observing the inbox receive them. Events forwarded before upgrading stay untagged and are not backfilled. (#4823)
- Stage (Release v4.98.2): Generated applications now report healthy at
/healthzonly after Chronicle has registered their read models, projections, reactors and reducers. Before this, a client or test harness that queried as soon as the host turned healthy could get HTTP 500ReadModelNotFound. Stage, its Docker images and the generated scaffold now pin Chronicle 19.59.6, which includes Cratis/Chronicle#4872. (#387) - Stage (Release v4.98.2): The compliance and rendering references no longer claim that
[NotAudited]protects event payloads. It keeps a command input out of the command causation chain;[Encrypted]or[PII]protects the value on the event. (part of #175) - Screenplay (Release v4.159.0):
screenplay baseline checkand other read-only opens of a model root no longer refuse the.screenplaydirectory a git checkout creates (0755). Reads now refuse only a directory other users can write; writes and recovery still require owner-only access. (#742) - Chronicle (Release v19.59.7): Unique constraints on SQL storage are now settled by the database: two concurrent appends claiming the same value no longer both succeed. Per-event-source constraint tables get a unique index on the value on PostgreSQL, SQL Server and SQLite, and a collision is reported as a constraint violation instead of leaving two holders. (#3744)
- Chronicle (Release v19.59.7): On SQL storage, moving a claim to a value another event source already holds is rejected and keeps the original claim, instead of losing it. (part of #3744)
- Chronicle (Release v19.59.6): The ASP.NET Core readiness health check (
chronicle, taggedready) reports healthy only once the client is connected and artifact registration for the configured event store has succeeded, so a readiness probe no longer routes traffic before reactors, projections and constraints are registered. Until registration completes, or when it fails, the check reports its configured failure status and lists the failed artifacts. Apps that turn offAutoDiscoverAndRegisterand do not run registration themselves stay healthy once connected. See health checks (#4872) - Chronicle (Release v19.59.5): Appending a previous event generation declared with
[EventTypeGenerationFor<T>]no longer fails the build with CHR0001. BothAppendandAppendManyaccept either marker, and the diagnostic message and the CHR0001 reference now name both, with an example of appending a previous generation (#4862) - AI (Release v7.48.2): The worktree cleanup hook no longer deletes a merged worktree that holds work records: a worktree with a non-empty
.ai-work/is kept and reported as “has untracked work records (.ai-work/)”. Removing it takes an explicit--include-work-recordsrun by hand; the automatic hooks never pass it. Locked worktrees (git worktree lock <path>) are always kept and reported as locked, and the docs name locking as the way to pin a long-lived worktree. (#670) - Screenplay (Release v4.156.1): The event model board shows only the appended event in the WHEN row of a state-view or automation specification, and the expected read model in its THEN row, instead of every event the projection consumes. Specification titles are the specification name; read model fixtures the board does not draw stay in the title. (#724)
- Chronicle (Release v19.59.4): Stopping a kernel silo now waits for in-flight projection catch-up and replay work and writes its buffered MongoDB bulk writes within the shutdown budget, instead of leaving writes that can land after the silo reported it had stopped; writes cut off by the deadline are logged with their observer and partitions and recorded as failed partitions where time allows (#4790)
- Chronicle (Release v19.59.3): The in-memory event store enforces unique constraints across event sources: a second event source claiming a value another source holds is rejected as a duplicate and the first claim is kept, a rejected move keeps the old claim, and releasing a claim frees the value (part of #3744)
- Chronicle (Release v19.59.2): Appending a batch with two concurrency scopes for the same event source no longer fails with a generic error: identical scopes are merged and conflicting ones are rejected with a clear append error (#4712)
- AI (Release v7.47.0): Corpus verification recognizes nested Screenplay commands such as
screenplay baseline admitfrom the pinned contract (part of #655) - Chronicle (Release v19.59.1): Reindexing unique constraints over an event history that already contains duplicate values completes instead of failing on the first duplicate: the first claimant in event log order keeps the value and each later duplicate claim is logged and skipped (part of #3744)
- Stage (Release v4.93.0): A rendered
allprojection no longer gives a property it does not map a default value (such as0,falseor an empty UUID) on read models it creates for unrelated events, where Screenplay leaves the property unset. Rendering now fails withSTAGE-ESM-017unless every such property is optional, text or a single object. (part of #117) - Arc (Release v22.87.2): The frontend
notEmptyrule now treats text as empty exactly when it contains only Unicode whitespace, the same set the backend uses, so a value such as U+0085 or U+FEFF is accepted or rejected identically on the client and the server. (#3224) - Arc (Release v22.87.2): An observable query whose arguments fail validation now delivers the validation results to the subscriber as an invalid query result and ends the subscription, over WebSocket and Server-Sent Events, in direct and hub mode, instead of a bare error message or a failed connection. Plain query requests and the React query hooks already surfaced these results. Controller-based observable queries over a direct WebSocket are tracked in https://github.com/Cratis/Arc/issues/3230. (#3225)
- Chronicle (Release v19.58.0): Passive reducer reads now apply the reducer’s tag, event source and stream filters, so on-demand state matches the state the active reducer builds. (#4785)
- Chronicle (Release v19.58.0):
ReadModelScenarionow applies reducer tag filters and keeps the tags, event source type and stream metadata of seeded events, so filtered reducers produce the same state in specifications as in production. (#4786) - Chronicle (Release v19.57.1):
CHR0024no longer reports a variant property that is populated by the variant’s[EntersOn<T>]event or by a[GlobalFor<T>]handler of its group, including the documented shared-handler example (#4831) - Chronicle (Release v19.57.1):
ReadModelScenarioremoves the entity from the other variants when it enters a fluent variant, the same as for model-bound variants and under a running kernel (#4832) - Chronicle (Release v19.57.1):
ReadModelScenarionow shows the value of a variant’s non-entering event that was appended before the entering event once the variant is created, as a running kernel does (#4833) - Chronicle (Release v19.57.1): The variants and
ReadModelScenariodocumentation now describes early joins, shared mappings and testing variants. See Model-bound variants (#4834) - Chronicle (Release v19.57.0): Captures over public events that do not name a
sequenceno longer fail every batch with an error saying they do not read from their inbox (#4700) - Chronicle (Release v19.56.1): With
Workbench:BasePathset, opening Read Models no longer redirects to a URL without the prefix, which broke reloads and shared links behind a path-routed proxy (#4830) - Chronicle (Release v19.56.1): Navigation everywhere in the Workbench now follows the base path, including the breadcrumb, the sidebar and the redirects to and from the sign-in page.
- Arc (Release v22.87.1): A command returning events for several event sources (
EventForEventSourceIdcollections, including mixed plain and wrapped events) now appends them as one batch when no command transaction is active, so a refused event no longer leaves the events before it appended while the command reports failure. Per-event routing, subject, occurrence time and tags are kept. When one event source id receives events on several streams and the command declares no concurrency guard, the events still append one at a time, because a batch can carry only one guard per event source id (https://github.com/Cratis/Chronicle/issues/4818). (#3216) - Chronicle (Release v19.55.2): Projection catch-up and replay on MongoDB no longer lose writes when a kernel silo stops or crashes mid-catch-up: progress is persisted only once every silo has confirmed its buffered writes are stored, and a lost or failed write window makes the job step resume from its last durable position instead of skipping the events (#4814)
- Screenplay (Release v4.149.1): The reference evaluator no longer fails a specification when a child projection event arrives before its parent instance: like Chronicle, it holds the child until the parent exists and then applies it with its original event values, at any nesting depth and across
given,whenand command commits; a child whose parent never arrives stays out of the read model, and an ambiguous parent still fails (part of #132) - Screenplay (Release v4.149.1): Removing a child, deferred or not, applies the ancestors’
everymappings the way Chronicle does (part of #132) - cli (Release v3.57.1):
cratis screenplay validate --helpprinted the description and examples and then failed with a markup error before listing the options; the full help, including--scope,--check,--executableand--warnings-as-errors, is shown again. (part of #339) - cli (Release v3.57.1):
--warnaserror, the standalonescreenplaytool’s spelling, is accepted as an alias of--warnings-as-errors; before, it was silently ignored and a model with warnings passed. Any other unknown option now fails with exit code 5 instead of being ignored. (part of #339) - cli (Release v3.57.1): An unknown
--checkname fails with exit code 5 and a message listing the valid check names, instead of exit code 255. (part of #339) - Chronicle (Release v19.55.0): A client call carrying more than 4 MB, such as appending a large event or a client-side reducer whose read model had grown past it, no longer fails with
ResourceExhausted(#4821) - Chronicle.Kotlin (Release v6.13.1): Messages from the kernel larger than 4 MB no longer fail with
RESOURCE_EXHAUSTED: the client now accepts 100 MB by default, like the other Chronicle clients (Cratis/Chronicle#4821) - Chronicle.TypeScript (Release v6.51.1): Messages from the kernel larger than 4 MB no longer fail with
ResourceExhausted: the client now allows 100 MB in both directions by default, like the other Chronicle clients (Cratis/Chronicle#4821) - Chronicle (Release v19.54.1): Events with encrypted (secret) properties of non-string types, such as
intorboolconcepts marked for subject, namespace or global encryption, can be appended and read back with their original values and types; previously the append failed (#4813) - Stage (Release v4.89.0): A routed
when appendwith a UUID or composite stream identifier now generates the stream-identifier type its specification needs. A slice-scoped render now includes the event-source classes that its filters and appended routes refer to. (#297) - Arc (Release v22.85.1): A command that returns a collection of events for one event source with a compliance subject now appends them as one batch: if any event is refused, none is appended and the command reports the refusal, instead of leaving the earlier events in the event log. The subject, routing, tags and concurrency scope of each event are preserved. (#3187)
- Arc (Release v22.84.0): The Screenplay generator states a Chronicle unique constraint with every event it covers: all
On<T>targets and their properties, and everyRemovedWith<T>release, are read and stated together. A constraint with any part the generator cannot read exactly (an unread target, an aliased or conditional release, settings Screenplay cannot express) is left out as a whole withSP0017instead of being stated with fewer events than Chronicle enforces. Events named only by additional targets or releases are imported like the constraint’s first event. (#3188) - Screenplay (Release v4.147.1): From ESM v15, the reference evaluator no longer rejects a generated command for reusing its identifier just because an earlier fact has no event source; only earlier facts on the same event source count (part of #616)
- Stage (Release v4.83.0): On a narrow window the menu toggle changed its label and the navigation never opened, in a live Stage and in a generated application alike. Scene’s blueprint stylesheet parked the sidebar off-canvas with a rule the open state could not out-rank; Scene 4.22.1 fixes the rule, and the Stage frontend, the contracts and the pinned frontend package set of generated applications move to it. (part of #237)
- Arc (Release v22.82.0): The Screenplay generator no longer drops
MenuItemandMenuItemsimported on their own from Cratis Components without a diagnostic, and it now names why each unread menu item, route navigation or after-success callback (CommandDialog onSuccess) is not stated, keeping navigation after a command succeeds separate from gestures that open its input. (#3049) - Arc (Release v22.82.0): Generated command proxies type a collection response as an array: a command returning
IEnumerable<ProjectSummary>now exposesProjectSummary[]inCommand<…>anduseCommand<…>, matching what the client already deserializes. (#3174) - Chronicle (Release v19.53.3): A nullable concept over
stringorboolon a read model is now marked nullable in the read-model schema, so an unset value on a[Passive]read model staysnullinstead of becoming a default such asfalse. Event type schemas are unchanged. (#4081) - Arc (Release v22.81.0): Stream-scoped decision reads (
IDecisionReads.Get<T>,GetDetached<T>andAdmitForStream<T>with an event source id, stream type and stream id) work inside Arc commands with the same protection, caching and enrollment as key-based decision reads, instead of being refused (#3126) - Arc (Release v22.81.0): The decision-read documentation describes
[Unprotected]commands consistently: their decision reads are unguarded, not refused (#3208) - Scene (Release v4.22.1): The narrow-window (
max-width: 991px) rule that parks.layout-sidebaroff-canvas has the same specificity as the.layout-mobile-active .layout-sidebarrule that opens it, and comes later, so the open state never won. A.layout-wrapper.layout-mobile-active .layout-sidebarrule inside the media query now out-ranks the parked sidebar, so the toggle brings the navigation into the window on every application built on the default blueprint, including a live Stage. (part of #75) - Chronicle (Release v19.53.2): A child join applied by the in-memory storage, which
Cratis.Chronicle.Testingand in-memory kernels use, now updates every matching child in place, as the MongoDB and SQL sinks do. Before, it replaced the whole read model with the joined child alone, dropping the root’s other properties and sibling children. (#4531) - Chronicle (Release v19.53.2): Regression specifications confirm that a projection combining
FromwithFromAllmaterializes an instance for an event from an unrelated event source the same way in memory and in a running kernel. (#4266) - cli (Release v3.54.0):
cratis render --scopeon a module or feature whose slices were all removed now checks only application-level declarations, so errors in unrelated slices no longer block removing the scope’s previously rendered files. Application-level errors still refuse the render and leave the published output untouched. (#334) - AI (Release v7.38.3): The Claude Code tool server no longer breaks a running server on the same port when a server that never started is disposed, and a failed start now retries on a new port instead of failing with a disposed listener; this removes an intermittent failure where a tool call was lost and the turn silently fell back to another pool member (#638)
- Chronicle (Release v19.53.1): A children projection identified by a nested member, such as
.IdentifiedBy(child => child.Identity.Id), now updates and removes the matching child instead of adding a new child for every event. This works in a running kernel on MongoDB, SQL and in-memory storage, and inReadModelScenario. (#4779) - Stage (Release v4.80.0): The live Stage no longer silently renders a model whose profile names a custom package as if the package were not there: without the package it says so instead of rendering a placeholder.
- Screenplay (Release v4.145.1):
propose-propertytreatsseedevent values as fixtures. Renaming a property rewrites its seed assignments instead of leaving them stale, removing it removes them, and adding a required property writesfixtureValueinto every seed entry of that event or refuses withFixtureValueRequiredlisting them.find-referencesanddependencieswithkind: "Property"list seed values with rolefixture(#681) - Screenplay (Release v4.145.1): The documentation no longer calls
navigate … by <parameter>or formcolumnslegacy. Both are current:bypasses the target screen’s key, andcolumnssets field order and labels independently oflayout’s geometry (#688) - AI (Release v7.38.0): Harness setup no longer deletes or overwrites files at adapter paths it did not generate; it reports the conflict and only replaces them with
--force(#630) - Stage (Release v4.79.1): Keyed lookup and filtered live queries whose argument concept has validation rules are rendered again instead of being refused with
STAGE-ESM-010. The argument is accepted as its underlying primitive and converted inside the query, so a key that breaks the concept’s rules finds no instance, matching the Screenplay reference, rather than failing validation. Composite or collection arguments that contain a validated concept are still refused, with a message that names the concept. (#350) - AI (Release v7.37.0): The Chronicle Kotlin client skill no longer says transactional appends return
Unit; inside a unit of work they return a placeholderAppendResult, and the real results are on the unit of work after commit - Chronicle (Release v19.51.2): A projection future is no longer lost when a catch-up or replay write fails. While a projection catches up or replays, a write that resolves a future is now made immediately with a known outcome instead of being buffered, and the future is removed only after that write succeeded. Failed writes are reported as failed partitions. (#4753)
- Chronicle (Release v19.51.2): Failures of buffered MongoDB projection writes during catch-up and replay are reported exactly once, and writes queued behind a failed batch are still written. (#4753)
- Chronicle (Release v19.51.2): A projection future stays registered if storing its resolution fails, instead of disappearing from memory while it is still stored. (#4753)
- Chronicle (Release v19.51.1): Projections that map nested members now apply the naming policy to every segment of the path. Before, only the first segment was camel-cased, so
.Set(m => m.Topic).To(e => e.Brief.Topic)readbrief.Topicfrom an event stored asbrief.topicand left the property empty. This affected both a running kernel andReadModelScenario. Nested paths in keys, parent keys, joins, children, counters,FromAll/FromEveryand the model-bound attributes are fixed the same way. The changed projection definition is rebuilt automatically under the defaultAutomaticdefinition evolution; withPartialOnlyorManual, Chronicle raises a replay recommendation so you can rebuild it (#4493) - Chronicle (Release v19.51.1): Model-bound attributes accept dotted member paths such as
[SetFrom<Briefed>($"{nameof(Briefed.Brief)}.{nameof(Brief.Topic)}")]and validate every segment against the type, instead of rejecting them before the projection is built (part of #4493) - Chronicle (Release v19.51.1): An event type migration’s
DefaultValueorMapValuesfor aConceptAs<T>property now writes the plain underlying value, for example"global", instead of{"Value": "global"}. Migrated events then deserialize into the concept as expected (#3941) - AI (Release v7.36.1): The Stage rendering, render and gap-fill, UI composition, read-surface and authoring-workflow guidance no longer tell agents that a guarded Close action and a double-click interaction are refused by design. Stage has run both since 4.65; on public CLI 3.53.1 with
cratis/stage:4.73.1the live browser run offers Close only while the item is open, postsCloseWorkItem, hides Close afterwards, and navigates or notifies on a double click depending on the row (Cratis/Screenplay#671).STAGE-SCENE-ACTION-001andSTAGE-SCENE-INTERACTION-001stay documented as the refusal for a guard Stage cannot evaluate. A verification spec now fails if the guidance says otherwise. (part of #536) - Arc (Release v22.77.0): The Screenplay generator no longer states a reactor that returns several events as
produceswhen Chronicle could refuse the batch differently from Screenplay: Chronicle appends a returned batch as one unit, while a Screenplay reaction appends each fact separately. When a later event can be rejected by a constraint (a unique property, a class-level[Unique], or anIConstrainttarget), an earlier event closes the stream, or a constraint cannot be read, the reactor keeps itsfilereference andSP0070explains why. (part of #3093) - Arc (Release v22.77.0): The Screenplay generator reads screen source with a scanner that understands strings, template literals, regular expressions and JSX text and attributes, so
//inside a value such astitle="https://example.com"is no longer cut off as a comment and animportinside a template literal is no longer read as an import. A screen that renders other components or HTML beside the Cratis Components it reads now reports each part it does not read withSP0028, and a screen whose source cannot be scanned reports that once instead of stating a partial structure. (#3095) - AI (Release v7.35.0): Arc identity guidance: forwarded identity headers are trusted only with
TrustForwardedIdentityHeaders=true, discovery endpoints need authentication outside Development, and the `.cratis-iden
Removed
Section titled “Removed”- Arc (Release v22.126.1): The MongoDB integration no longer configures a Polly retry strategy that could never fire, because the collection interceptors already handle every error themselves. Retry, cancellation and error behavior are unchanged. The interception layer itself stays until the next major release. (part of #2858)
- Chronicle (Release v19.88.2):
Cratis.Chronicle.Testingno longer ships the unused internalInProcessChronicleConnectionandInProcessServicestypes; scenarios keep running onChronicleConnectionForTestingandTestingServices, so nothing changes for consumers. (#4929) - cli (Release v3.73.0): The one-time automatic restart from
eventmodeltosemanticincratis run, and theengineFallbackmember of its JSON output. A refusal now stops the container and exits with5on the engine that was selected. (part of #324) - AI (Release v7.51.1): Version tables, product-source pages and provenance history from these skills. (part of #662)
- AI (Release v7.48.3): The toolchain skill’s
versions.md,doc-contradictions.mdandprovenance.mdreferences. The documentation contradictions that still hold are tracked as issues on Cratis/Screenplay. (part of #662)
Security
Section titled “Security”- Screenplay (Release v4.216.0): A destination-intent repair is refused, before the proposal is kept and again before files are installed, if any attachment it relies on overlaps a source, identity, journal, staging or backup path, including through physical aliases or uncertain links. A proposal is also refused at apply if its source, catalog, files on disk or attachments changed after review. (#397)
- Arc (Release v22.121.0): A non-public static helper on a read model can no longer be reached over HTTP as a query endpoint with caller-chosen arguments. (#3368)
- Arc (Release v22.119.0): Query health no longer exposes per-connection user IDs and client addresses to anonymous callers outside Development. (#2873)
- Arc (Release v22.116.0): A host
FallbackPolicy, or Arc Core’s requirement that callers authenticate when authentication handlers are registered, can no longer be bypassed by reaching an unannotated query through the observable query hub. (#2952) - Arc (Release v22.116.0): An open hub connection whose session a guard revokes can no longer keep reading non-observable query results. (#2955)
- Arc (Release v22.108.0): A command declared with read protection
Onblocks onErrorandUnknownvalidation results from validators,Provide()andHandle(), even when the caller sends a more permissiveX-Allowed-Severity; callers can still accept warnings and information. An explicit[BlockOnValidationSeverity]still takes precedence, andOffandMeasureare unchanged: under those modes, declare[BlockOnValidationSeverity(ValidationResultSeverity.Error)]on commands whose validators must not be skipped (#3332) - Orleans (Release v1.17.0):
Cratis.Orleans.Storage.SqlreferencesSystem.Security.Cryptography.Pkcs10.0.13, replacing the 9.0.11 that Microsoft.Data.SqlClient brought in, which is affected by GHSA-846f-f764-76mx and GHSA-2fmv-rv2c-59x7. - Chronicle (Release v19.65.2): The message of
ConflictingEnrollmentScopeno longer contains the event source identifier or any scope values. It only names the scope dimensions that differ, so a generated or sensitive identifier is not written to logs or responses that show the message. Read the values from the typed properties when you need them. (#4909) - Chronicle (Release v19.65.1): The SQL storage provider now references System.Security.Cryptography.Pkcs 10.0.13 directly. Microsoft.Data.SqlClient 7.1.1, the latest release, otherwise brings in version 9.0.18, which is affected by GHSA-2fmv-rv2c-59x7 and GHSA-846f-f764-76mx. (#4912)
- Arc (Release v22.95.2): .NET 10 packages are updated from 10.0.12 to 10.0.13, and
System.Security.Cryptography.PkcsandSystem.Security.Cryptography.Xmlare pinned at 10.0.13. This fixes advisories GHSA-2fmv-rv2c-59x7, GHSA-846f-f764-76mx, GHSA-c399-9853-6jmj, GHSA-7hqp-7c5m-4vq6 and GHSA-r955-8q5j-3h83.Microsoft.OpenApimoves to 2.12.2, whichMicrosoft.AspNetCore.OpenApi10.0.13 requires. (#3282) - Chronicle (Release v19.64.2): Move the .NET packages from 10.0.12 to 10.0.13. This clears the advisories against System.Security.Cryptography.Pkcs and System.Security.Cryptography.Xml 10.0.12, which arrive through Microsoft.AspNetCore.DataProtection: GHSA-2fmv-rv2c-59x7, GHSA-846f-f764-76mx, GHSA-7hqp-7c5m-4vq6, GHSA-c399-9853-6jmj and GHSA-r955-8q5j-3h83. (#4897)
- cli (Release v3.59.1): The Chronicle workbench’s terminal UI library, SharpConsoleUI, moves to 2.7.0, which no longer depends on SixLabors.ImageSharp. The five ImageSharp advisories (GHSA-gwg2-r3hj-4w44, GHSA-j3p4-wp97-rph4, GHSA-j9gm-c75j-xc9q, GHSA-jjfr-hcj7-qf5w, GHSA-wmxv-xphr-5c9g) no longer apply, and their NuGet audit suppressions are removed, so a future advisory in the dependency graph fails the build again. (#277)
Deprecated
Section titled “Deprecated”- Arc (Release v22.129.0):
GeneratedIdentifierEventsCannotBeSplitis no longer thrown, because events for a generated source now append in one batch with the rest of the command’s events. It is marked obsolete. (#3423) - Stage (Release v4.148.0): The
eventmodelHost engine is deprecated and will be removed in Stage v6. Selecting it logs a warning once at startup. (part of #23) - AI (Release v7.74.0):
RecordDecisionUsage,DecisionUsageRecorded,DecisionUsageByDay,RecordAIProviderUsageSnapshotandAIProviderUsageSnapshotRecordedare obsolete. They remain so existing event stores still replay, and are removed in the next major release (part of #767). - Arc (Release v22.113.0):
ReadRegionsCannotBeSuspendedis obsolete; Arc no longer throws it (#3242) - Chronicle (Release v19.57.0): The
sequenceline in a capture’ssource eventsblock. Stored declarations that still contain it keep working and log a deprecation warning; remove the line and rely on thefromevents’ origin (#4700)