Files
agents_and_robots/dev/issues/completed/0034-e2e-create-bot-skill.md
T
egutierrez 43c70e904b docs: cerrar issue 0034 y actualizar CLAUDE.md
- Añadir test-bot a tabla de agentes en CLAUDE.md
- Añadir nuevos specs E2E a la lista de tests
- Mover issue a completed, actualizar README

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 20:45:17 +00:00

143 lines
6.9 KiB
Markdown

# 0034 — E2E: verificar skill /create-bot con robot de prueba
## Objetivo
Crear un robot de prueba usando la skill `/create-bot` y escribir tests E2E con Playwright que verifiquen que el robot se creo correctamente y responde a comandos en Matrix. Esto valida el pipeline completo: scaffold → build → register → verify → comandos funcionales.
## Contexto
- La skill `/create-bot` existe en `.claude/skills/create-bot/` y ejecuta `create-full.sh` + conversion a robot
- Ya hay E2E tests para agentes (`assistant-bot`, `asistente-2`) en `e2e/tests/`
- No hay tests que validen robots ni el pipeline de creacion de bots
- Los robots solo responden a comandos (`!xxx`), no tienen LLM — los assertions pueden ser estrictos (deterministicos)
- El issue 0032 hace lo mismo pero para agentes con LLM — este es el equivalente para robots
## Arquitectura
```
agents/test-bot/ NEW — robot creado por /create-bot
agents/test-bot/agent.go NEW — Rules() retorna nil
agents/test-bot/config.yaml NEW — config tipo robot
agents/test-bot/commands.go NEW — comandos custom de prueba
cmd/launcher/main.go MOD — blank import + registro de comandos custom
e2e/tests/test-bot.spec.ts NEW — tests E2E del robot
e2e/tests/create-bot-pipeline.spec.ts NEW — tests del pipeline de creacion
```
### Patron pure core / impure shell
- `pkg/` — sin cambios
- `shell/` — sin cambios
- `agents/test-bot/` — composicion: agent.go puro (nil rules) + config YAML + commands.go
- `e2e/` — tests Playwright (fuera del modulo Go)
## Tareas
### Fase 1: Crear robot de prueba con /create-bot
- [ ] **1.1** Ejecutar `/create-bot test-bot "Test Bot"` con los siguientes inputs:
- `bot-id`: `test-bot`
- `display-name`: `"Test Bot"`
- `description`: `"Robot de prueba para validar el pipeline de creacion de bots"`
- Comandos custom: `!echo <text>` (repite el texto), `!dice` (numero aleatorio 1-6)
- [ ] **1.2** Verificar que `create-full.sh` completa las 4 etapas sin errores
- [ ] **1.3** Verificar que el config tiene `agent.type: robot`
- [ ] **1.4** Verificar que no existe `agents/test-bot/prompts/` (robots no tienen system prompt)
- [ ] **1.5** Implementar los comandos custom en `agents/test-bot/commands.go`:
- `!echo <text>`: devuelve el texto tal cual (util para assertions exactas)
- `!dice`: devuelve un numero aleatorio entre 1 y 6
- [ ] **1.6** Registrar comandos en `cmd/launcher/main.go`
- [ ] **1.7** Verificar compilacion: `go build -tags goolm ./...`
- [ ] **1.8** Arrancar y verificar que el robot responde: `./dev-scripts/server/start.sh`
### Fase 2: E2E tests del robot
- [ ] **2.1** Crear `e2e/tests/test-bot.spec.ts` con los siguientes tests:
- **!help funciona**: enviar `!help` → verificar que lista comandos built-in + custom (echo, dice)
- **!ping funciona**: enviar `!ping` → verificar respuesta (assertion estricta)
- **!echo funciona**: enviar `!echo hello world` → verificar que responde "hello world" (assertion estricta)
- **!dice funciona**: enviar `!dice` → verificar que responde un numero entre 1 y 6
- **Comando desconocido**: enviar `!unknown` → verificar respuesta de error
- **Mensaje normal ignorado**: enviar "hola" sin prefijo → verificar que NO responde (silencio)
- **Sin errores de descifrado**: verificar `assertNoDecryptionErrors` en cada test
- [ ] **2.2** Seguir el patron de los tests existentes para fixtures, imports y estructura
- [ ] **2.3** Ejecutar los tests: `./dev-scripts/e2e/run.sh test-bot`
### Fase 3: E2E test del pipeline de creacion (validacion estructural)
- [ ] **3.1** Crear `e2e/tests/create-bot-pipeline.spec.ts` que valide la estructura:
- Verificar que `agents/test-bot/agent.go` existe y `Rules()` retorna nil
- Verificar que `agents/test-bot/config.yaml` tiene `agent.type: robot`
- Verificar que NO existe `agents/test-bot/prompts/system.md`
- Verificar que `cmd/launcher/main.go` tiene el blank import
- Verificar que `agents/test-bot/commands.go` existe
- [ ] **3.2** Estos tests pueden ser scripts bash o tests Node.js — no requieren Playwright
### Fase 4: Tests
- [ ] **4.1** Ejecutar suite E2E completa: `./dev-scripts/e2e/run.sh`
- [ ] **4.2** Verificar que tests existentes siguen pasando (no regresion)
- [ ] **4.3** Verificar build completo: `go build -tags goolm ./...` y `go test -tags goolm ./...`
### Fase 5: Cleanup y docs
- [ ] **5.1** Actualizar `CLAUDE.md` tabla de agentes con `test-bot` (tipo robot)
- [ ] **5.2** Documentar en `e2e/README.md` el nuevo spec y la estrategia de testing para robots
## Ejemplo de uso
```
# 1. Crear el robot con la skill
> /create-bot test-bot "Test Bot"
(skill ejecuta create-full.sh, convierte a robot, crea comandos)
# 2. Arrancar y probar manualmente
> ./dev-scripts/server/start.sh
> (en Matrix) !help
< Comandos disponibles:
< !help — Muestra esta ayuda
< !ping — Verifica conectividad
< !echo — Repite el texto
< !dice — Lanza un dado (1-6)
> !echo hola mundo
< hola mundo
> !dice
< 4
> hola # mensaje sin prefijo
> (sin respuesta) # robot lo ignora
# 3. Correr E2E
> ./dev-scripts/e2e/run.sh test-bot
✓ !help lista todos los comandos (2s)
✓ !ping responde (2s)
✓ !echo repite el texto (2s)
✓ !dice devuelve numero valido (2s)
✓ comando desconocido muestra error (2s)
✓ mensaje sin prefijo es ignorado (5s)
6 passed
```
## Decisiones de diseno
- **Assertions estrictas**: a diferencia de los tests de agentes con LLM (assertions flexibles por no-determinismo), los tests de robots son 100% deterministicos. Cada comando tiene una respuesta predecible → assertions exactas.
- **`!echo` como comando de prueba**: permite enviar cualquier texto y verificar que lo devuelve exactamente — ideal para debugging y assertions.
- **`!dice` como comando con variabilidad**: permite testear que el bot responde algo valido dentro de un rango, sin ser deterministico exacto.
- **Test de silencio**: verificar que un mensaje normal NO genera respuesta es critico para robots — asegura que el robot no intenta procesar mensajes como un agente LLM.
- **Robot permanente**: el robot de prueba se queda en el repo como referencia de creacion y target permanente para E2E.
## Prerequisitos
- Issue 0030 completado (Robot vs Agent separacion) ✓
- Skill `/create-bot` funcionando (en `.claude/skills/create-bot/`)
- E2E infrastructure funcionando (issue 0022 completado) ✓
- Variables de entorno del homeserver configuradas
## Riesgos
- **create-full.sh no soporta robots nativamente**: el script crea un agente por defecto, la skill lo convierte despues. Riesgo bajo — la conversion es solo editar config y borrar prompts.
- **Timing en test de silencio**: verificar que el bot NO responde requiere esperar un timeout. Mitigacion: timeout corto (5s) ya que los robots responden en <1s.
- **E2EE verification**: el robot necesita cross-signing funcional. Mitigacion: `verify.sh` ya maneja esto.