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.

Regression (históricamente Stage 6) · Smoke / Sanity Execute → Analyze → Report gh CLI · Allure · /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 · 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
→
RTRfind-or-create, antes del CI
→
Trigger-f execution_key=RTR
→
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 /10
→
Vetos duros@critical·regression·<90%
→
GO ≥7
CAUTION 4–6
NO-GO <4
→
Veredicto en el RTRcomentario → complete · reporte [LOCAL]
ADYACENTES
NO-GO → Jira Bug/Defect vía /acli → fix → re-run ⟲ Fase 1
ENVIRONMENT → re-run tras infra-check (mismo RTR)
Clusters de fallos → un worktree por cluster (opcional)
CIERRE
RTR → close · RTP queda ready (STR solo al cierre del sprint)
→
Verificador ligero
→
Session footer (chat)
→
Archive + 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 localREQUIREDbunx allure resuelve (devDep, versión en package.json, sin install global) + allurerc.mjs presente para bun allure:agent.
Env activo confirmadoREQUIREDConfirmar el target antes de un run largo (default: staging).
[TMS_TOOL] · [ISSUE_TRACKER_TOOL]OPTIONALTMS solo si testing.tms_cli está en .agents/project.yaml: entonces la Fase 1 crea el RTR antes del trigger (/xray-cli en jira-xray). /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: se ahorra la corrida entera. El RTR_KEY también vive en plan.md, así la sesión retomada sabe en qué Execution importó CI.

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.ymllarga (lee la del último gh run view)Validación pre-release, corrida nocturna completa. Única suite con RTR.
smokesmoke.ymlcortaHealth check post-deploy, solo tests @critical
sanitysanity.ymlvariableUna 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: el registro de la corrida nace antes que la corrida

Primero el RTR, después el CI

El RTR (Regression Test Results) es una Test Execution RTR: {scope-id}: Regression Testing, con scope-id <env>-<YYYY-MM-DD> o un tag de release. CI importa en su key, nunca en un secret compartido. Solo la suite regression tiene RTR.

1

Resolver el RTP

Buscar el Test Plan RTP: {PROJECT_KEY}: Regression Test Plan. Si falta, no se crea aquí (es la promoción de /test-documentation): el RTR nace sin testPlan, el hueco queda como N/A declarado en el verificador y en el reporte, y se recomienda correr la promoción.

2

Find-or-create del RTR

Parent QA Test Artifacts, Test Environment = env activo, assignee = uno mismo, testPlan → RTP. Un RTR del mismo scope todavía activo (re-run por ENVIRONMENT, sesión retomada) se reutiliza. Si ya está cerrado con veredicto, la corrida nueva es un RTR nuevo con #2 en el scope-id.

3

Persistir y pasar a CI

RTR_KEY va a plan.md §Inputs, en la línea donde después cae el RUN_ID, y sale hacia CI como -f execution_key=$RTR_KEY. Ese input pisa el secret STP_EXECUTION_KEY, que queda solo para corridas programadas sin key.

4

Variantes

Cierre de sprint: el objetivo es el STR STR: Sprint#{N}: Regression Testing (testPlan → STP y → RTP), con N dado por el usuario o por el STP, nunca inventado. jira-native: no hay RTR; el trigger va sin execution_key.

Un RTR por veredicto, y nunca se reabre

Un RTR cerrado no vuelve atrás (la transición reactive no se usa). Una corrida posterior al veredicto, por ejemplo el re-run de un NO-GO ya corregido, abre su propio RTR.

Fuente: SKILL.md Fase 1 §Create the RTR (before the trigger) y §TMS sync. El RTR existe antes de que CI arranque para que el workflow reciba su key e importe ahí. El RTP es el plan long-lived que alimenta /test-documentation; esta skill solo lo consume como destino del testPlan y jamás escribe en él.

fase 1 · execute: plan, RTR, 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 · crear el RTR (slide anterior) → RTR_KEY en plan.md §Inputs
# 4 · disparar la suite con inputs explícitos
$ gh workflow run regression.yml -f environment=staging -f execution_key=$RTR_KEY \
    -f video_record=false -f generate_allure=true
# smoke y sanity: sin RTR y sin execution_key (nunca escriben en una Execution de regresión)
$ gh workflow run smoke.yml -f environment=staging -f generate_allure=true
$ gh workflow run sanity.yml -f environment=staging -f test_type=e2e -f grep="@auth"   # grep O test_file, nunca ambos
# 5 · capturar RUN_ID (esperar unos segundos: 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, junto al RTR_KEY, y progress.md registra ambos. Sin RUN_ID persistido no hay re-attach; sin RTR_KEY una sesión retomada no sabe en qué Execution importó CI. En jira-native se omite execution_key en todas las suites.

