@tacuchi/agent-workflow-cli 12.3.0 → 12.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/dist/application/humanize-es.d.ts +18 -0
  2. package/dist/application/humanize-es.d.ts.map +1 -0
  3. package/dist/application/humanize-es.js +71 -0
  4. package/dist/application/humanize-es.js.map +1 -0
  5. package/dist/application/session-close-service.d.ts.map +1 -1
  6. package/dist/application/session-close-service.js +4 -1
  7. package/dist/application/session-close-service.js.map +1 -1
  8. package/dist/application/session-create-service.d.ts +2 -0
  9. package/dist/application/session-create-service.d.ts.map +1 -1
  10. package/dist/application/session-create-service.js +26 -3
  11. package/dist/application/session-create-service.js.map +1 -1
  12. package/dist/application/status-service.d.ts +74 -0
  13. package/dist/application/status-service.d.ts.map +1 -0
  14. package/dist/application/status-service.js +336 -0
  15. package/dist/application/status-service.js.map +1 -0
  16. package/dist/application/templates/session.d.ts +4 -2
  17. package/dist/application/templates/session.d.ts.map +1 -1
  18. package/dist/application/templates/session.js +15 -11
  19. package/dist/application/templates/session.js.map +1 -1
  20. package/dist/cli/commands/status.d.ts +3 -0
  21. package/dist/cli/commands/status.d.ts.map +1 -0
  22. package/dist/cli/commands/status.js +10 -0
  23. package/dist/cli/commands/status.js.map +1 -0
  24. package/dist/cli/help-groups.js +1 -1
  25. package/dist/cli/help-groups.js.map +1 -1
  26. package/dist/cli/main.js +2 -0
  27. package/dist/cli/main.js.map +1 -1
  28. package/dist/cli/tui/data/workflow-content.d.ts.map +1 -1
  29. package/dist/cli/tui/data/workflow-content.js +2 -1
  30. package/dist/cli/tui/data/workflow-content.js.map +1 -1
  31. package/package.json +1 -1
  32. package/skills/w/README.md +2 -2
  33. package/skills/w/SKILL.md +6 -5
  34. package/skills/w/artifacts/README.md +8 -7
  35. package/skills/w/artifacts/artifacts-core/BACKLOG.md +5 -8
  36. package/skills/w/artifacts/artifacts-core/CHECKPOINT.md +14 -13
  37. package/skills/w/artifacts/artifacts-core/SESSION.md +10 -11
  38. package/skills/w/artifacts/artifacts-core/TASKS.md +4 -4
  39. package/skills/w/artifacts/artifacts-dev/DECISION.md +3 -3
  40. package/skills/w/artifacts/artifacts-dev/TECHNICAL-NOTE.md +14 -14
  41. package/skills/w/artifacts/artifacts-research/ANALYSIS-FILE.md +14 -27
  42. package/skills/w/artifacts/artifacts-research/CONCLUSIONS.md +10 -13
  43. package/skills/w/commands/README.md +9 -6
  44. package/skills/w/commands/export-diagrams.md +2 -6
  45. package/skills/w/commands/export-manuals.md +2 -6
  46. package/skills/w/commands/export-reports.md +2 -6
  47. package/skills/w/commands/export-scripts.md +2 -6
  48. package/skills/w/commands/plan-exec.md +11 -10
  49. package/skills/w/commands/plan-new.md +15 -12
  50. package/skills/w/commands/quick.md +7 -6
  51. package/skills/w/commands/spec-new.md +18 -7
  52. package/skills/w/commands/spec-refine.md +14 -11
  53. package/skills/w/commands/status.md +50 -0
  54. package/skills/w/loops/README.md +12 -11
  55. package/skills/w/loops/plan-exec-loop/SKILL.md +54 -52
  56. package/skills/w/loops/plan-new-loop/SKILL.md +28 -24
  57. package/skills/w/loops/quick-loop/SKILL.md +20 -19
  58. package/skills/w/loops/spec-refine-loop/SKILL.md +85 -63
  59. package/skills/w/roles/README.md +1 -1
  60. package/skills/w/roles/research/SKILL.md +21 -81
@@ -2,18 +2,18 @@
2
2
  name: spec-refine-loop
3
3
  description: >-
4
4
  El CHASIS de los loops de agent-workflow. Refina un spec borrador
