Перейти к содержанию

Реестр упрощений и моков

Всё, что в прототипе сделано иначе, чем в банке. В коде такие места помечены # 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) для управления всем демо-стендом. В реальной системе это отдельная роль администратора. Переопределения применяются к онлайн-запросам; ночной пакет предодобрения продолжает использовать базовые сценарии.