LUMIS NO SIGNATURE
Паспорт скоупа проекта

RentGuard

Публичный паспорт проекта в LUMIS Studio. Ниже — только то, что записал сам прогон.

Подпись скоупа · SHA-256 Не сформирована Этот прогон не записал подпись границ, поэтому подтвердить здесь нечего.
Что означает эта страница

Подписи у этого проекта нет: страница показывает только то, что действительно записано. Никаких оценок кода, сходимости и рисков LUMIS не измеряет и здесь не показывает.

Документы

Проект открыт автором. Ниже — документы того же прогона, как их записал консилиум.

Спецификация продукта PRD.md

PRD: RentGuard — B2B SaaS платформа автоматизированного скоринга и антифрода арендаторов


1. Executive Summary (Краткое резюме)

1.1. Обзор продукта

RentGuard — B2B SaaS-платформа для мгновенной (до 60 секунд) автоматизированной проверки благонадежности, подлинности документов и реальной платежеспособности потенциальных арендаторов. Система основана на сочетании Machine Learning (ML) анализа банковских выписок, прямого подключения через Open Banking, OCR-распознавания документов, удостоверяющих личность, и глубинного антифрод-анализа метаданных файлов.

1.2. Проблематика рынка

Современный рынок долгосрочной аренды жилой недвижимости сталкивается с высокими рисками неплатежей, простоя объектов и мошенничества:

  • Рост квалифицированного фрода: До 15% кандидатов используют отредактированные в графических редакторах PDF-выписки из банк-клиентов для завышения доходов.
  • Долгий процесс проверки: Ручная проверка документов сотрудниками управляющих компаний (УК) занимает от нескольких часов до 2-3 дней, что приводит к уходу ликвидных кандидатов.
  • Риски утечки персональных данных (ПДн): Хранение сканов паспортов и банковских выписок на рабочих компьютерах менеджеров нарушает требования GDPR и 152-ФЗ.

1.3. Бизнес-цели и позиционирование

RentGuard позиционируется как ключевой технический инструмент проверки (Verification Gateway) для профессиональных участников рынка недвижимости.

  • Целевое время скоринга: $\le 60$ секунд от момента загрузки данных до вынесения вердикта.
  • Точность распознавания и выявления фрода: 99%.
  • Главная бизнес-цель: Снижение уровня кассовых разрывов и дефолтов по арендным платежам у клиентов (УК и лендлордов) до уровня $< 1\%$, а также сокращение стоимости онбординга одного кандидата на 80%.

2. Target Audience & Personas (Целевая аудитория и Персоны)

2.1. Сегменты целевой аудитории

  1. Управляющие компании (УК) жилой недвижимостью: Управляют крупными портфелями квартир (от 50+ объектов), требуют максимальной автоматизации и интеграции с CRM/PMS через API.
  2. Операторы Co-living и сервисных апартаментов: Высокий поток кандидатов, короткий цикл принятие решения, повышенные требования к быстродействию онбординга.
  3. Агентства недвижимости и брокеры по долгосрочной аренде: Заинтересованы в предоставлении клиентам-собственникам гарантий качества подбора.
  4. Частные лендлорды (портфель от 10 объектов): Нуждаются в простой и надежной веб-панели без сложной интеграции для защиты от недобросовестных жильцов.

2.2. User Personas

ПерсонаРоль и контекстБоли и проблемыПотребности в RentGuard
АннаМенеджер УК (портфель 300+ квартир)Огромный ручной поток кандидатов, рутинная проверка выписок, страх пропустить мошенника с поддельным PDF, задержки в сдаче объектов.Быстрая отправка ссылки на проверку, готовый скоринг-балл за 60 секунд, прозрачная декомпозиция доходов/расходов, Webhook-уведомления.
ИгорьЧастный лендлорд (12 квартир бизнес-класса)Опыт взаимодействия с неплательщиками, сложность независимой оценки реального дохода кандидата, опасение отпугнуть жильцов долгими проверками.Удобный веб-дашборд, юридическая чистота процесса, защита от сканов/распечаток, четкая рекомендация: «Одобрено / Высокий риск».
АлексейПотенциальный арендатор (Кандидат)Проходит проверку со смартфона, опасается за безопасность личных финансов, не хочет передавать сырые выписки третьим лицам.Быстрый Mobile Web интерфейс, выбор между Open Banking и загрузкой PDF, мгновенный OTP-вход, гарантия удаления его данных.

Таблица шире экрана — её можно прокрутить вбок.

2.3. User Journey Map (Детальный сценарий)

[1. Инициация] ──> [2. Согласие & OTP] ──> [3. Загрузка данных] ──> [4. Скоринг (≤60s)] ──> [5. Purge ПДн] ──> [6. Решение]
  1. Инициация: Менеджер УК (Анна) в Desktop Dashboard вводит номер телефона/Email кандидата и генерирует одноразовую пригласительную ссылку.
  2. Авторизация и согласие: Кандидат (Алексей) переходит по ссылке с мобильного устройства, вводит OTP-код из SMS, принимает пользовательское соглашение и подписывает согласие на обработку ПДн (GDPR / 152-ФЗ).
  3. Загрузка документов: Алексей фотографирует документ, удостоверяющий личность (паспорт/ID), и выбирает способ подтверждения дохода: авторизация через Open Banking или загрузка официального векторного PDF из приложения банка.
  4. Скоринг и антифрод ($\le 60$ сек): RentGuard выполняет OCR паспорта, проверяет криптографическую целостность и метаданные PDF, анализирует транзакции и рассчитывает показатели cash flow.
  5. Безопасная очистка: Платформа немедленно уничтожает сырые выписки и реквизиты счета, сохраняя только анонимизированные математические агрегаты отчета.
  6. Принятие решения: Анна получает Webhook в своей системе и отображение в дашборде. На основе скоринг-балла фиксируется вердикт, данные об успехе/дефолте в будущем используются для дообучения ML-модели.