5
- (docs/specs/NNN-spec.md) hasta un spec refinado sin ambigüedad
6
- (docs/specs/NNN-spec-refined.md) mediante un motor gap-driven convergente:
7
- detecta huecos/ambigüedades, los resuelve preguntando al humano (lo que
8
- depende de su intención) o investigando de forma autónoma vía sessions de
9
- research (lo que se responde leyendo el repo/datos), integra y repite hasta
10
- converger. Compone la capacidad ui-design (built-in ui-spec) cuando el
11
- requerimiento involucra UI. Lo arranca el comando /w:spec-refine y es
12
- reanudable (4 casos de resume). Usa AskUserQuestion con ≤3 tabs de contenido
13
- + 1 tab flow (Compactar/Cerrar) siempre presente; Cerrar persiste CHECKPOINT
14
- + BACKLOG. Es el patrón de referencia que heredan plan-new-loop,
15
- plan-exec-loop y quick-loop. Invocar cuando haya que refinar/desambiguar una
16
- especificación antes de planificar.
5
+ (docs/specs/NNN-spec-<slug>.md) editándolo IN PLACE hasta dejarlo sin
6
+ ambigüedad, mediante un motor gap-driven convergente: detecta
7
+ huecos/ambigüedades, los resuelve preguntando al humano (lo que depende de su
8
+ intención) o investigando de forma autónoma INLINE en la propia session
9
+ (lo que se responde leyendo el repo/datos), integra y repite hasta converger.
10
+ Compone la capacidad ui-design (built-in ui-spec) cuando el requerimiento
11
+ involucra UI. Lo arranca el comando /w:spec-refine y es reanudable vía
12
+ CHECKPOINT. Usa AskUserQuestion con ≤3 tabs de contenido + 1 tab flow
13
+ (Compactar/Cerrar) siempre presente; mantiene sus artefactos como log vivo
14
+ (CHECKPOINT siempre, BACKLOG solo si difiere). Es el patrón de referencia que
15
+ heredan plan-new-loop, plan-exec-loop y quick-loop. Invocar cuando haya que
16
+ refinar/desambiguar una especificación antes de planificar.
17
17
  ---
18
18
 
19
19
  # spec-refine-loop
@@ -27,33 +27,50 @@ SPEC
27
27
  2 — la IA lo corre entero (gap-driven). El usuario no conduce el ciclo; solo responde tabs de contenido y dirige el ciclo de vida por el tab `flow`.
28
28
 
29
29
  ## Started by
30
- `/w:spec-refine` — **reanudable**. Detecta el estado previo y arranca según corresponda (ver *Compact / resume*, 4 casos).
30
+ `/w:spec-refine` — **reanudable**. Detecta el estado previo (vía CHECKPOINT) y arranca según corresponda (ver *Compact / resume*).
31
31
 
32
32
  ## Reads
33
- - `docs/specs/NNN-spec.md` (borrador), **o**
34
- - `docs/specs/NNN-spec-refined.md` si **ya existe** un refinado previo → se re-refina incremental sobre el refined (NO sobre el borrador stale).
33
+ - `docs/specs/NNN-spec*.md` (glob — localiza el spec por número, también captura el legacy `NNN-spec.md`), **o** la ruta exacta pasada en `$ARGUMENTS`. **Siempre el spec mismo**: este loop lo edita in place, no hay un archivo "refined" aparte.
35
34
 
36
35
  ## Writes
37
- `docs/specs/NNN-spec-refined.md` (cuando el usuario elige `Guardar especificación refinada`). Si el archivo **ya existe**, **sobrescribe con confirmación** del usuario.
36
+ Actualiza `docs/specs/NNN-spec-<slug>.md` **in place** (cuando el usuario elige `Guardar especificación refinada`): completa secciones y **agrega** `## Refinement decisions` + `## Q&A traceability`, cerrando `Open questions` a medida que se resuelven. Como sobrescribe un doc existente, **con confirmación** del usuario.
38
37
 
39
38
  > **Invariante de boundary:** este loop escribe **solo** en `docs/specs`. Nunca gradúa/exporta otros artefactos a `docs/` — eso es trabajo de `export-*`, aparte.
40
39
 
40
+ ## Artifacts as a live log — ciclo artifact-first (chasis — heredado por todos los loops)
41
+
42
+ El loop trabaja **artifact-first**: el artefacto se **siembra antes** de ejecutar y se **actualiza después**, no solo al cerrar. Cada gap/fase/tarea corre el ciclo de **3 tiempos**:
43
+
44
+ 1. **ANTES — sembrar la intención.** Antes de ejecutar, deja en el artefacto lo que se **va a** hacer: `CHECKPOINT.Pending`/`Next` = el trabajo inminente (`SESSION.Objective` ya fijó el qué del run).
45
+ 2. **EJECUTAR.** Resolver el gap / correr la fase / editar el código.
46
+ 3. **DESPUÉS — llevar al estado real.** `CHECKPOINT.Pending → Completed`; `DECISION` lo no obvio **a medida que se toma**; `BACKLOG` **solo si** algo queda diferido/followup (`session-close` ya no fabrica un BACKLOG vacío).
47
+
48
+ > El artefacto expresa la **intención** (Pending/Next, antes) y luego el **resultado** (Completed/DECISION, después), en **cada** límite de gap/fase — no solo al `Compactar`/`Cerrar`. Los artefactos de session son el registro vivo del run; el spec/plan es la **base guía**.
49
+
41
50
  ## Internal sessions (managed)
42
51
 
43
- El loop crea y maneja sus sessions en `.workflow/sessions/`. El usuario nunca las crea.
52
+ El loop crea y maneja su session en `.workflow/sessions/`. El usuario nunca la crea.
44
53
 
45
54
  | Session | When | Artifacts | Role |
46
55
  |---|---|---|---|
