## 1. Зависимость и фильтр - [x] 1.1 `pip install Markdown` в .venv, добавить в requirements.txt - [x] 1.2 Добавить Jinja2-фильтр `markdown` в `web/app.py` (экранирование HTML + nl2br + sane_lists) - [x] 1.3 Проверка: `python -c "from web.app import tpl; print(tpl.filters['markdown']('**b**'))"` — фильтр есть ## 2. Шаблоны - [x] 2.1 `candidates.html`: заменить `{{ (p.text or '')[:500] }}` на `{{ (p.text or '')[:2000] | markdown }}` - [x] 2.2 Проверить `published.html`/`metrics.html` — применить фильтр к тексту/анонсам при наличии - [x] 2.3 Проверка: пост с `**жирный**` и ссылкой отображается разметкой, а не сырым md ## 3. Безопасность и регресс - [x] 3.1 Тест XSS: `