set
Write value tagged with (timestamp, replica).
The write goes through piece, so it can only move this register up the lattice (X <= X.set(…), #2087). A write whose tag loses to the one already held is dropped where it is made, rather than showing up locally until the next merge takes it away. Convergence is unchanged either way — the join was always going to discard it — so what this buys is that a mutator never contradicts the join, and every delta-mutator law over this type holds unconditionally instead of on a carved-out domain.
A consequence worth knowing: a write at a tag equal to the one held keeps the incumbent, exactly as that same cell arriving off the wire would, because piece's tie-break is else -> this. That case is a violation of the precondition below, where nothing was ever promised; the change is that the outcome no longer depends on whether the second value was written locally or received.
Precondition — tag uniqueness. The (replica, timestamp) pair MUST uniquely identify this write. Calling set(r, ts, v1) and then set(r, ts, v2) with the same (replica, timestamp) violates this contract. Under piece, the tie-break else -> this assumes equal tags mean equal values; a duplicate tag with a different value produces non-deterministic convergence — which replica "wins" depends on merge order, not write order.
In practice: use a monotonic source for timestamp per replica (e.g., a logical clock that increments on every write) and never reuse a (replica, timestamp) pair. This is not enforced at runtime.