47
- | **refine session** `<spec>-spec-refine/` | al arrancar el loop (o se reanuda) | `SESSION.md` · `CHECKPOINT.md` (· `BACKLOG.md` al cerrar) | Dueña del run. Guarda el avance al `Compactar` y al `Cerrar`; habilita el resume. Type = `refine`. |
48
- | **research session** `<run>-research-*/` | on-demand, por cada gap factual | `SESSION.md` · `ANALYSIS-FILE.md` → `CONCLUSIONS.md` (+ `SCRIPTS.sql` si consulta BD) | Investiga, concluye, **cierra y reporta**. Puede cerrar **inconclusa**. Type = `research`; on-demand, **no reanudable** (run-and-close, sin `CHECKPOINT`/`BACKLOG` propios). |
56
+ | **refine session** `NNN-spec-refine/` | al arrancar el loop (o se reanuda) | `SESSION.md` · `CHECKPOINT.md` (· `BACKLOG.md` solo si difiere) | Dueña del run. Mantiene el avance vivo (CHECKPOINT) y habilita el resume. Type = `refine`. |
57
+
58
+ > **Research INLINE** — la investigación ya **no** es una session aparte: es una actividad **dentro de la session actual** que escribe sus artefactos (`ANALYSIS-FILE`/`CONCLUSIONS`, + `SCRIPTS.sql` read-only si consulta BD) **en la carpeta de la propia session del run**. Ver *Research: autonomy, scope & failure*.
49
59
 
50
60
  > El spec **nunca** entra en una session; vive en `docs/specs/`.
61
+
62
+ > **Compat (legacy):** workspaces viejos pueden tener `NNN-spec.md` / `NNN-spec-refined.md` y sessions `*-research-*` aparte — son históricos y se dejan tal cual. El glob `NNN-spec*.md` igual encuentra el spec base, y re-correr spec-refine lo edita in place de ahí en adelante.
63
+
64
+ ### Numeración de sessions (regla dura, heredada por todos los loops)
65
+
66
+ El **CLI es dueño del número**: `aw session-create` antepone un `NNN` **global y secuencial** escaneando **todas** las sessions de `.workflow/sessions/` (cualquier tipo). El caller pasa **solo el descriptor** vía `--name` — **nunca** un número. Así la numeración no se reinicia por tipo ni colisiona (ej.: `001-spec-refine`, `002-plan-new`, `003-plan-exec`, …).
67
+
68
+ > `<run>` = el **descriptor** (sin número) de la session del run: `spec-refine`, `plan-new`, `plan-exec`, `quick`. Como la investigación es **inline** en esta misma session, ya no hay sessions hijas `*-research-*` que numerar (compat: las viejas son históricas).
51
69
  >
52
- > `<run>` = id de la session dueña del loop padre, que prefija sus sessions hijas: `<spec>-spec-refine`, `<plan>-plan-new`, `<plan>-plan-exec`, `<slug>-quick`. Así el patrón de naming es exacto en cualquier flujo que herede este chasis.
70
+ > **Resume**: localiza la session existente **escaneando** `.workflow/sessions/` por descriptor + `## Origin` (qué spec/plan), **no** reconstruyendo el número (que es global, no derivable del artefacto). `aw session-resume --code <NNN | folder>` resuelve ambas formas.
53
71
 
54
- **CLI** (asunción de naming; los subcomandos se implementan en paralelo — no bloquear):
55
- - `aw session-create --type refine --name <spec>-spec-refine` / `aw session-resume --code <…>` (detecta `CHECKPOINT`).
56
- - `aw session-create --type research --name <run>-research-<gap>` para cada gap factual.
72
+ **CLI**:
73
+ - `aw session-create --type refine --name spec-refine` → crea `NNN-spec-refine` / `aw session-resume --code <…>` (detecta `CHECKPOINT`).
57
74
  - `aw checkpoint-write` / `aw checkpoint-read` para el resume.
58
75
  - `aw session-close` al cerrar (con razón); `aw session-artifacts` para inspeccionar.
59
76
 
@@ -61,16 +78,16 @@ El loop crea y maneja sus sessions en `.workflow/sessions/`. El usuario nunca la
61
78
 
62
79
  Cuando el requerimiento involucra **UI**, compone la capacidad **`ui-design`** (default built-in `ui-spec`; rebindeable vía `.workflow/skills.toml`): autora el UI spec nativamente (esquema `Screen`, vocabulario, formato). El loop aporta la iteración/Q&A que el viejo servicio no tenía (design-system, tema, variantes, desambiguación) y lo integra como sección `## UI spec` del spec.
63
80
 
64
- Otras capacidades transversales que el chasis usa siempre: `research` (research on-demand), `sql` (regla BD en research), `writing` (redacción del refined). Todas se resuelven por config; `off` → el loop sigue sin la capacidad y, si era necesaria, lo dice o pregunta.
81
+ Otras capacidades transversales que el chasis usa siempre: `research` (research **inline**, ver abajo), `sql` (regla BD en research), `writing` (redacción del spec). Todas se resuelven por config; `off` → el loop sigue sin la capacidad y, si era necesaria, lo dice o pregunta.
65
82
 
