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.
- package/bmad/bmm/config.yaml +33 -0
- package/claude/skills/sa-agent-sre-sentinel/SKILL.md +180 -0
- package/claude/skills/sa-aplicar/SKILL.md +268 -0
- package/claude/skills/sa-auditar-servicio/SKILL.md +255 -0
- package/claude/skills/sa-nueva-transversal/SKILL.md +317 -0
- package/claude/skills/sa-nuevo-ambiente/SKILL.md +147 -0
- package/claude/skills/sa-nuevo-servicio/SKILL.md +530 -0
- package/claude/skills/sa-onboard-db/SKILL.md +122 -0
- package/claude/skills/sa-qa-data-generator/SKILL.md +200 -51
- package/claude/skills/sa-quality-process/SKILL.md +6 -0
- package/claude/skills/sa-registrar-permisos/SKILL.md +233 -0
- package/package.json +1 -1
- package/siesa-agents/bmm/workflows/3-solutioning/quality-process/prompts/prompt_design_test.md +1037 -60
- package/siesa-agents/bmm/workflows/3-solutioning/quality-process/prompts/prompt_dor_gate.md +419 -379
- package/siesa-agents/bmm/workflows/3-solutioning/quality-process/prompts/prompt_e2e_executor.md +273 -0
- package/siesa-agents/bmm/workflows/3-solutioning/quality-process/prompts/prompt_playwright_impl.md +359 -355
- package/siesa-agents/bmm/workflows/3-solutioning/quality-process/prompts/prompt_test_plan.md +73 -111
- package/siesa-agents/bmm/workflows/3-solutioning/quality-process/workflow.md +1320 -997
- package/siesa-agents/resources/playwright-kit/.env.example +42 -0
- package/siesa-agents/resources/playwright-kit/README.md +228 -0
- package/siesa-agents/resources/playwright-kit/allure/categories.json +26 -0
- package/siesa-agents/resources/playwright-kit/global-setup.ts +34 -0
- package/siesa-agents/resources/playwright-kit/helpers/blazor-e2e-helpers.ts +417 -0
- package/siesa-agents/resources/playwright-kit/helpers/react-e2e-helpers.ts +297 -0
- package/siesa-agents/resources/playwright-kit/package-lock.json +850 -0
- package/siesa-agents/resources/playwright-kit/package.json +27 -0
- package/siesa-agents/resources/playwright-kit/playwright.config.ts +60 -0
- package/siesa-agents/resources/playwright-kit/proposed/.gitkeep +0 -0
- package/siesa-agents/resources/playwright-kit/reporters/agiletest-reporter.ts +252 -0
- package/siesa-agents/resources/playwright-kit/specs/.gitkeep +0 -0
- package/siesa-agents/resources/playwright-kit/specs/architecture-brief-siesa-erp.md +85 -0
- package/siesa-agents/resources/playwright-kit/specs/architecture-brief-siesa-react.md +109 -0
- package/siesa-agents/resources/playwright-kit/specs/architecture-brief-template.md +69 -0
- package/siesa-agents/resources/playwright-kit/tests/seed-example.spec.ts +95 -0
- package/siesa-agents/resources/playwright-kit/tools/locator-overlay.js +1306 -0
- package/siesa-agents/resources/playwright-kit/tools/locator-recorder.spec.ts +986 -0
- package/siesa-agents/scripts/__pycache__/bmad_to_agiletest.cpython-36.pyc +0 -0
- package/siesa-agents/scripts/bmad_to_agiletest.py +352 -337
- package/siesa-agents/scripts/converters/convert_csv_to_test_design.py +327 -0
- package/siesa-agents/scripts/converters/convert_excel_to_test_design.py +360 -0
- package/siesa-agents/scripts/converters/convert_md_to_test_design.py +359 -0
- package/siesa-agents/scripts/converters/convert_pdf_to_test_design.py +412 -0
- package/siesa-agents/scripts/converters/export_yaml_to_csv.py +149 -0
- package/siesa-agents/scripts/converters/export_yaml_to_excel.py +233 -0
- package/siesa-agents/scripts/converters/export_yaml_to_markdown.py +172 -0
- package/siesa-agents/scripts/converters/export_yaml_to_pdf.py +297 -0
- package/siesa-agents/scripts/merge_test_design.py +106 -106
- package/siesa-agents/scripts/playwright/yaml-to-playwright-spec.ts +203 -0
- 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
|
|
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.
|
|
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
|
|
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
|
|
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,
|
|
18
|
-
- **Fase 2 —
|
|
19
|
-
- **Fase 3 —
|
|
20
|
-
- **Fase 4 —
|
|
21
|
-
- **Fase 5 —
|
|
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️⃣
|
|
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
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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
|
-
|
|
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
|
-
|
|
81
|
+
5️⃣ Registro AgileTest — Empuja 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
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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
|
-
|
|
111
|
-
|
|
93
|
+
¿Qué fase deseas ejecutar? (responde con el número 1–6)
|
|
94
|
+
```
|
|
112
95
|
|
|
113
|
-
**
|
|
96
|
+
**Captura de la selección (lista plana de 6):**
|
|
114
97
|
|
|
115
|
-
|
|
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
|
-
-
|
|
146
|
-
-
|
|
147
|
-
-
|
|
148
|
-
-
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
381
|
-
4. Estrategia de Pruebas (Tipos, técnicas
|
|
382
|
-
5. Ambiente & Datos de Prueba
|
|
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
|
|
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 —
|
|
390
|
+
## FASE 2 — DOR GATE
|
|
398
391
|
|
|
399
392
|
### Objetivo
|
|
400
393
|
|
|
401
|
-
|
|
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:
|
|
400
|
+
### F2.1: Auto Document Discovery (Zero User Interaction)
|
|
406
401
|
|
|
407
|
-
|
|
402
|
+
Buscar y leer automáticamente los documentos necesarios para evaluar el DoR:
|
|
408
403
|
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
404
|
+
```
|
|
405
|
+
🔍 DOR Gate — Buscando documentos fuente...
|
|
406
|
+
```
|
|
412
407
|
|
|
413
|
-
|
|
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
|
-
|
|
410
|
+
El PRD siempre vive en `{planning_artifacts}/prd` — puede ser un archivo o una carpeta:
|
|
420
411
|
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
412
|
+
**Caso A — archivo único:**
|
|
413
|
+
- Buscar: `{planning_artifacts}/prd.md`
|
|
414
|
+
- Si encontrado: leer contenido completo → almacenar en `dor_prd`
|
|
424
415
|
|
|
425
|
-
|
|
426
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
436
|
+
#### Documento 3 — Arquitectura (OBLIGATORIO para P2)
|
|
475
437
|
|
|
476
|
-
|
|
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
|
-
|
|
479
|
-
|
|
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
|
-
|
|
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
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
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
|
-
|
|
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
|
-
|
|
497
|
-
|
|
498
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
512
|
-
|
|
513
|
-
|
|
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
|
-
|
|
483
|
+
#### Reporte de documentos encontrados
|
|
525
484
|
|
|
526
|
-
|
|
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
|
-
|
|
531
|
-
|
|
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
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
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
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
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.
|
|
506
|
+
### F2.2: Cargar y Ejecutar Megaprompt DOR
|
|
558
507
|
|
|
559
|
-
**
|
|
508
|
+
**Step F2.2.1: Cargar prompt**
|
|
560
509
|
|
|
561
|
-
|
|
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
|
-
**
|
|
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
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
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
|
-
**
|
|
591
|
-
|
|
592
|
-
Después de guardar `shards/test-design-phase4-test-matrix.md`:
|
|
521
|
+
**Step F2.2.3: Ejecutar evaluación**
|
|
593
522
|
|
|
594
|
-
|
|
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
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
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
|
-
|
|
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.
|
|
542
|
+
### F2.3: Guardar Output
|
|
627
543
|
|
|
628
|
-
|
|
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
|
-
|
|
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
|
-
|
|
636
|
-
|
|
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
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
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
|
-
|
|
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.
|
|
641
|
+
### F2.4: Completion
|
|
658
642
|
|
|
659
|
-
|
|
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
|
-
|
|
649
|
+
📁 Reporte: {implementation_artifacts}/quality-process/dor/dor-report-YYYY-MM-DD-HHmmss/dor-report.md
|
|
666
650
|
|
|
667
|
-
|
|
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
|
-
|
|
661
|
+
El requerimiento está listo para continuar.
|
|
670
662
|
|
|
671
|
-
|
|
663
|
+
{Si NO PASA:}
|
|
664
|
+
❌ DOR GATE — NO PASA
|
|
672
665
|
|
|
673
|
-
|
|
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 —
|
|
686
|
+
## FASE 3 — DISEÑO
|
|
678
687
|
|
|
679
688
|
### Objetivo
|
|
680
689
|
|
|
681
|
-
|
|
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:
|
|
694
|
+
### F3.1: Feature Selection (Interactivo)
|
|
688
695
|
|
|
689
|
-
**
|
|
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
|
-
**
|
|
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
|
-
|
|
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
|
-
|
|
701
|
-
• test-design.md ✅
|
|
702
|
-
• test-cases.csv ✅
|
|
708
|
+
3. **Si no se proveyó parámetro, preguntar al usuario:**
|
|
703
709
|
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
710
|
+
Mostrar features disponibles:
|
|
711
|
+
```
|
|
712
|
+
📋 Features disponibles en el proyecto:
|
|
707
713
|
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
```
|
|
714
|
+
{por cada feature:
|
|
715
|
+
" • {feature.id} [{feature.status}] → {feature.epic_source}"
|
|
716
|
+
}
|
|
717
|
+
```
|
|
713
718
|
|
|
714
|
-
|
|
715
|
-
```json
|
|
716
|
-
{
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
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
|
-
**
|
|
732
|
-
- `
|
|
733
|
-
-
|
|
742
|
+
**Si "Todos los features":**
|
|
743
|
+
- `filtered_features = all_features`
|
|
744
|
+
- Notificar: `✅ Se procesarán todos los features ({count} features)`
|
|
734
745
|
|
|
735
|
-
**
|
|
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.
|
|
763
|
+
### F3.2: Automatic Data Loading (Zero User Interaction)
|
|
749
764
|
|
|
750
|
-
**
|
|
765
|
+
**CARGAR TODOS LOS INPUTS AUTOMÁTICAMENTE:**
|
|
751
766
|
|
|
752
|
-
|
|
767
|
+
1. **INPUT 1 - PROYECTO:**
|
|
768
|
+
- Cargar desde config: `{project_name}`
|
|
769
|
+
- Almacenar como: `input_proyecto`
|
|
753
770
|
|
|
754
|
-
|
|
755
|
-
-
|
|
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
|
-
**
|
|
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
|
-
|
|
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
|
-
|
|
765
|
-
|
|
766
|
-
|
|
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
|
-
|
|
770
|
-
- Si selecciona "Otra instancia" → `jira_base_url` = null, `instancia_es_otra` = true
|
|
811
|
+
---
|
|
771
812
|
|
|
772
|
-
|
|
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.
|
|
864
|
+
### F3.4: Save Output
|
|
777
865
|
|
|
778
|
-
**
|
|
866
|
+
**Crear estructura de carpeta con timestamp:**
|
|
779
867
|
|
|
780
|
-
|
|
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
|
-
**
|
|
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
|
-
|
|
790
|
-
|
|
791
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
**
|
|
935
|
+
**Exportar el diseño completo a YAML estructurado:**
|
|
809
936
|
|
|
810
|
-
|
|
811
|
-
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1048
|
+
---
|
|
821
1049
|
|
|
822
|
-
|
|
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
|
-
|
|
1052
|
+
Presentar al usuario:
|
|
828
1053
|
|
|
829
1054
|
```
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1078
|
+
**⚠️ El workflow termina aquí. El equipo de QA debe revisar y validar los documentos generados.**
|
|
844
1079
|
|
|
845
|
-
|
|
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
|
-
|
|
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
|
-
|
|
855
|
-
|
|
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
|
-
|
|
1102
|
+
## FASE 4 — GENERACIÓN DE DATOS QA
|
|
1103
|
+
|
|
1104
|
+
### Objetivo
|
|
861
1105
|
|
|
862
|
-
**
|
|
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
|
-
|
|
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
|
-
**
|
|
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
|
-
|
|
873
|
-
python -c "
|
|
874
|
-
import urllib.request, base64, json, re, sys
|
|
1112
|
+
---
|
|
875
1113
|
|
|
876
|
-
|
|
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
|
-
|
|
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
|
-
|
|
885
|
-
|
|
886
|
-
|
|
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
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
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
|
-
|
|
898
|
-
|
|
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
|
-
**
|
|
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
|
-
|
|
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
|
-
**
|
|
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
|
-
|
|
909
|
-
|
|
910
|
-
|
|
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
|
-
|
|
913
|
-
with open(path, encoding='utf-8') as f:
|
|
914
|
-
content = f.read()
|
|
1165
|
+
---
|
|
915
1166
|
|
|
916
|
-
|
|
1167
|
+
### F4.2: Verificar Conexión MCP de Base de Datos (Pre-flight)
|
|
917
1168
|
|
|
918
|
-
|
|
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
|
-
|
|
924
|
-
|
|
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
|
-
|
|
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
|
-
**
|
|
1180
|
+
**Si NO hay conexión**, mostrar instrucciones y DETENER:
|
|
931
1181
|
```
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
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
|
-
###
|
|
1195
|
+
### F4.3: Cargar y Ejecutar el Protocolo del Agente de Datos
|
|
940
1196
|
|
|
941
|
-
**
|
|
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
|
-
|
|
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
|
-
**
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
973
|
-
F1 — [Nombre]: N TCs
|
|
974
|
-
F2 — [Nombre]: N TCs
|
|
975
|
-
...
|
|
1225
|
+
---
|
|
976
1226
|
|
|
977
|
-
|
|
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
|
-
|
|
1231
|
+
Presentar el resultado del matching de PHASE 4:
|
|
1232
|
+
```
|
|
1233
|
+
📊 Matching de datos — Resumen
|
|
984
1234
|
|
|
985
|
-
|
|
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
|
-
|
|
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
|
|
994
|
-
"header": "⚠️ Confirmación Requerida —
|
|
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
|
|
999
|
-
"description": "Se
|
|
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
|
|
1003
|
-
"description": "Mostrar
|
|
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
|
|
1007
|
-
"description": "Salir sin
|
|
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":**
|
|
1016
|
-
|
|
1017
|
-
|
|
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
|
-
|
|
1279
|
+
---
|
|
1029
1280
|
|
|
1030
|
-
|
|
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
|
-
|
|
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
|
-
**
|
|
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
|
-
|
|
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
|
-
|
|
1046
|
-
```
|
|
1294
|
+
**Generar timestamp:** `YYYY-MM-DD-HHmmss`
|
|
1047
1295
|
|
|
1048
|
-
**
|
|
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
|
-
|
|
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
|
-
**
|
|
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
|
-
|
|
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
|
-
###
|
|
1335
|
+
### F4.7: Completion
|
|
1070
1336
|
|
|
1071
|
-
|
|
1337
|
+
Presentar al usuario:
|
|
1072
1338
|
|
|
1073
1339
|
```
|
|
1074
|
-
✅ FASE
|
|
1340
|
+
✅ FASE 4 — GENERACIÓ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
|
-
|
|
1344
|
+
🏷️ Negocio confirmado: [negocio de PHASE 1.A]
|
|
1088
1345
|
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
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
|
-
|
|
1094
|
-
|
|
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
|
-
|
|
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
|
|
1367
|
+
## FASE 5 — REGISTRO AGILETEST
|
|
1104
1368
|
|
|
1105
1369
|
### Objetivo
|
|
1106
1370
|
|
|
1107
|
-
|
|
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:**
|
|
1373
|
+
**Principio:** "La IA acelera, el humano dirige y autoriza."
|
|
1110
1374
|
|
|
1111
1375
|
---
|
|
1112
1376
|
|
|
1113
|
-
###
|
|
1377
|
+
### F5.1: Seleccionar Diseño a Registrar
|
|
1114
1378
|
|
|
1115
|
-
Buscar
|
|
1379
|
+
**Buscar diseños disponibles:**
|
|
1116
1380
|
|
|
1117
|
-
|
|
1118
|
-
|
|
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
|
-
|
|
1385
|
+
**Mostrar lista al usuario:**
|
|
1122
1386
|
|
|
1123
|
-
|
|
1387
|
+
```
|
|
1388
|
+
📁 Diseños de prueba disponibles:
|
|
1124
1389
|
|
|
1125
|
-
|
|
1126
|
-
-
|
|
1127
|
-
-
|
|
1390
|
+
1. test-design-YYYY-MM-DD-HHmmss/ ← más reciente
|
|
1391
|
+
• test-design.md ✅
|
|
1392
|
+
• test-cases.csv ✅
|
|
1128
1393
|
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1394
|
+
2. test-design-YYYY-MM-DD-HHmmss/
|
|
1395
|
+
...
|
|
1396
|
+
```
|
|
1132
1397
|
|
|
1133
|
-
Si
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
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
|
-
|
|
1438
|
+
### F5.1b: Seleccionar Instancia Jira
|
|
1150
1439
|
|
|
1151
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1444
|
+
- Si no existe → la única opción disponible es "Otra instancia".
|
|
1445
|
+
- Si existe → parsear `instances[]` (campos: `name`, `url`, `id`).
|
|
1161
1446
|
|
|
1162
|
-
|
|
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
|
-
|
|
1449
|
+
```
|
|
1450
|
+
Por cada entrada en instances[]:
|
|
1451
|
+
label: "{entry.name} — {entry.url}"
|
|
1452
|
+
description: "cloud_id: {entry.id}"
|
|
1166
1453
|
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1454
|
+
Última opción fija:
|
|
1455
|
+
label: "Otra instancia"
|
|
1456
|
+
description: "Ingresa la URL base manualmente"
|
|
1457
|
+
```
|
|
1170
1458
|
|
|
1171
|
-
Si
|
|
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
|
-
|
|
1462
|
+
**Almacenar:** `jira_base_url`, `instancia_es_otra`
|
|
1174
1463
|
|
|
1175
|
-
|
|
1176
|
-
Si no existe, `dor_project_context = null` (P7 marcará NO_PASA automáticamente).
|
|
1464
|
+
---
|
|
1177
1465
|
|
|
1178
|
-
|
|
1466
|
+
### F5.1c: Seleccionar Proyecto Jira
|
|
1179
1467
|
|
|
1180
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1487
|
+
**Almacenar:** `jira_project_key`, `proyecto_es_otro`
|
|
1209
1488
|
|
|
1210
1489
|
---
|
|
1211
1490
|
|
|
1212
|
-
###
|
|
1491
|
+
### F5.1d: Resolver valores manuales (solo si aplica)
|
|
1213
1492
|
|
|
1214
|
-
**
|
|
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
|
-
|
|
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
|
-
**
|
|
1498
|
+
**Una única pregunta que pide solo lo que falta:**
|
|
1228
1499
|
|
|
1229
|
-
|
|
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
|
-
|
|
1506
|
+
**No hacer preguntas adicionales después de este paso.**
|
|
1243
1507
|
|
|
1244
1508
|
---
|
|
1245
1509
|
|
|
1246
|
-
###
|
|
1510
|
+
### F5.2: Validar Credenciales (Pre-flight)
|
|
1247
1511
|
|
|
1248
|
-
|
|
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
|
-
**
|
|
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
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
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
|
-
**
|
|
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
|
-
|
|
1286
|
-
# DOR Report — {project_name}
|
|
1528
|
+
**Si alguno está vacío**, mostrar instrucciones y DETENER:
|
|
1287
1529
|
|
|
1288
|
-
|
|
1289
|
-
|
|
1530
|
+
```
|
|
1531
|
+
⚠️ Faltan credenciales en _siesa-agents/bmm/config.secrets.yaml
|
|
1290
1532
|
|
|
1291
|
-
|
|
1533
|
+
Abre el archivo y completa los valores:
|
|
1292
1534
|
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
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
|
-
|
|
1548
|
+
---
|
|
1314
1549
|
|
|
1315
|
-
|
|
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
|
-
|
|
1552
|
+
**Verificar si ya está configurado:**
|
|
1321
1553
|
|
|
1322
|
-
-
|
|
1323
|
-
|
|
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
|
-
|
|
1560
|
+
**Si está vacío:** resolver automáticamente vía la API de Jira usando Bash tool:
|
|
1326
1561
|
|
|
1327
|
-
|
|
1328
|
-
|
|
1562
|
+
```bash
|
|
1563
|
+
python -c "
|
|
1564
|
+
import urllib.request, base64, json, re, sys
|
|
1329
1565
|
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
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
|
-
|
|
1337
|
-
|
|
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
|
-
|
|
1587
|
+
project_id = str(data['id'])
|
|
1588
|
+
print(f'PROJECT_ID={project_id}')
|
|
1589
|
+
"
|
|
1590
|
+
```
|
|
1342
1591
|
|
|
1343
|
-
|
|
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
|
-
|
|
1596
|
+
**Persistir en config.secrets.yaml usando Bash tool:**
|
|
1350
1597
|
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1362
|
-
❌ DOR GATE — NO PASA
|
|
1606
|
+
new_line = ' agiletest_project_id: \"{resolved_project_id}\"'
|
|
1363
1607
|
|
|
1364
|
-
|
|
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
|
-
|
|
1367
|
-
|
|
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
|
-
|
|
1375
|
-
|
|
1616
|
+
print('OK')
|
|
1617
|
+
"
|
|
1376
1618
|
```
|
|
1377
1619
|
|
|
1378
|
-
|
|
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
|
-
|
|
1629
|
+
### F5.3: Dry-run — Vista Previa Obligatoria
|
|
1383
1630
|
|
|
1384
|
-
|
|
1631
|
+
**Ejecutar dry-run usando Bash tool:**
|
|
1385
1632
|
|
|
1386
|
-
|
|
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
|
-
**
|
|
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
|
-
|
|
1649
|
+
```
|
|
1650
|
+
📊 Vista previa — Lo que se creará en Jira/AgileTest:
|
|
1393
1651
|
|
|
1394
|
-
|
|
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
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1667
|
+
📋 Distribución por Feature:
|
|
1668
|
+
F1 — [Nombre]: N TCs
|
|
1669
|
+
F2 — [Nombre]: N TCs
|
|
1670
|
+
...
|
|
1399
1671
|
|
|
1400
|
-
|
|
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
|
-
|
|
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": "¿
|
|
1412
|
-
"header": "
|
|
1688
|
+
"question": "¿Apruebas la creación de estos N issues en Jira/AgileTest?",
|
|
1689
|
+
"header": "⚠️ Confirmación Requerida — Creación en AgileTest",
|
|
1413
1690
|
"multiSelect": false,
|
|
1414
1691
|
"options": [
|
|
1415
|
-
{
|
|
1416
|
-
|
|
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
|
-
**
|
|
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
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
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
|
-
|
|
1723
|
+
**Si "Cancelar":** Notificar `❌ Operación cancelada. No se creó ningún issue.` y terminar el workflow.
|
|
1442
1724
|
|
|
1443
|
-
**
|
|
1725
|
+
**Si "Aprobar":** Continuar a F5.5.
|
|
1444
1726
|
|
|
1445
|
-
|
|
1446
|
-
2. Para cada archivo encontrado, leer su contenido completo
|
|
1447
|
-
3. Almacenar como mapa `spec_files`: `{ ruta_relativa: contenido }`
|
|
1727
|
+
---
|
|
1448
1728
|
|
|
1449
|
-
|
|
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
|
-
**
|
|
1731
|
+
**Notificar inicio:**
|
|
1459
1732
|
|
|
1460
|
-
|
|
1461
|
-
|
|
1733
|
+
```
|
|
1734
|
+
🚀 Iniciando creación en Jira/AgileTest...
|
|
1462
1735
|
|
|
1463
|
-
|
|
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
|
-
|
|
1743
|
+
**Ejecutar el script usando Bash tool:**
|
|
1468
1744
|
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
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
|
-
**
|
|
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
|
-
|
|
1764
|
+
### F5.6: Completion
|
|
1481
1765
|
|
|
1482
|
-
|
|
1766
|
+
Parsear la salida final del script y presentar al usuario:
|
|
1483
1767
|
|
|
1484
1768
|
```
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
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
|
-
|
|
1782
|
+
⏱️ Tiempo total: ~5 minutos
|
|
1493
1783
|
|
|
1494
|
-
|
|
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
|
-
|
|
1497
|
-
|
|
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
|
-
|
|
1501
|
-
|
|
1502
|
-
-
|
|
1503
|
-
|
|
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
|
-
|
|
1798
|
+
## FASE 6 — IMPLEMENTACIÓN + EJECUCIÓN E2E
|
|
1508
1799
|
|
|
1509
|
-
|
|
1800
|
+
### Objetivo
|
|
1510
1801
|
|
|
1511
|
-
|
|
1512
|
-
|
|
1802
|
+
Generar y **ejecutar** el código Playwright de los casos diseñados, actuando como el **Agente
|
|
1803
|
+
Ejecutor E2E** (Agente #4 — ISTQB 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1531
|
-
|
|
1532
|
-
|
|
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
|
-
|
|
1536
|
-
```
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1576
|
-
|
|
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
|
-
**
|
|
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
|
-
###
|
|
1583
|
-
|
|
1584
|
-
**Por cada spec file con tests aprobados:**
|
|
1865
|
+
### F6.2: Resolver Architecture Brief
|
|
1585
1866
|
|
|
1586
|
-
|
|
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
|
-
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
-
|
|
1597
|
-
-
|
|
1598
|
-
|
|
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
|
-
###
|
|
1878
|
+
### F6.3: Enriquecer — YAML → `.md` de plan
|
|
1603
1879
|
|
|
1604
|
-
|
|
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
|
-
|
|
1607
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
1625
|
-
|
|
1626
|
-
Generar timestamp `YYYY-MM-DD-HHmmss` y guardar:
|
|
1896
|
+
### F6.4: Generación (Generator) — Megaprompt
|
|
1627
1897
|
|
|
1628
|
-
|
|
1629
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
|
|
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
|
-
|
|
1924
|
+
### F6.6: Healer Loop (reparación)
|
|
1645
1925
|
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
|
|
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
|
-
|
|
1937
|
+
### F6.7: Promover a `tests/` + Sync AgileTest
|
|
1651
1938
|
|
|
1652
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1662
|
-
|
|
1663
|
-
|
|
1945
|
+
---
|
|
1946
|
+
|
|
1947
|
+
### F6.8: Ejecución Oficial (cierra el gap hacia el RCA)
|
|
1664
1948
|
|
|
1665
|
-
|
|
1949
|
+
Preguntar con AskUserQuestion la ruta de ejecución:
|
|
1666
1950
|
|
|
1667
|
-
|
|
1668
|
-
|
|
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
|
-
|
|
1672
|
-
|
|
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
|
-
###
|
|
1984
|
+
### F6.9: Actualizar Estado + Reportes + Completion
|
|
1679
1985
|
|
|
1680
|
-
|
|
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
|
-
|
|
1686
|
-
|
|
1687
|
-
|
|
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
|
-
|
|
1692
|
-
{por cada spec file modificado:}
|
|
1693
|
-
• {ruta relativa} → +[N] tests
|
|
2016
|
+
📁 Corrida: {run_folder}
|
|
1694
2017
|
|
|
1695
|
-
|
|
1696
|
-
•
|
|
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
|
-
|
|
1699
|
-
•
|
|
2024
|
+
📄 Reportes (insumo del RCA):
|
|
2025
|
+
• allure-results/ · monocart-report/ · test-results/
|
|
1700
2026
|
|
|
1701
|
-
|
|
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
|
|
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.
|