tgStart ждёт старт QR до показа картинки (устранена гонка с 404). Вкладка Telegram опрашивает статус и обновляет QR по таймеру, не останавливаясь до авторизации. Статус: account берётся из живого статуса сервиса, connected = phase ready (авторизация), а не транспорт.
Сервис frontend: сборка SPA (Vite) и отдача через Caddy, /api → core:5080. В профиль observability добавлены Loki/Promtail/Grafana (в dev их не было). Dev-Caddyfile отдаёт SPA с Cache-Control no-cache, чтобы пересборка подхватывалась обновлением страницы.
CardsService (карточка/файл) и ContainersService бросают NotFoundException вместо возврата null; эндпоинты больше не проверяют null — 404 отдаёт общий обработчик. Тесты обновлены под новое поведение.
DealException/NotFoundException/Validation/Conflict/ServiceUnavailable с кодом ошибки, тексты в ErrorMessages.resx. Общий HTTP-обработчик (DealExceptionHandler) и маппинг в gRPC-интерцепторе: доменные ошибки → статус, прочие → обобщённый текст без стектрейса. Правила закреплены в код-стайле §10.
TenantContext, LocalTelegramGateway, DefaultPasswordHasher и
WTelegramSessionClient переведены на явные реализации; типы в тестах
приведены к ITenantContext.
Профиль observability: otel-collector (приём OTLP) -> tempo (трейсы),
cadvisor/node-exporter (ресурсы) в Prometheus, дашборды Deal-Traces и
Deal-Resources, datasource Tempo и связь логов с трейсами, алерты по
ресурсам; OTel-env у всех процессов.
Общая настройка DealTracingHosting (Deal.Grpc.Hosting + Deal.Api):
AspNetCore/Http/GrpcNetClient инструментация, OTLP-экспорт во внешний
коллектор, имя сервиса из env. Логи обогащаются TraceId/SpanId.
По код-стайлу §11 метод Create реализуется явно
(ISecretCipher ISecretCipherFactory.Create()), интерфейс вызывается
только по порту; тест фабрики типизирован интерфейсом.
TelegramIngressTestHost больше не мутирует процессную переменную
DEAL_SERVICE_TOKEN: токен задаётся in-memory конфигурацией хоста.
Три ingress-тест-класса шли параллельно и перетирали env друг другу.
Создание сервисов с порт-интерфейсом перенесено в IXxxFactory:
шифр секретов, хранилище лимитов, ИИ-классификатор, ИИ-инструменты,
файловое хранилище (Local/MinIO). Регистраторы и DiscoveryWorkerService
больше не создают реализации напрямую. Добавлен тест FileStorageFactory.
Хелпер Support/TestSettingsStore: словарь настроек, GetAsync/GetAllAsync/SetAsync/
RemoveAsync читают состояние на момент вызова (GetAllAsync — ленивый, ключ для
снапшот-сервисов). DI получает .Store, тесты сохраняют Preload/GetStoredJson.
concurrency group по ref + cancel-in-progress: свежий коммит в ветку МР
(или мерж в main) отменяет ещё не закончившийся предыдущий прогон.
Завершённые прогоны не затрагиваются.
push фильтрован по main (мерж МР триггерит прогон), pull_request —
opened/synchronize/reopened (новые коммиты в ветку МР перезапускают прогон).
Обычные коммиты в ветки без МР больше не запускают CI.
Ревью rust: перенос в вики не должен удалять из репозитория то, что нужно
агенту для работы (бэклог, статус, планы, код-стайл, спеки). Дублирование
вики и репы разрешено и обязательно: вики — актуальные версии для людей,
docs/ — зеркало для контекста агентов. README разведён по ролям.
Хелпер Support/TestTenantStore: реестр на списке с Create/UpdateStatus,
DI получает .Repository. Потребители (10 файлов), фейк удалён,
тесты 1340 зелёные.
Хелпер Support/TestFileStorage: словари объектов/типов + журнал удалений,
подставка читает состояние на момент вызова (позиция потока при Put — по
контракту порта). Потребители (9 файлов) перетипизированы на .Storage,
фейк удалён, тесты 1340 зелёные.
Хелпер Support/TestDiscoveryStore сгенерирован из фейка: состояние (tasks/
candidates/blacklist/log/monitored) сохранено, 29 методов порта читают состояние
на момент вызова, неожиданных методов нет. Потребители (8 файлов) перетипизированы
на .Store, фейк удалён, тесты 1340 зелёные.
Хелпер Support/TestTelegramStore: словари каталога/превью + NSubstitute-подставка,
все методы порта читают состояние на момент вызова (семантика sync/upsert/
мониторов/бэкфилла сохранена). Потребители (5 файлов) перетипизированы на
.Store, фейк удалён, тесты 1340 зелёные.