AGENTIC QA · WORKFLOW SKILL

/sprint-testing

QA manual por ticket dentro del sprint: Planning → Execution → Reporting, con gates humanos en cada checkpoint.

Planning · Execution · Reporting Story · Bug · Sprint-wide Jira = fuente de verdad
Deck del skill /sprint-testing: cómo la IA conduce el QA manual de un ticket durante el sprint. → para avanzar, S modo presentador, O overview, F pantalla completa.

El mapa completo · índice del deck

Un pipeline, gates en cada paso

Entrada single-issue una Story o un Bug sprint-wide el sprint N · 1 o N ejecutores modo preguntado en Session Start ← viene de /shift-left-testing (el ATP publicado en Jira, no el label solo, acorta el Planning)
Gate 0
Preflight
Probar env, creds, tools, TMS
RED bloqueante → STOP
→
Phase 0
Resume
Lee progress.md
resume / restart / abort
→
Entry
Session Start
Sync ticket · carpeta PBI · plan
⏸ explica la Story y ESPERA tu OK
→
Planning
Planning
Triage · doctrina · ATS + ATP + ATR
bug: veto SKIP → solo Code Review
→
Execution
Execution
Smoke · trifuerza UI/API/DB
smoke No-Go → STOP · bug bloqueante → ⏸
→
Reporting
Reporting
ATR · QA comment · transición · cierra ATS/ATP/ATR
bug solo con tu confirmación
Salida
Archive
.session/ → .archive/ + memoria de sesión · los artefactos PBI quedan
→
Documentation
/test-documentation: TCs de regresión + ROI
Automation
/test-automation: código KATA
Regression
/regression-testing: suites en CI
Observation
producción · L4, rutina agéntica, sin skill: realimenta el próximo Shift-Left
Sprint ↩
siguiente issue PENDING del plan.md del sprint

Las 4 fases del camino principal se despachan como subagentes secuenciales: cada reporte alimenta el briefing del siguiente, y cada stage cierra con el verificador liviano. Este mapa es el índice: cada nodo tiene su slide.

El índice mental del deck. Camino principal: Preflight → Phase 0 → Session Start → Planning → Execution → Reporting → Archive. Adyacentes: los dos modos (single-issue para una Story o un Bug, sprint-wide para el sprint entero), que se preguntan y no se adivinan, el handoff desde shift-left, el veto de bugs que colapsa a Code-Review-only, los STOP/pausa de Execution, y los handoffs a Documentation / Automation / Regression. Más abajo, en producción, Observation: declarado, sin skill propia. El modo sprint-wide loopea el mismo camino por issue, en esta sesión o repartido en una flota.

Antes de empezar · el modo se pregunta

Dos modos, preguntados; el mismo pipeline

ModoEntraSale
single-issue · User StoryUn ID de Story en Ready For QAATS + ATP + ATR + QA comment · ticket transicionado a QA approved · TC outlines (native) o Tests agrupados en el ATS y ejecutados (xray). Sin STP ni par de sesión del sprint.
single-issue · BugUn ID de Bug con fix en stagingDecisión de triage → solo Code Review, o verificación completa con ATP + ATR (xray: 1 Test de repro en-sprint · native: sin TCs, difiere a Documentation)
sprint-wideUn número de sprint NPar de sesión sprint-<N>/ (plan.md + progress.md) · STP find-or-create y vivo en Jira · artefactos por issue · interrupción y resume

La pregunta del modo, siempre

Session Start pregunta: todo el backlog de QA del sprint (sprint-wide) o un issue (single-issue)? Un número de sprint es una pista, no una respuesta. Solo se saltea cuando el primer token de los argumentos nombra el modo: /sprint-testing sprint-wide 12 · /sprint-testing single-issue UPEX-123. En sprint-wide llega una segunda pregunta: un ejecutor o una flota?

Alcance por JQL, misma cadencia

El sprint sale de una JQL con los work types coverable que declara el proyecto, intersectada con lo que la instancia tiene (un tipo ausente se saltea con una nota, nunca bloquea). Cada issue paga los mismos 4 despachos: Session Start → Planning → Execution → Reporting.

El modo no se infiere de cómo está escrita la invocación: «QA sprint 12» puede querer decir cualquiera de los dos. Solo sprint-wide crea el par de sesión del sprint y el STP; single-issue no crea ninguno de los dos. Se dice "issue" y no "story" porque bugs, defects, tech debt e improvements también son coverables, y no hay camino "inline" para un solo issue: los dos modos corren la misma secuencia de 4 subagentes.

Gate 0 · corre ANTES que todo

Readiness Preflight: probar, no asumir

Ley 1 · args-as-answers

