Reactions and the partition: opt-in eventual consistency in actor-native systems
Description
This paper is an analytic theory contribution in the sense of Gregor's (2006) theory for analyzing (Type I): it identifies a design construct, derives the principles under which it is exercised, and presents an instantiation in production as an existence proof of realizability — not the design-science evaluation of an artifact (Hevner, March, Park, & Ram, 2004), which a companion case-study paper is the venue for. The construct is the developer's pragmatic partition of an event's implied work into a now branch (what the verb's contract promises before responding) and a deferred branch with a placement. The CQRS literature treats eventual consistency as the architecture's defining commitment; this paper argues that for actor-native systems the contract is upside-down — eventual consistency is the shadow of the partition, not the design choice. The partition is exercised through Reactions: not async events under another name, but rules that match a trajectory through the actor's journal, statically compiled against the domain libraries, with typed identifiers propagated across stages. Reactions serve a double purpose — pragmatic deferral and categorical segregation of operational concerns from domain methods, the segregation structurally enforced — and both purposes share one guardian, friction. Three consequences follow when friction is low: a domain library that closes (the primary one), fast verbs, and opt-in eventual consistency. Code references throughout point to the public Puppeteer codebase, whose Reaction primitive instantiates the construct concretely.
Series information (English)
Part of the Puppeteer Papers — a seven-paper series of Gregor (2006) Type I "theory for analyzing" design papers on journaled-program substrates. This is Paper 3. It builds on Paper 1 (anti-porosity) and Paper 2 (program–value separability), and is a self-deposited preprint that has not undergone peer review.
Technical info (English)
Source-code references resolve against commit 6a529c4 of https://github.com/alvaroNCubo/puppeteer (2026-06-21), archived in Software Heritage at:
swh:1:dir:463f291ec5e4fa8abef24dc1fe3e46e5a5975739
;origin=https://github.com/alvaroNCubo/puppeteer
;anchor=swh:1:rev:6a529c45367ca2c32a891a067efb5be3fed589ec
Empirical data: the paper03-data.zip file in this deposit contains the raw outputs of the measurements reported in §5.2, §6.1, §6.9 and §3.6 — the BenchmarkDotNet verb-latency report (bdn-6a529c4/: -report.csv/.md/.html plus the run log), the Cue end-to-end latency and exactly-once probe (cue-6a529c4.txt), and the catch-up / no-re-fire probe (catchup-6a529c4.txt) — together with the harness source (lab03-reactions-src/) and a headline.md summary. The harness code (BenchmarkDotNet- and Stopwatch-based) that produced these outputs lives in the labs/lab03-reactions/ directory of the Puppeteer Papers repository (https://github.com/alvaroNCubo/puppeteer-papers) and builds against the Puppeteer runtime at the same commit (6a529c4). Running the harnesses against 6a529c4 reproduces the figures (modulo run-to-run variance on the timing measurements — verb overhead ~0.3–0.4 µs and Cue latency ~1.3 ms, both near BenchmarkDotNet's resolution floor; the exactly-once-per-match and no-re-fire counts are deterministic).
Files
03-reactions-and-partition.md
Additional details
Related works
- Is supplemented by
- Software: https://github.com/alvaroNCubo/puppeteer-papers (URL)
- References
- Preprint: 10.5281/zenodo.20404863 (DOI)
- Preprint: 10.5281/zenodo.20740697 (DOI)
- Software: https://github.com/alvaroNCubo/puppeteer/tree/6a529c4 (URL)