AGENTIC QA · WORKFLOW SKILL

/regression-testing

Ejecuta la suite en CI, clasifica cada fallo con evidencia y convierte el resultado en un veredicto de release defendible: GO / CAUTION / NO-GO.

Stage 6 · Regression / Smoke / Sanity Execute → Analyze → Report gh CLI · Allure 3 · /acli · /xray-cli

→ avanzar · O overview · S presentador · N notas · F pantalla completa

Deck del workflow del skill regression-testing. Tres fases en orden fijo: Execute → Analyze → Report. Nunca saltar el análisis; nunca clasificar sin leer los logs del fallo.

mapa completo — este es el índice del deck

De un prompt a un veredicto de release

GATES
Preflight Gategh auth · workflows · Secrets · Allure 3 · env
Phase 0 · Resume check.session/regression-testing/<env>-<fecha>/
RUN_ID en plan.md → re-attach sin re-disparar CI
FASE 1
Elegir suiteregression·smoke·sanity
plan.mdplan-first
Triggergh workflow run
RUN_IDpersistir ya
Monitorsubagente background
FASE 2
Collect ×3 ∥allure·evidence·playwright
ParseAllure JSON
Métricaspass-rate·trend
Clasificar 6 vías∥ si >10 fallos
Severidadeje aparte
FASE 3
Score /9
Vetos duros@critical·regression·<90%
GO ≥7
CAUTION 4–6
NO-GO <4
Report.context/reports/
ADYACENTES
NO-GO → Jira Bug/Defect vía /acli → fix → re-run ⟲ Fase 1
ENVIRONMENT → re-run tras infra-check
TMS sync STP/STR (/xray-cli)
Archive session + memoria
HANDOFFS
/test-automation escribe los tests + marker @blocked:{BUG-KEY}
esta skill consume y decide
/sprint-testing verifica el fix del bug a mano
Este mapa es el índice mental: cada fila FASE corresponde a las secciones que siguen. Los caminos adyacentes — re-attach, re-run, filing en Jira y handoffs — también se cubren dentro de cada fase.

antes de todo · preflight gate (obligatorio)

Nada se dispara sin el gate en verde

CapacidadNivelPor qué aquí
gh CLI autenticadoREQUIREDTodo el pipeline vive en gh: trigger, watch, download. Sin auth → STOP, el usuario corre gh auth login.
Workflow filesREQUIRED.github/workflows/ debe tener el YAML de la suite elegida con sus inputs.
GitHub Actions SecretsREQUIREDEl runner usa secrets.<ENV>_USER_EMAIL/_PASSWORD + XRAY_*/ATLASSIAN_*. Verificar con gh secret list — el gap silencioso más común.
Allure 3 localREQUIREDbunx allure resuelve (devDep, sin install global) + allurerc.mjs presente para bun allure:agent.
Env activo confirmadoREQUIREDConfirmar el target antes de un run de 20–60 min (default: staging).
[TMS_TOOL] · [ISSUE_TRACKER_TOOL]OPTIONAL/xray-cli solo si hay sync TMS; /acli solo si el veredicto obliga a abrir issues.

Dos leyes del gate

args-as-answers — suite, env y grep/test_file ya vienen como argumentos: pregunta solo los huecos. probe, don't assume — cada capacidad se prueba con un comando real. Gaps + REDs se presentan en UNA checklist; cualquier RED bloqueante → STOP.

Las credenciales de test, MCPs y browsers viven DENTRO del runner de CI, no en el orquestador — quedan fuera de este gate. CI usa GitHub Secrets, nunca valores copiados del .env local.

phase 0 · session resume check (obligatorio, inline)

¿Ya había una sesión? Reanuda, no repitas

El contrato de sesión

Scope = <env>-<YYYY-MM-DD> (ej. staging-2026-07-06). Estado en .session/regression-testing/<scope>/{plan.md, progress.md}. Si progress.md no existe → sesión nueva. Si existe → ofrecer resume / restart / abort (restart archiva primero).

El caso estrella: re-attach del RUN_ID

Si el Monitor murió a mitad del watch pero plan.md ya capturó el RUN_ID, la skill se re-engancha al run vivo en lugar de re-disparar el CI — ahorra 20–60 min de reloj.

phase-0 · re-attach
# progress.md dice "Phase 1.Trigger completed" pero el Monitor no reportó:
$ gh run view <RUN_ID> --json status,conclusion
{ "status": "in_progress" }   → re-atacharse al watch, NO re-disparar
Phase 0 y la escritura de plan.md en Fase 1 no son opcionales — es el contrato de session-management.md. El re-attach es la razón #1 por la que el RUN_ID se persiste inmediatamente después del trigger.

fase 1 · execute — elegir la suite

La suite equivocada da la señal equivocada