Anti-patrón R5

Registra el commit probado en el reporte (gh run view <RUN_ID> --json headSha) y compara tendencias solo entre runs con commit conocido: commit distinto, baseline distinta. Y video_record=true infla mucho los artefactos: solo para depurar.

La condición de carrera es real: gh workflow run retorna antes de que el run exista en la API, de ahí la espera corta antes de gh run list. Los inputs que se muestran son los que declaran regression.yml, smoke.yml y sanity.yml en .github/workflows/. 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 vuelca cada step)
$ gh run view <RUN_ID> --log-failed
$ gh run view <RUN_ID> --json artifacts --jq '.artifacts[].name'
# subagentes en paralelo: uno por artefacto que lista el comando anterior
$ 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 descargas justifican dispatch, un subagente por artefacto listado. Para triage local previo: bun allure:agent emite markdown legible por la IA sin parsear HTML.

fase 2 · analyze — parse + métricas

Los conteos salen de test-outcomes; 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

Conteos y detalle, cada uno de su fuente

Los conteos (total, passed, failed, skipped) salen de reports/test-outcomes.json: Allure archiva una falla esperada como passed y puede leerse verde sobre tests que nunca se observaron pasar. Allure manda para el detalle de cada falla (statusDetails, labels[]: testId = ATC ID, suite, severity) y para el historial que exige FLAKY; solo si el archivo no está en los artefactos descargados, los conteos salen de Allure y el reporte lo dice. Detalle: Allure > Playwright report.json > logs crudos.

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.

Sin retries: el flake aflora como fallo

La política anti-retry es retries: 0 (ver playwright.config.ts) — doctrina anti-retry: un reintento solo enmascararía el flake. La flakiness aparece como fallo intermitente normal y la clasifica la regla de historial (>20% en los últimos 10 runs), nunca un pass-on-retry. Si un proyecto downstream habilitó retries conscientemente, aplica el anti-patrón R3: expón el conteo de retries en el reporte, no solo el status final.

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? ──────────► ENVIRONMENT
  │    ECONNREFUSED · ETIMEDOUT · net::ERR_ · Navigation timeout · browserType.launch · 502/503
  ├─ sin historial (primer run)? ──────────► NEW TEST
  ├─ ≥5 runs y falla >20% (mismo build)? ─► FLAKY
  ├─ 1-4 runs de historial? ───────────────► REGRESSION (etiqueta INSUFFICIENT HISTORY)
  └─ cualquier otro caso ──────────────────► 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.

El gate falla cerrado

Toda clase salvo REGRESSION deja pasar el fallo, y quien la elige es el clasificador. Por eso cada una se sostiene solo con su cita (tabla de la slide siguiente). Sin cita, cita vacía o un ticket que esta misma sesión creó para volver «conocido» el fallo: cuenta como REGRESSION.

Para poder decir FLAKY hacen falta al menos 5 runs de historial: con menos, se anota "INSUFFICIENT HISTORY" y para el gate cuenta como REGRESSION (falla cerrado); se reevalúa en el próximo run. Orden cuando coinciden varias: KNOWN-BLOCKED > KNOWN ISSUE > ENVIRONMENT > NEW TEST > FLAKY > REGRESSION; FLAKY gana solo con su cita completa y REGRESSION es lo que queda. El porcentaje de fallo se calcula sobre una ventana más ancha, los últimos N = min(10, disponibles) runs: 5 es el piso para tener señal, 10 es la ventana. R1: jamás FLAKY sin citar el historial de al menos 5 runs.

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

Solo dos categorías pueden llegar a Jira

CategoríaImpactoAcciónIssue en Jira?Evidencia que debe citar
KNOWN-BLOCKEDLOWExcluir del gating, listar con su {BUG-KEY}No — el marker ya nombra el bug abiertoEl tag @blocked:{BUG-KEY} del spec y su bug key
REGRESSIONHIGHBloquea el release, archivar y asignarSí — Bug/Defect (Fase 3)Ninguna: es el valor por defecto
FLAKYMEDIUMAgendar estabilización, no bloqueaNoIds y resultados de al menos 5 runs sobre el mismo build
KNOWN ISSUELOWDocumentar contra el ticket existenteNoLa key de un ticket creado antes del run que nombre el test
ENVIRONMENTMEDIUMRe-run tras revisar la infraNoLa línea de log que coincide con el patrón, más los otros tests caídos en el mismo host
NEW TESTLOWVerificación manual primeroSolo si se confirma defecto realLa consulta de historial (Allure, runs del TMS) que volvió vacía

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.

