[2026-06-18] eagle: personal/projects/zulip-router-approval-reactions.md

This commit is contained in:
Alexey Martemyanov
2026-06-18 11:50:51 +06:00
parent 496b82269e
commit 2205a1988d
@@ -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
- [ ] Обновить доку окончательно