What I've found works best is to hand-code the first feature, rendering the codebase itself effectively a self-documenting entity. Then you can vibe code the rest.
All future features will have enough patterns defined from the first one (schema, folder structure, modules, views, components, etc), that very few explicit vibe coding rules need to be defined.