elsabro 5.1.0 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -69,6 +69,31 @@ CHECKPOINT (preguntar):
69
69
  ```
70
70
  </critical_rules>
71
71
 
72
+ <skill_awareness>
73
+ ## Skill Awareness
74
+
75
+ ### Si recibes skills en tu contexto (seccion "SKILLS DE REFERENCIA"):
76
+
77
+ 1. **Lee las guias ANTES de implementar** — los skills contienen patrones verificados
78
+ 2. **Sigue la estructura de archivos sugerida** en `<project_structure>`
79
+ 3. **Usa los pre-requisitos** de `<pre_requisites>` para verificar dependencias
80
+ 4. **Aplica los patrones de codigo** de las secciones de implementacion
81
+ 5. **En tu output, menciona que skill usaste** para cada decision
82
+
83
+ ### Si NO recibes skills pero la tarea parece relevante:
84
+
85
+ 1. Busca en `skills/` con Glob("skills/*.md") por archivos relevantes
86
+ 2. Lee el archivo con Read() y usa como referencia
87
+ 3. Prioriza skills de: auth, database, testing, api
88
+
89
+ ### Keywords que activan busqueda de skills:
90
+ - auth/login/registro → skills/auth-setup.md
91
+ - database/db/prisma → skills/database-setup.md
92
+ - test/testing/jest → skills/testing-setup.md
93
+ - api/endpoint/rest → skills/api-setup.md
94
+ - payments/stripe → skills/payments-setup.md
95
+ </skill_awareness>
96
+
72
97
  <execution_flow>
73
98
  ## Flujo de Ejecución
74
99
 
@@ -46,6 +46,16 @@ Cada tarea debe:
46
46
  - Generar un commit significativo
47
47
  </critical_rules>
48
48
 
49
+ <skill_awareness>
50
+ ## Skill Awareness (Planner)
51
+
52
+ Si recibes skills en tu contexto:
53
+ 1. Referencia los skills relevantes en el PLAN.md que crees
54
+ 2. Usa las estructuras de archivos sugeridas por los skills
55
+ 3. Incorpora los pre-requisitos como dependencias del plan
56
+ 4. Menciona que skill aplica a cada tarea del plan
57
+ </skill_awareness>
58
+
49
59
  <research_first>
50
60
  ## Protocolo: Research-Before-Plan
51
61
 
@@ -38,6 +38,24 @@ sync:
38
38
  - Establecer `state.suggested_next = "verify-work"`
39
39
  </state_sync>
40
40
 
41
+ <skill_discovery>
42
+ ## Skill Discovery (Pre-Debug)
43
+
44
+ **ANTES de investigar el problema**, descubrir skills de debugging relevantes:
45
+
46
+ ```javascript
47
+ // Ejecutar skill discovery enfocado en debugging
48
+ const discoveryResult = Bash(`bash ./hooks/skill-discovery.sh "debug ${inputs.problem || args}" "medium"`, { timeout: 30000 });
49
+
50
+ // Guardar en estado
51
+ state.context = state.context || {};
52
+ state.context.available_skills = JSON.parse(discoveryResult).recommended || [];
53
+ Write(".elsabro/state.json", JSON.stringify(state, null, 2));
54
+ ```
55
+
56
+ Skills de testing, sentry, profiling y debugging pueden acelerar la investigación.
57
+ </skill_discovery>
58
+
41
59
  <objective>
42
60
  Investigar y resolver bugs usando el método científico, no adivinando.
43
61
 
@@ -4,6 +4,7 @@ description: Diseñar interfaces visuales con Stitch AI - genera screens y mocku
4
4
  allowed-tools:
5
5
  - Read
6
6
  - Write
7
+ - Bash
7
8
  - Task
8
9
  - TaskCreate
9
10
  - TaskUpdate
@@ -98,6 +99,24 @@ Write(".elsabro/context.md", generateHumanReadableContext(state));
98
99
  ```
99
100
  </state_sync>
100
101
 
