Skip to content

Reference

  • Commands (intent)
  • Procedures (pure business logic)
  • Events (immutable facts)
  • Policies (reconciliation logic)
  • Queries (read operations)
  • Mutations (write operations)

Events

  • Must described in past-tense
  • Must be Immutable
  • Should be self contained (all data required for representing some model state is contained in events)
  • Ordered

Commands

  • Represent an intention or request to perform an action
  • MUST be serializable (JSON, YAML, etc.)
  • MUST be immutable
  • Named in imperative form (e.g., ScanPartition, InspectStorage)
  • MUST NOT contain business logic or behavior
  • Self-contained with all required data for execution

Procedures

  • Consume Commands
  • CAN emit Events
  • CAN query state (read-only)
  • MUST NOT mutate state
  • Have signature: (context: ProcedureContext, command: Command) -> None
  • Stateless (all state via context or command)
  • Contain business logic for processing commands

Policies

  • Consume Events
  • CAN emit Commands
  • CAN query state (read-only)
  • CAN mutate state (via mutations)
  • Have signature: (context: PolicyContext, event: Event) -> None
  • Stateless (all state via context or event)
  • Contain business logic for reacting to events

Models

Queriers

  • Perform read-only operations
  • MUST NOT mutate state
  • MUST NOT emit events or commands
  • Have signature: (input: QueryInput) -> QueryResult
  • Deterministic when possible
  • CAN access external systems (databases, filesystems, APIs)
  • Return serializable data structures

Mutators

  • Perform write operations
  • CAN mutate state (event store, databases, filesystems, etc.)
  • MUST NOT emit events or commands directly
  • Have signature: (input: MutationInput) -> MutationResult
  • Idempotent when possible
  • CAN have side effects
  • Return confirmation or status of the mutation