$33
No estás testeando para confirmar que la feature funciona. Estás testeando para intentar romperla.
Esta única frase es el alma de la skill. Interiorízala antes de cada sesión de QA:
Los agentes Planner, Generator y Healer son herramientas. La mentalidad es tuya. Cada prompt que mandas al Planner, cada test que escribe el Generator, cada arreglo que aplica el Healer — todo debe estar al servicio de intentar romper el sistema en nombre del usuario.
"Si no lo has validado intentando romperlo, no funciona."
Esta skill tiene dos modos de activación. El modo determina si Claude sugiere QA o ejecuta QA. Confundirlos cuesta tokens y confianza del usuario.
┌─────────────────────┐
│ Skill cargada en │
│ contexto de Claude │
└──────────┬──────────┘
│
┌──────────────┴───────────────┐
│ │
▼ ▼
┌─────────────────┐ ┌──────────────────┐
│ Modo SUGGEST │ │ Modo EXECUTE │
│ (auto, ~50 tok) │ │ (manual, ~200K) │
└─────────────────┘ └──────────────────┘
Disparado porque Claude Disparado porque el
está haciendo un cambio usuario pide QA
behavioral. explícitamente.
Claude añade UNA línea Claude ejecuta el
de sugerencia al final workflow completo
de su mensaje. Planner → Generator →
NO se ejecutan tests. Healer. Tests corren,
se produce un report.
Disparador: Claude acaba de hacer o está a punto de hacer un cambio behavioral en el proyecto del usuario. Ejemplos:
Acción: Termina la implementación normalmente. Reporta lo que hiciste. Después, al final de tu mensaje, añade exactamente una línea de sugerencia en el idioma del usuario:
💡 Este cambio toca [feature]. ¿Lanzo QA adversarial? → di
haz QA del [feature]
o en inglés:
💡 This change touches [feature]. Want me to run an adversarial QA pass? → say
run QA on [feature]
Reglas duras del modo SUGGEST:
qa-methodology.md, setup.md ni ningún otro archivo de referencia. Solo se cargan en modo EXECUTE.Disparador: el usuario pide QA explícitamente con cualquiera de estas frases (en cualquier idioma):
/qa, "usa la skill qa-engineer")Acción: Ejecuta el Workflow: Pase de QA bajo demanda completo (Pasos 1–6) más abajo. Lee los archivos de referencia que necesites. Genera el plan, ejecuta los agentes, produce el report de QA.
| Situación | Modo | Qué hace Claude |
|---|---|---|
| Usuario dice "añade un nuevo campo al formulario de pedidos" | SUGGEST | Implementa → al final del mensaje: "💡 Este cambio toca el formulario de pedidos. ¿Lanzo QA adversarial?" |
| Usuario dice "arregla el typo del README" | NINGUNO | No hay cambio behavioral. No hay línea de sugerencia. |
| Usuario dice "haz QA del checkout" | EXECUTE | Ejecuta el workflow completo sobre la feature checkout |
| Usuario dice "sí" justo después de una línea SUGGEST | EXECUTE | Ejecuta sobre la feature mencionada en la línea SUGGEST |
| Usuario dice "no gracias" o "luego" a una línea SUGGEST | NINGUNO | Deja de sugerir QA en el resto de la conversación |
| Usuario hace una pregunta sobre QA sin pedir ejecutarlo | NINGUNO | Responde la pregunta, sin línea de sugerencia |
| Usuario dice "revisa este código" | NINGUNO | Es code review, no QA. Sin línea de sugerencia. |
La versión anterior de esta skill ejecutaba el workflow completo automáticamente tras cada cambio. Eso costaba 100K-300K tokens por cambio. Con este diseño de dos modos:
El usuario siempre sabe que QA está disponible porque Claude se lo recuerda (SUGGEST). El usuario siempre controla el coste porque Claude espera la luz verde (EXECUTE). Lo mejor de ambos.
Esta skill configura y ejecuta QA exhaustivo automatizado usando los Playwright Test Agents (Planner → Generator → Healer) con Claude como loop de IA orquestador. Valida cualquier app web a través de happy paths, edge cases, condiciones de error, break testing y suites de regresión.
Tres agentes trabajando juntos:
Antes de empezar, lee el archivo de referencia que corresponda:
| Tarea | Archivo de referencia |
|---|---|
| Setup inicial de Playwright + Agentes | references/setup.md |
| Metodología de QA, categorías de test y patrones | references/qa-methodology.md |
| Integración CI/CD y workflow post-deploy | references/ci-cd.md |
Lee siempre references/setup.md primero si el proyecto no tiene Playwright configurado.
Cada plan de test, cada prompt al Planner, cada archivo de spec que escribas debe considerar estos ocho ángulos. Son la superficie mínima de un pase de QA real. Si un plan de test cubre menos de cinco para una feature no trivial, el plan está incompleto — devuélvelo al Planner.
| # | Ángulo | Qué significa | Ejemplo de ataque |
|---|---|---|---|
| 1 | Inputs vacíos | Enviar formularios / llamar endpoints sin nada relleno | Submit del checkout con carrito vacío, PATCH con body {} |
| 2 | Datos inválidos | Tipos equivocados, formatos equivocados, shapes equivocados | Email not-an-email, teléfono abc, fecha 2026-13-45, JSON sin las claves obligatorias |
| 3 | Valores límite | Los bordes donde se esconden los bugs: 0, -1, null, "", MAX_INT, 10K caracteres | Cantidad 0, precio negativo, nombre de 10.000 caracteres, año 1900 y 2099 |
| 4 | Caracteres especiales e inyección | Unicode, emoji, RTL, scripts, SQL, path traversal | <script>alert(1)</script>, '; DROP TABLE--, 🎉日本語, ../../etc/passwd |
| 5 | Doble click / submit rápido | Pone al usuario contra sí mismo y contra la red | Doble click en "Place order", spam en "Send", click en submit 5 veces en 100ms |
| 6 | Edge cases de navegación | Mecánicas del browser que se saltan las suposiciones de la app | Botón atrás tras submit, refresh a mitad del pago, URL directa al paso 3, abrir el mismo flujo en 2 pestañas, deep-link a un recurso borrado |
| 7 | Regresión en features cercanas | El cambio que acabas de hacer probablemente rompió algo al lado — ve a mirar | Tras editar el formulario de checkout, verifica que la paginación del carrito, los filtros, la lista de pedidos y el formulario quote/draft siguen funcionando (¡componentes compartidos!) |
| 8 | Edges de auth y permisos | Sin sesión, rol equivocado, sesión expirada, cross-tenant | Pegar a la URL como guest, como rol equivocado, después de clearCookies(), con el ID de otro tenant en la URL |
La mayoría de los "bugs pequeños" no son bugs en la cosa que cambiaste. Son bugs en la cosa al lado de lo que cambiaste — un componente hermano, un servicio compartido, una vista de lista que consumía una API cuyo shape acaba de cambiar.
Cuando el Planner explora una feature modificada, también debe recibir la orden de dar un paso hacia afuera y re-testear los vecinos. Concretamente:
| Tipo de cambio | Features cercanas a re-testear |
|---|---|
| Formulario / página | Otras páginas que usan el mismo componente, páginas hermanas en el mismo módulo, la vista de lista a la que alimenta este formulario |
| Modelo / relación de ORM | Cada página que lista, filtra o agrega este modelo; cada PDF / export / endpoint de API que lo serializa |
| Endpoint de API | Cada consumidor de ese endpoint (UI, móvil, webhooks, terceros) |
| Componente compartido (botones, cards, formularios reutilizables) | Al menos 3 páginas aleatorias que ya usan el componente |
| Transición de máquina de estados | Todas las demás transiciones de la misma entidad (una flecha nueva puede romper las otras) |
| Migración / schema | Cada seeder, cada factory, cada report que consulta la tabla modificada |
| Auth / middleware | Cada ruta protegida en el rol afectado |
Regla práctica: si tu report de QA tiene cero tests de regresión contra features cercanas, no hiciste el Ángulo 7. Repite el pase de QA.
El Planner es tan bueno como el prompt que le das. Prompts vagos producen planes de test vagos. La palanca más grande que tienes sobre la calidad del QA es cómo instruyes al Planner.
Lee estos dos prompts. El primero es el que escribe un QA junior. El segundo es el que escribe un QA senior. Escribe siempre el segundo.
❌ Mal — pasivo, comprueba renderizado, un solo ángulo:
Use the Playwright Planner to test the login page at /login.
Verify that the login form works.
Por qué está mal: "Funciona" no es un objetivo de test. El agente producirá un plan solo de happy path ("rellena email, rellena password, click login, ve dashboard") y enviarás a producción una feature que se rompe con input vacío.
✅ Bien — activo, adversarial, multi-ángulo, con lista de ataques explícita:
Use the Playwright Planner agent to explore the login flow at https://app.example.com/login.
Mindset: try to BREAK the login. Do not check that it renders — assume it renders.
Produce a test plan covering at least these adversarial angles:
1. Empty inputs — submit with both fields empty, with only email, with only password.
2. Invalid data — malformed emails (missing @, no domain, with spaces), wrong password format.
3. Boundary values — 1-char password, 256-char email, password with only spaces.
4. Special chars & injection — emoji in email, <script> in password, SQL injection patterns.
5. Double-click / rapid submit — double-click "Sign in", spam the button 5 times in 200ms.
6. Navigation edge cases — back button after successful login, refresh mid-submission, direct URL to /dashboard while logged out, open /login in two tabs and submit in both.
7. Regression in nearby features — after a successful login, verify the password reset link still navigates correctly, the registration link works, and logout from the dashboard returns to /login cleanly.
8. Auth & permission edges — login with a deactivated account, expired session, wrong role redirect.
For each test, specify:
- The exact action sequence
- The expected outcome (success or specific error)
- What to assert on (URL, visible text, console errors, network status)
Reference seed test: tests/seed.spec.ts
Save the plan to: specs/login-flow.md
Nota: los prompts al Planner se escriben en inglés porque el agente Playwright procesa mejor instrucciones en inglés. Tú piensas en español, pero traduces el prompt antes de enviarlo. La calidad del plan depende de esto.
Por qué está bien: le dice al agente la mentalidad, nombra cada ángulo del checklist explícitamente, da ejemplos de ataque concretos, exige especificidad por test, y fija el path del output.
Use the Playwright Planner agent to explore [FEATURE NAME] at [URL].
Mindset: try to BREAK [FEATURE]. Do not check that it renders — assume it renders.
Produce a test plan covering these adversarial angles:
1. Empty inputs — [concrete attack examples for this feature]
2. Invalid data — [concrete attack examples]
3. Boundary values — [concrete attack examples]
4. Special chars & injection — [concrete attack examples]
5. Double-click / rapid submit — [which buttons / actions]
6. Navigation edge cases — [which navigation flows are risky here]
7. Regression in nearby features — [list 3–5 named neighbors and what to verify on each]
8. Auth & permission edges — [which roles, which auth states]
For each test, specify the action sequence, expected outcome, and what to assert on
(URL, visible text, console errors, network status).
Reference seed: tests/seed.spec.ts
Save plan to: specs/[feature-slug].md
2026-13-45" es accionable.specs/[feature-slug].md — predecible, revisable, commiteable.Antes de dejar que el Generator convierta un plan en código, audita el plan contra los 8 ángulos:
Si alguna respuesta es no, devuelve el plan con: "Revisa el plan — el ángulo [N] falta o está flojo. Añade tests que [hueco específico]."
Este es el flujo que Claude ejecuta cuando el usuario pide QA explícitamente sobre una feature o cambio concreto. No lo ejecutes especulativamente.
Antes de ejecutar tests, Claude debe entender tanto el alcance del cambio como su radio de explosión hacia features cercanas (Ángulo 7).
Preguntas que debes auto-contestarte:
- ¿Qué entidad/feature se creó o modificó?
- ¿Qué operaciones cambiaron? (create, read, update, delete, transición de estado)
- ¿Hay efectos secundarios? (emails, notificaciones, webhooks, tareas programadas)
- ¿Qué componentes / servicios / endpoints compartidos toca esto?
- VECINOS — nombra 3 a 5 features específicas adyacentes al cambio:
* Otras páginas que usan el mismo componente
* Páginas hermanas en el mismo módulo
* La vista de lista que se alimenta del formulario modificado
* Cualquier PDF, export o consumidor de API del modelo modificado
* Cualquier otra transición de estado de la misma entidad
La lista de vecinos no es opcional — se convierte en el input del Ángulo 7 en el Paso 3a. Si no puedes nombrar al menos 3 vecinos, no entiendes el cambio lo suficiente como para hacerle QA. Re-lee el diff.
npx playwright test
Si algún test existente falla → la implementación rompió algo. Arregla antes de continuar.
Usa el loop Planner → Generator → Healer:
3a. Plan — Pídele al Planner que explore la feature modificada usando la plantilla adversarial (ver "Cómo escribir instrucciones para el Planner" arriba). No uses lenguaje vago como "comprehensive test plan" — pega los 8 ángulos inline con ejemplos de ataque concretos y los vecinos nombrados del Paso 1.
Estructura mínima del prompt:
Use the Playwright Planner agent to explore [feature] at [URL].
Mindset: try to BREAK [feature]. Do not check that it renders — assume it renders.
Produce a test plan covering these adversarial angles:
1. Empty inputs — [examples]
2. Invalid data — [examples]
3. Boundary values — [examples]
4. Special chars & injection — [examples]
5. Double-click / rapid submit — [which buttons]
6. Navigation edge cases — [back, refresh, multi-tab, deep-link]
7. Regression in nearby features — [the 3–5 neighbors named in Step 1]
8. Auth & permission edges — [which roles, which states]
For each test, specify the action sequence, expected outcome, and assertion target.
Reference seed: tests/seed.spec.ts
Save to: specs/[feature-name].md
Antes de mandar el plan al Generator, audítalo contra el checklist de "Reglas para revisar el output del Planner" arriba. Rechaza y revisa si algún ángulo falta o está flojo.
3b. Generate — Convierte el plan en tests ejecutables:
Use the Playwright Generator agent to create tests from specs/[feature-name].md
Use tests/seed.spec.ts as the seed test.
Save to: tests/[feature-name]/
3c. Run & Heal:
# Ejecuta los tests nuevos
npx playwright test tests/[feature-name]/
# Si hay fallos, invoca al Healer
# "Use the Playwright Healer agent to fix failing tests in tests/[feature-name]/"
Lee references/qa-methodology.md y aplica las categorías de test relevantes según lo que cambió:
| Qué cambió | Aplica estas categorías |
|---|---|
| Feature CRUD nueva | Funcional (Create/Read/Update/Delete), Edge Cases, Consistencia |
| Transiciones de estado | Testing de máquina de estados, Testing de automatizaciones |
| Endpoint de API | Input malformado, Fallos de red, Testing de API |
| Feature en tiempo real | Testing multi-usuario, Sincronización, Pérdida de datos |
| Cualquier cambio user-facing | Responsive, Doble Submit, Botón atrás, Expiración de sesión |
| Integraciones (email, SMS) | Testing de automatizaciones, Timing, Sin duplicados |
Produce el report estandarizado (ver references/qa-methodology.md para el formato):
Los tests nuevos que pasen pasan a formar parte de la suite permanente, asegurando que la feature siga testeada en cada cambio futuro.
Si el proyecto todavía no tiene Playwright:
references/setup.mdnpx playwright init-agents --loop=claudeplaywright.config.ts adaptado al proyectotests/seed.spec.tsspecs/getByRole, getByLabel, getByTestId. Nunca CSS frágil.project/
├── .github/ # Definiciones de agentes (auto-generadas)
├── specs/ # Planes de test (Markdown, por feature)
│ ├── auth-flow.md
│ ├── entity-crud.md
│ ├── dashboard.md
│ └── integrations.md
├── tests/
│ ├── fixtures.ts # Fixtures custom (auth, setup de datos)
│ ├── seed.spec.ts # Seed test para bootstrap de los agentes
│ ├── auth.setup.ts # Setup de autenticación
│ ├── auth/ # Tests por área de feature
│ ├── entity-crud/
│ ├── dashboard/
│ ├── integrations/
│ ├── edge-cases/
│ └── helpers/
│ └── test-data.ts # Generadores de datos de test
├── playwright.config.ts
└── test-results/ # Traces, screenshots, vídeos
| Problema | Solución |
|---|---|
| Los agentes se atascan en el login | Añade auth a seed.spec.ts o usa storageState en fixtures |
| Tests flaky | Revisa el timing → usa expect().toBeVisible() no waitForTimeout |
| Accessibility trees enormes | Guarda los snapshots localmente, no los inyectes en cada prompt |
| Context window se desborda | Usa "Code Mode" — el agente escribe código que llama a las herramientas |
| Crashes del lado servidor | Añade aserciones de health check antes de los pasos de interacción |
| Tests pasan en local, fallan en CI | Revisa env vars, base URL y dependencias del browser |
page.waitForTimeout() — Nunca. Usa auto-wait + aserciones.getByRole, getByTestId).qa-methodology.md, setup.md, spec-template.md, example-qa-report.md son recursos del modo EXECUTE. Cargarlos en modo SUGGEST gasta contexto para nada.