102
+ <skill_discovery>
103
+ ## Skill Discovery (Pre-Design)
104
+
105
+ **ANTES de diseñar**, descubrir skills de UI relevantes:
106
+
107
+ ```javascript
108
+ // Ejecutar skill discovery enfocado en UI/design
109
+ const discoveryResult = Bash(`bash ./hooks/skill-discovery.sh "design ui ${inputs.task || args}" "medium"`, { timeout: 30000 });
110
+
111
+ // Guardar en estado
112
+ state.context = state.context || {};
113
+ state.context.available_skills = JSON.parse(discoveryResult).recommended || [];
114
+ Write(".elsabro/state.json", JSON.stringify(state, null, 2));
115
+ ```
116
+
117
+ Skills de stitch-ui-design, frontend-design y component libraries informan las decisiones de diseño.
118
+ </skill_discovery>
119
+
101
120
  <objective>
102
121
  Diseñar interfaces visuales usando **Stitch AI** como motor de generación. Convierte descripciones de texto o requerimientos de fase en screens visuales profesionales.
103
122
 
@@ -139,6 +139,74 @@ Write(".elsabro/context.md", generateHumanReadableContext(state));
139
139
  ```
140
140
  </state_sync>
141
141
 
142
+ <skill_discovery>
143
+ ## Skill Discovery (Pre-Execution)
144
+
145
+ **ANTES de ejecutar el plan**, descubrir skills para el stack:
146
+
147
+ ```javascript
148
+ // Ejecutar skill discovery con la tarea
149
+ const discoveryResult = Bash(`bash ./hooks/skill-discovery.sh "${inputs.task || state.context.current_feature || ''}" "medium"`, { timeout: 30000 });
150
+
151
+ // Guardar en estado
152
+ state.context = state.context || {};
153
+ state.context.available_skills = JSON.parse(discoveryResult).recommended || [];
154
+
155
+ // Informar al usuario
156
+ if (state.context.available_skills.length > 0) {
157
+ output(`Skills cargados: ${state.context.available_skills.map(s => s.name).join(", ")}`);
158
+ }
159
+ Write(".elsabro/state.json", JSON.stringify(state, null, 2));
160
+ ```
161
+
162
+ Los skills proveen patrones de código verificados, configuraciones de setup, y guides de integración durante la implementación.
163
+ </skill_discovery>
164
+
165
+ <skill_injection>
166
+ ## Skill Injection (OBLIGATORIO despues de Discovery)
167
+
168
+ **Si skill discovery encontro skills relevantes, CARGAR su contenido como contexto.**
169
+
170
+ ```javascript
171
+ // 1. Obtener skills recomendados
172
+ const recommendedSkills = state.context.available_skills || [];
173
+
174
+ if (recommendedSkills.length > 0) {
175
+ // 2. Cargar contenido de los top-3 skills con match
176
+ const loadedSkills = [];
177
+ for (const skill of recommendedSkills.slice(0, 3)) {
178
+ const content = Read(`skills/${skill.id}.md`);
179
+ if (content) {
180
+ loadedSkills.push({
181
+ name: skill.id,
182
+ content: content
183
+ });
184
+ }
185
+ }
186
+
187
+ // 3. Guardar skills cargados en state
188
+ state.context.loaded_skills = loadedSkills;
189
+ Write(".elsabro/state.json", JSON.stringify(state, null, 2));
190
+
191
+ // 4. Informar al usuario
192
+ output(`Skills cargados para esta ejecucion:`);
193
+ loadedSkills.forEach(s => output(` - ${s.name}`));
194
+ }
195
+ ```
196
+
197
+ **GATE**: Cuando lances agentes executors, INCLUIR los skills en el prompt:
198
+ ```
199
+ Si state.context.loaded_skills tiene contenido, agregar al prompt de CADA executor:
200
+
201
+ "SKILLS DE REFERENCIA:
202
+ [Para cada skill cargado:]
203
+ ### Skill: {name}
204
+ {contenido del archivo .md}
205
+
206
+ Usa estos skills como guia de patrones, estructura y mejores practicas."
207
+ ```
208
+ </skill_injection>
209
+
142
210
  <objective>
143
211
  Ejecutar planes de una fase con:
144
212
  - **Sistema de Tasks para tracking real** de waves y dependencias
@@ -505,6 +573,41 @@ Para cada wave:
505
573
  TaskUpdate({ taskId: "wave-W-id", status: "in_progress" })
506
574
  ```
