auto-sync: 2026-06-05 20:50:01

This commit is contained in:
Stream
2026-06-05 20:50:01 +03:00
parent a286a07fa6
commit 37c0730785

View File

@@ -689,3 +689,50 @@ Dev (session orch9_docs_canon) отработал, я проверила не с
- **ORCH-41** (id `17f9a73f`) — СДЕЛАНО/Done (конфигурируемые модели).
- **ORCH-42** (id `1564136e`) — Telegram live-tracker режим **bump** (карточка падает вниз при обновлении, флаг `ORCH_TRACKER_MODE`=edit|bump, deleteMessage+sendMessage тихо). Слава: «bump нравится, пусть орк делает» — self-hosting через конвейер.
- **ORCH-43** (id `d770a7a2`) — безопасная параллель в одном репо: merge-gate + auto-rebase + re-test + **single-flight per repo** (не стартовать новую задачу пока предыдущая не дошла до done). Флаг `ORCH_SERIALIZE_PER_REPO`.
---
## 🔴 ИНЦИДЕНТ: ORCH-17 застряла на Analysis — ДВЕ причины (05.06 вечер ~17:00-17:35)
Карточка ORCH-17 висела на Analysis ~30 мин. Аналитики стартовали (run 107/109/111) и **мгновенно умирали с пустым логом (0 байт)**, job 54 оставался `running`. Расследование выявило ДВА независимых корня:
### Причина №1: 🔐 Авторизация claude слетела (ГЛАВНАЯ)
- При ребилде контейнера под ORCH-41 (16:45) пересоздание сломало claude-auth:
- `/home/slin/.claude/.credentials.json` стал **owner=root** (контейнер под uid=0 портит владельца смонтированных файлов — снова грабля ORCH-40!)
- `/root/.claude` в контейнере = ПУСТЫШКА (claude под `HOME=/root` создал болванку `.claude.json` 293 байта, настоящие creds лежат в `/home/slin/.claude*` но туда claude не смотрел)
- Симптом: claude → `"Not logged in · Please run /login"`, is_error, 57ms, пустой stdout.
- **ФИКС (двойной):**
1. `chown slin:slin /home/slin/.claude/.credentials.json` (вернула владельца — токен внутри был ВАЛИДНЫЙ, дело только в правах)
2. **ПОСТОЯННЫЙ:** в `docker-compose.yml` (prod+staging блоки) добавила монтирование `/home/slin/.claude → /root/.claude` и `.claude.json → /root/.claude.json` напрямую — переживёт рестарт (симлинки внутри контейнера НЕ переживают пересоздание).
- ⚠️ **ВАЖНО launcher.py:** агенты запускаются с принудительным `HOME=/home/slin` (env в launcher, ~стр.290-320). НО claude всё равно умудрялся читать `/root` в части случаев → надёжнее смонтировать creds в ОБА места.
### Причина №2: ⚙️ `--effort` гасит вывод claude (РЕГРЕССИЯ ORCH-41)
- Флаг `--effort <любое: low/medium/high/xhigh/max>` + `--print` в CLI **2.1.142****ПУСТОЙ stdout, even stderr молчит**, мгновенно.
- Изолировано матрицей тестов: без effort работает ✅, с effort пусто ❌ (при любом значении).
- **ФИКС (временный):** отключила effort в проде через `.env`: `ORCH_AGENT_EFFORT_DEFAULT=""` + пустые per-agent → резолвер вернёт пусто → флаг `--effort` НЕ добавляется в cmd. Модель `claude-opus-4-8` ОСТАЛАСЬ.
- **TODO:** завести **ORCH-44** — корректная интеграция effort (возможно несовместим с `--output-format json`, или другой способ передачи). Сейчас effort отключён — не теряем фичу, просто не используем.
### Грабля диагностики (моя):
- Промежуточные ручные тесты claude обрывались по **таймауту 40-50с** → выглядело как «зависание», сбивало диагноз. **Аналитик с system-prompt + task.md думает ~66с.** При таймауте 90с+ всё работает. ⚠️ НЕ ставить timeout <90с при ручной проверке claude-агента с полным контекстом.
### Команда launcher (рабочая, проверена E2E):
- Полная команда launcher с `HOME=/home/slin`, `--print`, `--output-format json`, system-prompt + task.md, БЕЗ effort → работает (66с, 13 turns, is_error:false).
### ИТОГ инцидента:
- ✅ ORCH-17 разблокирована: аналитик отработал (run 114, лог 3487 байт), job 54→done, BRD/ТЗ/AC написаны, Plane-комменты запощены, state→in_review (`c52e99b9`). **Ждёт Approved Славы.**
- ✅ Авторизация claude: починена + защищена монтированием (постоянно).
- ✅ effort: отключён в проде (конвейер работает на 4.8 без effort).
- ✅ ORCH-44 заведена (id `d8ad65a7`, Backlog) — «Надёжность запуска агента», 3 дыры: (1) preflight слеп к auth, (2) --effort фикс, (3) пустой лог → failed. Приоритет высокий.
- 📋 TODO: апрувнуть ORCH-17 (ждёт Approved Славы).
### 🔍 ДЫРА В PREFLIGHT (разведано 05.06 — почему проверка не поймала сбой)
- `src/preflight.py` проверяет ТОЛЬКО: (a) `os.path.exists(CLAUDE_BIN)`, (b) `claude --version` (timeout 5s, без токенов).
- ⚠️ **`claude --version` ОТВЕЧАЕТ ДАЖЕ БЕЗ ЛОГИНА** (версия — локальная инфа). Поэтому preflight=ok, а реальный запуск падает `Not logged in`. **Preflight слеп к авторизации и к битым флагам** (--effort).
- Код прямым текстом: «🚫 deliberately do NOT do a prompt ping — would burn rate limit». Дизайн «дёшево, без токенов» → ценой слепоты к auth.
- Фикс (ORCH-44): дешёвая проверка auth без токенов — читаемость+права `.credentials.json` + дата истечения OAuth (`claudeAiOauth.expiresAt`) внутри.
### КРИТИЧНЫЕ УРОКИ на будущее:
1. **Ребилд/пересоздание контейнера orchestrator ЛОМАЕТ claude-auth** (root-owned creds + `/root/.claude` пустышка). Теперь защищено монтированием в compose, НО проверять после каждого ребилда: `docker exec orchestrator bash -c 'cd /tmp && HOME=/home/slin /opt/claude-code/bin/claude.exe --print "ОК"'` (timeout 90с).
2. **claude бинарь:** реальный путь `/opt/claude-code/bin/claude.exe` (смонтирован ro, 232MB). `/usr/bin/claude` (env `ORCH_CLAUDE_BIN`) в контейнере НЕ существует — это хостовый симлинк, launcher хардкодит правильный путь.
3. **`--effort` НЕ использовать** с текущим CLI 2.1.142 + `--print`/`--output-format json` — гасит вывод. Ждёт ORCH-44.
4. **Пустой run-лог (0 байт) + job running + процесс мёртв** = claude упал на старте (auth ИЛИ битый флаг). Смотреть: сначала auth (`claude --print` вручную), потом флаги (effort).