@keber/qa-framework 1.11.3 → 1.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/CHANGELOG.md +340 -0
  2. package/README.md +42 -2
  3. package/docs/architecture.md +30 -26
  4. package/docs/decisions/lane-heartbeat-caller.md +86 -0
  5. package/docs/final-report.md +23 -23
  6. package/docs/folder-structure-guide.md +100 -80
  7. package/docs/installation.md +42 -7
  8. package/docs/skills-architecture.md +23 -23
  9. package/docs/spec-driven-philosophy.md +9 -9
  10. package/docs/usage-with-agent.md +88 -9
  11. package/docs/visuals/diag-01-ejecutivo-1.png +0 -0
  12. package/docs/visuals/diag-02-tactico-1.png +0 -0
  13. package/docs/visuals/diag-03-tecnico-1.png +0 -0
  14. package/docs/visuals/info-01-ejecutivo-1.png +0 -0
  15. package/docs/visuals/info-02-tactico-1.png +0 -0
  16. package/docs/visuals/info-03-tecnico-1.png +0 -0
  17. package/docs/visuals/pres-01-ejecutivo-1.png +0 -0
  18. package/docs/visuals/pres-02-tactico-1.png +0 -0
  19. package/docs/visuals/pres-03-tecnico-1.png +0 -0
  20. package/docs/visuals/qa-01-problema-1.png +0 -0
  21. package/docs/visuals/qa-02-que-es-1.png +0 -0
  22. package/docs/visuals/qa-03-pipeline-1.png +0 -0
  23. package/docs/visuals/qa-04-6-archivos-1.png +0 -0
  24. package/docs/visuals/qa-05-humano-1.png +0 -0
  25. package/docs/visuals/qa-06-agente-1.png +0 -0
  26. package/docs/visuals/qa-07-skills-arch-1.png +0 -0
  27. package/docs/visuals/qa-08-traceability-1.png +0 -0
  28. package/docs/visuals/qa-en-01-problem-1.png +0 -0
  29. package/docs/visuals/qa-en-02-what-is-1.png +0 -0
  30. package/docs/visuals/qa-en-03-pipeline-1.png +0 -0
  31. package/docs/visuals/qa-en-04-6files-1.png +0 -0
  32. package/docs/visuals/qa-en-05-human-1.png +0 -0
  33. package/docs/visuals/qa-en-06-agent-1.png +0 -0
  34. package/docs/visuals/qa-en-07-skills-arch-1.png +0 -0
  35. package/docs/visuals/qa-en-08-traceability-1.png +0 -0
  36. package/examples/module-example/suppliers/00-inventory.md +1 -1
  37. package/examples/module-example/suppliers/suppliers-create.spec.ts +8 -8
  38. package/integrations/ado-powershell/README.md +1 -1
  39. package/integrations/ado-powershell/scripts/sync-ado-titles.ps1 +2 -2
  40. package/integrations/playwright/README.md +4 -4
  41. package/package.json +7 -3
  42. package/qa-framework.config.json +25 -3
  43. package/scripts/check-forbidden-chars.js +187 -0
  44. package/scripts/check-spanish-accents.js +159 -0
  45. package/scripts/cli.js +1 -1
  46. package/scripts/generate.js +2 -2
  47. package/scripts/init.js +101 -12
  48. package/scripts/lib/claude-agents.js +347 -0
  49. package/scripts/lib/claude-commands.js +56 -0
  50. package/scripts/lib/module-keys.js +54 -0
  51. package/scripts/sync-version.js +63 -0
  52. package/scripts/upgrade.js +369 -20
  53. package/scripts/validate.js +46 -21
  54. package/skills/qa-ado-integration/SKILL.md +19 -19
  55. package/skills/qa-ado-integration/references/scripts-and-config.md +6 -6
  56. package/skills/qa-automation/SKILL.md +49 -27
  57. package/skills/qa-automation/references/config-checklist.md +4 -4
  58. package/skills/qa-automation/references/dom-inspection-template.js +7 -7
  59. package/skills/qa-automation/references/patterns.md +20 -20
  60. package/skills/qa-automation/references/pom-template.md +161 -0
  61. package/skills/qa-maintenance/SKILL.md +11 -11
  62. package/skills/qa-maintenance/references/update-rules.md +8 -8
  63. package/skills/qa-module-analysis/SKILL.md +20 -19
  64. package/skills/qa-module-analysis/references/exploration-checklist.md +4 -4
  65. package/skills/qa-module-analysis/references/output-verification.md +69 -0
  66. package/skills/qa-module-analysis/references/spec-file-formats.md +14 -14
  67. package/skills/qa-spec-generation/SKILL.md +13 -7
  68. package/skills/qa-test-cases/SKILL.md +11 -81
  69. package/skills/qa-test-cases/references/test-case-template.md +5 -5
  70. package/skills/qa-test-plan/SKILL.md +22 -86
  71. package/skills/qa-test-plan/references/plan-de-pruebas-template.md +24 -24
  72. package/skills/qa-test-stabilization/SKILL.md +59 -30
  73. package/skills/qa-test-stabilization/references/classification-protocol.md +35 -35
  74. package/templates/agent-next-steps.md +10 -10
  75. package/templates/agents/qa-analisis.md +142 -0
  76. package/templates/agents/qa-asesoria.md +48 -0
  77. package/templates/agents/qa-informe-resultados.md +236 -0
  78. package/templates/agents/qa-investigador.md +143 -0
  79. package/templates/agents/qa-plan.md +131 -0
  80. package/templates/agents/qa-reporte-ejecucion.md +138 -0
  81. package/templates/automation-scaffold/.env.example +36 -6
  82. package/templates/automation-scaffold/fixtures/auth.ts +27 -5
  83. package/templates/automation-scaffold/fixtures/base.ts +23 -1
  84. package/templates/automation-scaffold/fixtures/test-helpers.ts +1 -1
  85. package/templates/automation-scaffold/global-setup.ts +117 -48
  86. package/templates/automation-scaffold/playwright.config.ts +72 -32
  87. package/templates/automation-scaffold/scripts/global-setup-guards.js +184 -0
  88. package/templates/automation-scaffold/scripts/lane-config.js +269 -0
  89. package/templates/automation-scaffold/scripts/lane-lock.js +589 -0
  90. package/templates/defect-report.md +17 -3
  91. package/templates/execution-report.md +9 -9
  92. package/templates/integration-scaffold/.env.example +1 -1
  93. package/templates/integration-scaffold/global-setup.ts +21 -1
  94. package/templates/integration-scaffold/playwright.config.ts +15 -1
  95. package/templates/qa-framework.instructions.md +9 -8
  96. package/templates/qa-framework.rules.md +53 -0
  97. package/templates/qa-readme.md +8 -8
  98. package/templates/session-summary.md +2 -2
  99. package/templates/specification/00-inventory.md +3 -3
  100. package/templates/specification/01-business-rules.md +6 -6
  101. package/templates/specification/02-workflows.md +1 -1
  102. package/templates/specification/03-roles-permissions.md +1 -1
  103. package/templates/specification/04-test-data.md +8 -8
  104. package/templates/specification/05-test-scenarios.md +5 -5
  105. package/templates/test-case.md +3 -3
  106. package/templates/test-data-guidelines.md +7 -7
  107. package/templates/test-plan-sprint.md +13 -13
  108. package/templates/test-plan.md +3 -3
  109. package/skills/qa-test-plan/references/priority-and-feasibility.md +0 -159
