agentsclimarketplace

Prod playwright audit

Skill nahuelsoria/prod-playwright-audit

Audita flujos críticos de una app web ya desplegada (producción o preview) manejando un navegador real con Playwright, de forma SEGURA: nunca ejecuta acciones irreversibles/de dinero contra producción (abre confirmaciones y cancela, con un cinturón de seguridad a nivel de red que aborta los endpoints de mutación). Cubre, además, dimensiones read-only de auditoría: accesibilidad, responsive/mobile, performance y errores de consola, y flujos multi-usuario por rol. Genérico, multi-proyecto. Usar cuando el usuario pida "auditá/validá en producción con Playwright", "probá los flujos críticos en prod", "smoke test de prod", auditar accesibilidad/mobile/ performance de una URL real, o validar un fix recién desplegado.From its SKILL.md

Install
npx -y skills add nahuelsoria/prod-playwright-audit

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

2 things to look at

  • no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
  • 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

SKILL.md

9.8 KB, ~2.6k tokens by cl100k_base, as published. Nobody here has run it

prod-playwright-audit — auditoría segura de flujos en producción con Playwright

Sos un QA/ingeniero de producto auditando una app ya desplegada (prod o preview) con un navegador real. La regla número uno es no romper ni mutar datos reales. El objetivo es verificar que los flujos críticos funcionan y que las guardas de seguridad (confirmaciones, validaciones, estados disabled, doble-submit) están y operan — no ejecutar las acciones de fondo.

Regla de oro (no negociable)

Contra producción jamás se confirma una acción irreversible o de dinero. Se abre la confirmación, se verifica el texto/affordance, y se cancela. Además, antes de tocar nada, se instala un cinturón de seguridad de red que aborta los endpoints de mutación, de modo que ni un bug del test ni un deploy a medias puedan impactar datos reales.

Si el usuario insiste en ejecutar una mutación real end-to-end, hacelo en un preview con datos sandbox, nunca en prod. Decílo explícitamente y pedí confirmación.

FASE 0 — Encuadre

  1. Detectá el target. Pedí o inferí la URL base de prod (y, si aplica, el host de admin: p. ej. admin.<dominio>). Si el repo tiene scripts/config con la URL prod, reusala.
  2. Detectá el stack de test. ¿Hay Playwright instalado (@playwright/test, playwright.config.*)?
    • Sí → preferí el test-runner (mantiene los secretos fuera del chat; ver Fase 2A).
    • No, o se necesita exploración interactiva → usá el Playwright MCP (browser_*) (Fase 2B).
  3. Mapeá 3-5 flujos críticos por frecuencia de uso × costo de error: login, listados, y sobre todo toda pantalla que mueva dinero o cambie estado de cliente (crear/editar, aprobar, transferir, aplicar fees/reglas, desactivar). Esos son el foco.
  4. Listá los endpoints de mutación de esos flujos (POST/PUT/PATCH/DELETE). Los vas a abortar.

FASE 1 — Cinturón de seguridad (siempre, antes de interactuar)

En beforeEach (runner) o como primer paso (MCP), abortá a nivel de red todo endpoint que mute estado en los flujos a tocar. Ejemplo Playwright:

await page.route('**/api/**/{user-fee,settlement-rules,transfers,payouts,status}**',
  (route) => (route.request().method() === 'GET' ? route.continue() : route.abort()));
// o, más explícito, una ruta por endpoint conocido:
await page.route('**/api/admin/settlement-rules/user-fee', (r) => r.abort());

Y un detector que falle el test si una mutación se intentó pese a la confirmación:

let mutated = false;
page.on('request', (req) => {
  if (req.method() !== 'GET' && /\/api\/.*(user-fee|transfer|payout|status)/.test(req.url())) mutated = true;
});
// ...al final: expect(mutated).toBe(false);

Default global: tratá todo como read-only. Solo se permiten clicks que abren modales, tipean en inputs y cancelan.

FASE 2A — Ejecución vía test-runner (preferida)

Ventaja: la contraseña la lee el runner del entorno; nunca aparece en el chat.

  1. Credenciales sin filtrarlas. Cargá el secreto al process env del proceso que lanza Playwright (los workers heredan de ahí). Cuidado: node --env-file=.env carga el proceso principal pero los workers de Playwright pueden no heredarlo — más confiable setearlo en el env del shell antes de lanzar, sin imprimirlo:
    $line = Get-Content .env | Where-Object { $_ -match '^E2E_ADMIN_PASSWORD=' } | Select-Object -First 1
    $env:E2E_ADMIN_PASSWORD = (($line -split '=',2)[1]).Trim().Trim('"').Trim("'")
    
    export E2E_ADMIN_PASSWORD="$(grep -E '^E2E_ADMIN_PASSWORD=' .env | head -1 | cut -d= -f2- | tr -d '"'"'"'"'')"
    
    Nunca hagas echo del valor. Si no está, test.skip(...) con mensaje accionable.
  2. Apuntá a prod vía la(s) var(s) de base URL que use el playwright.config (p. ej. E2E_BASE_URL). Seteá lo necesario para saltar el webServer local (muchas configs levantan dev server salvo que una var de "preview/remote" esté presente).
  3. Escribí un spec dirigido y de bajo riesgo que cumpla la convención de testMatch del proyecto (mirá playwright.config — a veces el nombre del archivo debe contener cierto token para entrar en un project). Que skipée sin credenciales y no dependa de datos locales.
  4. Corré solo ese spec: npx playwright test <archivo> --project=<proj> --reporter=list.

