Philosophy

Process Philosophy and Event-Driven Systems

Why events are not just a pattern — they are an ontological commitment

Learning Objectives

By the end of this module you will be able to:

  • Explain Whitehead's actual occasions and concrescence and map these concepts to domain events and their persistence in an event log.
  • Apply the fallacy of misplaced concreteness to diagnose when an architectural design has solidified a process into a thing prematurely.
  • Articulate why event sourcing is not merely a technical pattern but an ontological commitment to treating the past as immutable and primary.
  • Compare the substance view (state is primary, events are transitions) with the process view (events are primary, state is a snapshot) and identify the architectural trade-offs each view produces.

Core Concepts

Module 03 established domain entities as stable identities — aggregates with boundaries, invariants, and a lifecycle. That framing rests on a substance ontology: things exist, they have properties, and events are what happen to them. This module introduces the complementary and sometimes competing lens: process ontology, in which events are the primary category of reality, and what we call "things" are patterns of relative stability within an ongoing flow of becoming.

The central figure here is Alfred North Whitehead, the British mathematician and philosopher who built the most systematic event-based metaphysics of the twentieth century. His work — particularly Process and Reality — has attracted renewed attention from computational thinkers because its architecture maps surprisingly well onto how distributed systems actually behave.

Actual Occasions: Events All the Way Down

Whitehead identifies actual occasions as the fundamental units of reality, replacing substance-based ontology with an event-based metaphysics. There are no enduring material substances underneath reality. Instead, reality is fundamentally composed of momentary, discrete events of experience — "actual occasions" or "actual entities." Every concrete thing — from an electron to a business aggregate — is ultimately a composite of these discrete occasions organized into structured societies.

This is a radical claim: chairs, customers, and orders are not enduring substances that persist through time. They are patterned sequences of events that create the appearance of persistence. The continuity you observe is constructed, not given.

Whitehead on continuity

Whitehead explicitly rejects "continuity of becoming" in favor of "becoming of continuity." Each actual occasion is discrete, atomistic, and self-contained; continuity is what successive occasions construct together, not a pre-existing substrate they inhabit.

Concrescence: How an Event Becomes Definite

An actual occasion does not spring into existence fully formed. It undergoes concrescence — literally "growing together." Concrescence is the internal process by which an actual occasion grows from a multiplicity of prehensions (data) into a finalized, determinate unity of experience. It progresses from indeterminacy to determinacy, concluding in the occasion's satisfaction — the moment it becomes fully real.

Think of a command arriving at an aggregate. Before processing, the outcome is open. During processing, the aggregate integrates its current state, the command data, and invariant checks. At the moment a domain event is published, the occasion reaches its satisfaction: a determinate outcome has been produced.

Prehension: How the Past Flows into the Present

How does one event inherit from the past? Through prehension. Prehension is a fundamental experiential relation in Whitehead's metaphysics by which an actual occasion grasps or "prehends" prior occasions — the basic mechanism through which a new event incorporates influences from its past. In process philosophy, causality and inheritance are not external forces acting on a substance. They are internal to each event's becoming.

In event sourcing terms: when an aggregate reconstructs its state by replaying the event log, each event is being prehended. The current state is not fetched from a database row — it is produced by a process of integration across prior occasions.

The Many-One Principle: Composition as Becoming

Whitehead's fundamental principle of becoming is expressed as: "the many become one and are increased by one." Many prior actual occasions (the disjunctive universe) are prehended and integrated into a single new actual occasion, which then becomes an element available for future unification. Multiplicity is unified through prehension, and the result is not a merged thing but a new event — one that in turn becomes data for subsequent events.

This has a direct structural parallel in how event sourcing builds aggregate state: fold many past events into one current snapshot, which then participates in future command processing.

Fig 1
OrderPlaced ItemAdded ItemAdded concrescence (fold / reduce) Current State (satisfaction)
Whitehead's many-one principle mapped to event fold

Objective Immortality: The Immutability of the Past

