1. remote-alias хардкод 'forgejo' — этот чекаут использует 'origin', скрипт
падал на первой же команде. Автодетект вместо хардкода.
2. merge-check через 'git merge-base --is-ancestor branch main' структурно
несовместим со squash-merge конвенцией репо (git-pr.md): squash создаёт
НОВЫЙ коммит в main, оригинальный коммит ветки никогда не становится
предком — ancestor-check ложно-отрицателен на КАЖДОЙ смерженной ветке.
Заменено на надёжный прокси: ветка отсутствует на remote (конвенция репо
— всегда delete_branch:true при мерже).
3. 'git worktree remove --force' (одинарный) недостаточен для worktree,
залоченного супервизором Claude Code — нужен двойной '-f -f' (force
применяется дважды: снятие lock + подтверждение удаления).
Плюс dirty-gate: worktree с незакоммиченными TRACKED-изменениями (не просто
untracked-мусором вроде node_modules) теперь пропускается с явным SKIP —
не удаляется вслепую, если там могла остаться нерасхваченная работа.
Найдено вживую при диагностике: 69 worktree накопилось, 21 безопасны
(branch снят с remote + чистое дерево), 30 dirty (требуют разбора вручную),
13 всё ещё в работе (branch жив на remote). Само удаление НЕ проведено этим
коммитом — попытка force-remove из текущей сессии не сработала (см. комментарий
в скрипте про harness-managed worktree).