66
- ## Deliverable schema (`NNN-spec-refined.md`)
83
+ ## Deliverable schema (el spec, editado in place)
67
84
 
68
- Más rico que el borrador: mismas secciones **completadas** + dos nuevas (`Refinement decisions`, `Q&A traceability`).
85
+ El spec se completa **in place**: mismas secciones del borrador **completadas** + dos nuevas que se **agregan** (`Refinement decisions`, `Q&A traceability`). NO se crea un archivo aparte.
69
86
 
70
87
  ```markdown
71
- # Spec NNN (refined) — <slug>
88
+ # Spec NNN — <slug>
72
89
 
73
- > Derivado de `NNN-spec.md` · refinado por spec-refine-loop
90
+ > Refinado in place por spec-refine-loop
74
91
 
75
92
  ## Requirement (afinado, sin ambigüedad)
76
93
  ## Context (completo)
@@ -81,11 +98,11 @@ Más rico que el borrador: mismas secciones **completadas** + dos nuevas (`Refin
81
98
  ## UI spec (opt. — si involucra UI; vía capacidad ui-design / skill ui-spec)
82
99
  Screen (JSON) + render Markdown.
83
100
 
84
- ## Refinement decisions ← NEW
85
- Qué se definió al refinar y por qué. Incluye lo resuelto vía research
86
- (con referencia a la research session / CONCLUSIONS).
101
+ ## Refinement decisions ← NEW (se AGREGA)
102
+ Qué se definió al refinar y por qué. Incluye lo resuelto vía research inline
103
+ (con referencia a las CONCLUSIONS de la session).
87
104
 
88
- ## Q&A traceability ← NEW
105
+ ## Q&A traceability ← NEW (se AGREGA)
89
106
  Cada duda preguntada al humano + la respuesta elegida.
90
107
 
91
108
  ## Open questions (idealmente "None"; lo que quede se difiere)
@@ -114,15 +131,17 @@ Para cada gap, una sola pregunta decide el resolutor:
114
131
 
115
132
  ## Research: autonomy, scope & failure
116
133
 
117
- - **Autónomo**: la IA crea la research session, investiga y reporta **sin pedir permiso**. El humano se entera al integrarse (en `Refinement decisions`) y mantiene control vía el tab `flow`.
134
+ La investigación es **inline**: una actividad **dentro de la session actual del run**, no una session aparte. Escribe sus artefactos (`ANALYSIS-FILE` `CONCLUSIONS`, + `SCRIPTS.sql` read-only si consulta BD) en la **carpeta de la propia session**.
135
+
136
+ - **Autónomo**: la IA investiga inline y reporta **sin pedir permiso**. El humano se entera al integrarse (en `Refinement decisions`) y mantiene control vía el tab `flow`.
118
137
  - **Alcance**: workspace + repos asociados (fuentes) + MCPs de BD.
119
138
  - **Regla BD** (única excepción a la autonomía):
120
139
  1. **Elección de MCP**: si el gap requiere BD y hay **>1 MCP candidato sin default configurado**, la IA pregunta cuál usar. Esa pregunta va por el **mismo `AskUserQuestion`** como un **tab de contenido** (cuenta dentro del límite ≤3 + `flow`), **antes** de ejecutar queries. Si hay un único MCP o un default, no pregunta.
121
- 2. Escribe **primero** las queries en `SCRIPTS.sql` de la research session.
140
+ 2. Escribe **primero** las queries en `SCRIPTS.sql` de la session.
122
141
  3. Las ejecuta **read-only** vía MCP (respeta `sql-mutation-guard`: nunca DML/DDL).
123
142
  - **Research inconclusa** (BD no disponible, evidencia insuficiente, gap factual irresoluble):
124
- - La research session cierra con estado **`inconcluso`** y reporta el motivo (vía su `Success criteria` no cumplido).
125
- - El loop **degrada** el gap: lo pasa a **pregunta-al-humano** (próximo batch → `Q&A traceability`) o, si tampoco aplica, lo **difiere** a `## Open questions` del refined.
143
+ - La investigación concluye con estado **`inconcluso`** en `CONCLUSIONS` y reporta el motivo.
144
+ - El loop **degrada** el gap: lo pasa a **pregunta-al-humano** (próximo batch → `Q&A traceability`) o, si tampoco aplica, lo **difiere** a `## Open questions` del spec.
126
145
  - El gap se marca **"ya intentado vía research"** (`attempts[gap]++`, límite `MAX`) para que `detect_gaps` **no lo re-dispare en bucle** → garantiza convergencia.
127
146
 
128
147
  ## AskUserQuestion (design & batching)
@@ -139,23 +158,24 @@ Para cada gap, una sola pregunta decide el resolutor:
139
158
 