3. Core Value & Core Loop (Основная ценность и ключевой цикл)

3.1. Core Value Proposition

Автоматический скоринг благонадежности и доходов арендатора за 60 секунд с точностью 99%, гарантированно защищающий собственников недвижимости от поддельных выписок, финансовых дефолтов и убыточных простоев объектов.

3.2. Core Loop (Ключевой замкнутый цикл)

  1. Отправка: Менеджер УК или лендлорд отправляет кандидату ссылку на прохождение верификации.
  2. Загрузка: Кандидат загружает документ, удостоверяющий личность, и банковскую выписку (либо подключает Open Banking).
  3. Обработка: Система RentGuard проводит OCR, антифрод-анализ фальсификаций в PDF и рассчитывает финансовый скоринг cash flow за 60 секунд.
  4. Выдача отчета: Менеджер получает структурированный отчет с финальным скор-баллом и рекомендацией по одобрению.
  5. Обучение модели: Решение по заявке и исторические данные последующей платежной дисциплины арендатора заносятся в систему, повышая точность ML-модели anti-fraud и скоринга.

3.3. Непреложные инварианты системы (System Invariants)

Во избежание компрометации архитектуры и бизнеса, следующие правила обязательны к исполнению на программном уровне:

  • Инвариант 1 (100% Приватность ПДн): Полное соответствие стандартам GDPR и 152-ФЗ. Передача ПДн третьим лицам категорически запрещена.
  • Инвариант 2 (Hard Latency Limit): Время формирования итогового отчета скоринга не превышает 60 секунд с момента завершения загрузки данных пользователем.
  • Инвариант 3 (Zero Raw Data Storage): Запрет на хранение открытых банковских реквизитов и необработанных сырых выписок после формирования отчета. Сырые файлы удаляются из оперативной памяти/временного S3-хранилища сразу после генерации анонимизированного JSON-отчета.
  • Инвариант 4 (Anti-Raster Rule): Маркировка всех растровых сканов и распечатанных/сфотографированных документов как High Risk с автоматическим требованием загрузки оригинального векторного PDF из банк-клиента или подключения Open Banking.
  • Инвариант 5 (Immutable Audit Trail): Неизменяемость аудиторского лога проверок (с использованием криптографических хеш-цепочек) для предотвращения внутреннего фрода и сговора со стороны сотрудников УК.

4. Detailed Feature Scope (Подробный функциональный объем)

4.1. Модуль 1: Verification Engine (Mobile Web App для арендатора)

Мобильный веб-интерфейс, оптимизированный для работы на iOS и Android без необходимости установки приложений из App Store / Google Play.

  • S1.1: Авторизация и OTP
  • Вход по одноразовому SMS/Email-коду.
  • SLA: Доставка OTP $\le 2000 \text{ ms}$.
  • S1.2: Интерактивный мастер проверки личности (ID Verification)
  • Кадрирование и захват изображения паспорта/ID в реальном времени с автоматической детекцией бликов, размытия и перекрытия текста.
  • Клиентский модуль распознавания OCR на базе WebAssembly для первичной валидации качества фото.
  • S1.3: Виджет подтверждения дохода (Income Verification)
  • Вариант А (Open Banking): Авторизация через API банков-партнеров в 2 клика.
  • Вариант Б (Vector PDF Upload): Загрузка файла выписки. Автоматическая предпроверка формата на стороне клиента за $\le 2000 \text{ ms}$ (проверка наличия векторного текстового слоя).
  • S1.4: Обработка ошибок и сценарии восстановления (Recovery Flows)
  • Обнаружение растра/скана: Отображение предупреждения: «Обнаружена копия или скан. Пожалуйста, загрузите оригинальный PDF-файл из приложения вашего банка».
  • Ошибка OCR: Выделение проблемной зоны фото (например, «Размыта серия паспорта») и предложение сделать повторный снимок.
  • Отказ от Open Banking: Автоматическое перенаправление на визуальную пошаговую инструкцию по выгрузке выписки для конкретного банка кандидата.

4.2. Модуль 2: Anti-Fraud & Scoring Pipeline (Backend & ML Services)

Серверная архитектура обработки данных и вычисления рисков.

