siesa-agents 2.1.72-qa.2 → 2.1.72-qa.21

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 (49) hide show
  1. package/bmad/bmm/config.yaml +33 -0
  2. package/claude/skills/sa-agent-sre-sentinel/SKILL.md +180 -0
  3. package/claude/skills/sa-aplicar/SKILL.md +268 -0
  4. package/claude/skills/sa-auditar-servicio/SKILL.md +255 -0
  5. package/claude/skills/sa-nueva-transversal/SKILL.md +317 -0
  6. package/claude/skills/sa-nuevo-ambiente/SKILL.md +147 -0
  7. package/claude/skills/sa-nuevo-servicio/SKILL.md +530 -0
  8. package/claude/skills/sa-onboard-db/SKILL.md +122 -0
  9. package/claude/skills/sa-qa-data-generator/SKILL.md +200 -51
  10. package/claude/skills/sa-quality-process/SKILL.md +6 -0
  11. package/claude/skills/sa-registrar-permisos/SKILL.md +233 -0
  12. package/package.json +1 -1
  13. package/siesa-agents/bmm/workflows/3-solutioning/quality-process/prompts/prompt_design_test.md +1037 -60
  14. package/siesa-agents/bmm/workflows/3-solutioning/quality-process/prompts/prompt_dor_gate.md +419 -379
  15. package/siesa-agents/bmm/workflows/3-solutioning/quality-process/prompts/prompt_e2e_executor.md +273 -0
  16. package/siesa-agents/bmm/workflows/3-solutioning/quality-process/prompts/prompt_playwright_impl.md +359 -355
  17. package/siesa-agents/bmm/workflows/3-solutioning/quality-process/prompts/prompt_test_plan.md +73 -111
  18. package/siesa-agents/bmm/workflows/3-solutioning/quality-process/workflow.md +1320 -997
  19. package/siesa-agents/resources/playwright-kit/.env.example +42 -0
  20. package/siesa-agents/resources/playwright-kit/README.md +228 -0
  21. package/siesa-agents/resources/playwright-kit/allure/categories.json +26 -0
  22. package/siesa-agents/resources/playwright-kit/global-setup.ts +34 -0
  23. package/siesa-agents/resources/playwright-kit/helpers/blazor-e2e-helpers.ts +417 -0
  24. package/siesa-agents/resources/playwright-kit/helpers/react-e2e-helpers.ts +297 -0
  25. package/siesa-agents/resources/playwright-kit/package-lock.json +850 -0
  26. package/siesa-agents/resources/playwright-kit/package.json +27 -0
  27. package/siesa-agents/resources/playwright-kit/playwright.config.ts +60 -0
  28. package/siesa-agents/resources/playwright-kit/proposed/.gitkeep +0 -0
  29. package/siesa-agents/resources/playwright-kit/reporters/agiletest-reporter.ts +252 -0
  30. package/siesa-agents/resources/playwright-kit/specs/.gitkeep +0 -0
  31. package/siesa-agents/resources/playwright-kit/specs/architecture-brief-siesa-erp.md +85 -0
  32. package/siesa-agents/resources/playwright-kit/specs/architecture-brief-siesa-react.md +109 -0
  33. package/siesa-agents/resources/playwright-kit/specs/architecture-brief-template.md +69 -0
  34. package/siesa-agents/resources/playwright-kit/tests/seed-example.spec.ts +95 -0
  35. package/siesa-agents/resources/playwright-kit/tools/locator-overlay.js +1306 -0
  36. package/siesa-agents/resources/playwright-kit/tools/locator-recorder.spec.ts +986 -0
  37. package/siesa-agents/scripts/__pycache__/bmad_to_agiletest.cpython-36.pyc +0 -0
  38. package/siesa-agents/scripts/bmad_to_agiletest.py +352 -337
  39. package/siesa-agents/scripts/converters/convert_csv_to_test_design.py +327 -0
  40. package/siesa-agents/scripts/converters/convert_excel_to_test_design.py +360 -0
  41. package/siesa-agents/scripts/converters/convert_md_to_test_design.py +359 -0
  42. package/siesa-agents/scripts/converters/convert_pdf_to_test_design.py +412 -0
  43. package/siesa-agents/scripts/converters/export_yaml_to_csv.py +149 -0
  44. package/siesa-agents/scripts/converters/export_yaml_to_excel.py +233 -0
  45. package/siesa-agents/scripts/converters/export_yaml_to_markdown.py +172 -0
  46. package/siesa-agents/scripts/converters/export_yaml_to_pdf.py +297 -0
  47. package/siesa-agents/scripts/merge_test_design.py +106 -106
  48. package/siesa-agents/scripts/playwright/yaml-to-playwright-spec.ts +203 -0
  49. package/siesa-agents/scripts/requirements.txt +7 -0
@@ -1,24 +1,25 @@
1
1
  ---
2
2
  name: quality-process
3
- description: "QA Quality Process — Phase 1 Planning (BMAD V6.0 test design), Phase 2 Design (QA Test Plan & Strategy), Phase 3 AgileTest Registration (push validated design to Jira/AgileTest), Phase 4 DOR Gate (verify Definition of Ready checklist), or Phase 5 Playwright Implementation (generate E2E test code from test-cases.csv gaps). Asks at startup which phase to execute."
3
+ description: "QA Quality Process — Phase 1 Planning (QA Test Plan & Strategy), Phase 2 DOR Gate (verify Definition of Ready checklist), Phase 3 Design (BMAD V7.8 test design), Phase 4 QA Data Generation (provision synthetic test data in the real DB via MCP from the Fase 3 test-cases.csv, reusing existing QA data before generating), Phase 5 AgileTest Registration (push validated design to Jira/AgileTest), or Phase 6 E2E Implementation + Execution (Agente Ejecutor E2E: from test-design.yml generate, run and report Playwright tests via the Kit). Asks at startup which phase to execute."
4
4
  web_bundle: true
5
- version: 1.1.0
5
+ version: 1.3.0
6
6
  parameters:
7
7
  feature_id:
8
- description: 'Opcional: Feature ID a procesar (ej: "feature-1"). Solo aplica para la Fase 2 — Diseño.'
8
+ description: 'Opcional: Feature ID a procesar (ej: "feature-1"). Solo aplica para la Fase 3 — Diseño.'
9
9
  required: false
10
10
  type: string
11
11
  ---
12
12
 
13
13
  # Proceso de Calidad QA
14
14
 
15
- **Goal:** Ejecutar el proceso de calidad QA del proyecto en la fase seleccionada. El proceso tiene cinco fases complementarias ejecutadas por el QA asignado:
15
+ **Goal:** Ejecutar el proceso de calidad QA del proyecto en la fase seleccionada. El proceso tiene seis fases complementarias ejecutadas por el QA asignado:
16
16
 
17
- - **Fase 1 — Planeación:** Genera el Plan de Pruebas y Estrategia QA (alcance, riesgos R=IxP, Data Buckets, criterios Go/No-Go) a partir de los documentos fuente del proyecto.
18
- - **Fase 2 — Diseño:** Genera el diseño de pruebas técnico (trazabilidad, Gatekeeper, FAC, Puntos Ciegos, Matriz Integral, TSR) usando BMAD V6.0 sobre los features del proyecto.
19
- - **Fase 3 — Registro AgileTest:** Empuja el diseño validado a Jira/AgileTest con trazabilidad completa.
20
- - **Fase 4 — DOR Gate:** Verifica que el requerimiento cumple el Definition of Ready (DoR) antes de iniciar cualquier labor de construcción. Genera reporte pass/fail por ítem.
21
- - **Fase 5 — Implementación Playwright:** Toma el `test-cases.csv` generado en Fase 2, identifica automáticamente los tests sin cobertura en los spec files existentes, clasifica cada test por tecnología (Playwright E2E, Vitest Unit, .NET xUnit), genera el código Playwright para los gaps, lo inyecta en los spec files con aprobación humana y actualiza el CSV.
17
+ - **Fase 1 — Planeación:** Genera el Plan de Pruebas y Estrategia QA (alcance, riesgos R=IxP, ambiente & datos de prueba, criterios Go/No-Go) a partir de los documentos fuente del proyecto. *(Los Data Buckets por feature se movieron al agente de datos — Fase 4.)*
18
+ - **Fase 2 — DOR Gate:** Verifica que el requerimiento cumple el Definition of Ready (DoR) antes de iniciar cualquier labor de construcción. Genera reporte pass/fail por ítem.
19
+ - **Fase 3 — Diseño:** Genera el diseño de pruebas técnico (trazabilidad, Gatekeeper, FAC, Puntos Ciegos, Matriz Integral, TSR) usando BMAD V7.8 (modos Feature/Completo, niveles FU/INT/INT-X/E2E/E2E-X/REG/EC) sobre los features del proyecto.
20
+ - **Fase 4 — Generación de Datos QA:** Toma el `test-cases.csv` generado en Fase 3 y, conectándose a la base de datos real vía MCP (PostgreSQL/SQL Server), infiere y confirma el negocio, reutiliza datos QA existentes antes de generar; provisiona únicamente los datos sintéticos faltantes con integridad referencial, bajo aprobación humana, y entrega 3 artefactos en disco: `test-data.md` (relación caso→datos agrupada por seed, lista para Playwright), `seed.sql` idempotente y `rollback.sql` acotado a la corrida. Delega en la skill `sa-qa-data-generator`.
21
+ - **Fase 5 — Registro AgileTest:** Empuja el diseño validado a Jira/AgileTest con trazabilidad completa.
22
+ - **Fase 6 — Implementación + Ejecución E2E:** Actúa como **Agente Ejecutor E2E**: consume el `test-design.yml` (Fase 3) + `test-data.md` (Fase 4), enriquece con el architecture brief, genera los `.spec.ts` con el ciclo Planner→Generator→Healer sobre el Kit Playwright, los promueve con aprobación humana, **ejecuta** la suite y deja los reportes (Allure/Monocart/test-results) listos para el RCA. Fallback a `test-cases.csv` si no hay YAML.
22
23
 
23
24
  **Your Role:** Además de tu nombre, communication_style y persona, actúas como **QA Architect Senior** con 10+ años de experiencia en sistemas empresariales complejos (ERP, HCM, CRM, plataformas financieras, compliance regulatorio). Piensas como defensor del negocio, no solo como técnico de pruebas. Trabajas bajo la metodología BMAD v6.0.
24
25
 
@@ -49,7 +50,8 @@ Cargar y leer la configuración completa desde `{project-root}/_bmad/bmm/config.
49
50
 
50
51
  ### 2. Phase Selection (OBLIGATORIO — Primer paso interactivo)
51
52
 
52
- Preguntar al usuario qué fase del proceso de calidad desea ejecutar:
53
+ Preguntar al usuario qué fase del proceso de calidad desea ejecutar. Mostrar el menú
54
+ descriptivo de las 6 fases y capturar la selección:
53
55
 
54
56
  ```
55
57
  🔎 Proceso de Calidad QA — Selección de Fase
@@ -58,94 +60,50 @@ Preguntar al usuario qué fase del proceso de calidad desea ejecutar:
58
60
  Matriz de Riesgo (R = I×P), Data Buckets y criterios Go/No-Go.
59
61
  (Requiere: PRD, Arquitectura, Épicas u otros documentos fuente)
60
62
 
61
- 2️⃣ Diseño Diseño técnico de pruebas: Gatekeeper, FAC en Gherkin,
62
- Puntos Ciegos, Matriz Integral 360°, TSR y CSV de casos.
63
- (Requiere: feature-status.yaml + archivos epic_source)
64
-
65
- 3️⃣ Registro AgileTest — Empuja el diseño validado a Jira/AgileTest:
66
- Requisitos, Test Cases con Steps, Planes de Prueba (PPR),
67
- Planes de Ejecución (PEP) y links de trazabilidad.
68
- (Requiere: Fase 2 completada y validada por el equipo QA)
69
-
70
- 4️⃣ DOR Gate — Verifica el Definition of Ready del requerimiento:
63
+ 2️⃣ DOR Gate Verifica el Definition of Ready del requerimiento:
71
64
  completitud PRD ≥ 90%, consistencia con arquitectura,
72
65
  métricas definidas, contratos de interfaz e inyección de contexto.
73
66
  Genera reporte pass/fail por ítem.
74
67
  (Requiere: PRD.md + Architecture.md)
75
68
 
76
- 5️⃣ Implementación Playwright
77
- Gap analysis automático entre test-cases.csv y spec files
78
- existentes. Clasifica tests por tecnología (Playwright/Vitest/.NET),
79
- genera código E2E para los gaps, lo inyecta en los spec files
80
- con aprobación humana y actualiza el Estado del CSV.
81
- (Requiere: Fase 2 completada — test-cases.csv + spec files en frontend/)
69
+ 3️⃣ Diseño — Diseño técnico de pruebas: Gatekeeper, FAC en Gherkin,
70
+ Puntos Ciegos, Matriz Integral 360°, TSR y CSV de casos.
71
+ (Requiere: feature-status.yaml + archivos epic_source)
82
72
 
83
- ¿Qué fase deseas ejecutar?
84
- ```
73
+ 4️⃣ Generación de Datos QA
74
+ — Provisiona datos sintéticos en la base de datos real (vía MCP)
75
+ para que los casos diseñados en Fase 3 puedan ejecutarse.
76
+ Infiere y confirma el negocio, reutiliza datos QA existentes antes
77
+ de generar, inserta solo lo faltante con aprobación humana y entrega
78
+ 3 artefactos: test-data.md, seed.sql y rollback.sql.
79
+ (Requiere: Fase 3 completada — test-cases.csv + MCP de BD conectado)
85
80
 
86
- **STEP 1Grupo de fase** (AskUserQuestion, 2 opciones):
81
+ 5️⃣ Registro AgileTestEmpuja el diseño validado a Jira/AgileTest:
82
+ Requisitos, Test Cases con Steps, Planes de Prueba (PPR),
83
+ Planes de Ejecución (PEP) y links de trazabilidad.
84
+ (Requiere: Fase 3 completada y validada por el equipo QA)
87
85
 
88
- ```json
89
- {
90
- "questions": [
91
- {
92
- "question": "¿Qué grupo de fases deseas ejecutar?",
93
- "header": "Selección de Fase",
94
- "multiSelect": false,
95
- "options": [
96
- {
97
- "label": "Fases 1–4 (QA Tradicional)",
98
- "description": "Planeación, Diseño, Registro AgileTest o DOR Gate"
99
- },
100
- {
101
- "label": "Fase 5 — Implementación Playwright",
102
- "description": "Gap analysis CSV↔spec files: genera código E2E para los tests sin cobertura, inyecta en spec files con gate de aprobación y actualiza el CSV"
103
- }
104
- ]
105
- }
106
- ]
107
- }
108
- ```
86
+ 6️⃣ Implementación + Ejecución E2E
87
+ — Agente Ejecutor E2E: del test-design.yml genera los .spec.ts
88
+ (Planner→Generator→Healer sobre el Kit Playwright), los promueve
89
+ con aprobación humana, EJECUTA la suite y deja reportes
90
+ (Allure/Monocart/test-results) listos para el RCA.
91
+ (Requiere: Fase 3 — test-design.yml/csv [+ Fase 4 test-data.md])
109
92
 
110
- - Si selecciona **Fase 5 — Implementación Playwright**: continuar directamente con la sección `FASE 5 — IMPLEMENTACIÓN PLAYWRIGHT`
111
- - Si selecciona **Fases 1–4**: continuar con el **STEP 2** a continuación
93
+ ¿Qué fase deseas ejecutar? (responde con el número 1–6)
94
+ ```
112
95
 
113
- **STEP 2 Fase específica** (solo si eligió "Fases 1–4" en el STEP 1):
96
+ **Captura de la selección (lista plana de 6):**
114
97
 
115
- ```json
116
- {
117
- "questions": [
118
- {
119
- "question": "¿Cuál fase QA deseas ejecutar?",
120
- "header": "Fase QA",
121
- "multiSelect": false,
122
- "options": [
123
- {
124
- "label": "Fase 1 — Planeación",
125
- "description": "Plan & Estrategia QA: alcance, riesgos R=I×P, Data Buckets, criterios Go/No-Go"
126
- },
127
- {
128
- "label": "Fase 2 — Diseño",
129
- "description": "Diseño técnico de pruebas: Gatekeeper, FAC en Gherkin, Puntos Ciegos, Matriz Integral 360°, TSR y CSV de casos"
130
- },
131
- {
132
- "label": "Fase 3 — Registro AgileTest",
133
- "description": "Empujar diseño validado a Jira/AgileTest: Requisitos, TCs con Steps, Planes (PPR), Ejecuciones (PEP) y links de trazabilidad"
134
- },
135
- {
136
- "label": "Fase 4 — DOR Gate",
137
- "description": "Verificar Definition of Ready: completitud PRD ≥ 90%, consistencia arquitectura, métricas, contratos e inyección de contexto. Genera dor-report.md con resultado pass/fail."
138
- }
139
- ]
140
- }
141
- ]
142
- }
143
- ```
98
+ Como `AskUserQuestion` admite un máximo de 4 opciones, la selección se hace por **texto**:
99
+ el usuario responde con el número de la fase (1–6) o su nombre. Enrutar según la respuesta:
144
100
 
145
- - Si selecciona **Fase 1 Planeación**: continuar con la sección `FASE 1 — PLANEACIÓN`
146
- - Si selecciona **Fase 2 Diseño**: continuar con la sección `FASE 2 — DISEÑO`
147
- - Si selecciona **Fase 3 Registro AgileTest**: continuar con la sección `FASE 3 — REGISTRO AGILETEST`
148
- - Si selecciona **Fase 4 DOR Gate**: continuar con la sección `FASE 4 — DOR GATE`
101
+ - **1 Planeación:** continuar con la sección `FASE 1 — PLANEACIÓN`
102
+ - **2 DOR Gate:** continuar con la sección `FASE 2 — DOR GATE`
103
+ - **3 Diseño:** continuar con la sección `FASE 3 — DISEÑO`
104
+ - **4 Generación de Datos QA:** continuar con la sección `FASE 4 — GENERACIÓN DE DATOS QA`
105
+ - **5 → Registro AgileTest:** continuar con la sección `FASE 5 — REGISTRO AGILETEST`
106
+ - **6 → Implementación + Ejecución E2E:** continuar con la sección `FASE 6 — IMPLEMENTACIÓN + EJECUCIÓN E2E`
149
107
 
150
108
  ---
151
109
 
@@ -157,12 +115,42 @@ Generar un Plan de Pruebas y Estrategia QA completo siguiendo la metodología BM
157
115
 
158
116
  ---
159
117
 
160
- ### F1.1: Auto Document Discovery (Zero User Interaction)
118
+ ### F1.0: Captura de Insumos del Sprint (GATE inicial — OBLIGATORIO)
119
+
120
+ > **Principio:** La planeación se hace **sobre el alcance del sprint**, no sobre todo el proyecto.
121
+ > NO inicies una lectura masiva del repositorio. Primero pregunta al usuario qué entra al sprint
122
+ > y **acota** el descubrimiento de documentos (F1.1) a ese alcance.
123
+
124
+ Antes de buscar o leer cualquier documento, **detente y pregunta** al usuario por los insumos
125
+ específicos del sprint usando AskUserQuestion (o entrada libre si el usuario prefiere pegarlos):
126
+
127
+ ```
128
+ 🎯 Antes de planear, necesito el alcance de este sprint. Indícame:
129
+
130
+ 1. Épicas en alcance — IDs o nombres de las épicas que entran al sprint
131
+ 2. Features a probar — features/funcionalidades concretas a cubrir con QA
132
+ 3. Alcance técnico — servicios/módulos/APIs involucrados y lo que queda Fuera de Alcance
133
+
134
+ Puedes pegar las rutas de los documentos relevantes o escribir el alcance directamente.
135
+ ```
136
+
137
+ Almacenar las respuestas en `sprint_scope` con: `epicas_en_alcance`, `features_a_probar`,
138
+ `alcance_tecnico`, `fuera_de_alcance`.
139
+
140
+ - Si el usuario **no** conoce el alcance todavía o pide el comportamiento anterior, puede responder
141
+ "todo el proyecto" → en ese caso F1.1 hace el descubrimiento completo (modo legacy).
142
+ - **No avances a F1.1 sin una respuesta.** Este es un gate de detención obligatoria.
143
+
144
+ ---
145
+
146
+ ### F1.1: Document Discovery (acotado al alcance del sprint)
161
147
 
162
- Buscar y leer automáticamente los documentos fuente desde sus rutas fijas. Notificar:
148
+ Buscar y leer los documentos fuente, **filtrando por el `sprint_scope` capturado en F1.0**: cargar
149
+ únicamente las épicas/features declaradas y los documentos del alcance técnico indicado, no el
150
+ repositorio completo. Si `sprint_scope` = "todo el proyecto", cargar todo (modo legacy). Notificar:
163
151
 
164
152
  ```
165
- 🔍 Buscando documentos fuente del proyecto...
153
+ 🔍 Buscando documentos fuente acotados al alcance del sprint...
166
154
  ```
167
155
 
168
156
  #### Documento 1 — PRD / Requerimientos
@@ -195,7 +183,9 @@ Buscar con Glob en este orden:
195
183
  3. `{planning_artifacts}/*epic*.md`
196
184
  4. `{implementation_artifacts}/*epic*.md`
197
185
 
198
- Si encontrado: leer contenido completo de todos los epic_source files y concatenar → almacenar en `doc_epics`
186
+ Si encontrado: leer el contenido de los epic_source files y concatenar → almacenar en `doc_epics`.
187
+ **Acotar por `sprint_scope.epicas_en_alcance`:** si el usuario declaró épicas específicas en F1.0,
188
+ cargar SOLO esas épicas (no todas las del proyecto). Si declaró "todo el proyecto", cargar todas.
199
189
  Si no encontrado: `doc_epics = null`
