Files
wiki/tasks/orchestrator/reports/dev-2026-06-02-orch2-worktree.md
2026-06-02 21:20:02 +03:00

5.0 KiB
Raw Blame History

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_agent commit/push в worktree (checkout убран); questions/conflict читаются из worktree
  • Task 3 — qg/checks: _repo_path(repo, branch) helper; артефакт-чеки получили опц. branch; check_tests_localensure_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_dir
  • src/git_worktree.py (новый) — модуль worktree
  • src/agents/launcher.py — launch/_write_task_file/_monitor_agent/_try_advance_stage → worktree
  • src/qg/checks.py — worktree-aware артефакт-чеки + check_tests_local
  • src/webhooks/plane.py — QG-диспетчер прокидывает branch
  • src/webhooks/gitea.py — комментарий (read-only, без изменений логики)
  • tests/test_git_worktree.py (новый), tests/test_launcher.py
  • docs/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) — не входит.