# v3.0.0 — универсальная архитектура (2026-07-12) Переход на Markdown-пайплайн + универсальное LLM-обнаружение. ## Что изменилось ### 1. `generators/fallback.py` — новый Character-class preserving замена для неизвестных типов сущностей. Цифры→цифры, буквы→буквы, спецсимволы→без изменений. ### 2. `scanner.py` — универсальный LLM-промпт - Убран жёсткий список типов (person, company, address, passport) - LLM САМА придумывает тип (snake_case) — person_name, contract_number, employee_id... - Если тип не совпадает с известными — fallback-генератор - Промпт на английском (LLM точнее) ### 3. `extractor.py` — Markdown-пайплайн - `docx_to_markdown()`: DOCX → MD (Heading → #, Bold → **, таблицы → |...|) - `pdf_to_markdown()`: PDF → MD (текст + таблицы, без форматирования) - `extract_text()` возвращает только str (без docx-объектов) - Удалён `convert_pdfs_to_docx()` (PDF → MD напрямую) ### 4. `replacer.py` — упрощён - Удалён `replace_in_text()` (заменён на `apply_replacements()` + `.encode()`) - Оставлен `replace_in_docx()` для будущего DOCX-выхода ### 5. `obfuscator.py` — новый пайплайн - Pass 1: extract MD → scan_regex + scan_llm_ner - Pass 2: apply_replacements к MD → .md файлы - Нет docx-объектов, нет convert_pdfs_to_docx ## Коммиты - `579f9c8` — generators: fallback.py - `2ceeb05` — scanner.py: универсальный промпт - `af2f2a9` — extractor.py: MD + obfuscator.py: новый пайплайн - `f5427b0` — replacer.py: удалён replace_in_text - `2a2cc14` — v3.0.0 ## Плюсы - LLM точнее (нет XML-шума, только Markdown) - Новые типы сущностей — без правки кода - Код проще: -120 строк, -1 функция, -1 модуль (convert_pdfs_to_docx) - Единый внутренний формат (Markdown)