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