200
190
 
201
191
  #### Documento 4 — Contexto Normativo / Regulatorio
@@ -328,14 +318,17 @@ Notificar al usuario:
328
318
  📋 Generando Plan de Pruebas BMAD v3.0...
329
319
  ```
330
320
 
331
- Ejecutar el megaprompt completo usando `input_source_documents` como documentos fuente adjuntos.
321
+ Ejecutar el megaprompt completo usando `input_source_documents` como documentos fuente adjuntos
322
+ y `sprint_scope` (capturado en F1.0) como alcance del plan: la Sección 3 (Alcance de Pruebas) debe
323
+ reflejar las `features_a_probar` y el `fuera_de_alcance` declarados por el usuario, no inferir el
324
+ alcance del barrido completo del proyecto.
332
325
 
333
- El plan de pruebas generado debe incluir todas las secciones del prompt:
326
+ El plan de pruebas generado debe incluir todas las secciones del prompt (v3.1):
334
327
  - Sección 1: Información General
335
328
  - Sección 2: Objetivo & DoR / DoD
336
- - Sección 3: Alcance de Pruebas
337
- - Sección 4: Estrategia de Pruebas
338
- - Sección 5: Ambiente & Datos de Prueba (Data Buckets por feature)
329
+ - Sección 3: Alcance de Pruebas (Features incluidas y Fuera de Alcance)
330
+ - Sección 4: Estrategia de Pruebas (E2E-first; unitarias solo para lógica compleja)
331
+ - Sección 5: Ambiente & Datos de Prueba
339
332
  - Sección 6: Matriz de Riesgo Predictivo (R = I × P)
340
333
  - Sección 7: Criterios de Entrada / Salida (Go / No-Go)
341
334
 
@@ -377,9 +370,9 @@ Presentar al usuario:
377
370
  📋 Secciones incluidas:
378
371
  1. Información General
379
372
  2. Objetivo & DoR / DoD (Checklist de entrada y salida)
380
- 3. Alcance de Pruebas (Features incluidas y excluidas)
381
- 4. Estrategia de Pruebas (Tipos, técnicas, integración Human–AI)
382
- 5. Ambiente & Datos de Prueba (Data Buckets por feature)
373
+ 3. Alcance de Pruebas (Features incluidas y Fuera de Alcance)
374
+ 4. Estrategia de Pruebas (Tipos E2E-first, técnicas de diseño)
375
+ 5. Ambiente & Datos de Prueba
383
376
  6. Matriz de Riesgo Predictivo (Riesgos identificados por feature)
384
377
  7. Criterios de Entrada / Salida (Go / No-Go checklist)
385
378
 
@@ -390,621 +383,888 @@ Presentar al usuario:
390
383
  con información específica de tu sprint/equipo.
391
384
  ```
392
385
 
393
- **⚠️ NO sugerir continuar con Fase 2 ni ninguna acción adicional. El workflow termina aquí. El equipo de QA debe revisar y validar los documentos generados antes de ejecutar la Fase 2 — Diseño.**
386
+ **⚠️ NO sugerir continuar con ninguna otra fase ni acción adicional. El workflow termina aquí. El equipo de QA debe revisar y validar los documentos generados antes de continuar con las siguientes fases.**
394
387
 
395
388
  ---
396
389
 
397
- ## FASE 2 — DISEÑO
390
+ ## FASE 2 — DOR GATE
398
391
 
399
392
  ### Objetivo
400
393
 
401
- Generar el diseño técnico de pruebas completo aplicando la metodología BMAD V6.0. Produce trazabilidad funcional, criterios de aceptación en Gherkin, puntos ciegos por arquetipo, Matriz Integral de Pruebas 360° y Test Summary Report.
394
+ Verificar que el requerimiento cumple el **Definition of Ready (DoR)** antes de iniciar cualquier labor de construcción o proceso de calidad. Evalúa los ítems activos del checklist DoR BMAD Enterprise y genera un reporte `dor-report.md` con resultado pass/fail por ítem, detalle de cada fallo y acción correctiva requerida.
395
+
396
+ **Principio:** Si el Índice de Completitud es inferior al 90%, el sistema activa BLOQUEO TOTAL. El agente tiene prohibido iniciar cualquier labor de construcción.
402
397
 
403
398
  ---
404
399
 
405
- ### F2.1: Feature Selection (Interactivo)
400
+ ### F2.1: Auto Document Discovery (Zero User Interaction)
406
401
 
407
- **Capture feature_id parameter** si fue provisto en los argumentos del comando.
402
+ Buscar y leer automáticamente los documentos necesarios para evaluar el DoR:
408
403
 
409
- 1. **Cargar el registro de features:**
410
- - Leer: `{implementation_artifacts}/feature-status.yaml`
411
- - Parsear YAML para extraer todos los features: `[{id, epic_source, status, last_update}, ...]`
404
+ ```
405
+ 🔍 DOR Gate — Buscando documentos fuente...
406
+ ```
412
407
 
413
- 2. **Si `feature_id` fue provisto como parámetro:**
414
- - Validar que existe en el registro; si no, listar IDs disponibles y detener
415
- - `filtered_features = [ese feature]`
416
- - Notificar: `✅ Feature seleccionado por parámetro: {feature_id}`
417
- - Ir a F2.2
408
+ #### Documento 1 PRD / Requerimientos (OBLIGATORIO)
418
409
 
419
- 3. **Si no se proveyó parámetro, preguntar al usuario:**
410
+ El PRD siempre vive en `{planning_artifacts}/prd` puede ser un archivo o una carpeta:
420
411
 
421
- Mostrar features disponibles:
422
- ```
423
- 📋 Features disponibles en el proyecto:
412
+ **Caso A — archivo único:**
413
+ - Buscar: `{planning_artifacts}/prd.md`
414
+ - Si encontrado: leer contenido completo → almacenar en `dor_prd`
424
415
 
425
- {por cada feature:
426
- " • {feature.id} [{feature.status}] → {feature.epic_source}"
427
- }
428
- ```
416
+ **Caso B — carpeta con múltiples archivos:**
417
+ - Buscar con Glob: `{planning_artifacts}/prd/**/*.md`
418
+ - Si encontrado: leer y concatenar el contenido de todos los archivos `.md` → almacenar en `dor_prd`
429
419
 
430
- Usar AskUserQuestion:
431
- ```json
432
- {
433
- "questions": [
434
- {
435
- "question": "¿Qué features deseas analizar?",
436
- "header": "Selección de Features — Fase 2 Diseño",
437
- "multiSelect": false,
438
- "options": [
439
- {
440
- "label": "Todos los features",
441
- "description": "Procesar todos los features del registro"
442
- },
443
- {
444
- "label": "Seleccionar features específicos",
445
- "description": "Elegir uno o más features por ID"
446
- }
447
- ]
448
- }
449
- ]
450
- }
451
- ```
420
+ Si ninguno de los dos casos produce contenido: `dor_prd = null` → **BLOQUEO**: sin PRD no se puede evaluar el DoR
452
421
 
453
- **Si "Todos los features":**
454
- - `filtered_features = all_features`
455
- - Notificar: `✅ Se procesarán todos los features ({count} features)`
422
+ #### Documento 2 — Épicas / Historias de Usuario (para P1 y P2)
456
423
 
457
- **Si "Seleccionar features específicos":**
458
- - Si ≤ 4 features: usar AskUserQuestion multiSelect con una opción por feature
459
- - Si > 4 features: pedir vía texto: "Ingresa los IDs separados por comas (ej: feature-1,feature-3):"
460
- - Validar cada ID contra el registro
461
- - `filtered_features = features encontrados`
462
- - Notificar:
463
- ```
464
- ✅ Features seleccionados ({count}):
465
- {por cada feature en filtered_features:
466
- " • {feature.id} → {feature.epic_source}"
467
- }
468
- ```
424
+ El DOR se evalúa sobre features que ya tienen épicas creadas. Cargar usando el mismo patrón que las otras fases:
469
425
 
470
- 4. Almacenar `filtered_features` en memoria.
426
+ 1. Leer `{implementation_artifacts}/feature-status.yaml`
427
+ 2. Por cada feature, leer su archivo `epic_source` y concatenar contenido → almacenar en `dor_epics`
428
+
429
+ Si `feature-status.yaml` no existe:
430
+ - Buscar con Glob: `{planning_artifacts}/*epic*.md`
431
+ - Si encontrado: leer y concatenar → almacenar en `dor_epics`
432
+ - Si no encontrado: `dor_epics = null` (continuar sin épicas — P1 se evalúa solo contra el PRD)
471
433
 
472
434
  ---
473
435
 
474
- ### F2.2: Automatic Data Loading (Zero User Interaction)
436
+ #### Documento 3 Arquitectura (OBLIGATORIO para P2)
475
437
 
476
- **CARGAR TODOS LOS INPUTS AUTOMÁTICAMENTE:**
438
+ Buscar con Glob en este orden:
439
+ 1. `{planning_artifacts}/architecture.md`
440
+ 2. `{planning_artifacts}/architecture-decision.md`
441
+ 3. `{planning_artifacts}/*architecture*.md`
442
+ 4. `{planning_artifacts}/*adr*.md`
477
443
 
478
- 1. **INPUT 1 - PROYECTO:**
479
- - Cargar desde config: `{project_name}`
480
- - Almacenar como: `input_proyecto`
444
+ Si encontrado: leer contenido completo → almacenar en `dor_architecture`
445
+ Si no encontrado: `dor_architecture = null` → P2 se marcará como NO EVALUABLE
481
446
 
482
- 2. **INPUT 2 - FEATURES / HISTORIAS DE USUARIO:**
483
- - Usar `filtered_features` de F2.1
484
- - Por cada feature, leer su archivo `epic_source` y concatenar contenido
485
- - Almacenar contenido combinado como: `input_epicas`
447
+ #### Documentos P4, P5, P8 No cargados (ítems no evaluables)
486
448
 
487
- 3. **INPUT 3 - METAS DE NEGOCIO (PRD):**
488
- - Buscar en `{planning_artifacts}/`: `prd.md`, `PRD.md`, `product-requirements.md` o similar
489
- - Si encontrado: leer y almacenar como `input_metas`
490
- - Si no encontrado: extraer metas de negocio de los archivos epic_source `input_metas`
449
+ - **P4 (Contratos de Interfaz):** La ruta, formato y proceso de subida del esquema
450
+ OpenAPI/Swagger aún no están definidos. No se carga ningún documento.
451
+ - **P5 (Estimación / Tamaño):** Descartado por ahora (decisión reunión 26-may-2026) —
452
+ la estimación de esfuerzo/tamaño no se evalúa con IA. No se carga ningún documento.
453
+ - **P8 (Autodescubrimiento / Mapeo de esquemas de BD):** Descartado por ahora
454
+ (decisión reunión 26-may-2026) — no está definido cómo mapear esquemas de BD en el DoR.
455
+ No se carga ningún documento.
491
456
 
492
- 4. **INPUT 4 - STACK TECNOLÓGICO:**
493
- - Cargar desde: `{project-root}/_siesa-agents/bmm/data/company-standards/technology-stack.md`
494
- - Almacenar como: `input_stack`
457
+ #### Documento P6 Plan de Pruebas
495
458
 
496
- 5. **INPUT 5 - PLAN DE PRUEBAS (Fase 1 — Planeación):**
497
- - Buscar la carpeta más reciente en `{implementation_artifacts}/quality-process/planeacion/`:
498
- - Listar todas las subcarpetas con patrón `test-plan-*`
499
- - Ordenar por nombre descendente (el timestamp garantiza el orden cronológico)
500
- - Tomar la primera → es la ejecución más reciente
501
- - Si encontrada: leer `test-plan.md` → almacenar en `input_test_plan`
502
- - Si no encontrada: `input_test_plan = null`
459
+ Listar todos los directorios en `{implementation_artifacts}/quality-process/planeacion/`
460
+ que sigan el patrón `test-plan-*`. Ordenar descendente por nombre (el timestamp garantiza orden cronológico).
461
+ Almacenar la lista como `dor_test_plan_options` para que P6 la use en la selección interactiva.
503
462
 
504
- **Notificar al usuario:**
463
+ Si no existe ningún directorio con ese patrón: `dor_test_plan_options = []` (P6 marcará NO_PASA).
505
464
 
506
- ```
507
- 🎯 BMAD V6.0 — Fase 2: Diseño de Pruebas
465
+ #### Documento P7 — Cargar project-context
508
466
 
509
- Iniciando análisis automático...
467
+ Buscar `_bmad-output/project-context.md`. Si existe, anotar la ruta como `dor_project_context`.
468
+ Si no existe, `dor_project_context = null` (P7 marcará NO_PASA automáticamente).
510
469
 
511
- 📋 Datos cargados:
512
- • Proyecto: {input_proyecto}
513
- Features registry: {implementation_artifacts}/feature-status.yaml
514
- • Features seleccionados: [lista de feature IDs]
515
- • PRD: [ruta encontrada o "extraído de epic_source files"]
516
- • Stack Tecnológico: _siesa-agents/bmm/data/company-standards/technology-stack.md
517
- • Plan de Pruebas (Fase 1): [ruta encontrada o "No encontrado — se continuará sin ese contexto"]
470
+ #### Validación mínima
471
+
472
+ Si `dor_prd = null`: detener con mensaje:
518
473
 
519
- 🚀 Ejecutando las 4 fases de análisis BMAD V6.0...
520
474
  ```
475
+ ❌ No se encontró el PRD en las rutas estándar del proyecto.
521
476
 
522
- ---
477
+ Ruta esperada: {planning_artifacts}/prd.md (y variantes)
478
+
479
+ El DOR Gate requiere un PRD para ejecutarse. Por favor sube el PRD
480
+ al repositorio y vuelve a ejecutar la Fase 2.
481
+ ```
523
482
 
524
- ### F2.3: Load and Execute Megaprompt
483
+ #### Reporte de documentos encontrados
525
484
 
526
- 1. **Cargar el Megaprompt:**
527
- - Leer el archivo completo: `{workflow_root}/prompts/prompt_design_test.md`
528
- - Este prompt transforma al agente en Principal QA Architect
485
+ Mostrar al usuario:
529
486
 
530
- 2. **Inyectar inputs:**
531
- Reemplazar la sección `[INPUT]` del prompt:
532
- ```
533
- # [INPUT]:
534
- - **PROYECTO**: {input_proyecto}
535
- - **FEATURES / HISTORIAS DE USUARIO**: {input_epicas}
536
- - **METAS DE NEGOCIO (PRD)**: {input_metas}
537
- - **STACK TECNOLÓGICO**: {input_stack}
538
- - **PLAN DE PRUEBAS (contexto)**: {input_test_plan}
539
- ```
487
+ ```
488
+ 📋 DOR Gate Documentos cargados:
540
489
 
541
- 3. **Ejecutar las 4 FASES secuencialmente:**
542
- - FASE 1: GATEKEEPER GRANULAR Y LIMPIEZA DE BACKLOG
543
- - FASE 2: EL ESCALÓN DE CRITERIOS (FAC) en Gherkin
544
- - FASE 3: DETECCIÓN DE PUNTOS CIEGOS (Simulación Universal)
545
- - FASE 4: INGENIERÍA DE DISEÑO (ISO 29119-4) Y CALCULADORA DE RIESGO
490
+ {✅|❌} PRD: {ruta relativa o "No encontrado — BLOQUEANTE"}
491
+ {✅|⚠️} Épicas: {ruta(s) relativa(s) o "No encontrado P1/P2 sin contexto de stories"}
492
+ {✅|⚠️} Arquitectura: {ruta relativa o "No encontrado P2 no evaluable"}
493
+ ⏭ API Schema: No evaluable ruta/formato pendiente de definición (P4)
494
+ ⏭ Estimación/Tamaño: No evaluable descartado por ahora (P5)
495
+ ⏭ Mapeo esquemas BD: No evaluable — descartado por ahora (P8)
496
+ {✅|⚠️} Plan de Pruebas: {implementation_artifacts}/quality-process/planeacion/test-plan-YYYY-MM-DD-HHmmss/test-plan.md ({N} plan(es) encontrado(s) — P6 pedirá selección)
497
+ {✅|⚠️} Project Context: {ruta relativa o "No encontrado — P7 marcará NO_PASA"}
546
498
 
547
- **Generar outputs en FORMATO EXACTO:**
548
- - I. REPORTE DEL GATEKEEPER (GRANULAR)
549
- - II. DEFINICIÓN DE FEATURES Y CRITERIOS MAESTROS (FAC) EN GHERKIN
550
- - III. PUNTOS CIEGOS DETECTADOS POR FEATURE
551
- - IV. MATRIZ INTEGRAL DE PRUEBAS (DISEÑO 360°)
552
- - V. INFORME TSR (TEST SUMMARY REPORT)
553
- - APÉNDICE: MATRIZ DE TRAZABILIDAD
499
+ 🚀 Ejecutando evaluación DoR...
500
+ ```
501
+
502
+ Proceder directamente a F2.2 sin esperar confirmación del usuario.
554
503
 
555
504
  ---
556
505
 
557
- ### F2.4: Save Output
506
+ ### F2.2: Cargar y Ejecutar Megaprompt DOR
558
507
 
559
- **Crear estructura de carpeta con timestamp:**
508
+ **Step F2.2.1: Cargar prompt**
560
509
 
561
- 1. Generar timestamp: `YYYY-MM-DD-HHmmss` (ej: `2026-03-25-143052`)
562
- 2. Crear estructura de carpetas:
563
- - Raíz: `{implementation_artifacts}/quality-process/diseno/test-design-YYYY-MM-DD-HHmmss/`
564
- - Shards: `{implementation_artifacts}/quality-process/diseno/test-design-YYYY-MM-DD-HHmmss/shards/`
565
- 3. Guardar los 5 documentos dentro de la subcarpeta `shards/`:
510
+ Leer el archivo completo: `{workflow_root}/prompts/prompt_dor_gate.md`
566
511
 
567
- **Documento 1:** `shards/test-design-phase1-gatekeeper.md` (Fase 1 — Clasificación Gatekeeper)
568
- **Documento 2:** `shards/test-design-phase2-fac.md` (Fase 2 — Features y FAC en Gherkin)
569
- **Documento 3:** `shards/test-design-phase3-blind-spots.md` (Fase 3 — Puntos Ciegos)
570
- **Documento 4:** `shards/test-design-phase4-test-matrix.md` (Fase 4 — Matriz Integral)
571
- **Documento 5:** `shards/test-design-phase5-tsr.md` (Fase 5 — TSR + Trazabilidad)
512
+ **Step F2.2.2: Inyectar inputs**
572
513
 
573
- **Frontmatter para todos los documentos:**
574
- ```yaml
575
- ---
576
- workflow: quality-process
577
- phase: diseno
578
- version: 1.0.0
579
- methodology: BMAD V6.0 MegaPrompt
580
- generated_date: [ISO 8601 date]
581
- project_name: {input_proyecto}
582
- input_documents:
583
- epics: [ruta(s) relativa(s)]
584
- prd: [ruta relativa o null]
585
- technology_stack: _siesa-agents/bmm/data/company-standards/technology-stack.md
586
- test_plan: [ruta relativa o null]
587
- ---
514
+ ```
515
+ # [INPUT DOR]:
516
+ - **PRD**: {dor_prd}
517
+ - **ÉPICAS / HISTORIAS DE USUARIO**: {dor_epics}
518
+ - **ARQUITECTURA**: {dor_architecture}
588
519
  ```
589
520
 
590
- **Exportar casos de prueba a CSV (Siesa FT-SD-007 v5.0):**
591
-
592
- Después de guardar `shards/test-design-phase4-test-matrix.md`:
521
+ **Step F2.2.3: Ejecutar evaluación**
593
522
 
594
- 1. Leer el contenido completo del archivo generado
595
- 2. Identificar secciones `## F# — [Nombre Feature]` → `ID Épica` formato `EPIC-POS-F{n}`
596
- 3. Parsear todas las filas de tabla `| TC-` extrayendo las 12 columnas de la matriz
597
- 4. Mapear a las 13 columnas del formato Siesa CSV:
523
+ Notificar al usuario:
598
524
 
599
- | Columna Matriz | → Columna CSV |
600
- |---|---|
601
- | Header `## F{n} ...` | `ID Épica` (ej: `EPIC-POS-F1`) |
602
- | `ID` | `ID Caso de Prueba` |
603
- | `Escenario` | `Título` |
604
- | `Funcionalidad` + `: ` + `Escenario` | `Descripción Completa` |
605
- | `Precondiciones` | `Precondiciones` |
606
- | `Pasos` | `Pasos de Ejecución` |
607
- | `Resultado Esperado` | `Resultados Esperados` |
608
- | `Estrategia` | `Tipo prueba` |
609
- | _(vacío)_ | `Fecha Ejecución` |
610
- | `"Not Started"` | `Estado` |
611
- | _(vacío)_ | `ID Defecto` |
612
- | _(vacío)_ | `Descripción Fallo` |
613
- | `Level: [Level] \| Technique: [Technique] \| Risk: [Risk] \| Priority: [Priority]` | `Notas` |
614
-
615
- 5. **🚨 CRÍTICO — Compatibilidad Windows CSV:**
616
- - ✅ Usar **Write tool ONLY** — NUNCA bash, cat, echo, sed, awk
617
- - ✅ Construir el **string CSV completo en memoria** y luego llamar Write una vez
618
- - ✅ Envolver **TODOS los campos** en comillas dobles
619
- - ✅ Escapar comillas internas duplicándolas: `"` → `""`
620
- - ✅ Encoding: UTF-8
525
+ ```
526
+ ⚙️ Evaluando ítems del DoR...
527
+ P1: Índice de Completitud PRD (LLM scoring)
528
+ P2: Consistencia PRD Arquitectura
529
+ P3: Negocio y Valor (métricas/objetivos)
530
+ P6: Plan de Pruebas (selección interactiva + 7 secciones)
531
+ P7: Inyección de Contexto (project-context.md)
532
+ ─────────────────────────────────────────
533
+ ⏭ P4: Contratos de Interfaz NO EVALUABLE (ruta/formato pendiente)
534
+ ⏭ P5: Estimación / Tamaño NO EVALUABLE (descartado por ahora)
535
+ ⏭ P8: Mapeo de esquemas de BD — NO EVALUABLE (descartado por ahora)
536
+ ```
621
537
 
