Нет, не про data races. Именно про race conditions.
Например, достаточно сильное условие: при любом распределении квантов времени между потоками поведение программы детерминировано и не меняется. Это достаточное, но не необходимое условие, его можно ослаблять.
Нет, это Спарта! просто требует формализации, только и всего. Алгебраические эффекты — впролне рабочий вариант. Мы просто разделяем разные походы в IO и на связанных эффектах вводим какое-то отношение зависимости. Это просто не сделано ни в одном из сколь-нибудь распространённых языков, но можно в принципе.