Once an actual occasion achieves satisfaction, it becomes objectively immortal. Its influence persists indefinitely into the future as a datum for all subsequent occasions. Past occasions do not cease to be efficacious; they become objective data that constrain and inform the becoming of future occasions.

This is the philosophical ground of event immutability. An event that has happened cannot be changed — not as a technical constraint, but as an ontological fact. Event sourcing makes this explicit: "Immutability describes the practice and policy of not updating or changing events after they have been persisted." The event log is not a storage optimization. It is an acknowledgment that the past is objectively real and cannot be revised.

Eternal Objects: The Schema of Possibility

Alongside actual occasions, Whitehead posits eternal objectspure potentials, nontemporal forms of definiteness that characterize the possible determinations of actual occasions. Mathematical forms, qualities, and predicates are eternal objects. They are not actual in themselves; they have no existence apart from their "ingression" into actual occasions — the process by which a potential becomes actualized.

In software terms, an event schema (the type OrderPlaced with its fields and constraints) is closer to an eternal object than to an actual occasion. The schema is pure potential: it defines what can happen. A specific OrderPlaced event in the log — with a concrete orderId, timestamp, and customer — is the actual occasion. Conflating schema with event is a subtle version of misplaced concreteness.

Internal Relations: Identity Through History

Whitehead's process metaphysics asserts that entities are constituted by internal relations rather than merely connected by external relations. Every actual occasion is internally related to every other actual occasion in its past — meaning that a relation partially constitutes its relata. An entity's identity is fundamentally dependent on what it is related to, which inverts the substance assumption that entities have determinate identity prior to and independent of their relations.

Applied to software: an aggregate's identity is not stored in a primary key. It is constituted by the sequence of events that produced it. Change the history, and you change the entity. This is why event sourcing purists resist retroactive schema migration on past events — not from technical conservatism, but from an implicit recognition that altering the history alters identity.

The Fallacy of Misplaced Concreteness

Whitehead's most practically useful diagnostic tool is the fallacy of misplaced concreteness: the error of treating an abstraction as if it were a concrete reality. In software architecture, computational abstractions — entities in DDD, service boundaries — constitute reifications that commit this fallacy.

The critical insight is that this fallacy is not always avoidable — and Whitehead acknowledged that abstractions are sometimes necessary for progress. The fallacy becomes problematic only when important aspects of experience are excluded from consideration. The architectural question is therefore not whether to reify — you must — but which dimensions of reality you are abstracting away, and whether that exclusion is locally justified.

Diagnostic question

When you model a domain entity as a mutable record with a current state, ask: what causal-temporal history am I discarding? Is that history important — does it have business value, audit requirements, debugging utility, or regulatory obligation? If yes, you may be committing misplaced concreteness.

Deleuze's Becoming: A Radicalization

Gilles Deleuze extended and radicalized the process view. Where Whitehead's actual occasions are discrete units that achieve satisfaction, Deleuze asserts that individuation precedes the individual — individuals are not fundamental but products of processes of individuation. Identity is relational and constituted through the relations an element enters into. Individuals are perpetually "becoming," not fixed entities with determinate boundaries.

Deleuze and Guattari's distinction between the virtual and the actual is also relevant: the virtual is a field of real but open-ended potential tendencies; the actual is a temporary, meta-stable actualization. Actualization is not the realization of a pre-existing possibility but the creation of novel differences. Service boundaries, in this framing, are not discovered structures but temporary stabilizations of relational dynamics — which is why they should be expected to shift as the system evolves.


Compare & Contrast

Substance View vs. Process View

The choice between a substance-first and a process-first architecture is not just philosophical preference. It produces different systems with different capabilities, costs, and failure modes.

DimensionSubstance ViewProcess View
Primary unitEntity / recordEvent / occurrence
StateFundamental — stored directlyDerived — projected from event log
HistoryDerivative — logs, audit tablesFundamental — the event store is the source of truth
MutationExpected — UPDATE in placeForbidden — append-only
IdentityPersists through state changesConstituted by the sequence of events
PastDiscardable once current state is knownObjectively immortal; cannot be altered
ConcurrencyRequires locking around shared mutable stateImmutability enables safe concurrent access without locks
Temporal queriesExpensive — requires audit tables or bitemporal schemaNatural — replay the log to any point
Schema migrationSimpler on write pathHarder — past events are immutable; requires event upcasting
Operational complexityLower initiallyHigher — projections, eventual consistency, read models
In a substance architecture, an order exists and has a status. In a process architecture, an order is the sequence of events that produced it — current status is just the most recent snapshot.

