# Архитектурные границы Это целевое разделение; modules ещё предстоит реализовать после выбора стека. ```text UI components / routes ↓ commands ↑ view models Application use cases / lifecycle ↓ ports Domain models / pure policies ↕ adapters IndexedDB / XMPP WSS / crypto worker / media worker / browser APIs ↕ External XMPP + upload + TURN + maps + push gateway ``` ## Каталоги реализации - `src/domain/`: модели и pure policies без UI/network. - `src/application/`: use cases, event reducers, account-bound operation context. - `src/ports/`: интерфейсы, errors, capability contracts. - `src/adapters/`: xmpp, storage, crypto, media, notifications. - `src/ui/`: tokens, primitive components, feature views, routes. - `src/workers/`: crypto/media off-main work. - `src/platform/`: browser lifecycle, permission, multi-tab coordination. - `services/push/`: минимальный Web Push gateway; не messaging backend и не OMEMO endpoint. - `infra/`: local fixtures/server/HTTPS/WSS/turn and deployment configuration. - `tests/`: unit, contract, integration, browser, interoperability, security, tooling. Расширения файлов/commands определяет accepted stack ADR. В карточках scope без расширения обозначает logical module stem: после ADR создаётся файл с принятым расширением, не файл без расширения. ## Направления зависимостей Domain не импортирует adapters/UI. UI вызывает application commands, не Signal/session/network internals. Adapters реализуют ports. Event содержит accountId, conversationId/eventId и generation/cancellation context; поздний результат старого аккаунта отбрасывается. Durable history mutations и checkpoint — одна transaction boundary. Внешняя доставка и локальная запись не образуют общей distributed transaction: retries должны учитывать факт возможной успешной отправки. Gateway хранит только необходимые push subscription/registration metadata; encrypted message plaintext ему недоступен. CORS не обходится скрытым decrypting proxy. ## Governance Любое изменение shared contract требует ADR/contract update и focused contract tests. До этого downstream owner не угадывает поля интерфейса. Интерфейсы сначала фиксируются в S01, затем implementers добавляют concrete code.