ostacky 0.5.6 → 0.5.7

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.
@@ -0,0 +1,502 @@
1
+ # Ostacky E2E Test Scenarios
2
+
3
+ Tests para verificar que Ostacky clasifica correctamente y rutea al flujo adecuado.
4
+
5
+ ## Setup
6
+
7
+ ```bash
8
+ # Ensure CodeGraph is initialized
9
+ codegraph init -i
10
+
11
+ # Ensure Engram is running
12
+ engram serve &
13
+
14
+ # Start OpenCode with Ostacky agent
15
+ opencode
16
+ ```
17
+
18
+ ---
19
+
20
+ ## Test 1: Level 0 — Cambio trivial → Superpowers (DIRECT)
21
+
22
+ ### Input del usuario
23
+ ```
24
+ Agregá un tooltip al botón de "Submit" en el formulario de contacto
25
+ ```
26
+
27
+ ### Comportamiento esperado
28
+
29
+ **Paso 1 — Recepción:**
30
+ - Ostacky llama `start_request`
31
+ - Ostacky analiza: 1 archivo, sin API pública, sin dependencias nuevas, <15 líneas
32
+ - Clasificación: **Nivel 0**
33
+
34
+ **Paso 2 — Pregunta al usuario:**
35
+ ```
36
+ Esto es Nivel 0. Por defecto lo ejecuto directo con Superpowers. ¿O preferís spec?
37
+ ```
38
+
39
+ **Paso 3 — Si usuario responde "directo" (default):**
40
+ - Ostacky llama `record_discovery({ level: "0" })`
41
+ - Ostacky llama `consume_route_decision({ choice: "DIRECT" })`
42
+ - Ostacky ejecuta el cambio directamente usando:
43
+ - `Read` para leer el archivo
44
+ - `validate_edit` antes de editar
45
+ - `edit` para hacer el cambio
46
+ - `complete_task` para marcar completado
47
+
48
+ **Paso 4 — Cierre:**
49
+ - Tests pasan
50
+ - Review rápido
51
+ - `codegraph sync`
52
+ - `implementation_complete` → `sync_complete`
53
+
54
+ ### Validación
55
+ - [ ] No se invocó `thinking` skill
56
+ - [ ] No se invocó `openspec-propose`
57
+ - [ ] Cambio se hizo directamente con Superpowers
58
+ - [ ] Controller termina en estado DONE
59
+
60
+ ---
61
+
62
+ ## Test 2: Level 0+1 — Cambio chico no trivial → Superpowers (DIRECT)
63
+
64
+ ### Input del usuario
65
+ ```
66
+ Agregá validación de email en el formulario de registro — que rejecte emails inválidos y muestre un mensaje de error
67
+ ```
68
+
69
+ ### Comportamiento esperado
70
+
71
+ **Paso 1 — Recepción:**
72
+ - Ostacky analiza: 1-2 archivos, sin API pública nueva, <30 líneas
73
+ - Clasificación: **Nivel 0+1**
74
+
75
+ **Paso 2 — Pregunta al usuario:**
76
+ ```
77
+ Esto es Nivel 0+1. Por defecto lo ejecuto directo con Superpowers. ¿O preferís spec?
78
+ ```
79
+
80
+ **Paso 3 — Si usuario responde "directo":**
81
+ - Mismo flujo que Test 1
82
+
83
+ ### Validación
84
+ - [ ] Clasificación correcta como Nivel 0+1
85
+ - [ ] Se sugiere Superpowers por defecto
86
+ - [ ] Cambio se ejecuta directamente
87
+
88
+ ---
89
+
90
+ ## Test 3: Level 1+ — Cambio complejo → OpenSpec (SPEC)
91
+
92
+ ### Input del usuario
93
+ ```
94
+ Necesito agregar autenticación con OAuth a la aplicación — que soporte Google y GitHub login, con sesiones persistentes
95
+ ```
96
+
97
+ ### Comportamiento esperado
98
+
99
+ **Paso 1 — Recepción:**
100
+ - Ostacky analiza: modifica API pública, agrega dependencias, impacto cross-module
101
+ - Clasificación: **Nivel 1+**
102
+
103
+ **Paso 2 — Pregunta al usuario:**
104
+ ```
105
+ Esto es Nivel 1+ porque requiere autenticación completa con OAuth, sesiones, y múltiples providers. Recomiendo generar spec con OpenSpec. ¿O preferís ejecutar directo?
106
+ ```
107
+
108
+ **Paso 3 — Si usuario responde "spec":**
109
+ - Ostacky llama `record_discovery({ level: "1+" })`
110
+ - Ostacky llama `consume_route_decision({ choice: "SPEC" })`
111
+
112
+ **Paso 4 — Specification phase:**
113
+ - Ostacky pregunta si quiere thinking o ir directo a spec
114
+ - Si usuario elige thinking:
115
+ - Se invoca skill `thinking` (creative-design mode)
116
+ - thinking explora el codebase via CodeGraph
117
+ - thinking busca en Engram decisiones previas de auth
118
+ - thinking propone 2-3 approaches
119
+ - thinking escribe design doc
120
+ - thinking transiciona a `openspec-propose` (porque routing=SPEC)
121
+ - Si usuario elige directo a spec:
122
+ - Se invoca `openspec-propose` directamente
123
+
124
+ **Paso 5 — openspec-propose:**
125
+ - Crea change directory
126
+ - Genera proposal.md, design.md, tasks.md
127
+ - llama `spec_complete`
128
+
129
+ **Paso 6 — Execution:**
130
+ - Se invoca `execution-mode-evaluation` para determinar INLINE vs SUBAGENT
131
+ - Se ejecutan las tasks
132
+ - `implementation_complete` → `sync_complete`
133
+
134
+ ### Validación
135
+ - [ ] Clasificación correcta como Nivel 1+
136
+ - [ ] Se sugiere OpenSpec
137
+ - [ ] Se invocó `thinking` (si usuario eligió thinking)
138
+ - [ ] thinking transicionó a `openspec-propose`
139
+ - [ ] Se crearon artifacts en `openspec/changes/<name>/`
140
+ - [ ] Controller termina en estado DONE
141
+
142
+ ---
143
+
144
+ ## Test 4: Level 1+ con requisitos vagos → Thinking first
145
+
146
+ ### Input del usuario
147
+ ```
148
+ Quiero mejorar el sistema de notificaciones de la app
149
+ ```
150
+
151
+ ### Comportamiento esperado
152
+
153
+ **Paso 1 — Clasificación:**
154
+ - Requisitos vagos pero área amplia → **Nivel 1+**
155
+
156
+ **Paso 2 — Pregunta:**
157
+ ```
158
+ Esto es Nivel 1+ porque afecta múltiples módulos. Recomiendo generar spec con OpenSpec. ¿O preferís ejecutar directo?
159
+ ```
160
+
161
+ **Paso 3 — Si usuario responde "spec":**
162
+ - Ostacky pregunta: "Los requisitos están un poco vagos. ¿Querés que exploremos y diseñemos juntos (thinking) o preferís ir directo a generar el spec?"
163
+
164
+ **Paso 4 — Si usuario elige thinking:**
165
+ - Se invoca `thinking` (creative-design mode)
166
+ - thinking pregunta: "¿Qué tipo de notificaciones tenés en mente?"
167
+ - thinking explora el sistema actual de notificaciones
168
+ - thinking propone approach
169
+ - thinking escribe design doc
170
+ - thinking transiciona a `openspec-propose`
171
+
172
+ ### Validación
173
+ - [ ] Se detectaron requisitos vagos
174
+ - [ ] Se ofreció thinking como opción
175
+ - [ ] thinking exploró antes de diseñar
176
+ - [ ] Flujo completo hasta openspec-propose
177
+
178
+ ---
179
+
180
+ ## Test 5: Exploración open-ended → Thinking (open-explore)
181
+
182
+ ### Input del usuario
183
+ ```
184
+ ¿Cómo funciona actualmente el sistema de permisos? Quiero entender si es escalable
185
+ ```
186
+
187
+ ### Comportamiento esperado
188
+
189
+ **Paso 1 — Detección de modo:**
190
+ - Señales: "cómo funciona", "entender", "querés entender"
191
+ - Modo detectado: **open-explore**
192
+
193
+ **Paso 2 — thinking ejecuta:**
194
+ - `codegraph_explore` sobre el sistema de permisos
195
+ - Mapea arquitectura actual
196
+ - Identifica patrones
197
+ - Presenta diagrama ASCII del flujo de permisos
198
+ - Analiza escalabilidad
199
+
200
+ **Paso 3 — Cierre:**
201
+ - Usuario tiene lo que necesita
202
+ - No se crea design doc (no es necesario)
203
+ - No se invoca siguiente skill
204
+
205
+ ### Validación
206
+ - [ ] Se detectó modo open-explore
207
+ - [ ] No se forzó output de design doc
208
+ - [ ] Se usó CodeGraph para explorar
209
+ - [ ] Se presentó análisis estructurado
210
+
211
+ ---
212
+
213
+ ## Test 6: Cambio que parece simple pero es complejo
214
+
215
+ ### Input del usuario
216
+ ```
217
+ Agregá un botón de "Export to CSV" en la tabla de usuarios
218
+ ```
219
+
220
+ ### Comportamiento esperado
221
+
222
+ **Paso 1 — Análisis:**
223
+ - Superficialmente: 1 archivo, botón simple → Nivel 0
224
+ - Pero: exportar CSV puede implicar:
225
+ - Manejo de datos sensibles (usuarios)
226
+ - Permisos (¿quién puede exportar?)
227
+ - Performance (¿tabla grande?)
228
+ - Formato de datos (¿encoding, separadores?)
229
+
230
+ **Paso 2 — Ostacky investiga:**
231
+ - Usa CodeGraph para entender la tabla de usuarios
232
+ - Descubre que hay 10,000+ usuarios
233
+ - Descubre que hay datos sensibles (email, teléfono)
234
+ - Clasificación revisada: **Nivel 1+**
235
+
236
+ **Paso 3 — Pregunta:**
237
+ ```
238
+ Esto es Nivel 1+ porque involucra datos sensibles de usuarios, permisos, y potencialmente performance con tablas grandes. Recomiendo generar spec con OpenSpec. ¿O preferís ejecutar directo?
239
+ ```
240
+
241
+ ### Validación
242
+ - [ ] Ostacky no asumió que era trivial
243
+ - [ ] Investigó antes de clasificar
244
+ - [ ] Reclasificó si encontró complejidad oculta
245
+ - [ ] Informó al usuario por qué es nivel superior
246
+
247
+ ---
248
+
249
+ ## Test 7: Transición thinking → openspec-propose
250
+
251
+ ### Input del usuario
252
+ ```
253
+ Refactorizá el módulo de pagos para usar una abstracción de provider
254
+ ```
255
+
256
+ ### Flujo completo
257
+
258
+ ```
259
+ 1. Ostacky: start_request
260
+ 2. Ostacky: codegraph_explore (área de pagos)
261
+ 3. Ostacky: Clasifica como Level 1+
262
+ 4. Ostacky: Pregunta SPEC vs DIRECT
263
+ 5. Usuario: "SPEC"
264
+ 6. Ostacky: record_discovery({ level: "1+" })
265
+ 7. Ostacky: consume_route_decision({ choice: "SPEC" })
266
+ 8. Ostacky: Pregunta thinking vs directo a spec
267
+ 9. Usuario: "thinking"
268
+ 10. Ostacky: Invoca skill thinking (creative-design)
269
+ 11. thinking: engram_mem_search (pagos, providers)
270
+ 12. thinking: codegraph_explore (módulo de pagos)
271
+ 13. thinking: Propone 2-3 approaches
272
+ 14. thinking: Presenta diseño
273
+ 15. thinking: Usuario aprueba
274
+ 16. thinking: Escribe design doc
275
+ 17. thinking: Transition Rules → routing=SPEC → invoca openspec-propose
276
+ 18. openspec-propose: Crea change directory
277
+ 19. openspec-propose: Genera proposal.md
278
+ 20. openspec-propose: Genera design.md (o lee el de thinking)
279
+ 21. openspec-propose: Genera tasks.md
280
+ 22. openspec-propose: spec_complete
281
+ 23. Ostacky: Execution phase
282
+ 24. Ostacky: execution-mode-evaluation
283
+ 25. Ostacky: Ejecuta tasks
284
+ 26. Ostacky: sync_complete
285
+ ```
286
+
287
+ ### Validación
288
+ - [ ] Flujo completo sin interrupciones
289
+ - [ ] thinking transiciona correctamente a openspec-propose
290
+ - [ ] No se perdió contexto entre skills
291
+ - [ ] Controller mantiene estado correcto durante todo el flujo
292
+
293
+ ---
294
+
295
+ ## Test 8: Análisis de archivos compartidos en execution-mode-evaluation
296
+
297
+ ### Input del usuario
298
+ ```
299
+ Agregá soporte para multi-idioma en el módulo de configuración — que soporte español, inglés y portugués
300
+ ```
301
+
302
+ ### tasks.md esperado
303
+
304
+ ```markdown
305
+ ### Task 1: Crear archivo de traducciones
306
+ - [ ] Crear src/i18n/locales/es.json con traducciones en español
307
+
308
+ ### Task 2: Crear archivo de traducciones inglés
309
+ - [ ] Crear src/i18n/locales/en.json con traducciones en inglés
310
+
311
+ ### Task 3: Crear configuración i18n
312
+ - [ ] Crear src/i18n/config.ts que carga los archivos de traducción
313
+
314
+ ### Task 4: Integrar i18n en el componente de configuración
315
+ - [ ] Modificar src/settings/Settings.tsx para usar traducciones
316
+ ```
317
+
318
+ ### Análisis esperado
319
+
320
+ **Paso 1 — Construcción de sharedFiles:**
321
+ ```
322
+ sharedFiles: {
323
+ "src/i18n/locales/es.json": ["task1"],
324
+ "src/i18n/locales/en.json": ["task2"],
325
+ "src/i18n/config.ts": ["task3"],
326
+ "src/settings/Settings.tsx": ["task4"]
327
+ }
328
+ ```
329
+
330
+ **Paso 2 — Construcción de fileClusters:**
331
+ ```
332
+ fileClusters: [
333
+ ["task1"], // es.json
334
+ ["task2"], // en.json
335
+ ["task3"], // config.ts
336
+ ["task4"] // Settings.tsx
337
+ ]
338
+ clusterCount: 4 (== taskCount)
339
+ ```
340
+
341
+ **Paso 3 — Reglas aplicadas:**
342
+ - clusterCount == 4, taskCount == 4 → Rule 3a/3b/3c aplica
343
+ - Si estLines >= 30 y taskCount >= 3 → **Rule 3c: SUBAGENT-DRIVEN**
344
+
345
+ **Output esperado al usuario:**
346
+ ```markdown
347
+ ## Análisis de modo de ejecución
348
+
349
+ **Recomendación:** SUBAGENT_DRIVEN
350
+
351
+ ### Archivos compartidos entre tasks
352
+ | Archivo | Tasks que lo modifican |
353
+ |---------|------------------------|
354
+ | src/i18n/locales/es.json | task1 |
355
+ | src/i18n/locales/en.json | task2 |
356
+ | src/i18n/config.ts | task3 |
357
+ | src/settings/Settings.tsx | task4 |
358
+
359
+ ### Clusters detectados
360
+ | Cluster | Tasks | Archivos |
361
+ |---------|-------|----------|
362
+ | A | task1 | src/i18n/locales/es.json |
363
+ | B | task2 | src/i18n/locales/en.json |
364
+ | C | task3 | src/i18n/config.ts |
365
+ | D | task4 | src/settings/Settings.tsx |
366
+
367
+ ### Dependencias secuenciales
368
+ - Ninguna detectada
369
+
370
+ ### Razón principal
371
+ [Regla 3c]: 4 clusters independientes (== taskCount) → SUBAGENT-DRIVEN. Cada task corre en paralelo.
372
+
373
+ ### Estimación
374
+ ~60 líneas en 4 archivos
375
+ ```
376
+
377
+ ### Validación
378
+ - [ ] sharedFiles muestra cada archivo y qué tasks lo modifican
379
+ - [ ] fileClusters muestra las tareas agrupadas por archivos compartidos
380
+ - [ ] La razón explica qué regla se aplicó y por qué
381
+ - [ ] El usuario puede ver si hay archivos compartidos antes de confirmar
382
+
383
+ ---
384
+
385
+ ## Test 9: Archivos compartidos forzan INLINE
386
+
387
+ ### Input del usuario
388
+ ```
389
+ Refactorizá el sistema de logging — extraer una interfaz común y actualizar todos los módulos que la usan
390
+ ```
391
+
392
+ ### tasks.md esperado
393
+
394
+ ```markdown
395
+ ### Task 1: Definir interfaz de logger
396
+ - [ ] Crear src/logger/LoggerInterface.ts
397
+
398
+ ### Task 2: Implementar ConsoleLogger
399
+ - [ ] Crear src/logger/ConsoleLogger.ts que implemente la interfaz
400
+
401
+ ### Task 3: Actualizar módulo de auth para usar la nueva interfaz
402
+ - [ ] Modificar src/auth/auth.ts para usar LoggerInterface
403
+
404
+ ### Task 4: Actualizar módulo de pagos para usar la nueva interfaz
405
+ - [ ] Modificar src/payments/payments.ts para usar LoggerInterface
406
+ ```
407
+
408
+ ### Análisis esperado
409
+
410
+ **sharedFiles:**
411
+ ```
412
+ sharedFiles: {
413
+ "src/logger/LoggerInterface.ts": ["task1"],
414
+ "src/logger/ConsoleLogger.ts": ["task2"],
415
+ "src/auth/auth.ts": ["task3"],
416
+ "src/payments/payments.ts": ["task4"]
417
+ }
418
+ ```
419
+
420
+ **fileClusters:**
421
+ ```
422
+ fileClusters: [
423
+ ["task1"], // interfaz
424
+ ["task2"], // implementación
425
+ ["task3"], // auth
426
+ ["task4"] // pagos
427
+ ]
428
+ clusterCount: 4
429
+ ```
430
+
431
+ **Pero hay sequentialDeps:**
432
+ ```
433
+ sequentialDeps: [
434
+ ["task1", "task2"], // task2 necesita la interfaz de task1
435
+ ["task1", "task3"], // task3 necesita la interfaz de task1
436
+ ["task1", "task4"] // task4 necesita la interfaz de task1
437
+ ]
438
+ ```
439
+
440
+ **Regla aplicada:**
441
+ - clusterCount == 4, taskCount == 4
442
+ - Hay deps entre clusters (task2, task3, task4 dependen de task1)
443
+ - **Rule 2a: INLINE** — deps secuenciales entre clusters sin contrato explícito
444
+
445
+ **Output esperado al usuario:**
446
+ ```markdown
447
+ ## Análisis de modo de ejecución
448
+
449
+ **Recomendación:** INLINE
450
+
451
+ ### Archivos compartidos entre tasks
452
+ | Archivo | Tasks que lo modifican |
453
+ |---------|------------------------|
454
+ | src/logger/LoggerInterface.ts | task1 |
455
+ | src/logger/ConsoleLogger.ts | task2 |
456
+ | src/auth/auth.ts | task3 |
457
+ | src/payments/payments.ts | task4 |
458
+
459
+ ### Clusters detectados
460
+ | Cluster | Tasks | Archivos |
461
+ |---------|-------|----------|
462
+ | A | task1 | src/logger/LoggerInterface.ts |
463
+ | B | task2 | src/logger/ConsoleLogger.ts |
464
+ | C | task3 | src/auth/auth.ts |
465
+ | D | task4 | src/payments/payments.ts |
466
+
467
+ ### Dependencias secuenciales
468
+ - task2 depende de task1 (necesita la interfaz definida)
469
+ - task3 depende de task1 (necesita la interfaz definida)
470
+ - task4 depende de task1 (necesita la interfaz definida)
471
+
472
+ ### Razón principal
473
+ [Regla 2a]: 4 clusters pero hay dependencias secuenciales entre ellos sin contrato explícito → INLINE
474
+
475
+ ### Estimación
476
+ ~80 líneas en 4 archivos
477
+ ```
478
+
479
+ ### Validación
480
+ - [ ] Las dependencias secuenciales se detectan correctamente
481
+ - [ ] La razón explica por qué no se puede paralelizar
482
+ - [ ] El usuario entiende que debe ejecutarse en orden secuencial
483
+
484
+ ---
485
+
486
+ ## Ejecución de tests
487
+
488
+ ### Test automatizado de configuración
489
+ ```bash
490
+ bash assets/tests/validate-config.sh
491
+ ```
492
+
493
+ ### Test manual de comportamiento
494
+ 1. Iniciar OpenCode con Ostacky
495
+ 2. Ejecutar cada escenario
496
+ 3. Verificar cada checkbox de validación
497
+ 4. Reportar resultados en `assets/tests/results.md`
498
+
499
+ ### Criterio de éxito
500
+ - Todos los tests automatizados pasan
501
+ - Todos los escenarios manuales pasan
502
+ - No hay regressions en flujos existentes