fix(devops): cleanup-merged-worktrees.sh — 3 бага, найденные вживую на 69 забытых worktree #2418
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
вторичка
ИРД
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#2418
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/cleanup-worktrees-script-bugs"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Находка
.claude/worktrees/накопил 69 забытых worktree (никогда не расчищались) — при разборе нашёл, что штатныйscripts/cleanup-merged-worktrees.shне работал вообще ни разу из-за трёх независимых багов:forgejo— этот и, видимо, не только этот чекаут используетorigin. Скрипт падал на первой команде.git merge-base --is-ancestor branch mainнесовместим со squash-merge конвенцией репо — squash создаёт НОВЫЙ коммит в main, оригинальный коммит ветки никогда не становится предком, даже если PR давно смержен. Проверил вживую:fix/browser-semaphore-doc-1347(ветка удалена с remote — значит смержена и подчищена) ancestor-check показывал «не смержено». Это системная, а не единичная проблема — так проверка ошибается на КАЖДОЙ смерженной ветке.--force(одинарный) недостаточен для worktree, залоченного супервизором Claude Code — нужен-f -f(двойной force: снять lock + подтвердить удаление).Фикс
forgejo, если есть, иначеorigin).delete_branch:trueпри мерже, см. git-pr.md).-f -fвместо одинарного--force.Классификация по факту (сегодня, 69 worktree)
Важно: сама очистка НЕ проведена этим PR
Попытка
git worktree remove -f -fиз текущей оркестраторской сессии (обычный Bash-тул) не сработала даже после диагностики и починки логики — подозреваю намеренную защиту harness-managed состояния.claude/worktrees/от обычных shell-команд. Задокументировано в шапке скрипта: реальный запуск нужен либо из терминала вне активной Claude Code сессии, либо черезCtrl+Xдважды в agent view.Проверка
bash -nсинтаксис ОК. Логику (remote-detect, dirty-gate, remove с -f -f) проверил вручную построчно на реальных 69 worktree перед тем, как переносить в скрипт — числа выше получены этой самой логикой.Refs #2416 (смежная находка по deploy-obsidian.yml в этом же расследовании).