507
575
 
576
+ <IMPERATIVO_AGENT_TEAMS>
577
+ ## ⛔ STOP — LEER ANTES DE LANZAR AGENTES PARALELOS
578
+
579
+ **REGLA NO NEGOCIABLE (Rule 8):** Si vas a lanzar 2+ Task() para implementacion o review:
580
+
581
+ 1. **PRIMERO** → `TeamCreate({ team_name: "elsabro-impl", description: "..." })`
582
+ 2. **DESPUES** → `Task({ ..., team_name: "elsabro-impl", name: "executor-1" })`
583
+ 3. **AL FINAL** → `SendMessage({ type: "shutdown_request", ... })` para CADA teammate
584
+ 4. **ULTIMO** → `TeamDelete()`
585
+
586
+ **Si ya lanzaste Task() sin TeamCreate: DETENTE AHORA. No continúes.**
587
+ Vuelve arriba, crea el team, y relanza los agentes CON team_name.
588
+
589
+ **NUNCA hagas esto:**
590
+ ```javascript
591
+ // ⛔ PROHIBIDO — bare Task() sin team
592
+ Task({ subagent_type: "elsabro-executor", prompt: "..." })
593
+ Task({ subagent_type: "elsabro-qa", prompt: "..." })
594
+ ```
595
+
596
+ **SIEMPRE haz esto:**
597
+ ```javascript
598
+ // ✅ CORRECTO — con Agent Team
599
+ TeamCreate({ team_name: "elsabro-impl", description: "Implementation" })
600
+ Task({ subagent_type: "elsabro-executor", team_name: "elsabro-impl", name: "executor-1", prompt: "..." })
601
+ Task({ subagent_type: "elsabro-qa", team_name: "elsabro-impl", name: "qa-1", prompt: "..." })
602
+ // ... al completar ...
603
+ SendMessage({ type: "shutdown_request", recipient: "executor-1", content: "Done" })
604
+ SendMessage({ type: "shutdown_request", recipient: "qa-1", content: "Done" })
605
+ TeamDelete()
606
+ ```
607
+
608
+ **Excepcion UNICA:** Exploracion read-only con HAIKU (Paso 0) puede usar subagents sueltos.
609
+ </IMPERATIVO_AGENT_TEAMS>
610
+
508
611
  ### Si hay múltiples planes en la wave → Paralelo (OPUS)
