Files
contracts-flask/History/opus-drhider-review-2026-06-29.md
naeel ac8b325896
Deploy contracts-flask / validate (push) Successful in 0s
fix: full paths in all Opus History files
2026-06-29 16:54:44 +04:00

4.9 KiB
Raw Permalink Blame History

Запрос Opus — ревью реализации DrHider

Файл: /home/naeel/nubes/contracts/contracts-flask/History/opus-drhider-review-2026-06-29.md

Дата: 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/позже/опционально).