┌────────────────┐     ┌──────────────────────┐     ┌───────────────────────┐     ┌──────────────────┐
│ Vector PDF /   │ ──> │ Anti-Fraud Pipeline  │ ──> │ Cash Flow Engine      │ ──> │ Score Generation │
│ Open Banking   │     │ (Metadata & Forensic)│     │ (Categorization & ML) │     │ (& Purge Raw Data│
└────────────────┘     └──────────────────────┘     └───────────────────────┘     └──────────────────┘
  • S2.1: Модуль криптографического и технического антифрода PDF
  • Анализ структуры PDF-документа: проверка истории модификаций, структуры шрифтов, несоответствия XMP-метаданных, наличия следов редактирования в Adobe Photoshop, Acrobat и др.
  • Анализ выравнивания глифов и текстовых блоков (детекция подделки отдельных цифр в суммах).
  • Автоматический присвоение статуса High Risk при выявлении любых манипуляций.
  • S2.2: Движок финансового анализа Cash Flow
  • Автоматическая категоризация транзакций: выделение регулярных доходов (зарплата, дивиденды), выявление скрытых обязательств (кредиты, алименты, микрозаймы).
  • Анализ волатильности остатков на счете и среднемесячного свободного денежного потока (Free Cash Flow).
  • Расчет коэффициента Rent-to-Income (RTI): отношение прогнозируемой арендной платы к чистому доходу.
  • S2.3: Глубокая очистка данных (Data Purge Engine)
  • Автоматический фоновый процесс, который после завершения работы ML-модели физически стирает исходный PDF/данные Open Banking и очищает системный кэш.
  • Фиксация факта удаления в аудиторском логе.

4.3. Модуль 3: Dashboard & Management Panel (Desktop Web для УК и Лендлордов)

  • S3.1: Сводный дашборд заявок
  • Таблица кандидатов в реальном времени с фильтрацией по статусам (New, In Progress, Approved, High Risk, Rejected).
  • Быстрый поиск и кнопка мгновенной генерации приглашения.
  • S3.2: Детальная карточка отчета скоринга
  • Итоговый балл (0–100) и рекомендация: «Рекомендуется», «Требуется повышенный залог», «Не рекомендуется».
  • Декомпозиция Cash Flow: Наглядные графики среднемесячного дохода, обязательных расходов и финансовой подушки (без раскрытия конкретных названий магазинов/переводов, для соблюдения приватности).
  • Антифрод-чеклист: Результаты валидации паспорта, проверка наличия в базах действительных документов, проверка структуры выписки.
  • S3.3: Журнал аудита (Audit Trail Log)
  • Неизменяемый журнал всех проверок с отображением timestamp, ID менеджера, инициализировавшего проверку, и SHA-256 хеша полученного отчета.

4.4. Модуль 4: Integrations & API Layer

  • S4.1: REST API & Webhook Service
  • REST API для интеграции со сторонними PMS (Property Management Systems) и CRM-системами клиентов.
  • Webhook SLA: Отправка уведомления об изменении статуса проверки $\le 2000 \text{ ms}$ с момента завершения скоринга.
  • S4.2: Polling API
  • Эндпоинт опроса статуса готовности отчета с задержкой ответа $\le 1000 \text{ ms}$.

4.5. Технические ограничения и Latency SLA

Операция / ВзаимодействиеМаксимально допустимый SLA (Latency)Поведение при превышении SLA
Первичная валидация PDF на клиенте/API$\le 2000 \text{ ms}$Прерывание загрузки, показ ошибки пользователю.
Доставка OTP SMS/Email$\le 2000 \text{ ms}$Автоматический ретрай через альтернативный SMS-шлюз.
Polling API (Опрос состояния)$\le 1000 \text{ ms}$-
Webhook notification$\le 2000 \text{ ms}$Повторные попытки с экспоненциальной задержкой.
Полный цикл скоринга (End-to-End)$\le 60 \text{ секунд}$Уведомление пользователя о фоновой обработке, отправка результатов через Webhook/Push по готовности.

Таблица шире экрана — её можно прокрутить вбок.


5. Explicit Non-Goals (Явные не-цели)

Во избежание размытия фокуса продукта и нарушения юридических границ, в объем функций RentGuard строго не входят следующие направления:

  1. Разработка полноценной PMS-системы: RentGuard не занимается учетом ремонтов, выдачей цифровых и физических ключей, управлением графиками клининга и сбором коммунальных платежей.
  2. Риелторские услуги и создание маркетплейса: Платформа не предоставляет услуги по подбору жилья, не публикует объявления о сдаче недвижимости и не конкурирует с сервисами поиска аренды.
  3. Страхование и финансовые гарантии: RentGuard не является страховой компанией или поручителем. Платформа не выплачивает прямые компенсации собственникам при дефолте арендатора.
  4. Автоматизация судебных исков и выселения: Система не формирует юридические документы для судов и не осуществляет юридическое или силовое сопровождение процесса выселения недобросовестных жильцов.
  5. Создание и публикация централизованных «черных списков»: RentGuard не ведет и не публикует глобальные базы неплательщиков и не осуществляет межоператорский обмен негативными списками арендаторов, так как это нарушает законодательство о защите персональных данных (GDPR / 152-ФЗ).

6. Success Metrics & KPIs (Метрики успеха и KPI)

6.1. Бизнес-метрики (Business KPIs)

  • ARR (Annual Recurring Revenue): Годовой объем повторяющейся выручки по подпискам B2B SaaS.
  • NRR (Net Retention Rate): Target $> 120\%$.
  • CAC Payback Period: Срок окупаемости затрат на привлечение клиента $< 6$ месяцев.
  • B2B Conversion Rate: Конверсия из пилотного запуска в платную корпоративную подписку $> 35\%$.

6.2. Продуктовые и UX-метрики (Product Metrics)

  • Funnel Completion Rate (Кандидаты): Процент кандидатов, успешно проходящих верификацию до конца, $> 85\%$.
  • Average Time-to-Verdict: Среднее время формирования отчета (Цель: 35–45 секунд, Hard Limit: 60 секунд).
  • Candidate Drop-off Rate: Доля отвалов на этапе загрузки финансовых документов $< 10\%$.

6.3. Технические метрики и точность (Technical & Quality KPIs)

  • Fraud Detection Precision & Recall: Точность обнаружения отредактированных PDF-файлов $> 99\%$.
  • False Positive Rate (Ложноположительные срабатывания антифрода): $< 0.5\%$.
  • OCR Field Accuracy: Точность распознавания паспортов $> 99.2\%$.
  • System Uptime SLA: $99.9\%$.

7. Risks & Mitigations (Риски и их митигация)

№Описание рискаУровень рискаСтратегия митигации (Mitigation Strategy)
1Атака распечаткой и сканированием (Print-and-Scan Attack): Обход ML-антифрода путем распечатки поддельной выписки и её последующего сканирования для уничтожения цифровых следов редактирования PDF.КритическийАрхитектурный инвариант №4: Автоматическая маркировка всех растровых сканов как High Risk. Система блокирует автоматический расчет и требует от кандидата либо загрузки оригинального векторного PDF прямо из банк-клиента, либо верификации через Open Banking.
2Высокий отвал кандидатов (Drop-off): Массовый отказ кандидатов делиться финансовыми данными или подключать Open Banking из-за опасений за конфиденциальность.Высокий1. Гранулярный прозрачный интерфейс (UX): явное визуальное подтверждение того, что сырые данные стираются.
2. Реализация двух альтернативных каналов на выбор (PDF или Open Banking).
3. Отображение официального сертификата безопасности данных на экране онбординга.
3Юридические претензии и иски от арендаторов: Обвинения в дискриминации или незаконном ведении «черных списков».Высокий1. Явный Non-Goal №5: Отказ от ведения единых баз неплательщиков.
2. Оценка проводится изолированно для каждого конкретного запроса.
3. Скоринг выдает математическую вероятность и математический бал, решение принимает исключительно менеджер УК.
4Низкая конверсия при попытке переложить оплату проверки на кандидата (Application Fee): Сопротивление рынка при попытке взимать плату за проверку с арендатора.СреднийМодель B2B SaaS ориентирована на оплату подписки самим лендлордом или УК как частью их операционных расходов на заполнение вакансий. Монетизация через Application Fee для кандидатов исключена из базового ценника и может включаться только по желанию УК.
5Внутренний фрод сотрудников УК: Сговор менеджера с кандидатом для ручного одобрения неблагонадежного жильца.СреднийАрхитектурный инвариант №5: Использование криптографически защищенного неизменяемого лога (Immutable Audit Trail). Любая смена статуса или перепроверка фиксируются в системе без возможности удаления или редактирования админом УК.

Таблица шире экрана — её можно прокрутить вбок.

Архитектура ARCHITECTURE.md · фрагмент

Документ показан не целиком — полный документ в ZIP владельца.

ARCHITECTURE.md — Архитектурная спецификация платформы RentGuard

Версия документа: 1.0.0 Дата актуализации: 04 сентября 2026 г. Статус: Утверждено (Approved) Автор: Principal Enterprise Architect


1. Обзор системы и Архитектурные Принципы

RentGuard — это специализированный Micro-SaaS/API сервис мгновенного антифрод-скоринга банковских выписок и документов потенциальных арендаторов. Система предназначена для управляющих компаний (УК) и индивидуальных лендлордов. Главная задача системы — автоматическая валидация финансовой состоятельности арендатора, выявление подделок банковских выписок (PDF-фрод) и расчет индекса платежеспособности в течение 60 секунд, с соблюдением требований защиты персональных данных (152-ФЗ / GDPR).

1.1 Архитектурные инварианты (Invariants)

  1. Zero-PII Storage (Нулевое хранение открытых ПДн): Персональные данные арендатора (номер паспорта, телефон) никогда не сохраняются в открытом или обратимо зашифрованном виде. В БД записываются исключительно криптографические соленые хэши (Salted SHA-256).
  2. RAM/tmpfs Ephemeral Processing (Эфемерная обработка документов): Исходные файлы выписок (PDF) и фотографий паспортов обрабатываются строго в оперативной памяти (tmpfs). После завершения анализа и формирования метрик файлы мгновенно и безвозвратно уничтожаются без записи на физический диск.
  3. Strict Scanned/Raster PDF Risk Tagging: Загрузка сканированных, растровых или распечатанных с последующим сканированием выписок (без исходного текстового/векторного слоя банк-клиента) автоматически присваивает выписке статус High Risk (is_vector_pdf = False).
  4. Tamper-Proof Cryptographic Audit Log: Журнал аудита не подлежит изменению или удалению. Каждая запись содержит SHA-256 хэш предыдущей записи (cryptographic hash chain), образуя непрерывную цепочку. Любая попытка модификации исторической записи нарушает валидность всей последующей цепочки.
  5. 60-Second Scoring SLA: Полный цикл от момента завершения загрузки документов арендатором до отправки итогового отчета в UI лендлорда/управляющей компании занимает не более 60 секунд.
  6. SQLCipher AES-256 Encryption: База данных SQLite работает в режиме WAL (Write-Ahead Logging) с полным шифрованием базы данных на лету с использованием расширения SQLCipher (ключ шифрования AES-256).

1.2 Нецелевые функции (Non-Goals)

  1. Разработка PMS (Property Management System): Система не занимается учетом ремонтов, выдачей ключей, клинингом или сбором коммунальных платежей.
  2. Риелторский маркетплейс: Система не предоставляет функционал поиска жилья, публикации объявлений или подбора жильцов.
  3. Прямое страхование и финансовые гарантии: RentGuard предоставляет исключительно вероятностную антифрод-оценку и скоринг, не являясь страховой компанией и не предоставляя поручительства.
  4. Автоматизация судебных исков и выселений: В системе отсутствует юридический конструктор исков и функционал сопровождения судебных процессов.
  5. Черные списки (Centralized Blacklists): Система не ведет и не публикует централизованные списки неплательщиков и не осуществляет межоператорский обмен негативными списками арендаторов (ввиду фатальных юридических рисков GDPR / 152-ФЗ).

2. Архитектурный паттерн и Высокоуровневая Схема

Система спроектирована по паттерну Модульный монолит с асинхронным конвейером обработки событий (Event-Driven Pipeline).

2.1 Схема контейнеров и сервисов (Mermaid)

graph TB
    subgraph Client Layer [Frontend / Client Applications]
        UI_Dash["React 18 Dashboard<br/>(Desktop Landlord UI)"]
        UI_Onb["React 18 Tenant Onboarding<br/>(Mobile Responsive)"]
        Ext_API["External API Clients<br/>(Webhooks / REST)"]
    end

    subgraph API Layer [Modular Monolith API Gateway]
        FastAPI["FastAPI 0.110+ Application<br/>(Python 3.12, Pydantic v2)"]
        WS_Handler["WebSocket Manager<br/>(Real-time 60s Tracking)"]
        Security_Module["Security & Hash Module<br/>(Salted SHA-256 / Auth)"]
    end

    subgraph Memory Storage [Ephemeral Storage (RAM)]
        TMPFS["/tmp/rentguard_proc<br/>(tmpfs RAM Storage)"]
    end

    subgraph Async Pipeline [Event Queue & Processing Pipeline]
        Broker["Taskiq / Celery Broker<br/>(Async Scoring Queue)"]
        Worker_PDF["PDF Analyzer Service<br/>(Vector / Raster Analysis)"]
        Worker_Score["Scoring Engine Service<br/>(Financial Risk Calculation)"]
        Worker_Audit["Audit Log Engine<br/>(Cryptographic Chain Building)"]
    end

    subgraph Persistence Layer [Encrypted Data Store]
        DB[("SQLite 3 + SQLCipher<br/>(AES-256, WAL Mode)")]
    end

    %% Interactions
    UI_Dash -->|REST / OpenAPI| FastAPI
    UI_Dash <-->|WebSockets| WS_Handler
    UI_Onb -->|REST Document Upload| FastAPI
    Ext_API -->|REST API & Webhooks| FastAPI

    FastAPI --> Security_Module
    FastAPI -->|Save Docs to RAM| TMPFS
    FastAPI -->|Dispatch Task| Broker

    Broker --> Worker_PDF
    Worker_PDF -->|Read/Delete Temp Doc| TMPFS
    Worker_PDF --> Worker_Score
    Worker_Score --> Worker_Audit
    Worker_Audit -->|Async IO Write| DB
    Worker_Score -->|Publish Status| WS_Handler
    Worker_Score -->|Trigger Hook| Ext_API

2.2 Компоненты системы

  • Frontend (React 18, Vite, TypeScript, TailwindCSS, TanStack Query):
  • Dashboard.tsx: Рабочее место управляющей компании для создания проверок, отслеживания их статуса и анализа отчетов.
  • TenantOnboarding.tsx: Мобильный интерфейс для арендатора. Позволяет загружать скан/фото паспорта и банковскую выписку в формате PDF за несколько кликов.
  • Backend API (FastAPI, Python 3.12, Pydantic v2):
  • Обеспечивает REST API с низкой задержкой (target latency < 2000 мс).
  • Реализует подсистему WebSockets для трансляции прогресса обработки документов в реальном времени.
  • Модуль безопасности производит моментное хэширование персональных данных.
  • Асинхронный воркер (Taskiq / Celery):
  • Изолированная обработка ресурсоемких задач (парсинг PDF, математический скоринг, криптографическая сборка аудиторских логов).
  • База данных (SQLite + SQLCipher + WAL):
  • Локальное высокопроизводительное хранилище. Все страницы БД зашифрованы алгоритмом AES-256. Включение режима WAL (Write-Ahead Logging) обеспечивает высокую скорость параллельных операций чтения и записи.

3. Модель данных и Криптографический Аудит

3.1 ER-Диаграмма (Mermaid)

erDiagram
    Organization ||--o{ User : "has_many"
    Organization ||--o{ TenantVerification : "owns"
    Organization ||--o{ ImmutableAuditLog : "generates"
    User ||--o{ ImmutableAuditLog : "triggers"
    TenantVerification ||--o| BankStatementMetadata : "contains"

    Organization {
        uuid id PK
        string name
        string inn
        string api_key_hash
        datetime created_at
    }

    User {
        uuid id PK
        uuid organization_id FK
        string email
        string password_hash
        string role
        datetime created_at
    }

    TenantVerification {
        uuid id PK
        uuid organization_id FK
        string tenant_phone_hash "Salted SHA-256"
        string passport_hash "Salted SHA-256"
        string status "PENDING|PROCESSING|COMPLETED|FAILED"
        integer risk_score "0-100"
        json summary_data_json
        datetime created_at
        datetime completed_at
    }

    BankStatementMetadata {
        uuid id PK
        uuid verification_id FK
        boolean is_vector_pdf
        boolean open_banking_connected
        numeric monthly_income
        numeric stability_index
        datetime created_at
    }

    ImmutableAuditLog {
        bigint id PK
        uuid organization_id FK
        uuid user_id FK
        string action
        string resource
        string prev_hash "SHA-256 preceding record"
        string log_hash "SHA-256 payload+prev_hash"
        datetime created_at
    }

3.2 SQLAlchemy 2.0 (AsyncIO) Модели и Логика Цепочки Аудита

Ниже представлена реализация моделей системы на Python 3.12 с использованием SQLAlchemy 2.0 AsyncIO (rentguard-backend/app/db/models.py).

import hashlib
import uuid
from datetime import datetime, timezone
from typing import Optional
from sqlalchemy import (
    String, DateTime, ForeignKey, Boolean, Integer, Numeric, JSON, BigInteger, Text
)
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship

class Base(DeclarativeBase):
    pass

class Organization(Base):
    __tablename__ = "organizations"

    id: Mapped[uuid.UUID] = mapped_column(primary_key=True, default=uuid.uuid4)
    name: Mapped[str] = mapped_column(String(255), nullable=False)
    inn: Mapped[str] = mapped_column(String(12), nullable=False, index=True)
    api_key_hash: Mapped[str] = mapped_column(String(64), nullable=False)
    created_at: Mapped[datetime] = mapped_column(
        DateTime(timezone=True), default=lambda: datetime.now(timezone.utc)
    )

    users: Mapped[list["User"]] = relationship(back_populates="organization")
    verifications: Mapped[list["TenantVerification"]] = relationship(back_populates="organization")

class User(Base):
    __tablename__ = "users"

    id: Mapped[uuid.UUID] = mapped_column(primary_key=True, default=uuid.uuid4)
    organization_id: Mapped[uuid.UUID] = mapped_column(ForeignKey("organizations.id"), nullable=False)
    email: Mapped[str] = mapped_column(String(255), unique=True, nullable=False, index=True)
    password_hash: Mapped[str] = mapped_column(String(255), nullable=False)
    role: Mapped[str] = mapped_column(String(50), default="analyst")
    created_at: Mapped[datetime] = mapped_column(
        DateTime(timezone=True), default=lambda: datetime.now(timezone.utc)
    )

    organization: Mapped["Organization"] = relationship(back_populates="users")

class TenantVerification(Base):
    __tablename__ = "tenant_verifications"

    id: Mapped[uuid.UUID] = mapped_column(primary_key=True, default=uuid.uuid4)
    organization_id: Mapped[uuid.UUID] = mapped_column(ForeignKey("organizations.id"), nullable=False)
    tenant_phone_hash: Mapped[Optional[str]] = mapped_column(String(64), nullable=True)
    passport_hash: Mapped[Optional[str]] = mapped_column(String(64), nullable=True)
    status: Mapped[str] = mapped_column(String(32), default="PENDING", index=True)
    risk_score: Mapped[Optional[int]] = mapped_column(Integer, nullable=True)
    summary_data_json: Mapped[Optional[dict]] = mapped_column(JSON, nullable=True)
    created_at: Mapped[datetime] = mapped_column(
        DateTime(timezone=True), default=lambda: datetime.now(timezone.utc)
    )
    completed_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True), nullable=True)

    organization: Mapped["Organization"] = relationship(back_populates="verifications")
    statement_metadata: Mapped[Optional["BankStatementMetadata"]] = relationship(
        back_populates="verification", uselist=False
    )

class BankStatementMetadata(Base):
    __tablename__ = "bank_statement_metadata"

    id: Mapped[uuid.UUID] = mapped_column(primary_key=True, default=uuid.uuid4)
    verification_id: Mapped[uuid.UUID] = mapped_column(ForeignKey("tenant_verifications.id"), nullable=False)
    is_vector_pdf: Mapped[bool] = mapped_column(Boolean, default=False)
    open_banking_connected: Mapped[bool] = mapped_column(Boolean, default=False)
    monthly_income: Mapped[float] = mapped_column(Numeric(12, 2), default=0.0)
    stability_index: Mapped[float] = mapped_column(Numeric(3, 2), default=0.0)
    created_at: Mapped[datetime] = mapped_column(
        DateTime(timezone=True), default=lambda: datetime.now(timezone.utc)
    )

    verification: Mapped["TenantVerification"] = relationship(back_populates="statement_metadata")

class ImmutableAuditLog(Base):
    __tablename__ = "immutable_audit_logs"

    id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=True)
    organization_id: Mapped[uuid.UUID] = mapped_column(ForeignKey("organizations.id"), nullable=False)
    user_id: Mapped[Optional[uuid.UUID]] = mapped_column(ForeignKey("users.id"), nullable=True)
    action: Mapped[str] = mapped_column(String(100), nullable=False)
    resource: Mapped[str] = mapped_column(String(255), nullable=False)
    prev_hash: Mapped[str] = mapped_column(String(64), nullable=False)
    log_hash: Mapped[str] = mapped_column(String(64), nullable=False, unique=True)
    created_at: Mapped[datetime] = mapped_column(
        DateTime(timezone=True), default=lambda: datetime.now(timezone.utc)
    )

    @staticmethod
    def compute_hash(prev_hash: str, org_id: uuid.UUID, user_id: Optional[uuid.UUID], action: str, resource: str, timestamp: str) -> str:
        payload = f"{prev_hash}|{org_id}|{user_id or 'SYSTEM'}|{action}|{resource}|{timestamp}"
        return hashlib.sha256(payload.encode("utf-8")).hexdigest()

4. Конвейер обработки документов и Скоринга

4.1 Sequence Diagram: Сценарий верификации арендатора (Mermaid)

sequenceDiagram
    autonumber
    actor Tenant as Арендатор (Mobile)
    actor Landlord as Лендлорд / УК (Dashboard)
    participant API as FastAPI Gateway
    participant WS as WebSocket Hub
    participant Queue as Taskiq Queue
    participant PDF as PDF Analyzer Service
    participant Engine as Scoring Engine
    participant DB as SQLCipher DB

    Landlord->>API: POST /api/v1/verifications (Создание сессии)
    API->>DB: Сохранение сессии (PENDING)
    API-->>Landlord: 201 Created + Onboarding Link & WS Auth Token
    Landlord->>WS: Подключение к /api/v1/verifications/{id}/status

    Tenant->>API: POST /api/v1/verifications/{id}/documents/passport
    API->>API: Соленое хэширование ПДн (Salted SHA-256)
    API->>DB: Запись passport_hash, удаление фотки из RAM

    Tenant->>API: POST /api/v1/verifications/{id}/documents/bank-statement
    API->>API: Сохранение PDF во временный RAM-диск (/tmpfs)
    API->>Queue: Публикация задачи "process_verification"
    API-->>Tenant: 202 Accepted (Загрузка завершена)

    Queue->>PDF: Извлечение PDF из RAM
    PDF->>PDF: Валидация векторных слоев и шрифтов банк-клиента
    alt Растровый или сканированный PDF
        PDF->>Engine: is_vector_pdf = False
    else Истинный векторный PDF
        PDF->>Engine: is_vector_pdf = True
    end
    PDF->>PDF: Безвозвратный wipe PDF-файла из RAM

    Engine->>Engine: Расчет Stability Index, Monthly Income, Risk Score
    Engine->>DB: Сохранение BankStatementMetadata & TenantVerification (COMPLETED)
    Engine->>DB: Запись записи в ImmutableAuditLog (расчет prev_hash -> log_hash)
    
    Engine->>WS: Отправка ивента status=COMPLETED, risk_score
    WS-->>Landlord: WebSocket Event: Скоринг завершен (< 60 сек)
    Engine->>Landlord: Webhook Notification (если зарегистрирован)

4.2 Алгоритм детекции фрода и векторного анализа PDF

Модуль pdf_analyzer.py проводит проверку подлинности PDF без обращения к сторонним облачным сервисам:

  1. Проверка слоя текстов (Vector vs Scan): Выполняется извлечение векторных примитивов и текстовых объектов (pdfminer / fitz). Если PDF содержит только растровые изображения (изображение скана / фото) — параметр is_vector_pdf устанавливается в False.
  2. Анализ метаданных шрифтов и программ создания: Наличие некорректных встроенных шрифтов, следов редактирования в графических редакторах (Photoshop, Canva, Acrobat Reader) помечает документ флажком фрода.
  3. Штрафные баллы скоринга: Документы с is_vector_pdf == False автоматически снижают финансовый балл доверия, устанавливая статус итоговой сессии в категории High Risk (Risk Score >= 75).

5. Спецификация API Контрактов

5.1 REST Endpoints

1. POST /api/v1/verifications

Создание новой сессии скоринга управляющей компанией.

  • Latency Guarantee: < 200ms
  • Request:
{
  "tenant_reference_id": "REQ-2026-0904-01"
}
  • Response (201 Created):
{
  "verification_id": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
  "status": "PENDING",
  "onboarding_url": "https://rentguard.app/onboard/9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
  "websocket_url": "wss://rentguard.app/api/v1/verifications/9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d/status",
  "created_at": "2026-09-04T11:15:00Z"
}
2. POST /api/v1/verifications/{id}/documents/passport

Загрузка документа арендатором. Выполняет моментное соленое хэширование ПДн в RAM.

  • Request: multipart/form-data (file: photo_bytes, phone: string)
  • Response (200 OK):
{
  "verification_id": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
  "passport_hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
  "tenant_phone_hash": "a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e",
  "status": "PASSPORT_UPLOADED"
}
3. POST /api/v1/verifications/{id}/documents/bank-statement

Загрузка PDF-выписки банк-клиента. Файл помещается исключительно в tmpfs.

  • Request: multipart/form-data (file: pdf_bytes)
  • Response (202 Accepted):
{
  "verification_id": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
  "status": "PROCESSING",
  "message": "Выписка принято в обработку. Ожидайте результаты по WebSocket."
}
4. GET /api/v1/verifications/{id}/status

Получение текущего статуса обработки и WebSocket-хэндшейка.

  • Response (200 OK):
{
  "verification_id": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
  "status": "PROCESSING",
  "progress_percent": 65,
  "elapsed_seconds": 12
}
5. GET /api/v1/verifications/{id}/report

Запрос итогового отчета скоринга и вычисленных показателей.

  • Response (200 OK):
{
  "verification_id": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
  "status": "COMPLETED",
  "risk_score": 18,
  "risk_category": "LOW_RISK",
  "bank_metadata": {
    "is_vector_pdf": true,
    "open_banking_connected": false,
    "monthly_income": 185000.00,
    "stability_index": 0.92
  },
  "summary": {
    "affordability_ratio": 0.31,
    "gambling_transactions_detected": false,
    "microfinance_loans_detected": false
  },
  "completed_at": "2026-09-04T11:15:38Z"
}
6. POST /api/v1/webhooks/subscriptions

Регистрация эндпоинта управляющей компании для получения событий о готовности отчета.

  • Request:
{
  "target_url": "https://pms.landlord.ru/api/rentguard-callback",
  "secret_token": "whsec_9a8b7c6d5e4f3a2b1c0d"
}
  • Response (201 Created):
{
  "subscription_id": "sub_01hj89a2b3c4d5e6f7g8",
  "target_url": "https://pms.landlord.ru/api/rentguard-callback",
  "status": "ACTIVE"
}

5.2 Протокол WebSocket

  • Endpoint: WS /api/v1/verifications/{id}/status?token={ws_token}
  • Формат сообщений сервера:
{
  "event": "VERIFICATION_PROGRESS",
  "data": {
    "step": "ANALYZING_PDF_VECTORS",
    "progress_percent": 40,
    "time_remaining_sec": 35
  }
}

6. Структура Проекта

Структура репозитория строго разделена на независимые слои backend и frontend.

rentguard/
├── rentguard-backend/
│   ├── app/
│   │   ├── main.py                     # Инициализация FastAPI приложения, ASGI роутов и CORS
│   │   ├── core/
│   │   │   ├── config.py               # Settings (Pydantic BaseSettings), env переменные
│   │   │   └── security.py             # Соленое хэширование (SHA-256), генерация токенов
│   │   ├── db/
│   │   │   ├── session.py              # Async Engine SQLAlchemy + SQLCipher connection handler
│   │   │   └── models.py               # ORM Модели (Organization, User, Verification, AuditLog)
│   │   ├── api/
│   │   │   └── v1/
│   │   │       ├── router.py           # Главный роутер API v1
│   │   │       └── endpoints/
│   │   │           └── verifications.py# Эндпоинты для сессий, документооборота и статусов
│   │   └── services/
│   │       ├── scoring_engine.py       # Алгоритм финансового скоринга и расчета индексов
Журнал решений DECISION_LOG.md

Журнал решений консилиума — RentGuard

Что оспорил Devil's Advocate и что решил Арбитр. Каждый риск получил вердикт; границы ниже — результат спора, а не первого черновика.

Non-Goals по версии стратега

  • Разработка полноценной PMS-системы для полного цикла управления недвижимостью (учет ремонтов, ключей, клининга)
  • Оказание риелторских услуг и маркетплейс поиска жилья для арендаторов
  • Прямое страхование арендных платежей и финансовое поручительство
  • Оказание услуг юридического выселения недобросовестных жильцов

Non-Goals после арбитража

  • Разработка полноценной PMS-системы (учет ремонтов, ключей, клининга, сбор коммунальных платежей)
  • Оказание риелторских услуг и создание маркетплейса поиска жилья для арендаторов
  • Прямое страхование арендных платежей, предоставление финансовых гарантий и поручительства
  • Автоматизированное формирование юридических исков и юридическое сопровождение судебного выселения недобросовестных жильцов
  • Ведение и публикация централизованных черных списков неплательщиков или межоператорский обмен негативными списками арендаторов

Добавлено арбитром:

  • Разработка полноценной PMS-системы (учет ремонтов, ключей, клининга, сбор коммунальных платежей)
  • Оказание риелторских услуг и создание маркетплейса поиска жилья для арендаторов
  • Прямое страхование арендных платежей, предоставление финансовых гарантий и поручительства
  • Автоматизированное формирование юридических исков и юридическое сопровождение судебного выселения недобросовестных жильцов
  • Ведение и публикация централизованных черных списков неплательщиков или межоператорский обмен негативными списками арендаторов

Снято арбитром:

  • Разработка полноценной PMS-системы для полного цикла управления недвижимостью (учет ремонтов, ключей, клининга)
  • Оказание риелторских услуг и маркетплейс поиска жилья для арендаторов
  • Прямое страхование арендных платежей и финансовое поручительство
  • Оказание услуг юридического выселения недобросовестных жильцов

Решения по рискам

| # | risk | decision | action | | - | - | - | - | | 1 | Обход ML-антифрода путем распечатки и последующего сканирования поддельной выписки (Print-and-Scan attack), уничтожающий цифровые следы редактирования PDF | смягчено (добавлен инвариант) | Маркировать все растровые сканы выписок как High Risk и запрашивать оригинал цифрового PDF из интернет-банка или Open Banking. | | 2 | Массовый отказ кандидатов от прохождения верификации при требовании загрузки детальных банковских выписок или подключения Open Banking | смягчено (добавлен инвариант) | Внедрить гранулярный шеринг данных, показывающий кандидату агрегированный cash flow без отображения детальных наименований транзакций. | | 3 | Юридические иски со стороны арендаторов при внесении их в 'черные списки' платформы без вступившего в силу решения суда | принято (скоуп изменён) | Запретить ведение централизованных черных списков арендаторов и зафиксировать этот запрет в Non-Goals. | | 4 | Низкая конверсия в оплату Application Fee кандидатами в условиях высокой конкуренции среди лендлордов на рынке аренды | отклонено | Модель распределения расходов выбирается клиентом; B2B-подписка для УК является приоритетной моделью монетизации. | | 5 | Трансформация продукта в страховой сервис (Rent Guarantee Insurance) из-за давления клиентов при наступлении дефолтов у 'одобренных' жильцов | принято (скоуп изменён) | Прямой выкуп финансовых рисков и страхование выплат внесены в финальный список Non-Goals. | | 6 | Разработка юридического модуля автоматического формирования исков и сопровождения выселения неплательщиков | принято (скоуп изменён) | Формирование исков и сопровождение выселения прямо отнесены к Non-Goals. | | 7 | Постепенное разрастание до полноценной PMS-системы (учет ремонтов, сбор платежей, коммуналка) по запросам крупных УК | принято (скоуп изменён) | Сохранить строгий Non-Goal на разработку функций PMS-систем. |

Обоснование арбитра: RentGuard имеет четкую ценность в борьбе с PDF-фродом и снижением риска дефолта. Однако заявленное требование 100% детекции технически невыполнимо при Print-and-Scan атаках, а централизованные черные списки создают фатальные правовые риски. Зафиксировав рамки продукта как вероятностную оценку риска и исключив нецелевые функции (PMS, страхование, юридические иски), мы сохраняем высокую маржинальность Micro-SaaS и защищаем компанию от регуляторных претензий.

Уровень разногласий: 0.35

Хотите зафиксировать границы своего проекта? Спроектировать архитектуру в LUMIS Studio
LUMIS Studio · 2026