(low) cleanup-worktrees-aggressive.py fetch_all_prs: жёсткий лимит 30 страниц (1500 PR) может пометить ветку с PR за пределом как stale и удалить worktree #1493

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

Severity: low · Категория: logic · Файл: scripts/cleanup-worktrees-aggressive.py:78-112

cleanup-worktrees-aggressive.py:78-79 (цикл while page<=30, limit=50, state=all) ограничивает индекс PR 1500 новейшими. Если PR ветки оказался за этим пределом, prs.get(branch) вернёт None (172), и при age>=AGE_DAYS ветка уйдёт в 'stale' (188-190) → to_remove (198) → git worktree remove --force --force (207-208). Отсутствие PR из-за обрезанной пагинации неотличимо от реального 'нет PR'. Импакт ограничен: ветка и запушенные коммиты сохраняются, теряются только незакоммиченные изменения в worktree; опасно лишь при open-PR на старой ветке. Починка: убрать жёсткий потолок страниц — цикл уже корректно выходит по 'if not batch: break' (91-92), достаточно заменить 'while page <= 30' на 'while True'; либо опираться на заголовок X-Total-Count для контроля полноты.

Почему баг: Ветка попадает в to_remove если cat in {merged, closed, stale}. 'stale' назначается именно когда pr отсутствует (else-ветка, строки 183-190) и возраст >= порога. Отсутствие PR из-за обрезанной пагинации неотличимо от реального 'нет PR'. Импакт — потеря рабочего worktree с возможно несохранённой/непушнутой работой по старой, но открытой/смерженной ветке. При state=all 1500 — достижимый предел.

Как чинить: Не останавливаться по фиксированному page<=30, а крутить пока batch непустой (как и так есть break при пустом ответе) и убрать верхнюю границу или поднять её существенно; либо запрашивать state=open и отдельно проверять merged через PR-by-branch API. Минимум — логировать предупреждение при достижении лимита страниц.


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

**Severity:** low · **Категория:** logic · **Файл:** `scripts/cleanup-worktrees-aggressive.py:78-112` cleanup-worktrees-aggressive.py:78-79 (цикл while page<=30, limit=50, state=all) ограничивает индекс PR 1500 новейшими. Если PR ветки оказался за этим пределом, prs.get(branch) вернёт None (172), и при age>=AGE_DAYS ветка уйдёт в 'stale' (188-190) → to_remove (198) → git worktree remove --force --force (207-208). Отсутствие PR из-за обрезанной пагинации неотличимо от реального 'нет PR'. Импакт ограничен: ветка и запушенные коммиты сохраняются, теряются только незакоммиченные изменения в worktree; опасно лишь при open-PR на старой ветке. Починка: убрать жёсткий потолок страниц — цикл уже корректно выходит по 'if not batch: break' (91-92), достаточно заменить 'while page <= 30' на 'while True'; либо опираться на заголовок X-Total-Count для контроля полноты. **Почему баг:** Ветка попадает в to_remove если cat in {merged, closed, stale}. 'stale' назначается именно когда pr отсутствует (else-ветка, строки 183-190) и возраст >= порога. Отсутствие PR из-за обрезанной пагинации неотличимо от реального 'нет PR'. Импакт — потеря рабочего worktree с возможно несохранённой/непушнутой работой по старой, но открытой/смерженной ветке. При state=all 1500 — достижимый предел. **Как чинить:** Не останавливаться по фиксированному page<=30, а крутить пока batch непустой (как и так есть break при пустом ответе) и убрать верхнюю границу или поднять её существенно; либо запрашивать state=open и отдельно проверять merged через PR-by-branch API. Минимум — логировать предупреждение при достижении лимита страниц. --- <sub>deep-audit «армия ботов 2» · verify+harden, confidence 0.7 · unit U111</sub>
bot-backend added the
week ревью 1
label 2026-06-15 05:58:41 +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#1493
No description provided.