Right, I should have said "race conditions"; it hadn't occurred to me that the two weren't synonymous. My point wasn't that Pony does prevent race conditions, but rather that non-data-race race conditions are much more common in my domain (distributed computing) or really any domain where multiprocess architectures are common so I don't benefit much from the static guarantees that Rust affords.
I typically think of a race condition an issue with concurrency where data might be modified by another thread which causes the program to return incorrect results.
That is helpful. I was thinking that a race condition would only include a data race, but this blog defined it broader, so that it would include deadlock.
A race condition happens when data/state is mutated because of the order in which concurrent processes occur. This could happen with threads, message passing, or many other ways.
I think this is distinct from deadlock which occurs when there is at least one circular dependency in the order when different "processes" must perform their operations.
In fairness to the OP, the link they cited defined "data race" explicitly and narrowly as race conditions on memory which I think makes all of your bullets out of scope, but also neuters the original claim pretty considerably.
The borrow checker (in safe rust) always[0] prevents data races. It can't, however, prevent race conditions (but neither can pony do[1])
[0] https://doc.rust-lang.org/nomicon/races.html
[1] https://www.ponylang.io/faq/#data-race