5.0 KiB
5.0 KiB
Dev Report: ORCH-2 [S-4] git worktree per task
Дата: 2026-06-02 Статус: DONE
Задача
Каждая задача (ветка) работает в изолированной git worktree (/repos/_wt/<repo>/<branch>)
вместо общего /repos/<repo> — убрать гонки git checkout при двух активных задачах.
Сделано
- Task 1 —
src/git_worktree.py(_safe,get_worktree_path,ensure_worktree,remove_worktree) +config.worktrees_dir=/repos/_wt - Task 2 — launcher: ветка резолвится заранее →
ensure_worktree; cmd =cd <worktree>без checkout;_write_task_file(repo, branch, ...)пишет в worktree;_monitor_agentcommit/push в worktree (checkout убран); questions/conflict читаются из worktree - Task 3 — qg/checks:
_repo_path(repo, branch)helper; артефакт-чеки получили опц.branch;check_tests_local→ensure_worktree+make test; диспетчеры в launcher и webhooks/plane прокидываютbranch - Task 4 — webhooks/gitea ~152:
git branch -r --contains <sha>подтверждён read-only, оставлен в main clone (+ комментарий) - Task 5 — tests/test_git_worktree.py (9 tests, реальные git-репо в tmp); test_launcher обновлён; ARCHITECTURE.md + BUGFIXES_2026-06-02_ORCH2.md
- Task 6 — commit/push, PR #1, rebuild+deploy, тест изоляции пройден
Изменённые файлы
src/config.py— + worktrees_dirsrc/git_worktree.py(новый) — модуль worktreesrc/agents/launcher.py— launch/_write_task_file/_monitor_agent/_try_advance_stage → worktreesrc/qg/checks.py— worktree-aware артефакт-чеки + check_tests_localsrc/webhooks/plane.py— QG-диспетчер прокидывает branchsrc/webhooks/gitea.py— комментарий (read-only, без изменений логики)tests/test_git_worktree.py(новый),tests/test_launcher.pydocs/ARCHITECTURE.md,docs/BUGFIXES_2026-06-02_ORCH2.md
Результат
- Тесты (в контейнере через образ): 37 passed, 9 failed — 9 = pre-existing test_webhooks (401/signature), идентичны baseline на main (там 28 passed + те же 9). Мои изменения добавили 9 проходящих тестов (test_git_worktree) и ничего не сломали.
- test_git_worktree.py изолированно: 9 passed.
- Деплой: образ пересобран на feature-ветке,
docker compose up -d --build, health{"status":"ok"}. - Тест изоляции (в работающем контейнере):
- A: /repos/_wt/enduro-trails/feature_wt-test-A (branch feature/wt-test-A)
- B: /repos/_wt/enduro-trails/feature_wt-test-B (branch feature/wt-test-B)
- A≠B, branch A≠B → ISOLATION OK
- Shared
/repos/enduro-trailsНЕ мутированensure_worktree(только fetch, без checkout в main). - Тестовые worktree + локальные ветки очищены
remove_worktree+ branch -D. - PR: admin/orchestrator#1
Совместимость прежних фиксов
- B-1 (запись task-файла без docker) — сохранена, путь = worktree.
- B-2 (Popen→файл, monitor wait, без зомби) — не тронут.
- S-1 (check_tests_local свой make test) — сохранён, теперь в worktree.
- S-5 (reviewer verdict из frontmatter) — не тронут, добавлен лишь worktree-путь.
- Обратная совместимость QG-диспетчеризации: артефакт-чеки принимают branch опционально (default None → shared /repos), 2-арг вызовы/тесты не сломаны.
Проблемы и решения
- Расхождение с ТЗ: артефакт-QG функции вызываются как 2-арг в существующих тестах и в webhooks/plane. Чтобы не сломать — добавил
branchопциональным (default None → fallback на shared путь), а не сделал обязательным. Диспетчеры орка прокидывают реальный branch. - ТЗ упоминал BUGFIXES_2026-06-03 «или дату прогона» — использовал дату прогона 2026-06-02:
docs/BUGFIXES_2026-06-02_ORCH2.md. git worktree add wt branchдля существующей remote-ветки и-b ... origin/mainдля новой — оба пути покрыты тестами.
Не сделано (вне scope, по ТЗ)
- Автовызов
remove_worktreeпри переходе вdone— модуль умеет, но подключение опционально/отдельным шагом. - Очередь задач (ORCH-1 / F-2b) — не входит.