«QA UPEX-123 on staging» ya responde env y alcance. Solo se preguntan los huecos, en un único checklist.

Ley 2 · probe, don't assume

Un MCP configurado sigue en RED hasta que responde de verdad. Se sondea cada capacidad antes de usarla.

CapacidadSonda
Env alcanzable (REQUIRED)curl -sI {{WEB_URL}} + API root: 2xx/3xx pasa; env muerto → STOP antes de escribir un solo plan
Credenciales + roles (REQUIRED).env por entorno · un token por rol vía bun run api:login
Jira + modalidad TMS (REQUIRED)carga /acli · resuelve jira-xray vs jira-native · carga /xray-cli si aplica
Por superficie (según alcance)OpenAPI MCP (solo schema) · DBHub MCP · Playwright · inbox que pueda recibir (magic-link)

Framework aún genérico (URLs null) → STOP: correr antes /project-discovery → /test-framework-adaptation.

URL ad hoc (preview, hotfix)? WEB_URL_OVERRIDE / API_URL_OVERRIDE en test-session-memory.md: gana a project.yaml en todas las etapas y nunca se escribe ahí (Gotcha 15).

Las superficies UI/API/DB las decide el triage de Planning, nunca se le preguntan al usuario. El gate más pesado del repo porque Execution ejercita UI + API + DB en vivo. Autorar un ATP contra un entorno muerto es el desperdicio más caro de un run, y se atrapa aquí, a t=0.

Phase 0 · nunca empieces a ciegas

Ya había una sesión? Resume, restart o abort

  • Calcula el <scope>: UPEX-123 o sprint-7/UPEX-123 (sprint-wide).
  • Lee progress.md: última etapa completada, BUG_FOUND o TOOL FAILURE pendientes.
  • Ofrece resume / restart / abort: en restart, primero archiva la sesión abortada.
  • En sprint-wide corre en dos alturas: una vez sobre sprint-7 al entrar («cola de n, k cerrados, sigue X») y otra sobre sprint-7/UPEX-123 al entrar a cada issue.
.session/sprint-testing/<scope>/ plan.md ← índice de la sesión progress.md ← checkpoint por etapa test-session-memory.md ↑ payload de dominio compartido entre los 4 subagentes .context/PBI/.../STORY-<KEY>-<slug>/ context.md · evidence/ ← lo local del ticket

Dos memorias, dos preguntas. progress.md decide «qué etapa sigue?» · test-session-memory.md lleva la modalidad TMS + contexto del ticket que cada subagente lee. Ambas se consultan al retomar. Las dos viven en .session/, nunca en la carpeta PBI: un re-sync del cache PBI destruiría el archivo.

El contrato de resume viene de session-management.md §4. Interrumpir una sesión no pierde nada: el próximo run detecta el estado y retoma exactamente donde quedó.

Entrada universal · prepara la mesa