después de la fase 2 · fleet seam (opcional)

Varios clusters de fallos, un worktree por cluster

El triage nunca se reparte entre sesiones: una sola sesión conductora lee el run, clasifica y es dueña del veredicto. La flota sirve para lo que viene después, cuando la clasificación deja varios clusters independientes que necesitan código, y solo si el usuario pide trabajarlos a la vez.

Topología

Un cluster = un worker = un worktree = una rama. Nunca dos workers sobre el mismo cluster: dos sesiones en un mismo checkout se pisan el índice de git aunque toquen archivos distintos. Cada fix se escribe bajo /test-automation (Plan → Code → Review) y aterriza según git_strategy.

launch.txt, siempre

La conductora escribe .session/regression-testing/<scope>/launch.txt, una línea autocontenida por cluster, exista o no un orquestador en la máquina. Lanzar y supervisar es cosa de /orca-orchestration; si nada puede lanzarlas, esas líneas se pegan a mano en terminales.

El veredicto no se mueve

GO / CAUTION / NO-GO, las métricas, el RTR (o el STR de cierre de sprint) y toda escritura en Jira quedan con la conductora. Un worker arregla su cluster y reporta: no re-puntúa el run, no archiva el defecto, no transiciona el RTR.

Regla de silencio

Si no hay transporte de orquestación, la skill no lo menciona: ni en el preflight, ni en el bloque de entorno, ni en el reporte. El launch.txt es el fallback y ya está escrito.

Fuente: SKILL.md §Fleet seam (optional). La flota es una opción para paralelizar arreglos, no para paralelizar el juicio. Un fix de regresión no está exento del gate de automatización: pasa por /test-automation como cualquier otro código de tests.

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

Un score guía; tres vetos mandan

Factor+3+10−1−2−3
Pass Rate≥95%90–95%——<90%—
Regressions01–2 Low—1+ Medium—High/Critical
Tests @criticalTodos pasan————Cualquier 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

severity → priority 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: veredicto en el RTR, reporte local, archive

Lo que queda es el RTR con su veredicto; el reporte es local

cierre del RTR (pseudocódigo de la skill)
# el RTR existe desde la Fase 1 y CI ya importó en él
[TMS_TOOL] Update Test Execution <<RTR_KEY>>
  results: solo lo que el import de CI no dejó
[ISSUE_TRACKER_TOOL] Add Comment <<RTR_KEY>>
  body: GO / CAUTION / NO-GO, score, blockers, links
[ISSUE_TRACKER_TOOL] Transition complete   # active → close
# RTP: queda en ready, nunca se completa
.context/reports/regression-{env}-{date}.md · [LOCAL]
## Executive Summary   Verdict + score/10 + 1 línea
## Release Blockers    si NO-GO: regressions + owner + ETA
## Failure Details     Regressions → Flaky → Known → Blocked → Env
## Trend · ## Links (RTR key) · ## Recommendations

El registro durable

Es el RTR en el TMS (el STR solo en la corrida de cierre de sprint) más el comentario GO / CAUTION / NO-GO publicado en él. El RTR se cierra vía complete después del comentario, nunca antes y nunca queda abierto. En jira-native no hay RTR: los resultados son escrituras de status por Test, el veredicto va al reporte local y a un comentario en el issue de Release si existe, con el skip declarado.

El reporte vive en una sola máquina

.context/reports/ está en .gitignore: es salida [LOCAL] generada y solo existe donde corrió la suite. Nada downstream puede depender de ese archivo; sirve para leer el run en frío, no como entregable.

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 (con un RTR nuevo).

Archive de sesión

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

Fuente: SKILL.md §TMS sync, §Post-decision actions y §Per-phase progress + Archive, más .context/reports/README.md. El reporte se genera en cada run con la misma estructura, para que se pueda escanear rápido, pero el archivo es [LOCAL]: lo que el equipo ve desde otra máquina es el RTR y su comentario de veredicto. STP y STR solo entran en la corrida que ES el cierre del sprint: el STP lo crea /sprint-testing y aquí se consume; el STR lo crea el primero que llega al cierre y el otro lo completa.

cierre del stage · light stage verifier + session footer

Antes de decir "listo": un checklist y dos bloques en el chat