@@ -8,15 +8,15 @@
8
8
 
9
9
  | Category | Definition | Correct action |
10
10
  |----------|-----------|----------------|
11
- | **A — Wrong selector** | Locator no longer matches the UI element | Fix selector; prefer `getByRole`, `getByLabel`, `getByTestId` |
12
- | **B — Wrong assertion** | Assertion doesn't match TC acceptance criterion | Rewrite assertion to match spec |
13
- | **C — Wrong flow** | Test steps don't reflect the user flow in the TC | Rewrite steps to match TC |
14
- | **D — Fragile timing** | Intermittent failure due to missing `await`, race condition, or missing `waitFor` | Add proper async handling; never use `waitForTimeout` |
15
- | **E — Incorrect data** | Data malformed, not unique, or conflicts with QA environment state | Fix data generation or `beforeAll` provisioning |
16
- | **F — App Bug** | Test is correct; application doesn't behave as specified | Do NOT fix test; file defect; skip with DEF reference |
17
- | **G — TC Mismatch** | TC acceptance criterion is ambiguous or wrong vs actual behavior | Do NOT fix test or app; update `05-test-scenarios.md` |
18
- | **H — Infra/Environment** | Failure due to env unavailability, network, or credentials | Retry in clean environment before classifying further |
19
- | **I — Intentional skip** | Test skipped for known defect or pending feature | Verify skip reason still valid; update defect reference if needed |
11
+ | **A - Wrong selector** | Locator no longer matches the UI element | Fix selector; prefer `getByRole`, `getByLabel`, `getByTestId` |
12
+ | **B - Wrong assertion** | Assertion doesn't match TC acceptance criterion | Rewrite assertion to match spec |
13
+ | **C - Wrong flow** | Test steps don't reflect the user flow in the TC | Rewrite steps to match TC |
14
+ | **D - Fragile timing** | Intermittent failure due to missing `await`, race condition, or missing `waitFor` | Add proper async handling; never use `waitForTimeout` |
15
+ | **E - Incorrect data** | Data malformed, not unique, or conflicts with QA environment state | Fix data generation or `beforeAll` provisioning |
16
+ | **F - App Bug** | Test is correct; application doesn't behave as specified | Do NOT fix test; file defect; skip with DEF reference |
17
+ | **G - TC Mismatch** | TC acceptance criterion is ambiguous or wrong vs actual behavior | Do NOT fix test or app; update `05-test-scenarios.md` |
18
+ | **H - Infra/Environment** | Failure due to env unavailability, network, or credentials | Retry in clean environment before classifying further |
19
+ | **I - Intentional skip** | Test skipped for known defect or pending feature | Verify skip reason still valid; update defect reference if needed |
20
20
 
21
21
  ---
22
22
 
@@ -24,19 +24,19 @@
24
24
 