SuiteWorkflowDuraciónUsar cuando
regressionregression.yml20–60 minValidación pre-release, corrida nocturna completa
smokesmoke.yml2–5 minHealth check post-deploy, solo tests @critical
sanitysanity.yml1–10 minUna feature / un archivo / un patrón grep

Regla por defecto

"run regression" pelado → regression en el env por defecto · "smoke" o "critical only" → smoke · un archivo o grep → sanity.

Gotcha: grep XOR test_file

En sanity, grep y test_file son mutuamente excluyentes — pasar ambos hace que el workflow ignore uno en silencio. Elige uno.

Un smoke verde de 3 minutos NO es un release gate. Emparejar la suite con la pregunta que el usuario está haciendo es el primer acto de criterio del workflow.

fase 1 · execute — plan, trigger, RUN_ID

Plan primero, dispara después, persiste el RUN_ID ya

fase-1 · trigger
# 1 · preflight de fase (siempre)
$ gh auth status && gh repo view --json name,owner && gh workflow list
# 2 · escribir .session/regression-testing/<scope>/plan.md ANTES del trigger
# 3 · disparar la suite con inputs explícitos
$ gh workflow run regression.yml -f environment=staging -f video_record=false -f generate_allure=true
# sanity: grep O test_file — nunca ambos
$ gh workflow run sanity.yml -f environment=staging -f test_type=e2e -f grep="@auth"
# 4 · capturar RUN_ID (esperar 3–5s: el run no es consultable al instante)
$ RUN_ID=$(gh run list --workflow=regression.yml --limit=1 --json databaseId -q '.[0].databaseId')

Checkpoint crítico

El RUN_ID se añade a plan.md §Inputs + entrada en progress.md. Trigger sin RUN_ID persistido = resume sin re-attach.

Anti-patrón R5

Nunca disparar sin --ref <commit-sha> fijado — commit distinto = baseline distinta. Y el video (video_record=true) infla artefactos 5–10×: solo para debug.

La condición de carrera es real: gh workflow run retorna antes de que el run exista en la API — de ahí los 3-5s. Video solo al depurar flakiness o capturar evidencia de un bug puntual.

fase 1 · execute — monitor (dispatch background)

Un subagente observa; el hilo principal prepara el análisis

subagente Monitor
$ gh run watch <RUN_ID> --exit-status
# fallback si watch expira en suites largas: poll cada 60–90s
$ gh run view <RUN_ID> --json status,conclusion
status:     queued | in_progress | completed
conclusion: success | failure | cancelled | timed_out   (solo al completar)
Gotcha: la URL de Allure es predecible pero solo está viva cuando el job "Build & Deploy Allure Report" terminó en verde — si falló, se analiza desde los artefactos descargados. Config de workflows: references/ci-cd-integration.md.

fase 2 · analyze — collect (dispatch parallel ×3)

Recoge la evidencia antes de que expire la retención

fase-2 · collect
# inline (hilo principal): contexto + SOLO logs fallidos (--log completo puede pasar 50MB)
$ gh run view <RUN_ID> --log-failed
# tres subagentes en paralelo, uno por artefacto (cap = 3)
$ gh run download <RUN_ID> -n merged-allure-results-staging -D ./analysis/            # A
$ gh run download <RUN_ID> -n e2e-failure-evidence          -D ./analysis/evidence/   # B
$ gh run download <RUN_ID> -n e2e-playwright-report         -D ./analysis/playwright/ # C
# run anterior → baseline de tendencia
$ PREV=$(gh run list --workflow=regression.yml --limit=2 --json databaseId -q '.[1].databaseId')
$ gh run download $PREV -n merged-allure-results-staging -D ./analysis/previous/

Anti-patrón R4

Nunca saltes la descarga de Allure en builds rojos — screenshots, traces y videos desaparecen al vencer la ventana de retención. Evidencia primero, análisis después.

Los metadata-reads (gh run view) quedan inline porque son cortos; solo las tres descargas justifican dispatch. Para triage local previo: bun allure:agent emite markdown legible por la IA sin parsear HTML.

fase 2 · analyze — parse + métricas

Allure manda; el pass-rate que gatea excluye lo bloqueado

MétricaFórmula
Pass RatePassed / Total × 100
Pass Rate (gating)sobre Total − KNOWN-BLOCKED
Duraciónmax(stop) − min(start)
Trendpass rate actual − run previo

Fuente de verdad, en orden

Allure results JSON > Playwright report.json > logs crudos. Cada resultado trae status, statusDetails y labels[] (testId = ATC ID, suite, severity).

El label suite deriva del tag

@smoke/@regression/@e2e/@integration/@critical es la única taxonomía: el suite que lees ES el scope que CI corrió. Nunca reconcilies contra otro set de labels.

Los retries enmascaran flakiness

