@tacuchi/agent-workflow-cli 14.10.0 → 14.11.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/README.md +1 -1
- package/dist/application/self/install-skill.d.ts.map +1 -1
- package/dist/application/self/install-skill.js +19 -1
- package/dist/application/self/install-skill.js.map +1 -1
- package/package.json +1 -1
- package/skills/w/README.md +14 -56
- package/skills/w/SKILL.md +6 -18
- package/skills/w/artifacts/artifacts-core/SESSION.md +1 -1
- package/skills/w/commands/README.md +23 -109
- package/skills/w/commands/plan-exec.md +1 -1
- package/skills/w/commands/plan-new.md +1 -1
- package/skills/w/commands/plan-refine.md +1 -1
- package/skills/w/commands/quick.md +1 -1
- package/skills/w/commands/spec-refine.md +1 -1
- package/skills/w/loops/CHASSIS.md +159 -0
- package/skills/w/loops/CODE-POLICIES.md +34 -0
- package/skills/w/loops/README.md +8 -59
- package/skills/w/loops/plan-exec-loop/SKILL.md +11 -50
- package/skills/w/loops/plan-new-loop/SKILL.md +13 -11
- package/skills/w/loops/plan-refine-loop/SKILL.md +15 -12
- package/skills/w/loops/quick-loop/SKILL.md +10 -25
- package/skills/w/loops/spec-refine-loop/SKILL.md +29 -169
|
@@ -3,9 +3,10 @@ name: quick-loop
|
|
|
3
3
|
description: >-
|
|
4
4
|
El atajo liviano de agent-workflow: resuelve una tarea acotada (fix, ajuste
|
|
5
5
|
chico) directamente desde el prompt, editando código con ceremonia mínima.
|
|
6
|
-
Heir del chasis
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
Heir del chasis común de los loops (loops/CHASSIS.md — motor gap-driven con
|
|
7
|
+
las políticas de loops que editan código: git seguro, BD solo-scripts, gate
|
|
8
|
+
de revisión de cierre proporcional, sin auto-export); sus deltas viven en
|
|
9
|
+
el cuerpo: sin fases ni plan-doc (el prompt ES la tarea),
|
|
9
10
|
session ligera única (<slug>-quick), un solo commit, y escalación con
|
|
10
11
|
handoff a SPEC/PLAN si la tarea crece. NO toca docs/. Lo arranca /w:quick y
|
|
11
12
|
es reanudable. Invocar para cambios pequeños y directos que no ameritan spec
|
|
@@ -14,7 +15,7 @@ description: >-
|
|
|
14
15
|
|
|
15
16
|
# quick-loop
|
|
16
17
|
|
|
17
|
-
> **Heir** del chasis
|
|
18
|
+
> **Heir** del chasis común — aquí **solo** los deltas de QUICK. El motor vive en el chasis y las *Políticas de loops que editan código* (git · BD · gate proporcional) en `CODE-POLICIES.md` — no se repiten.
|
|
18
19
|
|
|
19
20
|
## Flow
|
|
20
21
|
QUICK
|
|
@@ -39,8 +40,7 @@ QUICK
|
|
|
39
40
|
|
|
40
41
|
## Inherits
|
|
41
42
|
|
|
42
|
-
|
|
43
|
-
- 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/`), y el **gate de revisión de cierre** (§ *Delta 5* de plan-exec) en versión **proporcional**: antes de proponer el único commit, re-lectura del diff aplicando las convenciones ambientes instaladas → corregir o diferir justificado.
|
|
43
|
+
Leé **[`../CHASSIS.md`](../CHASSIS.md)** (instalación normal) **o** `CHASSIS.md` junto a este archivo (instalación aplanada) — el motor completo del loop (objetivo persistente + verification-first, gap-driven, session única + research inline, structured-choice + control `flow`, compact/resume, artefactos como log vivo, numeración, convergence gate, docs/ boundary) — **y** **[`../CODE-POLICIES.md`](../CODE-POLICIES.md)** (o `CODE-POLICIES.md` junto a este archivo) — las *Políticas de loops que editan código* (git seguro · BD solo-scripts · gate de revisión de cierre **proporcional**) — **siempre antes** de estos deltas.
|
|
44
44
|
|
|
45
45
|
## Composes
|
|
46
46
|
|
|
@@ -51,10 +51,11 @@ QUICK
|
|
|
51
51
|
## Delta QUICK — minimal ceremony
|
|
52
52
|
|
|
53
53
|
- **Sin fases, sin plan-doc**: el prompt **es** la tarea (una sola unidad). No hay roadmap.
|
|
54
|
-
- **Verification-first proporcional** (ceremonia mínima): aun acá se **siembra el check antes**, del tamaño de la tarea. Código: un test (repro del bug → fix) o "build/lint/tests existentes siguen verdes" (chore). **Análisis/diseño**: una **rúbrica falsable corta**, *ratificada por el usuario* antes de perseguirla. Es el `SESSION.Success criteria` del run (ver [chasis § Verification-first](../
|
|
55
|
-
- **
|
|
54
|
+
- **Verification-first proporcional** (ceremonia mínima): aun acá se **siembra el check antes**, del tamaño de la tarea. Código: un test (repro del bug → fix) o "build/lint/tests existentes siguen verdes" (chore). **Análisis/diseño**: una **rúbrica falsable corta**, *ratificada por el usuario* antes de perseguirla. Es el `SESSION.Success criteria` del run (ver [chasis § *Verification-first*](../CHASSIS.md)).
|
|
55
|
+
- **Git y BD inline** (políticas completas en [`../CODE-POLICIES.md`](../CODE-POLICIES.md)): antes de editar, verificar rama esperada por fuente (`aw check-branch`); commit **propuesto** (aprobar antes) — nunca `push`/`--amend`/`--no-verify`. La IA **nunca ejecuta DML/DDL**: las migraciones se redactan en el `SCRIPTS.sql` de la session (consultas read-only sí, vía MCP).
|
|
56
|
+
- **Una sola session**. **Un solo commit** propuesto al final (solo si hubo cambios de código), **tras el gate de revisión de cierre proporcional** ([`../CODE-POLICIES.md`](../CODE-POLICIES.md) § *Gate de revisión de cierre*): re-lectura del diff + convenciones ambientes; corregir o diferir; nada llega al commit sin revisar.
|
|
56
57
|
- **Escalación + handoff**: si la tarea crece (muchos archivos / ≥2 fuentes / necesita arquitectura) → propone subir a **SPEC/PLAN**. Si el usuario acepta:
|
|
57
|
-
- 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"
|
|
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" ([`../CODE-POLICIES.md`](../CODE-POLICIES.md) § *Git seguro*: no revertir **y** registrar lo sin commitear). Crítico en la rama **SPEC**, que no retoma el working tree;
|
|
58
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í");
|
|
59
60
|
- los artefactos (`DECISION`, `SCRIPTS.sql`) **quedan en la session quick** como contexto referenciable por la nueva session (no se migran);
|
|
60
61
|
- **asimetría**: escalar a **PLAN** puede **absorber** el avance (plan-exec retoma el working tree existente); escalar a **SPEC** **reinicia** el ciclo de diseño y trata el código a medias como **contexto/referencia**, no como trabajo ya ingerido.
|
|
@@ -95,22 +96,6 @@ quick-loop(prompt):
|
|
|
95
96
|
finalize: CHECKPOINT (DESPUÉS: Pending→Completed) + BACKLOG (solo si queda algo diferido) + cerrar session + reportar
|
|
96
97
|
```
|
|
97
98
|
|
|
98
|
-
```mermaid
|
|
99
|
-
flowchart TD
|
|
100
|
-
S["create_or_resume NNN-<slug>-quick<br/>seed Objective + Success criteria (verification-first)"] --> G["branch-check (si edita código)"]
|
|
101
|
-
G -->|ok| DO["producir deliverable: código Ó análisis/diseño<br/>BD→SCRIPTS.sql · DECISION · (duda→research/structured-choice)"]
|
|
102
|
-
G -->|rama ≠| PA["pausar + resolver"]
|
|
103
|
-
PA --> G
|
|
104
|
-
DO --> GROW{"¿la tarea creció?"}
|
|
105
|
-
GROW -->|sí| ESC["escalar a SPEC/PLAN<br/>avance queda · BACKLOG→spec/plan sembrado"]
|
|
106
|
-
ESC --> FIN
|
|
107
|
-
GROW -->|no| V["convergence gate:<br/>Success criteria en verde"]
|
|
108
|
-
V --> RV["si hubo código → gate de revisión de cierre<br/>(diff + convenciones ambientes → corregir/diferir)"]
|
|
109
|
-
RV --> CM["proponer commit (aprobar)"]
|
|
110
|
-
CM --> Q["structured-choice[Cerrar · Preguntar más]<br/>flow[Compactar · Cerrar]"]
|
|
111
|
-
Q --> FIN["finalize: CHECKPOINT + BACKLOG + cerrar"]
|
|
112
|
-
```
|
|
113
|
-
|
|
114
99
|
## Convergence / exit
|
|
115
100
|
|
|
116
101
|
- **Success criteria en verde** (proporcional) + gate de revisión de cierre pasado y commit propuesto si hubo código (o aprobado saltarlo) → `Cerrar`.
|
|
@@ -1,24 +1,26 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: spec-refine-loop
|
|
3
3
|
description: >-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
heredan plan-new-loop, plan-exec-loop y quick-loop. Invocar cuando haya que
|
|
16
|
-
refinar/desambiguar una especificación antes de planificar.
|
|
4
|
+
Refina un spec borrador (docs/specs/NNN-spec-<slug>.md) editándolo IN PLACE
|
|
5
|
+
hasta dejarlo sin ambigüedad. Heir del chasis común de los loops
|
|
6
|
+
(loops/CHASSIS.md — motor gap-driven convergente: session única con research
|
|
7
|
+
inline, structured-choice ≤3 preguntas + control flow, artefactos como log
|
|
8
|
+
vivo, compact/resume, convergence gate); aquí viven solo sus deltas SPEC:
|
|
9
|
+
gap taxonomy de spec, analyze gate, sección ## UI spec vía la capacidad
|
|
10
|
+
ui-design cuando el requerimiento involucra UI, y agrega Refinement
|
|
11
|
+
decisions + Q&A traceability al spec — la marca de refinado que plan-new
|
|
12
|
+
detecta. Lo arranca /w:spec-refine; reanudable vía CHECKPOINT y re-corrible
|
|
13
|
+
a demanda. Invocar cuando haya que refinar/desambiguar una especificación
|
|
14
|
+
antes de planificar.
|
|
17
15
|
---
|
|
18
16
|
|
|
19
17
|
# spec-refine-loop
|
|
20
18
|
|
|
21
|
-
> **
|
|
19
|
+
> **Heir** del chasis común — aquí **solo** los deltas de SPEC. El motor no se repite.
|
|
20
|
+
|
|
21
|
+
## Inherits
|
|
22
|
+
|
|
23
|
+
Leé **[`../CHASSIS.md`](../CHASSIS.md)** (instalación normal) **o** `CHASSIS.md` junto a este archivo (instalación aplanada) — el motor completo del loop (objetivo persistente + verification-first, gap-driven, session única + research inline, structured-choice + control `flow`, compact/resume, artefactos como log vivo, numeración, convergence gate), **siempre antes** de estos deltas.
|
|
22
24
|
|
|
23
25
|
## Flow
|
|
24
26
|
SPEC
|
|
@@ -27,7 +29,7 @@ SPEC
|
|
|
27
29
|
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
30
|
|
|
29
31
|
## Started by
|
|
30
|
-
`/w:spec-refine` — **reanudable**. Detecta el estado previo (vía CHECKPOINT) y arranca según corresponda (ver *Compact / resume*).
|
|
32
|
+
`/w:spec-refine` — **reanudable**. Detecta el estado previo (vía CHECKPOINT) y arranca según corresponda (ver *Compact / resume — claves SPEC*).
|
|
31
33
|
|
|
32
34
|
## Reads
|
|
33
35
|
- `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,97 +37,25 @@ SPEC
|
|
|
35
37
|
## Writes
|
|
36
38
|
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.
|
|
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.
|
|
39
|
-
|
|
40
|
-
## Objetivo persistente (chasis — heredado por todos los loops)
|
|
41
|
-
|
|
42
|
-
Un loop **es un objetivo persistente**: existe para cumplir el `SESSION.Objective` declarado al arrancar, y **no se considera terminado hasta que el convergence gate confirma que el objetivo se cumplió**. La iteración gap-driven es el *método*; los artefactos son el *registro*; el objetivo persistente es el *frame* que los gobierna.
|
|
43
|
-
|
|
44
|
-
Está **modelado en cómo se comporta el `/goal` de Claude Code** (declarás un objetivo, el agente no para hasta cumplirlo, auto-completa al cumplirse, con corte explícito para abortar antes) pero como **doctrina agnóstica, no una dependencia del host**: el "no parar hasta converger" lo sostiene el propio loop (su `repeat:` + el convergence gate), no un Stop hook del arnés — ningún host necesita `/goal`. Y, a diferencia del `/goal` pelado, **deja registro durable** (artifact-first) que sobrevive compactación y resume.
|
|
45
|
-
|
|
46
|
-
| Comportamiento de `/goal` (ejemplo) | Análogo agnóstico en el loop |
|
|
47
|
-
|---|---|
|
|
48
|
-
| declarar el objetivo | `SESSION.Objective` |
|
|
49
|
-
| no parar hasta cumplirlo | `repeat:` gap-driven hasta `gaps == ∅` |
|
|
50
|
-
| objetivo cumplido → auto-clear | **convergence gate** pasa → `finalize` |
|
|
51
|
-
| `/goal clear` (abortar antes) | control `flow` `Cerrar` |
|
|
52
|
-
| la directiva sobrevive el contexto | `CHECKPOINT` + resume (compactación **y próximo prompt**) |
|
|
53
|
-
|
|
54
|
-
> Los heirs heredan el frame: `plan-new`/`plan-exec` persiguen el plan hasta su gate; `quick-loop` es la encarnación más directa (el prompt *es* el objetivo) — el "símil a `/goal`" del modelo.
|
|
55
|
-
|
|
56
|
-
> **Continuidad inter-turno (contexto operativo).** El mismo `CHECKPOINT`+resume que sobrevive la compactación gobierna también el **próximo prompt**: dentro de un workspace, un prompt **sin comando** **continúa/reabre la sesión más reciente** (la *última iniciada*) en vez de arrancar trabajo suelto — el objetivo persiste **entre turnos**, no solo dentro del run. Un **comando de flujo** señala "nueva línea de trabajo" (sesión nueva) — **salvo re-correr el mismo flujo sobre la misma entrada** (mismo spec), que hace `create_or_resume`: reanuda/reabre la refine session existente en vez de duplicarla (ver *Compact / resume*, caso 3); la convergencia cierra la sesión y un prompt relacionado posterior la **reabre** (resume quita `.closed`). Es la fila 2 de la matriz de contexto operativo (ver [`../../SKILL.md`](../../SKILL.md) § *Contexto operativo*) — doctrina agnóstica que la IA evalúa en cada turno, no un Stop hook del host.
|
|
57
|
-
|
|
58
|
-
## Verification-first (chasis — heredado por todos los loops)
|
|
59
|
-
|
|
60
|
-
El objetivo persistente necesita una **condición de término checkable** — si no, el loop no sabe cuándo cumplió (o persigue un blanco que inventó). Esa condición se **siembra ANTES de ejecutar**, no se improvisa al final: es **TDD generalizado**. Junto con artifact-first (sección siguiente) son los **dos sembrados** de cada gap/fase: *cómo sabré que funcionó* + *qué voy a hacer*.
|
|
61
|
-
|
|
62
|
-
**Dónde vive:** en `SESSION.Success criteria` (ver [`../../artifacts/artifacts-core/SESSION.md`](../../artifacts/artifacts-core/SESSION.md)) — checklist `[ ]` de criterios **falsables** (que *pueden* fallar). `CHECKPOINT.Pending/Completed` trackea el avance **red→green**. Dos formas según el deliverable:
|
|
63
|
-
|
|
64
|
-
| Deliverable | Criterio = | Ciclo |
|
|
65
|
-
|---|---|---|
|
|
66
|
-
| código / script / fix / feature | **tests ejecutables** (unit, build, lint, repro del bug) | TDD literal: red → green → refactor |
|
|
67
|
-
| migración BD (no ejecutable; invariante 4) | **rúbrica**: `SCRIPTS.sql` válido + revisado (no se ejecuta) | rúbrica |
|
|
68
|
-
| spec / plan | **rúbrica** = los acceptance criteria del documento (referenciados, no duplicados) | rúbrica |
|
|
69
|
-
| análisis / diseño | **rúbrica falsable por inspección** (ej. "todos los afectados con `file:line`"; "cada decisión: rationale + ≥1 alternativa") | rúbrica |
|
|
70
|
-
|
|
71
|
-
**Forma y peso escalan** (preserva la *ceremonia mínima* de quick): un chore es "tests/build existentes siguen verdes" (una línea); un feature, acceptance tests reales. No es "siempre escribir tests nuevos" — es "**siempre declarar el check antes**". Para deliverables **subjetivos** (análisis/diseño) la IA **propone** la rúbrica y el **humano la ratifica** (structured-choice) antes de perseguirla. **Criterio irresoluble** (sin evidencia, BD no disponible) → cierra `inconcluso` + el loop **degrada** (humano, o difiere a `Open questions`/`BACKLOG`); nunca itera en falso.
|
|
72
|
-
|
|
73
|
-
> El **convergence gate** (sección *Convergence / exit*) es, operacionalmente, **"todos los `Success criteria` en verde"**. Los gates por-heir (analyze gate, coherencia del plan, validación final, validación puntual proporcional) son **instancias** de esto, con los criterios sembrados al inicio.
|
|
74
|
-
|
|
75
|
-
**Integridad del gate (anti-gaming + verificación independiente).** El gate solo vale si no se hace trampa para pasarlo. El loop **no**:
|
|
76
|
-
|
|
77
|
-
- modifica el check ni afloja un `Success criterion` para forzar verde;
|
|
78
|
-
- debilita, borra ni saltea tests/validaciones;
|
|
79
|
-
- usa asserts triviales o tautológicos que siempre pasan (el valor esperado sale de una fuente independiente, no del propio output);
|
|
80
|
-
- parchea el test en lugar de arreglar la causa (preferir arreglar producción).
|
|
81
|
-
|
|
82
|
-
Ante un blocker real **para y lo reporta** (→ `Open questions`/`BACKLOG`) en vez de gamear la métrica. El veredicto cuenta **solo el output del check, no la auto-declaración** del implementador: cuando el deliverable lo justifica, la verificación final la hace una pasada **independiente** (subagente o re-lectura limpia) que no asume correcta la implementación — *only command output counts*.
|
|
83
|
-
|
|
84
|
-
## Artifacts as a live log — ciclo artifact-first (chasis — heredado por todos los loops)
|
|
85
|
-
|
|
86
|
-
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**:
|
|
87
|
-
|
|
88
|
-
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).
|
|
89
|
-
2. **EJECUTAR.** Resolver el gap / correr la fase / editar el código.
|
|
90
|
-
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).
|
|
40
|
+
> **Invariante de boundary:** este loop escribe **solo** en `docs/specs`. Nunca gradúa/exporta otros artefactos a `docs/` — eso es trabajo de `export-*`, aparte (chasis § *docs/ boundary*).
|
|
91
41
|
|
|
92
|
-
|
|
42
|
+
## Internal sessions — instancia SPEC
|
|
93
43
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
El loop crea y maneja su session en `.workflow/sessions/`. El usuario nunca la crea.
|
|
44
|
+
Doctrina completa en el chasis (§ *Internal sessions* + *Numeración*). La instancia de este loop:
|
|
97
45
|
|
|
98
46
|
| Session | When | Artifacts | Role |
|
|
99
47
|
|---|---|---|---|
|
|
100
|
-
| **refine session** `NNN-<slug>-spec-refine/` | al arrancar el loop (o se reanuda) | `SESSION.md` · `CHECKPOINT.md` (· `BACKLOG.md` solo si difiere) | Dueña del run.
|
|
101
|
-
|
|
102
|
-
> **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*.
|
|
103
|
-
|
|
104
|
-
> El spec **nunca** entra en una session; vive en `docs/specs/`.
|
|
48
|
+
| **refine session** `NNN-<slug>-spec-refine/` | al arrancar el loop (o se reanuda) | `SESSION.md` · `CHECKPOINT.md` (· `BACKLOG.md` solo si difiere) | Dueña del run. Type = `refine`; descriptor `<slug>-spec-refine` (el `<slug>` sale del spec de entrada). |
|
|
105
49
|
|
|
106
50
|
> **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.
|
|
107
51
|
|
|
108
|
-
### Numeración de sessions (regla dura, heredada por todos los loops)
|
|
109
|
-
|
|
110
|
-
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, y cada folder queda **autodescriptivo** con la forma `NNN-<slug>-<flow>` (ej.: `002-correo-otp-spec-refine`, `003-correo-otp-plan-new`, `004-correo-otp-plan-exec`, `005-validacion-correo-quick`).
|
|
111
|
-
|
|
112
|
-
> `<run>` = el **descriptor** (sin número) de la session del run, siempre con forma **`<slug>-<flow>`**: `<slug>-spec-refine`, `<slug>-plan-new`, `<slug>-plan-exec`, `<slug>-quick`. El `<slug>` es **descriptivo** y sale del doc de entrada del flujo — `docs/specs/NNN-spec-<slug>.md` para spec-refine/plan-new; `docs/plans/PPP-plan-<slug>.md` para plan-exec; el prompt para quick — para que el folder diga de un vistazo de qué trata, no solo qué flujo lo creó. Como la investigación es **inline** en esta misma session, ya no hay sessions hijas `*-research-*` que numerar (compat: las viejas son históricas).
|
|
113
|
-
>
|
|
114
|
-
> **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.
|
|
115
|
-
|
|
116
|
-
**CLI**:
|
|
117
|
-
- `aw session-create --type refine --name <slug>-spec-refine` → crea `NNN-<slug>-spec-refine` / `aw session-resume --code <…>` (detecta `CHECKPOINT`).
|
|
118
|
-
- `aw checkpoint-write` / `aw checkpoint-read` para el resume.
|
|
119
|
-
- `aw session-close` al cerrar (con razón); `aw session-artifacts` para inspeccionar.
|
|
120
|
-
- **Reabrir para continuar** (contexto operativo, fila 2): `aw session-resume --code <NNN> --reopen` reactiva una sesión **cerrada** (quita `.closed` → activa) para seguir trabajando en ella; sin `--reopen`, el resume es read-only. Para detectar cuál es la más reciente cerrada: `aw resume-summary --include-recent-closed` (o `aw sessions --state all`).
|
|
121
|
-
|
|
122
52
|
## Composes
|
|
123
53
|
|
|
124
54
|
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.
|
|
125
55
|
|
|
126
56
|
> **Dos niveles de la misma capacidad:** aquí (SPEC) produce la sección `## UI spec` del spec — el *qué* de la UI, grano grueso. En PLAN, `plan-new-loop`/`plan-refine-loop` componen la **misma** capacidad para producir **design SPECs por pantalla** (`NNN-SPEC-<SLUG>.md`, artefactos de su sesión — ver [`SPEC.md`](../../artifacts/artifacts-design/SPEC.md)), derivados de esta sección si existe.
|
|
127
57
|
|
|
128
|
-
Otras capacidades transversales que el
|
|
58
|
+
Otras capacidades transversales que el motor usa siempre: `research` (research **inline** — chasis § *Research*), `sql` (regla BD en research — chasis). Todas se resuelven por config; `off` → el loop sigue sin la capacidad y, si era necesaria, lo dice o pregunta. La **prosa del spec** sigue las convenciones de redacción **ambientes** (el host auto-aplica una skill de writing instalada si está presente), no un rol compuesto.
|
|
129
59
|
|
|
130
60
|
> **Convenciones ambientes (no roles):** estándares de código/testing/redacción y `creating-tools` son skills standalone que el host auto-descubre por su `description` — el workflow no las bindea ni depende de ellas. Doctrina completa: [../../roles/README.md](../../roles/README.md).
|
|
131
61
|
|
|
@@ -177,41 +107,6 @@ Cada duda preguntada al humano + la respuesta elegida.
|
|
|
177
107
|
| Contradicción interna | secciones que se contradicen | **humano** |
|
|
178
108
|
| UI sin especificar *(si aplica)* | el requerimiento involucra UI pero falta `## UI spec` | **capacidad `ui-design`** |
|
|
179
109
|
|
|
180
|
-
## Ask-vs-research rule (el discriminador)
|
|
181
|
-
|
|
182
|
-
Para cada gap, una sola pregunta decide el resolutor:
|
|
183
|
-
|
|
184
|
-
> *"¿Puedo responder esto leyendo el repo/datos?"* → **research** (autónomo).
|
|
185
|
-
> *"¿Depende de lo que el usuario quiere?"* → **preguntar al humano** (structured-choice).
|
|
186
|
-
|
|
187
|
-
## Research: autonomy, scope & failure
|
|
188
|
-
|
|
189
|
-
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**.
|
|
190
|
-
|
|
191
|
-
- **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`.
|
|
192
|
-
- **Alcance**: workspace + repos asociados (fuentes) + MCPs de BD.
|
|
193
|
-
- **Regla BD** (única excepción a la autonomía):
|
|
194
|
-
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.
|
|
195
|
-
2. Escribe **primero** las queries en `SCRIPTS.sql` de la session.
|
|
196
|
-
3. Las ejecuta **read-only** vía MCP (respeta `sql-mutation-guard`: nunca DML/DDL).
|
|
197
|
-
- **Research inconclusa** (BD no disponible, evidencia insuficiente, gap factual irresoluble):
|
|
198
|
-
- La investigación concluye con estado **`inconcluso`** en `CONCLUSIONS` y reporta el motivo.
|
|
199
|
-
- 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.
|
|
200
|
-
- 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.
|
|
201
|
-
|
|
202
|
-
## Structured-choice (design & batching)
|
|
203
|
-
|
|
204
|
-
*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**.
|
|
205
|
-
|
|
206
|
-
- Como el control `flow` va **siempre** → **≤3 preguntas de contenido + 1 control `flow`**.
|
|
207
|
-
- **control `flow`** (ciclo de vida, siempre presente): `Compactar` | `Cerrar`. Responder solo las preguntas de contenido (sin tocar `flow`) = seguir iterando.
|
|
208
|
-
- **Preguntas de contenido** posibles:
|
|
209
|
-
- dudas-de-humano (gaps no factuales);
|
|
210
|
-
- elección de MCP (regla BD) — antes de ejecutar queries;
|
|
211
|
-
- en **convergencia**, acción: `Guardar especificación refinada` | `Preguntar algo más`.
|
|
212
|
-
- **Batching**: agrupar hasta 3 gaps de humano en una sola llamada. Si hay más de 3 pendientes, priorizar (los que desbloquean otros gaps primero) y diferir el resto a la próxima vuelta.
|
|
213
|
-
- **Respuesta recomendada por pregunta**: cada pregunta de contenido lleva **siempre** la respuesta que la IA recomienda — como primera opción (marcada *recomendada*) en `AskUserQuestion`, o señalada en el markdown numerado al degradar. Nunca se pregunta "a secas": el humano ratifica o corrige una propuesta, no parte de cero. La IA recomienda en base a lo investigado (regla ask-vs-research), no por defecto vacío.
|
|
214
|
-
|
|
215
110
|
## Sequence
|
|
216
111
|
|
|
217
112
|
```
|
|
@@ -237,7 +132,7 @@ spec-refine-loop(spec):
|
|
|
237
132
|
si no: attempts[gap]++ ; si attempts[gap] >= MAX → pending_human.push(gap)
|
|
238
133
|
si no:
|
|
239
134
|
pending_human.push(gap)
|
|
240
|
-
update CHECKPOINT (refine_session) # DESPUÉS: Pending→Completed, en cada límite de gap (
|
|
135
|
+
update CHECKPOINT (refine_session) # DESPUÉS: Pending→Completed, en cada límite de gap (chasis § ciclo artifact-first)
|
|
241
136
|
si pending_human no vacío:
|
|
242
137
|
ans = structured_choice(contenido: pending_human (≤3), flow: [Compactar, Cerrar])
|
|
243
138
|
switch(flow):
|
|
@@ -258,46 +153,18 @@ finalize:
|
|
|
258
153
|
cerrar refine_session ; reportar
|
|
259
154
|
```
|
|
260
155
|
|
|
261
|
-
|
|
262
|
-
flowchart TD
|
|
263
|
-
S["input = glob NNN-spec*.md (el spec mismo)<br/>create_or_resume refine session"] --> D{"¿gaps<br/>(no agotados)?"}
|
|
264
|
-
D -->|no| AN{"analyze gate<br/>criterios↔Requirement · sin contradicciones<br/>Scope · Open questions cerradas/diferidas"}
|
|
265
|
-
AN -->|falla| D
|
|
266
|
-
AN -->|ok| C["structured-choice<br/>contenido[Guardar refinada · Preguntar más]<br/>flow[Compactar · Cerrar]"]
|
|
267
|
-
D -->|sí| B["tomar ≤3 gaps"]
|
|
268
|
-
B --> K{"tipo de gap"}
|
|
269
|
-
K -->|UI| UI["componer ui-design<br/>→ ## UI spec (design-system/tema vía structured-choice)"]
|
|
270
|
-
K -->|factual y attempts<MAX| RS["research INLINE en la session<br/>ANALYSIS-FILE → CONCLUSIONS (+SCRIPTS.sql)"]
|
|
271
|
-
K -->|humano| Q["structured-choice<br/>contenido[dudas + elección MCP ≤3]<br/>flow[Compactar · Cerrar]"]
|
|
272
|
-
RS --> CC{"¿concluyente?"}
|
|
273
|
-
CC -->|sí| I1["integrar → Refinement decisions"]
|
|
274
|
-
CC -->|no| DEG["attempts++ ; degradar a humano / Open questions"]
|
|
275
|
-
Q --> I2["integrar → Q&A traceability"]
|
|
276
|
-
UI --> CK["update CHECKPOINT (Pending→Completed)"]
|
|
277
|
-
I1 --> CK
|
|
278
|
-
DEG --> CK
|
|
279
|
-
I2 --> CK
|
|
280
|
-
CK --> D
|
|
281
|
-
C -->|Guardar| W["edit IN PLACE con confirmación<br/>completa + inserta UI spec/Refinement decisions/Q&A"]
|
|
282
|
-
C -->|Preguntar más| D
|
|
283
|
-
W --> FIN["finalize: CHECKPOINT (+ BACKLOG si difiere)<br/>+ cerrar session + reportar"]
|
|
284
|
-
```
|
|
285
|
-
|
|
286
|
-
## Compact / resume
|
|
287
|
-
|
|
288
|
-
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:
|
|
156
|
+
## Compact / resume — claves SPEC
|
|
289
157
|
|
|
290
|
-
|
|
291
|
-
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`).
|
|
292
|
-
3. **Ya refinado / re-refine on demand** (no hay CHECKPOINT abierto pero el spec **ya tiene** `Refinement decisions`/`Q&A traceability`) → **operación de primera clase**: mientras el flujo siga en SPEC, re-correr `/w:spec-refine` sobre el mismo spec **cuantas veces haga falta** (nuevos requerimientos, cambios de scope, tras re-leerlo) está soportado. `create_or_resume` detecta la refine session existente —típicamente **cerrada** tras converger— por descriptor + `## Origin` y la **reabre** (ver *Internal sessions*: detección con `aw sessions --state all` / `aw resume-summary --include-recent-closed`, reapertura con `aw session-resume --code <NNN> --reopen`); re-refinamiento incremental leyendo el **spec mismo**; al `Guardar`, edita in place con confirmación.
|
|
158
|
+
Mecanismo completo (3 casos, `Compactar`, re-run on demand con `--reopen`) en el chasis (§ *Compact / resume*). Claves SPEC:
|
|
293
159
|
|
|
294
|
-
|
|
160
|
+
- La **marca de trabajo previo** es la presencia de `## Refinement decisions` + `## Q&A traceability` en el spec (la *marca de refinado*, ver *Deliverable schema*).
|
|
161
|
+
- El re-refine on demand es **operación de primera clase** mientras el flujo siga en SPEC (nuevos requerimientos, cambios de scope, tras re-leer el spec): lee siempre el **spec mismo**, re-refinamiento incremental; al `Guardar`, edita in place con confirmación.
|
|
295
162
|
|
|
296
163
|
## Convergence / exit
|
|
297
164
|
|
|
298
|
-
- **Sin gaps materiales** → **analyze gate** (read-only) = **`Success criteria` en verde** (*verification-first
|
|
165
|
+
- **Sin gaps materiales** → **analyze gate** (read-only) = **`Success criteria` en verde** (*verification-first*; la instancia SPEC del convergence gate del chasis): 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`.
|
|
299
166
|
- `Guardar` → `edit_in_place_with_confirm(spec)` y `finalize`.
|
|
300
|
-
- `Cerrar`
|
|
167
|
+
- `Cerrar` → `finalize` del chasis (persiste siempre `CHECKPOINT`; `BACKLOG` **solo si** hay diferidos — acá: motivo de cierre + `Open questions` diferidas).
|
|
301
168
|
|
|
302
169
|
## Integration (dónde aterriza cada resolución)
|
|
303
170
|
|
|
@@ -305,10 +172,3 @@ El resume **keya off el `CHECKPOINT`** de la refine session, no de la existencia
|
|
|
305
172
|
- Resuelto vía **humano** → `## Q&A traceability` del spec.
|
|
306
173
|
- Resuelto vía **capacidad `ui-design`** (gap UI) → sección `## UI spec` del spec.
|
|
307
174
|
- **Research inconclusa o sin resolver** → `## Open questions` del spec (diferido) + `BACKLOG.md` de la refine session (solo si queda algo diferido).
|
|
308
|
-
|
|
309
|
-
## Heredan este chasis
|
|
310
|
-
|
|
311
|
-
- `plan-new-loop` — mismo motor; deltas: plan rico + gap taxonomy de plan.
|
|
312
|
-
- `plan-refine-loop` — mismo motor; deltas: refina el **plan** in place (auxiliar, no obligatorio), reusando la gap taxonomy + coherence gate de `plan-new-loop`. Es a `plan-new` lo que este chasis (`spec-refine`) es a `spec-new`.
|
|
313
|
-
- `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.
|
|
314
|
-
- `quick-loop` — mismo motor (mínimo); hereda además git/BD/no-export de `plan-exec-loop`.
|