- Organize by bounded context: each context has its own `domain/`, `application/`, `infrastructure/` directories.
- Use rich domain models with methods — not anemic data classes with logic in separate service files.
- Use `@dataclass(frozen=True)` for Value Objects and entity classes with `__eq__` based on ID — keep domain logic in entity methods.
- Use dataclasses or Pydantic with validators for value objects (Email, Money, Address).
- Define aggregate roots that enforce business invariants. Access child entities only through the aggregate.
- Use domain events for cross-context communication. Publish events, don't call other contexts directly.
- Use repository pattern with `Protocol` interfaces for persistence abstraction.