Domain Events vs. Event Sourcing

These are related but distinct commitments, and conflating them is a common source of overengineering:

Domain Events are a DDD tactical pattern. Domain events are important occurrences within a business domain that communicate state changes and coordinate behavior across multiple aggregates. They can be used without event sourcing — an aggregate changes its state and also publishes a domain event to notify other parts of the system. The aggregate still stores current state in a traditional database row.

Event Sourcing goes further. Application state is determined by a sequence of events rather than direct state modification. The aggregate has no mutable state column. State is always derived by replaying the event log. This is the full process-ontological commitment: the events are not notifications of state change, they are the state.

You can use domain events without event sourcing. You cannot use event sourcing without domain events.

CQRS: A Structural Consequence

CQRS (Command Query Responsibility Segregation) is the natural structural partner of event sourcing. Once you separate the write model (append events) from the read model (projected state), anemic read models are not anti-patterns — the pattern explicitly endorses separate models for different responsibilities. The read side returns flat, denormalized views optimized for queries. The write side enforces invariants and appends events. The two sides are synchronized asynchronously through projections.

Event-driven integration between bounded contexts follows the same logic: each context publishes domain events; subscribers project those events into their own read models. Contexts remain independently deployable, with no synchronous coupling.


Worked Example

Modeling an Order Lifecycle: Two Architectures

Consider a simple e-commerce order aggregate with the following business events:

  • Order placed (items, customer, shipping address)
  • Payment authorized
  • Item shipped
  • Order cancelled

Substance Architecture

CREATE TABLE orders (
  id UUID PRIMARY KEY,
  customer_id UUID,
  status VARCHAR(20),   -- 'placed', 'paid', 'shipped', 'cancelled'
  total DECIMAL,
  updated_at TIMESTAMP
);

When payment is authorized: UPDATE orders SET status = 'paid' WHERE id = ?. History is gone. If you need to know when payment was authorized, you need a separate audit log. If you need to replay what happened, you cannot. If a bug introduced a wrong status two weeks ago, you cannot reconstruct what actually occurred.

Process Architecture (Event Sourcing)

events table:
  id          | UUID
  stream_id   | UUID          -- the order's identity
  type        | VARCHAR       -- 'OrderPlaced', 'PaymentAuthorized', ...
  payload     | JSONB
  position    | BIGINT        -- position in the stream
  occurred_at | TIMESTAMP

Events appended:

pos=1  OrderPlaced       { customer_id, items, address, total }
pos=2  PaymentAuthorized { payment_ref, amount, authorized_at }
pos=3  ItemShipped       { tracking_number, carrier }

Current state is projected by folding events:

def apply(state, event):
    match event['type']:
        case 'OrderPlaced':
            return { 'status': 'placed', **event['payload'] }
        case 'PaymentAuthorized':
            return { **state, 'status': 'paid', 'payment_ref': event['payload']['payment_ref'] }
        case 'ItemShipped':
            return { **state, 'status': 'shipped', 'tracking': event['payload']['tracking_number'] }
        case 'OrderCancelled':
            return { **state, 'status': 'cancelled' }

current_state = reduce(apply, events, {})

What the process architecture gives you:

What it costs you:

  • Eventual consistency on read models — queries return slightly stale projections.
  • Event schema evolution is harder — you cannot change past events; you need upcasters or versioned event types.
  • Projection rebuilds after bugs are operationally complex.
  • CQRS adds infrastructure: separate read stores, projection workers.

Identifying Misplaced Concreteness in Practice

