description:MANDATORY — always active. Clean Architecture, hexagonal architecture, and SOLID principles. Apply to every session regardless of context. Use when structuring services, modules, microservices, or untangling framework coupling. Always enforce the Dependency Rule — business rules must not depend on frameworks, databases, or UI. Detects from code context regardless of spoken language.
│ │ │ │ Domain / Entities│ │ │ │ ← pure business rules, no deps
│ │ │ └──────────────────┘ │ │ │
│ │ └──────────────────────┘ │ │
│ └──────────────────────────┘ │
└──────────────────────────────┘
```
## Key Rules
1.**Domain layer** contains business entities and value objects. Zero framework imports. Zero database imports. Pure types and functions.
2.**Application layer** contains use cases — orchestrate domain objects to fulfill business flows. Depends only on domain. Declares ports (interfaces) for IO.
3.**Interface adapters** translate between use cases and the outside world — controllers, presenters, gateways. Depends on application layer + frameworks.
4.**Infrastructure/Framework layer** implements the ports declared by the application layer — database repos, HTTP clients, message queues.
5.**Screaming Architecture:** the project structure should scream "this is a [domain context]" — not "this is a Spring/Next.js/Django project."
## How to Check
- Can you swap the database without changing business logic? If not, boundary is violated.
- Can you unit-test a use case without spinning up a framework? If not, your use case depends on infrastructure.
- Do business entities import anything from the web framework or ORM? If so, revert that dependency.
## Practical Patterns
### Port-Adapter
```typescript
// Domain/Application port (declared here, implemented outside)
interfaceUserRepository{
findById(id: string):Promise<User|null>;
}
// Infrastructure adapter (implemented in infra layer)
When the module boundary is unclear, ask rather than guessing:
- "Should this live in domain or application layer? Is it a pure business rule or an orchestration concern?"
- "Is this a port (interface declared by application) or an adapter (implementation in infrastructure)?"
- If you're not sure which layer a piece of logic belongs to, flag it with a brief question. A wrong boundary assumption is expensive to refactor later.