From 8da571de86bb5463c1f0518126e706bb015dbdf0 Mon Sep 17 00:00:00 2001 From: Slava Date: Fri, 5 Jun 2026 17:50:47 +0300 Subject: [PATCH] feat(plane): unified status-comment format with duration line (ORCH-016) (#34) --- CHANGELOG.md | 2 + docs/architecture/README.md | 15 + .../ORCH-016/00-business-request.md | 7 + docs/work-items/ORCH-016/01-brd.md | 85 +++ docs/work-items/ORCH-016/02-trz.md | 174 ++++++ .../ORCH-016/03-acceptance-criteria.md | 125 ++++ docs/work-items/ORCH-016/04-test-plan.yaml | 154 +++++ .../06-adr/ADR-001-unified-status-comment.md | 203 +++++++ docs/work-items/ORCH-016/10-tech-risks.md | 112 ++++ docs/work-items/ORCH-016/12-review.md | 120 ++++ docs/work-items/ORCH-016/13-test-report.md | 159 +++++ docs/work-items/ORCH-016/14-deploy-log.md | 145 +++++ src/agents/launcher.py | 53 +- src/frontmatter.py | 75 +++ src/stage_engine.py | 79 ++- src/usage.py | 543 ++++++++++++++++-- tests/test_analyst_comment_regression.py | 126 ++++ tests/test_analyst_status_only_regression.py | 135 +++++ tests/test_fmt_duration.py | 68 +++ tests/test_notify_done_regression.py | 79 +++ tests/test_post_usage_comments_integration.py | 199 +++++++ tests/test_qg_registry_snapshot.py | 64 +++ tests/test_status_comment_authorship.py | 122 ++++ tests/test_status_comment_dedup_regression.py | 124 ++++ ...est_status_comment_duration_db_fallback.py | 145 +++++ tests/test_status_comment_format.py | 354 ++++++++++++ 26 files changed, 3355 insertions(+), 112 deletions(-) create mode 100644 docs/work-items/ORCH-016/00-business-request.md create mode 100644 docs/work-items/ORCH-016/01-brd.md create mode 100644 docs/work-items/ORCH-016/02-trz.md create mode 100644 docs/work-items/ORCH-016/03-acceptance-criteria.md create mode 100644 docs/work-items/ORCH-016/04-test-plan.yaml create mode 100644 docs/work-items/ORCH-016/06-adr/ADR-001-unified-status-comment.md create mode 100644 docs/work-items/ORCH-016/10-tech-risks.md create mode 100644 docs/work-items/ORCH-016/12-review.md create mode 100644 docs/work-items/ORCH-016/13-test-report.md create mode 100644 docs/work-items/ORCH-016/14-deploy-log.md create mode 100644 src/frontmatter.py create mode 100644 tests/test_analyst_comment_regression.py create mode 100644 tests/test_analyst_status_only_regression.py create mode 100644 tests/test_fmt_duration.py create mode 100644 tests/test_notify_done_regression.py create mode 100644 tests/test_post_usage_comments_integration.py create mode 100644 tests/test_qg_registry_snapshot.py create mode 100644 tests/test_status_comment_authorship.py create mode 100644 tests/test_status_comment_dedup_regression.py create mode 100644 tests/test_status_comment_duration_db_fallback.py create mode 100644 tests/test_status_comment_format.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 09445c6..235e5f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ## [Unreleased] ### Added +- **Единый status-коммент агентов в Plane** (ORCH-016): `usage.build_status_comment(...)` — один хелпер для ВСЕХ ролей (analyst..deployer). HTML-формат: header `{icon} {Role} — {описание}`, опциональная строка `Verdict/Status: …` из YAML-frontmatter артефакта, **строка `Длительность: 4m 12s`** (явный `duration_s` от launcher, fallback из `agent_runs` для аналитика), `Документы:`, тех-хвост `tokens · cost`. Утилитки: `usage.fmt_duration`, `usage.get_agent_duration`, новый модуль `src/frontmatter.py` (defensive YAML reader). ADR `docs/work-items/ORCH-016/06-adr/ADR-001-unified-status-comment.md`. - **Документация по канону** (ORCH-9): `CLAUDE.md` (паспорт проекта), структура `docs/` (`architecture/` + `adr/`, `operations/`, `work-items/`, `history/`), `docs/operations/INFRA.md` (RUNBOOK с инфра-изоляцией и self-hosting рисками). - **ADR**: adr-0001 (multi-repo registry), adr-0002 (job queue), adr-0003 (условный staging-гейт). - **Стадия `deploy-staging`** (ORCH-35): промежуточный гейт между `testing` и `deploy`. QG `check_staging_status` (условный, только для self-hosting repo). PR #31. @@ -14,6 +15,7 @@ - **Реестр проектов** (ORCH-6): `src/projects.py`, фильтрация вебхуков по проекту. ### Changed +- **Status-коммент агентов теперь HTML и единообразен** (ORCH-016): `src/usage.usage_comment(...)` помечен deprecated и стал тонкой обёрткой над `build_status_comment`; `src/usage.artifact_links(...)` теперь возвращает `
  • ` HTML-фрагменты (раньше — markdown `[label](url)`); `stage_engine._build_analyst_ready_comment(...)` — тонкая обёртка, аналитик идёт через ту же ветку `build_status_comment(agent="analyst", ...)`. Реестр `QG_CHECKS` и `STAGE_TRANSITIONS` НЕ изменялись. - Цепочка стадий: `... testing → deploy-staging → deploy → done` (была без `deploy-staging`). ### Fixed diff --git a/docs/architecture/README.md b/docs/architecture/README.md index 62f7ad9..3eef0ce 100644 --- a/docs/architecture/README.md +++ b/docs/architecture/README.md @@ -46,6 +46,21 @@ created → analysis → architecture → development → review → testing → - Deploy / deploy-staging FAILED → откат на `development`. - `get_previous_stage` использует порядок ключей `STAGE_TRANSITIONS`. +### Plane Sync: единый status-коммент агентов (ORCH-016) +Все агенты (analyst / architect / developer / reviewer / tester / deployer) пишут финальный коммент через **один хелпер** `usage.build_status_comment(...)` (ADR `docs/work-items/ORCH-016/06-adr/ADR-001-unified-status-comment.md`). Формат HTML, разделители `
    `: + +``` +{ICON} {RoleName} — {описание стадии} +[Verdict|Status: VALUE] # reviewer/tester/deployer, из YAML-frontmatter артефакта +[Длительность: 4m 12s] # явный duration_s от launcher, либо fallback из agent_runs +Документы: +[8.5M in / 45.8k out · $7.29] # тех-хвост usage; опускается при нулях +``` + +- **Длительность** считается launcher'ом (`_monitor_agent`) и пробрасывается в `_post_usage_comments`; для analyst (коммент строится в `stage_engine`) используется DB-фоллбэк `usage.get_agent_duration(task_id, agent)`. +- **Vердикт-парсер** — `src/frontmatter.read_frontmatter_value(...)` (defensive, никогда не raise). Машинные ключи: `verdict:` (reviewer/tester), `deploy_status:` (14-deploy-log.md), `staging_status:` (15-staging-log.md). +- Формат коммента **не** меняет реестр гейтов и стадий; коммент — отображение, не управление. + ## База данных (SQLite) - `events` — входящие вебхуки (дедуп) - `tasks` — задачи и их стадии diff --git a/docs/work-items/ORCH-016/00-business-request.md b/docs/work-items/ORCH-016/00-business-request.md new file mode 100644 index 0000000..90b7629 --- /dev/null +++ b/docs/work-items/ORCH-016/00-business-request.md @@ -0,0 +1,7 @@ +# Business Request: Единообразные коммент-артефакты в Plane от всех агентов + +Work Item ID: ORCH-016 + +## Description + +TBD diff --git a/docs/work-items/ORCH-016/01-brd.md b/docs/work-items/ORCH-016/01-brd.md new file mode 100644 index 0000000..94d6ad8 --- /dev/null +++ b/docs/work-items/ORCH-016/01-brd.md @@ -0,0 +1,85 @@ +# BRD: Единообразные коммент-артефакты в Plane от всех агентов + +Work Item ID: **ORCH-016** +Стадия: analysis +Автор: analyst +Дата: 2026-06-05 +Ревизия: 2 (учтён фидбэк стейкхолдера от 2026-06-05 — добавить длительность работы агента в коммент) + +--- + +## 1. Бизнес-цель +Стейкхолдер (Слава) должен мочь из ленты комментариев задачи в Plane **за один клик** перейти к артефакту любого агента (ADR, PR, ревью, отчёт тестера, деплой-лог), а не разбирать «шумные» строки без удобной ссылки и человекочитаемого описания. +Помимо ссылок, по комментариям стейкхолдер хочет **видеть, сколько работал каждый агент** (длительность стадии), не открывая БД оркестратора и не лезя в `agent_runs`. + +## 2. Мотивация +Сейчас в Plane комменты двух разных стилей: + +| Кто пишет | Формат коммента | Источник | +|-----------|-----------------|----------| +| **Аналитик (эталон)** | HTML: человеческое описание стадии + `