Suppose a team models customer loyalty tier as a mutable field: UPDATE customers SET tier = 'gold' WHERE id = ?. A product manager later asks: "How many customers crossed from Silver to Gold in Q3?" The team cannot answer without an audit table they never built.

The fallacy of misplaced concreteness was committed: the tier was modeled as a substance property (a value a customer has) rather than a process outcome (a tier earned through events). The reification excluded the causal-temporal history — which turned out to be important. The fix is either to add a tier_history table (bolting on history after the fact) or to model tier changes as domain events from the start.


Boundary Conditions

When Process Architecture Adds Unnecessary Complexity

Event sourcing and CQRS impose real costs. They are appropriate when:

  • The history of state changes has business value — audit, compliance, regulatory replay requirements.
  • Temporal queries are a first-class business need — "what did the system believe at time T?"
  • Multiple bounded contexts need to react to state changes asynchronously.
  • The domain is genuinely concurrent with complex invariants and high write contention.

They impose unnecessary overhead when:

  • The domain is simple CRUD — create, read, update, delete without meaningful history.
  • The team lacks the operational maturity to manage projections, event schema evolution, and eventual consistency.
  • Strong consistency is a hard requirement — event sourcing naturally produces eventual consistency, which may not be acceptable for financial transactions without careful design.
The complexity tax

Event sourcing is an architectural commitment, not a default. Misapplying it to simple domains is itself a form of misplaced concreteness: treating a philosophical insight about the primacy of events as a concrete implementation requirement for every system.

Whitehead's Discreteness vs. Continuous Domains

Whitehead's actual occasions are discrete. Continuity is constructed from discrete atomistic events, not given in advance. Digital systems are similarly discrete — they operate on ticks, transactions, commits. This makes event sourcing a natural fit.

However, some domains are genuinely continuous: sensor streams, financial time series at sub-millisecond resolution, physical simulations. At these scales, the overhead of modeling every data point as a named domain event becomes impractical. Temporal databases with valid-time semantics may be a better fit than event sourcing, capturing the process-ontological commitment (time is primary; facts have temporal extent) without the overhead of named events at every interval.

Deleuze's Becoming vs. Practical Boundaries

Deleuze's claim that boundaries are not pre-given but emergent effects of relational dynamics is conceptually useful for thinking about bounded context evolution. But taken too literally, it becomes an argument against ever drawing a boundary — which is not workable. The application of Deleuzian principles to concrete software architectural decisions lacks established methodological guidance. Use it as a reminder that boundaries should be revisited as the domain evolves, not as a reason to avoid drawing them.

Event-Driven Integration and Distributed Failure

Event-driven integration between bounded contexts enables loose coupling and independent evolution, but it introduces distributed systems failure modes: message ordering, idempotency, at-least-once vs. exactly-once delivery, consumer lag. Process philosophy's emphasis on the ordering of occasions translates directly into the engineering requirement for ordered event streams and careful idempotent consumers. The philosophical commitment to the primacy of temporal succession requires the infrastructure to actually preserve that succession reliably.

Key Takeaways

  1. Whitehead's actual occasions map directly to domain events. Events are not notifications of state change — in a process-ontological view, they are what reality is made of. State is a derived projection, not the ground truth.
  2. Concrescence and objective immortality ground event immutability. Each event undergoes a process of becoming (concrescence) and then achieves satisfaction — it becomes a fixed, objectively immortal datum for all future occasions. This is the philosophical basis for append-only event logs.
  3. The fallacy of misplaced concreteness is a diagnostic, not a prohibition. All architectural models commit it. The question is whether the excluded dimensions — causal history, temporal succession, relational constitution — are important in your domain. If they are, you have a design problem.
  4. Event sourcing is an ontological commitment, not just a pattern. Choosing event sourcing means committing to the process view: events are primary, state is derived. This affects schema design, operational requirements, team practices, and query capabilities in ways that cannot be undone cheaply.
  5. Substance and process views are not mutually exclusive — they are complementary lenses. Most systems need both: aggregates with stable identities (substance) and event logs that capture their history (process). The skill is knowing which lens should dominate in which part of the system, and being explicit about what each reification excludes.