Skip to content

Glossary

Event sourcing comes with its own vocabulary, and the Cratis stack adds a few terms of its own. This page gives a short definition of each term across the stack, so the same word means the same thing on every page. Where a term has a fuller explanation, the name links to it. The products keep their own, more detailed glossaries: Chronicle, Arc, and Screenplay.

These are the core ideas behind Chronicle. The Concepts section explains how they fit together.

TermDefinition
EventA fact — something that happened, named in the past tense (AccountOpened). Immutable and single-purpose. By convention an event has no nullable properties (Chronicle’s analyzers warn about them); an optional value usually means you need a second event.
Event typeThe schema and identity of an event — its shape and name.
Event sourceThe thing an event happened to, identified by an id (an account, a book).
Event source definitionA declared kind of event source (an account) with its named event streams and the dimensions that guard appends to each. The typed way to say where events go.
Event streamA named part of an event source’s history, such as an account’s monthly transactions. Identified by a stream type and a stream id.
Event sequenceAn ordered, append-only stream of events you can subscribe to. The event log is the primary one — your source of truth.
Sequence numberAn event’s position within a sequence.
Event storeThe database that holds event sequences.
Event sourcingStoring state as the full history of events, deriving current state by replaying them. See when to use it.
NamespaceA partition of an event store, used for multi-tenancy.
TenantAn isolated set of data for one customer — see namespaces.
IdentityWho or what caused an event.
CorrelationLinks events that belong to the same logical operation.
CausationThe chain of steps that led to an event, such as the root process and the command that appended it. With Arc, the command’s name and property values are recorded in the chain, permanently.
TagsLabels on events for filtering and correlation — see also event metadata tags.
AggregateA consistency boundary that encapsulates behavior and produces events.
ConstraintA rule, such as uniqueness, that Chronicle checks when an event is appended and rejects the append if it fails.
Dynamic consistency boundaryEnforcing a rule that depends on current state under concurrency, by checking the state the decision was based on when the events are appended. Chronicle supports DCB-style decision models and append conditions; each event belongs to one event source. See keeping decisions correct.
Concurrency scopeThe condition on one append: a position in the event log and a filter (event types, event source, stream). The kernel rejects the append if a matching event was written after the position. See concurrency.
Append conditionWhat Chronicle checks together with an append: one or more concurrency scopes. Also called a guard when it comes from a read. See how guards are derived.
Decision readA read of a read model that notes the log position before it folds, so the state you decide on becomes an append condition.
Read protectionRefusing reads that cannot guard a decision. In Chronicle it is the API that enforces this inside one unit of work. In Arc it is a mode, Off, Measure or On, that turns the API on for your commands. See keeping decisions correct.
Protected readA read under read protection On that is read fresh and guarded, such as a read-model parameter on a command.
Advisory readA read that is allowed but guards nothing, because a stale value is acceptable. In Arc it is marked [Unprotected("why")].
MeasureThe Arc read protection mode between Off and On. Nothing changes for callers, and Arc records what On would do, so you can fix refused reads before turning it on.
Per-stream read modelA read model declared with [EventStream<TSource>(stream)] that folds one stream of an event source, such as one account’s withdrawals in one month.
Stream decisionA command reads the raw events of one stream through IStreamReads and returns StreamDecision.Append(...), which guards that stream at the tail it read.
SubjectThe person or entity whose personal data an event contains. PII is encrypted under a key per subject, which defaults to the event source id.
PIIPersonal data marked with [PII], encrypted at append time so it can be erased by deleting the subject’s key. See event sourcing and GDPR.

How events become the things you read and the actions you take.

TermDefinition
ObserverAnything that watches events and acts — a projection, reducer, or reactor.
ProjectionBuilds a read model by mapping events declaratively.
ReducerBuilds a read model by folding events imperatively.
ReactorProduces side effects (notifications, calls to other systems) in response to events. An event can be delivered to a reactor more than once, so side effects should be safe to repeat.
ReplayRunning an observer over events it has already processed, for example to rebuild a read model. Replay re-delivers events to reactors unless the handler is marked [OnceOnly].
Read modelA queryable view shaped for one screen or question, built from events.
ChangesetThe set of changes an observer applies for a single event.
Eventual consistencyA read model that catches up shortly after an event is appended — the default.
Immediate consistencyA read model updated synchronously, before the append returns — for reads you must get right now.

The terms Arc and Components add on top of Chronicle.

TermDefinition
CommandAn intent to change state — a record with a Handle() method. With Arc and Chronicle, events returned from Handle() are appended; a command can also return a response or nothing.
QueryA read of data, exposed to the frontend as a typed proxy.
Observable queryA query that holds a live connection and pushes new results when the data changes.
CQRSCommand Query Responsibility Segregation — separating the write side (commands) from the read side (queries). See it in C#, TypeScript, and Kotlin and Java.
Proxy generationArc emitting a typed TypeScript client from your C# commands and queries at build time.
ConceptA strongly-typed wrapper around a primitive (AccountId over Guid) so the compiler catches mix-ups.
Agentic developmentLetting AI coding agents design, change and operate a system whose state is an event log and whose behavior is checked by executable specifications.
Vertical sliceEverything for one behavior — command, events, projection, UI, specs — kept together in one folder.
Event modelingDesigning a system as one timeline of screens, commands, events and read models before writing code.
Spec-driven developmentWriting the event model and its Given/When/Then specifications first, then checking code, written by people or agents, against them.

New to all this? Start with Why developers choose Cratis, then the Chronicle tutorial.