Assuming that it is possible to end up with a š§ pid, I think one solution would be to send a message when the conflict resolution kills a process:
SyncRegister(n) ==
...
/\ inbox' = [o \in Nodes |->
(IF (o = n) THEN
Tail(inbox[o])
ELSE
IF keep_remote THEN
Append(inbox[o], [action |-> "killed", name |-> message.name, time |-> locally_registered[n][n][message.name], from |-> n])
ELSE
inbox[o])
]
and then remove any exact matches, i.e. registered with the same name, at the same time:
Killed(n) ==
/\ Len(inbox[n]) > 0
/\ Head(inbox[n]).action = "killed"
/\ LET message == Head(inbox[n])
exact_match == message.name \in DOMAIN locally_registered[n][message.from] /\ locally_registered[n][message.from][message.name] = message.time
l == (IF exact_match THEN
[r \in (DOMAIN locally_registered[n][message.from] \ {message.name}) |-> locally_registered[n][message.from][r]]
ELSE
locally_registered[n][message.from])
IN inbox' = [inbox EXCEPT![n] = Tail(inbox[n])]
/\ locally_registered' = [locally_registered EXCEPT![n] = ([locally_registered[n] EXCEPT![message.from] = l])]
with this fix, I could run the model significantly longer without failure (but sadly ran out of memory on my laptop: I’m not sure I’m interested enough to pay AWS for the answer).