## Checking commands After writing code, always run from `backend/`: ```shell ruff format ruff check --fix ty check ``` ## Imports Every service imports only what it needs to start. `make check` runs `scripts/check_imports.py`, which fails when a service loads a heavy package it is not allowed; `SERVICES` there is the contract, extend it on purpose. - Package `__init__` files don't re-export clients or SDKs. - An SDK used by one function is imported inside it. On an async path load it first with `await preload("")` from `utils.imports`, so the event loop never waits on the import. - Types used in Dishka provider signatures and `FromDishka[...]` stay real top-level imports. ## Dynamic config `config()` returns a copy of an in-process snapshot: no database round-trip per call, changes from any process show up within 5 s through a version number on the config record. Never `save()` a config you read; write through `DynamicConfig.update_config(section=...)` (Mongo) or `ConfigRepository.update(section=...)`/`save(...)` (Postgres), which bump the version atomically. Counters and other hot data don't belong in the config, give them their own collection or table with atomic increments.