509
612
  ```javascript
510
613
  // Marcar todos los planes como in_progress
@@ -525,13 +628,20 @@ Write(".elsabro/state.json", JSON.stringify(state, null, 2));
525
628
 
526
629
  // Lanzar teammates OPUS en paralelo (UN SOLO MENSAJE)
527
630
  // MODELO: OPUS porque escriben código
631
+ // SKILLS: Incluir loaded_skills en CADA prompt de executor
632
+ const skillContext = state.context.loaded_skills?.length > 0
633
+ ? '\n\n## SKILLS DE REFERENCIA\n' + state.context.loaded_skills.map(s =>
634
+ '### Skill: ' + s.name + '\n' + s.content
635
+ ).join('\n\n---\n\n') + '\n\nUsa los skills como referencia de patrones y estructura de archivos.'
636
+ : '';
637
+
528
638
  Task({
529
639
  subagent_type: "elsabro-executor",
530
640
  model: "opus", // ← OPUS para implementación
531
641
  team_name: "elsabro-impl",
532
642
  name: "executor-1",
533
643
  description: "Ejecutar Plan A",
534
- prompt: "Implementa el Plan A siguiendo TDD..."
644
+ prompt: `Implementa el Plan A siguiendo TDD.${skillContext}`
535
645
  }) |
536
646
  Task({
537
647
  subagent_type: "elsabro-executor",
@@ -539,7 +649,7 @@ Task({
539
649
  team_name: "elsabro-impl",
540
650
  name: "executor-2",
541
651
  description: "Ejecutar Plan B",
542
- prompt: "Implementa el Plan B siguiendo TDD..."
652
+ prompt: `Implementa el Plan B siguiendo TDD.${skillContext}`
543
653
  }) |
544
654
  Task({
545
655
  subagent_type: "elsabro-executor",
@@ -547,7 +657,7 @@ Task({
547
657
  team_name: "elsabro-impl",
548
658
  name: "executor-3",
549
659
  description: "Ejecutar Plan C",
550
- prompt: "Implementa el Plan C siguiendo TDD..."
660
+ prompt: `Implementa el Plan C siguiendo TDD.${skillContext}`
551
661
  })
552
662
 
553
663
  // Al completar cada plan
@@ -740,6 +850,29 @@ Cuando termines, dime si funcionó o qué problemas encontraste.
740
850
 
741
851
  </process>
742
852
 
853
+ <agent_teams_cleanup>
854
+ ## Agent Teams Cleanup (OBLIGATORIO)
855
+
856
+ **Al completar TODAS las fases de implementacion y review:**
857
+
858
+ ```javascript
859
+ // 1. Shutdown CADA teammate por nombre
860
+ const teammates = ["executor-1", "executor-2", "executor-3", "reviewer-1", "reviewer-2", "reviewer-3"];
861
+ for (const name of teammates) {
862
+ SendMessage({ type: "shutdown_request", recipient: name, content: "All phases complete" });
863
+ }
864
+
865
+ // 2. Eliminar team
866
+ TeamDelete();
867
+
868
+ // 3. Registrar en state
869
+ state.current_flow.agent_teams_cleanup = true;
870
+ Write(".elsabro/state.json", JSON.stringify(state, null, 2));
871
+ ```
872
+
873
+ **GATE**: No mostrar "Siguiente Paso" si agent_teams_cleanup !== true y hubo 2+ agentes.
874
+ </agent_teams_cleanup>
875
+
743
876
  <code_review_gate>
744
877
  ## Code Review Gate (OBLIGATORIO - NO NEGOCIABLE)
745
878
 
@@ -763,6 +896,30 @@ Cuando termines, dime si funcionó o qué problemas encontraste.
763
896
  <siguiente_paso>
764
897
  ## Siguiente Paso
765
898
 
899
+ ### Self-Check (OBLIGATORIO antes de reportar resultado)
900
+
901
+ Antes de mostrar "Siguiente Paso", verifica CADA UNO de estos items:
902
+
903
+ ```
904
+ [ ] Si lance 2+ Task() en paralelo → ¿use TeamCreate primero?
905
+ SI: Continuar
906
+ NO: DETENERME. Crear team y relanzar.
907
+
908
+ [ ] Si descubri skills relevantes → ¿los cargue con Read() y los pase al executor?
909
+ SI: Continuar
910
+ NO: DETENERME. Cargar skills y re-ejecutar.
911
+
912
+ [ ] Si escribi/modifique codigo → ¿ejecute code review?
913
+ SI: Continuar
914
+ NO: DETENERME. Ejecutar code review.
915
+
916
+ [ ] Si use Agent Teams → ¿ejecute SendMessage(shutdown) + TeamDelete?
917
+ SI: Continuar
918
+ NO: DETENERME. Hacer cleanup.
919
+ ```
920
+
921
+ **Si alguna respuesta es NO: NO mostrar siguiente paso. Corregir primero.**
922
+
766
923
  Al completar, establecer en state.json:
767
924
  ```javascript
768
925
  // GATE CHECK 1: No escribir suggested_next sin code review
@@ -1214,3 +1371,22 @@ Al completar un plan:
1214
1371
  - [x] Tests: npm run test