Verificador ligero (artifact-lifecycle.md §5)

Ocho líneas comunes: artefactos por KEY, links, statuses, assignee, parent + components, campos y comentarios escritos, checkpoint en progress.md, footer impreso. Cada una es YES o un N/A declarado con su motivo; una línea en blanco es un verificador fallido y cualquier NO deja el stage en NEEDS REVISION. "Ligero" significa que se responde con lo que el stage ya hizo, más como mucho UNA lectura extra.

líneas propias de Regression
[ ] RTR por KEY, creado ANTES del trigger (salió como execution_key)
[ ] RTR con Test Environment, assignee self, parent QA Test Artifacts
[ ] RTR → RTP vía testPlan (RTP ausente = N/A declarado)
[ ] Comentario de veredicto EN el RTR (no el archivo local)
[ ] RTR en close vía complete, DESPUÉS del veredicto; nunca reactive
[ ] Cierre de sprint: STR → STP y → RTP, cerrado tras el veredicto
[ ] RTP intacto en ready
[ ] jira-native: skip declarado + status por Test + reporte [LOCAL]
[ ] Slug sin mapear → fallback §4 (preguntado), nunca skip mudo

Bloque 1 · Screenshots (rutas relativas)

Cada captura se nombra en el chat en el turno en que aparece, y al cierre va la lista completa: rutas relativas al repo, verificadas con ls, anotaciones de bugs primero. Aquí suelen ser la evidencia que se adjunta al defecto, sacada de ./analysis/evidence/.

Bloque 2 · Session Footer, encuadre Execution

Skills cargadas, MCPs llamados y CLIs invocados de verdad (gh, bunx allure, acli...), más los niveles de la pirámide que la suite de CI ejercitó, con "none" explícito en los que no tocó, y la línea Refinements proposed: con lo que quedó propuesto en refinements.md.

Solo en el chat

Ninguno de los dos bloques va a un comentario de Jira ni al cuerpo del RTR. Con subagentes, cada reporte de stage trae los cinco campos del footer y la conductora lo compila UNA vez al cierre.

Fuentes: agentic-qa-core/references/artifact-lifecycle.md §5, agentic-qa-core/references/session-footer-contract.md y SKILL.md §Post-decision actions y §Gotchas. El verificador existe para atrapar lo que se saltó en silencio, por ejemplo un RTR que quedó activo o un veredicto que solo existe en el archivo local. Los aprendizajes de la sesión se proponen en .session/regression-testing/<scope>/refinements.md y nunca se aplican a la skill viva.

dónde se ve el Allure de CI · github pages o portal privado

Público por defecto, privado con login cuando la evidencia no puede ser pública

RutaQué esCómo se activa
GitHub PagesDefault. scripts/ci/publish-allure-pages.ts publica en gh-pages; la URL /{env}/{suite}/ abre el último run.Habilitar Pages una vez: references/github-pages-setup.md.
Test Report PortalPrivado: Vercel (login) + Supabase (índice de runs) + bucket R2 privado. Login con email del trabajo, filtrado por dominio; retención en el portal.El publish de regression.yml, smoke.yml y sanity.yml ya es dual: va al portal si existe el secret PORTAL_URL. Solo se cablean secrets.
GitHub EnterpriseAtajo sin infraestructura: visibilidad de Pages en Private.Se ofrece primero, si la org lo tiene.

Protocolo que ejecuta la IA

references/private-hosting-setup.md: la IA corre cada paso (supabase, wrangler, vercel, gh secret set) y solo se detiene en los HUMAN CHECKPOINT: altas de cuentas, handshakes de login, OAuth opcional. Empieza detectando si el repo ya está cableado y cierra con un checklist de verificación (el viewUrl sin login devuelve 401, nunca bytes).

Version-currency de Allure, obligatorio

En cualquier setup de Allure o de Pages, primero: npm view allure version contra package.json. Mismo major atrasado → resumir novedades y ofrecer bun update. Major nuevo → nunca subir en silencio: breaking changes y aprobación explícita.

