There is a reason it is called vibe coding and not vibe architecting or vibe systems design. I have had better results when I come up with the overall architecture first. Then I'll vibe code to stub out classes and methods, and then vibe code the tests, then vibe code to fill in those stubs, making sure the tests pass. You have to handhold the AI like you would an intern or junior dev.