CI corre con retries: 2 — un test que pasa al reintentar sigue siendo flaky. Inspecciona el conteo de retries en Allure, no solo el status final (anti-patrón R3: el reporte debe exponer los retries).

Los KNOWN-BLOCKED (tests @blocked:{BUG-KEY} deliberadamente aparcados tras un bug ya archivado) no son fallos de regresión: se excluyen del pass-rate que gatea y se reportan aparte con su BUG-KEY — así la decisión no se manipula en ningún sentido.

fase 2 · analyze — clasificar cada fallo (6 vías)

El árbol se recorre en orden — primera coincidencia gana

decision-tree · references/failure-classification.md
Test fallido
  ├─ ¿tag @blocked:{BUG-KEY}?  ──────────────► KNOWN-BLOCKED  (aparcado; fuera del gating)
  ├─ ¿un ticket conocido ya lo rastrea? ────► KNOWN ISSUE
  ├─ ¿patrón de error de entorno? ──────────► ENVIRONMENTECONNREFUSED · ETIMEDOUT · net::ERR_ · Navigation timeout · browserType.launch · 502/503
  ├─ ¿sin historial (primer run)? ──────────► NEW TEST
  ├─ ¿falla >20% en los últimos 10 runs? ───► FLAKY
  └─ ¿pasaba hace ≤5 runs y ahora falla? ───► REGRESSION   ← bloquea el release

La misclasificación #1

NUNCA marques REGRESSION sin revisar el historial primero. Y un primer fallo sin historia no es regresión: es NEW TEST — se verifica a mano una vez antes de clasificar.

Dispatch por volumen

>10 fallos → chunks de ~10 con un subagente clasificador por chunk (cap 10), merge de JSONs en el hilo principal. ≤10 → inline: el overhead no se justifica.

Flakiness necesita mínimo 10 runs de historial — con menos, se anota "insufficient history" y se reevalúa el próximo sprint (nunca se adivina). R1: jamás FLAKY sin re-ejecutar en aislamiento.

fase 2 · analyze — de la etiqueta a la acción

Solo dos categorías pueden llegar a Jira

CategoríaImpactoAcción¿Issue en Jira?
KNOWN-BLOCKEDLOWExcluir del gating, listar con su {BUG-KEY}No — el marker ya nombra el bug abierto
REGRESSIONHIGHBloquea el release, archivar y asignar — Bug/Defect (Fase 3)
FLAKYMEDIUMAgendar estabilización, no bloqueaNo
KNOWN ISSUELOWDocumentar contra el ticket existenteNo
ENVIRONMENTMEDIUMRe-run tras revisar la infraNo
NEW TESTLOWVerificación manual primeroSolo si se confirma defecto real

ENVIRONMENT no es chivo expiatorio

ECONNREFUSED a tu propia API suele significar que la app se cayó. Muchos tests sin relación rojos en el mismo host → ENVIRONMENT; UN test fallando en un endpoint que otros usan bien → probable REGRESSION disfrazada.

Cláusula sdet CI-fallback

Solo en suites integration-trunk: un rojo clase ENVIRONMENT en Sanity-CI puede autorizar merge al trunk de integración (nunca al PR final a main) si el cambio pasó en local + staging y el rojo existe sin el cambio. REGRESSION jamás califica.

El triage decide SI se archiva; la doctrina de defect-management decide QUÉ tipo y con qué campos — son ejes separados. R7: nunca marcar KNOWN sin ticket de Jira que vincule la supresión.

fase 2 · analyze — severidad por fallo

La severidad es ortogonal a la clasificación

Un test FLAKY sobre el checkout sigue siendo CRITICAL. La clasificación responde por qué falló; la severidad, cuánto nos importa.

SeveridadCriterio
CRITICALFlujo central del usuario (login, checkout, payment) — o cualquier test con tag @critical
HIGHFeature mayor (search, profile, dashboard)
MEDIUMFeature secundaria (filtros, preferencias)
LOWEdge case o ruta solo-admin

Salida de la Fase 2

Bloque de análisis: tabla de métricas + delta de tendencia, una sección por categoría (Regressions primero), detalle por test fallido (nombre, ATC ID, suite, error, last-pass, screenshot) y un veredicto preliminar.

Estos dos ejes se cruzan en la Fase 3: una REGRESSION con severidad HIGH/CRITICAL es veto duro por sí sola, sin importar el score.

fase 3 · report & decide — el score de 9 puntos

Un score guía; tres vetos mandan

Factor+3+10−1−2−3
Pass Rate≥95%90–95%<90%
Regressions01–2 Low1+ MediumHigh/Critical
Tests @criticalTodos pasanCualquier fallo
Flaky≤34–5>5

GO — score ≥ 7

Release aprobado; smoke post-deploy agendado.

