Domain Events Name the Real World
Persistence verbs are not business facts
Domain events name what happened in the real world; CRUD names how storage changed. Conflating them forces interpretation — by people, automations, and models — that the log should not require.
The permanent record should answer what occurred — not which row changed. When event type strings copy ORM and REST lifecycles (Created, Updated, Deleted), consumers must infer business meaning from payload diffs, side channels, or tribal knowledge. That interpretive tax falls on audit, operations, automation, and any agent reading the stream cold.
The event log is append-only — domain events are committed, not updated or deleted in place. CRUD belongs elsewhere: at projection storage — read models and current-state tables maintained by projection adapters. Those adapters insert, update, and remove rows because they hold derived, lossy state, not substrate.
The failure is naming tier-one events after persistence operations — whether copied from projection schemas or ORM lifecycles — so that storage shape becomes truth shape: collapsing distinct processes into one generic insert, smuggling update-as-truth without supersession, and hiding capture mode behind verbs that describe neither the act nor how evidence entered.
The disciplined alternative: real-world verbs in event names (CustomerOnboarded, AddressCorrected, CustomerRelocated); CRUD reserved for projection storage adapters and explicitly labelled projections. Where epistemic kind matters, pair domain type with captureForce per the tier-one capture mode principle and Four Capture Modes. Full treatment: Domain Events Are Not CRUD. Anti-pattern: CRUD as domain language.