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

This commit is contained in:
Stream
2026-06-04 11:40:03 +03:00
parent bc68de51bb
commit 64371666c0
2 changed files with 169 additions and 0 deletions

View File

@@ -0,0 +1,141 @@
# DEV TASK: orchestrator — живой Telegram-трекер задачи (Вариант B+)
Репо: `slin@82.22.50.71:/home/slin/repos/orchestrator` (пароль `motoZ@yaz2010`).
Push в main запрещён (pre-receive hook) → **только PR в Gitea**.
Gitea токен: `docker exec orchestrator printenv ORCH_GITEA_TOKEN`.
Одна ветка `feat/telegram-live-tracker` от актуального main, **один PR**.
Baseline pytest: **243 passed + 10 failed** (10 = off-limits HMAC/401, НЕ чинить).
После: passed вырасти (новые тесты), те же 10 failed.
---
## ЦЕЛЬ
Сейчас orchestrator шлёт в Telegram ~15 отдельных сообщений на задачу (`src/notifications.py`):
старт каждого агента, завершение, переход стадии, QG-pending-шум, тех-мусор (run_id, exit_code,
пути логов), устаревший «:approved:». Простыня.
Заменить на **ОДНО живое сообщение-трекер** на задачу, которое редактируется (`editMessageText`)
на каждой стадии. Отдельными сообщениями с пингом слать **только** то, что требует внимания Славы.
---
## МАКЕТ ТРЕКЕРА (точный формат)
**В процессе** (текущая стадия — `🔄 … идёт`):
```
🛠️ ET-012 · Треки с зума z5
━━━━━━━━━━━━━━━━━━━━━━
✅ Analysis 10м · 1.1M↓/39.6k↑ · $2.38 · opus-4-8
⏸️ Ревью БРД 8м · твоё время ⏳
✅ Architecture 9м · 1.5M↓/34.4k↑ · $2.24 · opus-4-8
✅ Development 11м · 8.4M↓/45.8k↑ · $7.29 · opus-4-8
✅ Review 3м · 1.2M↓/12.9k↑ · $1.53 · sonnet-4.6
✅ Testing 5м · 1.2M↓/19.5k↑ · $1.51 · sonnet-4.6
🔄 Deploy … · идёт
━━━━━━━━━━━━━━━━━━━━━━
💰 15.1M↓ / 174.6k↑ · $16.68
```
**На финише** (заголовок `🎉 … — ГОТОВО`, добавляются строки времени и ссылки):
```
🎉 ET-012 · Треки с зума z5 — ГОТОВО
━━━━━━━━━━━━━━━━━━━━━━
✅ Analysis 10м · 1.1M↓/39.6k↑ · $2.38 · opus-4-8
⏸️ Ревью БРД 8м · твоё время
✅ Architecture 9м · 1.5M↓/34.4k↑ · $2.24 · opus-4-8
✅ Development 11м · 8.4M↓/45.8k↑ · $7.29 · opus-4-8
✅ Review 3м · 1.2M↓/12.9k↑ · $1.53 · sonnet-4.6
✅ Testing 5м · 1.2M↓/19.5k↑ · $1.51 · sonnet-4.6
✅ Deploy 6м · 1.6M↓/22.4k↑ · $1.73 · opus-4-8
━━━━━━━━━━━━━━━━━━━━━━
💰 15.1M↓ / 174.6k↑ · $16.68
⏱️ Всего 56м · агенты 44м · твоё 8м
🔗 PR #24 · 📦 deployed
```
### Правила формата (согласованы со Славой):
- **Токены на этап:** in/out РАЗДЕЛЬНО — `<in>↓/<out>↑`, где
`in = input_tokens + cache_read_tokens + cache_creation_tokens` (полный вход, как в usage.py
fix #20 — переиспользуй `_input_total`/`fmt_tokens` оттуда), `out = output_tokens`.
- **Модель:** КОРОТКОЕ имя (`opus-4-8`, `sonnet-4.6`). Бери модель агента из конфигурации стадии
/agent_runs/launcher (где известно, какой моделью запускался агент). Маппинг полного→короткого:
отрезать провайдер-префикс (`tokenator/claude-opus-4-8``opus-4-8`,
`vibecode/claude-sonnet-4.6``sonnet-4.6`). Если модель неизвестна — опустить ` · <model>`.
- **Ревью БРД (`⏸️`):** ОТДЕЛЬНАЯ строка между Analysis и Architecture. Время = ТВОЁ (Славы),
НЕ агентское: дельта между моментом «BRD готовы / notify_approve_requested» и переходом
`analysis→architecture` (gate Approved). Пометка `твоё время ⏳` пока идёт ожидание,
`твоё время` после. Пока это ЕДИНСТВЕННОЕ «твоё время» (других gate нет).
- **Итого:** `💰 <total_in>↓ / <total_out>↑ · <cost>` (total_in = сумма полного входа всех агентов).
- **Время в Итого:** `⏱️ Всего <wall> · агенты <agent_sum> · твоё <review_brd>` где
`Всего` = wall-clock от старта задачи до done, `агенты` = сумма длительностей агент-ранов,
`твоё` = время ревью БРД.
- Время стадии — минуты (`10м`). Если <1м — `<1м`.
- Текущая активная стадия: `🔄 <Stage> … идёт`. Ещё не начатые стадии — НЕ показывать
(строка появляется когда стадия стартовала).
- Заголовок: `🛠️ <work_item_id> · <короткое название задачи>` в процессе,
`🎉 <work_item_id> · <название> — ГОТОВО` на финише.
- На финише добавить `🔗 PR #<n> · 📦 deployed` (PR-номер из флоу; статус деплоя из
check_deploy_status: deployed/❌ failed).
---
## АЛЕРТЫ — ОТДЕЛЬНЫМИ сообщениями (с уведомлением)
Трекер редактируется молча. ОТДЕЛЬНО (новое сообщение, `disable_notification: false`) слать ТОЛЬКО:
- 📋 **Approve-gate:** «ET-012: BRD/ТЗ/AC готовы. Переведите в Approved в Plane для продолжения»
(заменить устаревший текст про `:approved:`).
- 🚨 **Деплой упал / откат:** как сейчас в launcher.py:495 (`Deploy failed! Rolled back`).
-**Агент упал:** exit_code != 0 (launcher.py:508) — но БЕЗ пути к логам в тексте (в лог, не в ТГ).
- 🔴 **Ошибка задачи** (`notify_error`).
НЕ слать отдельными: старт агента, завершение агента, переход стадии, QG-pending
(`check_ci_green failed: CI state: pending` — это НЕ ошибка, только в лог), QG-passed.
---
## РЕАЛИЗАЦИЯ
**Файлы:** `src/notifications.py` (основное), `src/db.py` (хранение message_id + модель/тайминги
если их нет), `src/stage_engine.py` (вызовы обновления трекера на переходах), возможно
`src/agents/launcher.py` (тайминги старта/финиша агентов).
1. **Хранение message_id трекера:** добавить колонку `tracker_message_id INTEGER` в `tasks`
(idempotent ALTER, как `_ensure_column` в db.py). При первом сообщении задачи — `sendMessage`,
сохранить `result.message_id`. На каждом переходе — `editMessageText` с полным перерисованным
трекером.
2. **Fallback:** если `editMessageText` вернул ошибку (message not found / too old / 400) —
отправить НОВОЕ сообщение и обновить tracker_message_id. Никогда не падать (как текущий
send_telegram fire-and-forget).
3. **Сбор данных стадий:** длительность стадии, токены (in/out), стоимость, модель — из `agent_runs`
по task_id (там уже есть input/output/cache_read/cache_creation_tokens, cost_usd; модель —
добавь сохранение если её там нет, либо бери из конфига стадии). Рендер трекера = функция
`render_task_tracker(task_id) -> str`, собирающая всё из БД на каждый вызов (stateless рендер).
4. **Время ревью БРД:** зафиксировать timestamp `notify_approve_requested` и timestamp перехода
`analysis→architecture`; дельта = «твоё время». Хранить в `tasks` (напр. `brd_review_started_at`,
`brd_review_ended_at`) или вычислять из activities/stage-history если они уже логируются.
5. **Короткое имя модели:** хелпер `short_model_name(full) -> str` (отрезать префикс до последнего
`/`, затем `claude-` префикс).
6. **parse_mode:** трекер — HTML (как сейчас). Экранировать `<>&` в названии задачи.
### НЕ ТРОГАТЬ
- HMAC, project-filter, nginx, openclaw.json, .env, queue (кроме чтения), PLANE_STATES,
conftest.py, status-only verdict, gitea_public_url конфиг, Plane-комменты (usage_comment —
это ОТДЕЛЬНО, в Plane; НЕ путать с Telegram-трекером, его формат из fix #20 НЕ менять).
- Сохранить блок launcher.py:475 (deployer exit_code защита).
- cost_usd расчёт.
---
## ТЕСТЫ (обязательно)
- `render_task_tracker` на моке agent_runs: правильный формат строк этапов (in↓/out↑, модель,
стоимость, время), строка «Ревью БРД · твоё время», блок Итого с тремя временами.
- `short_model_name`: `tokenator/claude-opus-4-8``opus-4-8`, `vibecode/claude-sonnet-4.6``sonnet-4.6`.
- Трекер: первое сообщение → sendMessage сохраняет message_id; переход → editMessageText.
- Fallback: edit упал → новое сообщение, message_id обновлён.
- Алерты: approve-gate/deploy-fail/agent-fail/error шлются ОТДЕЛЬНО; QG-pending/agent-start/
stage-transition НЕ шлются отдельными (только трекер).
- Полный pytest зелёный (кроме тех же 10 off-limits).
## СДАЧА
- Ветка `feat/telegram-live-tracker`, один PR в Gitea. НЕ мержить сам — на ревью Стрим.
- Отчёт: `tasks/orchestrator/reports/dev-2026-06-04-telegram-tracker.md`
commit-хеш, PR-номер, вывод pytest, пример отрендеренного трекера (в процессе + финиш),
список того что теперь НЕ шлётся отдельными сообщениями.
- Сообщить: PR-номер, результат pytest, пример трекера.

View File

@@ -0,0 +1,28 @@
# Dev Report: orchestrator — живой Telegram-трекер задачи (Вариант B+)
Дата: 2026-06-04
Статус: IN PROGRESS
## Задача
Заменить ~15 отдельных ТГ-сообщений на задачу одним живым сообщением-трекером
(editMessageText по стадиям). Отдельными сообщениями с пингом — только approve-gate,
deploy-fail, agent-fail, error.
## Сделано
- [x] Прочитал ТЗ, изучил codebase (notifications.py, db.py, usage.py, stage_engine.py, launcher.py)
- [x] Создал ветку feat/telegram-live-tracker от main (2801983)
- [ ] db.py: колонки tracker_message_id, model, brd_review_*
- [ ] usage.py: short_model_name, парсинг модели
- [ ] notifications.py: render_task_tracker, send/edit tracker, алерты
- [ ] stage_engine.py / launcher.py: тайминги BRD review + вызовы трекера
- [ ] Тесты
- [ ] pytest зелёный
- [ ] PR в Gitea
## Изменённые файлы
(в процессе)
## Результат
(в процессе)
## Проблемы и решения
(в процессе)