CRDT text editor
Starling
A collaborative text editor built on a sequence CRDT, so two peers editing the same region converge without a server deciding who wins. Operations carry a Lamport timestamp and a site id, and tombstones are compacted only once every peer has acknowledged the causal frontier. The harness replays randomly partitioned and reordered operation logs across simulated peers and asserts that all of them land on the same document.

Why no server
Operational transformation needs a central authority to linearise concurrent edits, which means the correctness of the editor is the correctness of a service you have to keep running. A sequence CRDT moves that guarantee into the data structure, so convergence is a property of the operations rather than of the network path they took.
The cost is metadata. Every character carries an identifier that has to be globally unique and totally ordered, and deletions leave tombstones that cannot be dropped until you can prove nobody will ever refer to them again.
Compaction
Peers exchange version vectors alongside operations. Once every known peer has acknowledged a position in the causal history, everything tombstoned before that point can be physically removed, because no future operation can legally reference it.
This is the part that breaks quietly. A peer that goes away without saying so pins the frontier forever, and the document grows without bound. Starling times peers out of the acknowledgement set and records that it did, so a returning peer is told to resynchronise from scratch instead of applying operations against a history that no longer exists.
The harness
The test generates a set of peers, a random edit script per peer, and a random partition schedule that decides which messages are delivered, in which order, and which are held back and delivered late. It then runs to quiescence and asserts every peer holds byte-identical text.
Reordering alone finds shallow bugs. The interesting failures need a partition that heals in the middle of a compaction round, which is why the schedule generator is allowed to overlap those two events on purpose.