auto-sync: 2026-06-03 00:10:01
This commit is contained in:
@@ -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)
|
||||
|
||||
11
memory/heartbeat-state.json
Normal file
11
memory/heartbeat-state.json
Normal 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"
|
||||
}
|
||||
Reference in New Issue
Block a user