@tacuchi/agent-workflow-cli 12.4.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 (51) 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/status-service.d.ts +74 -0
  9. package/dist/application/status-service.d.ts.map +1 -0
  10. package/dist/application/status-service.js +336 -0
  11. package/dist/application/status-service.js.map +1 -0
  12. package/dist/application/templates/session.d.ts +4 -2
  13. package/dist/application/templates/session.d.ts.map +1 -1
  14. package/dist/application/templates/session.js +15 -11
  15. package/dist/application/templates/session.js.map +1 -1
  16. package/dist/cli/commands/status.d.ts +3 -0
  17. package/dist/cli/commands/status.d.ts.map +1 -0
  18. package/dist/cli/commands/status.js +10 -0
  19. package/dist/cli/commands/status.js.map +1 -0
  20. package/dist/cli/help-groups.js +1 -1
  21. package/dist/cli/help-groups.js.map +1 -1
  22. package/dist/cli/main.js +2 -0
  23. package/dist/cli/main.js.map +1 -1
  24. package/dist/cli/tui/data/workflow-content.d.ts.map +1 -1
  25. package/dist/cli/tui/data/workflow-content.js +2 -1
  26. package/dist/cli/tui/data/workflow-content.js.map +1 -1
  27. package/package.json +1 -1
  28. package/skills/w/README.md +2 -2
  29. package/skills/w/SKILL.md +6 -5
  30. package/skills/w/artifacts/README.md +8 -7
  31. package/skills/w/artifacts/artifacts-core/BACKLOG.md +5 -8
  32. package/skills/w/artifacts/artifacts-core/CHECKPOINT.md +14 -13
  33. package/skills/w/artifacts/artifacts-core/SESSION.md +10 -11
  34. package/skills/w/artifacts/artifacts-core/TASKS.md +4 -4
  35. package/skills/w/artifacts/artifacts-dev/DECISION.md +3 -3
  36. package/skills/w/artifacts/artifacts-dev/TECHNICAL-NOTE.md +14 -14
  37. package/skills/w/artifacts/artifacts-research/ANALYSIS-FILE.md +14 -27
  38. package/skills/w/artifacts/artifacts-research/CONCLUSIONS.md +10 -13
  39. package/skills/w/commands/README.md +9 -6
  40. package/skills/w/commands/plan-exec.md +4 -4
  41. package/skills/w/commands/plan-new.md +8 -6
  42. package/skills/w/commands/spec-new.md +8 -7
  43. package/skills/w/commands/spec-refine.md +7 -5
  44. package/skills/w/commands/status.md +50 -0
  45. package/skills/w/loops/README.md +11 -10
  46. package/skills/w/loops/plan-exec-loop/SKILL.md +53 -53
  47. package/skills/w/loops/plan-new-loop/SKILL.md +28 -24
  48. package/skills/w/loops/quick-loop/SKILL.md +18 -17
  49. package/skills/w/loops/spec-refine-loop/SKILL.md +79 -63
  50. package/skills/w/roles/README.md +1 -1
  51. package/skills/w/roles/research/SKILL.md +21 -81
@@ -4,16 +4,16 @@ description: >-
4
4
  El atajo liviano de agent-workflow: resuelve una tarea acotada (un fix, un
5
5
  ajuste pequeño) directamente desde el prompt del usuario, editando código con
