Files
wiki/memory/2026-06-03.md
2026-06-03 19:20:01 +03:00

8.6 KiB
Raw Blame History


Конвейер UX — статусная модель + токены (03.06 день, в работе)

Решения Славы по статусной модели (ПОДТВЕРЖДЕНЫ):

  • Бэклог в Plane. Задача лежит в Backlog/Todo/Triage пока Слава не переведёт в In Progress → только это запускает конвейер (analyst). Сейчас триггер = work_item.created (любой тикет сразу стартует) — НАДО починить.
  • Вердикт статусами (вариант B): статус Approved = advance, Rejected = rollback. Комменты :approved:/:rejected: ОСТАВИТЬ параллельно. Причину reject Слава пишет комментом.
  • Стадии видимы на доске: architecture/development/review/testing — отдельными статусами, не скрыты в In Progress.
  • Расход токенов по агентам: показывать (A) в комменте каждого агента + (B) итог-сводка от Deployer.

Механика конвейера (по факту кода, для справки):

  • Все 6 агентов работают над ОДНОЙ задачей = 1 тикет Plane = 1 feature-ветка, комментят в неё (теперь под своими именами).
  • Статус сейчас меняется только: in_review (analyst ждёт approve), needs_input (вопросы), blocked, in_progress, done. Стадии architecture/dev/review/testing невидимы.
  • 2 ручных гейта: analyst→ждёт :approved: (In Review); reviewer→:approved:. Остальное едет автоматически.
  • Needs Input: analyst пишет 01-questions.md, статус Needs Input, ждёт. Слава отвечает обычным комментом → analyst перезапуск. Лимит 3 раунда → Blocked + Telegram-алерт.
  • Агенты = Claude CLI (/opt/claude-code/bin/claude.exe --print), вывод в лог. Версия 2.1.142.

ИНФРА сделана Стримом (БД Plane, бэкап states plane-states-backup-*):

6 новых статусов в проекте enduro (7a79f0a9-...), группа started, в правильном порядке доски:

architecture=3020bbb7-6122-4663-930c-0315ba8dfa3d  development=9920609b-f140-4e46-ab95-89acda8412c8
review=ba0d802c-5218-41d4-ab43-978b0ea123ed         testing=7855d807-b1bf-42ef-8dae-6cde0df92d02
approved=a519a341-dada-4a91-8910-7604f82b79c5       rejected=ba958f3c-5db5-461d-8f82-89425e413b97

CLI usage подтверждён вживую (для фичи токенов):

claude --output-format json отдаёт: total_cost_usd, usage.{input_tokens,output_tokens,cache_read_input_tokens,cache_creation_input_tokens}, modelUsage, num_turns, duration_ms. Сейчас запуск plain-text (--print без формата) → usage НЕ собирается. agent_runs (id,task_id,agent,started/finished,exit_code,output_path) — НЕТ полей токенов, надо ALTER.

Код — Dev, ветка feature/pipeline-ux, ТЗ DEV_TASK_PIPELINE_UX.md (4 фичи):

  1. Старт по статусу (in_progress), не по created. Идемпотентно (задача уже есть → не дублить).
  2. Вердикт-статусы Approved/Rejected (+ комменты живы).
  3. Видимость стадий: PLANE_STATES += 6 UUID, set_issue по стадии (Needs Input/Blocked приоритетны).
  4. Токены: --output-format json, ALTER agent_runs (+input/output/cache/cost), коммент агента + сводка Deployer.
  • ⚠️ Статусы per-project — ОСТАВИТЬ TODO (ORCH-10 эпик), не переделывать резолв сейчас.
  • Baseline 166 passed. Мерж — Стрим после живой проверки.

Recraft (попутно, 03.06): модель OpenRouter = recraft/recraft-v4.1 (НЕ в каталоге /models, но работает). Дёргать chat/completions с modalities:["image"] (только image, без text — иначе 404). Сгенерила пляжные картинки Славе.


PR #10 СМЕРЖЕН в main (03.06, вечер) — конвейер UX

Merge commit main = 4773137. Проверено вживую перед мержем (не на слово Dev):

  • 5 коммитов на remote: a4668c0 feat(plane) stage visibility+verdict UUIDs, 09b1c5e feat(webhook) старт на In Progress, 38a741d feat(webhook) вердикт Approved/Rejected (вариант B), 9a702a0 feat(metrics) токены/cost per-agent, 7fd6529 test(conftest) глушилка Telegram.
  • Прогон тестов сама: 190 passed, 9 failed. Девять — pre-existing baseline (сравнила полную сюиту на main ДО ветки = те же 9). Regression = 0. Из девяти: 8 это 401-invalid-signature, 1 это test_plane_approved TypeError — ВСЕ падали и на main. ⚠️ Уточнение к прошлым заметкам: реальный baseline = 9 (не только 401-набор).
  • Telegram-утечка закрыта: tests/conftest.py autouse-фикстура глушит send_telegram во всех тестах. Sentinel-проверка: 0 запросов в api.telegram.org за прогон. Покрыты модули: notifications (источник), stage_engine (module-level import — критичный), plane/launcher/queue_worker/main (local imports, raising=False). Источник шума «🔄 ET-100» = тест test_webhook_dedup гонялся на проде без мока.

ЗАДЕПЛОЕНО (03.06 ~16:10 UTC)

Деплой = rebuild образа + recreate (код COPY в образ из src/, НЕ bind-mount; data/ — bind-mount, переживает). Команда: git checkout main && git pull && docker compose up -d --build. Бэкап БД: data/orchestrator.db.bak-1780503005.

  • ⚠️ Перед сборкой репо был на feature/pipeline-ux — обязательно git checkout main (иначе соберётся ветка).
  • Контейнер Up, uvicorn:8500, queue worker стартовал, ошибок нет. Образ на 4773137.
  • Миграция agent_runs прошла: добавились input_tokens, output_tokens, cache_read_tokens, cost_usd. БД цела (11 задач).

Боевые тесты статусной модели на проде (вживую, HMAC-подписанные webhook):

  • ТЕСТ 1 (created НЕ стартует): work_item.created → HTTP 200, задач создано 0, только soft QG-0 warning в лог. Бэклог-режим работает.
  • ТЕСТ 2b (idempotency): In Progress для существующей задачи (f9009756) → лог task already exists (stage=analysis), not restarting, 11→11 задач. Защита handle_comment работает.
  • ТЕСТ 2a (позитивный старт) не делала: запустит реальный analyst (токены + ветка в Gitea). Спросила Славу прежде чем плодить мусор.
  • ⚠️ Грабля: UUID In Progress = b873d9eb-993c-48cd-97ac-99a9b1623967. State UUID извлекается из data.state.id (или bare string).
  • HMAC секрет: ORCH_PLANE_WEBHOOK_SECRET (len 40). Подпись: printf %s BODY | openssl dgst -sha256 -hmac SECRET, заголовок X-Plane-Signature.

После деплоя — боевой тест (план):

Завести задачу в Backlog → перевести в In Progress (должен стартовать analyst, НЕ на created) → провести по доске (видеть переезд по колонкам Architecture→…→Testing) → показать Славе токены живьём (коммент агента 💻 Developer · Nk in / Mk out · $X + сводка Deployer). Боевой usage-тест на ветке уже дал 💻 Developer готов · 6 in / 15 out · $0.06.

Формат Plane-webhook на смену статуса (Dev нашёл по реальному payload):

event="issue", action="updated", новый статус в data.state.id. Старт ловит переход в In Progress из бэклог-статуса. Идемпотентность: задача уже в БД tasks → не дублить/не перезапускать.