140
159
  ```
141
160
  spec-refine-loop(spec):
142
- input = exists(NNN-spec-refined.md) ? NNN-spec-refined.md : NNN-spec.md # (#2 resume)
143
- refine_session = create_or_resume(<spec>-spec-refine) # detecta CHECKPOINT
161
+ input = glob(NNN-spec*.md) | $ARGUMENTS path # siempre el spec mismo (in place)
162
+ refine_session = create_or_resume("spec-refine") # CLI antepone NNN global; resume localiza por descriptor/origin
144
163
  work = read(input) (+ aplicar avance del checkpoint si reanuda)
145
- attempts = {} # anti-relanzamiento por gap
164
+ attempts = {} # anti-relanzamiento por gap
146
165
  repeat:
147
166
  gaps = detect_gaps(work) menos los gaps "agotados"
148
167
  if gaps == ∅: break
149
168
  batch = top ≤3 gaps ; pending_human = []
169
+ seed CHECKPOINT.Pending/Next = batch (refine_session) # ANTES: sembrar intención (artifact-first)
150
170
  para cada gap en batch:
151
171
  si factual(gap) y attempts[gap] < MAX:
152
172
  si requiere BD y >1 MCP sin default → encolar "elección MCP" en pending_human
153
- rs = create_research_session(gap)
154
- res = rs.run_and_close() # ANALYSIS-FILE → CONCLUSIONS (+SCRIPTS.sql)
173
+ res = research_inline(gap) # en la session actual: ANALYSIS-FILE → CONCLUSIONS (+SCRIPTS.sql read-only)
155
174
  si res.concluyente: work = integrate(work, res) # → Refinement decisions
156
175
  si no: attempts[gap]++ ; si attempts[gap] >= MAX → pending_human.push(gap)
157
176
  si no:
158
177
  pending_human.push(gap)
178
+ update CHECKPOINT (refine_session) # DESPUÉS: Pending→Completed, en cada límite de gap (ver ciclo artifact-first)
159
179
  si pending_human no vacío:
160
180
  ans = AskUserQuestion(contenido: pending_human (≤3), flow: [Compactar, Cerrar])
161
181
  switch(flow):
@@ -165,58 +185,60 @@ spec-refine-loop(spec):
165
185
  # convergió:
166
186
  ans = AskUserQuestion(contenido: [Guardar refinada, Preguntar algo más],
167
187
  flow: [Compactar, Cerrar])
168
- Guardar → write_with_confirm(NNN-spec-refined.md) ; goto finalize # (#2)
188
+ Guardar → edit_in_place_with_confirm(spec) # completa secciones + agrega Refinement decisions/Q&A ; goto finalize
169
189
  Preguntar algo más → continue
170
190
  flow Compactar/Cerrar → manejar igual
171
191
  finalize:
172
- write CHECKPOINT (refine_session) # (#5) persiste siempre
173
- write/update BACKLOG (motivo de cierre + Open questions diferidas) # (#5)
174
- cerrar research sessions abiertas ; cerrar refine_session ; reportar
192
+ write CHECKPOINT (refine_session) # persiste siempre
193
+ si hay diferidos/followup → write/update BACKLOG (motivo + Open questions diferidas)
194
+ cerrar refine_session ; reportar
175
195
  ```
176
196
 
177
197
  ```mermaid
178
198
  flowchart TD
179
- S["input = refined si existe, si no borrador<br/>create_or_resume refine session"] --> D{"¿gaps<br/>(no agotados)?"}
199
+ S["input = glob NNN-spec*.md (el spec mismo)<br/>create_or_resume refine session"] --> D{"¿gaps<br/>(no agotados)?"}
180
200
  D -->|no| C["AskUserQuestion<br/>contenido[Guardar refinada · Preguntar más]<br/>flow[Compactar · Cerrar]"]
181
201
  D -->|sí| B["tomar ≤3 gaps"]
182
202
  B --> F{"¿factual y<br/>attempts<MAX?"}
183
- F -->|sí| RS["research session<br/>ANALYSIS-FILE → CONCLUSIONS (+SCRIPTS.sql)"]
203
+ F -->|sí| RS["research INLINE en la session<br/>ANALYSIS-FILE → CONCLUSIONS (+SCRIPTS.sql)"]
184
204
  RS --> CC{"¿concluyente?"}
185
205
  CC -->|sí| I1["integrar → Refinement decisions"]
186
206
  CC -->|no| DEG["attempts++ ; degradar a humano / Open questions"]
187
207
  F -->|no| Q["AskUserQuestion<br/>contenido[dudas + elección MCP ≤3]<br/>flow[Compactar · Cerrar]"]
188
208
  Q --> I2["integrar → Q&A traceability"]
189
- I1 --> D
190
- DEG --> D
191
- I2 --> D
192
- C -->|Guardar| W["write_with_confirm<br/>NNN-spec-refined.md"]
209
+ I1 --> CK["update CHECKPOINT (Pending→Completed)"]
210
+ DEG --> CK
211
+ I2 --> CK
212
+ CK --> D
213
+ C -->|Guardar| W["edit IN PLACE con confirmación<br/>completa + agrega Refinement decisions/Q&A"]
193
214
  C -->|Preguntar más| D
194
- W --> FIN["finalize: CHECKPOINT + BACKLOG<br/>+ cerrar sessions + reportar"]
215
+ W --> FIN["finalize: CHECKPOINT (+ BACKLOG si difiere)<br/>+ cerrar session + reportar"]
195
216
  ```
