How granular do you go with the interfaces? Full function signatures + types, or more like module-level contracts.

wondering what sort of artifacts beyond ADR/natural language prompts help steer LLMs to do the right thing