@tacuchi/agent-workflow-cli 12.4.0 → 12.6.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/adapters/git-cli.d.ts +1 -0
- package/dist/adapters/git-cli.d.ts.map +1 -1
- package/dist/adapters/git-cli.js +21 -0
- package/dist/adapters/git-cli.js.map +1 -1
- 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/merge-state-service.d.ts +37 -0
- package/dist/application/merge-state-service.d.ts.map +1 -0
- package/dist/application/merge-state-service.js +89 -0
- package/dist/application/merge-state-service.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/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/merge-state.d.ts +3 -0
- package/dist/cli/commands/merge-state.d.ts.map +1 -0
- package/dist/cli/commands/merge-state.js +28 -0
- package/dist/cli/commands/merge-state.js.map +1 -0
- 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.d.ts.map +1 -1
- package/dist/cli/help-groups.js +2 -1
- package/dist/cli/help-groups.js.map +1 -1
- package/dist/cli/main.js +4 -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/dist/ports/git.d.ts +5 -0
- package/dist/ports/git.d.ts.map +1 -1
- package/package.json +1 -1
- package/skills/w/README.md +6 -3
- package/skills/w/SKILL.md +25 -9
- package/skills/w/artifacts/README.md +10 -9
- 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 +5 -5
- package/skills/w/artifacts/{artifacts-dev → artifacts-exec}/DECISION.md +3 -3
- package/skills/w/artifacts/{artifacts-dev → artifacts-exec}/TECHNICAL-NOTE.md +15 -15
- 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 +16 -10
- package/skills/w/commands/fix-git.md +33 -0
- package/skills/w/commands/plan-exec.md +4 -4
- package/skills/w/commands/plan-new.md +9 -7
- package/skills/w/commands/quick.md +1 -1
- package/skills/w/commands/spec-new.md +19 -15
- package/skills/w/commands/spec-refine.md +7 -5
- package/skills/w/commands/status.md +50 -0
- package/skills/w/exports/README.md +2 -2
- package/skills/w/exports/export-diagrams/SKILL.md +1 -1
- package/skills/w/exports/export-manuals/SKILL.md +2 -2
- package/skills/w/exports/export-reports/SKILL.md +1 -1
- package/skills/w/exports/export-scripts/SKILL.md +1 -1
- package/skills/w/harness/SKILL.md +85 -0
- package/skills/w/loops/README.md +22 -21
- package/skills/w/loops/plan-exec-loop/SKILL.md +60 -58
- package/skills/w/loops/plan-new-loop/SKILL.md +47 -41
- package/skills/w/loops/quick-loop/SKILL.md +23 -20
- package/skills/w/loops/spec-refine-loop/SKILL.md +116 -82
- package/skills/w/roles/README.md +2 -2
- package/skills/w/roles/git/SKILL.md +28 -7
- package/skills/w/roles/research/SKILL.md +22 -82
- package/skills/w/roles/testing/SKILL.md +2 -2
- package/skills/w/roles/ui-spec/SKILL.md +58 -48
|
@@ -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 structured-choice con ≤3 preguntas de contenido + 1 control 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
|
|
@@ -24,79 +24,95 @@ description: >-
|
|
|
24
24
|
SPEC
|
|
25
25
|
|
|
26
26
|
## Layer
|
|
27
|
-
2 — la IA lo corre entero (gap-driven). El usuario no conduce el ciclo; solo responde
|
|
27
|
+
2 — la IA lo corre entero (gap-driven). El usuario no conduce el ciclo; solo responde preguntas de contenido y dirige el ciclo de vida por el control `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 el argumento del comando. **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** `NNN-spec-refine/` | al arrancar el loop (o se reanuda) | `SESSION.md` · `CHECKPOINT.md` (· `BACKLOG.md`
|
|
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/`.
|
|
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-
|
|
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
|
|
68
|
+
> `<run>` = el **descriptor** (sin número) de la session del run: `spec-refine`, `plan-new`, `plan-exec`; QUICK usa `<slug>-quick` (slug del prompt). 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
|
|
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
|
|
|
66
77
|
## Composes
|
|
67
78
|
|
|
68
|
-
|
|
79
|
+
El gap **UI sin especificar** (cuando el requerimiento involucra UI; ver *Gap taxonomy*) se resuelve **componiendo** la capacidad **`ui-design`** (default built-in `ui-spec`; rebindeable vía `.workflow/skills.toml`): autora el UI spec nativamente (estructura, vocabulario, formato Markdown). Es un tercer modo de resolución de gap (junto a *research* y *humano*): el loop aporta la iteración/Q&A que el viejo servicio no tenía (design-system, tema, variantes, desambiguación) **vía la misma structured-choice**, y lo integra como sección `## UI spec` del spec.
|
|
69
80
|
|
|
70
|
-
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.
|
|
71
82
|
|
|
72
|
-
## Deliverable schema (
|
|
83
|
+
## Deliverable schema (el spec, editado in place)
|
|
73
84
|
|
|
74
|
-
|
|
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
|
|
88
|
+
# Spec NNN — <slug>
|
|
78
89
|
|
|
79
|
-
>
|
|
90
|
+
> Refinado in place por spec-refine-loop
|
|
80
91
|
|
|
92
|
+
## Origin (opt. — se conserva del borrador)
|
|
81
93
|
## Requirement (afinado, sin ambigüedad)
|
|
82
94
|
## Context (completo)
|
|
83
95
|
## Scope (In / Out claros)
|
|
84
|
-
## Acceptance criteria (testables, - [ ])
|
|
96
|
+
## Acceptance criteria (testables, - [ ]; estilo EARS / Given-When-Then recomendado)
|
|
85
97
|
## Assumptions (declarados)
|
|
86
98
|
|
|
87
99
|
## UI spec (opt. — si involucra UI; vía capacidad ui-design / skill ui-spec)
|
|
88
|
-
|
|
100
|
+
Descripción estructurada en Markdown (pantallas → regiones/componentes). Ver [`ui-spec`](../../roles/ui-spec/SKILL.md).
|
|
89
101
|
|
|
90
|
-
## Refinement decisions ← NEW
|
|
91
|
-
Qué se definió al refinar y por qué. Incluye lo resuelto vía research
|
|
92
|
-
(con referencia a
|
|
102
|
+
## Refinement decisions ← NEW (se AGREGA)
|
|
103
|
+
Qué se definió al refinar y por qué. Incluye lo resuelto vía research inline
|
|
104
|
+
(con referencia a las CONCLUSIONS de la session).
|
|
93
105
|
|
|
94
|
-
## Q&A traceability ← NEW
|
|
106
|
+
## Q&A traceability ← NEW (se AGREGA)
|
|
95
107
|
Cada duda preguntada al humano + la respuesta elegida.
|
|
96
108
|
|
|
97
109
|
## Open questions (idealmente "None"; lo que quede se difiere)
|
|
98
110
|
```
|
|
99
111
|
|
|
112
|
+
> **Marca de refinado (contrato con PLAN):** la presencia de `## Refinement decisions` + `## Q&A traceability` distingue un spec refinado de un borrador — plan-new lo detecta así, NO por el nombre del archivo; sin esas 2 secciones plan-new hace soft-suggest de spec-refine.
|
|
113
|
+
|
|
114
|
+
> **Acceptance criteria = criterios testables estáticos** (el "qué"): plan-exec los valida pero el avance se trackea en el PLAN (sus Tasks), no marcando estos `- [ ]` en el spec; el spec no muta por ejecución, solo por re-refine.
|
|
115
|
+
|
|
100
116
|
## Gap taxonomy (= weak sections of the schema)
|
|
101
117
|
|
|
102
118
|
`detect_gaps(work)` busca estas señales; cada una tiene un resolutor:
|
|
@@ -110,32 +126,37 @@ Cada duda preguntada al humano + la respuesta elegida.
|
|
|
110
126
|
| Open questions abiertas | dudas explícitas | según naturaleza |
|
|
111
127
|
| Supuestos ocultos | el spec asume cosas no dichas | **research** valida / **humano** confirma |
|
|
112
128
|
| Contradicción interna | secciones que se contradicen | **humano** |
|
|
129
|
+
| UI sin especificar *(si aplica)* | el requerimiento involucra UI pero falta `## UI spec` | **capacidad `ui-design`** |
|
|
113
130
|
|
|
114
131
|
## Ask-vs-research rule (el discriminador)
|
|
115
132
|
|
|
116
133
|
Para cada gap, una sola pregunta decide el resolutor:
|
|
117
134
|
|
|
118
135
|
> *"¿Puedo responder esto leyendo el repo/datos?"* → **research** (autónomo).
|
|
119
|
-
> *"¿Depende de lo que el usuario quiere?"* → **preguntar al humano** (
|
|
136
|
+
> *"¿Depende de lo que el usuario quiere?"* → **preguntar al humano** (structured-choice).
|
|
120
137
|
|
|
121
138
|
## Research: autonomy, scope & failure
|
|
122
139
|
|
|
123
|
-
|
|
140
|
+
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**.
|
|
141
|
+
|
|
142
|
+
- **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 control `flow`.
|
|
124
143
|
- **Alcance**: workspace + repos asociados (fuentes) + MCPs de BD.
|
|
125
144
|
- **Regla BD** (única excepción a la autonomía):
|
|
126
|
-
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
|
|
127
|
-
2. Escribe **primero** las queries en `SCRIPTS.sql` de la
|
|
145
|
+
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 la **misma structured-choice** como una **pregunta de contenido** (cuenta dentro del límite ≤3 + `flow`), **antes** de ejecutar queries. Si hay un único MCP o un default, no pregunta.
|
|
146
|
+
2. Escribe **primero** las queries en `SCRIPTS.sql` de la session.
|
|
128
147
|
3. Las ejecuta **read-only** vía MCP (respeta `sql-mutation-guard`: nunca DML/DDL).
|
|
129
148
|
- **Research inconclusa** (BD no disponible, evidencia insuficiente, gap factual irresoluble):
|
|
130
|
-
- La
|
|
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
|
|
149
|
+
- La investigación concluye con estado **`inconcluso`** en `CONCLUSIONS` y reporta el motivo.
|
|
150
|
+
- 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
151
|
- 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
152
|
|
|
134
|
-
##
|
|
153
|
+
## Structured-choice (design & batching)
|
|
135
154
|
|
|
136
|
-
-
|
|
137
|
-
|
|
138
|
-
- **
|
|
155
|
+
*structured-choice* (capacidad del arnés — ver `../../harness/SKILL.md`). En **Claude Code** es `AskUserQuestion` (máx 4 preguntas/llamada → **≤3 preguntas de contenido + 1 control `flow`**); en un arnés sin elección estructurada, degrada a **markdown numerado**.
|
|
156
|
+
|
|
157
|
+
- Como el control `flow` va **siempre** → **≤3 preguntas de contenido + 1 control `flow`**.
|
|
158
|
+
- **control `flow`** (ciclo de vida, siempre presente): `Compactar` | `Cerrar`. Responder solo las preguntas de contenido (sin tocar `flow`) = seguir iterando.
|
|
159
|
+
- **Preguntas de contenido** posibles:
|
|
139
160
|
- dudas-de-humano (gaps no factuales);
|
|
140
161
|
- elección de MCP (regla BD) — antes de ejecutar queries;
|
|
141
162
|
- en **convergencia**, acción: `Guardar especificación refinada` | `Preguntar algo más`.
|
|
@@ -145,84 +166,97 @@ Para cada gap, una sola pregunta decide el resolutor:
|
|
|
145
166
|
|
|
146
167
|
```
|
|
147
168
|
spec-refine-loop(spec):
|
|
148
|
-
input =
|
|
149
|
-
refine_session = create_or_resume("spec-refine")
|
|
169
|
+
input = glob(NNN-spec*.md) | argumento (ruta) # siempre el spec mismo (in place)
|
|
170
|
+
refine_session = create_or_resume("spec-refine") # CLI antepone NNN global; resume localiza por descriptor/origin
|
|
150
171
|
work = read(input) (+ aplicar avance del checkpoint si reanuda)
|
|
151
|
-
attempts = {}
|
|
172
|
+
attempts = {} # anti-relanzamiento por gap
|
|
152
173
|
repeat:
|
|
153
174
|
gaps = detect_gaps(work) menos los gaps "agotados"
|
|
154
175
|
if gaps == ∅: break
|
|
155
176
|
batch = top ≤3 gaps ; pending_human = []
|
|
177
|
+
seed CHECKPOINT.Pending/Next = batch (refine_session) # ANTES: sembrar intención (artifact-first)
|
|
156
178
|
para cada gap en batch:
|
|
157
|
-
si
|
|
179
|
+
si gap = UI (requerimiento con UI, falta ## UI spec):
|
|
180
|
+
componer ui-design → autora ## UI spec # design-system/tema vía structured-choice (cuenta en el batch)
|
|
181
|
+
work = integrate(work, ui) # → ## UI spec
|
|
182
|
+
si no, si factual(gap) y attempts[gap] < MAX:
|
|
158
183
|
si requiere BD y >1 MCP sin default → encolar "elección MCP" en pending_human
|
|
159
|
-
|
|
160
|
-
res = rs.run_and_close() # ANALYSIS-FILE → CONCLUSIONS (+SCRIPTS.sql)
|
|
184
|
+
res = research_inline(gap) # en la session actual: ANALYSIS-FILE → CONCLUSIONS (+SCRIPTS.sql read-only)
|
|
161
185
|
si res.concluyente: work = integrate(work, res) # → Refinement decisions
|
|
162
186
|
si no: attempts[gap]++ ; si attempts[gap] >= MAX → pending_human.push(gap)
|
|
163
187
|
si no:
|
|
164
188
|
pending_human.push(gap)
|
|
189
|
+
update CHECKPOINT (refine_session) # DESPUÉS: Pending→Completed, en cada límite de gap (ver ciclo artifact-first)
|
|
165
190
|
si pending_human no vacío:
|
|
166
|
-
ans =
|
|
191
|
+
ans = structured_choice(contenido: pending_human (≤3), flow: [Compactar, Cerrar])
|
|
167
192
|
switch(flow):
|
|
168
|
-
Compactar → write CHECKPOINT (refine_session) ;
|
|
193
|
+
Compactar → write CHECKPOINT (refine_session) ; compactar(arnés) ; continue
|
|
169
194
|
Cerrar → goto finalize
|
|
170
195
|
work = integrate(work, ans) # → Q&A traceability / Open questions
|
|
171
|
-
#
|
|
172
|
-
|
|
196
|
+
# sin gaps materiales → analyze gate (read-only) antes de ofrecer Guardar:
|
|
197
|
+
issues = analyze(work) # criterios trazan al Requirement · sin contradicciones · Scope coherente · Open questions cerradas/diferidas
|
|
198
|
+
si issues: gaps += issues ; continue # los hallazgos vuelven al loop como gaps
|
|
199
|
+
ans = structured_choice(contenido: [Guardar refinada, Preguntar algo más],
|
|
173
200
|
flow: [Compactar, Cerrar])
|
|
174
|
-
Guardar →
|
|
201
|
+
Guardar → edit_in_place_with_confirm(spec) # completa secciones + inserta UI spec/Refinement decisions/Q&A ; goto finalize
|
|
175
202
|
Preguntar algo más → continue
|
|
176
203
|
flow Compactar/Cerrar → manejar igual
|
|
177
204
|
finalize:
|
|
178
|
-
write CHECKPOINT (refine_session)
|
|
179
|
-
write/update BACKLOG (motivo
|
|
180
|
-
cerrar
|
|
205
|
+
write CHECKPOINT (refine_session) # persiste siempre
|
|
206
|
+
si hay diferidos/followup → write/update BACKLOG (motivo + Open questions diferidas)
|
|
207
|
+
cerrar refine_session ; reportar
|
|
181
208
|
```
|
|
182
209
|
|
|
183
210
|
```mermaid
|
|
184
211
|
flowchart TD
|
|
185
|
-
S["input =
|
|
186
|
-
D -->|no|
|
|
212
|
+
S["input = glob NNN-spec*.md (el spec mismo)<br/>create_or_resume refine session"] --> D{"¿gaps<br/>(no agotados)?"}
|
|
213
|
+
D -->|no| AN{"analyze gate<br/>criterios↔Requirement · sin contradicciones<br/>Scope · Open questions cerradas/diferidas"}
|
|
214
|
+
AN -->|falla| D
|
|
215
|
+
AN -->|ok| C["structured-choice<br/>contenido[Guardar refinada · Preguntar más]<br/>flow[Compactar · Cerrar]"]
|
|
187
216
|
D -->|sí| B["tomar ≤3 gaps"]
|
|
188
|
-
B -->
|
|
189
|
-
|
|
217
|
+
B --> K{"tipo de gap"}
|
|
218
|
+
K -->|UI| UI["componer ui-design<br/>→ ## UI spec (design-system/tema vía structured-choice)"]
|
|
219
|
+
K -->|factual y attempts<MAX| RS["research INLINE en la session<br/>ANALYSIS-FILE → CONCLUSIONS (+SCRIPTS.sql)"]
|
|
220
|
+
K -->|humano| Q["structured-choice<br/>contenido[dudas + elección MCP ≤3]<br/>flow[Compactar · Cerrar]"]
|
|
190
221
|
RS --> CC{"¿concluyente?"}
|
|
191
222
|
CC -->|sí| I1["integrar → Refinement decisions"]
|
|
192
223
|
CC -->|no| DEG["attempts++ ; degradar a humano / Open questions"]
|
|
193
|
-
F -->|no| Q["AskUserQuestion<br/>contenido[dudas + elección MCP ≤3]<br/>flow[Compactar · Cerrar]"]
|
|
194
224
|
Q --> I2["integrar → Q&A traceability"]
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
225
|
+
UI --> CK["update CHECKPOINT (Pending→Completed)"]
|
|
226
|
+
I1 --> CK
|
|
227
|
+
DEG --> CK
|
|
228
|
+
I2 --> CK
|
|
229
|
+
CK --> D
|
|
230
|
+
C -->|Guardar| W["edit IN PLACE con confirmación<br/>completa + inserta UI spec/Refinement decisions/Q&A"]
|
|
199
231
|
C -->|Preguntar más| D
|
|
200
|
-
W --> FIN["finalize: CHECKPOINT + BACKLOG<br/>+ cerrar
|
|
232
|
+
W --> FIN["finalize: CHECKPOINT (+ BACKLOG si difiere)<br/>+ cerrar session + reportar"]
|
|
201
233
|
```
|
|
202
234
|
|
|
203
235
|
## Compact / resume
|
|
204
236
|
|
|
205
|
-
|
|
237
|
+
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:
|
|
238
|
+
|
|
239
|
+
1. **En curso** (existe `CHECKPOINT.md` en la refine session) → reanuda desde el avance (gaps resueltos, Q&A, `attempts`, research inline en curso).
|
|
240
|
+
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`).
|
|
241
|
+
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
242
|
|
|
207
|
-
|
|
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.
|
|
243
|
+
> **`Compactar`** (control `flow`, transversal a los 3 casos) → escribe `CHECKPOINT.md` en la refine session (spec en progreso, gaps restantes, Q&A, `attempts`) → dispara la **compactación** del arnés (en Claude Code: `/compact`; ver `../../harness/SKILL.md`) → reanuda leyendo el checkpoint.
|
|
211
244
|
|
|
212
245
|
## Convergence / exit
|
|
213
246
|
|
|
214
|
-
- **Sin gaps materiales** → ofrece `Guardar especificación refinada`.
|
|
215
|
-
- `Guardar` → `
|
|
216
|
-
- `Cerrar` (
|
|
247
|
+
- **Sin gaps materiales** → **analyze gate** (read-only): cada acceptance criterion traza al `Requirement`, sin contradicciones internas, `Scope` In/Out coherente, `Open questions` cerradas o explícitamente diferidas. Lo que falle **vuelve como gap**; si pasa → ofrece `Guardar especificación refinada`. *(Es el "convergence gate" del chasis; heirs: plan-new = coherencia del plan, plan-exec = validación final, quick = validación puntual — excepción lightweight.)*
|
|
248
|
+
- `Guardar` → `edit_in_place_with_confirm(spec)` y `finalize`.
|
|
249
|
+
- `Cerrar` (control `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
250
|
|
|
218
251
|
## Integration (dónde aterriza cada resolución)
|
|
219
252
|
|
|
220
|
-
- Resuelto vía **research** → `## Refinement decisions` del
|
|
221
|
-
- Resuelto vía **humano** → `## Q&A traceability` del
|
|
222
|
-
-
|
|
253
|
+
- Resuelto vía **research inline** → `## Refinement decisions` del spec (+ ref a las `CONCLUSIONS` de la session).
|
|
254
|
+
- Resuelto vía **humano** → `## Q&A traceability` del spec.
|
|
255
|
+
- Resuelto vía **capacidad `ui-design`** (gap UI) → sección `## UI spec` del spec.
|
|
256
|
+
- **Research inconclusa o sin resolver** → `## Open questions` del spec (diferido) + `BACKLOG.md` de la refine session (solo si queda algo diferido).
|
|
223
257
|
|
|
224
258
|
## Heredan este chasis
|
|
225
259
|
|
|
226
260
|
- `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.
|
|
261
|
+
- `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
262
|
- `quick-loop` — mismo motor (mínimo); hereda además git/BD/no-export de `plan-exec-loop`.
|
package/skills/w/roles/README.md
CHANGED
|
@@ -12,8 +12,8 @@ All 10 roles, their built-in defaults, their tier, and which loops/exports compo
|
|
|
12
12
|
|
|
13
13
|
| Role | Default built-in | Tier | Composed by |
|
|
14
14
|
|---|---|---|---|
|
|
15
|
-
| `ui-design` | [`ui-spec`](
|
|
16
|
-
| `sql` | `sql` | must | research
|
|
15
|
+
| `ui-design` | [`ui-spec`](ui-spec/SKILL.md) | must | `spec-refine-loop` (when requirement involves UI) |
|
|
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` |
|
|
@@ -6,7 +6,8 @@ description: >-
|
|
|
6
6
|
commits when the user approves, and NEVER runs push, --amend, --no-verify, force,
|
|
7
7
|
merge/rebase/cherry-pick, tags, or destructive resets without explicit user request.
|
|
8
8
|
Read-only git (status/log/diff/branch) is always allowed. Use when a loop is about
|
|
9
|
-
to edit code
|
|
9
|
+
to edit code, when the user asks to commit / save / push changes, or to resolve an
|
|
10
|
+
in-progress merge conflict (via /w:fix-git).
|
|
10
11
|
---
|
|
11
12
|
|
|
12
13
|
# git — git-safe capability
|
|
@@ -23,6 +24,7 @@ Operar git de forma **segura y controlada**: verificar la rama esperada antes de
|
|
|
23
24
|
|
|
24
25
|
- **`plan-exec-loop`** — verifica rama antes de cada edit; propone commits al cerrar/checkpoint.
|
|
25
26
|
- **`quick-loop`** — igual, en el atajo liviano.
|
|
27
|
+
- **`/w:fix-git`** (comando transversal) — compone la sección *Resolución de conflictos de merge* para resolver un merge en curso en cualquier repo.
|
|
26
28
|
|
|
27
29
|
(Cualquier flujo que edite código o que el usuario quiera commitear lo usa.)
|
|
28
30
|
|
|
@@ -40,9 +42,11 @@ Lista cerrada. La IA **nunca** las ejecuta por iniciativa propia:
|
|
|
40
42
|
|
|
41
43
|
Y **siempre** prohibido, aún cuando el usuario pida commit: `--no-verify` (respetar los hooks pre-commit), `--force`, trailers `Co-Authored-By`, firmas de modelo.
|
|
42
44
|
|
|
45
|
+
> **Excepción — merge en curso:** resolver los conflictos de un merge **ya iniciado** (MERGE_HEAD), o iniciado a pedido **explícito** del usuario vía `/w:fix-git`, **sí** está permitido (es solicitud explícita, no iniciativa propia) — ver *Resolución de conflictos de merge*.
|
|
46
|
+
|
|
43
47
|
### Operaciones read-only (siempre permitidas, sin preguntar)
|
|
44
48
|
|
|
45
|
-
`status` · `log` · `diff` · `branch --show-current` · `rev-parse` · `show`. `git checkout` (cambio de rama) **no** es read-only: requiere `AskUserQuestion` aunque no sea destructivo (ver verificación de rama).
|
|
49
|
+
`status` · `log` · `diff` · `branch --show-current` · `rev-parse` · `show`. `git checkout` (cambio de rama) **no** es read-only: requiere *structured-choice* (capacidad del arnés — ver `../../harness/SKILL.md`; en **Claude Code** es `AskUserQuestion`, máx 4 preguntas/llamada → **≤3 preguntas de contenido + 1 control `flow`**; sin elección estructurada degrada a **markdown numerado**) aunque no sea destructivo (ver verificación de rama).
|
|
46
50
|
|
|
47
51
|
### Verificación de rama (antes de editar)
|
|
48
52
|
|
|
@@ -53,9 +57,9 @@ Campos por fuente: `alias`, `path`, `main_branch` (base, default `certificacion`
|
|
|
53
57
|
Casos:
|
|
54
58
|
|
|
55
59
|
- **`match=true`** → OK, editar.
|
|
56
|
-
- **`match=false, dirty=false`** (Caso A — rama distinta, repo limpio) →
|
|
60
|
+
- **`match=false, dirty=false`** (Caso A — rama distinta, repo limpio) → *structured-choice*: hacer `git checkout <expected>` / mantener current y actualizar la expectativa de la sesión / cancelar.
|
|
57
61
|
- **`match=false, dirty=true`** (Caso B — rama distinta + cambios sin commit) → **pausar y esperar resolución manual**. No proponer checkout (podría perder trabajo). Pedir al usuario commit/stash/discard y avisar cuando continuar.
|
|
58
|
-
- **Cross-fuente (hub)**: si las fuentes tocadas apuntan a ramas distintas sin declararlo, **hard gate** — bloquear avance con
|
|
62
|
+
- **Cross-fuente (hub)**: si las fuentes tocadas apuntan a ramas distintas sin declararlo, **hard gate** — bloquear avance con *structured-choice* (alinear todas / declarar divergencia explícita / cancelar).
|
|
59
63
|
- **HEAD detached** → tratar como Caso A.
|
|
60
64
|
- **Fuente fuera de git** (`is_repo=false`) → informar, no bloquear.
|
|
61
65
|
|
|
@@ -64,14 +68,14 @@ Casos:
|
|
|
64
68
|
Ante cualquier pedido o disparo de commit (cierre de loop, "commitea esto", "guardá los cambios"):
|
|
65
69
|
|
|
66
70
|
1. Resolver las fuentes y su estado dirty/rama.
|
|
67
|
-
2. Si hay 1+ fuentes `dirty=true`, invocar **una sola**
|
|
68
|
-
- Header
|
|
71
|
+
2. Si hay 1+ fuentes `dirty=true`, invocar **una sola** *structured-choice* con una pregunta de contenido por fuente dirty (máx 4 simultáneas → **≤3 preguntas de contenido + 1 control `flow`**; si N>3, en tandas):
|
|
72
|
+
- Header de la pregunta: el `alias` de la fuente.
|
|
69
73
|
- Opciones: "Aprobar sugerido (Recomendado)" con el mensaje canónico / "Saltar esta fuente". `Other` = mensaje custom.
|
|
70
74
|
3. Ejecutar `git -C <path> commit -m "<msg>"` solo en las fuentes aprobadas, **una a una**. Respetar hooks (sin `--no-verify`).
|
|
71
75
|
4. Si una fuente tiene `match=false` (rama distinta a la esperada): **omitirla y abortar su commit**; avisar para alinear la rama primero.
|
|
72
76
|
5. Si todas están `dirty=false` → skip silencioso, informar en chat que no hay nada que commitear.
|
|
73
77
|
|
|
74
|
-
**Bypass** (Regla 5): si el usuario aporta el mensaje literal exacto (`-m "..."`, comillas), commitear directo sin
|
|
78
|
+
**Bypass** (Regla 5): si el usuario aporta el mensaje literal exacto (`-m "..."`, comillas), commitear directo sin *structured-choice*, pero seguir validando rama, hooks y formato. Si el literal viola el formato, avisar antes de ejecutar.
|
|
75
79
|
|
|
76
80
|
### Formato canónico del mensaje
|
|
77
81
|
|
|
@@ -89,6 +93,23 @@ fix(session018): corrige drift en hooks.json
|
|
|
89
93
|
|
|
90
94
|
Fuera de sesión activa: relajar a "1 línea + sin co-author"; el tag `session<NNN>` se omite. El propose-then-execute sigue activo.
|
|
91
95
|
|
|
96
|
+
### Resolución de conflictos de merge
|
|
97
|
+
|
|
98
|
+
`git merge` autónomo está prohibido (arriba), **pero** resolver un merge **ya en curso** (MERGE_HEAD) o invocado por el usuario vía `/w:fix-git` **sí** es trabajo sancionado. **Agnóstico al workspace**: opera sobre cualquier repo (no requiere `.workflow/`, flows ni sesiones).
|
|
99
|
+
|
|
100
|
+
1. **Detectar + identificar** con `aw merge-state [<path>|--source <alias>|--all]` (read-only): `is_merging`, `current_branch` (**destino / ours**), `merge_origin` (**origen / theirs**), `conflicted_files`. Si `merge_origin` viene vacío, mirar `.git/MERGE_MSG` o `git log --oneline -1 MERGE_HEAD`.
|
|
101
|
+
2. **Analizar la intención** de cada conflicto **antes** de resolver — nunca elegir un lado a ciegas:
|
|
102
|
+
- Las tres versiones: `git show :1:<file>` (base) · `:2:<file>` (ours/destino) · `:3:<file>` (theirs/origen).
|
|
103
|
+
- El porqué de cada lado: `git log --merge -p -- <file>`; el historial del hunk en cada rama.
|
|
104
|
+
- El código alrededor del marcador (coherencia con el resto del archivo).
|
|
105
|
+
3. **Resolver** editando el archivo (quitar `<<<<<<<` / `=======` / `>>>>>>>`): elegir **ours**, **theirs**, **combinar** ambas intenciones, o **reescribir** para satisfacer las dos. `git add <file>` lo resuelto.
|
|
106
|
+
4. **Preguntar** (*structured-choice*) cuando la intención es **ambigua** o los dos lados son **incoherentes** entre sí (no combinables sin perder algo): una pregunta de contenido por archivo/hunk dudoso (≤3 + control `flow`), opciones "Ours (`<destino>`)" / "Theirs (`<origen>`)" / "Combinar" / "Editar manual". **No inventar** una resolución cuando hay duda real.
|
|
107
|
+
5. **Commit propuesto**: completar el merge es un `git commit` (el merge commit) → **propose-then-execute** como cualquier commit (formato canónico de arriba; fuera de sesión → 1 línea sin tag `session<NNN>`; nunca `--no-verify`/`--amend`/`push`). El hook `git-commit-advisor` lo gatea.
|
|
108
|
+
6. **Escape**: si el merge no debe completarse, `git merge --abort` **tras confirmación** del usuario (*structured-choice*) — deja el repo como antes del merge.
|
|
109
|
+
|
|
110
|
+
> **Resume por git**: el estado del merge en `.git` (MERGE_HEAD + índice) **es** el checkpoint; re-correr `/w:fix-git` reanuda desde los conflictos que queden. No hay session ni artefacto.
|
|
111
|
+
> **Rebase / cherry-pick**: fuera de v1 (misma resolución de markers; distinto `--continue` / `REBASE_HEAD`).
|
|
112
|
+
|
|
92
113
|
## Output
|
|
93
114
|
|
|
94
115
|
Ninguno en `docs/`. Produce commits **solo** cuando el usuario aprueba, en los repos fuente. La verificación de rama puede actualizar la expectativa de rama de la sesión si el usuario lo elige.
|
|
@@ -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
|
|
@@ -23,7 +24,7 @@ El discriminador clave:
|
|
|
23
24
|
| La pregunta... | Acción |
|
|
24
25
|
|---|---|
|
|
25
26
|
| puede responderse leyendo repo / datos (hechos objetivos del sistema) | **investigar** |
|
|
26
|
-
| depende de preferencias, prioridades o decisiones del usuario | **preguntar al humano** vía `AskUserQuestion` |
|
|
27
|
+
| depende de preferencias, prioridades o decisiones del usuario | **preguntar al humano** vía *structured-choice* (capacidad del arnés — ver `../../harness/SKILL.md`). En **Claude Code** es `AskUserQuestion` (máx 4 preguntas/llamada → **≤3 preguntas de contenido + 1 control `flow`**); en un arnés sin elección estructurada, degrada a **markdown numerado**. |
|
|
27
28
|
| está parcialmente en el repo y parcialmente en intención del usuario | investigar primero, luego preguntar solo por la parte incierta |
|
|
28
29
|
|
|
29
30
|
## Composed by
|
|
@@ -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.
|