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

2.7 KiB

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:

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:

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)