Session Start: sync, contexto, carpeta PBI

  • Resuelve la modalidad TMS y testing.tc_creation_stage; los dos quedan fijos la sesión. ATP = Test Plan, ATR = Test Execution, ATS = Test Set; el custom field de la Story es solo fallback.
  • Solo sprint-wide: STP find-or-create en el primer ticket (STP: Sprint#{N}: {objetivo}). single-issue no crea STP.
  • Trae el ticket: bun run jira:sync-issues get <KEY> --include-comments → lee los .md y el Team Discussion de comments.md. Nunca acli view para custom fields.
  • Carga contexto + código: business maps, master test plan, module-context.md (sincronizado desde la sección ## Module Context (QA) del Epic), repos, datos vía DBHub.
.context/PBI/epics/EPIC-<KEY>-<slug>/ stories/STORY-<KEY>-<slug>/ story.md, acceptance-criteria.md [SYNC] acceptance-test-plan.md [SYNC] context.md ← a mano evidence/ ← capturas .session/sprint-testing/<scope>/ test-session-memory.md ← a mano

⏸ El gate del hand-off (S10). Escribe la Story Explanation en lenguaje llano y SE DETIENE: nada transiciona a In Test sin tu OK explícito. Carpeta PBI nueva por ticket, nunca reusada (S9); los [SYNC] jamás se escriben a mano (S14).

Session Start sincroniza el ticket, arma la carpeta PBI (context.md + evidence/), escribe el plan.md y el test-session-memory.md de sesión bajo .session/, explica la Story y espera confirmación humana antes de continuar. Si module-context.md no existe, la IA redacta el cuerpo y lo publica en la sección ## Module Context (QA) de la descripción del Epic (leyendo primero, sin pisar el texto del PO) y vuelve a sincronizar: el archivo local nunca se escribe a mano.

Planning (históricamente Stage 1) · de los ACs a un plan ejecutable

Siete fases, del triage al ATP en Jira

FaseQué produce
0 · TriageShort-circuit solo con evidencia citada: el ATP pre-sprint publicado en Jira, los labels shift-left-* con menos de 30 días y los ACs sin cambios (salta fases 1-3; los labels solos corren el flujo completo) · veto · risk score · factibilidad de datos: Discover / Modify / Generate por AC
1-2 · AnálisisContexto de negocio + técnico · ambigüedades y gaps marcados NEEDS PO/DEV CONFIRMATION
3 · ACs refinadasCada AC reescrita Given/When/Then con datos específicos
4-5 · Test outlinesDerivación por técnica (1:N) · nombre Should <BEHAVIOR> <CONDITION> · edge cases + estrategia de datos
6 · TrazabilidadOrden Set-first (xray): ATS: {KEY}: {título} (Test Set → epic QA Test Artifacts, components de la Story) con TODOS los TCs → ATP: {KEY}: {título} (Test Plan → epic QA Master Test Plan, creado desde el field del shift-left) → ATR: {KEY}: Story Testing (Test Execution → epic QA Test Artifacts) SIEMPRE con Test Environment (active_env) · listas de Plan/Exec derivadas de la membership del ATS

Antes de autorar. Consulta business-domain-context (bun run context:map business-domain-context) para que ACs, outlines y títulos usen los términos canónicos; un término nuevo se propone por el refresh de esa skill, nunca se edita el mapa a mano. Una decisión de arquitectura de test difícil de revertir sale del plan a un ADR en .context/ADR/ (S15).

El ATP es la spec del testing. Vive en Jira (S14): se escribe en el issue Test Plan (o en el custom field como fallback), se sincroniza hacia abajo y se relee; nunca se autora el .md local a mano.

Planning · la doctrina que gobierna el plan

Verificar ACs es el piso, no el testing

Piso, no techo

Cobertura = conformidad-AC + riesgo más allá del AC (límites, errores, estados, anomalías). Nunca reportar «% de ACs verificados» como completitud.

1 : N por defecto

Cada AC no trivial explota en varios casos. Colapsar a uno exige justificación escrita trivially atomic.

Criterio ≠ caso

Un criterio es una afirmación de negocio; un caso es una exploración concreta de cómo se cumple o se rompe.

Disparador en el ACTécnica obligatoria
Cualquier input, siempreEquivalence Partitioning · un caso por clase válida + inválida
Rango / límite / longitud / ventana de fechaBVA · min−1 · min · min+1 … max−1 · max · max+1 · cero/vacío/null
Campo de estado / ciclo de vidaState-Transition · cada transición válida + cada inválida
2+ condiciones que interactúan · 3+ factoresDecision Table · Pairwise (registrando la reducción) · charters de Error-Guessing
Canon: agentic-qa-core/references/test-design-doctrine.md, carga obligatoria antes de derivar cobertura. EP sin BVA pierde el off-by-one; un campo de estado sin transición inválida es un plan incompleto.

Planning · la regla que define la forma del skill

Cuándo un TC se vuelve work item?

Modality jira-nativeModality jira-xray (bun xray)
PlanningSolo outlines en el ATP (nombre + 1 línea). Sin issues Test: un Test nativo es documentación y espera al gate de Documentation.Crea + ejecuta issues Test para los outlines, a detalle ejecutable, agrupados en el ATS (Test Set per-Story) y ejecutados vía un Test Execution: el Test ES la unidad de ejecución de Xray.
ExecutionCorre los outlines + explora más allá; PASS/FAIL en la memoria de sesión.Ejecuta los Tests + explora. Una sonda exploratoria se vuelve Test solo si halló un defecto o vale repetirla.
DocumentationCrea Tests solo para lo regression-worthy, tras el ROI.Selecciona + promueve al Regression Test Plan (RTP) (el Test Plan long-lived del proyecto, contra el que /regression-testing escribe cada RTR) + Test Set, y los enriquece.

Formato, una vez por batch

Manual o Gherkin? Se sugiere, tú eliges, aplica a todo el batch. En una flota lo declara el brief.

Manual en dos pasos

Xray Cloud descarta en silencio los steps inline: crear sin steps y agregarlos uno a uno.

El knob del proyecto

testing.tc_creation_stage: auto = esta tabla · sprint-testing = Tests en ambas · test-documentation = en ninguna.

Principio rector: un test se persiste al repositorio de REGRESIÓN porque se va a re-ejecutar, nunca para inflar un conteo. El artefacto de ejecución del sprint no es el repositorio curado: ese lo decide el ROI en Documentation. El knob testing.tc_creation_stage se resuelve junto con la modalidad; vacío o desconocido = auto, avisado una vez. Elegir test-documentation en un proyecto Xray tiene un costo que se le dice al usuario antes: sin Tests no hay Test Execution, el ATR no lleva runs y la evidencia por TC vive solo en su cuerpo.

Planning · la traza, antes de tocar un browser

El ATS carga el coverage; ATP y ATR son administrativos

Story ── is tested by ── ATS: UPEX-123: {título} ← coverage (panel de Xray) ├─ TC→ATS UPEX-123: TC1: should … └─ TC→ATS UPEX-123: TC2: should … (xray escribe además la membership interna, nunca en lugar del link) Story ── ATP: UPEX-123: {título} administrativo · cero coverage Story ── ATR: UPEX-123: Story Testing administrativo · cero coverage Listas de tests del ATP y del ATR = DERIVADAS de la membership del ATS (S17)

Chequeo de tres aristas (Gotcha 9)

Link List en Story + ATP + ATR, o bun xray trace UPEX-123. Verifica Story↔ATS, membership completa, Story↔ATP y Story↔ATR, y que las listas coincidan con el ATS. Un TC directo a la Story es último recurso: solo si la instancia no tiene el work type Test Set.

Título canónico del Test

Si Planning crea el issue Test, el summary nace canónico: {US_ID}: TC#: should <resultado> [<conector> <condición>] [given <precondición>]. El # se asigna una vez y no se renumera; Documentation lo re-verifica al promover.

Única excepción declarada al ATP item: qa.methodology.gate_mode: light puede colapsarlo por sprint, escrito en el STP con su ítem de deuda (S2).

TC∈ATS es siempre un link TC→ATS (slug test), en jira-xray y en jira-native; jira-xray escribe también la membership interna de Xray. TC∈ATP y TC∈ATR quedan internas de Xray. Cascade de ubicación de un TC en el cache: TC→ATS→Story (primaria) · TC→ATP→Story (solo placement) · TC→Story directo (último recurso) · si nada, orphan. Canon: agentic-qa-core/references/traceability-linking.md §9.

Planning y Reporting · estados en Jira

Ningún artefacto se queda donde lo dejó create

ArtefactoNace enPlanning lo deja enReporting lo cierra en
Test (TC)draftready vía start_design → ready_to_runlo mueve Documentation
ATPplanningready vía designedcompleted vía complete
ATSdesigningsigue designingclose vía done
ATRactivesigue activeclose vía complete
STP (sprint-wide)planningready al fijar el scopecompleted al cierre del sprint

Assignee = tú mismo, al crear (S19)

ATP, ATS, ATR y cada Test nacen con assignee. Xray rechaza editar la membership de un Test Plan que no es tuyo: un ATP sin dueño falla a mitad del flujo. Si el find-or-create devuelve uno ajeno, se pregunta; nunca se reasigna en silencio.

Slug sin mapear (S18)

Lista las transiciones vivas, propone la más parecida en una pregunta, dispara el id vivo si dices que sí y recomienda bun run jira:sync-workflows. Si eliges saltarla queda como N/A declarado; un salto silencioso, nunca.

Cada Test va con parent epic QA Test Repository; el ATR nace con su Test Environment.

ATS y ATR siguen abiertos a propósito al salir de Planning: la membership no es final y la corrida no pasó. Sin entorno no hay ATR. Canon: agentic-qa-core/references/artifact-lifecycle.md §1 (tabla), §2 (assignee), §4 (fallback). Los nombres de estado y transición son slugs que resuelve .agents/jira-workflows.json; cada proyecto los mapea a sus nombres reales. El Re-Test Execution de un bug sigue la misma regla que el ATR: nace active y se cierra cuando el run del Test de repro queda registrado. Un ATP congelado en planning o un TC en draft después de su stage es un defecto reportable del harness: le dice al equipo que el trabajo nunca pasó.

Planning · rama Bug · triage antes que plan

El veto le gana al risk score, siempre

VeredictoDisparadores
SKIP: solo Code Reviewtexto/label puro, CSS/visual, docs, config/infra, refactor sin cambio de comportamiento; Execution y Reporting colapsan al comentario + transición
REQUIRE: test completodinero/billing, integridad de datos, auth/autorización, integraciones externas, máquinas de estado, cálculos, sin importar el score

Sin veto → risk score

Feature nueva +3 · datos dinámicos +3 · ACs explícitas +2 · user-facing +2 · esfuerzo >4h +2 · prioridad alta +1 · multi-componente +1 → 0-3 LOW (Code Review) · 4-7 MEDIUM (ATP completo) · 8+ HIGH (ATP + edges extendidos). El resultado se presenta al usuario.

Reglas del bug run

ATP + ATR de retest. jira-xray: 1 Test de repro creado en-sprint al verificar el fix (1:N si el scope lo justifica), ejecutado en la Execution ReTest:. jira-native: sin TCs en el sprint, difiere a Documentation, como siempre. Ejecuta: reproducir el original → verificar el fix → regresión en áreas adyacentes → DB si es de integridad. Regla de oro: si amerita regresión, Documentation termina con un Test persistente: reusar el de repro o crear uno.

Anti-patrón S5: ninguna falla se salta el árbol veto → risk-score → severidad + root cause. Un typo hardcodeado hace SKIP; cualquier cosa que toque dinero, datos o auth se prueba aunque el diff luzca trivial.

Execution · primera acción obligatoria

Smoke test: una puerta Go / No-Go de ≤10 min

  • Acceso básico. La app carga, sin 500, consola sin errores rojos.
  • Authentication. Login, la sesión persiste al refrescar, logout.
  • Happy path. El flujo primario del ticket de punta a punta.
  • Integración backend. Llamadas /api/* en 2xx; los datos persisten tras F5.

Veredicto

PASS → continuar a la trifuerza · FAIL → STOP: blocker de nivel entorno, se reporta y no se explora nada.

Reachability ≠ smoke (S7)

El preflight preguntó «está levantado el env?»; el smoke pregunta «funciona la feature?». Ambos corren: saltarse el smoke produce bugs falso-positivo contra un entorno roto.

Sin edge cases, sin bugs menores, no más de 10 minutos. El smoke valida el entorno de la feature; la trifuerza valida la feature.

Execution · exploración por capas

La trifuerza: UI · API · DB

UI

playwright-cli: happy path + edges: vacío, largo máximo, 0/−1/MAX_INT, <script>, refresh a mitad de flujo, botón atrás. Screenshot en el estado FALLIDO, con ruta destino explícita a evidence/ (el outputDir no se toca).

API

Maniobra de 3 herramientas: OpenAPI MCP solo schema → bun run api:login → curl autenticado. Matriz de status: 200 happy · 400 campo faltante · 401 sin auth · 403 otro tenant · 409 duplicado.

DB

DBHub MCP: filas persistidas, triggers (total == SUM de items), sondas de constraint FK/CHECK/UNIQUE envueltas en transacción + ROLLBACK.

Orden según la feature

UI-céntrica: UI→API→DB · API-first: API→DB→UI · data-céntrica: DB→API→UI. Un no-2xx en la UI te escala a la capa API; datos raros en pantalla te mandan a la DB.

Sonda RLS (multi-tenant)

Con A y B del mismo rol: A lista/lee/edita datos de B? Cualquier VULNERABLE = Critical y BLOQUEANTE: los bugs de autorización nunca afloran en el happy path.

Nunca ejecutar requests autenticadas por el OpenAPI MCP: es de lectura de schema. El token se acuña con api:login a .auth/tokens.env y se ejecuta con curl. Explorar SIEMPRE más allá de los outlines planeados.

Execution · pausa graduada

Un FAIL no es auto-Critical: triage primero

ClaseEjemplosAcción
BLOCKINGsmoke/env caído · corrupción de datos · explotable en seguridad (auth bypass, cross-tenant)⏸ pausa YA: se presenta el bug y se espera tu decisión; no se despacha la siguiente etapa
NON-BLOCKINGcosmético · gap menor de validación · edge en TC no crítico · default de framework por recalibrarse registra, TC FAILED, y se terminan los TCs restantes: todo se lleva al cierre de Execution
TOOL FAILUREcualquier herramienta rota a mitad del paseSTOP: estado parcial reportado, tú eliges retry / skip / abort

Casos dependientes del tiempo

TTL, magic links, OTPs: elegir la opción más alta: TTL corto de test → clock-mock → defer explícito documentado. Nunca un «BLOCKED» a secas: al cierre cada TC está PASSED o FAILED solo si se observó en su entorno, o en NOT RUN con su razón (el defer escrito es la deferral de QA, con tarea de seguimiento).

Evidencia

Capturas, traces y logs bajo evidence/ del ticket (gitignored). Se captura el bug, no la navegación hacia él.

Esta regla protege la cobertura: pausar un pase de 17 TCs por un hallazgo cosmético desperdicia el run; un blocker genuino sí detiene al instante.

Execution · sesiones de browser y evidencia

Un login por rol, cada captura con su ruta

Una sesión por ticket, un estado por rol

Sesión con nombre (-s=UPEX-123), en memoria. El login sale del estado del rol, .auth/<env>-<role>.json vía state-load, nunca tipeado en la exploración. Y ese estado solo lo produce el login real de la app: nada de service-role key, API de administración de usuarios, magic link generado en el servidor ni JWT armado a mano (browser-sessions.md §4). Dos roles = dos sesiones. Cada sesión se cierra antes del reporte y playwright-cli list lo prueba.

Agentic Pair Testing

La IA y tú en tu propio Chrome. Lo gobierna testing.browser.pair_mode en .agents/project.yaml: null pregunta una sola vez y guarda la respuesta · true es el modo por defecto · false usa sesiones dedicadas, y pair solo si lo pides, con una confirmación.

Destino explícito (Gotcha 8)

Nadie reapunta el outputDir de .playwright/cli.config.json: queda en el directorio de la herramienta. Cada captura lleva su ruta al evidence/ del ticket (a un .png el outputDir no le aplica igual), y la ruta se muestra en el chat apenas existe.

Bug visual o de posición

Superposición, desalineación, un eje corrido: antes de reportar se carga /bug-screenshot-annotation, que marca la captura (círculos, flechas, callouts) en local. El PNG anotado va primero como evidencia. Un hallazgo textual no lo necesita.

Canon: agentic-qa-core/references/browser-sessions.md (casos, pair_mode, flotas) y agentic-qa-core/references/evidence-conventions.md (buckets, sufijo de la imagen anotada, verificar en disco). Reapuntar el outputDir compartido es last-writer-wins: con varias sesiones, las capturas de una caen en la carpeta del ticket de otra. Los archivos de trabajo de la anotación (recortes, HTML del overlay) van al scratchpad de la sesión, nunca a evidence/.

Reporting · el veredicto auditable

ATR → QA comment → transición, en ese orden

ResultadoQA commentTransición
Story PASSEDTemplate A→ QA approved (vía qa_sign_off)
Story FAILED (defecto confirmado)Template B + reporte de bug→ blocked (+ issuelink is blocked by), o queda in_test con el bug linkeado
Bug VERIFIEDTemplate C→ closed (vía retest_passed)
Bug NOT FIXEDTemplate Dqueda ready_for_qa, se etiqueta al dev

ATR por modalidad

jira-xray: actualizar la descripción del Test Execution + status de cada Test Run. jira-native: custom field acceptance_test_results (o comentario fallback) → sync → releer. Sin snapshot de ATR no se reporta nada (S3).

Recalibración de severidad (§5.0)

FAIL de seguridad/auth que huele a default de framework (cookie flags, CSP/HSTS): hipótesis + un hecho de verificación + decisión humana → PASSED WITH ISSUES (GO-con-deuda), no un blocker.

Cuerpos rich-text (S6). Los cuerpos rich-text (ATP, ATR, descripción del Test) se escriben en Markdown, se convierten y validan con el conversor .agents/skills/acli/scripts/md-to-adf.ts, y lo que se publica es el ADF JSON resultante; por la vía CLI, acli nunca convierte Markdown solo.

El QA comment es un resumen; el ATR es el registro de auditoría; nunca duplicarlo en un segundo store (S4). Resultados mixtos usan PASSED WITH ISSUES y aún entregan los TCs en pass a Documentation.

Reporting · doctrina de defect management

Clasifica antes de reportar: Bug ≠ Defect ≠ Improvement

Bug

La feature ya vive arriba de Staging (visible al usuario final).

Defect

Feature aún pre-release: la salida normal del sprint testing.

Improvement

No es un AC roto: mejora o AC sub-especificada hallada probando más allá.

Tres ejes, nunca mezclados

parent = epic de proceso «QA Defect Management» (jamás un epic de producto) · issue link = la Story origen · components = módulo de producto afectado. qa_assignee = tú mismo, nunca sobrescribiendo un owner existente.

Severidad → prioridad (lookup)

critica→Highest · mayor→High · moderada→Medium · menor→Low · trivial→Lowest (slugs de .agents/jira-required.yaml; override con justificación). Título: <EPIC>: <COMPONENT>: <resumen>.

Disciplina. Repro reproducible + evidencia o no hay ticket (S12) · una capa por bug, nunca UI+API+DB mezclados (S8) · buscar duplicados primero · borrador completo a la vista y tu confirmación antes de crear nada.

Canon: agentic-qa-core/references/defect-management-doctrine.md, carga obligatoria antes de reportar. La clasificación sigue el ciclo de vida de la FEATURE, no dónde se encontró el problema.

Cada stage · el cierre que no se saltea

Verificador liviano + footer de sesión

Planning · líneas propias ATP en ready · cada Test en ready (parent QA Test Repository) ATS sigue designing · ATR sigue active ATR con Test Environment assignee en todo lo creado chequeo de tres aristas OK Reporting · líneas propias ATR close · ATS close · ATP completed Story en qa_approved o blocked cada issue reportado: QA Defect Management + components + qa_assignee todo slug sin mapear: PREGUNTADO

Las líneas comunes viven en artifact-lifecycle.md §5 y no se repiten por skill.

Cómo se responde

Cada línea es YES o N/A con su razón; una línea en blanco cuenta como falla. Un NO deja el stage en NEEDS REVISION y no se avanza. Liviano: responde con lo que ya hizo, con a lo sumo una lectura extra.

Footer de sesión, solo en el chat

Cada captura muestra su ruta apenas existe; al cierre, la lista consolidada (verificada en disco, anotaciones primero). Después el footer: skills, MCPs y CLIs usados, niveles de testing tocados con «none» explícito y Refinements proposed:. Nunca en un comentario de Jira ni en el ATR.

Canon: agentic-qa-core/references/artifact-lifecycle.md §5 (verificador) y agentic-qa-core/references/session-footer-contract.md (footer). El encuadre de esta skill es de ejecución: "niveles tocados" son los niveles de la pirámide que se ejercitaron a mano o exploratoriamente. Cada subagente devuelve los campos del footer y el orquestador lo arma una sola vez al cierre. Las lecciones de la sesión se proponen en .session/sprint-testing/<scope>/refinements.md y nunca se aplican a la skill en vivo.

Modo sprint-wide · procesar el sprint entero

El plan es local, el estado vive en Jira

  • El alcance sale de una JQL con los work types coverable que declara el proyecto.
  • Local: el par de sesión de siempre en .session/sprint-testing/sprint-<N>/: plan.md (scope, waves, asignación) y progress.md (append-only).
  • Loop con un ejecutor: primer issue PENDING de Wave 1 → los mismos 4 despachos → resumen → tu OK para el siguiente. STOP en TOOL FAILURE · ⏸ en BUG_FOUND bloqueante.
  • Cierre del sprint: se crea el STR: Sprint#{N}: Regression Testing como recap y el STP se cierra. Cada corrida de regresión del sprint deja su propio RTR, de /regression-testing.

El estado que ve el equipo = el STP

La descripción lleva el plan estable (un escritor, read-first); los comentarios, el progreso append-only por issue cerrado. Si chocan con el ATR de una Story, manda el ATR.

Checkpoint por etapa (S11)

Tras cada subagente, el orquestador anota la etapa en progress.md.

Archive al cerrar

.session/… → .session/.archive/<fecha>-… + resumen a memoria persistente. Lo que queda es Jira: STP, ATP, ATR, bugs.

El par plan.md + progress.md es el mismo convenio que usan las demás workflow skills: andamiaje local, no entregable: nunca viaja a otra máquina. Lo que el equipo consulta es el STP en Jira. Phase 0 corre en dos alturas: una vez sobre sprint-N al entrar (cuánto avanzó el sprint) y otra por issue sobre sprint-N/KEY al entrar a cada uno, así el resume de un sprint interrumpido es fino: retoma el issue exacto y la etapa exacta.

Sprint-wide · el segundo eje: ejecutores

Alcance × ejecutores: la flota es opcional

1 ejecutor (default)N ejecutores (fleet mode)
single-issuesin cambios: esta sesión corre el issueno existe: un issue, un ejecutor
sprint-widesin cambios: esta sesión recorre la colaesta sesión es el conductor; una sesión por issue de la ronda

Conductor

Habla contigo, arma las rondas, siembra un brief.md por issue, acuña tokens y estados de browser. Único escritor del sprint: plan.md, progress.md, STP.

Worker

single-issue sobre su KEY. Lo reconoce el token fleet worker del prompt y su brief, no las env vars. Sin checkpoints, sin saltear preflight ni sondas MCP, hasta worker_done.

launch.txt, siempre

En .session/sprint-testing/sprint-<N>/: una línea autocontenida por issue, regenerado entero en cada ronda. Sin orquestador, abres N terminales y pegas una línea en cada una.

Rondas ≠ waves. Una wave es un bucket de estado de Jira (qué issues son elegibles); una ronda es cuántos corren a la vez, hasta orchestration.max_workers, que es un tope y nunca el interruptor. Si no hay orquestador disponible, la skill no lo nombra: ni en el plan, ni en el preflight, ni en el ATR.

Fleet mode se enciende solo con dos condiciones: el modo es sprint-wide y el usuario respondió la pregunta de ejecutores con N. Con N=1 nada cambia, byte por byte. El gate de orquestación decide una sola cosa: quién abre las sesiones (el orquestador las lanza y supervisa, o el humano pega las líneas de launch.txt). Las decisiones humanas quedan con el conductor: pregunta el formato de TC una vez por batch y lo escribe en cada brief, y cada ronda cierra con un resumen y tu checkpoint. El worker no crea estado de sprint, no acuña tokens y no corre syncs masivos; lo que necesitaría preguntar sale como ask al conductor. Canon: sprint-testing/references/fleet-conductor.md.

Cómo lo invocas · tres hosts

La skill, el modo y el resto de los argumentos

Claude Code > /sprint-testing single-issue UPEX-277 > /sprint-testing sprint-wide 12 > /sprint-testing UPEX-277 ← pregunta el modo OpenCode · Codex > cargá la skill sprint-testing, modo single-issue, issue UPEX-277 > cargá la skill sprint-testing, modo sprint-wide, sprint 12 También la disparan frases como > QA this user story · retest bug UPEX-445 > process sprint 5 · resume sprint testing

El primer token decide

Si el primer argumento nombra un modo, ese es el modo; si no, Session Start pregunta. Abrí el host tal cual (claude, opencode, codex o su app): cada MCP lee .env por su cuenta.

Se lee en Session Start

.agents/project.yaml · catálogos Jira · mapas de contexto + MTP · el ticket vía jira:sync-issues. El .env no entra: la IA nunca lo abre.

El humano conserva los juicios

Modo · OK de la Story · triage · cada bug · retry/skip/abort.

Una sola forma de invocar en los tres hosts: skill más modo. En Claude Code es el slash; en OpenCode y Codex se nombra la skill y el modo en prosa. No hay archivos de comando aparte. El resto de los argumentos (el KEY, el número de sprint) se reenvía tal cual. Un worker de una flota arranca con /sprint-testing KEY fleet worker y su brief: el prompt ya responde el modo.

quién decide qué · los tres stages de esta skill

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

StageEl agente haceLa persona firmaAutonomía
Planningcrea el set ATS → ATP → ATR, deriva TCs u outlines según la modalidad, decide las superficies UI / API / DB por triage, veto y risk scoreel checkpoint de explicación de la Story: la skill explica y espera2
Executioncorre el smoke como Go/No-Go, ejecuta los outlines, explora más allá de ellos por la trifuerza, propone bugs con la severidad ya derivadael triage de cada bug y el alta de cada bug; cualquier recalibración de severidad en seguridad o auth3
Reportingllena el ATR, escribe el comentario de QA, crea y verifica los links de trazabilidadla transición del workflow (qa_sign_off / defect_reported)2

La escala, y su techo

CSA 0-5: 0 lo hace la persona · 1 aprobación por acción · 2 aprobación por plan o por lote · 3 decide dentro de límites declarados y escala fuera de ellos · 4 supervisión por monitoreo · 5 sin intervención. Ninguno de estos tres stages pasa de 3 (Regression es la excepción: puede llegar a 4 en un GO limpio), y eso es una decisión de arquitectura, no un accidente de lo que se alcanzó a construir. Ninguno de los tres lleva verificador separado: el PO/Dev y el propio checkpoint humano cumplen ese papel.

Fuente: agentic-qa-core/references/stage-gates.md. El DoD dice qué tiene que ser verdad para avanzar; el contrato dice quién tuvo permiso de hacerlo mientras el stage corría. Los dos son gates: avanzar un stage cuyo contrato no se honró es saltarse un gate igual que tildar un DoD que nunca se verificó.

Para llevarte · handoffs y artefactos

Planning · Execution · Reporting listos: el pipeline continúa

Documentation

/test-documentation: ROI + veredictos Candidate / Manual / Deferred; crea o promueve los Tests de regresión.

Automation

/test-automation: Plan → Code → Review sobre KATA + Playwright (chequea kata-manifest.json antes de proponer ATCs).

Regression

/regression-testing: suites en CI + veredicto GO / CAUTION / NO-GO.

Artefactos que deja un run

ATS + ATP + ATR en Jira, ya cerrados · STP vivo (solo sprint-wide) · QA comment · ticket transicionado · bugs clasificados y linkeados · carpeta PBI con context.md y evidence/ · test-session-memory.md en .session/sprint-testing/<scope>/ · sesión archivada.

Tres reglas de oro

1 El orden es ley: smoke antes de trifuerza, comment antes de transición. 2 Triage de todo: el veto gana, un FAIL no es auto-Critical. 3 Trazable o no ocurrió: la cascade TC→ATS→Story (el link ATS↔Story es el coverage; ATP/ATR son administrativos).

Pruébalo: /sprint-testing single-issue UPEX-277 · ← → navegar · S presentador · O overview

Cierre: apuntar a las etapas downstream e invitar a correr un ticket real. Todo el contenido proviene del SKILL.md de sprint-testing y sus references; ante duda manda el SKILL.md.
← → navegar · O resumen · S presentador · N notas · F pantalla