196
217
 
197
218
  ## Compact / resume
198
219
 
199
- Cuatro casos al ejecutar `/w:spec-refine` sobre un spec:
220
+ El resume **keya off el `CHECKPOINT`** de la refine session, no de la existencia de un archivo "refined". Tres casos al ejecutar `/w:spec-refine` sobre un spec:
221
+
222
+ 1. **En curso** (existe `CHECKPOINT.md` en la refine session) → reanuda desde el avance (gaps resueltos, Q&A, `attempts`, research inline en curso).
223
+ 2. **Sin avance** (no hay CHECKPOINT y el spec **no** tiene `Refinement decisions`/`Q&A traceability`) → arranca desde cero leyendo el spec (`NNN-spec*.md`).
224
+ 3. **Ya refinado** (no hay CHECKPOINT abierto pero el spec **ya tiene** `Refinement decisions`/`Q&A traceability`) → re-refinamiento incremental leyendo el **spec mismo**; al `Guardar`, edita in place con confirmación.
200
225
 
201
- 1. **En curso** (existe `CHECKPOINT.md` en la refine session) reanuda desde el avance (gaps resueltos, Q&A, `attempts`, research sessions abiertas).
202
- 2. **Sin avance** (no hay CHECKPOINT ni refined) → arranca desde cero leyendo `NNN-spec.md`.
203
- 3. **Ya completado** (existe `NNN-spec-refined.md`, sin CHECKPOINT) → re-refinamiento incremental: input = el **refined** (no el borrador); al `Guardar`, sobrescribe con confirmación.
204
- 4. **`Compactar`** (tab flow) → escribe `CHECKPOINT.md` en la refine session (spec en progreso, gaps restantes, Q&A, `attempts`, research sessions abiertas) → dispara `/compact` del host → reanuda leyendo el checkpoint.
226
+ > **`Compactar`** (tab flow, transversal a los 3 casos) → escribe `CHECKPOINT.md` en la refine session (spec en progreso, gaps restantes, Q&A, `attempts`) dispara `/compact` del host → reanuda leyendo el checkpoint.
205
227
 
206
228
  ## Convergence / exit
207
229
 
208
230
  - **Sin gaps materiales** → ofrece `Guardar especificación refinada`.
209
- - `Guardar` → `write_with_confirm(NNN-spec-refined.md)` y `finalize`.
210
- - `Cerrar` (tab flow, en cualquier momento) → `finalize`. **`finalize` persiste siempre**: escribe `CHECKPOINT.md` (reanudable) **y** `BACKLOG.md` (motivo de cierre + `Open questions` diferidas), cierra sessions y reporta. Así sobrevive el avance aunque no se haya `Compactar` antes.
231
+ - `Guardar` → `edit_in_place_with_confirm(spec)` y `finalize`.
232
+ - `Cerrar` (tab flow, en cualquier momento) → `finalize`. **`finalize` persiste siempre el `CHECKPOINT.md`** (reanudable) y, **solo si hay algo diferido/followup**, escribe `BACKLOG.md` (motivo de cierre + `Open questions` diferidas); cierra la session y reporta. Así sobrevive el avance aunque no se haya `Compactar` antes.
211
233
 
212
234
  ## Integration (dónde aterriza cada resolución)
213
235
 
214
- - Resuelto vía **research** → `## Refinement decisions` del refined (+ ref a la research session / `CONCLUSIONS`).
215
- - Resuelto vía **humano** → `## Q&A traceability` del refined.
216
- - **Research inconclusa o sin resolver** → `## Open questions` del refined (diferido) + `BACKLOG.md` de la refine session al cerrar.
236
+ - Resuelto vía **research inline** → `## Refinement decisions` del spec (+ ref a las `CONCLUSIONS` de la session).
237
+ - Resuelto vía **humano** → `## Q&A traceability` del spec.
238
+ - **Research inconclusa o sin resolver** → `## Open questions` del spec (diferido) + `BACKLOG.md` de la refine session (solo si queda algo diferido).
217
239
 
218
240
  ## Heredan este chasis
219
241
 
220
242
  - `plan-new-loop` — mismo motor; deltas: plan rico + gap taxonomy de plan.
221
- - `plan-exec-loop` — mismo motor; deltas: ejecución real (código/BD/git), session por fase, sin auto-export.
243
+ - `plan-exec-loop` — mismo motor; deltas: ejecución real (código/BD/git), **una sola session por run** (progreso por fase en el plan-doc), sin auto-export.
222
244
  - `quick-loop` — mismo motor (mínimo); hereda además git/BD/no-export de `plan-exec-loop`.
@@ -13,7 +13,7 @@ All 10 roles, their built-in defaults, their tier, and which loops/exports compo
13
13
  | Role | Default built-in | Tier | Composed by |
14
14
  |---|---|---|---|
15
15
  | `ui-design` | [`ui-spec`](../ui-spec/SKILL.md) | must | `spec-refine-loop` (when requirement involves UI) |
