@sph regarding unit tests: I think it must be clear that unit tests (case tests) are *amazing* tool for just one purpose: testing for regressions. You can't test for regressions before they happen.

You can test for some edge cases, but thinking a bit harder may lead to a realisation that these edge cases are unified into some invariant, so then we can start using property testing and model checking to test invariants, including #e2e.

I think that without dialyzer refactoring #elixir codebases is hell (to an extent where I think that it shouldn't be done!), whereas with dialyzer it's just pain sprinkled with suffering.

Regarding dialyzer's ergonomics, I'm not sure what's the problem to be honest. Yeah, I look up how to read the errors and have to manually untangle the error reports every time I get a non-trivial amounts of errors, but I think that the biggest problem of dialyzer is false negatives due to limitations.

BTW, state of the art report on dia- and #gradualizer: https://piped.kavin.rocks/watch?v=0Oo8ZBAsKVs

Piped

An alternative privacy-friendly YouTube frontend which is efficient by design.