25
25
  ```
26
26
  Are test steps and assertion derived correctly from 05-test-scenarios.md?
27
- No → Category G (fix the spec, not the test)
28
- Yes ↓
27
+ No -> Category G (fix the spec, not the test)
28
+ Yes v
29
29
  Does the application behave as the TC acceptance criterion describes?
30
- No → Category F (file defect; skip test with DEF reference)
31
- Yes ↓
30
+ No -> Category F (file defect; skip test with DEF reference)
31
+ Yes v
32
32
  Is the failure deterministic (every run)?
33
- No → Category D or H (timing or environment issue)
34
- Yes ↓
33
+ No -> Category D or H (timing or environment issue)
34
+ Yes v
35
35
  Is the failure caused by selector, assertion, flow, or data issue?
36
- → Category A, B, C, or E (fix the test code)
36
+ -> Category A, B, C, or E (fix the test code)
37
37
  ```
38
38
 
39
- **Fix order**: E → A → C → B → D (data masks selectors; flow masks assertions)
39
+ **Fix order**: E -> A -> C -> B -> D (data masks selectors; flow masks assertions)
40
40
 
41
41
  ---
42
42
 
@@ -45,15 +45,15 @@ Is the failure caused by selector, assertion, flow, or data issue?
45
45
  For each **passing** test, perform a negation check:
46
46
 
47
47
  1. Temporarily change the assertion to assert the opposite
48
- 2. Run the test — if it still passes, the original assertion is not evaluating the element
48
+ 2. Run the test - if it still passes, the original assertion is not evaluating the element
49
49
  3. Restore the original assertion
50
50
 
51
51
  ```typescript
52
52
  // Original
53
53
  await expect(page.locator('.toast')).toHaveText('Guardado exitosamente');
54
- // Negation check (temporary — revert after)
54
+ // Negation check (temporary - revert after)
55
55
  await expect(page.locator('.toast')).toHaveText('TEXTO_QUE_NO_EXISTE');
56
- // If this passes → false positive detected
56
+ // If this passes -> false positive detected
57
57
  ```
58
58
 
59
59
  ---
@@ -66,7 +66,7 @@ Verify persistence with a follow-up API call or page reload:
66
66
  ```typescript
67
67
  // After clicking Guardar:
68
68
  await expect(page.locator('.toast')).toHaveText('Guardado exitosamente');
69
- // Verify via API — a passing toast is a false positive if the save failed silently
69
+ // Verify via API - a passing toast is a false positive if the save failed silently
70
70
  const resp = await page.request.get(`${API_BASE}/api/{Entity}/{id}`);
71
71
  const data = await resp.json();
72
72
  expect(data.fieldChanged).toBe(expectedValue);
@@ -82,7 +82,7 @@ verifying the change was persisted.
82
82
  | Level | Criteria |
83
83
  |-------|---------|
84
84
  | ✅ High (≥90%) | Passed negation check AND matches TC acceptance criterion exactly |
85
- | ⚠️ Medium (70–89%) | Consistently passing; trace reviewed; negation check pending |
85
+ | ⚠️ Medium (70-89%) | Consistently passing; trace reviewed; negation check pending |
86
86
  | ❌ Low (<70%) | Intermittent, unclassified, or negation check not done |
87
87
 
88
88
  **Exit criterion**: All tests ✅ High or legitimately skipped with defect reference.
@@ -94,7 +94,7 @@ verifying the change was persisted.
94
94
  Create at: `qa/07-automation/e2e/tests/{module}/{STABILIZATION-REPORT-YYYY-MM-DD.md}`
95
95
 
96
96
  ```markdown
97
- # Stabilization Report — {MODULE} > {SUBMODULE}
97
+ # Stabilization Report - {MODULE} > {SUBMODULE}
98
98
 
99
99
  **Date**: YYYY-MM-DD
100
100
  **Sprint**: {sprint label}
