Files
agents_and_robots/.claude/plans/03-bot-interaction.md
T

80 lines
2.7 KiB
Markdown

# Plan: Interacción entre bots en una sala compartida
## Objetivo
Que múltiples bots convivan en una sala Matrix, se "escuchen" entre sí y puedan
colaborar en tareas — sin crear bucles infinitos.
## Estado: pendiente
---
## Problema central: evitar bucles
Si bot-A responde a bot-B y bot-B responde a bot-A, se genera un bucle.
### Solución: reglas de anti-bucle en el motor de decisión
1. Cada mensaje lleva metadatos `sender` y opcionalmente `m.relates_to`
2. El `MatchFunc` de las reglas puede filtrar por `IsBot(sender)` y
aplicar lógica de cooldown o turno
3. El sistema de bus interno (`shell/bus/`) puede coordinar turnos
---
## Diseño
### Nuevo tipo de sala: `SharedRoom`
Configurar en `config.yaml` bajo una sección `rooms`:
```yaml
rooms:
- id: "!roomid:matrix.server.com"
type: "shared" # sala compartida entre bots
participants: # agentes que participan
- assistant-bot
- devops-bot
turn_based: false # si true, los bots se turnan por ronda
respond_to_bots: true # si false, solo responden a humanos
```
### Lógica en `agents/runtime.go`
- Al recibir un evento en una sala compartida, verificar si `sender` es un bot conocido
- Aplicar una regla de "bot puede responder a bot" solo si:
- La sala tiene `respond_to_bots: true`
- No hay respuesta pendiente del mismo bot en los últimos N segundos (cooldown)
- No es una respuesta a un mensaje propio
### Coordinación con el bus (`shell/bus/`)
- Publicar en el bus interno cuando un bot habla en una sala compartida
- Los otros bots suscritos al bus pueden reaccionar sin pasar por Matrix
- Posible uso: bot-A pide ayuda a bot-B por el bus, bot-B responde en Matrix
---
## Reglas puras (`pkg/decision/`)
Nuevas funciones de match:
```go
func SenderIsBot(knownBots []string) MatchFunc
func NotRepliedRecently(cooldown time.Duration) MatchFunc // requiere estado externo
func SenderIsHuman(knownBots []string) MatchFunc
```
---
## Anti-bucle: cooldown simple
En `agents/runtime.go` mantener `map[roomID]time.Time` con el último mensaje enviado.
Si `now - lastSent < cooldown`, no responder en esa sala.
Cooldown configurable: `rooms[].response_cooldown_seconds`.
---
## Archivos a crear/modificar
- `internal/config/schema.go` — añadir `RoomCfg` con campos shared room
- `pkg/decision/matchers.go` — SenderIsBot, SenderIsHuman
- `agents/runtime.go` — lógica de salas compartidas y cooldown
- `shell/bus/bus.go` — publicar eventos cross-bot
- `agents/<id>/agent.go` — reglas específicas para salas compartidas
## Notas
- Fase 1: solo cooldown simple — un bot no responde más de 1 vez por minuto en
una sala compartida
- Fase 2: turno basado en bus interno
- Fase 3: colaboración estructurada (bot-A delega tarea a bot-B y espera resultado)