ORCH-6: multi-repo (project filter + repo/prefix per project) #2

Merged
admin merged 8 commits from feature/ORCH-6-multirepo into main 2026-06-02 23:42:29 +03:00
Owner

ORCH-6 — Multi-repo: фильтр проекта + маппинг repo per project

Закрывает корень инцидента 2026-06-02 (Plane-webhook гнал все задачи в enduro-trails) и вводит реестр проектов для multi-repo.

Что сделано

  • src/projects.py (новый) — реестр ProjectConfig (Plane id → repo/prefix/name) + резолверы get_project_by_plane_id / get_project_by_repo / known_plane_project_ids. Источник — ORCH_PROJECTS_JSON, дефолт (enduro-trails + orchestrator) в коде; устойчивый парсинг (битый JSON → fallback).
  • config.pyprojects_json (env ORCH_PROJECTS_JSON).
  • webhooks/plane.py — фильтр по проекту (неизвестный → ignored) + резолв repo/prefix/Plane-проекта из реестра.
  • db.pyget_next_work_item_id(repo, prefix="ET"), нумерация per (repo, prefix): ORCH-001 vs ET-010.
  • plane_sync.py — параметризация project_id (обратно совместимо, дефолт enduro).
  • webhooks/gitea.py — неизвестный repo → ignored (3 хэндлера).

Тесты

  • tests/test_projects.py (16) — резолверы + парсинг ORCH_PROJECTS_JSON.
  • tests/test_plane_webhook.py (4) — фильтр через TestClient, launcher.launch замокан.
  • Прогон в контейнере: 57 passed, 9 pre-existing падений в test_webhooks.py (signature 401/TypeError — не трогались).

Проверка (offline-резолв, без реальных запусков)

docker exec orchestrator python3 -c "from src.projects import get_project_by_plane_id as g; print(g('8da6aa25-a60e-44d6-a1e2-d8ae59aa7d6a').repo, g('7a79f0a9-5278-49cd-9007-9a338f238f9c').repo)"

⚠️ Внимание

  • Plane-webhook остаётся выключенным (is_active=false). Включение — после ревью (Стрим).
  • Обратная совместимость plane_sync сохранена (ET-задачи не сломаны).

Док: docs/BUGFIXES_2026-06-03.md, docs/ARCHITECTURE.md, README.md.

## ORCH-6 — Multi-repo: фильтр проекта + маппинг repo per project Закрывает корень инцидента 2026-06-02 (Plane-webhook гнал все задачи в `enduro-trails`) и вводит реестр проектов для multi-repo. ### Что сделано - **`src/projects.py`** (новый) — реестр `ProjectConfig` (Plane id → repo/prefix/name) + резолверы `get_project_by_plane_id` / `get_project_by_repo` / `known_plane_project_ids`. Источник — `ORCH_PROJECTS_JSON`, дефолт (enduro-trails + orchestrator) в коде; устойчивый парсинг (битый JSON → fallback). - **`config.py`** — `projects_json` (env `ORCH_PROJECTS_JSON`). - **`webhooks/plane.py`** — фильтр по проекту (неизвестный → `ignored`) + резолв repo/prefix/Plane-проекта из реестра. - **`db.py`** — `get_next_work_item_id(repo, prefix="ET")`, нумерация per (repo, prefix): `ORCH-001` vs `ET-010`. - **`plane_sync.py`** — параметризация `project_id` (обратно совместимо, дефолт enduro). - **`webhooks/gitea.py`** — неизвестный repo → `ignored` (3 хэндлера). ### Тесты - `tests/test_projects.py` (16) — резолверы + парсинг `ORCH_PROJECTS_JSON`. - `tests/test_plane_webhook.py` (4) — фильтр через TestClient, `launcher.launch` замокан. - Прогон в контейнере: **57 passed**, 9 pre-existing падений в `test_webhooks.py` (signature 401/TypeError — не трогались). ### Проверка (offline-резолв, без реальных запусков) ``` docker exec orchestrator python3 -c "from src.projects import get_project_by_plane_id as g; print(g('8da6aa25-a60e-44d6-a1e2-d8ae59aa7d6a').repo, g('7a79f0a9-5278-49cd-9007-9a338f238f9c').repo)" ``` ### ⚠️ Внимание - Plane-webhook **остаётся выключенным** (`is_active=false`). Включение — после ревью (Стрим). - Обратная совместимость `plane_sync` сохранена (ET-задачи не сломаны). Док: `docs/BUGFIXES_2026-06-03.md`, `docs/ARCHITECTURE.md`, `README.md`.
admin added 8 commits 2026-06-02 22:31:46 +03:00
- add src/git_worktree.py: ensure/remove/get_worktree_path
- config: worktrees_dir=/repos/_wt
- launcher: agent runs in per-branch worktree; task-file + commit/push in worktree; no shared checkout
- qg/checks: read artifacts + run make test from worktree (branch arg, backward-compatible)
- webhooks/plane: pass branch into QG dispatch; review fallback from worktree
- webhooks/gitea: keep read-only branch --contains in main clone (documented)
- tests: test_git_worktree.py (isolation) + update test_launcher write-task-file
- docs: ARCHITECTURE worktree section + BUGFIXES_2026-06-02_ORCH2

Preserves B-1/B-2/S-1/S-5 fixes (paths now point at worktree).
ORCH-6: src/projects.py introduces ProjectConfig + resolvers
(get_project_by_plane_id/by_repo, known_plane_project_ids) keyed by
Plane project uuid. Source: ORCH_PROJECTS_JSON env (config.projects_json),
with a built-in default registry (enduro-trails + orchestrator) and
robust parsing (malformed JSON/entries fall back to default).
ORCH-6: get_next_work_item_id(repo, prefix="ET") numbers per (repo, prefix)
so orchestrator issues number ORCH-001 independently of the ET sequence.
Default prefix stays ET for backward compatibility.
ORCH-6: sync functions resolve the issue PROJECT_ID via the registry
(get_project_by_repo) and accept project_id; default stays enduro so
existing ET callers keep working.
ORCH-6 / incident 2026-06-02: ignore work items from unknown Plane
projects (status=ignored) instead of funneling everything into
default_repo. Resolve repo, work-item prefix and Plane sync project from
the registry by data.project.
ORCH-6: get_project_by_repo None -> ignored, so events for unknown repos
do not trigger the pipeline.
ORCH-6: test_projects.py covers resolvers and ORCH_PROJECTS_JSON parsing
(valid/malformed/fallback). test_plane_webhook.py covers the webhook
project filter via TestClient (unknown->ignored, orchestrator->orchestrator
repo, enduro->enduro-trails, independent ORCH/ET prefixes); launcher
mocked. test_webhooks.py: register proj-1 so existing ET fixtures pass.
ORCH-6: ARCHITECTURE.md gets a project-registry section; README explains
how to add a project via ORCH_PROJECTS_JSON; BUGFIXES_2026-06-03.md
records the fix and links the 2026-06-02 webhook autorun incident.
admin merged commit b021ff7cb0 into main 2026-06-02 23:42:29 +03:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: admin/orchestrator#2