622
- 6. Guardar como: `{implementation_artifacts}/quality-process/diseno/test-design-YYYY-MM-DD-HHmmss/test-cases.csv` (en la raíz, NO en shards/)
538
+ Ejecutar el prompt con los inputs cargados. El prompt produce un JSON de resultados estructurado con el resultado de cada ítem.
623
539
 
624
540
  ---
625
541
 
626
- ### F2.5: Completion
542
+ ### F2.3: Guardar Output
627
543
 
628
- Presentar al usuario:
544
+ **Generar timestamp:** `YYYY-MM-DD-HHmmss`
629
545
 
546
+ **Ruta de salida:**
547
+ ```
548
+ {implementation_artifacts}/quality-process/dor/dor-report-YYYY-MM-DD-HHmmss/dor-report.md
630
549
  ```
631
- ✅ FASE 2 — DISEÑO COMPLETADA
632
550
 
633
- 📁 Carpeta: {implementation_artifacts}/quality-process/diseno/test-design-YYYY-MM-DD-HHmmss/
551
+ **Frontmatter del documento generado:**
552
+ ```yaml
553
+ ---
554
+ workflow: quality-process
555
+ phase: dor
556
+ version: 1.0.0
557
+ methodology: BMAD DOR Gate
558
+ generated_date: [ISO 8601]
559
+ project_name: {project_name}
560
+ resultado: PASA | NO PASA
561
+ items_evaluados:
562
+ - P1
563
+ - P2
564
+ - P3
565
+ - P6
566
+ - P7
567
+ items_no_evaluados:
568
+ P4: pendiente — ruta y formato del esquema API por definir
569
+ P5: descartado por ahora — estimación/tamaño no se evalúa con IA (decisión 26-may-2026)
570
+ P8: descartado por ahora — mapeo de esquemas de BD no definido (decisión 26-may-2026)
571
+ source_documents:
572
+ prd: [ruta relativa o null]
573
+ architecture: [ruta relativa o null]
574
+ api_schema: [ruta relativa o null]
575
+ project_context: [ruta relativa o null]
576
+ test_plan: [ruta relativa o null]
577
+ ---
578
+ ```
634
579
 
635
- 📄 Archivos en raíz:
636
- test-design.md — Documento unificado (phases 1–5)
637
- • test-cases.csv — Casos exportados (Siesa FT-SD-007 v5.0)
580
+ **Cuerpo del documento** — el título debe ser lo primero visible tras el frontmatter.
581
+ El bloque JSON de resultados va al final dentro de un `<details>` colapsado:
638
582
 
639
- 📂 shards/ (documentos individuales por fase):
640
- test-design-phase1-gatekeeper.md
641
- • test-design-phase2-fac.md
642
- test-design-phase3-blind-spots.md
643
- test-design-phase4-test-matrix.md
644
- • test-design-phase5-tsr.md
583
+ ```markdown
584
+ # DOR Report — {project_name}
585
+
586
+ **Resultado global: ✅ PASA / ❌ NO PASA**
587
+ **Fecha:** {generated_date}
588
+
589
+ ## Resultado por ítem
590
+
591
+ | Ítem | Estado | Score | Detalle |
592
+ |------|--------|-------|---------|
593
+ | P1 — Completitud PRD | ✅/❌ | {score}% | {secciones faltantes o "—"} |
594
+ | P2 — Consistencia Arq. | ✅/❌ | — | {entidades no encontradas o "—"} |
595
+ | P3 — Negocio y Valor | ✅/❌ | — | {detalle o "—"} |
596
+ | P4 — Contratos API | ⏭ | — | No evaluable — ruta y formato del esquema API por definir |
597
+ | P5 — Estimación/Tamaño | ⏭ | — | No evaluable — descartado por ahora (estimación con IA) |
598
+ | P6 — Plan de Pruebas | ✅/❌ | — | {plan seleccionado + secciones faltantes o "—"} |
599
+ | P7 — Inyección Contexto | ✅/❌ | — | {secciones faltantes o "—"} |
600
+ | P8 — Mapeo esquemas BD | ⏭ | — | No evaluable — descartado por ahora (autodescubrimiento BD) |
601
+
602
+ ## Detalle P1 — Completitud PRD {✅/❌} {score}%
603
+
604
+ | Sección | Score | Nota |
605
+ |---------|-------|------|
606
+ | Objetivos | {score}% | {nota} |
607
+ | Alcance | {score}% | {nota} |
608
+ | Criterios de Aceptación | {score}% | {nota} |
609
+ | Métricas de Éxito | {score}% | {nota} |
610
+ | Definiciones Técnicas | {score}% | {nota} |
611
+ | Flujos / Reglas de Negocio | {score}% | {nota} |
612
+
613
+ ## Detalle P2 — Consistencia PRD ↔ Arquitectura {✅/❌} {score}%
614
+
615
+ - **Entidades evaluadas:** {N}
616
+ - **Encontradas:** {N} — {lista}
617
+ - **No encontradas:** {lista o "ninguna"}
618
+ - **Parciales:** {lista o "ninguna"}
619
+
620
+ ## Detalle P3 — Negocio y Valor {✅/❌} {score}%
621
+
622
+ - **Objetivos:** {VÁLIDO/INVÁLIDO/AUSENTE} — {nota}
623
+ - **Métricas:** {VÁLIDO/INVÁLIDO/AUSENTE} — {nota}
624
+
625
+ ## Acciones requeridas
626
+
627
+ {Si PASA:}
628
+ ✅ El requerimiento cumple el DoR.
629
+
630
+ {Si NO PASA:}
631
+ ❌ Corregir los siguientes ítems antes de continuar:
632
+ {por cada ítem fallido: descripción exacta de qué falta y cómo corregirlo}
645
633
 
646
- 📊 Métricas:
647
- • Features identificados: [count]
648
- • Casos de prueba totales: [count]
649
- • Casos P0 (Críticos): [count]
650
- • Cobertura de riesgos críticos: [%]%
651
634
  ```
652
635
 
653
- **⚠️ El workflow termina aquí. El equipo de QA debe revisar y validar los documentos generados.**
636
+ **🚨 IMPORTANTE:** El JSON de resultados que produce el prompt se usa ÚNICAMENTE
637
+ de forma interna para construir el reporte. **NO escribirlo en el archivo `dor-report.md`.**
654
638
 
655
639
  ---
656
640
 
657
- ### F2.6: Merge Documents (Automatic)
641
+ ### F2.4: Completion
658
642
 
659
- Inmediatamente después de guardar los documentos en F2.4, ejecutar el script de merge usando la Bash tool:
643
+ Presentar al usuario:
660
644
 
661
- ```bash
662
- python {project-root}/_siesa-agents/scripts/merge_test_design.py "{carpeta_generada}"
663
645
  ```
646
+ {Si PASA:}
647
+ ✅ DOR GATE — PASA
664
648
 
665
- Donde `{carpeta_generada}` es la ruta absoluta de la carpeta creada en F2.4 (ej: `{implementation_artifacts}/quality-process/diseno/test-design-YYYY-MM-DD-HHmmss/`).
649
+ 📁 Reporte: {implementation_artifacts}/quality-process/dor/dor-report-YYYY-MM-DD-HHmmss/dor-report.md
666
650
 
667
- El script lee los 5 documentos desde `{carpeta_generada}/shards/` y genera `test-design.md` en la raíz de `{carpeta_generada}`.
651
+ 📊 Resumen:
652
+ • P1 Completitud: ✅ {score}%
653
+ • P2 Consistencia Arq.: ✅
654
+ • P3 Negocio y Valor: ✅
655
+ • P4 Contratos API: ⏭ No evaluable
656
+ • P5 Estimación/Tamaño: ⏭ No evaluable (descartado por ahora)
657
+ • P6 Plan de Pruebas: ✅
658
+ • P7 Contexto: ✅
659
+ • P8 Mapeo esquemas BD: ⏭ No evaluable (descartado por ahora)
668
660
 
669
- **No mostrar output técnico del script al usuario.**
661
+ El requerimiento está listo para continuar.
670
662
 
671
- ---
663
+ {Si NO PASA:}
664
+ ❌ DOR GATE — NO PASA
672
665
 
673
- *(Note: `workflow_root` es `{project-root}/_siesa-agents/bmm/workflows/3-solutioning/quality-process`)*
666
+ 📁 Reporte: {implementation_artifacts}/quality-process/dor/dor-report-YYYY-MM-DD-HHmmss/dor-report.md
667
+
668
+ 📊 Resumen:
669
+ • P1 Completitud: {✅/❌} {score}%
670
+ • P2 Consistencia Arq.: {✅/❌}
671
+ • P3 Negocio y Valor: {✅/❌}
672
+ • P4 Contratos API: ⏭ No evaluable
673
+ • P5 Estimación/Tamaño: ⏭ No evaluable (descartado por ahora)
674
+ • P6 Plan de Pruebas: {✅/❌}
675
+ • P7 Contexto: {✅/❌}
676
+ • P8 Mapeo esquemas BD: ⏭ No evaluable (descartado por ahora)
677
+
678
+ ❌ Ítems fallidos: {N}
679
+ → Devolver a refinamiento. Ver sección "Acciones requeridas" en el reporte.
680
+ ```
681
+
682
+ **⚠️ NO sugerir continuar con ninguna otra fase si el resultado es NO PASA. El workflow termina aquí.**
674
683
 
675
684
  ---
676
685
 
677
- ## FASE 3 — REGISTRO AGILETEST
686
+ ## FASE 3 — DISEÑO
678
687
 
679
688
  ### Objetivo
680
689
 
681
- Empujar el diseño de pruebas validado por el equipo QA a Jira/AgileTest. Crea automáticamente los artefactos de la herramienta: Requisitos (Stories BL Tareas), Test Cases con Steps (Gherkin → Pasos), Planes de Prueba (PPR), Planes de Ejecución (PEP) y todos los links de trazabilidad. Requiere aprobación humana explícita antes de crear cualquier issue.
682
-
683
- **Principio:** "La IA acelera, el humano dirige y autoriza."
690
+ Generar el diseño técnico de pruebas completo aplicando la metodología BMAD V7.8 (Fase 0 interactiva de modo y ámbito, niveles de prueba diferenciados y distribución mínima por modo). Produce trazabilidad funcional, criterios de aceptación en Gherkin, puntos ciegos por arquetipo, Matriz Integral de Pruebas 360° y Test Summary Report.
684
691
 
685
692
  ---
686
693
 
687
- ### F3.1: Seleccionar Diseño a Registrar
694
+ ### F3.1: Feature Selection (Interactivo)
688
695
 
689
- **Buscar diseños disponibles:**
690
-
691
- 1. Listar todas las subcarpetas en `{implementation_artifacts}/quality-process/diseno/` con patrón `test-design-*`
692
- 2. Para cada carpeta encontrada, verificar que existe `test-design.md` en su raíz
693
- 3. Ordenar por nombre descendente (el timestamp garantiza orden cronológico — más reciente primero)
696
+ **Capture feature_id parameter** si fue provisto en los argumentos del comando.
694
697
 
695
- **Mostrar lista al usuario:**
698
+ 1. **Cargar el registro de features:**
699
+ - Leer: `{implementation_artifacts}/feature-status.yaml`
700
+ - Parsear YAML para extraer todos los features: `[{id, epic_source, status, last_update}, ...]`
696
701
 
697
- ```
698
- 📁 Diseños de prueba disponibles:
702
+ 2. **Si `feature_id` fue provisto como parámetro:**
703
+ - Validar que existe en el registro; si no, listar IDs disponibles y detener
704
+ - `filtered_features = [ese feature]`
705
+ - Notificar: `✅ Feature seleccionado por parámetro: {feature_id}`
706
+ - Ir a F3.2
699
707
 
700
- 1. test-design-YYYY-MM-DD-HHmmss/ ← más reciente
701
- • test-design.md ✅
702
- • test-cases.csv ✅
708
+ 3. **Si no se proveyó parámetro, preguntar al usuario:**
703
709
 
704
- 2. test-design-YYYY-MM-DD-HHmmss/
705
- ...
706
- ```
710
+ Mostrar features disponibles:
711
+ ```
712
+ 📋 Features disponibles en el proyecto:
707
713
 
