Files
contracts-flask/History/opus-drhider-review-2026-06-29.md
T
naeel 4956ca1670
Deploy contracts-flask / validate (push) Successful in 0s
feat: DrHider MVP — two-pass document obfuscation service
2026-06-29 14:28:27 +04:00

75 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Запрос Opus — ревью реализации DrHider
Дата: 29.06.2026
## Контекст
Написан MVP сервиса обфускации документов. Код в трёх файлах. Нужно ревью: что упущено, что сломается, что улучшить.
## Файлы (все в contracts-flask)
1. **`deploy/services/drhider.py`** — ядро (≈280 строк)
2. **`site/templates/drhider.html`** — страница загрузки
3. **`site/app.py`** — добавлены роуты `/DrHider` и `POST /api/drhider`
## Что реализовано
### Двухпроходная обфускация
- **Проход 1 (сбор сущностей):** regex-паттерны (телефон, email, ИНН/ОГРН/КПП, БИК, р/с, к/с, паспорт) + COMPANY_PATTERN (ООО/ЗАО/АО/ИП) + опционально LLM-NER для имён/адресов.
- Глобальный словарь `_mapping[оригинал] = замена` обеспечивает согласованность: одна сущность → одна замена во всех файлах.
- **Проход 2 (замена):** docx — замена в `paragraphs.runs` и `tables.cells` (python-docx). PDF — read-only через pdfplumber, замена по тексту (без сохранения форматирования — осознанное ограничение MVP).
### Генераторы фиктивных значений
- Телефон: `+7 (XXX) XXX-XX-XX` с реальными кодами городов.
- Email: `<random>@example.ru` (фиктивные домены).
- ИНН/ОГРН: валидные контрольные суммы.
- Компании: ООО «<существительное>» из словаря.
- ФИО: русские фамилия + инициалы из словарей.
- Адреса: город + улица + дом из словарей.
- Паспорт: `XX XX XXXXXX`.
### Безопасность
- Вся обработка в памяти.
- Temp-директория для конвертации `.doc``.docx` — удаляется в `finally`.
- Никакой БД, никакого логирования реальных данных.
- `mapping.csv` — внутри ZIP, уходит пользователю.
### UI
- Drag&drop, выбор файлов, прогресс.
- Кнопка «Обфусцировать» → POST /api/drhider → скачивание ZIP.
## Вопросы к ревью
### 1. Согласованность замены
Сейчас `_mapping` — плоский словарь `строка → строка`. Если в одном файле «Иванов И.И.», а в другом «Иванов Иван Иванович» — это разные ключи, получат разные замены. Как правильно решить?
### 2. PDF
MVP: текст из PDF извлекается, заменяется, отдаётся как `.txt` внутри ZIP. Реальное решение — pymupdf (AGPL) или reportlab? Что посоветуешь?
### 3. .doc → .docx конвертация
Не реализована в этом MVP — файлы .doc просто читаются как текст. Нужно libreoffice (как в `convert_doc.py`) или есть способ проще?
### 4. LLM-NER
Сейчас опционален. Промпт просит JSON-массив сущностей. Не слишком ли медленно для 100+ файлов? Как оптимизировать?
### 5. Замена в docx через runs
python-docx разбивает текст на runs. Слово может быть разбито на несколько runs — замена ломается. Как обойти?
### 6. Номера договоров
Сейчас НЕ заменяются (нужны для группировки). Но это реальные данные — утечка. Как сделать чтобы были уникальные псевдонимы, но группировка не ломалась?
### 7. Упущенные типы данных
Что ещё нужно заменять, чего нет в текущих паттернах? (Колонтитулы? Сноски? Изображения с текстом? Подписи?)
### 8. Архитектура
Код в одном файле drhider.py — нормально для MVP или уже пора разбивать?
### 9. Edge cases
- Пустой файл?
- ZIP с вложенным ZIP?
- PDF без текста (сканированный)?
- Файл с паролем?
## Ожидаемый ответ
По каждому вопросу: **что не так → как исправить → приоритет (MVP/позже/опционально)**.