auto-sync: 2026-06-04 11:30:01

This commit is contained in:
Stream
2026-06-04 11:30:01 +03:00
parent 6b7f04437d
commit bc68de51bb

View File

@@ -91,3 +91,67 @@ ET-012 = «снизить minzoom публичных треков до z5». К
- [ ] Healthcheck curl→python в enduro-trails docker-compose (мелкая Dev-задача).
- [ ] ET-012 в Plane числится `done` ошибочно (из-за косяка №1). После фикса #1 — решить, перегонять ли заново для чистоты статуса (фактически фича работает).
- [x] ✅ ИНФРА-БЛОКЕР СНЯТ (docker-root, root от Славы НЕ понадобился): `/var/log/enduro-trails` стал slin:slin (chown через alpine bind), deploy-hook прогнан целиком → **exit 0** (`Already up to date``App restarted``Deploy hook done`). Автодеплой enduro-trails честно работает end-to-end. **Урок: docker-root решает chown на ЛЮБОМ примонтируемом пути, не только репо** — sudo-пароль не нужен.
## 🔭 Observability fixes — PR #20 (4 правки, смержен 2801983d, задеплоен)
Слава заметил баг учёта токенов («221 токен за $16.68 — абсурд») + попросил проверить последовательность/статусы ET-012 в Plane + чтобы все агенты прикладывали артефакты.
### Диагностика ET-012 (task 30) в Plane
- Переходы статусов ПРАВИЛЬНЫЕ по методике: Backlog→In Progress→In Review→Approved→Architecture→Development→Review→Testing→(застрял In Progress).
- Косяк A: статус НЕ доехал до Done (последствие косяка №1 — merge-вебхук обходил флоу).
- Косяк B: только analyst прикладывал ссылки на артефакты, остальные агенты — нет.
- **Токены (главный баг):** usage_comment показывал ТОЛЬКО input_tokens (21-81), а 99.99% входа в cache_read_input_tokens (1-8 млн) + cache_creation терялся. «221 токенов вход» на задачу.
### PR #20 — 4 правки (Dev opus-4-8, ветка fix/observability-and-merge-gate, 9 файлов +476/-16, 17 новых тестов)
1. **gitea.py merge-gate** — при current_stage=="deploy" merge-вебхук молча return; done только через check_deploy_status. Остальные стадии merge→done сохранён. (закрыл вторую дверь баг-8)
2. **usage.py+db.py токены** — idempotent колонка cache_creation_tokens, парсинг cache_creation_input_tokens, формат `8.5M in (8.4M cached) / 45.8k out · $7.29`, in_total=input+cache_read+cache_creation. cost_usd не тронут, COALESCE для NULL.
3. **stage_engine.py+plane_sync.py** — set_issue_done() на success deploy→done, Plane доезжает до терминального Done (PLANE_STATES не менялся).
4. **usage.py+launcher.py артефакты** — все агенты прикладывают ссылку: reviewer→12-review.md, tester→13-test-report.md, deployer→14-deploy-log.md, architect→ADR, developer→PR+branch, через gitea_public_url.
### ✅ Проверено вживую на проде (ET-012 task 30, новый код)
```
БЫЛО: 📊 Итого: 221 токенов вход / 174.6k выход · $16.68
СТАЛО: 📊 Итого: 15.1M вход (15.1M cached) / 174.6k выход · $16.68
💻 Developer · 8.4M in (8.4M cached) / 45.8k out · $7.29
```
- pytest: 243 passed, 10 failed (10 = off-limits HMAC/401 baseline, ни одного нового падения).
- PR смержен 2801983d, orchestrator пересобран, health ok.
- Правки 1/3/4 проверены по коду+тестам; в БОЮ увидим на следующей задаче (merge-gate, Plane→Done, артефакты).
### 🔑 Урок: cache_read_input_tokens у Claude CLI
`usage.input_tokens` в Claude CLI JSON = ТОЛЬКО свежий некэшированный вход (~десятки токенов). Реальный объём промпта = input + cache_read_input_tokens + cache_creation_input_tokens. Любой учёт токенов агентов на Claude CLI ОБЯЗАН суммировать все три, иначе занижение в ~50000x.
### TODO косметика телеги (обсуждается, Слава пока не выбрал)
- Орк шлёт ~15 сообщений/задачу + шум QG-pending (не ошибка, а ожидание CI) + тех-мусор (run_id, exit_code, пути логов) + устаревший «:approved:».
- Вариант A: почистить тексты (убрать «запущен», QG-pending не слать, убрать мусор) → ~6-7 сообщений.
- Вариант B (рекомендован): одно живое сообщение-трекер на задачу (editMessageText по стадиям) + отдельные алерты только approve/fail/error. Нужно хранить message_id, fallback на edit-фейл.
- Все ТГ-сообщения в `src/notifications.py` (parse_mode HTML).
### Косметика телеги — Слава выбрал ВАРИАНТ B+ (согласование макета, 04.06 вечер)
Слава выбрал B (живой трекер) + 3 добавки:
1. **Строка «Ревью БРД»** — отдельная стадия, время в ней = **ЕГО время** (от «BRD готовы» до смены статуса на Approved), НЕ агентское. Помечать `⏸️ Ревью БРД · твоё время ⏳`.
2. **По каждому этапу:** токены · стоимость · **модель** (`1.1M · $2.38 · opus-4-8`).
3. **В «Итого»:** общее wall-clock + агентское + твоё (`⏱️ Всего 56м · агенты 44м · твоё 8м`).
**Согласованный макет (финиш):**
```
🎉 ET-012 · Треки с зума z5 — ГОТОВО
✅ Analysis 10м · 1.1M · $2.38 · opus-4-8
⏸️ Ревью БРД 8м · твоё время
✅ Architecture 9м · 1.5M · $2.24 · opus-4-8
✅ Development 11м · 8.4M · $7.29 · opus-4-8
✅ Review 3м · 1.2M · $1.53 · sonnet-4.6
✅ Testing 5м · 1.2M · $1.51 · sonnet-4.6
✅ Deploy 6м · 1.6M · $1.73 · opus-4-8
💰 15.1M токенов · $16.68
⏱️ Всего 56м · агенты 44м · твоё 8м
🔗 PR #24 · 📦 deployed
```
В процессе: текущая стадия `🔄 Deploy … идёт`, трекер редактируется через editMessageText.
**4 вопроса заданы Славе, жду ответа ПЕРЕД ТЗ Dev'у:**
1. Алерты (approve-gate / фейл деплоя / ошибка) — отдельными сообщениями с пингом, трекер молча редактировать? (я рекомендую да)
2. Модель — короткое имя (opus-4-8) или полное?
3. «Твоё время» — только ревью БРД или все gate-ожидания? (пока gate один — после аналитика)
4. Токены на этап — полный вход с кэшем (1.1M) или in/out раздельно (1.1M↓/40k↑)?
**Тех. реализация (для ТЗ):** все ТГ-сообщения в `src/notifications.py` (parse_mode HTML). Нужно: хранить message_id трекера по задаче (новая колонка/таблица), editMessageText по стадиям, fallback на новое сообщение если edit упал. Время «твоё» = дельта между notify «BRD готовы» и переходом analysis→architecture (gate Approved). Модель агента — из конфига стадии/agent_runs.