diff --git a/memory/2026-06-04.md b/memory/2026-06-04.md index 66462b0..1402f80 100644 --- a/memory/2026-06-04.md +++ b/memory/2026-06-04.md @@ -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.