1215
1372
  ```
1216
1373
  </summary_creation>
1374
+
1375
+ <engine_integration>
1376
+ ## Flow Engine (v6.0.0)
1377
+
1378
+ The flow engine runtime is available at `flow-engine/src/index.js`.
1379
+ It can parse and execute `flows/development-flow.json`.
1380
+
1381
+ Current status: Engine handles implemented nodes (19/42).
1382
+ Not-implemented nodes throw NotImplementedError with gap descriptions.
1383
+
1384
+ For full engine-driven execution (future):
1385
+ ```javascript
1386
+ const { FlowEngine } = require('./flow-engine/src/index.js');
1387
+ const flow = require('./flows/development-flow.json');
1388
+ const engine = new FlowEngine({ callbacks: { onAgent, onBash, onInterrupt, onCheckpoint, onParallel, onTeamRequired } });
1389
+ engine.loadFlow(flow);
1390
+ const result = await engine.run({ task, profile, complexity }, callbacks);
1391
+ ```
1392
+ </engine_integration>
@@ -38,6 +38,29 @@ sync:
38
38
  - Establecer `state.context.suggested_args = "1"` para la primera fase
39
39
  </state_sync>
40
40
 
41
+ <skill_discovery>
42
+ ## Skill Discovery (Pre-Work)
43
+
44
+ **DESPUÉS de saber qué quiere crear el usuario**, descubrir skills del stack:
45
+
46
+ ```javascript
47
+ // Ejecutar skill discovery con el tipo de proyecto
48
+ const discoveryResult = Bash(`bash ./hooks/skill-discovery.sh "${inputs.projectType || args}" "medium"`, { timeout: 30000 });
49
+
50
+ // Guardar en estado
51
+ state.context = state.context || {};
52
+ state.context.available_skills = JSON.parse(discoveryResult).recommended || [];
53
+
54
+ // Informar al usuario
55
+ if (state.context.available_skills.length > 0) {
56
+ output(`Skills para tu proyecto: ${state.context.available_skills.map(s => s.name).join(", ")}`);
57
+ }
58
+ Write(".elsabro/state.json", JSON.stringify(state, null, 2));
59
+ ```
60
+
61
+ Estos skills guían la configuración inicial del proyecto (nextjs-app, expo-app, auth-setup, etc.).
62
+ </skill_discovery>
63
+
41
64
  <objective>
42
65
  Crear un proyecto nuevo con investigación previa, configuración correcta, y estructura lista para desarrollo.
43
66
 
@@ -11,6 +11,9 @@ allowed-tools:
11
11
  - TaskCreate
12
12
  - TaskUpdate
13
13
  - TaskList
14
+ - TeamCreate
15
+ - TeamDelete
16
+ - SendMessage
14
17
  - WebSearch
15
18
  - AskUserQuestion
16
19
  - mcp__plugin_context7_context7__*
@@ -134,6 +137,58 @@ Write(".elsabro/context.md", generateHumanReadableContext(state));
134
137
  ```
135
138
  </state_sync>
136
139
 
140
+ <skill_discovery>
141
+ ## Skill Discovery (Pre-Planning)
142
+
143
+ **ANTES de explorar el codebase**, descubrir skills relevantes para la tarea:
144
+
145
+ ```javascript
146
+ // Ejecutar skill discovery con la descripción de la tarea
147
+ const discoveryResult = Bash(`bash ./hooks/skill-discovery.sh "${inputs.task || args}" "medium"`, { timeout: 30000 });
148
+
149
+ // Guardar en estado
150
+ state.context = state.context || {};
151
+ state.context.available_skills = JSON.parse(discoveryResult).recommended || [];
152
+
153
+ // Informar al usuario
154
+ if (state.context.available_skills.length > 0) {
155
+ output(`Skills relevantes: ${state.context.available_skills.map(s => s.name).join(", ")}`);
156
+ }
157
+ Write(".elsabro/state.json", JSON.stringify(state, null, 2));
158
+ ```
159
+
160
+ Los skills descubiertos informan la fase de research (Context7 queries) y la creación del PLAN.md.
161
+ </skill_discovery>
162
+
163
+ <skill_injection>
164
+ ## Skill Injection (Para Planificacion)
165
+
166
+ Despues de skill discovery, cargar skills relevantes para informar al planner:
167
+
168
+ ```javascript
169
+ const recommendedSkills = state.context.available_skills || [];
170
+ if (recommendedSkills.length > 0) {
171
+ const loadedSkills = [];
172
+ for (const skill of recommendedSkills.slice(0, 3)) {
173
+ const content = Read(`skills/${skill.id}.md`);
174
+ if (content) {
175
+ loadedSkills.push({ name: skill.id, content: content });
176
+ }
177
+ }
178
+ state.context.loaded_skills = loadedSkills;
179
+ Write(".elsabro/state.json", JSON.stringify(state, null, 2));
180
+ }
181
+ ```
182
+
183
+ **Al lanzar el planner OPUS**: Incluir skills como contexto:
184
+ ```
185
+ "Skills disponibles para esta tarea:
186
+ ${loadedSkills.map(s => '- ' + s.name + ': ' + s.content.slice(0, 200)).join('\n')}
187
+
188
+ Referencia estos skills en tu plan cuando aplique."
189
+ ```
190
+ </skill_injection>
191
+
137
192
  <objective>
