Falla al cargar los planes desde la API interna (/api/plans) — devuelve HTML de error en lugar de JSON; reproducible 2/3 intentos
BLOCKER
✓
HTTPS forzado en todas las rutas
Redirección 301 correcta desde http:// — certificado válido, expira 2027-03-12
PASS
!
robots.txt incluye staging — riesgo de indexación
El archivo /robots.txt no tiene Disallow para staging; añadir Disallow: / en env de staging
MENOR
✓
Meta tags: title + description presentes en páginas públicas
Home, About, Pricing — Open Graph correcto; viewport tag presente
PASS
Core Web Vitals — Home (desktop)
LCP
1.8s
Umbral: < 2.5s ✓
CLS
0.04
Umbral: < 0.1 ✓
INP
112ms
Umbral: < 200ms ✓
🖱️
Fase 2 — Tests de Interacción
9 checks
✓
Navegación: 14/14 links del menú funcionan
Navbar desktop y hamburger mobile — todos resuelven sin 404
PASS
✓
Formulario de login: estado de éxito correcto
Credenciales válidas → redirige a /dashboard; token JWT guardado en httpOnly cookie
PASS
✓
Formulario de login: estado de error con creds inválidas
Mensaje "Credenciales incorrectas" visible y enfocado para screen readers
PASS
✗
Onboarding wizard: Paso 2 no avanza si campo "sector" queda vacío
El botón "Continuar" queda deshabilitado sin mensaje de error explicativo — el usuario no sabe qué campo falta. El campo "sector" es requerido pero no muestra asterisco ni tooltip de validación
BLOCKER
✓
Onboarding wizard: Pasos 1 y 3 funcionan correctamente
Paso 1 (datos agencia) y Paso 3 (invitar team) — validación y transición OK
PASS
!
Formulario de invitación de cliente: sin validación de dominio corporativo
Acepta correos con dominios temporales (mailinator.com, guerrillamail.com) — recomendable añadir blocklist en backend
Sesión destruida correctamente en logout; cookie eliminada; redirect a /login
PASS
✓
Rutas protegidas: redirigen a login si no autenticado
/dashboard, /workspace, /settings → 302 a /login con returnUrl correcto
PASS
!
Search del workspace: sin estado de "sin resultados"
Búsqueda con término inexistente devuelve lista vacía sin feedback visual — añadir empty state con CTA
MENOR
🖼️
Fase 3 — Regresión Visual
3 breakpoints × 4 páginas
✗
Hero section en 375px: overflow horizontal de 18px
El título H1 "Portales de cliente que tus clientes adorarán" desborda el viewport a causa del tamaño de fuente fijo (52px). Aplicar clamp() o media query para mobile.
BLOCKER VISUAL
✓
Tablet (768px): layout correcto en todas las páginas
Grid de features, pricing cards y dashboard — sin desbordamientos ni elementos superpuestos
PASS
✓
Desktop (1440px): sin regresiones vs. baseline
Diferencia máxima: 2px en margen del footer — dentro del umbral de 5px
PASS
✓
Dark mode: consistente en las 8 páginas auditadas
Colores de fondo, texto y bordes correctos; sin "flash" de modo claro en carga inicial
PASS
!
Imágenes WebP: sin atributo width/height en 3 imágenes del blog
Causará CLS potencial en carga lenta — añadir dimensiones explícitas a los <img> del módulo de blog
MENOR
Capturas simuladas — Home
375px — Mobile
✗ Overflow 18px
768px — Tablet
✓ Sin regresiones
1440px — Desktop
✓ Dentro de umbral
♿
Fase 4 — Accesibilidad (WCAG 2.2 AA)
axe-core + manual
3
Violaciones AA
5
Best practices
31
Elementos OK
⚠ Nota metodológica
axe-core cubre ~30–40% de WCAG. Un run limpio es necesario pero no suficiente. Navegación por teclado y lector de pantalla requieren verificación manual adicional.
Violaciones detectadas
image-alt · WCAG 1.1.1 (A)
Imagen hero en Home sin atributo alt — los lectores de pantalla leen la URL como texto