# 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)