6
6
  ceremonia mínima. Heir del chasis spec-refine-loop (motor gap-driven mínimo,
7
- research on-demand con regla BD read-only, AskUserQuestion con ≤3 tabs de
8
- contenido + 1 tab flow Compactar/Cerrar siempre, compact/resume con Cerrar que
9
- persiste CHECKPOINT + BACKLOG) y de plan-exec-loop (git seguro: rama esperada
10
- antes de editar + commit propuesto, nunca push/--amend/--no-verify; la IA
11
- nunca ejecuta DML, migraciones a SCRIPTS.sql; sin auto-export). Sus deltas: sin
12
- fases ni plan-doc (el prompt ES la tarea), una sola session ligera
13
- (<slug>-quick), un solo commit; y escalación con handoff si la tarea crece
14
- (propone subir a SPEC/PLAN dejando el código a medias como contexto). NO toca
15
- docs/. Lo arranca /w:quick y es reanudable. Invocar para cambios pequeños y
16
- directos que no ameritan spec ni plan formal.
7
+ research INLINE con regla BD read-only, AskUserQuestion con ≤3 tabs de
8
+ contenido + 1 tab flow Compactar/Cerrar siempre, compact/resume con artefactos
9
+ como log vivo: CHECKPOINT siempre, BACKLOG solo si difiere) y de plan-exec-loop
10
+ (git seguro: rama esperada antes de editar + commit propuesto, nunca
11
+ push/--amend/--no-verify; la IA nunca ejecuta DML, migraciones a SCRIPTS.sql;
12
+ sin auto-export). Sus deltas: sin fases ni plan-doc (el prompt ES la tarea),
13
+ una sola session ligera (<slug>-quick), un solo commit; y escalación con
14
+ handoff si la tarea crece (propone subir a SPEC/PLAN dejando el código a
15
+ medias como contexto). NO toca docs/. Lo arranca /w:quick y es reanudable.
16
+ Invocar para cambios pequeños y directos que no ameritan spec ni plan formal.
17
17
  ---
18
18
 
19
19
  # quick-loop
@@ -39,21 +39,21 @@ QUICK
39
39
 
40
40
  ## Internal session
41
41
 
42
- - **SIEMPRE** crea una session ligera con descriptor `<slug>-quick` → `NNN-<slug>-quick` (Type = `quick`, ≈ `exec`): `SESSION` · `DECISION` · `SCRIPTS.sql` · `CHECKPOINT` (+ `BACKLOG` al cerrar). Una sola session (no exec-por-fase). El caller pasa solo el descriptor; el CLI antepone el `NNN` global y secuencial (ver chasis).
42
+ - **SIEMPRE** crea una session ligera con descriptor `<slug>-quick` → `NNN-<slug>-quick` (Type = `quick`, ≈ `exec`): `SESSION` · `DECISION` · `SCRIPTS.sql` · `CHECKPOINT` (+ `BACKLOG` solo si difiere). Una sola session. La investigación es **inline** dentro de ella (`ANALYSIS-FILE`/`CONCLUSIONS` + `SCRIPTS.sql` read-only en su carpeta). El caller pasa solo el descriptor; el CLI antepone el `NNN` global y secuencial (ver chasis).
43
43
 
44
44
  ## Inherits
45
45
 
46
- - del **chasis** [`spec-refine-loop`](../spec-refine-loop/SKILL.md): gap-driven (mínimo), `AskUserQuestion` ≤3 + `flow` (`Compactar`/`Cerrar`), `research` on-demand + regla BD read-only (pregunta MCP si >1 sin default → `SCRIPTS.sql` → ejecuta read-only), compact/resume, `Cerrar` persiste `CHECKPOINT`+`BACKLOG`.
46
+ - del **chasis** [`spec-refine-loop`](../spec-refine-loop/SKILL.md): gap-driven (mínimo), `AskUserQuestion` ≤3 + `flow` (`Compactar`/`Cerrar`), `research` **inline** + regla BD read-only (pregunta MCP si >1 sin default → `SCRIPTS.sql` → ejecuta read-only), compact/resume, **artefactos como log vivo (ciclo artifact-first)** (`CHECKPOINT` siempre; `BACKLOG` solo si difiere).
47
47
  - de [`plan-exec-loop`](../plan-exec-loop/SKILL.md): **git** (rama segura antes de editar + commit propuesto; nunca `push`/`--amend`/`--no-verify`), **BD** (la IA nunca ejecuta DML; migraciones → `SCRIPTS.sql` de la session), **sin auto-export** (no toca otras carpetas `docs/`).
48
48
 
49
49
  ## Composes
50
50
 
51
- `git` · `coding-standards` · `testing` (validación puntual) · `sql` (regla BD) · `writing` · `research`. Resueltas por `.workflow/skills.toml`.
51
+ `git` · `coding-standards` · `testing` (validación puntual) · `sql` (regla BD) · `writing` · `research` (inline). Resueltas por `.workflow/skills.toml`.
52
52
 
53
53
  ## Delta QUICK — minimal ceremony
54
54
 
