I generally have found that vert.x is a problem for LLMs writing code in a way that frameworks like Pekko are not.
This is because, in large part, that LLMs struggle with managing or expecting "spooky action at a distance" and there is one too many layers of abstraction in how that action at a distance works with Vert.x
You can see this exemplified in how the event bus works.
You pass an object onto an event bus with a string key. This becomes an untyped object over the wire before being reserialized on the other side.
So in order to know what is happening the LLM has to know all of this and follow the request to the locations where the string key is read, and then figure out what it is doing with types on both sides.
You can register types, but LLMs struggle to _remember to do this_.
Then there is the matter of blocking. Setting up critical sections in vert.x requires an extra step that LLMs seem to forget constantly.
In pekko you just have to enforce passing in a blocking dispatcher where this can happen and you are basically good to go. You can (almost) enforce this at compile time with a tool like archunit, and it is easy to catch otherwise, and it "just works."
I do think you need to use a typed actor framework to really do this properly with LLMs, but that's not a _bad_ thing.