708
- Si solo hay uno, seleccionarlo automáticamente y notificar:
709
- ```
710
- ✅ Diseño seleccionado automáticamente (único disponible):
711
- {implementation_artifacts}/quality-process/diseno/test-design-YYYY-MM-DD-HHmmss/
712
- ```
714
+ {por cada feature:
715
+ " • {feature.id} [{feature.status}] → {feature.epic_source}"
716
+ }
717
+ ```
713
718
 
714
- Si hay más de uno, preguntar al usuario:
715
- ```json
716
- {
717
- "questions": [
718
- {
719
- "question": "¿Qué diseño deseas registrar en AgileTest?",
720
- "header": "Selección de Diseño — Fase 3 Registro AgileTest",
721
- "multiSelect": false,
722
- "options": [
723
- { "label": "test-design-YYYY-MM-DD-HHmmss (más reciente)", "description": "N TCs — generado el DD/MM/YYYY" },
724
- { "label": "test-design-YYYY-MM-DD-HHmmss", "description": "N TCs — generado el DD/MM/YYYY" }
725
- ]
726
- }
727
- ]
728
- }
729
- ```
719
+ Usar AskUserQuestion:
720
+ ```json
721
+ {
722
+ "questions": [
723
+ {
724
+ "question": "¿Qué features deseas analizar?",
725
+ "header": "Selección de Features — Fase 3 Diseño",
726
+ "multiSelect": false,
727
+ "options": [
728
+ {
729
+ "label": "Todos los features",
730
+ "description": "Procesar todos los features del registro"
731
+ },
732
+ {
733
+ "label": "Seleccionar features específicos",
734
+ "description": "Elegir uno o más features por ID"
735
+ }
736
+ ]
737
+ }
738
+ ]
739
+ }
740
+ ```
730
741
 
731
- **Almacenar:**
732
- - `selected_design_folder` ruta absoluta a la carpeta seleccionada
733
- - `selected_test_design_path` `{selected_design_folder}/test-design.md`
742
+ **Si "Todos los features":**
743
+ - `filtered_features = all_features`
744
+ - Notificar: `✅ Se procesarán todos los features ({count} features)`
734
745
 
735
- **Leer `test-design.md` y mostrar resumen rápido:**
746
+ **Si "Seleccionar features específicos":**
747
+ - Si ≤ 4 features: usar AskUserQuestion multiSelect con una opción por feature
748
+ - Si > 4 features: pedir vía texto: "Ingresa los IDs separados por comas (ej: feature-1,feature-3):"
749
+ - Validar cada ID contra el registro
750
+ - `filtered_features = features encontrados`
751
+ - Notificar:
752
+ ```
753
+ ✅ Features seleccionados ({count}):
754
+ {por cada feature en filtered_features:
755
+ " • {feature.id} → {feature.epic_source}"
756
+ }
757
+ ```
736
758
 
737
- ```
738
- 📋 Diseño seleccionado:
739
- • Archivo: {ruta relativa}/test-design.md
740
- • Features: [extraer conteo de secciones ## F# del documento]
741
- • Stories BL: [extraer de Sección I — Gatekeeper]
742
- • Test Cases: [extraer de Sección IV — Matriz 360°]
743
- • CSV: test-cases.csv — [N filas]
744
- ```
759
+ 4. Almacenar `filtered_features` en memoria.
745
760
 
746
761
  ---
747
762
 
748
- ### F3.1b: Seleccionar Instancia Jira
763
+ ### F3.2: Automatic Data Loading (Zero User Interaction)
749
764
 
750
- **Cargar opciones:**
765
+ **CARGAR TODOS LOS INPUTS AUTOMÁTICAMENTE:**
751
766
 
752
- Usar la herramienta **Read** sobre `{project-root}/.claude/commands/get-features/oauth-config.json`.
767
+ 1. **INPUT 1 - PROYECTO:**
768
+ - Cargar desde config: `{project_name}`
769
+ - Almacenar como: `input_proyecto`
753
770
 
754
- - Si no existe la única opción disponible es "Otra instancia".
755
- - Si existe → parsear `instances[]` (campos: `name`, `url`, `id`).
771
+ 2. **INPUT 2 - FEATURES / HISTORIAS DE USUARIO:**
772
+ - Usar `filtered_features` de F3.1
773
+ - Por cada feature, leer su archivo `epic_source` y concatenar contenido
774
+ - Almacenar contenido combinado como: `input_epicas`
756
775
 
757
- **Presentar AskUserQuestion opciones del array + "Otra instancia" al final:**
776
+ 3. **INPUT 3 - METAS DE NEGOCIO (PRD):**
777
+ - Buscar en `{planning_artifacts}/`: `prd.md`, `PRD.md`, `product-requirements.md` o similar
778
+ - Si encontrado: leer y almacenar como `input_metas`
779
+ - Si no encontrado: extraer metas de negocio de los archivos epic_source → `input_metas`
780
+
781
+ 4. **INPUT 4 - STACK TECNOLÓGICO:**
782
+ - Cargar desde: `{project-root}/_siesa-agents/bmm/data/company-standards/technology-stack.md`
783
+ - Almacenar como: `input_stack`
784
+
785
+ 5. **INPUT 5 - PLAN DE PRUEBAS (Fase 1 — Planeación):**
786
+ - Buscar la carpeta más reciente en `{implementation_artifacts}/quality-process/planeacion/`:
787
+ - Listar todas las subcarpetas con patrón `test-plan-*`
788
+ - Ordenar por nombre descendente (el timestamp garantiza el orden cronológico)
789
+ - Tomar la primera → es la ejecución más reciente
790
+ - Si encontrada: leer `test-plan.md` → almacenar en `input_test_plan`
791
+ - Si no encontrada: `input_test_plan = null`
792
+
793
+ **Notificar al usuario:**
758
794
 
759
795
  ```
760
- Por cada entrada en instances[]:
761
- label: "{entry.name} — {entry.url}"
762
- description: "cloud_id: {entry.id}"
796
+ 🎯 BMAD V7.8 Fase 3: Diseño de Pruebas
763
797
 
764
- Última opción fija:
765
- label: "Otra instancia"
766
- description: "Ingresa la URL base manualmente"
798
+ Iniciando análisis automático...
799
+
800
+ 📋 Datos cargados:
801
+ • Proyecto: {input_proyecto}
802
+ • Features registry: {implementation_artifacts}/feature-status.yaml
803
+ • Features seleccionados: [lista de feature IDs]
804
+ • PRD: [ruta encontrada o "extraído de epic_source files"]
805
+ • Stack Tecnológico: _siesa-agents/bmm/data/company-standards/technology-stack.md
806
+ • Plan de Pruebas (Fase 1): [ruta encontrada o "No encontrado — se continuará sin ese contexto"]
807
+
808
+ 🚀 Ejecutando la Fase 0 (interactiva) + las 4 fases de análisis BMAD V7.8...
767
809
  ```
768
810
 
769
- - Si selecciona una entrada del array → `jira_base_url` = `entry.url`, `instancia_es_otra` = false
770
- - Si selecciona "Otra instancia" → `jira_base_url` = null, `instancia_es_otra` = true
811
+ ---
771
812
 
772
- **Almacenar:** `jira_base_url`, `instancia_es_otra`
813
+ ### F3.3: Load and Execute Megaprompt
814
+
815
+ 1. **Cargar el Megaprompt:**
816
+ - Leer el archivo completo: `{workflow_root}/prompts/prompt_design_test.md`
817
+ - Este prompt transforma al agente en Principal QA Architect
818
+
819
+ 2. **Inyectar inputs:**
820
+ Reemplazar la sección `[INPUT]` del prompt:
821
+ ```
822
+ # [INPUT]:
823
+ - **PROYECTO**: {input_proyecto}
824
+ - **ÉPICAS / HISTORIAS DE USUARIO**: {input_epicas}
825
+ - **METAS DE NEGOCIO (PRD)**: {input_metas}
826
+ - **STACK TECNOLÓGICO**: {input_stack}
827
+ - **PLAN DE PRUEBAS (contexto)**: {input_test_plan}
828
+ ```
829
+
830
+ 3. **Ejecutar la FASE 0 (interactiva) y luego las 4 FASES de diseño:**
831
+
832
+ El megaprompt V7.8 inicia con una **Fase 0 interactiva obligatoria** que pregunta al
833
+ usuario (vía AskUserQuestion o texto) y debe completarse ANTES de generar casos:
834
+ - **Modo de ejecución:** `feature` (un feature aislado) o `completo` (integración entre features).
835
+ - **Validación de congruencia modo-features (RO-8):** los features en scope son los
836
+ seleccionados en F3.1. Si el modo no es congruente con su número, el prompt resuelve
837
+ con el usuario antes de seguir.
838
+ - **Tipo de interfaz** (`con frontend` / `sin frontend`) — solo en Modo Feature; define
839
+ si los casos se redactan en lenguaje de UI o de API.
840
+ - **Batching por macro-dominios (RO-7):** en Modo Completo con > 4 features, el prompt
841
+ descompone en cadenas de flujo (máx. 4 features por batch) y ofrece la estrategia de
842
+ ejecución; esta corrida diseña el batch confirmado y reporta los pendientes en el TSR.
843
+
844
+ Tras la Fase 0, ejecutar secuencialmente:
845
+ - FASE 1: GATEKEEPER GRANULAR Y LIMPIEZA DE BACKLOG
846
+ - FASE 2: EL ESCALÓN DE CRITERIOS (FAC) en Gherkin (etiquetados por nivel)
847
+ - FASE 3: DETECCIÓN DE PUNTOS CIEGOS (Simulación Universal)
848
+ - FASE 4: INGENIERÍA DE DISEÑO (ISO 29119-4), distribución por niveles
849
+ (FU/INT/INT-X/E2E/E2E-X/REG/EC) y CALCULADORA DE RIESGO
850
+
851
+ **Generar outputs en FORMATO EXACTO V7.8 (el parser de la Fase 5 y el exportador CSV dependen de esta estructura):**
852
+ - I. REPORTE DEL GATEKEEPER (GRANULAR) — tabla de 5 columnas (`ID Historia | Nombre/Épica | Feature Asociado | Clasificación | Justificación`)
853
+ - II. DEFINICIÓN DE FEATURES Y CRITERIOS MAESTROS (FAC) EN GHERKIN
854
+ - III. PUNTOS CIEGOS DETECTADOS POR FEATURE
855
+ - IV. DEPENDENCIAS ENTRE FEATURES *(solo Modo Completo)*
856
+ - V. MATRIZ INTEGRAL DE PRUEBAS (DISEÑO 360°) — tabla única de **13 columnas**
857
+ (`ID | Feature | Épicas Asociadas | Modo | Nivel | Tipo Interfaz | Técnica | Escenario | Precondiciones | Pasos | Resultado Esperado | Riesgo (IxP) | Prioridad`),
858
+ IDs `[FEATURE_CODE]-[NIVEL]-[NNN]` (ej. `VNT-FU-001`, `INV-INTX-001`)
859
+ - VI. INFORME TSR (TEST SUMMARY REPORT)
860
+ - APÉNDICE: MATRIZ DE TRAZABILIDAD
773
861
 
774
862
  ---
775
863
 
776
- ### F3.1c: Seleccionar Proyecto Jira
864
+ ### F3.4: Save Output
777
865
 
778
- **Cargar opciones** (archivo ya leído en F3.1b):
866
+ **Crear estructura de carpeta con timestamp:**
779
867
 
780
- Parsear `projects[]` del mismo JSON (campos: `key`, `name`).
868
+ 1. Generar timestamp: `YYYY-MM-DD-HHmmss` (ej: `2026-03-25-143052`)
869
+ 2. Crear estructura de carpetas:
870
+ - Raíz: `{implementation_artifacts}/quality-process/diseno/test-design-YYYY-MM-DD-HHmmss/`
871
+ - Shards: `{implementation_artifacts}/quality-process/diseno/test-design-YYYY-MM-DD-HHmmss/shards/`
872
+ 3. Guardar los 5 documentos dentro de la subcarpeta `shards/`:
781
873
 
782
- **Presentar AskUserQuestion opciones del array + "Otro proyecto" al final:**
874
+ **Documento 1:** `shards/test-design-phase1-gatekeeper.md` (Sección I Gatekeeper)
875
+ **Documento 2:** `shards/test-design-phase2-fac.md` (Sección II — Features y FAC en Gherkin)
876
+ **Documento 3:** `shards/test-design-phase3-blind-spots.md` (Sección III — Puntos Ciegos + Sección IV — Dependencias entre Features)
877
+ **Documento 4:** `shards/test-design-phase4-test-matrix.md` (Sección V — Matriz Integral 360°)
878
+ **Documento 5:** `shards/test-design-phase5-tsr.md` (Sección VI — TSR + Apéndice de Trazabilidad)
783
879
 
784
- ```
785
- Por cada entrada en projects[]:
786
- label: "{entry.key} — {entry.name}"
787
- description: ""
880
+ > **Nota:** los 5 shards se concatenan con `merge_test_design.py` en orden, produciendo el `test-design.md` con las secciones I→VI + Apéndice. El parser de la Fase 5 ancla la matriz en `## V. MATRIZ INTEGRAL` (corte en `## VI`).
788
881
 
789
- Última opción fija:
790
- label: "Otro proyecto"
791
- description: "Ingresa el project key manualmente"
882
+ **Frontmatter para todos los documentos:**
883
+ ```yaml
884
+ ---
885
+ workflow: quality-process
886
+ phase: diseno
887
+ version: 1.0.0
888
+ methodology: BMAD V7.8 MegaPrompt
889
+ generated_date: [ISO 8601 date]
890
+ project_name: {input_proyecto}
891
+ input_documents:
892
+ epics: [ruta(s) relativa(s)]
893
+ prd: [ruta relativa o null]
894
+ technology_stack: _siesa-agents/bmm/data/company-standards/technology-stack.md
895
+ test_plan: [ruta relativa o null]
896
+ ---
792
897
  ```
793
898
 
794
- - Si selecciona una entrada del array `jira_project_key` = `entry.key`, `proyecto_es_otro` = false
795
- - Si selecciona "Otro proyecto" → `jira_project_key` = null, `proyecto_es_otro` = true
899
+ **Exportar casos de prueba a CSV (Siesa FT-SD-007 v5.0):**
796
900
 
797
- **Almacenar:** `jira_project_key`, `proyecto_es_otro`
901
+ Después de guardar `shards/test-design-phase4-test-matrix.md` (Sección V — Matriz):
798
902
 
799
- ---
903
+ 1. Leer el contenido completo del archivo generado
904
+ 2. Derivar el `ID Épica` de cada caso desde la columna `Feature` (o el prefijo del `ID`,
905
+ ej. `VNT` en `VNT-FU-001`). En V7.8 la matriz es una tabla única (sin headers `## F#`).
906
+ 3. Parsear todas las filas de la matriz cuyo `ID` matchee `^[A-Z0-9]{2,}-[A-Z0-9-]+-\d+$`,
907
+ extrayendo las **13 columnas** de la matriz V7.8.
908
+ 4. Mapear a las 13 columnas del formato Siesa CSV:
800
909
 
801
- ### F3.1d: Resolver valores manuales (solo si aplica)
910
+ | Columna Matriz (V7.8) | Columna CSV |
911
+ |---|---|
912
+ | `Feature` (o prefijo del `ID`) | `ID Épica` |
913
+ | `ID` | `ID Caso de Prueba` |
914
+ | `Escenario` | `Título` |
915
+ | `Feature` + `: ` + `Escenario` | `Descripción Completa` |
916
+ | `Precondiciones` | `Precondiciones` |
917
+ | `Pasos` | `Pasos de Ejecución` |
918
+ | `Resultado Esperado` | `Resultados Esperados` |
919
+ | `Nivel` | `Tipo prueba` |
920
+ | _(vacío)_ | `Fecha Ejecución` |
921
+ | `"Not Started"` | `Estado` |
922
+ | _(vacío)_ | `ID Defecto` |
923
+ | _(vacío)_ | `Descripción Fallo` |
924
+ | `Modo: [Modo] \| Nivel: [Nivel] \| Interfaz: [Tipo Interfaz] \| Técnica: [Técnica] \| Risk: [Riesgo] \| Priority: [Prioridad]` | `Notas` |
802
925
 
803
- **Evaluar qué falta:**
926
+ 5. **🚨 CRÍTICO — Compatibilidad Windows CSV:**
927
+ - ✅ Usar **Write tool ONLY** — NUNCA bash, cat, echo, sed, awk
928
+ - ✅ Construir el **string CSV completo en memoria** y luego llamar Write una vez
929
+ - ✅ Envolver **TODOS los campos** en comillas dobles
930
+ - ✅ Escapar comillas internas duplicándolas: `"` → `""`
931
+ - ✅ Encoding: UTF-8
804
932
 
805
- - Si `instancia_es_otra` = false Y `proyecto_es_otro` = false → saltar este paso, ir a F3.2.
806
- - Si `instancia_es_otra` = true O `proyecto_es_otro` = true → hacer UNA SOLA pregunta combinada.
933
+ 6. Guardar como: `{implementation_artifacts}/quality-process/diseno/test-design-YYYY-MM-DD-HHmmss/test-cases.csv` (en la raíz, NO en shards/)
807
934
 
808
- **Una única pregunta que pide solo lo que falta:**
935
+ **Exportar el diseño completo a YAML estructurado:**
809
936
 
810
- - Solo falta instancia → `"Ingresa la URL base de Jira (ej: https://miempresa.atlassian.net)"`
811
- - Solo falta proyecto `"Ingresa el Project Key (ej: CON, CLOUD, RUTA)"`
812
- - Faltan ambos → `"Ingresa la URL base de Jira y el Project Key (ej: https://miempresa.atlassian.net CLOUD)"`
937
+ Además del `test-design.md` (narrativo) y el `test-cases.csv` (casos tabulares), generar un
938
+ `test-design.yml` que represente **todo el diseño en formato datos** (machine-readable).
813
939
 
814
- Parsear la respuesta y almacenar en `jira_base_url` y/o `jira_project_key` según corresponda.
940
+ > **🚨 OBLIGATORIO — también (y especialmente) en Modo Completo / batch.** El `test-design.yml`
941
+ > NO es opcional: es el insumo directo de AgileTest (Fase 5), del Motor de Datos (Fase 4) y del
942
+ > Agente Ejecutor E2E (Fase 6). Debe generarse para el batch diseñado en esta corrida, sin importar
943
+ > cuántos casos tenga la matriz.
944
+ >
945
+ > **Fuente de verdad = los shards ya guardados, NO la memoria.** En corridas largas (Modo Completo
946
+ > con varios features) la matriz puede haber salido del contexto. Para construir el YAML de forma
947
+ > robusta, **re-lee los archivos recién escritos** en `shards/` — sobre todo
948
+ > `shards/test-design-phase4-test-matrix.md` (Sección V — Matriz) y los demás shards (I, II/III, VI)
949
+ > — y serialízalos. Así el `.yml` no depende de que el diseño siga "en memoria".
815
950
 
816
- **No hacer preguntas adicionales después de este paso.**
951
+ Serializar a YAML con esta estructura:
817
952
 
818
- ---
953
+ ```yaml
954
+ metadata:
955
+ workflow: quality-process
956
+ phase: diseno
957
+ methodology: BMAD V7.8 MegaPrompt
958
+ generated_date: <ISO 8601>
959
+ project_name: {input_proyecto}
960
+ mode: feature | completo
961
+ interface_type: con-frontend | sin-frontend | null # null si modo completo
962
+ gatekeeper: # Sección I — clasificación de historias
963
+ - story_id: <ID Historia>
964
+ name: <Nombre/Épica>
965
+ feature: <Feature Asociado>
966
+ classification: <Clasificación>
967
+ justification: <Justificación>
968
+ features: # Sección II + III
969
+ - code: <FEATURE_CODE> # ej. VNT
970
+ name: <nombre del feature>
971
+ epics: [<EPIC-...>, ...]
972
+ fac: # Criterios maestros en Gherkin
973
+ - id: <FEATURE_CODE>-FAC-01
974
+ gherkin: |
975
+ Given ...
976
+ When ...
977
+ Then ...
978
+ blind_spots: # Puntos ciegos detectados
979
+ - archetype: <arquetipo>
980
+ description: <descripción>
981
+ dependencies: # Sección IV — solo Modo Completo; [] si feature
982
+ - from: <FEATURE_CODE>
983
+ to: <FEATURE_CODE>
984
+ description: <descripción de la dependencia>
985
+ test_matrix: # Sección V — Matriz Integral 360° (13 columnas)
986
+ - id: <FEATURE_CODE>-<NIVEL>-<NNN> # ej. VNT-FU-001
987
+ feature: <FEATURE_CODE>
988
+ epics: [<EPIC-...>, ...]
989
+ mode: <Modo>
990
+ level: <Nivel> # FU | INT | INT-X | E2E | E2E-X | REG | EC
991
+ interface_type: <Tipo Interfaz>
992
+ technique: <Técnica>
993
+ scenario: <Escenario>
994
+ preconditions: <Precondiciones>
995
+ steps: # ARRAY de pasos — 1 paso = 1 acción atómica (NO agrupar)
996
+ - paso: 1
997
+ accion: <acción concreta del paso>
998
+ resultado: <resultado verificable de ese paso>
999
+ datos: <datos usados en ese paso — insumo del Motor de Datos>
1000
+ - paso: 2
1001
+ accion: <...>
1002
+ resultado: <...>
1003
+ datos: <...>
1004
+ expected_result: <Resultado Esperado>
1005
+ risk: <Riesgo IxP> # ej. "4x3=12"
1006
+ priority: <Prioridad> # P0 | P1 | P2 | P3
1007
+ tsr: # Sección VI — Test Summary Report
1008
+ summary: <resumen ejecutivo>
1009
+ metrics:
1010
+ total_cases: <N>
1011
+ p0: <N>
1012
+ p1: <N>
1013
+ p2: <N>
1014
+ p3: <N>
1015
+ critical_risk_coverage_pct: <N>
1016
+ pending_batches: [<...>] # batches no diseñados en esta corrida (Modo Completo); [] si ninguno
1017
+ traceability: # Apéndice — Matriz de Trazabilidad
1018
+ - requirement: <ID/criterio>
1019
+ cases: [<ID Caso>, ...]
1020
+ ```
1021
+
1022
+ **Reglas de serialización:**
1023
+ - ✅ Usar **Write tool ONLY** (encoding UTF-8). NUNCA bash, cat, echo, sed, awk.
1024
+ - ✅ Construir el string YAML completo en memoria y llamar Write una sola vez.
1025
+ - ✅ Los valores con `:`, `#`, comillas o saltos de línea deben ir entre comillas dobles o como
1026
+ bloque literal (`|`).
1027
+ - ✅ **`steps` es un ARRAY de objetos** (`paso`, `accion`, `resultado`, `datos`), NO un string.
1028
+ Regla: **1 paso = 1 acción atómica** — prohibido agrupar múltiples acciones en un solo paso.
1029
+ El campo `datos` por paso es el insumo que el Motor de Datos (Fase 4) lee para generar seeds,
1030
+ y el Agente Ejecutor E2E usa los pasos para generar el `.spec.ts` de Playwright.
1031
+ - ✅ Las claves `mode`, `interface_type`, `dependencies` deben ser congruentes con la Fase 0:
1032
+ en Modo Feature → `dependencies: []`; en Modo Completo → `interface_type: null`.
1033
+ - ✅ El `test_matrix` debe tener **una entrada por cada fila** de la matriz (mismo conteo que el CSV).
1034
+ El array `steps` de cada caso debe reflejar exactamente los pasos de la columna `Pasos` del Markdown.
1035
+
1036
+ Guardar como: `{implementation_artifacts}/quality-process/diseno/test-design-YYYY-MM-DD-HHmmss/test-design.yml` (en la raíz, junto a `test-cases.csv`, NO en shards/)
1037
+
1038
+ **Verificación obligatoria (guard) — no completar la Fase 3 sin el YAML:**
1039
+
1040
+ Tras el Write, **verificar que `test-design.yml` exista y no esté vacío** (y que su `test_matrix`
1041
+ tenga el mismo número de entradas que filas tiene la matriz del CSV/Markdown):
1042
+
1043
+ - Si el archivo **no existe, quedó vacío o truncado** (caso típico en batch grande): **regenerarlo
1044
+ re-leyendo los shards** (`shards/test-design-phase4-test-matrix.md` + I, II/III, VI) y volver a
1045
+ escribirlo. Repetir hasta que el `.yml` esté completo.
1046
+ - **No avanzar a F3.5** ni reportar la fase como completada mientras falte el `test-design.yml`.
819
1047
 
820
- ### F3.2: Validar Credenciales (Pre-flight)
1048
+ ---
821
1049
 
822
- Antes de ejecutar el dry-run, verificar que las credenciales están disponibles.
823
- El script las busca en este orden de prioridad:
824
- 1. `_siesa-agents/bmm/config.secrets.yaml` (archivo local gitignoreado — forma recomendada)
825
- 2. Variables de entorno `JIRA_API_TOKEN`, `AGILETEST_CLIENT_ID`, `AGILETEST_CLIENT_SECRET`
1050
+ ### F3.5: Completion
826
1051
 
827
- **Leer `_siesa-agents/bmm/config.secrets.yaml` y verificar que los tokens no estén vacíos:**
1052
+ Presentar al usuario:
828
1053
 
829
1054
  ```
830
- 📋 Estado de credenciales en _siesa-agents/bmm/config.secrets.yaml:
831
- jira_api_token: [configurado ✅ | vacío ⚠️]
832
- agiletest_client_id: [configurado ✅ | vacío ⚠️]
833
- agiletest_client_secret: [configurado ✅ | vacío ⚠️]
834
- ```
1055
+ FASE 3 DISEÑO COMPLETADA
1056
+
1057
+ 📁 Carpeta: {implementation_artifacts}/quality-process/diseno/test-design-YYYY-MM-DD-HHmmss/
835
1058
 
836
- **Si todos están configurados:** continuar a F3.3.
1059
+ 📄 Archivos en raíz:
1060
+ • test-design.md — Documento unificado (phases 1–5)
1061
+ • test-design.yml — Diseño completo estructurado (machine-readable)
1062
+ • test-cases.csv — Casos exportados (Siesa FT-SD-007 v5.0)
837
1063
 
838
- **Si alguno está vacío**, mostrar instrucciones y DETENER:
1064
+ 📂 shards/ (documentos individuales por fase):
1065
+ • test-design-phase1-gatekeeper.md
1066
+ • test-design-phase2-fac.md
1067
+ • test-design-phase3-blind-spots.md
1068
+ • test-design-phase4-test-matrix.md
1069
+ • test-design-phase5-tsr.md
839
1070
 
1071
+ 📊 Métricas:
1072
+ • Features identificados: [count]
1073
+ • Casos de prueba totales: [count]
1074
+ • Casos P0 (Críticos): [count]
1075
+ • Cobertura de riesgos críticos: [%]%
840
1076
  ```
841
- ⚠️ Faltan credenciales en _siesa-agents/bmm/config.secrets.yaml
842
1077
 
843
- Abre el archivo y completa los valores:
1078
+ **⚠️ El workflow termina aquí. El equipo de QA debe revisar y validar los documentos generados.**
844
1079
 
845
- agiletest:
846
- jira_api_token: "tu-token-aqui"
847
- agiletest_client_id: "tu-client-id"
848
- agiletest_client_secret: "tu-client-secret"
1080
+ ---
849
1081
 
850
- Dónde obtenerlos:
851
- • jira_api_token: Jira → Profile → Security → API tokens → Create
852
- • agiletest_client_id/secret: AgileTest plugin en Jira → Settings → API Keys
1082
+ ### F3.6: Merge Documents (Automatic)
853
1083
 
854
- El archivo ya está en .gitignore es seguro guardar los tokens ahí.
855
- Una vez completados, vuelve a ejecutar la Fase 3.
1084
+ Inmediatamente después de guardar los documentos en F3.4, ejecutar el script de merge usando la Bash tool:
1085
+
1086
+ ```bash
1087
+ python {project-root}/_siesa-agents/scripts/merge_test_design.py "{carpeta_generada}"
856
1088
  ```
857
1089
 
1090
+ Donde `{carpeta_generada}` es la ruta absoluta de la carpeta creada en F3.4 (ej: `{implementation_artifacts}/quality-process/diseno/test-design-YYYY-MM-DD-HHmmss/`).
1091
+
1092
+ El script lee los 5 documentos desde `{carpeta_generada}/shards/` y genera `test-design.md` en la raíz de `{carpeta_generada}`.
1093
+
1094
+ **No mostrar output técnico del script al usuario.**
1095
+
1096
+ ---
1097
+
1098
+ *(Note: `workflow_root` es `{project-root}/_siesa-agents/bmm/workflows/3-solutioning/quality-process`)*
1099
+
858
1100
  ---
859
1101
 
860
- ### F3.2b: Resolver agiletest_project_id
1102
+ ## FASE 4 — GENERACIÓN DE DATOS QA
1103
+
1104
+ ### Objetivo
861
1105
 
862
- **Verificar si ya está configurado:**
1106
+ Provisionar en la base de datos real (vía MCP) los datos sintéticos que los casos de prueba diseñados en la Fase 3 necesitan para poder ejecutarse. Esta fase **infiere y confirma el negocio** con el usuario, **reutiliza los datos QA ya existentes** antes de generar nada, inserta únicamente lo faltante respetando integridad referencial y tipos reales, y entrega **3 artefactos en disco**: `test-data.md` (relación caso→datos agrupada por seed, orientada a Playwright), `seed.sql` idempotente y `rollback.sql` acotado a la corrida.
863
1107
 
864
- Leer `_siesa-agents/bmm/config.secrets.yaml`. Si `agiletest_project_id` tiene un valor no vacío, mostrar:
865
- ```
866
- ✅ agiletest_project_id ya configurado: {valor} — omitiendo resolución.
867
- ```
868
- Y continuar a F3.3.
1108
+ **Principio:** "Reutilizar antes de generar. No se inserta nada sin aprobación humana. Es válido y esperado que una corrida termine con **0 inserciones** si toda la cobertura ya existe — pero aun así se escribe `test-data.md`."
869
1109
 
870
- **Si está vacío:** resolver automáticamente vía la API de Jira usando Bash tool:
1110
+ **Fuente de verdad:** El protocolo de 7 fases vive en la skill `sa-qa-data-generator`. Esta fase orquesta esa skill dentro del ciclo de calidad para que el QA no tenga que invocarla como un comando aparte — el insumo es el `test-cases.csv` que la propia Fase 3 produjo.
871
1111
 
872
- ```bash
873
- python -c "
874
- import urllib.request, base64, json, re, sys
1112
+ ---
875
1113
 
876
- secrets_path = '{project-root}/_siesa-agents/bmm/config.secrets.yaml'
877
- with open(secrets_path, encoding='utf-8') as f:
878
- content = f.read()
1114
+ ### F4.1: Seleccionar Diseño Fuente (CSV)
879
1115
 
880
- def extract(key, text):
881
- m = re.search(rf'^\s+{key}:\s*[\"\'"]?(.+?)[\"\'"]?\s*$', text, re.MULTILINE)
882
- return m.group(1).strip().strip('\"').strip(\"'\") if m else ''
1116
+ **Buscar diseños disponibles:**
883
1117
 
884
- email = extract('jira_user_email', content)
885
- token = extract('jira_api_token', content)
886
- base = '{jira_base_url}'
887
- key = '{jira_project_key}'
1118
+ 1. Listar todas las subcarpetas en `{implementation_artifacts}/quality-process/diseno/` con patrón `test-design-*`
1119
+ 2. Para cada carpeta encontrada, verificar que existe `test-cases.csv` en su raíz
1120
+ 3. Ordenar por nombre descendente — el timestamp garantiza orden cronológico (más reciente primero)
888
1121
 
889
- creds = base64.b64encode(f'{email}:{token}'.encode()).decode()
890
- req = urllib.request.Request(
891
- f'{base}/rest/api/3/project/{key}',
892
- headers={'Authorization': f'Basic {creds}', 'Accept': 'application/json'}
893
- )
894
- with urllib.request.urlopen(req, timeout=10) as r:
895
- data = json.loads(r.read().decode())
1122
+ **Si solo hay uno**, seleccionarlo automáticamente:
1123
+ ```
1124
+ ✅ CSV seleccionado automáticamente:
1125
+ {implementation_artifacts}/quality-process/diseno/test-design-YYYY-MM-DD-HHmmss/test-cases.csv
1126
+ ```
896
1127
 
897
- project_id = str(data['id'])
898
- print(f'PROJECT_ID={project_id}')
899
- "
1128
+ **Si hay más de uno**, preguntar al usuario:
1129
+ ```json
1130
+ {
1131
+ "questions": [
1132
+ {
1133
+ "question": "¿De qué diseño quieres generar los datos de prueba?",
1134
+ "header": "Selección de Diseño — Fase 4 Generación de Datos QA",
1135
+ "multiSelect": false,
1136
+ "options": [
1137
+ { "label": "test-design-YYYY-MM-DD-HHmmss (más reciente)", "description": "N TCs — generado el DD/MM/YYYY" },
1138
+ { "label": "test-design-YYYY-MM-DD-HHmmss", "description": "N TCs — generado el DD/MM/YYYY" }
1139
+ ]
1140
+ }
1141
+ ]
1142
+ }
900
1143
  ```
901
1144
 
902
- **Parsear la salida:** extraer el valor después de `PROJECT_ID=` almacenar en `resolved_project_id`.
1145
+ **Si no existe ningún `test-cases.csv`:** detener con mensaje:
1146
+ ```
1147
+ ❌ No se encontró ningún test-cases.csv en {implementation_artifacts}/quality-process/diseno/.
903
1148
 
904
- **Si la llamada falla:** mostrar el error y DETENER — no continuar sin el ID porque los pasos 4, 6 y 7 de AgileTest fallarán con HTTP 400.
1149
+ La Fase 4 requiere los casos de prueba generados por la Fase 3 Diseño.
1150
+ Ejecuta primero la Fase 3 y vuelve a intentar.
1151
+ ```
905
1152
 
906
- **Persistir en config.secrets.yaml usando Bash tool:**
1153
+ **Almacenar:**
1154
+ - `selected_csv_path` → ruta absoluta al `test-cases.csv` seleccionado
1155
+ - `selected_design_folder` → carpeta raíz del diseño seleccionado
907
1156
 
908
- ```bash
909
- python -c "
910
- import re
1157
+ Leer `test-cases.csv` y mostrar resumen rápido:
1158
+ ```
1159
+ 📋 CSV cargado:
1160
+ • Archivo: {ruta relativa}/test-cases.csv
1161
+ • Total TCs: [N filas descontando header]
1162
+ • Features: [lista de IDs de épica únicos extraídos de columna "ID Épica"]
1163
+ ```
911
1164
 
912
- path = '{project-root}/_siesa-agents/bmm/config.secrets.yaml'
913
- with open(path, encoding='utf-8') as f:
914
- content = f.read()
1165
+ ---
915
1166
 
916
- new_line = ' agiletest_project_id: \"{resolved_project_id}\"'
1167
+ ### F4.2: Verificar Conexión MCP de Base de Datos (Pre-flight)
917
1168
 
918
- if re.search(r'^\s+agiletest_project_id:', content, re.MULTILINE):
919
- content = re.sub(r'^\s+agiletest_project_id:.*$', new_line, content, flags=re.MULTILINE)
920
- else:
921
- content = re.sub(r'(agiletest:\n)', r'\1' + new_line + '\n', content)
1169
+ El agente de datos **no puede operar sin un MCP de base de datos conectado** (PostgreSQL o SQL Server). Sin él, cualquier dato generado sería inventado y causaría errores en cascada.
922
1170
 
923
- with open(path, 'w', encoding='utf-8') as f:
924
- f.write(content)
1171
+ 1. Detectar si hay disponible un MCP de BD (herramientas tipo `describe_table`, `get_dependencies`, `get_foreign_keys`, `read_data`, `insert_data`, o sus equivalentes SQL Server).
1172
+ 2. Hacer una verificación mínima no destructiva (ej. listar tablas o describir una tabla de catálogo conocida).
925
1173
 
926
- print('OK')
927
- "
1174
+ **Si hay conexión:** notificar y continuar a F4.3:
1175
+ ```
1176
+ ✅ MCP de base de datos detectado: {postgresql | mssql}
1177
+ Conexión verificada — listo para descubrir esquemas reales.
928
1178
  ```
929
1179
 
930
- **Confirmar al usuario:**
1180
+ **Si NO hay conexión**, mostrar instrucciones y DETENER:
931
1181
  ```
932
- agiletest_project_id resuelto y guardado: {resolved_project_id}
933
- (Proyecto {jira_project_key} en {jira_base_url})
934
- Guardado en config.secrets.yaml no se volverá a resolver en próximas ejecuciones.
1182
+ ⚠️ No se detectó un MCP de base de datos conectado.
1183
+
1184
+ La Fase 4 necesita consultar el esquema real para generar datos válidos.
1185
+ Configura y conecta el MCP de tu motor antes de continuar:
1186
+
1187
+ • PostgreSQL / SQL Server: ver _siesa-agents/sa/mcp_database/
1188
+ • Provisionar esquema y permisos del usuario dev: skill `sa-onboard-db`
1189
+
1190
+ Una vez el MCP esté conectado, vuelve a ejecutar la Fase 4.
935
1191
  ```
936
1192
 
937
1193
  ---
938
1194
 
939
- ### F3.3: Dry-run Vista Previa Obligatoria
1195
+ ### F4.3: Cargar y Ejecutar el Protocolo del Agente de Datos
940
1196
 
941
- **Ejecutar dry-run usando Bash tool:**
1197
+ 1. **Cargar el protocolo completo** desde la skill (fuente de verdad):
1198
+ - Leer el archivo completo: `{project-root}/claude/skills/sa-qa-data-generator/SKILL.md`
1199
+ - Este protocolo transforma al agente en el motor de datos sintéticos para QA.
942
1200
 
943
- ```bash
944
- python {project-root}/_siesa-agents/scripts/bmad_to_agiletest.py \
945
- --input "{selected_test_design_path}" \
946
- --config "{project-root}/_bmad/bmm/config.yaml" \
947
- --jira-url "{jira_base_url}" \
948
- --project-key "{jira_project_key}" \
949
- --dry-run
950
- ```
1201
+ 2. **Inyectar el input:** el `Input: Test Case File` del protocolo es el `selected_csv_path` (ya cargado en F4.1). No pedir el archivo al usuario — ya está resuelto por el flujo.
951
1202
 
952
- **Parsear la salida y presentar al usuario en tabla ordenada:**
1203
+ 3. **Ejecutar las Fases 1–4 del protocolo** (sin inserción todavía):
1204
+ - PHASE 1 — Lectura y análisis de casos (clasificación POSITIVE / EDGE / NEGATIVE)
1205
+ - **PHASE 1.A — Inferencia y confirmación del negocio (GATE):** deducir el negocio/dominio
1206
+ al que apuntan los casos, presentarlo al usuario y **esperar confirmación** antes de seguir.
1207
+ El negocio confirmado encabeza `test-data.md` y nombra la carpeta de salida (F4.6).
1208
+ - PHASE 2 — Descubrimiento de esquema vía MCP (NUNCA asumir columnas/tipos)
1209
+ - PHASE 3 — Construcción del árbol de entidades (orden de inserción)
1210
+ - PHASE 4 — Verificación de datos existentes y matching caso-por-caso (REUSABLE / PARTIAL / MISSING)
953
1211
 
954
- ```
955
- 📊 Vista previa — Lo que se creará en Jira/AgileTest:
1212
+ Notificar al usuario durante la ejecución:
1213
+ ```
1214
+ ⚙️ Agente de Datos QA — analizando casos contra la BD real:
1215
+ • PHASE 1: Lectura y clasificación de casos
1216
+ • PHASE 1.A: Inferencia del negocio (requiere confirmación del usuario)
1217
+ • PHASE 2: Descubrimiento de esquemas (MCP)
1218
+ • PHASE 3: Árbol de entidades y orden de inserción
1219
+ • PHASE 4: Matching contra datos QA existentes (reutilizar antes de generar)
1220
+ ```
956
1221
 
957
- ┌──────────────────────────┬──────────┐
958
- Artefacto │ Cantidad
959
- ├──────────────────────────┼──────────┤
960
- │ Requisitos (Stories BL) │ N │
961
- │ Test Cases │ N │
962
- │ • P0 (Muy Alta) │ N │
963
- │ • P1 (Alta) │ N │
964
- │ • P2 (Media) │ N │
965
- │ • P3 (Baja) │ N │
966
- │ Planes de Prueba (PPR) │ N │
967
- │ Planes de Ejecución (PEP)│ N │
968
- │ Links de trazabilidad │ ~N │
969
- │ Steps de prueba │ ~N │
970
- └──────────────────────────┴──────────┘
1222
+ > El GATE de PHASE 1.A es **no omisible**: si el usuario no confirma el negocio (o corrige),
1223
+ > no se continúa a PHASE 2.
971
1224
 
972
- 📋 Distribución por Feature:
973
- F1 — [Nombre]: N TCs
974
- F2 — [Nombre]: N TCs
975
- ...
1225
+ ---
976
1226
 
977
- 🎯 Proyecto Jira: {jira_project_key}
978
- ⏱️ Tiempo estimado: ~5 minutos
979
- ```
1227
+ ### F4.4: Gate de Aprobación Humana (OBLIGATORIO)
980
1228
 
981
- ---
1229
+ Este paso es **no omisible**. No se inserta ningún registro sin aprobación explícita.
982
1230
 
983
- ### F3.4: Gate de Aprobación Humana (OBLIGATORIO)
1231
+ Presentar el resultado del matching de PHASE 4:
1232
+ ```
1233
+ 📊 Matching de datos — Resumen
984
1234
 
985
- Este paso es **no omisible**. No se crea ningún issue sin aprobación explícita.
1235
+ Caso │ Categoría │ IDs reutilizables │ Datos a crear
1236
+ ────────────┼────────────┼─────────────────────────┼──────────────────
1237
+ TC-F1-001 │ REUSABLE │ invoices id=5001 │ —
1238
+ TC-F1-002 │ PARTIAL │ customers id=1001 │ invoice + detalle
1239
+ TC-F2-005 │ MISSING │ — │ customer+invoice+det
1240
+ ...
986
1241
 
987
- **Preguntar al usuario usando AskUserQuestion:**
1242
+ 🔢 Decisión: [N inserciones requeridas] | [0 inserciones — toda la cobertura ya existe]
1243
+ ```
1244
+
1245
+ **Si la decisión es "0 inserciones":**
1246
+ - No hay nada que aprobar. Saltar F4.5 e ir directo a F4.6 con el reporte 7.5 ("No se generaron datos nuevos"); se escribe **`test-data.md`** con todos los bloques en estado "reusado" y los IDs existentes a usar por caso (no se generan `seed.sql` ni `rollback.sql`).
988
1247
 
1248
+ **Si hay al menos un caso PARTIAL o MISSING**, preguntar:
989
1249
  ```json
990
1250
  {
991
1251
  "questions": [
992
1252
  {
993
- "question": "¿Apruebas la creación de estos N issues en Jira/AgileTest?",
994
- "header": "⚠️ Confirmación Requerida — Creación en AgileTest",
1253
+ "question": "¿Apruebas insertar los datos faltantes en la base de datos?",
1254
+ "header": "⚠️ Confirmación Requerida — Inserción de Datos QA",
995
1255
  "multiSelect": false,
996
1256
  "options": [
997
1257
  {
998
- "label": "✅ Aprobar y crear en AgileTest",
999
- "description": "Se crearán los N issues en el proyecto Jira. Esta acción es reversible (el script tiene modo --delete para limpiar)."
1258
+ "label": "✅ Aprobar e insertar",
1259
+ "description": "Se insertarán SOLO los datos faltantes (casos PARTIAL/MISSING) en el orden del árbol de entidades. Reversible vía el script de rollback que se generará."
1000
1260
  },
1001
1261
  {
1002
- "label": "🔍 Ver detalle de TCs antes de decidir",
1003
- "description": "Mostrar cada TC con sus pasos antes de aprobar"
1262
+ "label": "🔍 Ver detalle de inserciones primero",
1263
+ "description": "Mostrar tabla/registro a insertar por caso antes de aprobar"
1004
1264
  },
1005
1265
  {
1006
- "label": "❌ Cancelar — no crear nada",
1007
- "description": "Salir sin crear issues en Jira/AgileTest"
1266
+ "label": "❌ Cancelar — no insertar nada",
1267
+ "description": "Salir sin modificar la base de datos"
1008
1268
  }
1009
1269
  ]
1010
1270
  }
@@ -1012,697 +1272,760 @@ Este paso es **no omisible**. No se crea ningún issue sin aprobación explícit
1012
1272
  }
1013
1273
  ```
1014
1274
 
1015
- **Si "Ver detalle":** Ejecutar con `--detail` y regresar a este mismo gate:
1016
-
1017
- ```bash
1018
- python {project-root}/_siesa-agents/scripts/bmad_to_agiletest.py \
1019
- --input "{selected_test_design_path}" \
1020
- --config "{project-root}/_bmad/bmm/config.yaml" \
1021
- --jira-url "{jira_base_url}" \
1022
- --project-key "{jira_project_key}" \
1023
- --dry-run --detail
1024
- ```
1025
-
1026
- Mostrar el detalle y volver a presentar el gate de aprobación.
1275
+ **Si "Ver detalle":** mostrar el plan de inserción detallado (tabla, schema, registros) y volver a este gate.
1276
+ **Si "Cancelar":** notificar `❌ Operación cancelada. No se insertó ningún dato.` y terminar.
1277
+ **Si "Aprobar":** continuar a F4.5.
1027
1278
 
1028
- **Si "Cancelar":** Notificar `❌ Operación cancelada. No se creó ningún issue.` y terminar el workflow.
1279
+ ---
1029
1280
 
1030
- **Si "Aprobar":** Continuar a F3.5.
1281
+ ### F4.5: Generación e Inserción (PHASE 5–6 del protocolo)
1031
1282
 
1032
- ---
1283
+ Ejecutar únicamente para los casos PARTIAL/MISSING aprobados:
1033
1284
 
1034
- ### F3.5: Crear en AgileTest
1285
+ - PHASE 5 Generación de datos (tipos reales, columnas NOT NULL, FKs válidas, marcador `QA_`/`TEST_`/`[SYNTHETIC DATA]`, sin PII real). Asignar un **ID de corrida** común (`QA_<fecha>_<seq>`) a todos los registros para poder acotar el rollback.
1286
+ - PHASE 6 — Inserción en BD en orden estricto del árbol (raíz/catálogo → maestras → focales → detalle → SP/funciones) **y, en paralelo, escritura de `seed.sql`** que reproduce las mismas inserciones (transaccional, idempotente con `ON CONFLICT DO NOTHING` / `IF NOT EXISTS`, comentado por caso, ordenado padres→hijos). Se guarda en F4.6.
1035
1287
 
1036
- **Notificar inicio:**
1288
+ **Tras cada inserción:** verificar éxito. Si falla por FK/constraint/tipo: NO continuar con dependientes, diagnosticar re-consultando el esquema, corregir y reintentar; si no se resuelve, informar al usuario y detener.
1037
1289
 
1038
- ```
1039
- 🚀 Iniciando creación en Jira/AgileTest...
1290
+ ---
1040
1291
 
1041
- Proyecto: {jira_project_key}
1042
- Input: {ruta relativa}/test-design.md
1043
- State: {ruta relativa}/bmad_state_{feature_code}.json
1292
+ ### F4.6: Guardar los 3 Entregables
1044
1293
 
1045
- Progreso de los 8 pasos:
1046
- ```
1294
+ **Generar timestamp:** `YYYY-MM-DD-HHmmss`
1047
1295
 
1048
- **Ejecutar el script usando Bash tool:**
1296
+ **Slug del negocio:** derivar de la PHASE 1.A un slug kebab-case del negocio confirmado (ej. "Una tienda de ropa" → `tienda-de-ropa`).
1297
+
1298
+ **Crear carpeta:** `{implementation_artifacts}/quality-process/datos/data-gen-{negocio-slug}-YYYY-MM-DD-HHmmss/`
1299
+
1300
+ Guardar los archivos (usar **Write tool**, encoding UTF-8). Construir cada string completo en memoria y llamar Write una sola vez — **NUNCA** bash/cat/echo/sed:
1301
+
1302
+ 1. **`test-data.md`** (entregable 1 — PHASE 7.2) — **se escribe SIEMPRE**, incluso con 0 inserciones:
1303
+ - Encabezado `# Test Data — {negocio confirmado}` + metadata (proceso, BD, fecha, **ID de corrida**).
1304
+ - Tabla-resumen de ejecución al inicio (REUSABLE / PARTIAL / MISSING, insertados vs reutilizados).
1305
+ - Relación caso→datos **agrupada por seed**: casos con seed idéntico en un solo bloque; solo borde/negativo abren bloque individual. Valores literales (negrita = se digita en UI) + `id=` de BD para trazabilidad.
1306
+ - Si fueron 0 inserciones: todos los bloques en estado "reusado" (reporte 7.5).
1307
+
1308
+ **Frontmatter:**
1309
+ ```yaml
1310
+ ---
1311
+ workflow: quality-process
1312
+ phase: datos
1313
+ version: 1.1.0
1314
+ engine: sa-qa-data-generator
1315
+ generated_date: [ISO 8601 date]
1316
+ project_name: {project_name}
1317
+ negocio: [negocio confirmado en PHASE 1.A]
1318
+ run_id: QA_<fecha>_<seq>
1319
+ source_csv: [ruta relativa]/test-cases.csv
1320
+ db_engine: postgresql | mssql
1321
+ inserciones: [N]
1322
+ reutilizados: [N]
1323
+ casos_cubiertos: [N/M]
1324
+ ---
1325
+ ```
1049
1326
 
1050
- ```bash
1051
- python {project-root}/_siesa-agents/scripts/bmad_to_agiletest.py \
1052
- --input "{selected_test_design_path}" \
1053
- --config "{project-root}/_bmad/bmm/config.yaml" \
1054
- --jira-url "{jira_base_url}" \
1055
- --project-key "{jira_project_key}" \
1056
- --state-dir "{selected_design_folder}" \
1057
- --create
1058
- ```
1327
+ 2. **`seed.sql`** (entregable 2 — PHASE 7.3) — **solo si hubo inserciones**. Transaccional, idempotente (`ON CONFLICT DO NOTHING` / `IF NOT EXISTS` en SQL Server), ordenado padres→hijos, comentado por caso (`-- Cubre CP-...`), marcado con el ID de corrida, solo registros creados (no REUSABLE). Si fueron 0 inserciones, no generar este archivo.
1059
1328
 
1060
- **Mostrar el output del script en tiempo real.**
1329
+ 3. **`rollback.sql`** (entregable 3 — PHASE 7.4) — **solo si hubo inserciones**, acotado a los IDs/marcador de **esta** corrida (no un `LIKE 'QA_%'` amplio que borre datos reutilizados de corridas previas). Si fueron 0 inserciones, no generar este archivo.
1061
1330
 
1062
- Si el script retorna un error:
1063
- - Mostrar el error completo
1064
- - Verificar si el state file fue creado (idempotencia: re-ejecutar es seguro)
1065
- - Sugerir acción correctiva según el tipo de error
1331
+ **No tocar** datos previamente reutilizados ni datos que no fueron creados por esta corrida.
1066
1332
 
1067
1333
  ---
1068
1334
 
1069
- ### F3.6: Completion
1335
+ ### F4.7: Completion
1070
1336
 
1071
- Parsear la salida final del script y presentar al usuario:
1337
+ Presentar al usuario:
1072
1338
 
1073
1339
  ```
1074
- ✅ FASE 3REGISTRO AGILETEST COMPLETADO
1340
+ ✅ FASE 4GENERACIÓN DE DATOS QA COMPLETADA
1075
1341
 
1076
- ┌──────────────────────────────┬──────────┬──────────────────────────┐
1077
- │ Artefacto │ Cantidad │ Rango Jira │
1078
- ├──────────────────────────────┼──────────┼──────────────────────────┤
1079
- │ Requisitos (Stories) │ N │ {KEY}-XXXX → {KEY}-YYYY │
1080
- │ Test Cases │ N │ {KEY}-XXXX → {KEY}-YYYY │
1081
- │ Test Plans (PPR) │ N │ {KEY}-XXXX, ... │
1082
- │ Ejecuciones (PEP) │ N │ {KEY}-XXXX, ... │
1083
- │ Links Jira (TC→Req+Plan+Exec)│ N │ — │
1084
- │ Steps de prueba │ N │ — │
1085
- └──────────────────────────────┴──────────┴──────────────────────────┘
1342
+ 📁 Carpeta: {implementation_artifacts}/quality-process/datos/data-gen-{negocio-slug}-YYYY-MM-DD-HHmmss/
1086
1343
 
1087
- ⏱️ Tiempo total: ~5 minutos
1344
+ 🏷️ Negocio confirmado: [negocio de PHASE 1.A]
1088
1345
 
1089
- 📋 Keys para el Dashboard Forge (Confluence):
1090
- planKeys: {lista de keys PPR separados por coma}
1091
- execKeys: {lista de keys PEP separados por coma}
1346
+ 📊 Resumen:
1347
+ Casos de prueba: [M]
1348
+ REUSABLE (0 inserción): [N]
1349
+ • PARTIAL (parcial): [N]
1350
+ • MISSING (completo): [N]
1351
+ • Registros insertados: [N]
1352
+ • Registros reutilizados: [N]
1353
+ • Cobertura de datos: [N/M] casos
1092
1354
 
1093
- 🔗 Verificar en AgileTest:
1094
- {jira_base_url}/browse/{primer key PEP}
1355
+ 📄 Archivos:
1356
+ test-data.md — relación caso→datos agrupada por seed (lista para Playwright)
1357
+ • seed.sql — inserciones idempotentes recargables {o "no generado (0 inserciones)"}
1358
+ • rollback.sql — limpieza acotada a esta corrida {o "no generado (0 inserciones)"}
1095
1359
 
1096
- 💾 State file guardado en:
1097
- {ruta relativa}/bmad_state_{feature_code}.json
1098
- (Idempotente: re-ejecutar la Fase 3 con el mismo diseño es seguro)
1360
+ ⚠️ seed.sql y rollback.sql deben ejecutarse SOLO en ambientes de prueba.
1099
1361
  ```
1100
1362
 
1363
+ **⚠️ El workflow termina aquí. El equipo de QA puede ejecutar los casos usando los IDs reportados.**
1364
+
1101
1365
  ---
1102
1366
 
1103
- ## FASE 4DOR GATE
1367
+ ## FASE 5REGISTRO AGILETEST
1104
1368
 
1105
1369
  ### Objetivo
1106
1370
 
1107
- Verificar que el requerimiento cumple el **Definition of Ready (DoR)** antes de iniciar cualquier labor de construcción o proceso de calidad. Evalúa los ítems activos del checklist DoR BMAD Enterprise y genera un reporte `dor-report.md` con resultado pass/fail por ítem, detalle de cada fallo y acción correctiva requerida.
1371
+ Empujar el diseño de pruebas validado por el equipo QA a Jira/AgileTest. Crea automáticamente los artefactos de la herramienta: Requisitos (Stories BL Tareas), Test Cases con Steps (Gherkin Pasos), Planes de Prueba (PPR), Planes de Ejecución (PEP) y todos los links de trazabilidad. Requiere aprobación humana explícita antes de crear cualquier issue.
1108
1372
 
1109
- **Principio:** Si el Índice de Completitud es inferior al 90%, el sistema activa BLOQUEO TOTAL. El agente tiene prohibido iniciar cualquier labor de construcción.
1373
+ **Principio:** "La IA acelera, el humano dirige y autoriza."
1110
1374
 
1111
1375
  ---
1112
1376
 
1113
- ### F4.1: Auto Document Discovery (Zero User Interaction)
1377
+ ### F5.1: Seleccionar Diseño a Registrar
1114
1378
 
1115
- Buscar y leer automáticamente los documentos necesarios para evaluar el DoR:
1379
+ **Buscar diseños disponibles:**
1116
1380
 
1117
- ```
1118
- 🔍 DOR Gate Buscando documentos fuente...
1119
- ```
1381
+ 1. Listar todas las subcarpetas en `{implementation_artifacts}/quality-process/diseno/` con patrón `test-design-*`
1382
+ 2. Para cada carpeta encontrada, verificar que existe `test-design.md` (narrativo) **y** `test-design.yml` (machine-readable, el que consume el script) en su raíz
1383
+ 3. Ordenar por nombre descendente (el timestamp garantiza orden cronológico — más reciente primero)
1120
1384
 
1121
- #### Documento 1 — PRD / Requerimientos (OBLIGATORIO)
1385
+ **Mostrar lista al usuario:**
1122
1386
 
1123
- El PRD siempre vive en `{planning_artifacts}/prd` — puede ser un archivo o una carpeta:
1387
+ ```
1388
+ 📁 Diseños de prueba disponibles:
1124
1389
 
1125
- **Caso A archivo único:**
1126
- - Buscar: `{planning_artifacts}/prd.md`
1127
- - Si encontrado: leer contenido completo → almacenar en `dor_prd`
1390
+ 1. test-design-YYYY-MM-DD-HHmmss/ ← más reciente
1391
+ • test-design.md
1392
+ • test-cases.csv
1128
1393
 
1129
- **Caso B — carpeta con múltiples archivos:**
1130
- - Buscar con Glob: `{planning_artifacts}/prd/**/*.md`
1131
- - Si encontrado: leer y concatenar el contenido de todos los archivos `.md` → almacenar en `dor_prd`
1394
+ 2. test-design-YYYY-MM-DD-HHmmss/
1395
+ ...
1396
+ ```
1132
1397
 
1133
- Si ninguno de los dos casos produce contenido: `dor_prd = null` → **BLOQUEO**: sin PRD no se puede evaluar el DoR
1398
+ Si solo hay uno, seleccionarlo automáticamente y notificar:
1399
+ ```
1400
+ ✅ Diseño seleccionado automáticamente (único disponible):
1401
+ {implementation_artifacts}/quality-process/diseno/test-design-YYYY-MM-DD-HHmmss/
1402
+ ```
1134
1403
 
1135
- #### Documento 2 — Épicas / Historias de Usuario (para P1 y P2)
1404
+ Si hay más de uno, preguntar al usuario:
1405
+ ```json
1406
+ {
1407
+ "questions": [
1408
+ {
1409
+ "question": "¿Qué diseño deseas registrar en AgileTest?",
1410
+ "header": "Selección de Diseño — Fase 5 Registro AgileTest",
1411
+ "multiSelect": false,
1412
+ "options": [
1413
+ { "label": "test-design-YYYY-MM-DD-HHmmss (más reciente)", "description": "N TCs — generado el DD/MM/YYYY" },
1414
+ { "label": "test-design-YYYY-MM-DD-HHmmss", "description": "N TCs — generado el DD/MM/YYYY" }
1415
+ ]
1416
+ }
1417
+ ]
1418
+ }
1419
+ ```
1136
1420
 
1137
- El DOR se evalúa sobre features que ya tienen épicas creadas. Cargar usando el mismo patrón que las otras fases:
1421
+ **Almacenar:**
1422
+ - `selected_design_folder` → ruta absoluta a la carpeta seleccionada
1423
+ - `selected_test_design_path` → `{selected_design_folder}/test-design.yml` (el script `bmad_to_agiletest.py` parsea YAML, NO Markdown — pasar el `.yml`, no el `.md`)
1138
1424
 
1139
- 1. Leer `{implementation_artifacts}/feature-status.yaml`
1140
- 2. Por cada feature, leer su archivo `epic_source` y concatenar contenido → almacenar en `dor_epics`
1425
+ **Leer `test-design.md` y mostrar resumen rápido:**
1141
1426
 
1142
- Si `feature-status.yaml` no existe:
1143
- - Buscar con Glob: `{planning_artifacts}/*epic*.md`
1144
- - Si encontrado: leer y concatenar → almacenar en `dor_epics`
1145
- - Si no encontrado: `dor_epics = null` (continuar sin épicas P1 se evalúa solo contra el PRD)
1427
+ ```
1428
+ 📋 Diseño seleccionado:
1429
+ Archivo: {ruta relativa}/test-design.md
1430
+ Features: [conteo de features distintos en la columna Feature de la Matriz]
1431
+ • Stories BL: [extraer de Sección I — Gatekeeper]
1432
+ • Test Cases: [extraer de Sección V — Matriz Integral 360°]
1433
+ • CSV: test-cases.csv — [N filas]
1434
+ ```
1146
1435
 
1147
1436
  ---
1148
1437
 
1149
- #### Documento 3 Arquitectura (OBLIGATORIO para P2)
1438
+ ### F5.1b: Seleccionar Instancia Jira
1150
1439
 
1151
- Buscar con Glob en este orden:
1152
- 1. `{planning_artifacts}/architecture.md`
1153
- 2. `{planning_artifacts}/architecture-decision.md`
1154
- 3. `{planning_artifacts}/*architecture*.md`
1155
- 4. `{planning_artifacts}/*adr*.md`
1440
+ **Cargar opciones:**
1156
1441
 
1157
- Si encontrado: leer contenido completo → almacenar en `dor_architecture`
1158
- Si no encontrado: `dor_architecture = null` → P2 se marcará como NO EVALUABLE
1442
+ Usar la herramienta **Read** sobre `{project-root}/.claude/commands/get-features/oauth-config.json`.
1159
1443
 
1160
- #### Documento P4 No cargado (pendiente de definición)
1444
+ - Si no existe la única opción disponible es "Otra instancia".
1445
+ - Si existe → parsear `instances[]` (campos: `name`, `url`, `id`).
1161
1446
 
1162
- - **P4 (Contratos de Interfaz):** La ruta, formato y proceso de subida del esquema
1163
- OpenAPI/Swagger aún no están definidos. No se carga ningún documento.
1447
+ **Presentar AskUserQuestion opciones del array + "Otra instancia" al final:**
1164
1448
 
1165
- #### Documento P6 — Plan de Pruebas
1449
+ ```
1450
+ Por cada entrada en instances[]:
1451
+ label: "{entry.name} — {entry.url}"
1452
+ description: "cloud_id: {entry.id}"
1166
1453
 
1167
- Listar todos los directorios en `{implementation_artifacts}/quality-process/planeacion/`
1168
- que sigan el patrón `test-plan-*`. Ordenar descendente por nombre (el timestamp garantiza orden cronológico).
1169
- Almacenar la lista como `dor_test_plan_options` para que P6 la use en la selección interactiva.
1454
+ Última opción fija:
1455
+ label: "Otra instancia"
1456
+ description: "Ingresa la URL base manualmente"
1457
+ ```
1170
1458
 
1171
- Si no existe ningún directorio con ese patrón: `dor_test_plan_options = []` (P6 marcará NO_PASA).
1459
+ - Si selecciona una entrada del array `jira_base_url` = `entry.url`, `instancia_es_otra` = false
1460
+ - Si selecciona "Otra instancia" → `jira_base_url` = null, `instancia_es_otra` = true
1172
1461
 
1173
- #### Documento P7 — Cargar project-context
1462
+ **Almacenar:** `jira_base_url`, `instancia_es_otra`
1174
1463
 
1175
- Buscar `_bmad-output/project-context.md`. Si existe, anotar la ruta como `dor_project_context`.
1176
- Si no existe, `dor_project_context = null` (P7 marcará NO_PASA automáticamente).
1464
+ ---
1177
1465
 
1178
- #### Validación mínima
1466
+ ### F5.1c: Seleccionar Proyecto Jira
1179
1467
 
1180
- Si `dor_prd = null`: detener con mensaje:
1468
+ **Cargar opciones** (archivo ya leído en F5.1b):
1181
1469
 
1182
- ```
1183
- ❌ No se encontró el PRD en las rutas estándar del proyecto.
1470
+ Parsear `projects[]` del mismo JSON (campos: `key`, `name`).
1184
1471
 
1185
- Ruta esperada: {planning_artifacts}/prd.md (y variantes)
1472
+ **Presentar AskUserQuestion opciones del array + "Otro proyecto" al final:**
1186
1473
 
1187
- El DOR Gate requiere un PRD para ejecutarse. Por favor sube el PRD
1188
- al repositorio y vuelve a ejecutar la Fase 4.
1189
1474
  ```
1475
+ Por cada entrada en projects[]:
1476
+ label: "{entry.key} — {entry.name}"
1477
+ description: ""
1190
1478
 
1191
- #### Reporte de documentos encontrados
1192
-
1193
- Mostrar al usuario:
1194
-
1479
+ Última opción fija:
1480
+ label: "Otro proyecto"
1481
+ description: "Ingresa el project key manualmente"
1195
1482
  ```
1196
- 📋 DOR Gate — Documentos cargados:
1197
-
1198
- {✅|❌} PRD: {ruta relativa o "No encontrado — BLOQUEANTE"}
1199
- {✅|⚠️} Épicas: {ruta(s) relativa(s) o "No encontrado — P1/P2 sin contexto de stories"}
1200
- {✅|⚠️} Arquitectura: {ruta relativa o "No encontrado — P2 no evaluable"}
1201
- ⏭ API Schema: No evaluable — ruta/formato pendiente de definición (P4)
1202
- {✅|⚠️} Plan de Pruebas: {implementation_artifacts}/quality-process/planeacion/test-plan-YYYY-MM-DD-HHmmss/test-plan.md ({N} plan(es) encontrado(s) — P6 pedirá selección)
1203
- {✅|⚠️} Project Context: {ruta relativa o "No encontrado — P7 marcará NO_PASA"}
1204
1483
 
1205
- 🚀 Ejecutando evaluación DoR...
1206
- ```
1484
+ - Si selecciona una entrada del array → `jira_project_key` = `entry.key`, `proyecto_es_otro` = false
1485
+ - Si selecciona "Otro proyecto" → `jira_project_key` = null, `proyecto_es_otro` = true
1207
1486
 
1208
- Proceder directamente a F4.2 sin esperar confirmación del usuario.
1487
+ **Almacenar:** `jira_project_key`, `proyecto_es_otro`
1209
1488
 
1210
1489
  ---
1211
1490
 
1212
- ### F4.2: Cargar y Ejecutar Megaprompt DOR
1491
+ ### F5.1d: Resolver valores manuales (solo si aplica)
1213
1492
 
1214
- **Step F4.2.1: Cargar prompt**
1215
-
1216
- Leer el archivo completo: `{workflow_root}/prompts/prompt_dor_gate.md`
1217
-
1218
- **Step F4.2.2: Inyectar inputs**
1493
+ **Evaluar qué falta:**
1219
1494
 
1220
- ```
1221
- # [INPUT DOR]:
1222
- - **PRD**: {dor_prd}
1223
- - **ÉPICAS / HISTORIAS DE USUARIO**: {dor_epics}
1224
- - **ARQUITECTURA**: {dor_architecture}
1225
- ```
1495
+ - Si `instancia_es_otra` = false Y `proyecto_es_otro` = false → saltar este paso, ir a F5.2.
1496
+ - Si `instancia_es_otra` = true O `proyecto_es_otro` = true → hacer UNA SOLA pregunta combinada.
1226
1497
 
1227
- **Step F4.2.3: Ejecutar evaluación**
1498
+ **Una única pregunta que pide solo lo que falta:**
1228
1499
 
1229
- Notificar al usuario:
1500
+ - Solo falta instancia → `"Ingresa la URL base de Jira (ej: https://miempresa.atlassian.net)"`
1501
+ - Solo falta proyecto → `"Ingresa el Project Key (ej: CON, CLOUD, RUTA)"`
1502
+ - Faltan ambos → `"Ingresa la URL base de Jira y el Project Key (ej: https://miempresa.atlassian.net CLOUD)"`
1230
1503
 
1231
- ```
1232
- ⚙️ Evaluando ítems del DoR...
1233
- • P1: Índice de Completitud PRD (LLM scoring)
1234
- • P2: Consistencia PRD ↔ Arquitectura
1235
- • P3: Negocio y Valor (métricas/objetivos)
1236
- • P6: Plan de Pruebas (selección interactiva + 7 secciones)
1237
- • P7: Inyección de Contexto (project-context.md)
1238
- ─────────────────────────────────────────
1239
- ⏭ P4: Contratos de Interfaz — NO EVALUABLE (ruta/formato pendiente)
1240
- ```
1504
+ Parsear la respuesta y almacenar en `jira_base_url` y/o `jira_project_key` según corresponda.
1241
1505
 
1242
- Ejecutar el prompt con los inputs cargados. El prompt produce un JSON de resultados estructurado con el resultado de cada ítem.
1506
+ **No hacer preguntas adicionales después de este paso.**
1243
1507
 
1244
1508
  ---
1245
1509
 
1246
- ### F4.3: Guardar Output
1510
+ ### F5.2: Validar Credenciales (Pre-flight)
1247
1511
 
1248
- **Generar timestamp:** `YYYY-MM-DD-HHmmss`
1512
+ Antes de ejecutar el dry-run, verificar que las credenciales están disponibles.
1513
+ El script las busca en este orden de prioridad:
1514
+ 1. `_siesa-agents/bmm/config.secrets.yaml` (archivo local gitignoreado — forma recomendada)
1515
+ 2. Variables de entorno `JIRA_API_TOKEN`, `AGILETEST_CLIENT_ID`, `AGILETEST_CLIENT_SECRET`
1249
1516
 
1250
- **Ruta de salida:**
1251
- ```
1252
- {implementation_artifacts}/quality-process/dor/dor-report-YYYY-MM-DD-HHmmss/dor-report.md
1253
- ```
1517
+ **Leer `_siesa-agents/bmm/config.secrets.yaml` y verificar que los tokens no estén vacíos:**
1254
1518
 
1255
- **Frontmatter del documento generado:**
1256
- ```yaml
1257
- ---
1258
- workflow: quality-process
1259
- phase: dor
1260
- version: 1.0.0
1261
- methodology: BMAD DOR Gate
1262
- generated_date: [ISO 8601]
1263
- project_name: {project_name}
1264
- resultado: PASA | NO PASA
1265
- items_evaluados:
1266
- - P1
1267
- - P2
1268
- - P3
1269
- - P6
1270
- - P7
1271
- items_no_evaluados:
1272
- P4: pendiente — ruta y formato del esquema API por definir
1273
- source_documents:
1274
- prd: [ruta relativa o null]
1275
- architecture: [ruta relativa o null]
1276
- api_schema: [ruta relativa o null]
1277
- project_context: [ruta relativa o null]
1278
- test_plan: [ruta relativa o null]
1279
- ---
1519
+ ```
1520
+ 📋 Estado de credenciales en _siesa-agents/bmm/config.secrets.yaml:
1521
+ jira_api_token: [configurado ✅ | vacío ⚠️]
1522
+ agiletest_client_id: [configurado ✅ | vacío ⚠️]
1523
+ agiletest_client_secret: [configurado ✅ | vacío ⚠️]
1280
1524
  ```
1281
1525
 
1282
- **Cuerpo del documento** el título debe ser lo primero visible tras el frontmatter.
1283
- El bloque JSON de resultados va al final dentro de un `<details>` colapsado:
1526
+ **Si todos están configurados:** continuar a F5.3.
1284
1527
 
1285
- ```markdown
1286
- # DOR Report — {project_name}
1528
+ **Si alguno está vacío**, mostrar instrucciones y DETENER:
1287
1529
 
1288
- **Resultado global: ✅ PASA / ❌ NO PASA**
1289
- **Fecha:** {generated_date}
1530
+ ```
1531
+ ⚠️ Faltan credenciales en _siesa-agents/bmm/config.secrets.yaml
1290
1532
 
1291
- ## Resultado por ítem
1533
+ Abre el archivo y completa los valores:
1292
1534
 
1293
- | Ítem | Estado | Score | Detalle |
1294
- |------|--------|-------|---------|
1295
- | P1 — Completitud PRD | ✅/❌ | {score}% | {secciones faltantes o ""} |
1296
- | P2 — Consistencia Arq. | ✅/❌ | — | {entidades no encontradas o ""} |
1297
- | P3 — Negocio y Valor | ✅/❌ | — | {detalle o "—"} |
1298
- | P4 — Contratos API | ⏭ | — | No evaluable — ruta y formato del esquema API por definir |
1299
- | P6 — Plan de Pruebas | ✅/❌ | — | {plan seleccionado + secciones faltantes o "—"} |
1300
- | P7 — Inyección Contexto | ✅/❌ | — | {secciones faltantes o "—"} |
1535
+ agiletest:
1536
+ jira_api_token: "tu-token-aqui"
1537
+ agiletest_client_id: "tu-client-id"
1538
+ agiletest_client_secret: "tu-client-secret"
1301
1539
 
1302
- ## Detalle P1 — Completitud PRD {✅/❌} {score}%
1540
+ Dónde obtenerlos:
1541
+ • jira_api_token: Jira → Profile → Security → API tokens → Create
1542
+ • agiletest_client_id/secret: AgileTest plugin en Jira → Settings → API Keys
1303
1543
 
1304
- | Sección | Score | Nota |
1305
- |---------|-------|------|
1306
- | Objetivos | {score}% | {nota} |
1307
- | Alcance | {score}% | {nota} |
1308
- | Criterios de Aceptación | {score}% | {nota} |
1309
- | Métricas de Éxito | {score}% | {nota} |
1310
- | Definiciones Técnicas | {score}% | {nota} |
1311
- | Flujos / Reglas de Negocio | {score}% | {nota} |
1544
+ El archivo ya está en .gitignore — es seguro guardar los tokens ahí.
1545
+ Una vez completados, vuelve a ejecutar la Fase 5.
1546
+ ```
1312
1547
 
1313
- ## Detalle P2 — Consistencia PRD ↔ Arquitectura {✅/❌} {score}%
1548
+ ---
1314
1549
 
1315
- - **Entidades evaluadas:** {N}
1316
- - **Encontradas:** {N} — {lista}
1317
- - **No encontradas:** {lista o "ninguna"}
1318
- - **Parciales:** {lista o "ninguna"}
1550
+ ### F5.2b: Resolver agiletest_project_id
1319
1551
 
1320
- ## Detalle P3 Negocio y Valor {✅/❌} {score}%
1552
+ **Verificar si ya está configurado:**
1321
1553
 
1322
- - **Objetivos:** {VÁLIDO/INVÁLIDO/AUSENTE} {nota}
1323
- - **Métricas:** {VÁLIDO/INVÁLIDO/AUSENTE} — {nota}
1554
+ Leer `_siesa-agents/bmm/config.secrets.yaml`. Si `agiletest_project_id` tiene un valor no vacío, mostrar:
1555
+ ```
1556
+ ✅ agiletest_project_id ya configurado: {valor} — omitiendo resolución.
1557
+ ```
1558
+ Y continuar a F5.3.
1324
1559
 
1325
- ## Acciones requeridas
1560
+ **Si está vacío:** resolver automáticamente vía la API de Jira usando Bash tool:
1326
1561
 
1327
- {Si PASA:}
1328
- El requerimiento cumple el DoR. Puede continuar a Planeación (Fase 1).
1562
+ ```bash
1563
+ python -c "
1564
+ import urllib.request, base64, json, re, sys
1329
1565
 
1330
- {Si NO PASA:}
1331
- Corregir los siguientes ítems antes de continuar:
1332
- {por cada ítem fallido: descripción exacta de qué falta y cómo corregirlo}
1566
+ secrets_path = '{project-root}/_siesa-agents/bmm/config.secrets.yaml'
1567
+ with open(secrets_path, encoding='utf-8') as f:
1568
+ content = f.read()
1333
1569
 
1334
- ```
1570
+ def extract(key, text):
1571
+ m = re.search(rf'^\s+{key}:\s*[\"\'"]?(.+?)[\"\'"]?\s*$', text, re.MULTILINE)
1572
+ return m.group(1).strip().strip('\"').strip(\"'\") if m else ''
1335
1573
 
1336
- **🚨 IMPORTANTE:** El JSON de resultados que produce el prompt se usa ÚNICAMENTE
1337
- de forma interna para construir el reporte. **NO escribirlo en el archivo `dor-report.md`.**
1574
+ email = extract('jira_user_email', content)
1575
+ token = extract('jira_api_token', content)
1576
+ base = '{jira_base_url}'
1577
+ key = '{jira_project_key}'
1338
1578
 
1339
- ---
1579
+ creds = base64.b64encode(f'{email}:{token}'.encode()).decode()
1580
+ req = urllib.request.Request(
1581
+ f'{base}/rest/api/3/project/{key}',
1582
+ headers={'Authorization': f'Basic {creds}', 'Accept': 'application/json'}
1583
+ )
1584
+ with urllib.request.urlopen(req, timeout=10) as r:
1585
+ data = json.loads(r.read().decode())
1340
1586
 
1341
- ### F4.4: Completion
1587
+ project_id = str(data['id'])
1588
+ print(f'PROJECT_ID={project_id}')
1589
+ "
1590
+ ```
1342
1591
 
1343
- Presentar al usuario:
1592
+ **Parsear la salida:** extraer el valor después de `PROJECT_ID=` → almacenar en `resolved_project_id`.
1344
1593
 
1345
- ```
1346
- {Si PASA:}
1347
- ✅ DOR GATE — PASA
1594
+ **Si la llamada falla:** mostrar el error y DETENER — no continuar sin el ID porque los pasos 4, 6 y 7 de AgileTest fallarán con HTTP 400.
1348
1595
 
1349
- 📁 Reporte: {implementation_artifacts}/quality-process/dor/dor-report-YYYY-MM-DD-HHmmss/dor-report.md
1596
+ **Persistir en config.secrets.yaml usando Bash tool:**
1350
1597
 
1351
- 📊 Resumen:
1352
- P1 Completitud: ✅ {score}%
1353
- P2 Consistencia Arq.: ✅
1354
- • P3 Negocio y Valor: ✅
1355
- • P4 Contratos API: ⏭ No evaluable
1356
- • P6 Plan de Pruebas: ✅
1357
- • P7 Contexto: ✅
1598
+ ```bash
1599
+ python -c "
1600
+ import re
1358
1601
 
1359
- El requerimiento está listo para continuar.
1602
+ path = '{project-root}/_siesa-agents/bmm/config.secrets.yaml'
1603
+ with open(path, encoding='utf-8') as f:
1604
+ content = f.read()
1360
1605
 
1361
- {Si NO PASA:}
1362
- ❌ DOR GATE — NO PASA
1606
+ new_line = ' agiletest_project_id: \"{resolved_project_id}\"'
1363
1607
 
1364
- 📁 Reporte: {implementation_artifacts}/quality-process/dor/dor-report-YYYY-MM-DD-HHmmss/dor-report.md
1608
+ if re.search(r'^\s+agiletest_project_id:', content, re.MULTILINE):
1609
+ content = re.sub(r'^\s+agiletest_project_id:.*$', new_line, content, flags=re.MULTILINE)
1610
+ else:
1611
+ content = re.sub(r'(agiletest:\n)', r'\1' + new_line + '\n', content)
1365
1612
 
1366
- 📊 Resumen:
1367
- • P1 Completitud: {✅/❌} {score}%
1368
- • P2 Consistencia Arq.: {✅/❌}
1369
- • P3 Negocio y Valor: {✅/❌}
1370
- • P4 Contratos API: ⏭ No evaluable
1371
- • P6 Plan de Pruebas: {✅/❌}
1372
- • P7 Contexto: {✅/❌}
1613
+ with open(path, 'w', encoding='utf-8') as f:
1614
+ f.write(content)
1373
1615
 
1374
- ❌ Ítems fallidos: {N}
1375
- → Devolver a refinamiento. Ver sección "Acciones requeridas" en el reporte.
1616
+ print('OK')
1617
+ "
1376
1618
  ```
1377
1619
 
1378
- **⚠️ NO sugerir continuar con ninguna otra fase si el resultado es NO PASA. El workflow termina aquí.**
1620
+ **Confirmar al usuario:**
1621
+ ```
1622
+ ✅ agiletest_project_id resuelto y guardado: {resolved_project_id}
1623
+ (Proyecto {jira_project_key} en {jira_base_url})
1624
+ Guardado en config.secrets.yaml — no se volverá a resolver en próximas ejecuciones.
1625
+ ```
1379
1626
 
1380
1627
  ---
1381
1628
 
1382
- ## FASE 5IMPLEMENTACIÓN PLAYWRIGHT
1629
+ ### F5.3: Dry-runVista Previa Obligatoria
1383
1630
 
1384
- ### Objetivo
1631
+ **Ejecutar dry-run usando Bash tool:**
1385
1632
 
1386
- Generar código Playwright para los test cases del CSV (producido en Fase 2) que aún no tienen cobertura en los spec files del proyecto. La fase realiza un gap analysis automático, clasifica cada test por la tecnología correcta (Playwright E2E, Vitest Unit FE, .NET xUnit BE), genera el código E2E completo para los gaps en scope, lo inyecta en los archivos spec existentes con aprobación humana, y actualiza el estado del CSV.
1633
+ ```bash
1634
+ python {project-root}/_siesa-agents/scripts/bmad_to_agiletest.py \
1635
+ --input "{selected_test_design_path}" \
1636
+ --config "{project-root}/_bmad/bmm/config.yaml" \
1637
+ --jira-url "{jira_base_url}" \
1638
+ --project-key "{jira_project_key}" \
1639
+ --dry-run
1640
+ ```
1387
1641
 
1388
- **Principio:** "No se escribe ni un test sin gate humano. La IA genera, el humano aprueba."
1642
+ > **Flags opcionales para pruebas parciales** (útiles para validar el flujo sin procesar todo el diseño):
1643
+ > - `--pilot` → procesa solo la Feature `F4` (Events) — subconjunto fijo para smoke-test del flujo.
1644
+ > - `--feature-filter F1` → procesa solo la feature indicada (match exacto contra la clave de feature).
1645
+ > Ambos aplican igual a `--dry-run` y a `--create`.
1389
1646
 
1390
- ---
1647
+ **Parsear la salida y presentar al usuario en tabla ordenada:**
1391
1648
 
1392
- ### F5.1: Seleccionar Diseño Fuente
1649
+ ```
1650
+ 📊 Vista previa — Lo que se creará en Jira/AgileTest:
1393
1651
 
1394
- **Buscar diseños disponibles:**
1652
+ ┌──────────────────────────┬──────────┐
1653
+ │ Artefacto │ Cantidad │
1654
+ ├──────────────────────────┼──────────┤
1655
+ │ Requisitos (Stories BL) │ N │
1656
+ │ Test Cases │ N │
1657
+ │ • P0 (Muy Alta) │ N │
1658
+ │ • P1 (Alta) │ N │
1659
+ │ • P2 (Media) │ N │
1660
+ │ • P3 (Baja) │ N │
1661
+ │ Planes de Prueba (PPR) │ N │
1662
+ │ Planes de Ejecución (PEP)│ N │
1663
+ │ Links de trazabilidad │ ~N │
1664
+ │ Steps de prueba │ ~N │
1665
+ └──────────────────────────┴──────────┘
1395
1666
 
1396
- 1. Listar todas las subcarpetas en `{implementation_artifacts}/quality-process/diseno/` con patrón `test-design-*`
1397
- 2. Para cada carpeta encontrada, verificar que existe `test-cases.csv` en su raíz
1398
- 3. Ordenar por nombre descendente el timestamp garantiza orden cronológico (más reciente primero)
1667
+ 📋 Distribución por Feature:
1668
+ F1 [Nombre]: N TCs
1669
+ F2[Nombre]: N TCs
1670
+ ...
1399
1671
 
1400
- **Si solo hay uno**, seleccionarlo automáticamente:
1401
- ```
1402
- ✅ CSV seleccionado automáticamente:
1403
- {implementation_artifacts}/quality-process/diseno/test-design-YYYY-MM-DD-HHmmss/test-cases.csv
1672
+ 🎯 Proyecto Jira: {jira_project_key}
1673
+ ⏱️ Tiempo estimado: ~5 minutos
1404
1674
  ```
1405
1675
 
1406
- **Si hay más de uno**, preguntar al usuario:
1676
+ ---
1677
+
1678
+ ### F5.4: Gate de Aprobación Humana (OBLIGATORIO)
1679
+
1680
+ Este paso es **no omisible**. No se crea ningún issue sin aprobación explícita.
1681
+
1682
+ **Preguntar al usuario usando AskUserQuestion:**
1683
+
1407
1684
  ```json
1408
1685
  {
1409
1686
  "questions": [
1410
1687
  {
1411
- "question": "¿De qué diseño quieres implementar los test cases?",
1412
- "header": "Selección de DiseñoFase 5 Implementación Playwright",
1688
+ "question": "¿Apruebas la creación de estos N issues en Jira/AgileTest?",
1689
+ "header": "⚠️ Confirmación RequeridaCreación en AgileTest",
1413
1690
  "multiSelect": false,
1414
1691
  "options": [
1415
- { "label": "test-design-YYYY-MM-DD-HHmmss (más reciente)", "description": "N TCs — generado el DD/MM/YYYY" },
1416
- { "label": "test-design-YYYY-MM-DD-HHmmss", "description": "N TCs generado el DD/MM/YYYY" }
1692
+ {
1693
+ "label": " Aprobar y crear en AgileTest",
1694
+ "description": "Se crearán los N issues en el proyecto Jira. Esta acción es reversible (el script tiene modo --delete para limpiar)."
1695
+ },
1696
+ {
1697
+ "label": "🔍 Ver detalle de TCs antes de decidir",
1698
+ "description": "Mostrar cada TC con sus pasos antes de aprobar"
1699
+ },
1700
+ {
1701
+ "label": "❌ Cancelar — no crear nada",
1702
+ "description": "Salir sin crear issues en Jira/AgileTest"
1703
+ }
1417
1704
  ]
1418
1705
  }
1419
1706
  ]
1420
1707
  }
1421
1708
  ```
1422
1709
 
1423
- **Almacenar:**
1424
- - `selected_csv_path` → ruta absoluta al `test-cases.csv` seleccionado
1425
- - `selected_design_folder` → carpeta raíz del diseño seleccionado
1426
-
1427
- **Leer `test-cases.csv` completo** — almacenar en `csv_content`.
1710
+ **Si "Ver detalle":** Ejecutar con `--detail` y regresar a este mismo gate:
1428
1711
 
1429
- Mostrar resumen rápido:
1430
- ```
1431
- 📋 CSV cargado:
1432
- Archivo: {ruta relativa}/test-cases.csv
1433
- Total TCs: [N filas descontando header]
1434
- Features: [lista de IDs de épica únicos extraídos de columna "ID Épica"]
1435
- P0: [N TCs con Priority: P0 en columna Notas]
1436
- • P1: [N TCs con Priority: P1]
1712
+ ```bash
1713
+ python {project-root}/_siesa-agents/scripts/bmad_to_agiletest.py \
1714
+ --input "{selected_test_design_path}" \
1715
+ --config "{project-root}/_bmad/bmm/config.yaml" \
1716
+ --jira-url "{jira_base_url}" \
1717
+ --project-key "{jira_project_key}" \
1718
+ --dry-run --detail
1437
1719
  ```
1438
1720
 
1439
- ---
1721
+ Mostrar el detalle y volver a presentar el gate de aprobación.
1440
1722
 
1441
- ### F5.2: Carga de Spec Files Existentes (Zero User Interaction)
1723
+ **Si "Cancelar":** Notificar `❌ Operación cancelada. No se creó ningún issue.` y terminar el workflow.
1442
1724
 
1443
- **Descubrir automáticamente los spec files del proyecto:**
1725
+ **Si "Aprobar":** Continuar a F5.5.
1444
1726
 
1445
- 1. Buscar con Glob: `{project-root}/frontend/tests/e2e/**/*.spec.ts`
1446
- 2. Para cada archivo encontrado, leer su contenido completo
1447
- 3. Almacenar como mapa `spec_files`: `{ ruta_relativa: contenido }`
1727
+ ---
1448
1728
 
1449
- **Notificar al usuario:**
1450
- ```
1451
- 🔍 Spec files encontrados:
1452
- • {ruta relativa 1} ({N} líneas)
1453
- • {ruta relativa 2} ({N} líneas)
1454
- ...
1455
- Total: {N} archivos | {N} líneas
1456
- ```
1729
+ ### F5.5: Crear en AgileTest
1457
1730
 
1458
- **También cargar configuración del proyecto de tests:**
1731
+ **Notificar inicio:**
1459
1732
 
1460
- 4. Leer `{project-root}/frontend/playwright.config.ts` → almacenar en `playwright_config`
1461
- 5. Leer `{project-root}/frontend/tests/support/fixtures/index.ts` (o el barrel de fixtures) → almacenar en `fixtures_api`
1733
+ ```
1734
+ 🚀 Iniciando creación en Jira/AgileTest...
1462
1735
 
1463
- Si alguno no existe, continuar sin él (no es bloqueante).
1736
+ Proyecto: {jira_project_key}
1737
+ Input: {ruta relativa}/test-design.yml
1738
+ State: {ruta relativa}/bmad_state_{feature_code}.json
1464
1739
 
1465
- ---
1740
+ Progreso de los 8 pasos:
1741
+ ```
1466
1742
 
1467
- ### F5.3: Análisis de Cobertura + Generación de Código (Megaprompt)
1743
+ **Ejecutar el script usando Bash tool:**
1468
1744
 
1469
- **Notificar al usuario:**
1470
- ```
1471
- ⚙️ Ejecutando análisis de cobertura y generación de tests...
1472
- Paso 1: Clasificación por tecnología (Playwright / Vitest / .NET)
1473
- Paso 2: Gap analysis (CSV vs spec files existentes)
1474
- Paso 3: Generación de código Playwright para los gaps
1475
- • Paso 4: Revisión de casos especiales (multi-tab, XSS, performance, optimistic)
1745
+ ```bash
1746
+ python {project-root}/_siesa-agents/scripts/bmad_to_agiletest.py \
1747
+ --input "{selected_test_design_path}" \
1748
+ --config "{project-root}/_bmad/bmm/config.yaml" \
1749
+ --jira-url "{jira_base_url}" \
1750
+ --project-key "{jira_project_key}" \
1751
+ --state-dir "{selected_design_folder}" \
1752
+ --create
1476
1753
  ```
1477
1754
 
1478
- **Step F5.3.1: Cargar megaprompt**
1755
+ **Mostrar el output del script en tiempo real.**
1756
+
1757
+ Si el script retorna un error:
1758
+ - Mostrar el error completo
1759
+ - Verificar si el state file fue creado (idempotencia: re-ejecutar es seguro)
1760
+ - Sugerir acción correctiva según el tipo de error
1761
+
1762
+ ---
1479
1763
 
1480
- Leer el archivo completo: `{workflow_root}/prompts/prompt_playwright_impl.md`
1764
+ ### F5.6: Completion
1481
1765
 
1482
- **Step F5.3.2: Inyectar inputs**
1766
+ Parsear la salida final del script y presentar al usuario:
1483
1767
 
1484
1768
  ```
1485
- # [INPUTS F5]:
1486
- - **CSV CONTENT**: {csv_content}
1487
- - **SPEC FILES**: {spec_files}
1488
- - **PLAYWRIGHT CONFIG**: {playwright_config}
1489
- - **FIXTURES API**: {fixtures_api}
1490
- ```
1769
+ FASE 5 — REGISTRO AGILETEST COMPLETADO
1770
+
1771
+ ┌──────────────────────────────┬──────────┬──────────────────────────┐
1772
+ Artefacto │ Cantidad │ Rango Jira │
1773
+ ├──────────────────────────────┼──────────┼──────────────────────────┤
1774
+ │ Requisitos (Stories) │ N │ {KEY}-XXXX → {KEY}-YYYY │
1775
+ │ Test Cases │ N │ {KEY}-XXXX → {KEY}-YYYY │
1776
+ │ Test Plans (PPR) │ N │ {KEY}-XXXX, ... │
1777
+ │ Ejecuciones (PEP) │ N │ {KEY}-XXXX, ... │
1778
+ │ Links Jira (TC→Req+Plan+Exec)│ N │ — │
1779
+ │ Steps de prueba │ N │ — │
1780
+ └──────────────────────────────┴──────────┴──────────────────────────┘
1491
1781
 
1492
- **Step F5.3.3: Ejecutar**
1782
+ ⏱️ Tiempo total: ~5 minutos
1493
1783
 
1494
- Ejecutar el megaprompt con los inputs inyectados. El prompt produce tres bloques de salida estructurados:
1784
+ 📋 Keys para el Dashboard Forge (Confluence):
1785
+ planKeys: {lista de keys PPR separados por coma}
1786
+ execKeys: {lista de keys PEP separados por coma}
1495
1787
 
1496
- 1. **BLOQUE A — CLASIFICACIÓN**: tabla de todos los TCs con su tecnología asignada y estado de cobertura
1497
- 2. **BLOQUE B — CÓDIGO PLAYWRIGHT**: bloques de código TypeScript listos para inyectar, agrupados por spec file destino
1498
- 3. **BLOQUE C — OUT-OF-SCOPE**: lista de TCs fuera del scope Playwright (Vitest/BE) con justificación
1788
+ 🔗 Verificar en AgileTest:
1789
+ {jira_base_url}/browse/{primer key PEP}
1499
1790
 
1500
- **Almacenar outputs:**
1501
- - `classification_table` ← BLOQUE A
1502
- - `generated_tests` BLOQUE B (mapa `spec_file [test blocks]`)
1503
- - `out_of_scope` ← BLOQUE C
1791
+ 💾 State file guardado en:
1792
+ {ruta relativa}/bmad_state_{feature_code}.json
1793
+ (Idempotente: re-ejecutar la Fase 5 con el mismo diseño es seguro)
1794
+ ```
1504
1795
 
1505
1796
  ---
1506
1797
 
1507
- ### F5.4: Gate de Aprobación Humana (OBLIGATORIO)
1798
+ ## FASE 6 IMPLEMENTACIÓN + EJECUCIÓN E2E
1508
1799
 
1509
- Presentar resumen al usuario antes de cualquier escritura:
1800
+ ### Objetivo
1510
1801
 
1511
- ```
1512
- 📊 Análisis de CoberturaResumen
1802
+ Generar y **ejecutar** el código Playwright de los casos diseñados, actuando como el **Agente
1803
+ Ejecutor E2E** (Agente #4ISTQB Test Implementation + Execution). Consume el `test-design.yml`
1804
+ (fuente única de Fase 3) + `test-data.md` (Fase 4), enriquece a `.md` con el architecture brief,
1805
+ genera los `.spec.ts` con el ciclo **Planner → Generator → Healer** sobre el **Kit Playwright**,
1806
+ los promueve con aprobación humana, ejecuta la suite y deja los reportes listos para el RCA.
1513
1807
 
1514
- Tecnología │ Total Ya cubiertos Gaps (nuevos)
1515
- ──────────────────┼───────┼──────────────┼──────────────
1516
- Playwright E2E │ [N] │ [N] │ [N]
1517
- Vitest Unit FE │ [N] │ [N] │ [N]
1518
- .NET xUnit BE │ [N] │ [N] │ [N]
1519
- ──────────────────┴───────┴──────────────┴──────────────
1520
- TOTAL CSV │ [N] │ [N] │ [N]
1808
+ **Principio:** "No se escribe ni un test sin gate humano. La IA genera y ejecuta, el humano aprueba."
1521
1809
 
1522
- 📝 Tests Playwright a agregar:
1810
+ > **Modo orquestado:** dentro del `quality-process` el agente NO rediseña casos (Fase 3) ni
1811
+ > genera datos (Fase 4). Su prompt vive en `{workflow_root}/prompts/prompt_e2e_executor.md`.
1523
1812
 
1524
- {por cada spec file destino:}
1525
- • {spec_file} → [N] tests nuevos
1526
- - TC-F*-NNN [PX] <título> (Risk: R=N)
1527
- - TC-F*-NNN [PX] <título> (Risk: R=N)
1528
- ...
1813
+ ---
1529
1814
 
1530
- ⚠️ Fuera de scope Playwright:
1531
- • Vitest: {lista de TC-IDs}
1532
- .NET: {lista de TC-IDs}
1533
- ```
1815
+ ### F6.0: Detección de Input y Pre-flight
1816
+
1817
+ 1. **Precedencia de input** (buscar en la carpeta de diseño más reciente — ver F6.1):
1818
+ - Si existe `test-design.yml` → **modo YAML** (fuente única, steps atómicos). Preferido.
1819
+ - Si solo existe `test-cases.csv` → **modo CSV** (fallback: gap analysis tradicional con
1820
+ `prompt_playwright_impl.md`).
1821
+ 2. **Cargar datos:** buscar el `test-data.md` más reciente en
1822
+ `{implementation_artifacts}/quality-process/datos/` → `input_test_data` (opcional).
1823
+ 3. **Verificar Kit:** confirmar que existe `{project-root}/_siesa-agents/resources/playwright-kit/`.
1824
+ Si falta, avisar que la Etapa de cimientos no está instalada y detener.
1825
+ 4. **Pre-flight de credenciales E2E (`.env` del Kit):** el `login()` de los specs lee
1826
+ `BASE_URL`, `TEST_USER`, `TEST_PASS` y `DB_ENGINE` desde
1827
+ `{project-root}/_siesa-agents/resources/playwright-kit/.env` (personal, gitignoreado).
1828
+ Sin esto la corrida del Healer (F6.6) y la ejecución oficial (F6.7) **fallan en el login**.
1829
+ - Leer ese `.env` (si existe) y verificar que `BASE_URL` y `TEST_USER`/`TEST_PASS` no estén vacíos.
1830
+ - **Si falta o está incompleto, resolverlo ANTES de generar/ejecutar:** pedir al usuario con
1831
+ AskUserQuestion la URL del ERP y las credenciales de prueba (usuario/clave + BD), y **escribir**
1832
+ el archivo `.env` (a partir de `.env.example`) con esas claves. El `.env` es gitignoreado:
1833
+ es seguro guardarlo ahí. Nunca imprimir el valor de `TEST_PASS` en la salida.
1834
+ ```
1835
+ BASE_URL=https://<erp-del-proyecto>
1836
+ TEST_USER=<usuario_qa>
1837
+ TEST_PASS=<clave_qa>
1838
+ DB_ENGINE=<bd> # texto a buscar en el combo de login (ej: sqlserver)
1839
+ ```
1840
+ - Confirmar: `✅ .env del Kit configurado (BASE_URL + credenciales).`
1534
1841
 
1535
- **Preguntar al usuario:**
1536
- ```json
1537
- {
1538
- "questions": [
1539
- {
1540
- "question": "¿Apruebas inyectar estos [N] tests en los spec files?",
1541
- "header": "⚠️ Confirmación Requerida Inyección de Tests",
1542
- "multiSelect": false,
1543
- "options": [
1544
- {
1545
- "label": "✅ Aprobar e inyectar todos",
1546
- "description": "Se agregarán [N] tests a los spec files existentes. Los archivos son modificados en el lugar."
1547
- },
1548
- {
1549
- "label": "🔍 Ver código generado primero",
1550
- "description": "Mostrar el código completo de cada test antes de aprobar"
1551
- },
1552
- {
1553
- "label": "✏️ Aprobar parcialmente",
1554
- "description": "Seleccionar qué spec files o tests incluir"
1555
- },
1556
- {
1557
- "label": "❌ Cancelar",
1558
- "description": "No modificar ningún archivo"
1559
- }
1560
- ]
1561
- }
1562
- ]
1563
- }
1842
+ Notificar:
1843
+ ```
1844
+ 🎯 Fase 6 — Agente Ejecutor E2E
1845
+ • Input: [test-design.yml (modo YAML) | test-cases.csv (modo CSV fallback)]
1846
+ • Datos: [test-data.md encontrado | sin datos — se usarán los del diseño]
1847
+ • Kit: _siesa-agents/resources/playwright-kit/
1848
+ • Credenciales: .env del Kit [configurado | pendiente ⚠️]
1564
1849
  ```
1565
1850
 
1566
- **Si "Ver código generado primero":**
1567
- - Mostrar el código completo de `generated_tests` con bloques de código
1568
- - Volver a presentar el mismo gate
1851
+ ---
1569
1852
 
1570
- **Si "Aprobar parcialmente":**
1571
- - Preguntar qué spec files incluir (AskUserQuestion multiSelect con un ítem por spec file)
1572
- - Filtrar `generated_tests` según la selección
1573
- - Volver al gate con el subconjunto aprobado
1853
+ ### F6.1: Seleccionar Diseño Fuente
1574
1854
 
1575
- **Si "Cancelar":**
1576
- - Notificar `❌ Operación cancelada. No se modificó ningún archivo.` y terminar
1855
+ 1. Listar subcarpetas en `{implementation_artifacts}/quality-process/diseno/` con patrón `test-design-*`.
1856
+ 2. Ordenar descendente (timestamp) más reciente primero.
1857
+ 3. Si solo hay una, seleccionarla automáticamente; si hay varias, preguntar con AskUserQuestion
1858
+ (`Selección de Diseño — Fase 6 Ejecutor E2E`).
1577
1859
 
1578
- **Si "Aprobar":** Continuar a F5.5
1860
+ **Almacenar:** `selected_design_folder`, y según el modo: `selected_yml_path` o `selected_csv_path`.
1861
+ Leer el archivo fuente → `design_content`. Mostrar resumen (total casos, features, P0/P1).
1579
1862
 
1580
1863
  ---
1581
1864
 
1582
- ### F5.5: Inyectar Tests en Spec Files
1583
-
1584
- **Por cada spec file con tests aprobados:**
1865
+ ### F6.2: Resolver Architecture Brief
1585
1866
 
1586
- 1. Leer el archivo spec actual con Read tool
1587
- 2. Localizar el bloque de inserción correcto:
1588
- - Si hay un `test.describe('EPIC-SA-F*'` relacionado → insertar al final de ese describe
1589
- - Si no hay describe relacionado → insertar al final del archivo
1590
- 3. Usar Edit tool para agregar los tests
1591
- 4. Notificar: `✅ {spec_file} → {N} tests agregados`
1867
+ El brief eleva la autonomía del agente a ~85-90% (selectores + patrones + quirks).
1592
1868
 
1593
- **Reglas de inserción:**
1594
-
1595
- - Mantener la agrupación por `EPIC-SA-F*` (no crear describes nuevos si ya existe el correcto)
1596
- - Respetar el estilo del archivo: imports, indentación, convención de nombres
1597
- - Cada test nuevo sigue el formato: `test('TC-F*-NNN [PX] descripción', async ({...}) => { // GIVEN / WHEN / THEN })`
1598
- - NO modificar tests existentes, solo agregar
1869
+ 1. Buscar el brief de la app en `{project-root}/_siesa-agents/resources/playwright-kit/specs/`
1870
+ (`architecture-brief-siesa-erp.md` u otro del proyecto) → `input_brief`.
1871
+ 2. Si no existe o está incompleto, ofrecer con AskUserQuestion:
1872
+ - **Usar template** (`architecture-brief-template.md`) para que un dev lo complete, o
1873
+ - **Grabar con el grabador** (`tools/locator-recorder.spec.ts`) en sesión exploratoria.
1874
+ 3. Continuar con el brief disponible (no es bloqueante, pero advertir si falta — baja la autonomía).
1599
1875
 
1600
1876
  ---
1601
1877
 
1602
- ### F5.6: Actualizar CSV Estado de Tests Implementados
1878
+ ### F6.3: EnriquecerYAML → `.md` de plan
1603
1879
 
1604
- Una vez inyectados los tests con éxito:
1880
+ **Modo YAML:** convertir el `test-design.yml` al `.md` enriquecido que consume el Generator:
1881
+ ```bash
1882
+ npx tsx {project-root}/_siesa-agents/scripts/playwright/yaml-to-playwright-spec.ts \
1883
+ "{selected_yml_path}" --output "{run_folder}/specs/{modulo}.plan.md"
1884
+ ```
1885
+ Luego inyectar el `input_brief` (selectores, patrones, problemas conocidos) en la sección
1886
+ "Contexto Técnico" del `.md`. Si los `steps` del YAML vienen narrativos (string), expandirlos a
1887
+ pasos atómicos antes de convertir.
1605
1888
 
1606
- 1. Leer el CSV actual desde `{selected_csv_path}`
1607
- 2. Para cada TC implementado, cambiar la columna `Estado` de `"Not Started"` a `"Implemented"`
1608
- 3. Dejar los TCs fuera de scope (Vitest/BE) como `"Not Started"` (no es responsabilidad de Playwright)
1609
- 4. Reconstruir el CSV completo en memoria respetando las mismas reglas de escape del Fase 2:
1610
- - Todos los campos entre comillas dobles
1611
- - Comillas internas duplicadas: `"` → `""`
1612
- 5. Guardar con Write tool en la misma ruta `{selected_csv_path}`
1889
+ **Modo CSV (fallback):** descubrir spec files existentes en `{project-root}/frontend/tests/e2e/**/*.spec.ts`
1890
+ y continuar con el gap analysis de `prompt_playwright_impl.md` (flujo previo).
1613
1891
 
1614
- **Notificar:**
1615
- ```
1616
- 📄 CSV actualizado:
1617
- • {N} tests → Estado: "Implemented"
1618
- • {N} tests → Estado: "Not Started" (fuera de scope Playwright)
1619
- • Archivo: {ruta relativa}
1620
- ```
1892
+ `{run_folder}` = `{implementation_artifacts}/quality-process/playwright/e2e-run-YYYY-MM-DD-HHmmss/`.
1621
1893
 
1622
1894
  ---
1623
1895
 
1624
- ### F5.7: Guardar Reporte de Implementación
1625
-
1626
- Generar timestamp `YYYY-MM-DD-HHmmss` y guardar:
1896
+ ### F6.4: Generación (Generator) Megaprompt
1627
1897
 
1628
- ```
1629
- {output_folder}/implementation-artifacts/quality-process/playwright/playwright-impl-YYYY-MM-DD-HHmmss/implementation-report.md
1630
- ```
1898
+ 1. **Cargar el megaprompt:** leer `{workflow_root}/prompts/prompt_e2e_executor.md`.
1899
+ 2. **Inyectar inputs:**
1900
+ ```
1901
+ - TEST DESIGN (YAML): {selected_yml_path | "—"}
1902
+ - TEST DATA: {input_test_data | "—"}
1903
+ - TEST CASES (CSV): {selected_csv_path | "—"}
1904
+ - ARCHITECTURE BRIEF: {input_brief}
1905
+ - SPEC FILES: {spec_files | "—"}
1906
+ - KIT: _siesa-agents/resources/playwright-kit/
1907
+ ```
1908
+ 3. **Ejecutar.** El prompt produce 3 bloques: **A — Clasificación**, **B — Código Playwright**,
1909
+ **C — Out-of-scope**. Escribir el código del Bloque B en `{run_folder}/proposed/*.spec.ts`
1910
+ (staging — NUNCA directo a `tests/`).
1631
1911
 
1632
- **Contenido del reporte:**
1912
+ **🔵 Review Gate #1:** presentar el plan/clasificación al usuario antes de generar todo el código.
1633
1913
 
1634
- ```markdown
1635
1914
  ---
1636
- workflow: quality-process
1637
- phase: playwright-impl
1638
- version: 1.0.0
1639
- generated_date: [ISO 8601]
1640
- project_name: {project_name}
1641
- source_csv: {ruta relativa}/test-cases.csv
1915
+
1916
+ ### F6.5: Gate de Aprobación Humana (OBLIGATORIO)
1917
+
1918
+ Presentar resumen (cobertura por tecnología, tests nuevos por spec, out-of-scope) y preguntar con
1919
+ AskUserQuestion: **Aprobar e inyectar** / **Ver código primero** / **Aprobar parcialmente** /
1920
+ **Cancelar**. No se promueve ni ejecuta nada sin aprobación explícita.
1921
+
1642
1922
  ---
1643
1923
 
1644
- # Playwright Implementation Report
1924
+ ### F6.6: Healer Loop (reparación)
1645
1925
 
1646
- **Fecha:** {generated_date}
1647
- **Tests implementados:** [N]
1648
- **Tests fuera de scope:** [N]
1926
+ Ejecutar `{run_folder}/proposed/` en local/headless **solo para reparar** (no es la corrida oficial):
1927
+ ```bash
1928
+ cd {project-root}/_siesa-agents/resources/playwright-kit
1929
+ npx playwright test {run_folder}/proposed/ --config playwright.config.ts
1930
+ ```
1931
+ Por cada fallo: diagnosticar (cambio UI / bug real / flake), corregir el spec en `proposed/`, repetir
1932
+ (máx. N iteraciones). Consultar el brief y los "Problemas Conocidos". Si el Healer descubre un patrón
1933
+ nuevo, agregarlo al brief con prefijo `[HEALER]`.
1934
+
1935
+ ---
1649
1936
 
1650
- ## Cobertura por Feature
1937
+ ### F6.7: Promover a `tests/` + Sync AgileTest
1651
1938
 
1652
- | Feature | CSV Total | Ya existían | Nuevos | Vitest | .NET |
1653
- |---|---|---|---|---|---|
1654
- | F1 | N | N | N | N | N |
1655
- | F2 | N | N | N | N | N |
1656
- | F3 | N | N | N | N | N |
1657
- | F4 | N | N | N | N | N |
1939
+ **🔵 Review Gate #2:** humano verifica assertions y selectores de los specs ya verdes.
1658
1940
 
1659
- ## Tests Implementados
1941
+ 1. Mover los specs aprobados de `{run_folder}/proposed/` → `{run_folder}/tests/`.
1942
+ 2. Si hay env vars de AgileTest (`AGILETEST_*`), el `reporters/agiletest-reporter.ts` sincroniza la
1943
+ Execution (Pass/Fail por step). **Credenciales desde entorno / `config.secrets.yaml`, nunca literales.**
1660
1944
 
1661
- | ID | Título | Risk | Archivo |
1662
- |---|---|---|---|
1663
- {fila por cada test implementado}
1945
+ ---
1946
+
1947
+ ### F6.8: Ejecución Oficial (cierra el gap hacia el RCA)
1664
1948
 
1665
- ## Tests Fuera de Scope Playwright
1949
+ Preguntar con AskUserQuestion la ruta de ejecución:
1666
1950
 
1667
- ### Vitest (Unit FE)
1668
- | ID | Título | Razón |
1669
- |---|---|---|
1951
+ ```json
1952
+ {
1953
+ "questions": [
1954
+ {
1955
+ "question": "¿Cómo ejecutamos la suite oficial?",
1956
+ "header": "Ejecución E2E — Fase 6",
1957
+ "multiSelect": false,
1958
+ "options": [
1959
+ {
1960
+ "label": "✅ Ejecutar aquí (Recomendado)",
1961
+ "description": "Corre la suite sobre el Kit y genera allure-results/monocart-report/test-results (insumos directos del RCA)."
1962
+ },
1963
+ {
1964
+ "label": "Delegar a CI",
1965
+ "description": "Hace push y la GitHub Action ejecuta; la Fase 7 (RCA) leerá los artefactos del CI."
1966
+ }
1967
+ ]
1968
+ }
1969
+ ]
1970
+ }
1971
+ ```
1670
1972
 
1671
- ### .NET xUnit (BE)
1672
- | ID | Título | Razón |
1673
- |---|---|---|
1973
+ **Ruta A Ejecutar aquí:**
1974
+ ```bash
1975
+ cd {project-root}/_siesa-agents/resources/playwright-kit
1976
+ SUITE_TITLE="E2E {modulo}" npx playwright test {run_folder}/tests/ --config playwright.config.ts
1674
1977
  ```
1978
+ Copiar/generar en `{run_folder}/`: `allure-results/`, `monocart-report/`, `test-results/`.
1979
+
1980
+ **Ruta B — Delegar a CI:** registrar que la ejecución corre en CI; la Fase 7 leerá esos artefactos.
1675
1981
 
1676
1982
  ---
1677
1983
 
1678
- ### F5.8: Completion
1984
+ ### F6.9: Actualizar Estado + Reportes + Completion
1679
1985
 
1680
- Presentar al usuario:
1986
+ 1. Actualizar el `Estado` de cada caso ejecutado en el `test-cases.csv` (`Implemented`/`Passed`/`Failed`)
1987
+ y, si aplica, en el `test-design.yml`. Reglas de escape CSV de Fase 3 (todo entre comillas, `"`→`""`).
1988
+ 2. Generar `{run_folder}/implementation-report.md` (cobertura por feature, tests implementados, out-of-scope).
1989
+ 3. Dejar los reportes en la **ruta predecible para el RCA**:
1990
+ ```
1991
+ {implementation_artifacts}/quality-process/playwright/e2e-run-YYYY-MM-DD-HHmmss/
1992
+ ├── architecture-brief.md
1993
+ ├── specs/ · proposed/ · tests/ · captured-locators/
1994
+ ├── implementation-report.md
1995
+ ├── allure-results/ · monocart-report/ · test-results/ ← insumos del RCA (Fase 7)
1996
+ ```
1681
1997
 
1998
+ **Frontmatter del reporte:**
1999
+ ```yaml
2000
+ ---
2001
+ workflow: quality-process
2002
+ phase: playwright-e2e
2003
+ version: 2.0.0
2004
+ agent: agente-ejecutor-e2e
2005
+ generated_date: [ISO 8601]
2006
+ project_name: {project_name}
2007
+ source: [test-design.yml | test-cases.csv]
2008
+ run_folder: [ruta relativa]
2009
+ ---
1682
2010
  ```
1683
- ✅ FASE 5 — IMPLEMENTACIÓN PLAYWRIGHT COMPLETADA
1684
2011
 
1685
- 📊 Resumen:
1686
- • Tests Playwright implementados: [N]
1687
- Tests ya existentes (sin cambio): [N]
1688
- • Tests fuera de scope — Vitest: [N]
1689
- • Tests fuera de scope — .NET: [N]
2012
+ Presentar al usuario:
2013
+ ```
2014
+ FASE 6 IMPLEMENTACIÓN + EJECUCIÓN E2E COMPLETADA
1690
2015
 
1691
- 📝 Archivos modificados:
1692
- {por cada spec file modificado:}
1693
- • {ruta relativa} → +[N] tests
2016
+ 📁 Corrida: {run_folder}
1694
2017
 
1695
- 📄 CSV actualizado:
1696
- {ruta relativa}/test-cases.csv [N] estados: "Implemented"
2018
+ 📊 Resumen:
2019
+ Tests E2E generados: [N]
2020
+ • Promovidos a tests/: [N]
2021
+ • Ejecutados ([A: aquí | B: CI]): [N] → Pass [N] / Fail [N]
2022
+ • Fuera de scope (Vitest/.NET): [N]
1697
2023
 
1698
- 📁 Reporte:
1699
- {output_folder}/implementation-artifacts/quality-process/playwright/playwright-impl-YYYY-MM-DD-HHmmss/implementation-report.md
2024
+ 📄 Reportes (insumo del RCA):
2025
+ allure-results/ · monocart-report/ · test-results/
1700
2026
 
1701
- 🔍 Próximos pasos recomendados:
1702
- 1. Ejecutar los tests: npx playwright test --reporter=html
1703
- 2. Verificar que los [N] tests nuevos pasan en los 3 browsers (Chromium, Firefox, WebKit)
1704
- 3. Implementar los [N] tests Vitest en frontend/src/**/__tests__/
1705
- 4. Implementar los [N] tests .NET en el proyecto de tests de integración BE
2027
+ 🔄 Sync AgileTest: [Execution actualizada | omitido — sin credenciales]
1706
2028
  ```
1707
2029
 
1708
- **⚠️ El workflow termina aquí. El equipo debe ejecutar los tests y validar que pasan antes de marcar los TCs como "Passed" en el CSV.**
2030
+ **⚠️ El workflow termina aquí.** Si hubo fallos, la **Fase 7 (RCA)** analiza los reportes de
2031
+ `{run_folder}` para el análisis de causa raíz.