CAUTION — 4–6

Revisión manual; riesgos aceptados documentados.

NO-GO — < 4

Release bloqueado; fix + re-run planificados.

Vetos duros — nunca auto-GO si…

(1) falla cualquier test @critical · (2) existe cualquier REGRESSION HIGH/CRITICAL · (3) pass rate < 90%. Anulan cualquier score. R2: el gate es binario — REGRESSION conocida > 0 = no hay GO. R6: nunca mezclar smoke + regression en un solo pass-rate.

El veredicto y la apertura de issues quedan inline en el hilo principal — las decisiones de release nunca se delegan a un subagente.

fase 3 · report & decide — archivar defectos (NO-GO / CAUTION con regressions)

Los quality issues van a Jira, no a GitHub

1 · Gate + clasificación

Solo REGRESSION y NEW TEST confirmado llegan a Jira. Tipo según el ciclo de vida de la FEATURE, no dónde falló: ya live sobre Staging → Bug · pre-release → Defect · comportamiento deseable más allá del AC → Improvement.

2 · Matriz de campos obligatoria

severitypriority auto-derivada · components = módulo afectado · root_cause + error_type + test_environment · qa_assignee = uno mismo (read-before-write) · evidence = link Allure + ./analysis/evidence/.

3 · Tres ejes de trazabilidad

Parent = epic QA Defect Management (nunca un epic de producto) · issue-link causal → la Story que cubre el ATC regresionado · components = módulo de producto.

4 · Escritura vía /acli

Cargar /acli primero (auth + sintaxis). Crear con acli workitem create --from-json; customfields sobre issue existente vía REST PUT /rest/api/3/issue/{KEY}. Filing gate de la doctrina antes de enviar; guardar la key para el reporte.

Canon

agentic-qa-core/references/defect-management-doctrine.md — la misma autoridad que usa /sprint-testing. FLAKY, ENVIRONMENT y KNOWN ISSUE nunca generan bug nuevo.

El triage (Fase 2) decide si se archiva; la doctrina decide tipo y campos. La skill NO abre issues de GitHub para fallos de producto.

fase 3 · report & decide — reporte, TMS sync, archive

El entregable: un reporte que un PM puede leer en frío

.context/reports/regression-{env}-{date}.md
# Regression Quality Report — staging — 2026-07-06
## Executive Summary   Verdict + score/9 + 1 línea
## Metrics             Pass Rate·Regressions·Critical·Flaky vs umbral
## Release Blockers    si NO-GO: regressions + owner + ETA
## Failure Details     Regressions → Flaky → Known → Blocked → Env
## Trend               últimos 5 runs · ## Links · ## Recommendations

TMS sync (opcional, items-first)

STP = Test Plan STP: Sprint#{N}: Regression → epic QA Master Test Plan · STR = Test Execution STR: Sprint#{N}: Regression Testing → epic QA Test Artifacts. El update de resultados por ATC apunta al STR, vía /xray-cli (o /acli en jira-native).

Post-decisión

GO → candidato aprobado + smoke post-deploy · CAUTION → revisión con el lead, riesgos por escrito · NO-GO → bloquear, asignar issues, planificar re-run.

Archive de sesión

Tras el veredicto: .session/…/<scope>/.session/.archive/ + resumen a memoria. Con NO-GO, el archive espera a que termine la creación de issues.

El reporte canónico queda commiteado en .context/reports/ como entregable; el estado de sesión se archiva aparte. Misma estructura en cada run para que stakeholders aprendan a escanearla.

cierre — cómo se invoca y qué sigue

Cinco clasificaciones + una, tres vetos, una decisión

Invocación

/regression-testing — o "run regression", "smoke suite", "analyze test results", "GO/NO-GO decision", "release readiness", "quality report".

Handoffs

Entra desde /test-automation (Stage 5: escribe los tests y el marker @blocked). Sale hacia /sprint-testing (verificar el fix a mano) y de vuelta a /test-automation (estabilizar flaky, nuevos tests).

Artefactos clave

plan.md + progress.md (sesión) · ./analysis/ (artefactos CI) · .context/reports/regression-<env>-<date>.md · issues Jira (Bug/Defect) · STP/STR en el TMS.

Profundizar

references/failure-classification.md (catálogo de patrones de error) · references/ci-cd-integration.md (workflows, sharding, secrets) · references/github-pages-setup.md (publicar los reportes Allure — correr antes el version-currency check).

Clasifica con honestidad, respeta los vetos, y el veredicto no lo discute nadie.

Cierre: esta skill no escribe tests (eso es test-automation) ni re-testea fixes a mano (eso es sprint-testing). Ejecuta, analiza y decide — con el humano dueño del veredicto.
← → navegar · O resumen · S presentador · N notas · F pantalla