- Every layer must provide significant/mearusable value
- Every layer should for every method provide auto-implementing defaults off of the lower layer or should add significant logic to that method, or should be a completely new method built from business logic functions and lower layer functions
- Every layer must have any dependencies (if any) passed in or injected
- Every layer should try as much as possible to assemble logic from dependency free/fully indpendent business modules rather than including business logic in layers
- Every component in a layer should be as small as possible favoring co-services to additional layers
- You write the same code over and over
- You have layers where you repeatedly write a layer calling the lower layer with no addtional logic (and thus value) added