(low) check-no-print.py/normalize_path: rfind('backend/') матчит подстроку, а не сегмент пути #1495

Closed
opened 2026-06-15 05:58:42 +00:00 by bot-backend · 0 comments
Collaborator

Severity: low · Категория: logic · Файл: scripts/claude-hooks/check-no-print.py:35-40

check-no-print.py:38-40 — normalize_path делает idx = p.rfind('backend/') и обрезает путь с этой позиции. Поиск идёт по подстроке, поэтому суффикс другого каталога ('services-backend/', 'my-backend/') или вложенный 'backend/' (frontend/src/backend/) даёт norm, начинающийся с 'backend/'. Такой путь проходит startswith(WATCH_PATH_PREFIX) (строка 60) и попадает под запрет print(. Импакт: ложная блокировка Edit/Write на посторонних файлах (низкий, есть escape '# noqa'). Чинить: матчить именно сегмент пути — разбить Path(raw).parts и искать индекс компонента, равного 'backend', а не подстроку; например idx сегмента 'backend' в parts и собрать относительный путь от него.

Почему баг: WATCH_PATH_PREFIX='backend/' и проверка norm.startswith(...) рассчитаны на то, что 'backend/' — это корневой сегмент репозитория. Но rfind ловит любое вхождение подстроки, включая суффикс другого имени каталога ('-backend/') или вложенный каталог. Проверено эмпирически: '/Users/x/repo/services-backend/app/x.py' -> norm='backend/app/x.py' -> SCAN=True. Это меняет область действия хука: посторонние файлы внезапно подпадают под запрет print(.

Как чинить: Нормализовать через segment-aware логику: разбить путь на части (Path(raw).parts) и искать индекс компонента, равного 'backend', а не подстроку. Либо привязываться к корню репозитория (например, относительно known repo root), а не к rfind строки.


deep-audit «армия ботов 2» · verify+harden, confidence 0.9 · unit U112

**Severity:** low · **Категория:** logic · **Файл:** `scripts/claude-hooks/check-no-print.py:35-40` check-no-print.py:38-40 — normalize_path делает idx = p.rfind('backend/') и обрезает путь с этой позиции. Поиск идёт по подстроке, поэтому суффикс другого каталога ('services-backend/', 'my-backend/') или вложенный 'backend/' (frontend/src/backend/) даёт norm, начинающийся с 'backend/'. Такой путь проходит startswith(WATCH_PATH_PREFIX) (строка 60) и попадает под запрет print(. Импакт: ложная блокировка Edit/Write на посторонних файлах (низкий, есть escape '# noqa'). Чинить: матчить именно сегмент пути — разбить Path(raw).parts и искать индекс компонента, равного 'backend', а не подстроку; например idx сегмента 'backend' в parts и собрать относительный путь от него. **Почему баг:** WATCH_PATH_PREFIX='backend/' и проверка norm.startswith(...) рассчитаны на то, что 'backend/' — это корневой сегмент репозитория. Но rfind ловит любое вхождение подстроки, включая суффикс другого имени каталога ('-backend/') или вложенный каталог. Проверено эмпирически: '/Users/x/repo/services-backend/app/x.py' -> norm='backend/app/x.py' -> SCAN=True. Это меняет область действия хука: посторонние файлы внезапно подпадают под запрет print(. **Как чинить:** Нормализовать через segment-aware логику: разбить путь на части (Path(raw).parts) и искать индекс компонента, равного 'backend', а не подстроку. Либо привязываться к корню репозитория (например, относительно known repo root), а не к rfind строки. --- <sub>deep-audit «армия ботов 2» · verify+harden, confidence 0.9 · unit U112</sub>
bot-backend added the
week ревью 1
label 2026-06-15 05:58:42 +00:00
bot-backend added the
scope/backend
label 2026-06-15 11:02:13 +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#1495
No description provided.