@@ -106,8 +106,8 @@ Create at: `qa/07-automation/e2e/tests/{module}/{STABILIZATION-REPORT-YYYY-MM-DD
106
106
  |--------|-------|
107
107
  | Tests evaluated | N |
108
108
  | Stabilized (✅ High confidence) | N |
109
- | Skipped — App Bug (Category F) | N |
110
- | Skipped — Intentional (Category I) | N |
109
+ | Skipped - App Bug (Category F) | N |
110
+ | Skipped - Intentional (Category I) | N |
111
111
  | Remaining low-confidence | N |
112
112
  | Overall confidence | NN% |
113
113
 
@@ -115,7 +115,7 @@ Create at: `qa/07-automation/e2e/tests/{module}/{STABILIZATION-REPORT-YYYY-MM-DD
115
115
 
116
116
  | TC-ID | Test title | Baseline | Final | Category | Changes made | Confidence |
117
117
  |-------|-----------|----------|-------|----------|-------------|-----------|
118
- | TC-... | ... | ❌ fail | ✅ pass | A | Selector `#old` → `getByRole('button', { name: '...' })` | ✅ High |
118
+ | TC-... | ... | ❌ fail | ✅ pass | A | Selector `#old` -> `getByRole('button', { name: '...' })` | ✅ High |
119
119
 
120
120
  ## App Bugs Filed (Category F)
121
121
 
@@ -127,13 +127,13 @@ Create at: `qa/07-automation/e2e/tests/{module}/{STABILIZATION-REPORT-YYYY-MM-DD
127
127
  | TC-ID | Issue | Recommended 05-test-scenarios.md update |
128
128
  |-------|-------|----------------------------------------|
129
129
 
130
- ## Coverage Gaps (note only — do not fix in this stage)
130
+ ## Coverage Gaps (note only - do not fix in this stage)
131
131
 
132
132
  - TC-XXX: mapped in COVERAGE-MAPPING.md but spec function not found
133
133
 
134
134
  ## Decisions Log
135
135
 
136
- - YYYY-MM-DD: Classified TC-XXX as Category F — save endpoint returns 500 on duplicate. DEF-001 filed.
136
+ - YYYY-MM-DD: Classified TC-XXX as Category F - save endpoint returns 500 on duplicate. DEF-001 filed.
137
137
  ```
138
138
 
139
139
  ---
@@ -152,10 +152,10 @@ const uniqueName = `Test-${EXEC_IDX}-${RUN_SALT}`;
152
152
 
153
153
  ## Post-Stabilization Artifact Updates
154
154
 
155
- 1. **Category G found** → update `05-test-scenarios.md` with `[REVISED - {date}]`
156
- 2. **Category F found** → create `qa/06-defects/open/DEF-{NNN}.md` per bug
157
- 3. **COVERAGE-MAPPING.md** → update Status column for all TCs:
158
- - `Automated` — ✅ High confidence
159
- - `Skipped-Defect` — skipped with DEF reference
160
- - `Skipped-Infra` — environment limitation
161
- - `Manual` — intentionally not automated
155
+ 1. **Category G found** -> update `05-test-scenarios.md` with `[REVISED - {date}]`
156
+ 2. **Category F found** -> create `qa/06-defects/open/DEF-{NNN}.md` per bug
157
+ 3. **COVERAGE-MAPPING.md** -> update Status column for all TCs:
158
+ - `Automated` - ✅ High confidence
159
+ - `Skipped-Defect` - skipped with DEF reference
160
+ - `Skipped-Infra` - environment limitation
161
+ - `Manual` - intentionally not automated
@@ -1,6 +1,6 @@
1
- # AGENT-NEXT-STEPS — {PROJECT_NAME}
1
+ # AGENT-NEXT-STEPS - {PROJECT_NAME}
2
2
 
3
- > **Sprint activo: Sprint {N} — {SPRINT_NAME}**
3
+ > **Sprint activo: Sprint {N} - {SPRINT_NAME}**
4
4
  > Lee este archivo primero. Lee los archivos referenciados solo cuando la tarea lo requiera.
5
5
 
6
6
  ---
@@ -11,11 +11,11 @@
11
11
  |---|---|---|---|---|
12
12
  | {MODULE_NAME} / {SUBMODULE_NAME} | ✅ | ✅ | ⬜ | Sprint {N} activo |
13
13
 
14
- > Actualizar esta tabla cuando un sprint se complete. Historial de sprints completados → `qa/README.md ## Sprint History`.
14
+ > Actualizar esta tabla cuando un sprint se complete. Historial de sprints completados -> `qa/README.md ## Sprint History`.
15
15
 
16
16
  ---
17
17
 
18
- ## Sprint {N} — Tareas pendientes
18
+ ## Sprint {N} - Tareas pendientes
19
19
 
20
20
  - [ ] {Tarea 1}
21
21
  - [ ] {Tarea 2}
@@ -25,28 +25,28 @@
25
25
 
26
26
  **Precondiciones**: {Dependencias de datos o módulos previos, si aplica}
27
27
 
28
- **Notas específicas**: {Quirks del DOM, rutas, selectores problemáticos conocidos — o eliminar esta línea}
29
- → Si las notas son extensas, guardarlas en `qa/memory/{sprint-name}-discovery.md` y referenciar aquí.
28
+ **Notas específicas**: {Quirks del DOM, rutas, selectores problemáticos conocidos - o eliminar esta línea}
29
+ -> Si las notas son extensas, guardarlas en `qa/memory/{sprint-name}-discovery.md` y referenciar aquí.
30
30
 
31
31
  ---
32
32
 
33
33
  ## Contexto obligatorio antes de codificar
34
34
 
35
- - Patrones del proyecto: `qa/memory/INDEX.md` → cargar solo los archivos relevantes
35
+ - Patrones del proyecto: `qa/memory/INDEX.md` -> cargar solo los archivos relevantes
36
36
  - Referencia de estilo: `qa/07-automation/e2e/tests/{module}/` (leer suite existente más reciente)
37
37
 
38
38
  ---
39
39
 
40
- ## Sprints siguientes (solo referencia — sin checklists)
40
+ ## Sprints siguientes (solo referencia - sin checklists)
41
41
 
42
- - **Sprint {N+1}**: {Descripción breve — qué módulo/submódulo}
42
+ - **Sprint {N+1}**: {Descripción breve - qué módulo/submódulo}
43
43
  - **Sprint {N+2}**: {Descripción breve}
44
44
 
45
45
  ---
46
46
 
47
47
  <!-- ═══════════════════════════════════════════════════════════════════
48
48
  REGLAS DE MANTENIMIENTO DE ESTE ARCHIVO (para el agente)
49
- ——————————————————————————————————————————————————————————————————
49
+ ------------------------------------------------------------------
50
50
  1. MÁXIMO UN SPRINT ACTIVO. Cuando un sprint se completa:
51
51
  a. Mover su checklist al README.md bajo ## Sprint History
52
52
  b. Borrar esa sección de este archivo
@@ -0,0 +1,142 @@
1
+ ---
2
+ name: qa-analisis
3
+ description: Genera el Análisis de Pruebas de un sprint (objetivo, alcance, priorización P0-P3, riesgos, faltantes críticos, estrategia y matriz de trazabilidad) a partir de minutas, items de Azure DevOps o casos de prueba previos. Úsalo cuando el usuario pida "modo ANÁLISIS", "@analisis", o un análisis de pruebas para un sprint.
4
+ tools: Read, Write, Grep, Glob, Bash
5
+ model: sonnet
6
+ ---
7
+
8
+ # Rol
9
+
10
+ Actúas como Asistente experto en Aseguramiento de la Calidad (QA) con foco práctico en planes de prueba **manuales** ejecutables en el timebox del sprint, en contextos de madurez inicial. Este agente cubre exclusivamente el modo **ANÁLISIS**.
11
+
12
+ # Audiencia y Estilo
13
+
14
+ - Público: equipo QA/dev de {{PROJECT_DISPLAY_NAME}} ({{LOCALE_LANGUAGE_LABEL}}).
15
+ - Tono: claro, directo y accionable (sin jerga innecesaria).
16
+ - Zona horaria: {{TIMEZONE}}.
17
+ - Fechas siempre en formato **{{DATE_FORMAT}}**.
18
+
19
+ # Contexto Operativo
20
+
21
+ - Sprints de {{SPRINT_DURATION_DAYS}} días con **{{MANUAL_TESTING_TIMEBOX_DAYS}} días** para ejecutar pruebas manuales.
22
+ - Procesos inmaduros: minutas/historias/criterios incompletos, evidencia parcial, ruido en transcripciones.
23
+ - Objetivo principal: **confirmar resolución** de issues/bugs/tasks del sprint y cubrir flujos críticos del área afectada.
24
+ - E2E/UI automatizadas: no prioridad, pero puedes sugerirlas brevemente si aportan.
25
+ - Riesgos locales a considerar: separador decimal (coma vs punto), cálculos monetarios, integraciones, permisos, datos maestros, impactos legales/tributarios (ajusta esta lista a los riesgos reales del dominio del proyecto).
26
+
27
+ # Entradas posibles
28
+
29
+ - Minutas o resúmenes de planificación (`<Proyecto>`, `<Sprint>`).
30
+ - Items de Azure DevOps (Issue/Bug/Task) en texto/Excel/PPT/imágenes/transcripciones.
31
+ - Imágenes de UI, descripciones de componentes e interfaces.
32
+ - Casos de prueba anteriores (XLS ADO).
33
+ - **IDs sueltos de historias de usuario/tareas/bugs** (p. ej. "analiza los items 17166, 17168, 17179") - en este caso, descarga su contenido desde Azure DevOps antes de continuar (ver sección siguiente).
34
+
35
+ # Obtención de work items desde Azure DevOps (por ID)
36
+
37
+ Cuando el usuario entregue una lista de IDs (User Story, Task, Bug, Issue) en vez de pegar el contenido, **descarga los work items via API REST antes de iniciar el pipeline**. Sigue las convenciones ya establecidas en la skill `ado-powershell`/`.github/skills/qa-ado-integration/` de este proyecto (autenticación, headers, base URL) - no inventes un patrón nuevo.
38
+
39
+ 1. **Resolución de credenciales** (en este orden, nunca hardcodees un PAT en un comando):
40
+ - `$env:ADO_PAT` / `$env:ADO_ORG` / `$env:ADO_PROJECT` si ya están en el entorno.
41
+ - Si no están, pide al usuario que los exporte antes de continuar. **Nunca imprimas el valor del PAT en tu respuesta ni lo escribas a un archivo.**
42
+ - Si falta cualquiera de los tres, no inventes valores: repórtalo en **Faltantes críticos** y detente para ese paso.
43
+
44
+ 2. **Descarga por lote** (más eficiente que 1 request por ID; la API acepta hasta 200 IDs por llamada).
45
+
46
+ El `Bash` de este harness puede ser **Git Bash (POSIX sh)**, no PowerShell. Si le pasas el script como un `-Command "..."` con comillas dobles, Bash puede intentar expandir `$env:...`, `$B64`, `$url`, etc. **como variables de Bash antes de que lleguen a PowerShell**, rompiendo el script. Para evitar ese choque de escapado entre los dos shells:
47
+
48
+ 1. Escribe el script a un archivo temporal con la herramienta `Write` (no con `Bash`/heredoc), p. ej. `<scratchpad>/get-workitems.ps1`, con este contenido:
49
+
50
+ ```powershell
51
+ $B64 = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(':' + $env:ADO_PAT))
52
+ $Headers = @{ Authorization = 'Basic ' + $B64 }
53
+ $ids = '17166,17168,17179'
54
+ $url = 'https://dev.azure.com/' + $env:ADO_ORG + '/' + $env:ADO_PROJECT + '/_apis/wit/workitems?ids=' + $ids + '&$expand=relations&api-version=7.1'
55
+ Invoke-RestMethod -Method GET -Uri $url -Headers $Headers | ConvertTo-Json -Depth 12
56
+ ```
57
+
58
+ 2. Ejecútalo con `Bash` usando `powershell.exe -NoProfile -File <ruta-del-script>` (Windows PowerShell 5.1 - no dependas de `pwsh`/PowerShell 7, que puede no estar instalado). El comando de `Bash` queda simple y sin `$` que Bash pueda intentar expandir.
59
+
60
+ Notas sobre el script:
61
+ - Todos los valores dinámicos (PAT, org, project, ids, URL) se arman con **concatenación (`+`)** en vez de interpolación de string (`"$env:ADO_ORG"`), porque `$env:VAR` pegado a otros caracteres dentro de un string interpolado es ambiguo de leer y propenso a errores de parsing. Con concatenación no hace falta.
62
+ - `$url` se construye con comillas **simples** (`'...'`) en PowerShell, así `$expand` (que no es una variable, es literal de la query string) nunca se interpreta como interpolación - sin necesidad de escape con backtick. Esto es válido en Windows PowerShell 5.1 (no requiere sintaxis de PS7+).
63
+ - Si algún ID no existe o no pertenece al proyecto, la API devuelve error o lo omite del batch: detecta los IDs faltantes en la respuesta y agrégalos a **Faltantes críticos** (no asumas su contenido).
64
+ - Verifica que cada item de la respuesta tenga la propiedad `.fields`; si en cambio recibes HTML de login, el PAT es inválido/expiró - repórtalo, no sigas con datos vacíos.
65
+ - El script solo referencia `$env:ADO_PAT` (nunca el valor literal del PAT), así que no persiste el secreto. Aún así, escríbelo en la carpeta scratchpad de la sesión (no en una ruta versionada del repo) y bórralo al terminar.
66
+
67
+ 3. **Mapeo de campos** desde `fields` de cada work item hacia el pipeline (paso 1 "Ingesta & Normalización"):
68
+ - `System.Id` / `System.WorkItemType` -> **ID** y tipo (Bug/Issue/Task/User Story) para la columna **Confirma**.
69
+ - `System.Title` -> título del item.
70
+ - `System.AreaPath` -> área/módulo impactado.
71
+ - `System.Description` (Task/User Story) o `Microsoft.VSTS.TCM.ReproSteps` (Bug) -> contenido para extraer criterios de aceptación / pasos de reproducción. Convierte el HTML a texto plano antes de analizarlo (quita tags, decodifica entidades).
72
+ - `Microsoft.VSTS.Common.AcceptanceCriteria` (si existe) -> criterios de aceptación explícitos.
73
+ - `System.State` -> para detectar si el item todavía no está en un estado "Resuelto/Cerrado/Done" (repórtalo en **Faltantes críticos** en vez de asumir que ya está listo para confirmar).
74
+ - Si un campo relevante viene vacío, **no lo inventes**: márcalo `TODO:` y agrégalo a **Faltantes críticos**.
75
+
76
+ 4. Continúa el pipeline normal (Ingesta & Normalización -> Deduplicación & Alcance -> Riesgo & Priorización -> ...) usando los datos ya descargados, exactamente igual que si el usuario los hubiera pegado en el chat.
77
+
78
+ # Política anti-alucinación y uso de insumos incompletos
79
+
80
+ - **Nunca inventes datos de negocio**.
81
+ - Cuando falten detalles críticos, crea el bloque **Faltantes críticos** con preguntas puntuales y sigue con un análisis mínimo viable, marcando **TODO:** donde falte.
82
+ - Cuando debas asumir algo, marca **Supuesto:** (fácil de remover).
83
+ - Si hay información contradictoria, prioriza lo más reciente y explícitalo.
84
+ - En la columna/item **Confirma**, si no hay ID, usa **"-"** y agrega el punto a **Faltantes críticos**.
85
+
86
+ # Pipeline (proceso)
87
+
88
+ 0) **Resumen estructurado** (si las entradas son ruidosas): objetivo, áreas/módulos impactados, lista preliminar de items.
89
+ 1) **Ingesta & Normalización**: Proyecto, Sprint, áreas afectadas, lista de items (ID + título).
90
+ 2) **Deduplicación & Alcance**: elimina duplicados, agrupa por área; extrae criterios de aceptación si existen.
91
+ 3) **Universo de Tests**: a partir de los items normalizados, lista **todos** los escenarios de prueba identificables para el alcance del sprint - happy path, negativos, permisos/roles, transiciones de estado, integraciones, edge cases - **sin filtrar aún por el timebox de {{MANUAL_TESTING_TIMEBOX_DAYS}} días**. Este universo es el registro completo de cobertura posible, no lo que se va a ejecutar.
92
+ - Para cada escenario del universo, clasifica su **factibilidad de automatización** (mismo criterio que usa `qa-framework`, no inventes uno nuevo):
93
+ - **Automatizable completo**: determinístico, observable en UI/API, sin dependencia de sistemas externos.
94
+ - **Automatizable parcial**: requiere mock de un sistema externo o inspección humana de algún resultado.
95
+ - **No automatizable**: requiere acceso físico, es no-determinístico, tiene efectos irreversibles en el ambiente de QA, o está `BLOCKED-PERMISSIONS`.
96
+ 4) **Tests Priorizados (selección para el timebox de {{MANUAL_TESTING_TIMEBOX_DAYS}} días)**: del universo, selecciona el subconjunto que efectivamente entra al Plan de Pruebas ejecutable, aplicando en conjunto:
97
+ - **Riesgo/valor de negocio** via el arbol P0->P3:
98
+ - **P0**: Confirmación por cada Issue/Bug/Task del sprint; camino feliz crítico; riesgo de corrupción de datos o show-stopper.
99
+ - **P1**: Smoke crítico del flujo impactado; negativos comunes; dependencias cross-módulo.
100
+ - **P2**: Regresión mínima adyacente (alto uso/alto riesgo); features secundarias (export, paginación, búsqueda).
101
+ - **P3**: Exploratoria timeboxed (1-2 charters); edge cases de baja frecuencia.
102
+ - **Factibilidad de automatización**: a igualdad de prioridad, prefiere para el set ejecutable los escenarios automatizables completos/parciales cuando eso reduce el costo de mantenerlos vivos a futuro; no automatizables de baja prioridad son candidatos naturales a quedar fuera del timebox.
103
+ - Todo lo del universo que **no** quede seleccionado va a la lista de **Universo excluido** con el motivo (fuera de scope del sprint, baja probabilidad/impacto, requiere automatización aún no lista, `PENDING-CODE`, `BLOCKED-PERMISSIONS`, etc.) - no se descarta silenciosamente, queda documentado para trazabilidad y backlog de regresión.
104
+ - **No infles el universo por inflarlo**: el objetivo de documentarlo es trazabilidad/auditoría de cobertura, no maximizar el conteo de casos. Evita variaciones casi idénticas - mergea y usa **Confirma** para referenciar múltiples IDs.
105
+ 5) **Estrategia**: enfoque de pruebas por área/épica impactada, basado en los Tests Priorizados (no en el universo completo).
106
+ 6) **Auto-revisión**: ejecuta el checklist de calidad antes de entregar.
107
+
108
+ # Salida - Análisis de Pruebas
109
+
110
+ Genera un archivo Markdown con el contenido:
111
+
112
+ - Objetivo y Alcance
113
+ - **Universo de Tests**: conteo total de escenarios identificados, agrupados por área/funcionalidad, con breakdown de factibilidad de automatización (completo/parcial/no automatizable).
114
+ - **Tests Priorizados**: subconjunto seleccionado para el timebox de {{MANUAL_TESTING_TIMEBOX_DAYS}} días, con Priorización (P0-P3) y lista de funcionalidades cubiertas.
115
+ - **Universo excluido**: tabla de escenarios identificados pero no seleccionados, con motivo de exclusión.
116
+ - Riesgos y **Faltantes críticos** (con preguntas)
117
+ - Estrategia de pruebas (enfocada al timebox, basada en los Tests Priorizados)
118
+ - Cobertura y estimación (alto nivel) - expresada como "N priorizados de M en el universo"
119
+ - Datos de prueba mínimos
120
+ - **Matriz de Trazabilidad** (si hay IDs)
121
+
122
+ ## Regla de entrega
123
+
124
+ - Ruta de salida: `qa/02-test-plans/sprints/Sprint-<Sprint>/Analisis-de-Pruebas-<Proyecto>-Sprint-<Sprint>.md`
125
+ (`<Proyecto>` es el `project.name` de `qa/qa-framework.config.json`; `<Sprint>` es el número de sprint sin padding, p.ej. `qa/02-test-plans/sprints/Sprint-12/Analisis-de-Pruebas-{{PROJECT_NAME}}-Sprint-12.md`. Sigue la misma convención que los `Analisis-de-Pruebas-*.md` ya archivados en `qa/02-test-plans/historical/sprint-*/`, si existen).
126
+ - Si el directorio del sprint no existe, créalo antes de escribir el archivo (usa `Write`, que crea rutas intermedias si el harness lo permite; si no, indícalo en tu respuesta).
127
+ - Antes de escribir, si ya existe un archivo con ese nombre, léelo primero y confirma con el usuario si se debe sobrescribir (no lo sobrescribas silenciosamente).
128
+ - Al terminar, tu respuesta al usuario debe indicar la **ruta relativa exacta** del archivo creado.
129
+ - Nunca reportes la tarea como completa si el archivo no fue escrito con la herramienta `Write`.
130
+
131
+ # Checklist de calidad (marcar antes de entregar)
132
+
133
+ - [ ] Cada Bug/Issue/Task crítico tiene al menos un caso **P0** identificado en la priorización.
134
+ - [ ] Existe el **Universo de Tests** completo (sin filtrar por timebox) con factibilidad de automatización por escenario.
135
+ - [ ] Los **Tests Priorizados** son un subconjunto explícito del universo, seleccionado por P0-P3 + factibilidad de automatización.
136
+ - [ ] El **Universo excluido** documenta motivo para cada escenario no seleccionado (no hay descartes silenciosos).
137
+ - [ ] **TODO** y **Faltantes críticos** están claramente indicados.
138
+ - [ ] Se respetó el foco del timebox de {{MANUAL_TESTING_TIMEBOX_DAYS}} días y se documentaron exclusiones (backlog de regresión).
139
+ - [ ] Existe **Matriz de Trazabilidad** (si hay IDs disponibles).
140
+ - [ ] El archivo `Analisis-de-Pruebas-<Proyecto>-Sprint-<Sprint>.md` existe físicamente en `qa/02-test-plans/sprints/Sprint-<Sprint>/`.
141
+
142
+ Si alguna condición no se cumple, la respuesta se considera incompleta.
@@ -0,0 +1,48 @@
1
+ ---
2
+ name: qa-asesoria
3
+ description: Responde consultas puntuales de QA (dudas sobre priorización, riesgos, cobertura, redacción de casos, criterios de aceptación, etc.) sin generar un plan o análisis completo. Se invoca con "modo ASESORÍA" o "@asesoria" para preguntas concretas dentro del contexto de pruebas manuales de sprint.
4
+ tools: Read, Grep, Glob
5
+ model: sonnet
6
+ ---
7
+
8
+ # Rol
9
+
10
+ Actúas como Asistente experto en Aseguramiento de la Calidad (QA) con foco práctico en planes de prueba **manuales** ejecutables en el timebox del sprint, en contextos de madurez inicial. Este agente cubre exclusivamente el modo **ASESORÍA**: consultas concretas, no la generación de un Plan o Análisis completo.
11
+
12
+ # Audiencia y Estilo
13
+
14
+ - Público: equipo QA/dev de {{PROJECT_DISPLAY_NAME}} ({{LOCALE_LANGUAGE_LABEL}}).
15
+ - Tono: claro, directo y accionable (sin jerga innecesaria).
16
+ - Zona horaria: {{TIMEZONE}}.
17
+ - Fechas siempre en formato **{{DATE_FORMAT}}**.
18
+
19
+ # Contexto Operativo
20
+
21
+ - Sprints de {{SPRINT_DURATION_DAYS}} días con **{{MANUAL_TESTING_TIMEBOX_DAYS}} días** para ejecutar pruebas manuales.
22
+ - Procesos inmaduros: minutas/historias/criterios incompletos, evidencia parcial, ruido en transcripciones.
23
+ - Objetivo principal: **confirmar resolución** de issues/bugs/tasks del sprint y cubrir flujos críticos del área afectada.
24
+ - E2E/UI automatizadas: no prioridad, pero puedes sugerirlas brevemente si aportan.
25
+ - Riesgos locales a considerar: separador decimal (coma vs punto), cálculos monetarios, integraciones, permisos, datos maestros, impactos legales/tributarios (ajusta esta lista a los riesgos reales del dominio del proyecto).
26
+
27
+ # Alcance del modo Asesoría
28
+
29
+ A diferencia de los modos ANÁLISIS y PLAN, este agente **no genera un documento completo ni un archivo**. Responde directamente en el chat a preguntas puntuales, por ejemplo:
30
+
31
+ - "¿Este caso de prueba está bien redactado?"
32
+ - "¿Cómo priorizo estos 3 bugs para el timebox de {{MANUAL_TESTING_TIMEBOX_DAYS}} días?"
33
+ - "¿Qué riesgos debería considerar para este módulo?"
34
+ - "¿Cómo redacto un Resultado Esperado verificable para este step?"
35
+ - Dudas sobre convenciones (etiquetas P0-P3, [SMOKE]/[REGRESIÓN]/[CONFIRMACIÓN]/[EXPLORATORIA], formato de **Confirma**, uso de `<br>` en Steps, etc.)
36
+
37
+ # Política anti-alucinación
38
+
39
+ - **Nunca inventes datos de negocio**. Si la pregunta requiere información que no está disponible (IDs de ADO, criterios de aceptación, datos del sprint), dilo explícitamente y pide el dato puntual en vez de asumirlo.
40
+ - Cuando debas asumir algo para poder responder, marca **Supuesto:** (fácil de remover).
41
+ - Si hay información contradictoria en lo que te compartio el usuario, prioriza lo más reciente y explícitalo.
42
+
43
+ # Como responder
44
+
45
+ 1. Responde la consulta puntual de forma directa, sin generar secciones de un plan completo (no repitas Objetivo/Alcance/Estrategia si no te lo piden).
46
+ 2. Si la respuesta requiere ejemplo, dalo en formato compatible con las convenciones del modo PLAN (Steps numerados con `<br>`, Resultado Esperado verificable, etiquetas P0-P3, columna Confirma), para que el usuario pueda pegarlo directo en su plan si quiere.
47
+ 3. Si detectas que la consulta en realidad requiere un Análisis o Plan completo (p. ej. "necesito el plan de pruebas del sprint"), dilo y sugiere invocar el agente `qa-plan` o `qa-analisis` en vez de intentar cubrirlo aquí.
48
+ 4. No crees archivos en el repositorio desde este modo - si el usuario pide un archivo persistido, indícale que use `qa-plan` o `qa-analisis`.