55
55
  - **Sin fases, sin plan-doc**: el prompt **es** la tarea (una sola unidad). No hay roadmap.
56
- - **Una sola session** (no exec-por-fase). **Un solo commit** propuesto al final.
56
+ - **Una sola session**. **Un solo commit** propuesto al final.
57
57
  - **Escalación + handoff**: si la tarea crece (muchos archivos / ≥2 fuentes / necesita arquitectura) → propone subir a **SPEC/PLAN**. Si el usuario acepta:
58
58
  - el **código ya editado queda** en el working tree (no se revierte) **y se registra** en `CHECKPOINT` + `BACKLOG` ("cambios sin commitear en `<fuente>` — código a medias; decidir commit/descartar al retomar") — reusando **ambas** mitades del patrón "commit rechazado" de plan-exec (no revertir **y** registrar lo sin commitear). Crítico en la rama **SPEC**, que no retoma el working tree;
59
59
  - la session quick va a `finalize`, persistiendo `CHECKPOINT` + `BACKLOG` con un **puntero** al spec/plan sembrado (Followups: "escalado a `docs/specs/NNN` o `docs/plans/PPP` — retomar ahí");
@@ -65,25 +65,26 @@ QUICK
65
65
  ```
66
66
  quick-loop(prompt):
67
67
  s = create_or_resume("<slug>-quick") # CLI antepone NNN global; siempre session ligera
68
+ seed CHECKPOINT.Pending/Next = la tarea (s) # ANTES: sembrar intención (artifact-first); SESSION.Objective = el prompt
68
69
  trabajar la tarea (loop mínimo):
69
70
  verificar rama esperada por fuente (branch-check); si no → pausar + resolver
70
71
  editar código (cambio mínimo)
71
72
  si consulta BD read-only → SCRIPTS.sql + ejecutar read-only
72
73
  si cambio BD (DDL/DML) → SCRIPTS.sql (artefacto session, NO ejecutar)
73
74
  si decisión no obvia → DECISION
74
- si duda/gap → research session ó AskUserQuestion # chasis
75
+ si duda/gap → research inline ó AskUserQuestion # chasis
75
76
  si la tarea CRECE → proponer escalar a SPEC/PLAN
76
77
  si acepta → handoff (código queda; BACKLOG→spec/plan sembrado) → goto finalize
77
78
  validación puntual (test si aplica)
78
79
  proponer commit (aprobar antes) # nunca push/amend/--no-verify
79
80
  AskUserQuestion(contenido: [Cerrar tarea, Preguntar algo más], flow: [Compactar, Cerrar])
80
- finalize: CHECKPOINT + BACKLOG (si queda algo) + cerrar session + reportar
81
+ finalize: CHECKPOINT (DESPUÉS: Pending→Completed) + BACKLOG (solo si queda algo diferido) + cerrar session + reportar
81
82
  ```
82
83
 
83
84
  ```mermaid
84
85
  flowchart TD
85
86
  S["create_or_resume session NNN-&lt;slug&gt;-quick"] --> G["branch-check por fuente"]
86
- G -->|ok| DO["editar código · BD→SCRIPTS.sql · DECISION<br/>(duda→research/AskUserQuestion)"]
87
+ G -->|ok| DO["editar código · BD→SCRIPTS.sql · DECISION<br/>(duda→research inline/AskUserQuestion)"]
87
88
  G -->|rama ≠| PA["pausar + resolver"]
88
89
  PA --> G
89
90
  DO --> GROW{"¿la tarea creció?"}
@@ -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,39 +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** `NNN-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** `MMM-spec-refine-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/`.
51
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
+
52
64
  ### Numeración de sessions (regla dura, heredada por todos los loops)
53
65
 
54
- 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-spec-refine-research-x`, `003-plan-new`, …).
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`, …).
55
67
 
56
- > `<run>` = el **descriptor** (sin número) de la control session que prefija sus sessions hijas: `spec-refine`, `plan-new`, `plan-exec`, `quick`. La research session pasa `--name <run>-research-<gap>` y el CLI le pone su propio `NNN`. **No** embebas el número del padre en el descriptor del hijo (lo agrega el CLI; embeberlo lo duplicaría).
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).
57
69
  >
