From f200cf9569d44ab8b8dc8d3e3492b67fdb8823ad Mon Sep 17 00:00:00 2001 From: Taiga Date: Thu, 18 Jun 2026 05:54:09 +0000 Subject: [PATCH] [2026-06-18] taiga-vault: personal/projects/zulip-router-approval-reactions.md --- .../zulip-router-approval-reactions.md | 43 ++++++++++++++++--- 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/personal/projects/zulip-router-approval-reactions.md b/personal/projects/zulip-router-approval-reactions.md index 3ac33f59..4da0e31a 100644 --- a/personal/projects/zulip-router-approval-reactions.md +++ b/personal/projects/zulip-router-approval-reactions.md @@ -204,6 +204,36 @@ func (z *ZulipClient) addReaction(messageID int64, emojiName, emojiCode string) } ``` +## Баги Hermes webhook + +### Баг 1: Сообщения дропаются если был approval interrupt + +Если агент запросил approval и ты ответил (даже не /approve, а любое сообщение), все сообщения которые были до ответа на approval — теряются. Агент их не получает. + +**Воспроизведение:** +1. Агент шлёт approval request +2. Ты продолжаешь писать другие сообщения в треде +3. Ты отвечаешь на approval +4. Агент получает только approval-ответ, всё что было между — дропнуто + +**Root cause:** `interrupt_gateway_approvals()` + `interrupt()` в `_route_to_active_session()` сбрасывает сообщения агента и восстанавливает стейт на момент approval. Промежуточные сообщения (между approval и ответом) не вшиты в этот стейт. + +**Фикс:** ? (Пока не чинили) + +### Баг 2: Стриминг не работает + +Hermes не стримит ответ через webhook — агент отвечает одним блоком после завершения генерации. Пользователь не видит процесс печати. + +**Root cause:** Webhook-транспорт не поддерживает стриминг — ответ формируется целиком и шлётся одним POST-запросом в Zulip через роутер. + +**Фикс:** ? (Пока не чинили) + +### Баг 3 (Phase 2): Seed реакций не срабатывал из-за skip_bot_messages + +`isApprovalMessage` и `seedApprovalReactions` в коде Phase 2 стояли ПОСЛЕ guard-а `if senderIsBot && cfg.SkipBotMessages`. Approval-сообщения шлются от бота → `SkipBotMessages = true` → processEvent выходил раньше, чем seed ставился. + +**Фикс 18.06.2026:** Перенёс seed-логику ДО guard'а `SkipBotMessages` — seedApprovalReactions вызывается сразу после определения senderIsBot, до любой фильтрации. + ## Изменения в Hermes (для `/approve` текстом) ### run.py — _route_to_active_session @@ -250,7 +280,7 @@ Hermes **не отправляет пользователю нотификаци ### Phase 1b: `/reset` (✅ проверено 18.06.2026) - [x] `/reset` — сбрасывает контекст. Проверено 18.06.2026. -#### Phase 2: Реакции через роутер — реализация +### Phase 2: Реакции через роутер — реализация - [x] Добавить reaction-поля в `ZulipEvent` (config.go) - [x] Добавить `"reaction"` в event_types и обработку в main.go - [x] Создать MessageOwnerStore в ownership.go @@ -258,9 +288,10 @@ Hermes **не отправляет пользователю нотификаци - [x] Реализовать обработчик реакции: emoji → choice → Forward - [x] Pre-seed реакций на approval-сообщения - [x] Собрать и перезапустить роутер +- [x] Починить seed — перенести ДО `skip_bot_messages` guard'а (seed ставился после выхода) +- [ ] ✅ Образ пересобран с фиксом, контейнер **не перезапущен** (ждёт аппрува) +- [ ] Проверить что seed-реакции ставятся на approval-сообщения +- [ ] Проверить что реакция 👎 форвардит choice="approve:deny" назад в Hermes - [ ] Проверить что POST с trigger="approve:once" правильно обрабатывается Hermes -- [ ] Добавить обработку reaction в `processEvent` -- [ ] Реализовать message_id → bot_name маппинг -- [ ] Добавить `addReaction` в zulip.go -- [ ] Добавить pre-seed реакций на approval-сообщения -- [ ] Проверить что POST с trigger="approve:once" правильно обрабатывается Hermes +- [ ] Закоммитить изменения в git +- [ ] Обновить доку окончательно