# Зависания и грязный main То, на чём оркестрация этой сессии ломалась. Не чинить «на всякий случай» — только когда симптом совпал. ## Транскрипт Живой агент, а в jsonl только стартовый user-промпт и «читаю скилл» / `GetMcpTools` — он не работает. После `interrupt` снова одна строка — повторный завис. Не поллить транскрипты без повода: completion, «завис», «продолжай», тишина заметно дольше обычной фазы. ## MCP `GetMcpTools` на `cursor-app-control` и ожидание echovault держали агента полчаса. В промпте: **не открывай этот сервер через `GetMcpTools`**. После готового worktree можно один `move_agent_to_root` с известной схемой `{ rootPath }`. Memory — один раз или без неё. ## Interrupt Короткий промпт: не начинай с нуля, брось MCP, вот ветка и worktree, вот незакоммиченное, которое нельзя выкинуть. Длинный повтор всего скилла снова вешает. Два зависания подряд — старый уступает («git не трогай»), новый — продолжение того же 🔄: та же `phase/-*` и тот же worktree, статус не сбрасывать. Это не новый захват ⬜ и не второй автор. Пинает координатор, не отдельный агент. ## Worktree Путь **вне** репозитория. `node_modules` копировать из основного дерева или `npm ci`; копия worktree внутрь себя забивает диск. `git worktree remove --force` после merge; каталог с битым `node_modules` может остаться — prune. Первая сборка в worktree длинная — это не завис. `git branch phase/-` без `main` берёт HEAD IDE. Коммит 🔄 «в основном дереве» на `bug/…` оставляет заявку в истории бага, а worktree иногда так и не появляется — агент пишет фазу в дерево пользователя. Лечение: interrupt, не `checkout`, `worktree add` на уже существующую `phase/-*`, 🔄 донести на `main` через `wt-claim-main`. Коммиты на `bug/…` не revert. Правки после захвата — только абсолютным путём worktree. ## Грязный main и чужая ветка `merge/lock` общий: фаза, баг, ревью, side. Чужой — ждать, не снимать. phase-work не сливает, если `status --porcelain` непустой. Портреты, SwarmUI, чужой WIP на карточке блокировали 32/36/35/38/41. Основное дерево должно уже стоять на `main`. Если пользователь на `bug/…` — не `checkout main`: снимешь ему IDE. Merge-агент стоп, слот ждёт. Пользователь сказал «сливай» — stash `-u` своим сообщением, merge, pop только его. Pop с конфликтом: stash живёт, дерево не калечить. Не stash’ать файлы, которые пишет сосед в **основном** дереве (он обязан быть в worktree; если нет — merge-агент стоп и отчёт «main занят»). ## DLL и тесты хоста MSB3021/3027: процесс пользователя держит `HSchool.Server`. Не убивать. В отчёте: AppHost на main не пересобрался. Весь `dotnet test` solution из-за этого не гонять — и так не надо: только проект из Testing policy. После фазы сессии хостовые тесты логинятся в `ResetAsync`. Два игрока — две куки, не общий jar. `OpenSchool` / часы от гостя не доходят — сокет-тесты открывают школу **владельцем**. ## Клиент `npm test` на Windows иногда падает в параллели — `--maxWorkers=1`. `vitest` зелёный при мёртвом `tsc`: лови `npm run build` (дубликат ключа, неиспользуемый import). ## Pause / last wave Пауза: WIP-коммит на ветке фазы, worktree оставить, main не трогать. Продолжение: `resume` с хешем WIP, не `git branch` заново. «Остановись» / «закончи с этими»: текущие доводят merge, координатор **не** открывает следующую ⬜ по completion.