Great writeup. My experience overlaps but with a different mitigation strategy.
I’m building an FBP (Flow-Based Programming) framework in Elixir — visual pipeline editor, distributed processing, 30+ node types. Using Claude Code daily.
The “AI can’t organize” and “OTP/async is ugly” problems hit me hard early on. My solution: don’t let AI make those decisions at all.
I built MCP servers that enforce architectural constraints at the tool level. AI can’t violate patterns because the tooling prevents it, not because I correct it afterward.
For the OTP blindspot — the FBP node abstraction hides it entirely. Node authors implement handle_message/2, the framework handles GenServers, supervision, message routing. AI doesn’t need to understand process lifecycles because it never touches them.
Basically: constrain the problem space until AI’s weaknesses don’t matter.
The defensive/imperative code issue persists though. Still correcting if/else chains that should be pattern matches.






















