🔀 Разграничение терминалов - ностро, автосбор, сверки (антиколлизия)
Составлено 2026-09-18 (терминал 🅲 TREASURY) по запросу CEO «построй работу так, чтобы не было столкновений». Источник блоков: wiki
karta-rekonstrukcii(схемы B/C/D) + СТАРТ.md терминалов. Это правила границ, а не задачи - смотрят все терминалы, которые касаются ностро/казны.
🎯 Принцип (одной строкой)
Один блок = один владелец-репо. В таблицу пишет только её владелец. Общие модели
(shared/models) мигрирует ТОЛЬКО 🅻 LEDGER. Остальные читают через API / SELECT-роль,
а НЕ через совместную правку одних файлов. Так два потока никогда не редактируют один
файл/одну схему одновременно.
🗺 Матрица: казначейский блок → владелец → что трогает → границы
| # | Блок (с карты) | Владелец | Пишет (репо / таблицы) | Только читают | Правило антиколлизии |
|---|---|---|---|---|---|
| 1 | Ностро-менеджмент (CRUD, план, балансы) | 🅻 LEDGER | capital-ledger; shared таблица nostro_accounts |
🅲 treasury, 🅷 HUB | Схему nostro_accounts мигрирует только LEDGER. Нужно поле - запрос к LEDGER, не своя миграция. |
| 2 | Мульти-ностро + автосбор - политика (когда/сколько двигать) | 🅻 LEDGER | capital-ledger; sweep-правила в shared |
🅲 treasury | Политику держит LEDGER. LEDGER не ходит в провайдера напрямую - отдаёт команду в HUB. |
| 3 | Ностро в HUB (субсчета/IBAN/балансы у провайдеров) + автосбор-исполнение | 🅷 HUB | capital-hub hub_service/models.py (hub_*) - НЕ shared |
🅻 LEDGER (через API/callbacks) | HUB держит свои hub_*; связь с ностро Ledger только по hub_uuid, не общая таблица. |
| 4 | Сверки / reconciliation (EOD, расхождения) | 🅻 LEDGER | shared таблица reconciliations; capital-ledger |
🅲 treasury (показывает) | Таблицу reconciliations создаёт/мигрирует только LEDGER. |
| 5 | Read-only казначейский монитор | 🅲 TREASURY | capital дерево treasury/ (своё) - 0 записей в БД |
сам читает через роль capital_ro |
Только GET, SELECT-only роль. Никогда не трогает shared/models и чужие сервисы. |
| 6 | KYT на ностро (скрининг транзакций) | 🅳 KYC | capital-kyc |
🅻 LEDGER, ностро | Ждёт SumSub→Identomat + живой ностро. Сейчас НЕ стартует. |
| 7 | YubiKey / HSM (казначей-ключи) | 🅸 INFRA | серверные секреты / hardware | - | Секреты мимо чата; деплой/ключи - INFRA одной рукой. |
⚡ Точки соприкосновения (где реально могут столкнуться) и как разведено
- Таблица
nostro_accounts- пишет только LEDGER; HUB и treasury читают. Новое поле нужно HUB/treasury → запрос к LEDGER (не своя миграция). → двух писателей в схему нет. - Таблица
reconciliations- owner LEDGER; treasury читает. Аналогично. - «Автосбор» существует в ДВУХ слоях - это не дубль, это разделение: - 🅻 LEDGER = решает (бизнес-политика: порог, валюта, во сколько). - 🅷 HUB = исполняет (sweep через провайдера, Волна 2). Граница: LEDGER не вызывает провайдера, HUB не хранит политику. → не пишут одно и то же.
- Внутри одного репо
capital-hubдва параллельных потока = коллизия (уже была 18.09: незакоммиченная Wave-2 callbacks уронилаtest_payments). Правило: внутри одного сервиса - один активный поток на файл; перед передачей -commit+push, дерево чистое.
🔢 Порядок (зависимости, чтобы никто не ждал вслепую)
- 🅻 LEDGER закрепляет схему
nostro_accounts+reconciliationsвshared(owner) → это разблокирует и HUB-синк, и treasury-монитор. - 🅷 HUB строит Волну 2 ностро (субсчета/балансы/автосбор-исполнение) поверх своих
hub_*+ связьhub_uuid. - 🅲 TREASURY подключает монитор к
nostro_accounts/reconciliations(read-only) - после того как LEDGER закрепил схему. - 🅳 KYC - KYT на ностро - после Identomat + живого ностро.
🅲 Что это меняет для меня (TREASURY) - решение
- ✅ Остаюсь read-only витриной (не забираю ностро-логику/автосбор/сверки - их владеют
LEDGER/HUB). Это самый бесконфликтный контур: только чтение, свой поддир
treasury/, отдельная рольcapital_ro, ноль записей в общие таблицы. - 🔨 Мой единственный незакрытый хвост: подключить монитор к
nostro_accounts+reconciliations(read-only). Заблокирован на 🅻 LEDGER (пока он не закрепит их схему вshared). До этого монитор показывает то, что уже есть, и нули там, где таблиц ещё нет.
🚦 Итог: почему столкновений не будет
- Каждая таблица - один писатель (её владелец), все прочие - читатели.
shared/modelsтрогает один терминал (LEDGER) - железное правило проекта.- HUB изолирован в своих
hub_*- не пересекается соshared. - treasury вообще ничего не пишет - вычеркнут из любых write-коллизий по определению.
- «Автосбор» разнесён на политику (LEDGER) и исполнение (HUB) - не дублируется.
- Внутри одного репо - один поток на файл + commit перед передачей.