Реестр упрощений и моков¶
Всё, что в прототипе сделано иначе, чем в банке. В коде такие места помечены # MOCK: (имитация внешней системы) или # SIMPLIFICATION: (упрощённая логика); git grep -nE "(#|//) ?(MOCK|SIMPLIFICATION):" находит все. Подробные таблицы по компонентам — в их документации, ссылки в каждом разделе; здесь собрано главное.
Общие упрощения уровня спецификации — SPEC §15: внешние источники — моки, фондирование — константа, LGD — таблица, комитет — две подписи, подписание — кодом в интерфейсе, залог и гарантия МСП — моки, выдача — мок, после выдачи ничего нет, модель обучена на синтетике.
Внешние системы¶
Интеграции с реальными системами запрещены условиями кейса, поэтому каждая внешняя система — мок внутри проекта за адаптером, который можно заменить настоящей интеграцией.
| Упрощение | Где | Как было бы в реальности |
|---|---|---|
# MOCK: ЕГРЮЛ/ЕГРИП, ФНС (+ГИР БО), БКИ, ФССП, арбитраж и Федресурс, 115-ФЗ, счета и карточка клиента отвечают из одного синтетического мира по ИНН |
apps/sources/service.py, apps/sources/README.md |
Своя интеграция на каждый источник: СМЭВ, API БКИ, выгрузки ФССП и картотеки арбитражных дел, АБС банка |
# SIMPLIFICATION: ответы источников урезаны до полей, нужных конвейеру |
apps/api/contracts.py |
Настоящие ответы ЕГРЮЛ, ФНС и БКИ намного шире |
# MOCK: задержки моков — в диапазоне примеров T00, частоты сбоев — оценка |
apps/sources/service.py |
Задержки и доступность по SLA и мониторингу каждой интеграции; сбои идут сериями |
| Одна ошибка источника на всех; запрос в БКИ не оставляет записи в отчёте; ответы не кешируются и не тарифицируются | apps/sources/README.md | Разные коды ошибок; запрос попадает в кредитную историю; запросы в БКИ платные и кешируются на срок согласия |
# MOCK: зона риска ЦБ «Знай своего клиента» в ответе 115-ФЗ выводится из скрытого архетипа компании |
apps/api/contracts.py, apps/world/ |
Платформа ЦБ «Знай своего клиента», перечни Росфинмониторинга, мониторинг операций банка |
# MOCK: гарантия Корпорации МСП — множитель к LGD и фиксированная комиссия; заявление в Корпорацию — документ, который никуда не отправляется |
apps/api/credit_policy.py, apps/api/disbursement.py |
Заявка в Корпорацию МСП через её систему, решение Корпорации |
# MOCK: реестр уведомлений о залоге (Федеральная нотариальная палата): номер регистрации выдуман |
apps/api/disbursement.py |
Регистрация уведомления через нотариуса |
# MOCK: счёт поставщика не настоящий документ, поставщик не проверяется |
apps/api/disbursement.py |
Счёт загружает клиент, поставщика проверяют по реестрам |
# MOCK: выдача — запись в closing.payout и событие журнала, без проводок; номер счёта выводится из ИНН |
apps/api/disbursement.py, DISBURSEMENT.md |
Проводки в АБС, платёж поставщику |
# MOCK: SMS-шлюза нет: код подписания показывается на экране |
apps/api/disbursement.py, apps/api/main.py |
Код уходит на телефон клиента из договора ПЭП |
Синтетический мир¶
Реальные данные запрещены условиями кейса. Мир генерируется из зерна; все упрощения генератора с описанием реальности — таблица «Упрощения» в apps/world/README.md. Главные:
| Упрощение | Как было бы в реальности |
|---|---|
| 12 отраслей с параметрами, заданными вручную; выручка — логнормальная вокруг медианы отрасли | Полное дерево ОКВЭД, распределения по данным банка |
Вероятность дефолта зависит только от скрытого качества q, отрасли и архетипа; исход есть у каждой компании, как будто банк выдал кредит всем |
Исходы только по выданным кредитам, дефолт вызывают и события после выдачи |
| Доли мошеннических архетипов фиксированы, у компании не больше одного архетипа | Доля мошенничества неизвестна и меняется |
| Затраты — постоянные доли выручки, налоги — плоская ставка по режиму; наличная выручка не попадает на счёт | Реальная структура затрат, НДС, вычеты, сроки уплаты |
| В БКИ у собственника только карты и потребительские кредиты; проверяется только основной учредитель; связанных компаний нет | Ипотека, поручительства, отчёты по всем значимым учредителям, группы компаний |
# MOCK: мир — снимок на дату среза (WORLD_AS_OF), поэтому признаки считаются на эту дату, а не на дату ответа источников (apps/api/workflow.py) |
Признаки на дату ответов источников |
Выписки из других банков (T12): один выдуманный банк; клиент с недавно открытым счётом перевёл к нам весь бизнес сразу (apps/world/statements.py) |
Выписки разных банков в своих форматах; переход клиента растягивается на месяцы |
Признаки и качество данных¶
Таблица — apps/api/features/README.md.
| Упрощение | Где | Как было бы в реальности |
|---|---|---|
# SIMPLIFICATION: пороги уровней качества данных взяты из SPEC §5.1 экспертно |
apps/api/features/data_quality.py, config/data_quality.json |
Пороги, откалиброванные по портфелю банка |
# SIMPLIFICATION: группы риска ОКВЭД заданы для дюжины отраслей мира |
apps/api/features/policy.py, config/features.json |
Таблица по всему дереву ОКВЭД, откалиброванная по дефолтам |
# SIMPLIFICATION: долговая нагрузка — только долг бизнеса, без личных кредитов собственника ООО и связанных компаний |
apps/api/features/credit.py |
Совокупная нагрузка группы |
Скоринговая модель¶
Таблица — apps/ml/README.md и SCORING.md.
| Упрощение | Где | Как было бы в реальности |
|---|---|---|
| Модель обучена на синтетических данных: её качество доказывает работу конвейера обучения, а не реальный риск | apps/ml/ |
Обучение на истории портфеля банка, независимая валидация |
| Обучение на всех компаниях без reject inference | apps/ml/train.py |
Исходы только по выданным кредитам, восстановление по отказанным |
# SIMPLIFICATION: параметры разбиения и отбора — учебные, без кросс-валидации; калибровка на долю дефолтов одного среза |
apps/ml/train.py |
Подбор на кросс-валидации, калибровка through-the-cycle |
# SIMPLIFICATION: отложенная выборка — случайная часть того же среза; PSI сравнивает её с обучающей, а не поток заявок |
apps/ml/validate.py |
Out-of-time выборка, ежемесячный мониторинг PSI по заявкам |
# SIMPLIFICATION: пороги PSI и 95%-е интервалы — общепринятые, в коде |
apps/ml/validation.py |
Пороги утверждает валидационное подразделение |
# SIMPLIFICATION: модель-претендент — наша экспертная карта scorecard_v0, а не другая версия модели банка; результаты теневого режима — только в логе и в Decision |
apps/api/scoring.py |
Несколько версий моделей и хранилище для их сравнения |
| Штраф к оценке за недоступный необязательный источник не применяется: размер не задан в политике | apps/api/scoring.py |
Штраф по политике, отдельной строкой во вкладах |
Лимит, ставка, предложения, маршрут¶
Таблицы — LIMITS.md, OFFERS.md, ROUTING.md.
| Упрощение | Где | Как было бы в реальности |
|---|---|---|
# SIMPLIFICATION: фондирование — ключевая ставка плюс постоянный спред |
apps/api/credit_policy.py |
Трансфертная цена казначейства по срокам |
| LGD — таблица, а не модель (SPEC §15) | config/credit_policy.json |
Модель LGD |
# SIMPLIFICATION: возобновляемый лимит (овердрафт, линия) считается как аннуитет на 12 месяцев |
apps/api/limits.py |
Расчёт по условиям траншей и ожидаемому использованию |
# SIMPLIFICATION: залог оценивается по цене покупки оборудования |
apps/api/limits.py |
Независимая оценка и дисконт на ликвидность |
# SIMPLIFICATION: политика предложений — константы в коде: до 3 предложений, срок 10 дней, повторное обращение через 90 дней для любой причины отказа |
apps/api/offers.py |
Значения в кредитной политике; срок повторного обращения по причине отказа |
# SIMPLIFICATION: матрица полномочий (1, 5 и 15 млн ₽, грейды A–C) — константы RoutingPolicy; сегмент микро / малый не учитывается |
apps/api/routing.py |
Нормативный документ кредитной политики с версиями |
Сотрудники и рассмотрение¶
Таблица — STAFF_ACTIONS.md.
| Упрощение | Где | Как было бы в реальности |
|---|---|---|
# SIMPLIFICATION: один пароль STAFF_PASSWORD на все должности; должность выбирается при входе |
apps/api/main.py |
Справочник сотрудников с должностями и полномочиями, вход через корпоративную учётную запись |
| Комитет — две подписи (андеррайтер и риск-менеджер), а не заседание с протоколом | apps/api/staff_actions.py |
Заседание комитета, протокол, квалифицированная ЭП |
# SIMPLIFICATION: коды причин — константы в коде |
apps/api/staff_actions.py |
Справочник кредитной политики с версиями |
| Сотрудник не может одобрить сумму выше посчитанного лимита | контракт Offer |
Превышение лимита в рамках полномочий с кодом причины |
Путь комитета нельзя показать на демо-персонах: персона committee попадает на комитет без предложений, поэтому вторую подпись не над чем ставить |
apps/world/PERSONAS.md |
— |
Клиент, согласия, подписание¶
| Упрощение | Где | Как было бы в реальности |
|---|---|---|
# SIMPLIFICATION: вход клиента — любой e-mail без пароля и кода подтверждения; e-mail определяет демо-профиль: тот же ввод — тот же профиль |
apps/api/main.py, apps/web/src/demo-login.tsx |
Вход в интернет-банк (логин и пароль, второй фактор) |
# SIMPLIFICATION: пользователь не привязан к компании: демо-профиль подаёт за любую компанию каталога персон |
apps/api/main.py, apps/api/demo_companies.py |
Права пользователя в компании из АБС |
# MOCK: если каталог персон устарел или пуст, демо показывает запасную компанию текущего мира |
apps/api/demo_companies.py |
— |
# SIMPLIFICATION: согласия 218-ФЗ и 152-ФЗ — галочки со временем, без подтверждения личности и реестра согласий |
apps/web/src/company-onboarding.tsx |
Согласие подписано ПЭП, хранится в реестре со сроком |
# SIMPLIFICATION: один код клиента подписывает и договор поручительства |
apps/api/disbursement.py |
Поручитель подписывает своей ПЭП или ЭП |
# SIMPLIFICATION: срок кода (5 минут), число попыток и лимит кодов — константы |
apps/api/disbursement.py |
Условия договора ПЭП |
Срок на подписание не ограничен; непрошедшее отлагательное условие оставляет заявку в conditions навсегда |
apps/api/disbursement.py |
Срок подписания, разбор условий бэк-офисом |
Выписки из другого банка¶
Таблица — STATEMENTS.md.
| Упрощение | Где | Как было бы в реальности |
|---|---|---|
# MOCK: распознавания нет: загружается уже разобранный JSON с оборотами по месяцам |
apps/api/statements.py |
PDF или файл 1С (1CClientBankExchange), разбор моделью с открытыми весами, разнесение платежей по категориям |
# SIMPLIFICATION: переводы между нашим счётом и счётом в другом банке не взаимоисключаются |
apps/api/statements.py |
Сопоставление и исключение переводов |
| Подлинность выписки не проверяется, поэтому заявку с выпиской всегда смотрит андеррайтер | apps/api/statements.py |
Подтверждение через банк-отправитель или по ЭП |
# SIMPLIFICATION: пороги проверок (3 месяца давности, 30% сверх ФНС) и лимиты загрузки (5 файлов по 2 МБ) — константы |
apps/api/statements.py |
Значения в политике качества данных |
Предодобрение¶
Таблица — PREAPPROVAL.md.
| Упрощение | Где | Как было бы в реальности |
|---|---|---|
# MOCK: согласие на запрос в БКИ считается данным при открытии счёта |
apps/api/preapproval.py |
Реестр согласий со сроками |
# MOCK: клиентская база — весь синтетический мир; расчёт опрашивает источники по каждому клиенту |
apps/api/preapproval.py |
Пакетный расчёт по хранилищу данных и пакетному файлу из БКИ |
# SIMPLIFICATION: «ночной» расчёт — «последний старше суток» в worker; срок 30 дней — константа; хранится только последний результат |
apps/api/preapproval.py |
Планировщик заданий, история расчётов |
Платформа и запуск¶
| Упрощение | Где | Как было бы в реальности |
|---|---|---|
# SIMPLIFICATION: очередь заявок — колонка status, которую опрашивает worker |
apps/api/workflow.py |
Брокер сообщений или workflow-движок с очередью ошибок |
Docker-образ содержит мир по умолчанию, собранный при docker build (RUN python -m apps.world): WORLD_SEED / WORLD_N / WORLD_AS_OF в Docker действуют, только если WORLD_DIR указывает на пустую папку |
Dockerfile |
— (данные приходят из источников, а не из генератора) |
# MOCK: в .env.example персона source_down получает отказ БКИ (MOCK_SOURCES_SCENARIOS) |
.env.example |
— |
VPS-стек с Caddy (compose.vps.yaml) не передаёт переменные MOCK_SOURCES_*, SCORECARD_*, LOG_LEVEL, SOURCE_*: там source_down получает обычный ответ БКИ. Вариант с nginx читает .env целиком |
compose.vps.yaml, VPS.md |
— |
ИИ-ассистент¶
| Упрощение | Где | Как было бы в реальности |
|---|---|---|
# SIMPLIFICATION: тайм-аут (30 с) и лимит ответа (500 токенов) — константы в коде |
apps/api/assistant.py |
Настройка под конкретную модель |
| Тесты проверяют формат запроса и откат к шаблону, а не живую модель | tests/test_assistant.py |
Оценка ответов модели на наборе вопросов |
| Помощник получает только клиентское представление открытой заявки, без истории чата и без доступа к фактам/внутренним полям; если заявка не открыта — отвечает в общем справочном режиме (T37) | apps/api/main.py, apps/web/src/main.tsx |
Проверенный диалоговый контекст и аудит ответов по реальным политикам банка |
Панель /organizers использует существующий доступ сотрудника (STAFF_PASSWORD) для управления всем демо-стендом. В реальной системе это отдельная роль администратора. Переопределения применяются к онлайн-запросам; ночной пакет предодобрения продолжает использовать базовые сценарии.