16
- | `sql` | `sql` | must | research sessions · `plan-exec-loop` · `quick-loop` · `export-scripts` |
16
+ | `sql` | `sql` | must | inline research · `plan-exec-loop` · `quick-loop` · `export-scripts` |
17
17
  | `git` | `git` | must | `plan-exec-loop` · `quick-loop` |
18
18
  | `coding-standards` | `coding-standards` | must | `plan-exec-loop` · `quick-loop` |
19
19
  | `writing` | `writing` | must | all loops · `export-manuals` · `export-reports` |
@@ -2,10 +2,11 @@
2
2
  name: research
3
3
  description: >
4
4
  Capacidad de investigación on-demand que los loops componen cuando necesitan evidencia para avanzar.
5
- Crea una sesión de investigación, lee el workspace + repos asociados + MCPs en modo read-only,
6
- produce ANALYSIS-FILE → CONCLUSIONS. Cierra INCONCLUSIVE si la pregunta no puede responderse
7
- con las fuentes disponibles. Discrimina cuándo investigar ("¿puedo responder leyendo repo/datos?")
8
- vs cuándo preguntar al humano ("¿depende de lo que el usuario quiere?").
5
+ Investiga INLINE dentro de la sesión activa (no crea una sesión aparte): lee el workspace + repos
6
+ asociados + MCPs en modo read-only, produce ANALYSIS-FILE → CONCLUSIONS dentro de esa sesión.
7
+ Concluye INCONCLUSIVE si la pregunta no puede responderse con las fuentes disponibles. Discrimina
8
+ cuándo investigar ("¿puedo responder leyendo repo/datos?") vs cuándo preguntar al humano
9
+ ("¿depende de lo que el usuario quiere?").
9
10
  ---
10
11
 
11
12
  # research — On-demand investigation capability
@@ -42,16 +43,16 @@ Todos los loops la cargan on-demand:
42
43
  ### Investigation lifecycle
43
44
 
44
45
  ```
45
- [pregunta del loop] → [crear sesión research] → [recolectar evidencia] → [sintetizar] → [CONCLUSIONS]
46
+ [pregunta del loop] → [investigar inline en la sesión activa] → [recolectar evidencia] → [sintetizar] → [CONCLUSIONS]
46
47
 
47
48
  [nueva hipótesis o gap] → [más evidencia o INCONCLUSIVE]
48
49
  ```
49
50
 
50
- 1. **Crear sesión research** en `.workflow/sessions/<slug>/` con `SESSION.md` (pregunta original + scope).
51
+ 1. **Investigar inline** — no se crea una sesión aparte; los artefactos se escriben en la sesión activa del loop (`.workflow/sessions/NNN-<run>/`).
51
52
  2. **Recolectar evidencia** — read-only: `Read`, `Grep`, `Glob`, MCP SELECT, `git log`.
52
- 3. **Escribir `ANALYSIS-FILE.md`** con hallazgos crudos.
53
+ 3. **Escribir `ANALYSIS-FILE.md`** (scratchpad opcional) con hallazgos crudos.
53
54
  4. **Sintetizar** en `CONCLUSIONS.md` con conclusiones evidenciadas.
54
- 5. **Cerrar** la sesión: estado `closed` si converge; `inconclusive` si no hay suficiente material.
55
+ 5. **Reportar al loop**: `concluido` si converge; `inconclusive` si no hay material suficiente — el loop degrada/difiere el gap.
55
56
 
56
57
  ### Ask-vs-research discriminator (examples)
57
58
 
@@ -64,73 +65,14 @@ Todos los loops la cargan on-demand:
64
65
  "¿el servicio Y ya tiene auth implementado?" → investigar (leer código)
