auto-sync: 2026-06-03 00:10:01

This commit is contained in:
Stream
2026-06-03 00:10:01 +03:00
parent 65dba7eea7
commit 2973571f5e
6 changed files with 278 additions and 1 deletions

View File

@@ -437,3 +437,76 @@ ssh slin@82.22.50.71 "
### Следующий бэклог ORCH (после ORCH-6 merge+webhook on)
- ORCH-1 (F-2b очередь задач вместо in-process daemon) — следующий приоритет
- ORCH-3 (S-2/S-3 rollback), ORCH-4 (M-3 stage-engine), ORCH-5 (M-7 идемпотентность webhook dedup)
---
## ORCH-6 ЗАМЕРЖЕН + Webhook ВКЛЮЧЁН (2026-06-02 ~21:00) — проверено вживую
### Сделано (с ОК Славы «Делай»)
-**PR #2 смержен** в main orchestrator (HTTP 200, merge commit `b021ff7`)
- ✅ Контейнер пересобран из main, health ok
-В main также прилетел `test_git_worktree.py` (ORCH-2 хвост) — норма
-**Plane-webhook ВКЛЮЧЁН обратно**: `UPDATE webhooks SET is_active=true``is_active=t`, UPDATE 1
### Боевой тест предохранителя (двойная защита, подтверждено на проде)
1. 🛡️ HMAC-подпись: webhook без валидной подписи → `401 Invalid signature` (секрет 40 симв настроен)
2. 🛡️ Фильтр проекта: webhook с ВАЛИДНОЙ подписью от неизвестного проекта → `200 {"status":"ignored","reason":"unknown project"}`, лог `ignoring event from unknown project (known: 2)`
3. ✅ Задача НЕ создалась (11→11) — инцидент технически невозможен
### Грабли (повтор из инцидента — записать чтоб не наступать)
- Postgres-пароль Plane: `\x27`-экранирование кавычек через ssh+docker ЛОМАЕТСЯ. Рабочий способ — писать SQL в файл и `psql -f`, пароль брать из env Plane-контейнера (`len=5`)
- Plane postgres: контейнер `plane-app-plane-db-1`, db/user `plane`
---
## ORCH-1 (F-2b) — Персистентная очередь задач (2026-06-02 ~21:00)
### Контекст проблемы (in-process архитектура)
- `launcher.launch()` синхронно: `subprocess.Popen(claude)` + 2 daemon-thread (`_watchdog` таймаут-киллер 1800с + `_monitor_agent` ждёт/коммитит/advance stage)
- 8 точек вызова: `plane.py:189,234,308,389` + `gitea.py:126,203,275,300`
- Беды: рестарт орка = агенты-сироты + потеря работы; нет лимита параллелизма; нет ретраев; webhook блокируется на спавне
### ТЗ
- `tasks/orchestrator/DEV_TASK_ORCH1_QUEUE.md` (снайперское, все file:line собраны заранее)
- Решение: таблица `jobs` (queued/running/done/failed) + atomic `claim_next_job` + `queue_worker.py` петля + `max_concurrency` + ретраи + requeue running на старте (restart-safe) + `/queue` эндпоинт
### ✅ Базовая очередь готова (PR #3) — проверено мной вживую
- **76 passed** (19 новых тестов очереди, вкл. атомарность claim на 8 потоках/20 jobs), 9 fail — те же pre-existing 401
- `/queue` живой: counts, max_concurrency, recent
- PR #3 open, mergeable:True
- Фиксы B-1/B-2/M-1/ORCH-2/ORCH-6 не тронуты
- Живой прогон: queued→running→done, ретрай, restart-safe
### ⚠️ Resilience-слой Dev в базовый PR #3 НЕ встроил
- Моё уточнение (preflight/429/backoff/breaker) пришло когда Dev уже ушёл в финал T8-T12 → в коде НЕТ ни `preflight.py`, ни классификатора 429, ни breaker, ни колонок backoff
- Урок: при дослыле уточнения в активную сессию Dev — проверять, что оно реально вошло в код, а не только в отчёт «done»
---
## ORCH-1b (Resilience-слой) — дослан отдельной задачей (2026-06-02 ~21:00)
### Идея Славы (отличный вопрос про надёжность claude CLI)
- Два РАЗНЫХ зверя, лечить раздельно:
- **CLI недоступен** (бинарь/сеть) → дешёвый preflight `claude --version` + TCP, кэш 45с, токены НЕ жжёт. Мёртв → job ждёт в очереди, не падает
- **Rate limit 429** → предсказать НЕЛЬЗЯ; prompt-ping перед запуском = трата лимита, ТАК НЕ ДЕЛАТЬ. Ловить 429 на ВЫХОДЕ (паттерны в логе: `429`/`rate limit`/`overloaded`/`Retry-After`), классифицировать transient vs permanent
- **Backoff** для transient: exp + `available_at`/`next_attempt_at` колонка в очереди + уважать `Retry-After`. Очередь = идеальное место для backoff
- **Circuit breaker**: 3 фейла подряд → пауза 5 мин (CLI не дёргаем, лимит не выжигаем) + алерт → half-open проба → закрыли
- Ретраи раздельные: transient (429) ≠ code-fault (attempts=2)
### Статус
- Задача `orch1b_resilience` запущена на Dev (Opus 4.8), поверх той же ветки/PR #3 (фокусные коммиты)
- Требует: безопасная миграция БД через PRAGMA-проверку (prod-база `jobs` уже живая)
### ⚠️ Урок: тест-алерты дёргают Славу
- Dev гонял retry-тест с синтетическим `repo r-retry` / job 3 → fail-алерт долетел в Telegram, Слава испугался («Ау»)
- Проверка: `/queue` всё по нулям, в прод-БД никакого `r-retry`/job 3 нет — жил только в эфемерной pytest-БД
- **TODO для ORCH-1b**: подавить Telegram-нотификации в тестовых прогонах (нотификации только прод, не pytest)
### Следующие шаги
- Дождаться `orch1b_resilience`, проверить вживую (preflight без трат токенов, 429-классификатор, backoff, breaker, миграция)
- Слить PR #3 (base queue + resilience) ОДНИМ куском после полной проверки
- Дальше бэклог: ORCH-3 (S-2/S-3 rollback), ORCH-4 (M-3 stage-engine), ORCH-5 (M-7 idempotency/webhook dedup)
### Висящие вопросы Славе
- PR #19 (enduro-trails), PR #1 (orchestrator worktree) — мержить?
- PR #2 уже смержен (ORCH-6)

View File

@@ -0,0 +1,11 @@
{
"lastChecks": {
"email": null,
"calendar": null,
"weather": null,
"orchestrator_health": "2026-06-02T21:04:00Z",
"open_prs": ["PR #19 enduro-trails", "PR #1 orchestrator worktree", "PR #2 orchestrator multi-repo"]
},
"lastHeartbeat": "2026-06-02T21:04:00Z",
"note": "First heartbeat-state.json created during 2026-06-02 21:04 UTC cron poll"
}