58
- > **Resume**: localiza la session existente **escaneando** `.workflow/sessions/` por descriptor + `## Origin` (qué spec/plan), **no** reconstruyendo el número (que ahora es global, no derivable del artefacto). `aw session-resume --code <NNN | folder>` resuelve ambas formas.
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.
59
71
 
60
72
  **CLI**:
61
73
  - `aw session-create --type refine --name spec-refine` → crea `NNN-spec-refine` / `aw session-resume --code <…>` (detecta `CHECKPOINT`).
62
- - `aw session-create --type research --name <run>-research-<gap>` por cada gap factual → crea `MMM-<run>-research-<gap>`.
63
74
  - `aw checkpoint-write` / `aw checkpoint-read` para el resume.
64
75
  - `aw session-close` al cerrar (con razón); `aw session-artifacts` para inspeccionar.
65
76
 
@@ -67,16 +78,16 @@ El **CLI es dueño del número**: `aw session-create` antepone un `NNN` **global
67
78
 
68
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.
69
80
 
70
- 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.
71
82
 
72
- ## Deliverable schema (`NNN-spec-refined.md`)
83
+ ## Deliverable schema (el spec, editado in place)
73
84
 
74
- 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.
75
86
 
76
87
  ```markdown
77
- # Spec NNN (refined) — <slug>
88
+ # Spec NNN — <slug>
78
89
 
79
- > Derivado de `NNN-spec.md` · refinado por spec-refine-loop
90
+ > Refinado in place por spec-refine-loop
80
91
 
81
92
  ## Requirement (afinado, sin ambigüedad)
82
93
  ## Context (completo)
@@ -87,11 +98,11 @@ Más rico que el borrador: mismas secciones **completadas** + dos nuevas (`Refin
87
98
  ## UI spec (opt. — si involucra UI; vía capacidad ui-design / skill ui-spec)
88
99
  Screen (JSON) + render Markdown.
89
100
 
90
- ## Refinement decisions ← NEW
91
- Qué se definió al refinar y por qué. Incluye lo resuelto vía research
92
- (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).
93
104
 
94
- ## Q&A traceability ← NEW
105
+ ## Q&A traceability ← NEW (se AGREGA)
95
106
  Cada duda preguntada al humano + la respuesta elegida.
96
107
 
97
108
  ## Open questions (idealmente "None"; lo que quede se difiere)
@@ -120,15 +131,17 @@ Para cada gap, una sola pregunta decide el resolutor:
120
131
 
121
132
  ## Research: autonomy, scope & failure
122
133
 
123
- - **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`.
124
137
  - **Alcance**: workspace + repos asociados (fuentes) + MCPs de BD.
125
138
  - **Regla BD** (única excepción a la autonomía):
126
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.
127
- 2. Escribe **primero** las queries en `SCRIPTS.sql` de la research session.
140
+ 2. Escribe **primero** las queries en `SCRIPTS.sql` de la session.
128
141
  3. Las ejecuta **read-only** vía MCP (respeta `sql-mutation-guard`: nunca DML/DDL).
129
142
  - **Research inconclusa** (BD no disponible, evidencia insuficiente, gap factual irresoluble):
130
- - La research session cierra con estado **`inconcluso`** y reporta el motivo (vía su `Success criteria` no cumplido).
131
- - 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.
132
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.
133
146
 
134
147
  ## AskUserQuestion (design & batching)
@@ -145,23 +158,24 @@ Para cada gap, una sola pregunta decide el resolutor:
145
158
 
146
159
  ```
147
160
  spec-refine-loop(spec):
148
- input = exists(NNN-spec-refined.md) ? NNN-spec-refined.md : NNN-spec.md # (#2 resume)
149
- refine_session = create_or_resume("spec-refine") # CLI antepone NNN global; resume localiza por descriptor/origin
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
150
163
  work = read(input) (+ aplicar avance del checkpoint si reanuda)
151
- attempts = {} # anti-relanzamiento por gap
164
+ attempts = {} # anti-relanzamiento por gap
152
165
  repeat:
153
166
  gaps = detect_gaps(work) menos los gaps "agotados"
154
167
  if gaps == ∅: break
