docs(ptica): докстрока не обещает защиты, которой нет, и не шлёт на мёртвый хост (#2464) #2988

Merged
bot-backend merged 1 commit from fix/2464-tep-docstring into main 2026-08-20 17:58:21 +00:00
Collaborator

Расхождение

_page_contains_table документировалась так:

Требуем явный caption «Таблица N» — hint-только режим (оглавление, перекрёстные ссылки) даёт false positive и подавляется.

Тело функции:

cap = _TABLE_CAPTION_RE[table_no]
return bool(cap.search(text))

Подавления здесь никогда не было. Обещание защиты, которой нет, опаснее её отсутствия: читающий не станет её добавлять.

Замер уточнил и сам пункт эпика

Пункт #2464 приводил как пример false positive фразу «показатели приведены в таблице 12». Проверил — регекс её не ловит:

True   'СОДЕРЖАНИЕ\nТаблица 11 Баланс территории .......... 34'
False  'Основные показатели приведены в таблице 12 записки.'
False  'см. Таблицу 12 ниже'
False  'Данные в табл. 12'
True   'Таблица 12 — Технико-экономические показатели'
False  'Никаких таблиц тут нет'

Паттерн требует именительное «Таблица N», поэтому косвенные падежи мимо. Опасно ровно оглавление — там падеж тот же именительный, и строка «Таблица 11 Баланс территории ..... 34» от подписи неотличима.

Это зафиксировано характеризующим тестом, чтобы следующая попытка подавления целилась в признаки оглавления (точки-выноски, номер страницы в конце строки, несколько подписей на странице), а не в падежи.

Почему правится докстрока, а не код

Подавление не реализовано сознательно:

ekb_ppt_tep на проде:            0 строк
_SEED_DOCS.url:                  «# VERIFY URL: …» — заглушка, ingest скипает с WARNING

Живых PDF нет, эвристику отсева не на чем откалибровать. Правило, придуманное без образцов, ловит ровно те случаи, которые придумали вместе с ним — этого я стараюсь не делать.

Побочная находка: комментарий отправлял на мёртвый хост

Комментарий сида называл gisogd.ekburg.ru местом, «где лежит реальный URL пояснительной записки», и предлагал искать документ вручную через UI. Этот хост не существует — DNS не резолвит его ни с рабочей машины, ни с прод-хоста (20.08.2026):

curl: (6) Could not resolve host: gisogd.ekburg.ru

Живой портал ГИСОГД Свердловской области — gisogd66.midural.ru (его использует загрузчик РНС/РВЭ). В комментарий добавлено, как перечислять его разделы: /api/v1/{schema}/gisogddocgroups/{razdel}; razdel3/4/5 отдают «Генеральный план», «Местные нормативы», «Правила землепользования и застройки». Точный раздел ППТ ещё предстоит найти (#1136).

Именно эта разведка привела к #2986 — там нашлось, что ключ gisogd_permits теряет 23.9 % реестра.

Как проверено

  • Двусторонне: против origin/main два гейта красные — «докстрока обещает подавление, а в теле только поиск подстроки» и «комментарий сида не предупреждает, что хост мёртв».
  • Контроль от вычёркивания: test_docstring_names_the_actual_behaviour требует, чтобы докстрока честно называла false positive. Просто убрать неудобную фразу — не починка: молчание читается как «всё хорошо».
  • Характеризующий тест фиксирует фактическое поведение на шести формах; зелёный с обеих сторон.
  • Гейт ищет обещание по слову, поэтому старая формулировка в докстроке пересказана, а не процитирована — иначе он не отличил бы цитату от утверждения. Оговорено прямо в тексте докстроки (я на это наступил при написании).
  • pytest backend/tests/services/scrapers/ — 336 passed, 6 skipped.

Часть эпика #2464.

## Расхождение `_page_contains_table` документировалась так: > Требуем явный caption «Таблица N» — hint-только режим (оглавление, перекрёстные ссылки) даёт false positive **и подавляется**. Тело функции: ```python cap = _TABLE_CAPTION_RE[table_no] return bool(cap.search(text)) ``` Подавления здесь никогда не было. Обещание защиты, которой нет, опаснее её отсутствия: читающий не станет её добавлять. ## Замер уточнил и сам пункт эпика Пункт #2464 приводил как пример false positive фразу «показатели приведены в таблице 12». Проверил — регекс её **не ловит**: ``` True 'СОДЕРЖАНИЕ\nТаблица 11 Баланс территории .......... 34' False 'Основные показатели приведены в таблице 12 записки.' False 'см. Таблицу 12 ниже' False 'Данные в табл. 12' True 'Таблица 12 — Технико-экономические показатели' False 'Никаких таблиц тут нет' ``` Паттерн требует именительное «Таблица N», поэтому косвенные падежи мимо. **Опасно ровно оглавление** — там падеж тот же именительный, и строка «Таблица 11 Баланс территории ..... 34» от подписи неотличима. Это зафиксировано характеризующим тестом, чтобы следующая попытка подавления целилась в признаки оглавления (точки-выноски, номер страницы в конце строки, несколько подписей на странице), а не в падежи. ## Почему правится докстрока, а не код Подавление не реализовано сознательно: ``` ekb_ppt_tep на проде: 0 строк _SEED_DOCS.url: «# VERIFY URL: …» — заглушка, ingest скипает с WARNING ``` Живых PDF нет, эвристику отсева не на чем откалибровать. Правило, придуманное без образцов, ловит ровно те случаи, которые придумали вместе с ним — этого я стараюсь не делать. ## Побочная находка: комментарий отправлял на мёртвый хост Комментарий сида называл `gisogd.ekburg.ru` местом, «где лежит реальный URL пояснительной записки», и предлагал искать документ вручную через UI. Этот хост **не существует** — DNS не резолвит его ни с рабочей машины, ни с прод-хоста (20.08.2026): ``` curl: (6) Could not resolve host: gisogd.ekburg.ru ``` Живой портал ГИСОГД Свердловской области — `gisogd66.midural.ru` (его использует загрузчик РНС/РВЭ). В комментарий добавлено, как перечислять его разделы: `/api/v1/{schema}/gisogddocgroups/{razdel}`; razdel3/4/5 отдают «Генеральный план», «Местные нормативы», «Правила землепользования и застройки». Точный раздел ППТ ещё предстоит найти (#1136). Именно эта разведка привела к #2986 — там нашлось, что ключ `gisogd_permits` теряет 23.9 % реестра. ## Как проверено - **Двусторонне:** против `origin/main` два гейта красные — «докстрока обещает подавление, а в теле только поиск подстроки» и «комментарий сида не предупреждает, что хост мёртв». - **Контроль от вычёркивания:** `test_docstring_names_the_actual_behaviour` требует, чтобы докстрока честно называла false positive. Просто убрать неудобную фразу — не починка: молчание читается как «всё хорошо». - **Характеризующий тест** фиксирует фактическое поведение на шести формах; зелёный с обеих сторон. - Гейт ищет обещание по слову, поэтому старая формулировка в докстроке **пересказана, а не процитирована** — иначе он не отличил бы цитату от утверждения. Оговорено прямо в тексте докстроки (я на это наступил при написании). - `pytest backend/tests/services/scrapers/` — 336 passed, 6 skipped. Часть эпика #2464.
bot-backend added 1 commit 2026-08-20 17:37:13 +00:00
docs(ptica): докстрока не обещает защиты, которой нет, и не шлёт на мёртвый хост (#2464)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / changes (pull_request) Successful in 10s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 2m10s
CI / backend-tests (pull_request) Successful in 17m21s
3267120499
`_page_contains_table` документировалась как «hint-только режим (оглавление,
перекрёстные ссылки) даёт false positive и подавляется». Кода подавления в
функции никогда не было — это `bool(cap.search(text))`. Обещание защиты,
которой нет, опаснее её отсутствия: читающий не станет её добавлять.

Замер уточнил и сам пункт эпика. Приведённый в нём пример перекрёстной
ссылки «показатели приведены в таблице 12» регекс НЕ ловит: он требует
именительное «Таблица N», поэтому «в таблице 12», «см. Таблицу 12»,
«табл. 12» дают False. Опасно ровно ОГЛАВЛЕНИЕ — там падеж тот же
именительный, и «Таблица 11 Баланс территории ..... 34» неотличима от
подписи. Это зафиксировано характеризующим тестом, чтобы следующая
попытка подавления целилась в признаки оглавления (точки-выноски, номер
страницы в конце), а не в падежи.

Подавление здесь не реализовано сознательно: `ekb_ppt_tep` на проде пуста
(0 строк), URL в `_SEED_DOCS` — заглушка, живых PDF нет. Эвристику отсева
не на чем откалибровать, а правило, придуманное без образцов, ловит ровно
те случаи, которые придумали вместе с ним.

Отдельно исправлен комментарий сида: хост `gisogd.ekburg.ru`, названный
там местом, «где лежит реальный URL», НЕ СУЩЕСТВУЕТ — DNS не резолвит его
ни с рабочей машины, ни с прод-хоста (20.08.2026). Комментарий отправлял
искать документ на портале, которого нет. Назван живой портал
`gisogd66.midural.ru` и способ перечислить его разделы.

Двусторонне: против origin/main два гейта красные — «докстрока обещает
подавление, а в теле только поиск подстроки» и «комментарий сида не
предупреждает, что хост мёртв». Характеризующие тесты зелёные с обеих
сторон: они фиксируют фактическое поведение, а контроль
test_docstring_names_the_actual_behaviour ловит «починку» через
вычёркивание неудобной фразы.

Гейт ищет обещание по слову, поэтому старая формулировка в докстроке
пересказана, а не процитирована — иначе он не отличил бы цитату от
утверждения; это оговорено прямо в тексте.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bot-backend merged commit 5aebc91f13 into main 2026-08-20 17:58:21 +00:00
Sign in to join this conversation.
No reviewers
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#2988
No description provided.