auto-sync: 2026-06-03 11:00:01

This commit is contained in:
Stream
2026-06-03 11:00:01 +03:00
parent e0123668be
commit 5944bd226d
2 changed files with 111 additions and 22 deletions

View File

@@ -0,0 +1,83 @@
# Dev Report: Plane per-agent comment authorship
Дата: 2026-06-03
Статус: DONE (PR открыт, НЕ смержен — мерж за Стримом)
## Задача
Комментарии в Plane должны постится под токеном агента-бота, чтобы был виден
реальный автор (analyst/architect/dev/reviewer/tester/deployer/Стрим), а не
единый mva154. Только код — токены/БД Plane/инфра уже готовы.
## Сделано
- [x] Ветка `feature/plane-per-agent-author` из свежего main
- [x] config.py: 7 полей bot-токенов (env ORCH_PLANE_BOT_*, дефолт "")
- [x] plane_sync.py: PLANE_BOT_TOKENS, STAGE_AUTHORS, _headers_for(), add_comment(author=)
- [x] Прокинут author во все точки вызова
- [x] GET/PATCH НЕ тронуты (под общим токеном)
- [x] tests/test_plane_author.py — 8 тестов, все passed
- [x] Conventional Commits (2 коммита)
- [x] Push + remote проверен + PR #9
## Изменённые файлы
- `src/config.py` — +7 полей plane_bot_*
- `src/plane_sync.py` — PLANE_BOT_TOKENS, STAGE_AUTHORS, _headers_for, add_comment(author=), notify_* проброс
- `src/stage_engine.py` — author= в 5 plane_add_comment
- `src/agents/launcher.py` — author= в plane_add_comment (deploy failed)
- `src/webhooks/plane.py` — author= в 5 точках
- `tests/test_plane_author.py` — НОВЫЙ
## Таблица: точка вызова → выбранный author
| Файл | Строка/контекст | Текст (суть) | author |
|------|-----------------|--------------|--------|
| stage_engine.py | ~284 | BRD/ТЗ/AC/TestPlan готовы, прошу review | analyst |
| stage_engine.py | ~305 | Analyst нуждается в уточнении (вопросы) | analyst |
| stage_engine.py | ~316 | Analyst завершился без артефактов | analyst |
| stage_engine.py | ~369 | Тесты не прошли, Developer перезапущен (QG tester) | tester |
| stage_engine.py | ~409 | Architect нашёл конфликт с ТЗ, возврат в Analysis | architect |
| agents/launcher.py | ~472 | Deploy FAILED, rolled back | deployer (agent=="deployer" в контексте) |
| webhooks/plane.py | ~212 | Analyst запущен | analyst |
| webhooks/plane.py | ~255 | Analyst перезапущен (rejected) | analyst |
| webhooks/plane.py | ~267 | Откат: current→prev | STAGE_AUTHORS[prev_stage] (агент целевой стадии), fallback stream |
| webhooks/plane.py | ~310 | 3 раунда уточнений исчерпаны | analyst |
| webhooks/plane.py | ~329 | Analyst перезапущен с ответами стейкхолдера | analyst |
| plane_sync.notify_stage_change | 🔄 Stage | переход стадий | **stream** |
| plane_sync.notify_qg_failure | ⚠️ QG failed | провал QG | STAGE_AUTHORS[stage], fallback stream |
| plane_sync.notify_done | ✅ Task completed | задача завершена | **deployer** |
Соответствует ТЗ. Неочевидных точек, потребовавших произвольного "stream",
не возникло — у webhook:267 (откат) использован STAGE_AUTHORS по целевой стадии,
fallback на stream если стадия вне карты.
## _headers_for / fallback
```python
def _headers_for(author):
tok = PLANE_BOT_TOKENS.get(author or "") if author else None
return {"X-API-Key": tok} if tok else PLANE_HEADERS
```
None / неизвестная роль / пустой токен → PLANE_HEADERS (общий orchestrator-токен,
автономность). Только POST add_comment использует _headers_for; GET/PATCH — PLANE_HEADERS.
## Результат тестов
- tests/test_plane_author.py: **8 passed**
- Полный прогон: **166 passed, 9 failed**
- 158 baseline + 8 новых = 166 ✓
- 9 failed — все в tests/test_webhooks.py (401 invalid signature + 1 каскадный
TypeError от 401). Это документированный pre-existing baseline (9 pre-existing 401),
к моему коду отношения не имеют.
- Контейнер: `IMG=$(docker inspect orchestrator --format '{{.Config.Image}}'); docker run --rm -v /home/slin/repos/orchestrator:/code -w /code --entrypoint python3 $IMG -m pytest tests/ -q`
## Проблемы и решения
- **Образ контейнера уже содержит ORCH_PLANE_BOT_* env-переменные.** При прогоне
тестов на ЧИСТОМ main (без полей в config.py) pydantic падает с `extra_forbidden`
— то есть мой config.py-патч ОБЯЗАТЕЛЕН для работоспособности на живом хосте.
На моей ветке всё валидно.
- На сервере был отдельный pre-existing `git stash` (WIP ORCH-1) — НЕ трогал, он на месте.
- `.env.bak-1780472695` — pre-existing untracked файл, не мой, не трогал.
- Gitea-токен из env контейнера (c81227...) рабочий, совпадает с origin URL; PR создан им.
## Git / PR
- Коммиты:
- `30d6dd0 feat(config): add per-agent Plane bot token settings`
- `d305521 feat(plane): per-agent bot authorship for comments`
- `git log origin/main..origin/feature/plane-per-agent-author` → ОБА коммита присутствуют на remote ✓
- PR: **#9** → https://git.mva154.duckdns.org/admin/orchestrator/pulls/9 (base: main)
- НЕ деплоил, НЕ мержил. Мерж — Стрим, после живой проверки + реального тест-комментария от каждого бота.