155
168
  batch = top ≤3 gaps ; pending_human = []
169
+ seed CHECKPOINT.Pending/Next = batch (refine_session) # ANTES: sembrar intención (artifact-first)
156
170
  para cada gap en batch:
157
171
  si factual(gap) y attempts[gap] < MAX:
158
172
  si requiere BD y >1 MCP sin default → encolar "elección MCP" en pending_human
159
- rs = create_research_session(gap)
160
- 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)
161
174
  si res.concluyente: work = integrate(work, res) # → Refinement decisions
162
175
  si no: attempts[gap]++ ; si attempts[gap] >= MAX → pending_human.push(gap)
163
176
  si no:
164
177
  pending_human.push(gap)
178
+ update CHECKPOINT (refine_session) # DESPUÉS: Pending→Completed, en cada límite de gap (ver ciclo artifact-first)
165
179
  si pending_human no vacío:
166
180
  ans = AskUserQuestion(contenido: pending_human (≤3), flow: [Compactar, Cerrar])
167
181
  switch(flow):
@@ -171,58 +185,60 @@ spec-refine-loop(spec):
171
185
  # convergió:
172
186
  ans = AskUserQuestion(contenido: [Guardar refinada, Preguntar algo más],
173
187
  flow: [Compactar, Cerrar])
174
- 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
175
189
  Preguntar algo más → continue
176
190
  flow Compactar/Cerrar → manejar igual
177
191
  finalize:
178
- write CHECKPOINT (refine_session) # (#5) persiste siempre
179
- write/update BACKLOG (motivo de cierre + Open questions diferidas) # (#5)
180
- 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
181
195
  ```
182
196
 
183
197
  ```mermaid
184
198
  flowchart TD
185
- 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)?"}
186
200
  D -->|no| C["AskUserQuestion<br/>contenido[Guardar refinada · Preguntar más]<br/>flow[Compactar · Cerrar]"]
187
201
  D -->|sí| B["tomar ≤3 gaps"]
188
202
  B --> F{"¿factual y<br/>attempts<MAX?"}
189
- 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)"]
190
204
  RS --> CC{"¿concluyente?"}
191
205
  CC -->|sí| I1["integrar → Refinement decisions"]
192
206
  CC -->|no| DEG["attempts++ ; degradar a humano / Open questions"]
193
207
  F -->|no| Q["AskUserQuestion<br/>contenido[dudas + elección MCP ≤3]<br/>flow[Compactar · Cerrar]"]
194
208
  Q --> I2["integrar → Q&A traceability"]
195
- I1 --> D
196
- DEG --> D
197
- I2 --> D
198
- 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"]
199
214
  C -->|Preguntar más| D
200
- W --> FIN["finalize: CHECKPOINT + BACKLOG<br/>+ cerrar sessions + reportar"]
215
+ W --> FIN["finalize: CHECKPOINT (+ BACKLOG si difiere)<br/>+ cerrar session + reportar"]
201
216
  ```
202
217
 
203
218
  ## Compact / resume
204
219
 
205
- 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.
206
225
 
207
- 1. **En curso** (existe `CHECKPOINT.md` en la refine session) reanuda desde el avance (gaps resueltos, Q&A, `attempts`, research sessions abiertas).
208
- 2. **Sin avance** (no hay CHECKPOINT ni refined) → arranca desde cero leyendo `NNN-spec.md`.
209
- 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.
210
- 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.
211
227
 
212
228
  ## Convergence / exit
213
229
 
214
230
  - **Sin gaps materiales** → ofrece `Guardar especificación refinada`.
215
- - `Guardar` → `write_with_confirm(NNN-spec-refined.md)` y `finalize`.
216
- - `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.
217
233
 
218
234
  ## Integration (dónde aterriza cada resolución)
219
235
 
220
- - Resuelto vía **research** → `## Refinement decisions` del refined (+ ref a la research session / `CONCLUSIONS`).
221
- - Resuelto vía **humano** → `## Q&A traceability` del refined.
222
- - **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).
223
239
 
224
240
  ## Heredan este chasis
225
241
 
226
242
  - `plan-new-loop` — mismo motor; deltas: plan rico + gap taxonomy de plan.
227
- - `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.
228
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.