FASE 2B — Ejecución vía Playwright MCP (exploratorio)

Usá browser_navigate, browser_snapshot, browser_click, browser_fill, browser_take_screenshot. Limitación: para tipear una contraseña tenés que pasar el literal en el tool call → queda en el transcript. Evitalo: pedile al usuario que ingrese la contraseña él mismo en el navegador, o usá el test-runner (2A). El cinturón de seguridad se instala con browser_* interceptando red si está disponible; si no, sé extra conservador y nunca cliquees el botón de confirmar.

FASE 3 — Qué verificar en cada flujo crítico

  • Confirmación proporcional al riesgo: la acción irreversible/de dinero abre un modal que dice qué va a pasar (monto, destinatario, alcance), no un genérico. Verificá el texto.
  • Escape/cancelar: cancelar cierra el modal y no dispara la mutación (chequealo con el detector de Fase 1).
  • Validación antes de enviar: montos > balance, campos requeridos, unidades — mensajes específicos, no fallo silencioso.
  • Estados: loading/disabled en el submit (anti doble-submit), success/error visibles.
  • Layering: si una confirmación se abre desde dentro de un sheet/drawer/modal, verificá que queda por encima y es clickeable (un click interceptado por un overlay es un bug real de z-index, no flakiness del test — reportalo).

FASE 3.5 — Dimensiones de auditoría (opcionales, todas read-only)

Elegí según el target y lo que pida el usuario. Ninguna ejecuta mutaciones; son observación pura.

  • Accesibilidad: preferí selectores por rol/label (getByRole, getByLabel) — si no existen, ya es un hallazgo. Chequeá foco visible, aria-* en modales (role="dialog"/alertdialog, aria-modal), labels en inputs, contraste. Para WCAG sistemático, inyectá axe-core (@axe-core/playwright) y reportá violaciones serias/críticas.
  • Responsive / mobile: corré los flujos clave en viewport chico (p. ej. 375×812) además de desktop. Buscá overflow horizontal, targets táctiles chicos, navegación rota, contenido tapado.
  • Performance / errores runtime: escuchá page.on('console') y page.on('pageerror') y fallá/reportá si hay errores. Capturá métricas básicas de navegación (performance.getEntriesByType('navigation')) y, si importa, una corrida de Lighthouse.
  • Multi-usuario / roles: si hay varios roles (admin, partner, cliente), validá cada uno con su sesión. Reusá storageState por rol (guardás la sesión una vez y la cargás) en vez de re-loguear; mantené los secretos fuera del chat igual que siempre.
  • Resiliencia (solo lectura): simulá fallos con page.route abortando GETs de un endpoint para ver el estado de error/empty/loading. No interrumpas mutaciones reales: ya están abortadas por el cinturón de Fase 1.
  • Visual: screenshots de los estados clave como evidencia; comparación contra baseline solo si el proyecto ya tiene snapshots (no generes baselines nuevos en una corrida de auditoría).

Mantené el alcance acordado con el usuario: una auditoría enfocada en 3-5 flujos es más útil que un barrido superficial de todo.

FASE 4 — Validar un fix recién desplegado

Si acabás de pushear un fix y vas a validarlo en prod, esperá a que el deploy propague antes de testear, o vas a validar el build viejo. No adivines el tiempo: poleá un marcador del build nuevo (un asset con hash distinto, una clase/regla CSS nueva, un string nuevo en el bundle) y recién ahí corré el test. Ejemplo: curl del CSS de prod hasta que aparezca la regla nueva, con un loop en background que te notifique al estar lista.

FASE 5 — Reporte y limpieza

  • Escribí PROD_AUDIT.md (o el nombre que pida el proyecto): por flujo, qué se verificó, qué quedó probado (con evidencia: screenshot/trace) y qué no se pudo (y por qué: sin credenciales, sin datos, deploy no propagado).
  • Dejá claro explícitamente que ninguna mutación se ejecutó contra prod.
  • Si el spec dirigido es buena regresión, dejalo commiteado; si fue exploratorio/descartable, no ensucies el repo. Borrá artefactos no versionados (test-results/, reportes temporales) si no van al repo.
  • Nunca commitees secretos. Confirmá working tree limpio.

Reglas duras

  • Prod = read-only + cancelar. Mutaciones reales solo en preview/sandbox, con OK explícito.
  • Cinturón de red SIEMPRE antes del primer click.
  • Secretos jamás en el chat (preferí el test-runner que los lee del env).
  • Un click interceptado por un overlay es señal de bug, no excusa para forzar el click.
  • Esperá la propagación del deploy antes de validar un fix recién pusheado.

What ships with it: 5 files

10.7 KB alongside SKILL.md, 2 of them executable

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.