[Fable 5][P3] Разорванный переносом строки regex в _PLANNING_NO_MATCH_SQL: ветки «Донбасской» и «Лумумбы» никогда не матчатся #1230

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/services/site_finder/krt_lookup.py:79

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

      AND pp.full_name ~ '[кК][рР][тТ]|комплексн.*развити|Краснофлотцев|Донбасской
        |Шефской|Азина|Черкасской|Кварцевой|Летчиков|Вилонова|Лумумбы
        |Студенческой|Васильева|Гурзуфск|Бакинских|Шадринский|Бабушкина'

Why bug

SQL-литерал многострочный: перенос строки и 8 пробелов отступа входят в regex, ветки получаются 'Донбасской\n ' и 'Лумумбы\n ' (проверено извлечением литерала) — матчатся только при literal newline после топонима, т.е. никогда. Geom-only КРТ-fallback молча теряет ППТ по этим двум КРТ-территориям: parcel_krt_requisites вернёт [] вместо matched=False строк → в ИРД-блоке analyze КРТ-факт не показан.

Suggested fix

Собрать паттерн в одну строку: конкатенация литералов ('...|Донбасской' '|Шефской|...') или один литерал без переносов внутри кавычек.

Verify notes

  • [real/P3] Литерал извлечён через AST: ветки regex реально 'Донбасской\n ' и 'Лумумбы\n ' — | стоит в начале следующей строки SQL. PG ~ (POSIX ARE, без (?x)) считает NL/пробелы значимыми, однострочный full_name их не содержит → ветки мёртвые. Сценарий: ППТ «...в границах улицы Донбасской» без слова КРТ → exact-запрос пуст, fallback не матчит → [] вместо matched=False, ИРД-блок (ird_analyze.py:168) молча теряет КРТ-факт. 2 из 17 веток, инфо-fallback без чисел — P3.
  • [real/P3] Литерал извлечён программно: ветки = 'Донбасской\n ' и 'Лумумбы\n '; PG ~ (ARE, без (?x)) трактует \n+8 пробелов литерально — ветки мертвы. Защит нет: тесты мокают db.execute, нормализации нет. Топоним-ветки реально нужны (фикстуры: «…в районе улицы Краснофлотцев» без слова КРТ). Импакт смягчён: «комплексн.*развити» ловит современные КРТ-ППТ, сам ППТ виден через parcel_planning_overlaps (без regex), КРТ — через krt/opportunity_overlaps → P3.

Provenance

  • Finders: site-finder-A
  • 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/services/site_finder/krt_lookup.py:79`](backend/app/services/site_finder/krt_lookup.py:79) ## Evidence (цитата кода) ``` AND pp.full_name ~ '[кК][рР][тТ]|комплексн.*развити|Краснофлотцев|Донбасской |Шефской|Азина|Черкасской|Кварцевой|Летчиков|Вилонова|Лумумбы |Студенческой|Васильева|Гурзуфск|Бакинских|Шадринский|Бабушкина' ``` ## Why bug SQL-литерал многострочный: перенос строки и 8 пробелов отступа входят в regex, ветки получаются 'Донбасской\n ' и 'Лумумбы\n ' (проверено извлечением литерала) — матчатся только при literal newline после топонима, т.е. никогда. Geom-only КРТ-fallback молча теряет ППТ по этим двум КРТ-территориям: parcel_krt_requisites вернёт [] вместо matched=False строк → в ИРД-блоке analyze КРТ-факт не показан. ## Suggested fix Собрать паттерн в одну строку: конкатенация литералов ('...|Донбасской' '|Шефской|...') или один литерал без переносов внутри кавычек. ## Verify notes - [real/P3] Литерал извлечён через AST: ветки regex реально 'Донбасской\n ' и 'Лумумбы\n ' — | стоит в начале следующей строки SQL. PG ~ (POSIX ARE, без (?x)) считает NL/пробелы значимыми, однострочный full_name их не содержит → ветки мёртвые. Сценарий: ППТ «...в границах улицы Донбасской» без слова КРТ → exact-запрос пуст, fallback не матчит → [] вместо matched=False, ИРД-блок (ird_analyze.py:168) молча теряет КРТ-факт. 2 из 17 веток, инфо-fallback без чисел — P3. - [real/P3] Литерал извлечён программно: ветки = 'Донбасской\n ' и 'Лумумбы\n '; PG ~ (ARE, без (?x)) трактует \n+8 пробелов литерально — ветки мертвы. Защит нет: тесты мокают db.execute, нормализации нет. Топоним-ветки реально нужны (фикстуры: «…в районе улицы Краснофлотцев» без слова КРТ). Импакт смягчён: «комплексн.*развити» ловит современные КРТ-ППТ, сам ППТ виден через parcel_planning_overlaps (без regex), КРТ — через krt/opportunity_overlaps → P3. ## Provenance - Finders: `site-finder-A` - 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#1230
No description provided.