AGENTIC QA · WORKFLOW SKILL · STAGE 0
QA pre-sprint sobre un lote de Stories del backlog: refina los Acceptance Criteria, saca a la luz gaps y ambigüedades, y entrega un ATP DRAFT — los defectos se previenen en los requisitos, no se detectan tras implementar.
el mapa completo — índice mental del deck
GATE espera aprobación humana · caja punteada fallback / camino adyacente · → handoff a otra skill
antes de la Phase 0 — readiness gate
Lo que el usuario ya dijo (los IDs de Story, la modalidad, "groom the backlog") cuenta como respuesta dada. Solo se preguntan los gaps reales — todos juntos, en UN checklist.
Cada capacidad se verifica con un probe real. Un RED bloqueante detiene la sesión: la skill nombra la env var exacta, apunta a .env y pide reiniciar la sesión del agente.
| Capacidad | Necesidad | Probe / por qué |
|---|---|---|
| /acli — issue tracker | REQUIRED | bun run jira:check — todo el output del refinamiento aterriza en Jira |
| Modalidad TMS resuelta | REQUIRED | A: Xray · B: Jira-native — decide dónde vive el ATP DRAFT |
/xray-cli + creds XRAY_* | OPTIONAL | Solo si el usuario opta por un Test Plan por Story (default: NO) |
| Contexto de negocio | REQUIRED | .context/business/* + master-test-plan.md — sin ellos, preguntas vagas al PO |
| Lista de candidatos | REQUIRED | IDs explícitos o JQL de backlog — tamaño confirmado con el usuario |
Shift-left nunca ejecuta contra un sistema vivo: env de la app, credenciales de test-user, DBHub, OpenAPI, Playwright y resend son N/A aquí. La viabilidad se establece LEYENDO código, APIs y schema — jamás corriendo la app.
phase 0 — session resume check + init
progress.md del batch? → ofrecer resume / restart / abort. Restart archiva lo anterior como -aborted.plan.md §Inputs./acli siempre (escrituras + búsqueda trivial). Lecturas de detalle → bun run jira:sync-issues, nunca acli view..context/ verificados; si falta uno → STOP → /project-discovery.plan.md (Goal · Inputs · fases · riesgos) + primer entry en progress.md..session/shift-left-testing/2026-07-06-payments/ ├─ plan.md # canónico: modalidad + candidatos + fases ├─ progress.md # append-only, 1 entry por fase → resume ├─ candidates.md # output de Phase 1 └─ batch-report.md # output de Phase 3 # el entregable por Story vive en su carpeta PBI: .context/PBI/epics/EPIC-<KEY>-<slug>/stories/ STORY-<KEY>-<slug>/shift-left-refinement.md # al cerrar: mv → .session/.archive/<fecha>-...-<batch-id>/
phase 1 — selection · el embudo de triage
$ bun run jira:sync-issues get UPEX-100 --include-comments # 1 Story: ACs + custom fields + comments $ bun run jira:sync-issues jql "project = UPEX AND issueType = Story AND status in (Backlog, ...)" # NUNCA `acli view` para custom fields — devuelve null. `acli search` solo para la lista trivial.
Solo Stories. Bug / Spike / Sub-task / Tech-debt → rechazo CON motivo de una línea, nunca en silencio.
¿Ya shift-left-reviewed <30 días? Se muestra aparte — el usuario decide skip o refresh.
Money / auth / data-integrity / integración / state machine → FORZAR FULL. CSS puro / copy / docs → SKIP.
Solo sin veto. Feature nueva +3 · datos dinámicos +3 · AC-light +2 · esfuerzo +2 · >5 comentarios +1…
Lectura de business-data-map / business-api-map / master-test-plan — sin queries, sin API calls. Si el modelo de datos no soporta los ACs → flag DATA-FEASIBILITY-RISK (suave: no bloquea, se vuelve pregunta crítica al PO).
phase 1 — el veto vence al score · gate de candidatos
| Score | Nivel | Profundidad de refinamiento |
|---|---|---|
| 0-3 | LOW | SKIP — PO/Dev escriben los ACs sin QA |
| 4-7 | MEDIUM | Refinamiento estándar (Fases 1-3 + outlines) |
| 8+ | HIGH | Extendido — más caza de ambigüedades y edge cases; set de preguntas ampliado |
El usuario puede rescatar una LOW si huele complejidad oculta. Y el VETO cortocircuita: una Story de refunds es refinamiento obligatorio aunque puntúe 2; un retoque de CSS es skip aunque toque cinco archivos.
Phase 1 termina con una tabla ranqueada: Accepted (riesgo · score · veto override · data-feasibility), Rejected (no-Story, con motivo), Skipped (LOW), Already Reviewed (skip/refresh?), orden recomendado y preguntas abiertas.
No se refina nada hasta que el humano confirme el set. Puede vetar Stories, rescatar LOWs o cambiar el orden. La lista aceptada se persiste en plan.md §Inputs y se registra el checkpoint en progress.md.
phase 2 — refinement · un subagente por story, secuencial
Reuso deliberado: ~70% de la lógica vive en sprint-testing/references/acceptance-test-planning.md §Fases 1-3 — el subagente la cita y aplica el delta shift-left. Secuencial por diseño: presentas cada resumen al usuario antes de despachar la siguiente Story.
/sprint-testing)/test-documentation)evidence/ — no existe nada que capturarphase 2 — story quality analysis + doctrina de diseño
Toolkit: refinement-questions.md — catálogo por arquetipo (auth, money, search, state machine, integración, RBAC).
NEEDS PO/DEV CONFIRMATION — textual, hasta Jiraphase 2 — el entregable + gate por story
├─ Phase 1 · Critical Analysis ├─ Phase 2 · Story Quality Analysis ← el corazón ├─ Phase 3 · Refined ACs │ Given user with active OTP <5 min │ When submits code "000000" (wrong) │ Then UI "Invalid code" · API 401 · DB no session │ NEEDS PO/DEV CONFIRMATION ← si fue inferido ├─ Phase 4 · Test Outlines (DRAFT) ← nombres + coverage ├─ Phase 5 · Edge Cases (DRAFT) ← nombres + criticidad ├─ Story Quality Assessment · Critical Questions for PO ├─ Technical Questions for Dev · Suggested Improvements └─ Data feasibility flags · Recommended testing strategy
story.md, acceptance-criteria.md) SOLO los genera el sync.context.md mínimo. Sin evidence/.Should <behavior> <condition>, agrupados por tipo con tabla de coverage (Positive / Negative / Boundary / Integration).Phase 2.<n> en progress.md y recién entonces despacha la siguiente Story.phase 3 — handoff · 6 mutaciones jira por story (vía /acli)
Refined ACs al campo acceptance_criteria. Fallback si no existe: comentario "## Acceptance Criteria". Verifica con re-sync.
Append de "QA Refinements (Shift-Left Analysis)": edge cases + reglas aclaradas + preguntas. Leer primero — NUNCA sobrescribir.
Default: campo acceptance_test_plan con el body completo. Modalidad A + opt-in: Test Plan "ATP: … (Shift-Left DRAFT)" bajo el epic QA Master Test Plan + link a la Story.
UN comentario de handoff: puntero al campo (@PO / @Dev-lead solo si están en project.yaml). Body completo inline SOLO si el campo no existe.
shift-left-reviewed + shift-left-{YYYY-MM-DD}. qa_assignee = self, read-before-write, vía REST PUT (acli no escribe customfields).
analyze → estimate y STOP en Estimation. Verifica el espejo campo ↔ comentario byte a byte — fix-traceability lo audita después.
El body se autoría en Markdown local y /acli lo convierte en su ruta md-to-ADF. ADF artesanal rompe el espejo byte a byte.
phase 3 — guardrails de transición + resume
| Status actual | Acción |
|---|---|
| Backlog | analyze → Shift-Left QA, luego estimate → Estimation |
| Shift-Left QA | solo estimate |
| Estimation | nada — ya está en el objetivo |
| Más allá (Ready For Dev…) | SKIP + warning — el refinamiento aterriza igual, el workflow no se toca |
QA jamás avanza estimate → ready_for_dev ni compromete la Story a un sprint. Y NUNCA se transiciona a Estimation sin ATP DRAFT populado — el DRAFT es lo que hace estimable a la Story (anti-patrón L5).
phase 3 — cierre de sesión · batch report + archive
DATA-FEASIBILITY con pre-work requerido.session/shift-left-testing/<batch-id>/batch-report.mdprogress.md → Archive: la carpeta de sesión se mueve a .session/.archive/mem_session_summary con el resumen + ruta del archivecómo invocar · qué sigue en el pipeline
> /shift-left-testing UPEX-100,101,102 # o en lenguaje natural: > groom the backlog > shift-left these stories > pre-sprint QA on these 5 stories
| Después necesitas… | Skill |
|---|---|
| La Story llega a Ready For QA | /sprint-testing — lee shift-left-reviewed (<30 días) y cortocircuita sus fases de planning |
| TCs formales + ROI, cuando la Story shippea | /test-documentation — Stage 4 |
| Código de test automatizado | /test-automation — Stage 5 · luego /regression-testing — Stage 6 |
| Falta contexto de negocio | /project-discovery + /business-*-map + /master-test-plan |
| Revisión adversarial del refinamiento (opcional) | /judgment-day — nunca auto-invocado |
← → navegar · O overview · S presentador · N notas · F pantalla completa