From bd070012d379f27850e16ae6ea05b5ed8ffeadc1 Mon Sep 17 00:00:00 2001 From: Stream Date: Fri, 5 Jun 2026 14:40:01 +0300 Subject: [PATCH] auto-sync: 2026-06-05 14:40:01 --- memory/2026-06-05.md | 77 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/memory/2026-06-05.md b/memory/2026-06-05.md index 874f5bf..76eb791 100644 --- a/memory/2026-06-05.md +++ b/memory/2026-06-05.md @@ -437,3 +437,80 @@ Dev (session orch9_docs_canon) отработал, я проверила не с - main HEAD до PR #32 = `f1b3146` (merge ORCH-35). ### Эталон enduro для канона: `/home/slin/repos/enduro-trails/` — CLAUDE.md (паспорт), docs/architecture/ (README+adr), .openclaw/agents/*.md (6 ролей, эталон каркаса промпта: frontmatter→контекст→что прочесть→что произвести→принципы→запрещено→эскалация). +# 2026-06-05 + +## Orchestrator — CI-гейт качества закрыт ✅ (продолжение self-hosting ORCH-7) + +### Главный итог +**CI у orchestrator теперь честно зелёный.** Дефект изоляции тестов (тесты протекали друг в друга через синглтон `settings`) закрыт. Гейт качества для self-hosting работает по-настоящему. + +### Что было сделано +- **PR #27** (ветка `fix/isolate-webhook-tests-from-plane`) — три коммита: + - `7bbab9c` — изоляция 3 webhook-тестов от живого Plane API (моки через ИСТОЧНИК `src.plane_sync.*`) + - `e856e09` — миграция `test_plane_webhook_generates_sequential_ids` под новый контракт (задача создаётся при переходе В In Progress, а не на `work_item.created`) + - `1baae81` — **autouse-фикстура в `tests/conftest.py`**, сбрасывает webhook-секрет (+ db_path) на синглтоне settings перед каждым тестом +- Проверено лично на проде: полный `pytest tests/` в чистом docker-окружении = **294 passed, 0 failed** (было 10 failed). CI run 547/548 = **success** (впервые). +- 401/HMAC/dedup тесты ЖИВЫ — фикстура их не сломала (они перекрывают её своим monkeypatch). Off-limits зона не тронута: правки только в `tests/conftest.py` и `tests/test_webhooks.py`, src/ чист. + +### Ключевой урок — интерференция тестов через синглтон settings +- `Settings` (Pydantic, src/config.py) читает env ОДИН раз при создании объекта `settings`. +- `test_webhooks.py` ставит секрет жёстко `os.environ["..."]=""` на import-time; другие файлы — через `setdefault`; `test_webhook_dedup.py` ставит реальный `"s3cr3t"` через monkeypatch. +- В ПОЛНОМ прогоне `pytest tests/` секрет протекал между файлами → HMAC включался → webhook-тесты ловили `assert 401 == 200`. По отдельности файл зелёный, вместе — красный. +- **Решение-паттерн:** autouse-фикстура в conftest, сброс протекающего состояния синглтона через monkeypatch перед каждым тестом. НЕ менять сам механизм/защищённые тесты — только навести порядок с изоляцией. `db_path` тоже протекал (get_task_by_repo_branch возвращал stale) — Dev законно добавил и его сброс. + +### Мерж ВЫПОЛНЕН ✅ (05.06, Слава дал «да») +- **PR #27 → MERGED в main** (HTTP 200). main HEAD = `d0a3424` Merge PR #27. Все 3 коммита фиксов в истории main. +- **PR #26 → CLOSED без мержа** (поглощён #27). +- Нюанс: CI на самом main после merge-commit отдельным прогоном не появился (workflow триггерится на push/PR-ветки; merge-commit мог не дёрнуть). Код в main = ровно то, что прогонялось зелёным (294 passed). Гейт на будущих PR работает. +- **Пункт №1 self-hosting (CI-гейт) ЗАКРЫТ.** Осталось: удалить отработанные ветки fix/isolate, ci/add (косметика). + +## Staging-среда для orchestrator (ORCH-30..35) — дизайн оформлен, задачи в Backlog +(подробности выше по тексту дня; см. историю) + +--- + +## СЕССИЯ flush 11:36 UTC — ребилд прода + статусная модель ORCH = ET + +### Ребилд прода ВЫПОЛНЕН ✅ (Слава дал ОК) +- Блокер `src/qg/checks.py` рассинхрон устранён: `docker compose up -d --build orchestrator` из main (`5ecd1c4`). +- Постпроверка ЛИЧНО: прод checks.py == main `3f9fe07`; `is_self_hosting_repo("enduro-trails")`=False (ET пропускает staging-гейт «N/A»), `("orchestrator")`=True; 6 ET-задач на месте; очередь+breaker(closed)+preflight живы; **319 passed** (тесты гонятся из /repos/orchestrator — в образ НЕ копируются, только src/+data/). +- ФАКТ: Dockerfile орка `build: .` копирует только `src/` + `data/`; тестов в образе нет (CI/репо). + +### Статусная модель ORCH приведена к ET ✅ (Слава: «использовать такую же модель как в ET, не хватает — добавь») +- В ORCH-проекте было 5 базовых статусов, в ET — 14. **Создала 9 недостающих через Plane API** (Architecture/Development/Review/Testing/Approved/Rejected/Needs Input/In Review/Blocked) с теми же name/color/group. Теперь ORCH = 14, идентично ET по составу. +- ⚠️ UUID у ORCH-статусов СВОИ (Plane генерит уникальные) → всплыл блокер ORCH-10 (код хардкодит ET-UUID). Самое критичное: webhook распознавал «старт конвейера» только по ET-UUID in_progress → ORCH-задача (её UUID e331bfb3) НЕ стартовала бы. Поэтому мой PATCH ORCH-16 state упал 400 — и хорошо, конвейер не встал криво. + +### ORCH-10 (per-project резолвинг статусов) — ГОТОВ, ПРОВЕРЕН ЛИЧНО, PR #33 ЖДЁТ МЕРЖА +- Сделал Dev по ТЗ `DEV_TASK_ORCH10_PER_PROJECT_STATES.md` (полные карты UUID обоих проектов в ТЗ — Dev не гадал). +- Решение: `get_project_states(project_id)` читает статусы из Plane API + кэш `_STATES_CACHE` + fallback `_DEFAULT_STATES` (=текущие ET-значения). `reload_project_states()` для сброса. +- Проверено мной: diff только plane_sync.py+webhooks/plane.py+tests; **342 passed (+23, 0 регрессий)**; живой резолвинг ET→ET-UUID (in_progress b873d9eb, architecture 3020bbb7), ORCH→ORCH-UUID (in_progress e331bfb3, architecture 795cc32f), UUID разные; enduro не сломан; webhook-старт распознаётся для обоих проектов. +- **PR #33:** https://git.mva154.duckdns.org/admin/orchestrator/pulls/33 — НЕ смержен, жду «мержи» от Славы. + +### ORCH-37 заведена (по просьбе Славы) — гигиена статусов Plane +- Backlog, id `9ccc5490`. Суть: статусов на доске много, используем не все → ревизия + чистка неиспользуемых/дублей, минимальный набор под фактический конвейер. ОБЯЗАТЕЛЬНО согласовать со Славой и не сломать ET (статусы общие, после ORCH-10 резолвятся per-project). Не срочно. + +### ПОРЯДОК до запуска ORCH-16 (первая самодоработка-прогрев): +1. Слава говорит «мержи» → мерж PR #33 в main +2. Ребилд прода из main +3. Проверить резолвинг в ЖИВОМ контейнере (оба проекта) +4. ТОГДА ORCH-16 `Backlog→In Progress` → webhook стартанёт конвейер (analyst первым) +- ORCH-16 пока в Backlog (id `2b80c58c-2a83-4ab0-aa69-b7f5d2f8c345`), в описание дописаны ответы на 2 вопроса (текст+ссылка+1-строка вердикт; один коммент на агента за стадию). + +### Скоуп ORCH-9 разведён (Вариант Б, ранее в сессии): +- Орк-репо = только орк (PR #32 смержен в main `5ecd1c4`: CLAUDE.md паспорт + дока канона + 6 промптов + reviewer-gate). +- Онбординг = отдельный репо `onboard2orch` (https://git.mva154.duckdns.org/admin/onboard2orch, коммит 3b0ea44): principles/checklist/examples(ET-референс). Методичка убрана из орк-ветки. + +### КЛЮЧЕВЫЕ PLANE state-id (оба проекта, для будущих сессий): +- **ORCH** (plane_id `8da6aa25-a60e-44d6-a1e2-d8ae59aa7d6a`): backlog `2d5d42ff`, todo `b5d3f512`, in_progress `e331bfb3`, architecture `795cc32f`, development `f5ed4705`, review `2026f3d9`, testing `81c5cd78`, approved `63f2c8fe`, rejected `4c769e90`, done `3738cd3c`, cancelled `59d1d210`, needs_input `99978b3f`, in_review `c52e99b9`, blocked `505f01a6`. +- **ET** (plane_id `7a79f0a9-5278-49cd-9007-9a338f238f9c`): backlog `113b24f6`, todo `2c7d3df3`, in_progress `b873d9eb`, architecture `3020bbb7`, development `9920609b`, review `ba0d802c`, testing `7855d807`, approved `a519a341`, rejected `ba958f3c`, done `381a2833`, cancelled `b1cae7f9`, needs_input `babf08a3`, in_review `38fb1f64`, blocked `6c4543f9`. + +### ФАКТЫ ОРКА (золотой источник): +- НЕТ Makefile, НЕТ budget.yaml. Тесты: `pytest tests/ -q`. CI = Gitea Actions. +- Прод 8500, staging 8501 (изолир. БД ./data/staging, profile staging). External: https://openclaw.mva154.duckdns.org/orchestrator/. Webhook: .../orchestrator/webhook/gitea (+ /webhook/plane). +- Эндпоинты: GET /health, /status, /queue; POST /webhook/plane, /webhook/gitea. +- Dockerfile `build: .` копирует только src/ + data/ (тестов в образе нет). +- Webhook старт конвейера: `if new_state == PLANE_STATES["in_progress"]` (после ORCH-10 — резолв по project_id). Фильтр по проекту: unknown project → ignore (ORCH-6). +- main HEAD = `5ecd1c4` (Merge PR #32). +- Прод: контейнер `orchestrator`, image `orchestrator-orchestrator`. SSH: `sshpass -p 'motoZ@yaz2010' ssh slin@82.22.50.71`. compose `/home/slin/repos/orchestrator/docker-compose.yml`. + +### Эталон enduro для канона: `/home/slin/repos/enduro-trails/` — CLAUDE.md, docs/architecture/, .openclaw/agents/*.md (6 ролей).