65
66
  ```
66
67
 
67
- ### ANALYSIS-FILE.md schema
68
+ ### Artifact schemas
68
69
 
69
- ```markdown
70
- # Analysis — <slug>
71
-
72
- ## Question
73
-
74
- [La pregunta exacta que el loop planteó.]
75
-
76
- ## Sources consulted
77
-
78
- - Codigo: <repo/path:lineas>
79
- - BD (<mcp-name>): queries en queries/
80
- - Git: <SHAs relevantes>
81
- - Refs externas: <links si aplica>
82
-
83
- ## Finding 1: <titulo>
84
-
85
- - **Que se observo**: ...
86
- - **Donde**: <path o link>
87
- - **Cuando**: <fecha si aplica>
88
-
89
- ## Finding N: ...
90
-
91
- ## Tentative hypotheses
92
-
93
- - [hipotesis sin compromiso, para revisar en synthesis]
94
-
95
- ## Gaps
96
-
97
- - [lo que no pudo leerse o no esta disponible]
98
- ```
99
-
100
- ### CONCLUSIONS.md schema
101
-
102
- ```markdown
103
- # Conclusions — <slug>
104
-
105
- ## Summary
106
-
107
- [1-2 oraciones: que se investigo y que se concluyó.]
108
-
109
- ## Conclusions
110
-
111
- - **C1**: <conclusion + link a ANALYSIS-FILE#section>
112
- - **C2**: ...
113
-
114
- ## Recommendations
115
-
116
- - **R1**: <accion concreta para el loop que hizo la pregunta>
117
-
118
- ## Open (gaps)
119
-
120
- - <pregunta sin responder si aplica>
121
- ```
70
+ `ANALYSIS-FILE.md` (scratchpad opcional) y `CONCLUSIONS.md` siguen las **plantillas canónicas** en `artifacts/artifacts-research/` — no se duplican aquí para evitar drift. Para research liviana basta `CONCLUSIONS.md`; `ANALYSIS-FILE.md` es opcional para investigaciones más profundas.
122
71
 
123
72
  ### DB rule (invariant #4)
124
73
 
125
74
  - **Solo SELECT** — nunca DML/DDL.
126
- - **Escribir la query primero** en `.workflow/sessions/<slug>/queries/NNN-<slug>.sql` con header:
127
- ```sql
128
- -- Query: <proposito>
129
- -- MCP: <nombre>
130
- -- Fecha: YYYY-MM-DD
131
- -- Sesion: <slug>
132
- -- Costo estimado: <filas|N/A>
133
- ```
75
+ - **Escribir la query primero** en el `SCRIPTS.sql` de la sesión activa (tipo A, read-only; ver la plantilla `artifacts/artifacts-core/SCRIPTS.sql`) con su header de propósito + MCP + origen.
134
76
  - **Si hay >1 MCP candidato sin default declarado**: preguntar al humano cuál usar antes de ejecutar.
135
77
  - **Cost guard antes de ejecutar**:
136
78
  - `COUNT(*) ≤ 1.000` o lookup por PK → ejecutar directo.
@@ -156,26 +98,24 @@ Si tras investigar los gaps persisten y no pueden cerrarse con las fuentes dispo
156
98
  - Marcar sesión como `inconclusive`.
157
99
  - Reportar al loop: qué se pudo y qué no — el loop decide si pregunta al humano.
158
100
 
159
- ### Research session artifacts
101
+ ### Inline research artifacts (en la sesión activa)
160
102
 
161
103
  ```
162
- .workflow/sessions/<slug>/
163
- ├── SESSION.md # pregunta original + scope + estado (open|closed|inconclusive)
164
- ├── ANALYSIS-FILE.md # hallazgos crudos (equivale a EVIDENCE.md del modelo viejo)
165
- ├── CONCLUSIONS.md # sintesis + recomendaciones para el loop
166
- └── queries/ # SQL read-only (si se usó MCP)
167
- └── 001-<slug>.sql
104
+ .workflow/sessions/NNN-<run>/ # la sesión del loop (refine/exec/quick)
105
+ ├── ANALYSIS-FILE.md # hallazgos crudos (scratchpad opcional)
106
+ ├── CONCLUSIONS.md # síntesis + recomendaciones para el loop
107
+ └── SCRIPTS.sql # SQL read-only (tipo A), si se usó MCP
168
108
  ```
169
109
 
170
110
  ## Output
171
111
 
172
- Produce en `.workflow/sessions/<slug>/`:
173
- - `ANALYSIS-FILE.md` — hallazgos crudos sin sintetizar.
112
+ Produce, **inline en la sesión activa del loop** (`.workflow/sessions/NNN-<run>/`):
113
+ - `ANALYSIS-FILE.md` — hallazgos crudos sin sintetizar (opcional).
174
114
  - `CONCLUSIONS.md` — conclusiones con evidencia + recomendaciones para el loop.
175
- - `queries/*.sql` — solo si se usó MCP.
115
+ - `SCRIPTS.sql` — queries read-only (tipo A), solo si se usó MCP.
176
116
 
177
117
  No gradua a `docs/` (invariant #1). El loop que compone esta capacidad consume las conclusiones y actua en consecuencia.
178
118
 
179
119
  ## Source
180
120
 
181
- Reciclado de `analyze-investigate`, `analyze-synthesize` y `analyze-conclude` del bundle viejo. Se conserva: el modelo de investigacion divergente → sintesis → conclusiones; las reglas read-only; el cost guard de queries; la discriminacion de gaps. Se descarta: la terminología de `flow=analyze`, `EVIDENCE.md`/`FINDINGS.md` como nombres canónicos (ahora `ANALYSIS-FILE.md`/`CONCLUSIONS.md`), el lifecycle de sesiones legacy, y la modulacion por modalidad (technical/incident/data) — la skill de research es de propósito general.
121
+ Reciclado de `analyze-investigate`, `analyze-synthesize` y `analyze-conclude` del bundle viejo. Se conserva: el modelo de investigacion divergente → sintesis → conclusiones; las reglas read-only; el cost guard de queries; la discriminacion de gaps. Se descarta: la terminología de `flow=analyze`, `EVIDENCE.md`/`FINDINGS.md` como nombres canónicos (ahora `ANALYSIS-FILE.md`/`CONCLUSIONS.md`), el lifecycle de sesiones legacy (la research ahora es **inline**, sin sesión propia), y la modulacion por modalidad (technical/incident/data) — la skill de research es de propósito general.