Fuentes: SKILL.md §Specific tasks y §Allure version-currency check, references/private-hosting-setup.md, references/github-pages-setup.md (Step 0). Se pide con frases como "reportes privados", "protege los reportes con login" o "no publiques evidencia pública". En modo portal gh-pages deja de usarse; borrar esa rama exige confirmación explícita (Critical Rule #6). El portal se despliega una vez por organización y cada repo solo agrega sus secrets.

quién decide qué — y qué pasa después del GO

El agente ejecuta. La evidencia prueba. La persona decide.

El contrato de Regression

El agente corre la suite, clasifica cada fallo, computa pass-rate y tendencia, emite GO / CAUTION / NO-GO y escribe el RTR (el STR solo en la corrida de cierre de sprint). La persona firma el veredicto CAUTION, y nunca deja que el agente invente el número de sprint. La evidencia que sobrevive: el reporte Allure, el RTR enlazado a su RTP, y la historia de corridas que autoriza la palabra FLAKY.

Autonomía CSA 3, y 4 para un GO limpio

Decide dentro de límites declarados y escala fuera de ellos; con un GO sin fallos la supervisión es por monitoreo, no por aprobación. Sin verificador separado: el único stage que lo exige es Automation. Regression es la excepción deliberada al techo de 3 del pipeline: un run sin fallos no necesita aprobación humana para avanzar, mientras que todo CAUTION o NO-GO lo firma una persona.

Y después del GO viene Observation

El pipeline no termina cuando la suite pasa. Observation es el octavo stage: producción, capacidad L4. No tiene skill — su unidad operativa es una rutina agéntica que vigila SLOs, error budget, RUM y señales de canary, abre items al backlog y alimenta el próximo Shift-Left. La persona firma los SLOs, la política de error budget y la decisión de frenar releases. Está declarado, no implementado: sin skill propio (el estado vive en agentic-qa-core/references/stage-gates.md), y decirlo así es parte de la honestidad del método.

Fuente: agentic-qa-core/references/stage-gates.md — contrato agéntico por stage y escala CSA 0-5. El punto pedagógico: el DoD dice qué tiene que ser verdad; el contrato dice quién tuvo permiso de hacerlo. Un orquestador que avanza un stage sin honrar el contrato se salteó un gate exactamente igual que uno que tildó un DoD que no verificó. Y Observation existe para que nadie crea que el ciclo cierra en CI.

cómo se invoca · claude code, opencode, codex

Un nombre de skill, tres hosts, sin modos

La skill no declara modos: lo que viaja después del nombre son args-as-answers (suite, env, grep o test_file). El preflight solo pregunta lo que falte; sin suite, "run regression" pelado corre regression en el env por defecto.

HostCómo se invocaEjemplo
Claude CodeSlash command con la skill, args detrás/regression-testing smoke staging
OpenCodeSin slash commands: se nombra en prosa"carga la skill regression-testing, suite smoke en staging"
CodexIgual que OpenCode, en prosa"carga la skill regression-testing y corre sanity con grep @auth"

Frases que la disparan

"run regression", "smoke suite", "analyze test results", "GO/NO-GO decision", "release readiness", "quality report", "flaky tests", "pass rate".

Rutas que no son modos

Los reportes privados se piden con una frase: "reportes privados", "protege los reportes con login", "no publiques evidencia pública". Lo mismo GitHub Pages ("publish the reports site") y el version-currency check ("is Allure up to date?").

Fuente: SKILL.md (frontmatter description, §Readiness Preflight Gate y §Specific tasks) y .agents/instructions/agent-skills-and-mcps.md Skill modes. La skill no tiene sección Mode routing, así que en Claude Code el primer token no selecciona un modo: todo lo que va después del nombre se lee como respuesta del preflight. En OpenCode y Codex no existen slash commands, se pide en prosa nombrando la skill.

cierre: qué entra, qué sale, qué queda

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

Invocación

/regression-testing en Claude Code; "carga la skill regression-testing" en OpenCode y Codex. Detalle en la slide anterior.

Handoffs

Entra desde /test-automation (Automation: escribe los tests y el marker @blocked) y desde /test-documentation (promueve el RTP). Sale hacia /sprint-testing (verificar el fix a mano) y de vuelta a /test-automation (estabilizar flaky, nuevos tests). Tras un GO, el ciclo no termina: entra en Observation.

Artefactos clave

Entregable: el RTR en el TMS con su comentario de veredicto (el STR solo al cierre del sprint) e issues Jira (Bug/Defect). Salida local: .context/reports/regression-<env>-<date>.md [LOCAL], ./analysis/ (artefactos CI), plan.md + progress.md (sesión).

Profundizar

references/failure-classification.md (catálogo de patrones de error) · references/ci-cd-integration.md (workflows, sharding, secrets, execution_key) · references/github-pages-setup.md (publicar los reportes Allure) · references/private-hosting-setup.md (portal privado). Antes de cualquier setup de Allure o Pages: 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