138
193
  Crear un plan ejecutable para una fase o feature, con investigación previa usando Context7 y WebSearch.
139
194
 
@@ -26,6 +26,43 @@ sync:
26
26
  - Establecer `state.suggested_next = "progress"` en state.json
27
27
  </state_sync>
28
28
 
29
+ <skill_discovery>
30
+ ## Skill Discovery (Quick)
31
+
32
+ **Descubrir skills relevantes** para el fix rápido:
33
+
34
+ ```javascript
35
+ // Ejecutar skill discovery (rápido, usa cache)
36
+ const discoveryResult = Bash(`bash ./hooks/skill-discovery.sh "${inputs.task || args}" "low"`, { timeout: 15000 });
37
+
38
+ // Guardar en estado
39
+ state.context = state.context || {};
40
+ state.context.available_skills = JSON.parse(discoveryResult).recommended || [];
41
+ Write(".elsabro/state.json", JSON.stringify(state, null, 2));
42
+ ```
43
+ </skill_discovery>
44
+
45
+ <skill_injection>
46
+ ## Skill Injection (Quick)
47
+
48
+ Si discovery encontro skills relevantes, cargar el top-1 skill como referencia rapida:
49
+
50
+ ```javascript
51
+ const skills = state.context.available_skills || [];
52
+ if (skills.length > 0) {
53
+ const topSkill = Read(`skills/${skills[0].id}.md`);
54
+ if (topSkill) {
55
+ state.context.loaded_skills = [{ name: skills[0].id, content: topSkill }];
56
+ }
57
+ }
58
+ ```
59
+
60
+ Incluir en el prompt del agente quick:
61
+ ```
62
+ "Skill de referencia: ${topSkill ? topSkill.name : 'ninguno'}"
63
+ ```
64
+ </skill_injection>
65
+
29
66
  <command-name>quick</command-name>
30
67
 
31
68
  ## Propósito
@@ -24,6 +24,24 @@ sync:
24
24
  - Establecer `state.suggested_next = "plan"`
25
25
  </state_sync>
26
26
 
27
+ <skill_discovery>
28
+ ## Skill Discovery (Pre-Research)
29
+
30
+ **ANTES de investigar**, descubrir skills relevantes para las tecnologías:
31
+
32
+ ```javascript
33
+ // Ejecutar skill discovery con el tema de research
34
+ const discoveryResult = Bash(`bash ./hooks/skill-discovery.sh "research ${inputs.phase || args}" "medium"`, { timeout: 30000 });
35
+
36
+ // Guardar en estado
37
+ state.context = state.context || {};
38
+ state.context.available_skills = JSON.parse(discoveryResult).recommended || [];
39
+ Write(".elsabro/state.json", JSON.stringify(state, null, 2));
40
+ ```
41
+
42
+ Los skills informan qué tecnologías investigar y qué patrones buscar en Context7.
43
+ </skill_discovery>
44
+
27
45
  <command-name>research-phase</command-name>
28
46
 
29
47
  ## Propósito
@@ -49,6 +49,29 @@ allowed-tools:
49
49
  - Menos de 2 agentes para detección = **ABORTAR**
