[Fable 5][P3] Snapshot-PDF: '—'-фоллбеки двойно экранируются автоэскейпом Jinja2 — в PDF печатается литеральный текст «—» #1234

Closed
opened 2026-06-13 04:49:47 +00:00 by bot-backend · 0 comments
Collaborator

Из армейского ревью Claude Fable 5 (2026-06-11)

Confirmed by 2/2 адверсариальных верификатора, severity P3 (correctness), confidence 0.85.

Файл

backend/app/templates/parcel_snapshot.html:140

Evidence (цитата кода)

<strong>{{ cad_num }}</strong><br/>
    {{ district or '&mdash;' }}<br/>
    {{ address or '&mdash;' }}

Why bug

snapshot_pdf.py создаёт Environment с select_autoescape(["html"]) — строковый литерал '—' в выражении экранируется в '&mdash;' (проверено локально). В клиентском PDF для любого пустого поля (district, address, land_category, vri, last_update, имя POI, comm_name/dev_name/obj_class конкурента — строки 140-141, 158, 162, 166, 187, 215-218) печатается мусор «—» вместо тире. NULL-поля в cad_parcels — обычный случай, дефект виден почти в каждом PDF.

Suggested fix

Заменить во всех фоллбеках шаблона HTML-сущность '—' на сам символ '—' (файл UTF-8): {{ district or '—' }}. Попутно: {{ flat_count or '—' }} прячет легитимный 0.

Verify notes

  • [real/P3] Воспроизведено на реальном шаблоне с прод-конфигом: select_autoescape(["html"]) + get_template("parcel_snapshot.html") → autoescape=True; при NULL district/address/land_category/vri, пустом poi.name и NULL-полях конкурента '—' экранируется в '&mdash;' (9 вхождений: строки 140-141,158,162,187,215-218). WeasyPrint разэкранирует один раз → в PDF литеральный текст «—». Поправка: строка 166 не затронута — Python передаёт реальное «—». Косметика в клиентском PDF — P3.
  • [real/P3] Подтверждено эмпирически рендером реального шаблона через venv проекта: autoescape для .html экранирует строковые литералы в выражениях → 9 мест дают '&mdash;', в PDF — литеральный текст «—». Защит нет: district явно None без геометрии (parcels.py:3419), address/vri/land_category — сырые nullable-колонки, POI name → "" (falsy). Защищён только last_update (Python отдаёт «—»). Косметика клиентского PDF без security/data-импакта → P3.

Provenance

  • Finders: services-misc
  • Confidence: 0.85
  • Originally batched at: main@d796027
## Из армейского ревью Claude Fable 5 (2026-06-11) Confirmed by 2/2 адверсариальных верификатора, severity **P3** (correctness), confidence 0.85. ## Файл [`backend/app/templates/parcel_snapshot.html:140`](backend/app/templates/parcel_snapshot.html:140) ## Evidence (цитата кода) ``` <strong>{{ cad_num }}</strong><br/> {{ district or '&mdash;' }}<br/> {{ address or '&mdash;' }} ``` ## Why bug snapshot_pdf.py создаёт Environment с select_autoescape(["html"]) — строковый литерал '&mdash;' в выражении экранируется в '&amp;mdash;' (проверено локально). В клиентском PDF для любого пустого поля (district, address, land_category, vri, last_update, имя POI, comm_name/dev_name/obj_class конкурента — строки 140-141, 158, 162, 166, 187, 215-218) печатается мусор «&mdash;» вместо тире. NULL-поля в cad_parcels — обычный случай, дефект виден почти в каждом PDF. ## Suggested fix Заменить во всех фоллбеках шаблона HTML-сущность '&mdash;' на сам символ '—' (файл UTF-8): {{ district or '—' }}. Попутно: {{ flat_count or '—' }} прячет легитимный 0. ## Verify notes - [real/P3] Воспроизведено на реальном шаблоне с прод-конфигом: select_autoescape(["html"]) + get_template("parcel_snapshot.html") → autoescape=True; при NULL district/address/land_category/vri, пустом poi.name и NULL-полях конкурента '&mdash;' экранируется в '&amp;mdash;' (9 вхождений: строки 140-141,158,162,187,215-218). WeasyPrint разэкранирует один раз → в PDF литеральный текст «&mdash;». Поправка: строка 166 не затронута — Python передаёт реальное «—». Косметика в клиентском PDF — P3. - [real/P3] Подтверждено эмпирически рендером реального шаблона через venv проекта: autoescape для .html экранирует строковые литералы в выражениях → 9 мест дают '&amp;mdash;', в PDF — литеральный текст «&mdash;». Защит нет: district явно None без геометрии (parcels.py:3419), address/vri/land_category — сырые nullable-колонки, POI name → "" (falsy). Защищён только last_update (Python отдаёт «—»). Косметика клиентского PDF без security/data-импакта → P3. ## Provenance - Finders: `services-misc` - Confidence: 0.85 - Originally batched at: main@d796027
bot-backend added the
Fable 5 ревью
label 2026-06-13 04:49:47 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#1234
No description provided.