@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.
- package/dist/application/humanize-es.d.ts +18 -0
- package/dist/application/humanize-es.d.ts.map +1 -0
- package/dist/application/humanize-es.js +71 -0
- package/dist/application/humanize-es.js.map +1 -0
- package/dist/application/session-close-service.d.ts.map +1 -1
- package/dist/application/session-close-service.js +4 -1
- package/dist/application/session-close-service.js.map +1 -1
- package/dist/application/session-create-service.d.ts +2 -0
- package/dist/application/session-create-service.d.ts.map +1 -1
- package/dist/application/session-create-service.js +26 -3
- package/dist/application/session-create-service.js.map +1 -1
- package/dist/application/status-service.d.ts +74 -0
- package/dist/application/status-service.d.ts.map +1 -0
- package/dist/application/status-service.js +336 -0
- package/dist/application/status-service.js.map +1 -0
- package/dist/application/templates/session.d.ts +4 -2
- package/dist/application/templates/session.d.ts.map +1 -1
- package/dist/application/templates/session.js +15 -11
- package/dist/application/templates/session.js.map +1 -1
- package/dist/cli/commands/status.d.ts +3 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +10 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/help-groups.js +1 -1
- package/dist/cli/help-groups.js.map +1 -1
- package/dist/cli/main.js +2 -0
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/tui/data/workflow-content.d.ts.map +1 -1
- package/dist/cli/tui/data/workflow-content.js +2 -1
- package/dist/cli/tui/data/workflow-content.js.map +1 -1
- package/package.json +1 -1
- package/skills/w/README.md +2 -2
- package/skills/w/SKILL.md +6 -5
- package/skills/w/artifacts/README.md +8 -7
- package/skills/w/artifacts/artifacts-core/BACKLOG.md +5 -8
- package/skills/w/artifacts/artifacts-core/CHECKPOINT.md +14 -13
- package/skills/w/artifacts/artifacts-core/SESSION.md +10 -11
- package/skills/w/artifacts/artifacts-core/TASKS.md +4 -4
- package/skills/w/artifacts/artifacts-dev/DECISION.md +3 -3
- package/skills/w/artifacts/artifacts-dev/TECHNICAL-NOTE.md +14 -14
- package/skills/w/artifacts/artifacts-research/ANALYSIS-FILE.md +14 -27
- package/skills/w/artifacts/artifacts-research/CONCLUSIONS.md +10 -13
- package/skills/w/commands/README.md +9 -6
- package/skills/w/commands/export-diagrams.md +2 -6
- package/skills/w/commands/export-manuals.md +2 -6
- package/skills/w/commands/export-reports.md +2 -6
- package/skills/w/commands/export-scripts.md +2 -6
- package/skills/w/commands/plan-exec.md +11 -10
- package/skills/w/commands/plan-new.md +15 -12
- package/skills/w/commands/quick.md +7 -6
- package/skills/w/commands/spec-new.md +18 -7
- package/skills/w/commands/spec-refine.md +14 -11
- package/skills/w/commands/status.md +50 -0
- package/skills/w/loops/README.md +12 -11
- package/skills/w/loops/plan-exec-loop/SKILL.md +54 -52
- package/skills/w/loops/plan-new-loop/SKILL.md +28 -24
- package/skills/w/loops/quick-loop/SKILL.md +20 -19
- package/skills/w/loops/spec-refine-loop/SKILL.md +85 -63
- package/skills/w/roles/README.md +1 -1
- 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
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
plan-exec-loop y quick-loop. Invocar cuando haya que
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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**
|
|
48
|
-
|
|
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
|
-
>
|
|
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
|
|
55
|
-
- `aw session-create --type refine --name
|
|
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
|
|
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 (
|
|
83
|
+
## Deliverable schema (el spec, editado in place)
|
|
67
84
|
|
|
68
|
-
|
|
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
|
|
88
|
+
# Spec NNN — <slug>
|
|
72
89
|
|
|
73
|
-
>
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
143
|
-
refine_session = create_or_resume(
|
|
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 = {}
|
|
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
|
-
|
|
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 →
|
|
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)
|
|
173
|
-
write/update BACKLOG (motivo
|
|
174
|
-
cerrar
|
|
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 =
|
|
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 -->
|
|
190
|
-
DEG -->
|
|
191
|
-
I2 -->
|
|
192
|
-
|
|
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
|
|
215
|
+
W --> FIN["finalize: CHECKPOINT (+ BACKLOG si difiere)<br/>+ cerrar session + reportar"]
|
|
195
216
|
```
|
|
196
217
|
|
|
197
218
|
## Compact / resume
|
|
198
219
|
|
|
199
|
-
|
|
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
|
-
|
|
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` → `
|
|
210
|
-
- `Cerrar` (tab flow, en cualquier momento) → `finalize`. **`finalize` persiste siempre
|
|
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
|
|
215
|
-
- Resuelto vía **humano** → `## Q&A traceability` del
|
|
216
|
-
- **Research inconclusa o sin resolver** → `## Open questions` del
|
|
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`.
|
package/skills/w/roles/README.md
CHANGED
|
@@ -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
|
|
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
|
-
|
|
6
|
-
produce ANALYSIS-FILE → CONCLUSIONS
|
|
7
|
-
con las fuentes disponibles. Discrimina
|
|
8
|
-
|
|
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] → [
|
|
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. **
|
|
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. **
|
|
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
|
-
###
|
|
68
|
+
### Artifact schemas
|
|
68
69
|
|
|
69
|
-
|
|
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
|
|
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
|
-
###
|
|
101
|
+
### Inline research artifacts (en la sesión activa)
|
|
160
102
|
|
|
161
103
|
```
|
|
162
|
-
.workflow/sessions
|
|
163
|
-
├──
|
|
164
|
-
├──
|
|
165
|
-
|
|
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
|
|
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
|
-
- `
|
|
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.
|