50
50
  </enforcement>
51
51
 
52
+ <skill_discovery>
53
+ ## Skill Discovery (Pre-Work)
54
+
55
+ **DESPUÉS de detectar contexto**, descubrir skills relevantes para la tarea:
56
+
57
+ ```javascript
58
+ // Ejecutar skill discovery (usa cache de 1 hora)
59
+ const discoveryResult = Bash(`bash ./hooks/skill-discovery.sh "${inputs.task || 'detect project'}" "medium"`, { timeout: 30000 });
60
+
61
+ // Guardar en estado
62
+ state.context = state.context || {};
63
+ state.context.available_skills = JSON.parse(discoveryResult).recommended || [];
64
+
65
+ // Informar al usuario si hay skills relevantes
66
+ if (state.context.available_skills.length > 0) {
67
+ output(`Skills detectados: ${state.context.available_skills.map(s => s.name).join(", ")}`);
68
+ }
69
+ Write(".elsabro/state.json", JSON.stringify(state, null, 2));
70
+ ```
71
+
72
+ Los skills descubiertos se pasan al comando siguiente (plan, execute, etc.) para informar patrones y configuraciones.
73
+ </skill_discovery>
74
+
52
75
  <objective>
53
76
  Eres el **orquestador principal** de ELSABRO. Tu trabajo es:
54
77
 
@@ -324,6 +324,19 @@ Agrega verificaciones extra:
324
324
  - Compatible con CI/CD pipelines
325
325
  - Genera reporte en `.planning/VERIFICATION-REPORT.md`
326
326
 
327
+ <IMPERATIVO_AGENT_TEAMS>
328
+ ## ⛔ STOP — ANTES DE LANZAR REVIEWERS PARALELOS
329
+
330
+ **REGLA NO NEGOCIABLE (Rule 8):** Los 3 reviewers DEBEN ejecutarse como Agent Team.
331
+
332
+ 1. **PRIMERO** → `TeamCreate({ team_name: "elsabro-verify", description: "Verification team" })`
333
+ 2. **DESPUES** → `Task({ ..., team_name: "elsabro-verify", name: "reviewer-N" })` x3
334
+ 3. **AL FINAL** → `SendMessage({ type: "shutdown_request", ... })` x3
335
+ 4. **ULTIMO** → `TeamDelete()`
336
+
337
+ **NUNCA lances 3 Task() de review sin TeamCreate previo.**
338
+ </IMPERATIVO_AGENT_TEAMS>
339
+
327
340
  <parallel_coordination>
328
341
  ## Coordinación de Verificación Paralela
329
342
 
@@ -612,6 +625,22 @@ TaskCreate({
612
625
  <siguiente_paso>
613
626
  ## Siguiente Paso
614
627
 
628
+ ### Self-Check (OBLIGATORIO antes de reportar resultado)
629
+
630
+ Antes de mostrar "Siguiente Paso", verifica CADA UNO de estos items:
631
+
632
+ ```
633
+ [ ] Si lance 2+ Task() en paralelo → ¿use TeamCreate primero?
634
+ SI: Continuar
635
+ NO: DETENERME. Crear team y relanzar.
636
+
637
+ [ ] Si use Agent Teams → ¿ejecute SendMessage(shutdown) + TeamDelete?
638
+ SI: Continuar
639
+ NO: DETENERME. Hacer cleanup.
640
+ ```
641
+
642
+ **Si alguna respuesta es NO: NO mostrar siguiente paso. Corregir primero.**
643
+
615
644
  Al completar, establecer en state.json:
616
645
  ```javascript
617
646
  // GATE CHECK: No proceder sin Agent Teams para fases con 2+ agentes
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "elsabro-flow-engine",
3
+ "version": "0.1.0",
4
+ "description": "Runtime engine for ELSABRO development-flow.json",
5
+ "main": "src/index.js",
6
+ "scripts": {
7
+ "test": "node --test tests/"
8
+ },
9
+ "engines": {
10
+ "node": ">=18.0.0"
11
+ },
12
+ "license": "MIT"
13
+ }