# Architecture ## Layer hierarchy ``` Application layer (depends on Domain + Primitives) ├── gridflow-python-mediator ├── python-cqrs-dispatcher (depends on cqrs-core + mediator) ├── fastapi-config-patterns ├── fastapi-middleware-toolkit ├── python-structlog-config ├── python-outbox-core ├── sqlalchemy-async-session-factory └── sqlalchemy-async-repositories Domain layer (depends on Primitives only) ├── python-app-exceptions ├── python-infrastructure-exceptions ├── python-input-validation ├── python-cqrs-core ├── python-domain-events ├── python-dto-mappers └── pydantic-response-models Primitives layer (zero dependencies) └── python-technical-primitives ``` ## Import-linter contracts Layer boundaries are enforced via `import-linter` in `pyproject.toml`: - **Primitives** cannot import from domain or application - **Domain** can import from primitives, cannot import from application - **Application** can import from domain and primitives ## Inter-package dependencies Only one cross-package dependency exists: ``` python-cqrs-dispatcher ├── python-cqrs-core (ICommand, IQuery interfaces) └── gridflow-python-mediator (Mediator dispatch engine) ``` All other packages are fully independent. ## Design patterns used | Pattern | Package | |---------|---------| | Specification | `python-technical-primitives` | | Repository + Strategy | `sqlalchemy-async-repositories` | | Factory Method | `sqlalchemy-async-repositories` (pagination) | | Mediator | `gridflow-python-mediator` | | CQRS | `python-cqrs-core`, `python-cqrs-dispatcher` | | Pipeline behaviors | `gridflow-python-mediator` | | Transactional outbox | `python-outbox-core` | | Strategy (formatters) | `python-outbox-core` | | CloudEvents | `python-outbox-core` |