Hi Neil,
Thank you for the sharp critique — these are important points worth addressing.
On “horribly designed systems”: I agree. The prevalence of temporal collision bugs in production systems (documented across all four brokers) is itself evidence that the bus decoupling pattern is widely misapplied. Our paper explicitly calls this out: the fix is not better idempotency guards but better system design where the consumer’s processing is within the transaction boundary.
On “you must verify every service”: Correct, and our models do exactly this. The TLA+ specifications model the full protocol — not just the broker, but the consumer’s store-before-commit path as well. The invariant execCount ≤ 1spans both the consumer and broker state machines. That said, our models necessarily abstract away everything outside this protocol boundary, which is a deliberate scope choice, not a claim of completeness.
On “the protocol is the same, only variable names change”: This is the strongest critique and fair. What I should have said more precisely: the protocol pattern — process → store → crash-before-commit → redeliver → duplicate execution — is structurally identical across brokers because it follows from the at-least-once delivery contract itself, not from any broker-specific implementation detail. The variable names change (offset vs. seqno vs. deliveryTag), but the state machine shape (Ready → Processing → Stored → Crashed → Redelivered) and the crash window between Store and Commit are the same. Whether this constitutes an “invariant” in the TLA+ sense is debatable — it’s more accurately a structural property of the protocol class. Our paper formalizes each broker independently and then observes the structural isomorphism, rather than assuming it a priori.
On TLA+ for thinking vs. verification: I think you and Lamport would agree that our approach aligns with his intent — we use TLA+ to first prove the collision exists structurally (via exhaustive state-space exploration), then cross-validate with physical fault injection. The 16 templates are not “verified implementations”; they are formal arguments that a specific property holds (or fails to hold) under all possible interleavings. The chaos experiments then confirm the model’s predictions match physical reality. This two-layer approach — deductive proof plus empirical confirmation — is closer to how formal methods should be applied in practice.