Pruebas basadas en evidencia
Registra pruebas anotadas del comportamiento y luego adjúntalas al PR y al issue del gestor de tareas.
La grabación es la captura de ti probando la aplicación mediante el uso del ordenador: inicia el grabador, luego maneja la aplicación tú mismo — haz clic, escribe, navega — a través de cada objetivo de prueba. Cada acción en el vídeo es la prueba realizándose en vivo; la grabación no tiene valor como evidencia a menos que muestre esa sesión interactiva. Si el entorno no tiene herramientas de uso del ordenador pero existe una interfaz gráfica, maneja la aplicación con cua-driver en su lugar (ver más abajo) — sigue siendo tu sesión en vivo.
El grabador incluido, scripts/evidence.py, captura la pantalla con FFmpeg en Linux, macOS y Windows, marca la hora de cada anotación que agregas mientras pruebas, las incrusta en el vídeo al detenerse y verifica el resultado con ffprobe. Escribe evidence.mp4, report.md y manifest.json en la carpeta de la sesión.
Entradas
- Objetivos de prueba (obligatorio): Los comportamientos/flujos a verificar, expresados como afirmaciones comprobables.
- PR / issue (opcional): Dónde publicar la evidencia. Si se omite, entregar solo al solicitante.
El grabador
EVIDENCE a continuación significa la ruta a scripts/evidence.py dentro de la carpeta de esta habilidad (dondequiera que esté instalada, por ejemplo, ~/.claude/skills/evidence-driven-testing/scripts/evidence.py). Solo necesita Python 3 y FFmpeg.
-
Verificar primero:
python3 $EVIDENCE doctor— verificaffmpeg,ffprobe,libx264y el filtroass(ready), luego qué fuente de captura de pantalla funciona en esta máquina (capture_readyy la fuenteautoelegirá). Sale con código distinto de cero solo cuando falta la cadena de herramientas; leacapture_readyantes de grabar. -
Plataformas (
--source autoelige la primera disponible):SO Fuente Necesita Linux X11 / XWayland x11(x11grab)DISPLAYestablecidoLinux Wayland wayland(wf-recorder)WAYLAND_DISPLAYestablecido,wf-recorderen PATH y un compositor confirmado que soporte wlr-screencopy — ya sea un conocido basado en wlroots (Sway, Hyprland, river, Wayfire, labwc, dwl, niri) o verificado mediantewayland-info. GNOME y KDE Wayland no se pueden capturar de esta manera;doctorlo indica. Usex11a través de XWayland para aplicaciones X11, o un grabador alternativo.--source waylandaún lo fuerzamacOS avfoundationPermiso de Grabación de Pantalla concedido al terminal / aplicación anfitriona del agente; doctorlista los índices de pantalla para--screen-indexWindows gdigrabcualquier compilación estándar de ffmpeg; powershellpara comprobaciones de procesosLa captura es la pantalla completa por defecto;
--geometry WxHy--offset X,Yrecortan una región en x11, wayland y gdigrab. XWayland solo ve ventanas X11, por lo que se prefiere la fuentewaylandcuando la aplicación bajo prueba es nativa de Wayland. -
Captura bruta a prueba de fallos: la grabación bruta es MPEG-TS (
raw.ts), por lo que si el grabador se mata forzosamente o falla, lo capturado aún se puede sondear y renderizar.stoplo remuxifica o reconvierte en unevidence.mp4estándar. -
Cómo funciona la detención: en Linux el grabador se señaliza a través de un pidfd. En macOS y Windows
startlanza un pequeño proceso supervisor que posee el proceso hijo ffmpeg, ystople pide (a través destop.requesten la carpeta de sesión) que interrumpa, luego termine y luego mate; escriberecorder-exit.jsoncuando termina. Nunca se señaliza un PID simple, por lo que no se puede alcanzar un PID reciclado. Si el supervisor muere mientras el grabador aún se está ejecutando,stopse niega y te dice qué PID detener manualmente. Si murió antes de poder registrar qué proceso inició,stoppermanece bloqueado hasta que hayas verificado tú mismo un grabador perdido y lo vuelvas a ejecutar con--accept-untracked-recorder; el informe entonces lleva esa advertencia. -
Grabadores alternativos cuando
doctorno informa ninguna fuente de captura (por ejemplo, Wayland sin wf-recorder):cua-driver recording start <dir>/stop(ver la sección cua-driver), o el grabador del SO (macOS:screencapture -v out.mov). En estas rutas no hay superposición de anotaciones, así que mantén el protocolo de anotaciones como archivos: unassertions.mdque liste cadasetup/test_start/assertioncon su resultado y la marca de tiempo aproximada del vídeo, exactamente como en la ruta headless. -
Nunca presentes
--source test(el generador de patrones sintéticos) como evidencia de interfaz de usuario. Existe para pruebas de humo de la cadena de herramientas;tests/test_evidence.pydel repositorio lo ejercita.
Instrucciones
1. Preparar la pantalla
- Maximiza la ventana del navegador/aplicación; cierra ventanas emergentes, notificaciones y paneles adicionales.
- Navega al estado inicial (sesión iniciada, página correcta) ANTES de grabar, a menos que la configuración en sí misma esté bajo prueba.
- Anota la revisión exacta bajo prueba:
git rev-parse HEADygit branch --show-current(o la URL de despliegue) — el grabador las estampa en el informe.
2. Iniciar la grabación
-
Inicia la grabación de pantalla antes de la primera acción significativa:
python3 $EVIDENCE start \ --output .artifacts/<task-name> \ --title "<lo que se está verificando>" \ --commit "$(git rev-parse HEAD)" --branch "$(git branch --show-current)" \ --environment "<SO / navegador / pantalla / despliegue>"Imprime JSON con una ruta de
sessiony lasourceelegida; guarda la ruta (SESSION=...) para cada comando posterior. La fuente se detecta automáticamente y se captura toda la pantalla; pasa--source,--geometry,--offset,--display/--xauthority(X11),--screen-index(macOS) o--output-name(Wayland) solo cuandodoctoro la situación lo requiera. -
Añade una anotación
setupdescribiendo el contexto inicial:python3 $EVIDENCE annotate "$SESSION" --type setup \ --message "Sesión iniciada, navegando a la página de conectores"
3. Probar mediante uso del ordenador, anotando sobre la marcha
-
Realiza cada interacción a través del uso del ordenador en la aplicación en vivo — la grabación captura tu sesión, por lo que la prueba y la evidencia son el mismo acto. Trabaja a un ritmo observable: deja que la interfaz de usuario se estabilice después de cada acción para que los cambios de estado sean visibles en el vídeo.
-
Al inicio de cada prueba con nombre, añade una anotación
test_startal estilo Jest:python3 $EVIDENCE annotate "$SESSION" --type test_start \ --message "Debería ejecutar la herramienta directamente cuando el permiso es 'siempre'" -
Después de cada comprobación, añade una anotación
assertioncon--result passed,failedountested:python3 $EVIDENCE annotate "$SESSION" --type assertion --result passed \ --message "La herramienta se ejecutó sin un aviso de permiso" -
Reglas para las afirmaciones:
- Una afirmación por cambio de estado significativo — consolida, no anotes por cada etiqueta de la interfaz.
- Usa afirmaciones "Precondición: ..." para establecer el estado inicial.
- Mantén menos de 80 caracteres, con alta señal (el grabador rechaza mensajes más largos).
- Si una prueba no puede ejecutarse (falta un requisito previo, ventana de autenticación expirada), márcala como
untestedcon el motivo — nunca la omitas en silencio. - La marca de tiempo registra cuándo afirmaste, no si era verdad — mira la pantalla antes de elegir
passed.
4. Detener y revisar
-
Detén la grabación después de la afirmación final:
python3 $EVIDENCE stop "$SESSION"Esto detiene la captura (de forma ordenada, para que el grabador vacíe el búfer; solo escala si ignora la solicitud), incrusta las anotaciones en
evidence.mp4, sondea el resultado y escribereport.mdymanifest.jsonjunto a él. Imprime"verified": trueen caso de éxito; si el renderizado falla, la sesión se marca comofinalization_failed— corrige la causa informada y ejecutastopde nuevo (un reintento no señaliza el grabador dos veces). Si el proceso del grabador ya no se puede señalizar de forma segura (murió, o su PID ahora pertenece a otro proceso), la sesión se marca comorecorder_lost. Ejecutarstopde nuevo finaliza el vídeo que se haya capturado, pero solo una vez que se confirma que ese proceso del grabador ha desaparecido — si aún está vivo, detenlo primero, o el vídeo se renderizaría mientras aún se está escribiendo. -
Confirma que la grabación capturó los momentos clave antes de compartir: extrae un fotograma en cada marca de tiempo de afirmación (
ffmpeg -ss <t> -i evidence.mp4 -frames:v 1 frame.png) y verifica que el estado y la etiqueta sean visibles. -
Completa la sección de Advertencias de
report.md; nunca dejes el marcador de posición.
5. Publicar la evidencia
report.mdes el informe: qué se probó, entorno + commit exacto, pasa/falla por prueba, advertencias. Amplíalo en lugar de reescribirlo desde cero.- Publica el vídeo + resumen como un comentario en el PR (incrusta en la descripción del PR si es tu PR).
gh pr commentno puede adjuntar un vídeo local — subeevidence.mp4a través del cuadro de comentarios del PR en un navegador autenticado, o súbelo a un host y enlázalo (por ejemplo, los adaptadores de subidabefore-and-after). Vuelve a abrir el comentario y confirma que el vídeo se reproduce antes de afirmar que está publicado. - Adjunta el mismo vídeo al issue del gestor de tareas (Linear/Jira) con un resumen de una línea.
- Envía el informe + grabación al solicitante.
Barreras de seguridad
- El vídeo debe mostrar la sesión de prueba real siendo manejada en vivo. Nunca presentes reproducción por script, clips unidos o material sintético como una grabación; si el entorno carece de herramientas de uso del ordenador pero existe una interfaz gráfica, maneja mediante
cua-driver; sin interfaz gráfica en absoluto, usa la ruta headless en su lugar. - Nunca grabes una ventana medio cubierta o en mosaico — maximízala primero.
- Nunca grabes una pantalla que muestre secretos, tokens, datos de clientes o detalles de pago; si un flujo los requiere, márcalo como
untestedy di por qué. - Al verificar una corrección, muestra o referencia el fallo anterior junto con el nuevo éxito.
- Indica siempre el commit/rama/despliegue exacto contra el que se probó.
¿Sin herramientas de uso del ordenador? Maneja con cua-driver (interfaz gráfica disponible)
Cuando existe una pantalla pero el agente no tiene capacidad incorporada de uso del ordenador, usa cua-driver (macOS / Windows / Linux) como actuador. Sigues siendo tú probando la aplicación en vivo — la regla de grabación se mantiene sin cambios; solo difiere el mecanismo de entrada.
- Verifica la configuración con
cua-driver doctorantes de grabar. Si hay una habilidad decua-driverinstalada, léela y sigue su protocolo — el invariante de captura de pantalla antes de la acción es obligatorio. - Bucle por interacción:
launch_app→get_window_state(árbol de accesibilidad + captura de pantalla) → actúa medianteelement_token(click,type_text,press_key) →verify_statepara la postcondición esperada. Cada comprobaciónverify_statese asigna 1:1 a una anotaciónassertion. - Donde
doctorinformecapture_ready: yes, sigue usando el grabador incluido anteriormente para el vídeo y las anotaciones; cua-driver solo proporciona la entrada. - De lo contrario,
cua-driver recording start <output-dir>/cua-driver recording stopes el grabador (el directorio de salida es obligatorio y el demonio debe estar ejecutándose:cua-driver serve). La captura de vídeo está activada por defecto y se finaliza en<output-dir>/recording.mp4al detenerse — pero en Windows/Linux se delega a ffmpeg, por lo que una falta de ffmpeg o de pantalla produce solo las carpetas de trayectoria por turno (capturas de antes/después,action.json,click.png), sin vídeo. Después de detener, verifica querecording.mp4existe antes de citarlo; si está ausente, corrige el grabador o presenta las capturas de antes/después por turno como capturas numeradas según el protocolo headless. - Si no hay superposición de anotaciones disponible en esta ruta, mantén el protocolo como archivos: un
assertions.mdque liste cadatest_start/assertioncon su resultado, exactamente como en la ruta headless.
Ruta headless (sin interfaz gráfica disponible)
Cuando el agente no tiene escritorio que grabar, mantén la misma disciplina de afirmaciones; cambia el grabador por captura por script:
-
Guarda todo en
.artifacts/<task-name>/(inclúyelo en.gitignore— la evidencia se sube, nunca se confirma). Mantén el script de captura junto a las capturas para que la ejecución sea repetible. -
Capturas de pantalla: la CLI
before-and-after(@vercel/before-and-after) captura URLs o elementos y sus pares alimentan directamente las inserciones en el PR. En contenedores/VMs donde Chrome falla con "No usable sandbox", estableceAGENT_BROWSER_ARGS="--no-sandbox". -
Vídeo / flujos de varios pasos: un script de Playwright único, ejecutado sin añadir playwright a las dependencias del proyecto:
npx --yes --package=playwright node record.mjs(El simple
npx playwright node record.mjsfalla —nodeno es un comando CLI de Playwright;--package=playwrightes lo que pone el módulo en la ruta.)record.mjsmínimo:import { chromium } from "playwright"; const browser = await chromium.launch(); const context = await browser.newContext({ recordVideo: { dir: ".artifacts/<task-name>/" }, }); const page = await context.newPage(); await page.goto("http://localhost:3000/path-under-test"); // ...maneja el flujo, un cambio de estado significativo por paso... await context.close(); // finaliza el .webm await browser.close();Recorta o comprime con ffmpeg si el archivo es grande.
-
El protocolo de anotaciones se convierte en archivos: numera las capturas en orden de prueba con la afirmación en el nombre —
01-precondition-signed-in.png,02-it-saves-on-blur-passed.png— y mantén unassertions.mden la carpeta de artefactos que liste cadatest_start/assertioncon su resultado (passed/failed/untested+ motivo).
Los cambios sin interfaz de usuario también necesitan evidencia
- API / rendimiento: un sondeo por script con números medidos — recuentos de solicitudes por fase, latencia antes/después — capturado en
probe-output.txt. - Renderizado / canvas / shader: fotogramas renderizados más afirmaciones de píxeles (valores de diferencia), revisados visualmente y guardados como PNG.
- Comportamiento del agente: el extracto de la transcripción relevante que muestra la llamada a la herramienta y la respuesta.
- Correcciones de errores: reproduce y captura el fallo antes de escribir la corrección — esa captura es la mitad "antes" de un par antes/después.
Higiene de captura
- Confirma que el servidor que estás sondando está ejecutando tu código (puerto correcto, proceso correcto), especialmente cuando múltiples agentes comparten una máquina:
lsof -i :<port>— o dondelsofno esté instalado,ss -ltnp "sport = :<port>". - Tras detener, confirma que la grabación existe y se reproduce antes de adjuntarla.
- Guarda los artefactos de prueba junto a la grabación para que ejecutar
stopde nuevo (por ejemplo, después de una corrección de herramientas) no elimine los resultados antiguos. - Tras publicar en el PR, vuelve a abrir el comentario y confirma que la vista previa del vídeo se renderiza.
Flujo de trabajo para "reproducir y corregir"
- Captura el fallo grabando la reproducción — detén, revisa, adjunta al issue como "before" y guarda los artefactos de la sesión antes de cambiar cualquier código.
- Aplica la corrección.
- Captura la verificación — detén, revisa, adjunta al mismo issue como "after" y al PR.
- Añade un enlace cruzado a la evidencia "before" y "after" en una sola línea en el hilo del issue.
Índice de referencia rápida
| Paso | Comando |
|---|---|
| Verificar cadena de herramientas | python3 $EVIDENCE doctor |
| Iniciar grabación | python3 $EVIDENCE start --output .artifacts/<name> --title "<...>" --commit ... |
| Anotar setup | python3 $EVIDENCE annotate "$SESSION" --type setup --message "..." |
| Anotar inicio de prueba | python3 $EVIDENCE annotate "$SESSION" --type test_start --message "It should..." |
| Anotar afirmación | python3 $EVIDENCE annotate "$SESSION" --type assertion --result passed --message "..." |
| Detener y finalizar | python3 $EVIDENCE stop "$SESSION" |
| Reintentar después de fallo de finalización | python3 $EVIDENCE stop "$SESSION" (no señaliza dos veces) |