@tacuchi/agent-workflow-cli 12.5.0 → 12.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/dist/adapters/git-cli.d.ts +1 -0
  2. package/dist/adapters/git-cli.d.ts.map +1 -1
  3. package/dist/adapters/git-cli.js +21 -0
  4. package/dist/adapters/git-cli.js.map +1 -1
  5. package/dist/application/merge-state-service.d.ts +37 -0
  6. package/dist/application/merge-state-service.d.ts.map +1 -0
  7. package/dist/application/merge-state-service.js +89 -0
  8. package/dist/application/merge-state-service.js.map +1 -0
  9. package/dist/cli/commands/merge-state.d.ts +3 -0
  10. package/dist/cli/commands/merge-state.d.ts.map +1 -0
  11. package/dist/cli/commands/merge-state.js +28 -0
  12. package/dist/cli/commands/merge-state.js.map +1 -0
  13. package/dist/cli/help-groups.d.ts.map +1 -1
  14. package/dist/cli/help-groups.js +1 -0
  15. package/dist/cli/help-groups.js.map +1 -1
  16. package/dist/cli/main.js +2 -0
  17. package/dist/cli/main.js.map +1 -1
  18. package/dist/cli/tui/components/detail-panel.d.ts +14 -1
  19. package/dist/cli/tui/components/detail-panel.d.ts.map +1 -1
  20. package/dist/cli/tui/components/detail-panel.js +13 -2
  21. package/dist/cli/tui/components/detail-panel.js.map +1 -1
  22. package/dist/cli/tui/row-width.d.ts +19 -0
  23. package/dist/cli/tui/row-width.d.ts.map +1 -0
  24. package/dist/cli/tui/row-width.js +25 -0
  25. package/dist/cli/tui/row-width.js.map +1 -0
  26. package/dist/cli/tui/tabs/mcp-tab.d.ts.map +1 -1
  27. package/dist/cli/tui/tabs/mcp-tab.js +6 -21
  28. package/dist/cli/tui/tabs/mcp-tab.js.map +1 -1
  29. package/dist/cli/tui/tabs/project-tab.d.ts.map +1 -1
  30. package/dist/cli/tui/tabs/project-tab.js +11 -12
  31. package/dist/cli/tui/tabs/project-tab.js.map +1 -1
  32. package/dist/cli/tui/tabs/skills-tab.d.ts.map +1 -1
  33. package/dist/cli/tui/tabs/skills-tab.js +10 -16
  34. package/dist/cli/tui/tabs/skills-tab.js.map +1 -1
  35. package/dist/cli/tui/theme.d.ts +2 -2
  36. package/dist/cli/tui/theme.d.ts.map +1 -1
  37. package/dist/cli/tui/theme.js +6 -2
  38. package/dist/cli/tui/theme.js.map +1 -1
  39. package/dist/ports/git.d.ts +5 -0
  40. package/dist/ports/git.d.ts.map +1 -1
  41. package/package.json +1 -1
  42. package/skills/w/README.md +5 -2
  43. package/skills/w/SKILL.md +21 -6
  44. package/skills/w/artifacts/README.md +2 -2
  45. package/skills/w/artifacts/artifacts-core/TASKS.md +1 -1
  46. package/skills/w/artifacts/{artifacts-dev → artifacts-exec}/TECHNICAL-NOTE.md +1 -1
  47. package/skills/w/commands/README.md +9 -6
  48. package/skills/w/commands/fix-git.md +33 -0
  49. package/skills/w/commands/plan-new.md +1 -1
  50. package/skills/w/commands/quick.md +1 -1
  51. package/skills/w/commands/spec-new.md +11 -8
  52. package/skills/w/exports/README.md +2 -2
  53. package/skills/w/exports/export-diagrams/SKILL.md +1 -1
  54. package/skills/w/exports/export-manuals/SKILL.md +2 -2
  55. package/skills/w/exports/export-reports/SKILL.md +1 -1
  56. package/skills/w/exports/export-scripts/SKILL.md +1 -1
  57. package/skills/w/harness/SKILL.md +85 -0
  58. package/skills/w/loops/README.md +14 -14
  59. package/skills/w/loops/plan-exec-loop/SKILL.md +13 -11
  60. package/skills/w/loops/plan-new-loop/SKILL.md +24 -22
  61. package/skills/w/loops/quick-loop/SKILL.md +10 -8
  62. package/skills/w/loops/spec-refine-loop/SKILL.md +48 -30
  63. package/skills/w/roles/README.md +1 -1
  64. package/skills/w/roles/git/SKILL.md +28 -7
  65. package/skills/w/roles/research/SKILL.md +1 -1
  66. package/skills/w/roles/testing/SKILL.md +2 -2
  67. package/skills/w/roles/ui-spec/SKILL.md +58 -48
  68. /package/skills/w/artifacts/{artifacts-dev → artifacts-exec}/DECISION.md +0 -0
@@ -3,7 +3,7 @@
3
3
  > This is the **bundle README** for the `/w:` slash-command namespace. Every command listed here is something the **user** invokes directly.
4
4
  > Related layers: [`../loops/`](../loops/) (Layer 2, AI-driven) · artifacts live in `.workflow/sessions/` (Layer 3) · permanent deliverables in `docs/`.
5
5
  >
6
- > **Namespace:** all commands are under `w:` (`w` = *workflow*): `/w:spec-new`, `/w:spec-refine`, `/w:plan-new`, `/w:plan-exec`, `/w:quick`, `/w:workspace-init`, `/w:status` (transversal), `/w:export-*`.
6
+ > **Namespace:** all commands are under `w:` (`w` = *workflow*): `/w:spec-new`, `/w:spec-refine`, `/w:plan-new`, `/w:plan-exec`, `/w:quick`, `/w:workspace-init`, `/w:status` (transversal), `/w:fix-git` (transversal), `/w:export-*`.
7
7
 
8
8
  ---
9
9
 
@@ -20,7 +20,7 @@
20
20
 
21
21
  ┌─ LAYER 2 · LOOPS (../loops/) — AI runs these end-to-end ───────────────┐
22
22
  │ spec-refine-loop · plan-new-loop · plan-exec-loop · quick-loop │
23
- │ Gap-driven · AskUserQuestion with ≤3 content tabs + 1 `flow` tab
23
+ │ Gap-driven · structured-choice: ≤3 content questions + 1 `flow` │
24
24
  │ (Compactar / Cerrar always present) · compact/resume support. │
25
25
  └───────────────────────────┬────────────────────────────────────────────┘
26
26
  │ creates / reads / writes
@@ -45,12 +45,14 @@
45
45
  | Flow | docs/ target | Entry command | Advance command | Loops involved |
46
46
  |---|---|---|---|---|
47
47
  | **SPEC** | `docs/specs/` | `spec-new` *(single-pass)* | `spec-refine` | `spec-refine-loop` |
48
- | **PLANIFICATION** | `docs/plans/` + `docs/tools/` | `plan-new` | `plan-exec` | `plan-new-loop`, `plan-exec-loop` |
48
+ | **PLAN** | `docs/plans/` + `docs/tools/` | `plan-new` | `plan-exec` | `plan-new-loop`, `plan-exec-loop` |
49
49
  | **QUICK** | — *(no doc)* | `quick` | — | `quick-loop` |
50
50
 
51
- > **Intentional asymmetry:** in SPEC, `spec-new` generates the draft in a **single pass** (no loop) and the loop is in `spec-refine`. In PLANIFICATION, **both** commands start loops. Total: **5 flow commands / 4 loops**.
51
+ > **Intentional asymmetry:** in SPEC, `spec-new` generates the draft in a **single pass** (no loop) and the loop is in `spec-refine`. In PLAN, **both** commands start loops. Total: **5 flow commands / 4 loops**.
52
52
 
53
53
  > **Transversal (no flow):** [`/w:status`](status.md) is a read-only dashboard of the whole workspace — what's done / pending / discarded, with friendly Spanish dates. It leans on `aw status`, writes nothing, and belongs to no flow.
54
+ >
55
+ > **Transversal (no flow):** [`/w:fix-git`](fix-git.md) resolves an **in-progress merge conflict** for any repo — identify origin↔destination, analyze both sides' intent, resolve (structured-choice on ambiguity), propose the merge commit (git-safe). Leans on `aw merge-state`; writes no `docs/`; works without a workspace. Neither transversal is counted in **5 flow / 4 loops**.
54
56
 
55
57
  ## Pipeline
56
58
 
@@ -78,7 +80,7 @@ flowchart LR
78
80
  q -->|starts| ql(["quick-loop"])
79
81
  ```
80
82
 
81
- **Pipeline reading:** SPEC defines *what* (refined spec) → PLANIFICATION defines *how* (plan) and *executes it* → QUICK is a lightweight shortcut for scoped work that does not warrant spec or plan.
83
+ **Pipeline reading:** SPEC defines *what* (refined spec) → PLAN defines *how* (plan) and *executes it* → QUICK is a lightweight shortcut for scoped work that does not warrant spec or plan.
82
84
 
83
85
  > **`docs/` boundary:** each flow only touches its own folders — **SPEC** → `docs/specs`; **PLAN** → `docs/plans` + `docs/tools`. The rest of `docs/` (`scripts`, `manuals`, `diagrams`, `reports`) is written **only** by `export-*` skills (a separate, never-automatic step). See [`../loops/`](../loops/) and workflow-exports reference.
84
86
 
@@ -100,7 +102,7 @@ Each `<command>.md` in this bundle uses this frontmatter + body structure:
100
102
  3. **Spec and plan are documents** (`docs/`), not artifacts.
101
103
  4. **DB scripts-only**: AI **never executes DML/DDL**; migrations live in `SCRIPTS.sql` (type B) and are delivered via `export-scripts`. Only read-only queries via MCP.
102
104
  5. **Git-safe**: verify branch before editing; **propose** commits by source; never `push`/`--amend`/`--no-verify`.
103
- 6. **All loops**: gap-driven convergent · one session per run (research inline) · `AskUserQuestion` with 3 content tabs + 1 `flow` tab (`Compactar`/`Cerrar`) always · compact/resume · artifacts as a live log (`CHECKPOINT` always; `BACKLOG` only when deferring).
105
+ 6. **All loops**: gap-driven convergent · one session per run (research inline) · *structured-choice* (capacidad del arnés — ver [`../harness/SKILL.md`](../harness/SKILL.md); en **Claude Code** es `AskUserQuestion`) con **≤3 preguntas de contenido + 1 control `flow`** (`Compactar`/`Cerrar`) siempre · compact/resume · artifacts as a live log (`CHECKPOINT` always; `BACKLOG` only when deferring).
104
106
 
105
107
  ## Index
106
108
 
@@ -113,6 +115,7 @@ Each `<command>.md` in this bundle uses this frontmatter + body structure:
113
115
  | `plan-exec` | [`plan-exec.md`](plan-exec.md) | starts `plan-exec-loop` |
114
116
  | `quick` | [`quick.md`](quick.md) | starts `quick-loop` |
115
117
  | `status` | [`status.md`](status.md) | single-pass, read-only (transversal) |
118
+ | `fix-git` | [`fix-git.md`](fix-git.md) | single-pass, read/edit working tree (transversal) |
116
119
  | `export-scripts` | [`export-scripts.md`](export-scripts.md) | single-pass, read-only |
117
120
  | `export-manuals` | [`export-manuals.md`](export-manuals.md) | single-pass, read-only |
118
121
  | `export-diagrams` | [`export-diagrams.md`](export-diagrams.md) | single-pass, read-only |
@@ -0,0 +1,33 @@
1
+ ---
2
+ description: Resuelve conflictos de un merge en curso para una fuente dada o detectada. Identifica origen (theirs) y destino (ours), analiza la intención de ambos lados y resuelve; pregunta (structured-choice) ante ambigüedad o incoherencia. Git-safe — propone el commit de merge, nunca push/--amend/--no-verify. Transversal (no es flow), sin loop ni session, no toca docs/. Funciona en cualquier repo git, sin workspace inicializado.
3
+ argument-hint: "[<source path | alias>]"
4
+ allowed-tools:
5
+ [
6
+ "Bash",
7
+ "Read",
8
+ "Edit",
9
+ ]
10
+ ---
11
+
12
+ # fix-git — resolvedor de conflictos de merge (transversal)
13
+
14
+ Single-pass, **sin loop ni session**, **no escribe en `docs/`**. Comando **transversal** (no pertenece a SPEC / PLAN / QUICK). **Agnóstico al workspace**: opera sobre cualquier repo git — el `<source>` dado (path o alias), o el cwd — sin requerir `.workflow/`.
15
+
16
+ ## Ejecutar
17
+
18
+ 1. **Detectar + identificar** — corré `aw merge-state [<source>]` (read-only; `--source <alias>` o `--all` si hay workspace; un path directo si no). Del JSON, por repo: `is_merging`, `current_branch` (**destino / ours**), `merge_origin` (**origen / theirs**), `conflicted_files`.
19
+ - Si **no hay merge en curso** (`is_merging:false`) y el usuario indicó un **target** (p.ej. "merge `<branch>`"): es pedido explícito → `git -C <path> merge <branch>` y seguí. Sin target → informá que no hay merge que resolver y terminá.
20
+ 2. **Resolver** — **leé y seguí** la sección ***Resolución de conflictos de merge*** del rol `git` (`../roles/git/SKILL.md`): analizá la intención de cada conflicto (3 versiones `git show :1:/:2:/:3:<file>`, `git log --merge`), resolvé (ours / theirs / combinar / reescribir) y `git add` lo resuelto. Ante **ambigüedad o incoherencia**, preguntá vía *structured-choice* (no inventes la resolución).
21
+ 3. **Cerrar** — **proponé** el commit de merge (propose-then-execute, formato canónico, git-safe). Escape: `git merge --abort` tras confirmación del usuario.
22
+
23
+ > No intentes `Skill: git` — el rol se **lee y se sigue** (es la capacidad que este comando compone). El comando **es** la entrada; la doctrina de conflictos vive en el rol `git`.
24
+
25
+ ## Plan mode
26
+
27
+ Corré `aw merge-state` (read-only), reportá **origen ↔ destino** y los conflictos por archivo, y describí la **estrategia de resolución** que aplicarías — **sin** editar archivos ni commitear.
28
+
29
+ ## Resources
30
+
31
+ - Capability: `../roles/git/SKILL.md` (sección *Resolución de conflictos de merge*)
32
+ - CLI: `aw merge-state` (inspector read-only del estado de merge)
33
+ - Design reference: `docs/referencias/workflow-commands/fix-git.md`
@@ -12,7 +12,7 @@ allowed-tools:
12
12
 
13
13
  # plan-new — trampolín al loop de planificación
14
14
 
15
- Puente SPEC → PLANIFICATION. Convierte el "qué" (spec refinado) en el "cómo" (plan). Delega a `plan-new-loop` (Layer 2).
15
+ Puente SPEC → PLAN. Convierte el "qué" (spec refinado) en el "cómo" (plan). Delega a `plan-new-loop` (Layer 2).
16
16
 
17
17
  ## Resolución de input
18
18
 
@@ -12,7 +12,7 @@ allowed-tools:
12
12
 
13
13
  # quick — trampolín al loop liviano
14
14
 
15
- Para tareas acotadas y directas que no justifican pasar por SPEC ni PLANIFICATION. Siempre crea una sesión ligera (trazabilidad + resume). Delega a `quick-loop` (Layer 2).
15
+ Para tareas acotadas y directas que no justifican pasar por SPEC ni PLAN. Siempre crea una sesión ligera (trazabilidad + resume). Delega a `quick-loop` (Layer 2).
16
16
 
17
17
  ## Ejecutar el loop
18
18
 
@@ -17,9 +17,9 @@ Genera `docs/specs/NNN-spec-<slug>.md` en una sola pasada a partir del prompt en
17
17
  >
18
18
  > Este comando **solo parafrasea** el input del usuario en el esquema de borrador. Es **una única pasada secuencial**: leer `$ARGUMENTS` → llenar las secciones → escribir el archivo. Nada más. Debe tardar **segundos, no minutos**.
19
19
  >
20
- > **PROHIBIDO**, sin excepción: lanzar workflows, subagentes (`Task`/`Agent`), sesiones de research, búsquedas web, o investigación profunda de código. No uses las tools `Workflow`, `Task` ni `Agent` aquí.
20
+ > **PROHIBIDO**, sin excepción: lanzar sub-agentes/workflows (`Task`/`Agent`/`Workflow`), sesiones de research, búsquedas web, o investigación profunda de código **incluso si el arnés está en un modo de máximo esfuerzo/profundidad** (ej. ultracode/max-effort en Claude Code).
21
21
  >
22
- > Esto **anula** cualquier modo o instrucción de sesión que diga "corre un workflow para toda tarea sustancial" (ultracode, max-effort, etc.). Esos modos **no aplican** a `spec-new`: el comando los pisa. Si una sección queda incierta, **no la investigues** — declarala en `## Open questions` o `## Assumptions` y seguí.
22
+ > Esto **anula** cualquier modo o instrucción de sesión que diga "corre un workflow para toda tarea sustancial". Esos modos **no aplican** a `spec-new`: el comando los pisa. Si una sección queda incierta, **no la investigues** — declarala en `## Open questions` o `## Assumptions` y seguí.
23
23
  >
24
24
  > La investigación a profundidad (cerrar gaps, mapear código, consultar BD, research autónomo) es trabajo de **`spec-refine`**, no de aquí.
25
25
 
@@ -47,21 +47,24 @@ Sistemas / componentes / fuentes involucradas. Restricciones conocidas.
47
47
  - Out: qué NO entra
48
48
 
49
49
  ## Acceptance criteria
50
- - [ ] criterio verificable 1
50
+ - [ ] criterio verificable 1 (estilo EARS / Given-When-Then recomendado)
51
51
  - [ ] criterio verificable 2
52
52
 
53
- ## Open questions
54
- Dudas pendientes. ← el spec-refine-loop las va cerrando.
55
-
56
53
  ## Assumptions (opt.)
57
54
  Supuestos asumidos.
55
+
56
+ ## Open questions
57
+ Dudas pendientes. ← el spec-refine-loop las va cerrando.
58
58
  ```
59
59
 
60
+ > **`Open questions` va último** — el spec refinado **inserta antes de `Open questions`** `## UI spec` (si hay UI) + `## Refinement decisions` + `## Q&A traceability` (esquema refinado en el [`spec-refine-loop`](../loops/spec-refine-loop/SKILL.md)). Mismo esqueleto: el borrador y el refinado comparten orden.
61
+
60
62
  **Notas de llenado:**
61
63
  - Sin campo `Type` — `plan-new` infiere el cómo.
62
64
  - `Scope` siempre lleva `Out` (qué queda fuera).
63
- - Los criterios de aceptación deben ser verificables (testeables).
64
- - Si hay UI involucrada, mencionarlo en `Requirement`/`Context`; el spec UI se autora en `spec-refine` (via capacidad `ui-design`).
65
+ - **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.
66
+ - Si hay **UI** involucrada, mencionarlo en `Requirement`/`Context`; el `## UI spec` se autora en `spec-refine` (vía capacidad `ui-design`). "UI sin especificar" es un gap de primera clase del refinamiento.
67
+ - Los **gaps** que detecta el loop = secciones débiles del esquema (Requirement vago, Scope sin `Out`, criterios no testables, Open questions abiertas, supuestos no declarados, contradicciones) **+ UI sin especificar** si el requerimiento involucra UI.
65
68
  - Alternativa equivalente: el usuario crea el borrador a mano. Ambos caminos producen el mismo `docs/specs/NNN-spec-<slug>.md`.
66
69
 
67
70
  ## Plan mode
@@ -29,14 +29,14 @@
29
29
  | [`export-diagrams`](export-diagrams/SKILL.md) | `diagrams` | source code of the sources + plan-doc (`AS-IS` / `TO-BE`, `Impacted`) | `docs/diagrams/` (C4 / mermaid) |
30
30
  | [`export-reports`](export-reports/SKILL.md) | `writing` | corpus of sessions (spec, `CONCLUSIONS`, `DECISION`) + plan-doc state + `docs/` | `docs/reports/` (executive / functional report) |
31
31
 
32
- > **Composition over ownership:** an export does **not** own its authoring logic — it **composes a capability role** from [`../../`workflow-skills](../../) (resolved through `.workflow/skills.toml`): `export-scripts` composes `sql`; `export-manuals` and `export-reports` compose `writing`; `export-diagrams` composes `diagrams`. Swapping the implementation is a one-line config change; it never touches the export.
32
+ > **Composition over ownership:** an export does **not** own its authoring logic — it **composes a capability role** from [`../roles/`](../roles/) (resolved through `.workflow/skills.toml`): `export-scripts` composes `sql`; `export-manuals` and `export-reports` compose `writing`; `export-diagrams` composes `diagrams`. Swapping the implementation is a one-line config change; it never touches the export.
33
33
 
34
34
  ## Common properties
35
35
 
36
36
  1. **Layer 1, explicit** — the **user** invokes them (`/w:export-<cat>`). **Never** automatic (no loop fires them).
37
37
  2. **Single-pass, read-only over sessions** — they read artifacts/sessions and `docs/`, **synthesize**, and write **only** their own `docs/<category>/` folder. They do **not** mutate sessions and do **not** open/close loops.
38
38
  3. **Cross-session** — they consolidate **N** sessions + the `docs/` corpus (dedup, roadmap, continuous numbering).
39
- 4. **No loop, no internal sessions** — options come from **args** (no lifecycle `AskUserQuestion`).
39
+ 4. **No loop, no internal sessions** — options come from **args** (no *structured-choice* de ciclo de vida — capacidad del arnés; ver [`../harness/SKILL.md`](../harness/SKILL.md)).
40
40
  5. **Git-safe** — they **never** commit, merge, push, `--amend`, or `--no-verify`. The output is a written document the user reviews and commits when ready.
41
41
  6. **DB scripts-only** — `export-scripts` ships migration SCRIPTS as a bundle; it **never executes** DDL/DML (a human/DBA applies them).
42
42
 
@@ -60,7 +60,7 @@ En plan mode **describe**, no escribe: el motor resuelto, los niveles/secciones
60
60
 
61
61
  **MCP read-only** (opcional, solo si se pide modelo de datos y está configurado): `\d <tabla>`, `SELECT count(*)`, relaciones FK para el `erDiagram`. Con cost guard.
62
62
 
63
- **Args** (sin lifecycle `AskUserQuestion`):
63
+ **Args** (sin *structured-choice* de ciclo de vida — capacidad del arnés; ver [`../../harness/SKILL.md`](../../harness/SKILL.md)):
64
64
 
65
65
  ```
66
66
  /w:export-diagrams [--sessions NNN[,NNN]] [--since sessionNNN] [--source <alias>]
@@ -60,7 +60,7 @@ En plan mode **describe**, no escribe: el modo resuelto, los temas detectados (c
60
60
  - `docs/manuals/INDEX.md` — re-generable (sobrescribible) en modo `complement`.
61
61
  - Código de las fuentes declaradas — lectura para describir el comportamiento.
62
62
 
63
- **Args** (sin lifecycle `AskUserQuestion`):
63
+ **Args** (sin *structured-choice* de ciclo de vida — capacidad del arnés; ver [`../../harness/SKILL.md`](../../harness/SKILL.md)):
64
64
 
65
65
  ```
66
66
  /w:export-manuals [--sessions NNN[,NNN]] [--since sessionNNN] [--source <alias>]
@@ -123,5 +123,5 @@ Si `--dry-run`: imprimir el reporte; no escribir. Si no: `complement` → `Write
123
123
 
124
124
  - Design: `docs/referencias/workflow-exports/export-manuals.md` · familia: [`../README.md`](../README.md).
125
125
  - Capacidad compuesta: `writing` (built-in default; ver `docs/referencias/workflow-skills/`).
126
- - Artefactos fuente: `DECISION` + plan-doc (ver `docs/referencias/workflow-artifacts/artifacts-dev/` y `docs/specs`/`docs/plans`).
126
+ - Artefactos fuente: `DECISION` + plan-doc (ver `docs/referencias/workflow-artifacts/artifacts-exec/` y `docs/specs`/`docs/plans`).
127
127
  - Siblings: [`../export-scripts/SKILL.md`](../export-scripts/SKILL.md) · [`../export-diagrams/SKILL.md`](../export-diagrams/SKILL.md) · [`../export-reports/SKILL.md`](../export-reports/SKILL.md).
@@ -57,7 +57,7 @@ En plan mode **describe**, no escribe: la audiencia/longitud resuelta, las sesio
57
57
 
58
58
  - `docs/specs`, `docs/plans`, `docs/reports/*` — contexto + no colisionar.
59
59
 
60
- **Args** (sin lifecycle `AskUserQuestion`):
60
+ **Args** (sin *structured-choice* de ciclo de vida — capacidad del arnés; ver [`../../harness/SKILL.md`](../../harness/SKILL.md)):
61
61
 
62
62
  ```
63
63
  /w:export-reports [--sessions NNN[,NNN]] [--since sessionNNN] [--source <alias>]
@@ -58,7 +58,7 @@ En plan mode **describe**, no escribe: el `NNN` resuelto, las fuentes detectadas
58
58
 
59
59
  - `docs/scripts/*.sql` standalone (solo top-level), **excluyendo** cualquier `docs/scripts/NNN-export-scripts-*/` (outputs previos de este export).
60
60
 
61
- **Args** (sin lifecycle `AskUserQuestion`):
61
+ **Args** (sin *structured-choice* de ciclo de vida — capacidad del arnés; ver [`../../harness/SKILL.md`](../../harness/SKILL.md)):
62
62
 
63
63
  ```
64
64
  /w:export-scripts [--sessions NNN[,NNN]] [--since sessionNNN] [--source <alias>]
@@ -0,0 +1,85 @@
1
+ ---
2
+ name: harness
3
+ description: >-
4
+ Harness-agnostic capability layer for agent-workflow. Read-and-follow doc (no es
5
+ invocable por nombre): define el contrato que mantiene a la herramienta agnóstica al
6
+ arnés (Claude Code, Codex, opencode, Gemini CLI, genérico) sin renunciar a las
7
+ capacidades ricas de cada uno. Cataloga las capacidades de las que depende el
8
+ workflow, las liga al mecanismo concreto de cada arnés (binding matrix), y fija los
9
+ dos principios (capacidad-no-tool · progressive-enhancement). Referenciado desde
10
+ SKILL.md (overview) y los loops cuando nombran structured-choice / compaction.
11
+ ---
12
+
13
+ # harness — capa de capacidades agnóstica al arnés (cross-cutting)
14
+
15
+ Doc de **lectura y seguimiento** (no se invoca por nombre). Aquí vive el contrato que mantiene a agent-workflow **agnóstico al arnés** (Claude Code, Codex, opencode, Gemini CLI, …) sin renunciar a las capacidades ricas de cada uno. Referenciado desde `../SKILL.md` (overview) y desde los loops cuando nombran una capacidad (`structured-choice`, `compaction`, …).
16
+
17
+ ## El problema
18
+
19
+ La doctrina (comandos + loops + artefactos) describe **qué** hace la IA, no **con qué tool** de un arnés concreto. El vocabulario natural arrastra mecanismos específicos de Claude Code —`AskUserQuestion`, `/compact`, `$ARGUMENTS`, `Task`/`Agent`— como si fueran universales. Este documento los abstrae: la doctrina referencia **capacidades**; aquí se mapea cada capacidad al **mecanismo concreto** de cada arnés.
20
+
21
+ ## Dos principios
22
+
23
+ 1. **Capacidad, no tool.** Los loops/comandos nombran una **capacidad** abstracta (ej. *structured-choice*, *compaction*). Una sola tabla —esta— la liga al mecanismo de cada arnés. Cambiar de arnés = cambiar de columna, no de doctrina.
24
+ 2. **Progressive enhancement.** Usá el mecanismo **más rico** que ofrezca el arnés; **degradá** a un fallback universal cuando no exista. Así se cumple a la vez "agnóstica al arnés" **y** "aprovechar las capacidades de cada uno".
25
+
26
+ > **Simetría con la cascada de skills (`.workflow/skills.toml`):** esa categoría liga **roles → skills** por config; esta liga **capacidades → mecanismos del arnés** por detección. Mismo patrón (binding + default), distinto eje: una es *qué saber compone el loop*, la otra es *con qué primitivas del host se ejecuta*.
27
+
28
+ ## Capability catalog
29
+
30
+ Las capacidades de las que depende el harness, con su fallback universal (lo que se usa si el arnés no ofrece algo mejor):
31
+
32
+ | Capability | Qué necesita el workflow | Fallback universal (mínimo común) |
33
+ |---|---|---|
34
+ | **command-invocation** | el usuario dispara un flujo por nombre (`spec-new`, `plan-exec`, …) | el usuario escribe "corré el procedimiento `<cmd>`" y la IA lee su doc |
35
+ | **procedure-loading** | cargar la doctrina de un loop/comando | la IA **lee el `.md`** del loop y lo sigue (read-and-follow) |
36
+ | **structured-choice** | preguntar al humano ≤3 preguntas de contenido **+ siempre** un control `flow` (`Compactar`/`Cerrar`) por un canal lateral | pregunta en **markdown numerado** en el chat; el control `flow` se ofrece como una opción más |
37
+ | **compaction** | encoger el contexto sin perder el hilo | escribir `CHECKPOINT` y pedir al usuario reiniciar el contexto y reanudar (resume keya off `CHECKPOINT`) |
38
+ | **subagent-dispatch** | *(opcional)* paralelizar breadth de research | research **inline secuencial** en la misma session (es el default igual) |
39
+ | **persistent-context** | bloque `WORKSPACE` + convenciones siempre presentes | archivo de contexto del repo (**`AGENTS.md`** estándar; `CLAUDE.md` en Claude Code) |
40
+ | **external-data** | lecturas read-only de BD u otras fuentes para research/validación | **MCP** (ampliamente soportado); si no hay, el gap se degrada a pregunta-al-humano |
41
+ | **dry-run / preview** | previsualizar lo que haría un comando sin escribir | el comando **describe** el cambio en vez de aplicarlo (ej. `spec-new` lista el borrador sin crear el archivo) |
42
+
43
+ > **Las capacidades `must` para el ciclo de un loop son solo dos**: `structured-choice` y `compaction`. Ambas degradan a un fallback puramente textual → **cualquier** arnés con chat + sistema de archivos corre el modelo completo. El resto (subagents, MCP, slash commands, skills nativas) es *enhancement*.
44
+
45
+ ## Harness binding matrix
46
+
47
+ Mecanismo concreto por arnés (jun-2026; `~` parcial · `?` sin confirmar).
48
+
49
+ | Capability | Claude Code | Codex CLI | opencode | Gemini CLI | Genérico |
50
+ |---|---|---|---|---|---|
51
+ | command-invocation | `.claude/commands/` (slash) | skills (prompts custom **deprecados**) | `.opencode/commands/` | `.gemini/commands/*.toml` | texto |
52
+ | procedure-loading | skills `SKILL.md` | skills `SKILL.md` | skills `SKILL.md` | skills (extensiones) | read-and-follow `.md` |
53
+ | structured-choice | `AskUserQuestion` (**solo main-agent**) | — | — | — | markdown numerado |
54
+ | compaction | `/compact` | `?` | `?` | `?` | CHECKPOINT + resume |
55
+ | subagent-dispatch | `Task` (paralelo) | agents (depth=1) | Explore/Scout | agents | inline |
56
+ | persistent-context | `CLAUDE.md` (**no** lee AGENTS.md → symlink) | `AGENTS.md` | `AGENTS.md` | `AGENTS.md`/`GEMINI.md` | `AGENTS.md` |
57
+ | external-data | MCP | MCP | MCP | MCP | — |
58
+ | dry-run / plan | plan mode (enforced) | `/plan` (prompt, **no** enforced) | Plan agent | plan mode | describir sin escribir |
59
+
60
+ > **Notas (investigación de campo jun-2026):** las **skills `SKILL.md`** son la unidad portable **universal** (las cinco las soportan; Codex deprecó los prompts custom) → la doctrina se empaqueta como skill. La **elección estructurada** (`AskUserQuestion`) es **solo de Claude Code y solo del main-agent** → en el resto, `structured-choice` degrada a markdown numerado. El **plan mode** está *enforced* solo en Claude Code/opencode (prompt-level en Codex) → **no se confía para safety**; el git-safe (invariante #5) es propio. **MCP** es universal. El **piso garantizado** (última columna) corre el modelo completo.
61
+
62
+ ## Leverage installed skills
63
+
64
+ "Aprovechar las skills que el arnés tenga instaladas" se resuelve por el **mismo binding** de `.workflow/skills.toml`: un rol puede apuntar a una skill **instalada en el host** (de tercero, vía skills.sh) en vez del built-in. Regla:
65
+
66
+ - Si el host tiene una skill **mejor** para un rol (ej. un generador de diagramas superior para `diagrams`, un linter de estándares para `coding-standards`), se la **bindea** en `.workflow/skills.toml` y el loop la compone sin cambios.
67
+ - El built-in default es el **piso**, no el techo: garantiza que el rol funcione en cualquier host; el binding lo **enriquece** donde el host puede más.
68
+
69
+ ## Convención para el resto del corpus
70
+
71
+ - Los loops/comandos referencian la **capacidad** por nombre (ej. "*structured-choice* (ver `harness/SKILL.md`)"), **no** el tool concreto.
72
+ - El nombre histórico `AskUserQuestion` se conserva **solo** como el binding Claude-Code de `structured-choice` (esta tabla), no como vocabulario de la doctrina.
73
+ - El control de ciclo de vida `flow` (`Compactar`/`Cerrar`) es parte de la capacidad `structured-choice`, no de un tool: en arneses sin elección estructurada se ofrece como una opción textual más.
74
+
75
+ ## Distribution (install-time)
76
+
77
+ Patrón probado (Spec Kit, 30+ agentes): **una fuente canónica** + generar/symlinkear a los dirs por-arnés en la instalación (`.claude/`, `.codex/`, `.gemini/`, …). agent-workflow ya lo hace vía `aw self install-skill`. Convención recomendada: **`AGENTS.md` canónico + `CLAUDE.md` symlink** (Claude Code no lee `AGENTS.md` nativo; el resto sí).
78
+
79
+ ## Command packaging (harness-specific)
80
+
81
+ El **contrato** de cada comando (Flow, Trigger, Input, Mode, …) es agnóstico. El **archivo** que el arnés ejecuta envuelve ese contrato en su formato nativo: Claude Code = slash-command con frontmatter (`description`, `argument-hint`, `allowed-tools`) + cuerpo que invoca la skill o el `aw` CLI; Codex = skill (los prompts custom en `~/.codex/prompts/` están deprecados); otros, su equivalente. El contrato no cambia; el envoltorio sí (otra columna). El comportamiento en *dry-run / plan mode* (previsualizar sin escribir) se documenta en el cuerpo del comando cuando aplica.
82
+
83
+ ## Status
84
+
85
+ Modelo de capacidades + matriz de binding **definidos** y **validados** con investigación de campo (jun-2026). El piso universal (`AGENTS.md` + texto + archivos + skills) corre el modelo completo hoy.
@@ -14,18 +14,18 @@ Propiedades comunes a **los 4 loops**:
14
14
 
15
15
  1. **Gap-driven convergente** — cada ciclo: `detect_gaps` → resolver (humano o research) → integrar → repetir hasta que no queden gaps materiales. Los gaps "agotados" (límite `MAX` de intentos) no se re-disparan → garantiza convergencia.
16
16
  2. **Una sola session por run + research inline** — el loop crea **una** session en `.workflow/sessions/` (la dueña del run) y maneja **sus** artefactos. La **investigación es inline**: una actividad dentro de esa misma session que escribe `ANALYSIS-FILE`/`CONCLUSIONS` (+ `SCRIPTS.sql` read-only si consulta BD) en su propia carpeta — ya no es una session aparte. **El usuario nunca crea sessions.** Los artefactos son el **registro vivo** del run — **ciclo artifact-first**: sembrar `CHECKPOINT.Pending/Next` (la intención) antes de ejecutar, llevar a `Completed`/DECISION después; CHECKPOINT actualizado en cada límite de gap/fase, BACKLOG solo si difiere. El spec/plan es la base guía.
17
- 3. **AskUserQuestion con dos tipos de tab** (límite host: 4 preguntas/llamada):
18
- - **tab(s) de contenido** (≤3) — la(s) pregunta(s) real(es) del momento (resolver una duda, elegir MCP, o en convergencia: `Guardar` / `Preguntar algo más`).
19
- - **tab `flow`** (1, SIEMPRE presente) — control de ciclo de vida por un canal lateral. Así el contenido lo maneja la IA y el ciclo de vida lo dirige el humano.
17
+ 3. **Structured-choice con dos planos** (capacidad del arnés — ver [`../harness/SKILL.md`](../harness/SKILL.md); en **Claude Code** es `AskUserQuestion`, máx 4 preguntas/llamada → **≤3 + 1 control `flow`**; sin elección estructurada degrada a markdown numerado):
18
+ - **pregunta(s) de contenido** (≤3) — la(s) pregunta(s) real(es) del momento (resolver una duda, elegir MCP, o en convergencia: `Guardar` / `Preguntar algo más`).
19
+ - **control `flow`** (1, SIEMPRE presente) — control de ciclo de vida por un canal lateral. Así el contenido lo maneja la IA y el ciclo de vida lo dirige el humano.
20
20
  4. **Escribe solo en su propia carpeta `docs/`** — y **nunca** gradúa/exporta otros artefactos a `docs/`. Esa promoción la hacen las skills `export-*`, aparte y explícita.
21
21
 
22
- ## flow tab — options
22
+ ## flow control — options
23
23
 
24
- El tab `flow` es **fijo**: `Compactar` / `Cerrar`, presente en los 4 loops. Responder el tab de contenido **sin tocar `flow`** = seguir iterando ("continuar" es el comportamiento por defecto del loop, no una opción del canal de control).
24
+ El control `flow` es **fijo**: `Compactar` / `Cerrar`, presente en los 4 loops. Responder la pregunta de contenido **sin tocar `flow`** = seguir iterando ("continuar" es el comportamiento por defecto del loop, no una opción del canal de control).
25
25
 
26
26
  | Option | What it does |
27
27
  |---|---|
28
- | `Compactar` | Escribe `CHECKPOINT` (session dueña del run) + dispara `/compact` del host y reanuda sin perder el hilo. |
28
+ | `Compactar` | Escribe `CHECKPOINT` (session dueña del run) + dispara la **compactación** del arnés (en Claude Code: `/compact`; ver [`../harness/SKILL.md`](../harness/SKILL.md)) y reanuda sin perder el hilo. |
29
29
  | `Cerrar` | `finalize`: persiste lo pendiente (`CHECKPOINT` siempre; `BACKLOG` solo si hay algo diferido), cierra la session y termina el loop. |
30
30
 
31
31
  ## Loops and their flow
@@ -33,8 +33,8 @@ El tab `flow` es **fijo**: `Compactar` / `Cerrar`, presente en los 4 loops. Resp
33
33
  | Loop (`name:`) | Flow | Started by | Reads | Writes |
34
34
  |---|---|---|---|---|
35
35
  | [`spec-refine-loop`](spec-refine-loop/SKILL.md) | SPEC | `/w:spec-refine` | `docs/specs/NNN-spec*.md` (el spec mismo) | `docs/specs/NNN-spec-<slug>.md` (in place) |
36
- | [`plan-new-loop`](plan-new-loop/SKILL.md) | PLANIFICATION | `/w:plan-new` | `docs/specs/NNN-spec-*.md` | `docs/plans/PPP-plan-<slug>.md` |
37
- | [`plan-exec-loop`](plan-exec-loop/SKILL.md) | PLANIFICATION | `/w:plan-exec` | `docs/plans/PPP-plan-*.md` | `docs/plans/PPP-plan-<slug>.md` (update) + `docs/tools`; resto vía `export-*` |
36
+ | [`plan-new-loop`](plan-new-loop/SKILL.md) | PLAN | `/w:plan-new` | `docs/specs/NNN-spec-*.md` | `docs/plans/PPP-plan-<slug>.md` |
37
+ | [`plan-exec-loop`](plan-exec-loop/SKILL.md) | PLAN | `/w:plan-exec` | `docs/plans/PPP-plan-*.md` | `docs/plans/PPP-plan-<slug>.md` (update) + `docs/tools`; resto vía `export-*` |
38
38
  | [`quick-loop`](quick-loop/SKILL.md) | QUICK | `/w:quick` | — (prompt) | edita código + session ligera; **no** `docs/` |
39
39
 
40
40
  > `/w:spec-new` no tiene loop (es single-pass). Por eso hay **5 comandos / 4 loops**.
@@ -46,14 +46,14 @@ Los loops **nunca** graduan/exportan artefactos a `docs/` automáticamente. Cada
46
46
  | Flow | Carpetas `docs/` que escribe |
47
47
  |---|---|
48
48
  | SPEC | `docs/specs` |
49
- | PLANIFICATION | `docs/plans` (living) + `docs/tools` (herramientas creadas — salida directa) |
49
+ | PLAN | `docs/plans` (living) + `docs/tools` (herramientas creadas — salida directa) |
50
50
  | QUICK | ninguna |
51
51
 
52
52
  Todo lo demás (migraciones → `docs/scripts`, manuales → `docs/manuals`, diagramas → `docs/diagrams`, informes → `docs/reports`) queda como **artefacto de session** hasta que un `export-*` lo promueva, como paso aparte y explícito.
53
53
 
54
- ## Loops × flow tab
54
+ ## Loops × flow control
55
55
 
56
- | Loop | tab(s) de contenido típicos | tab `flow` |
56
+ | Loop | pregunta(s) de contenido típicas | control `flow` |
57
57
  |---|---|---|
58
58
  | `spec-refine-loop` | dudas-de-humano · elección de MCP · convergencia (`Guardar especificación refinada` / `Preguntar algo más`) | `Compactar` / `Cerrar` |
59
59
  | `plan-new-loop` | dudas · elección de MCP · convergencia (`Guardar plan` / `Preguntar algo más`) | `Compactar` / `Cerrar` |
@@ -64,7 +64,7 @@ Todo lo demás (migraciones → `docs/scripts`, manuales → `docs/manuals`, dia
64
64
 
65
65
  | Field | Description |
66
66
  |---|---|
67
- | `## Flow` | A qué flujo pertenece (SPEC · PLANIFICATION · QUICK) |
67
+ | `## Flow` | A qué flujo pertenece (SPEC · PLAN · QUICK) |
68
68
  | `## Layer` | Siempre 2 (la IA lo corre entero) |
69
69
  | `## Started by` | Comando `/w:…` que lo arranca (reanudable) |
70
70
  | `## Reads` | Documento(s) de entrada |
@@ -73,7 +73,7 @@ Todo lo demás (migraciones → `docs/scripts`, manuales → `docs/manuals`, dia
73
73
  | `## Sequence` | Pseudocódigo + mermaid del loop |
74
74
  | `## Convergence / exit` | Cuándo para |
75
75
 
76
- El **chasis** (`spec-refine-loop`) además detalla `## Composes` (capacidades que compone), `## Deliverable schema`, `## Gap taxonomy`, `## Ask-vs-research rule`, `## Research: autonomy, scope & failure`, `## AskUserQuestion`, `## Compact / resume`, `## Integration`.
76
+ El **chasis** (`spec-refine-loop`) además detalla `## Composes` (capacidades que compone), `## Deliverable schema`, `## Gap taxonomy`, `## Ask-vs-research rule`, `## Research: autonomy, scope & failure`, `## Structured-choice`, `## Compact / resume`, `## Integration`.
77
77
 
78
78
  Los **heirs** (`plan-new-loop`, `plan-exec-loop`, `quick-loop`) usan `## Inherits` (lo que reusan del chasis, sin repetirlo) + `## Delta N` (sus diferencias).
79
79
 
@@ -81,7 +81,7 @@ Los **heirs** (`plan-new-loop`, `plan-exec-loop`, `quick-loop`) usan `## Inherit
81
81
 
82
82
  ```
83
83
  spec-refine-loop ── CHASIS (patrón de referencia: motor gap-driven, sesión única,
84
- AskUserQuestion + tab flow, research autónomo INLINE + regla BD,
84
+ structured-choice + control flow, research autónomo INLINE + regla BD,
85
85
  │ compact/resume, artefactos como log vivo: CHECKPOINT siempre,
86
86
  │ BACKLOG solo si difiere)
87
87
  ├── plan-new-loop (heir) → deltas: plan rico, gap taxonomy de plan
@@ -5,7 +5,7 @@ description: >-
5
5
  doc: lo lee y actualiza fase a fase mientras edita el código real, gestiona BD
6
6
  y git. Heir del chasis spec-refine-loop: reusa su motor gap-driven (aplicado
7
7
  dentro de una tarea ante decisiones/dudas no obvias), research inline con
8
- regla BD read-only, AskUserQuestion con ≤3 tabs de contenido + 1 tab flow
8
+ regla BD read-only, structured-choice con ≤3 preguntas de contenido + 1 control flow
9
9
  (Compactar/Cerrar) siempre, y artefactos como log vivo (CHECKPOINT siempre,
10
10
  BACKLOG solo si difiere). Sus deltas: una sola session por run (resume vía
11
11
  checkbox del plan-doc + CHECKPOINT); git seguro (verifica rama esperada antes
@@ -20,10 +20,10 @@ description: >-
20
20
 
21
21
  # plan-exec-loop
22
22
 
23
- > **Heir** del chasis [`spec-refine-loop`](../spec-refine-loop/SKILL.md). Aquí los **deltas de ejecución** — el trabajo real: código, BD, git. El motor (gap-driven, research inline, AskUserQuestion + tab `flow`, compact/resume, artefactos como log vivo) vive en el chasis.
23
+ > **Heir** del chasis [`spec-refine-loop`](../spec-refine-loop/SKILL.md). Aquí los **deltas de ejecución** — el trabajo real: código, BD, git. El motor (gap-driven, research inline, structured-choice + control `flow`, compact/resume, artefactos como log vivo) vive en el chasis.
24
24
 
25
25
  ## Flow
26
- PLANIFICATION
26
+ PLAN
27
27
 
28
28
  ## Layer
29
29
  2 — la IA lo corre entero.
@@ -32,7 +32,7 @@ PLANIFICATION
32
32
  `/w:plan-exec` — **reanudable** (mismo mecanismo del chasis; aquí el resume keya off el checkbox del plan-doc + CHECKPOINT, ver Delta 1).
33
33
 
34
34
  ## Reads
35
- `docs/plans/PPP-plan-<slug>.md` (localizar vía glob `docs/plans/PPP-plan-*.md` o la ruta exacta de `$ARGUMENTS`).
35
+ `docs/plans/PPP-plan-<slug>.md` (localizar vía glob `docs/plans/PPP-plan-*.md` o la ruta exacta del argumento del comando).
36
36
 
37
37
  ## Writes
38
38
  - `docs/plans/PPP-plan-<slug>.md` (**read/update**, living doc: estado de fases/tareas, `Open questions`).
@@ -48,8 +48,8 @@ Este loop **nunca gradúa/promueve artefactos** a `docs/`. Las únicas carpetas
48
48
 
49
49
  Del chasis [`spec-refine-loop`](../spec-refine-loop/SKILL.md), sin cambios:
50
50
 
51
- - Motor **gap-driven** (aplica *dentro de una tarea* ante una decisión/duda no obvia: research inline ó AskUserQuestion).
52
- - **AskUserQuestion**: ≤3 contenido + 1 `flow` (`Compactar`/`Cerrar`) siempre.
51
+ - Motor **gap-driven** (aplica *dentro de una tarea* ante una decisión/duda no obvia: research inline ó structured-choice).
52
+ - **Structured-choice**: ≤3 preguntas de contenido + 1 control `flow` (`Compactar`/`Cerrar`) siempre (capacidad del arnés — ver [`../../harness/SKILL.md`](../../harness/SKILL.md); en Claude Code es `AskUserQuestion`).
53
53
  - **Research INLINE** + **regla BD** read-only (pregunta MCP si >1 sin default → `SCRIPTS.sql` → ejecuta read-only) + research **inconclusa** (degrada/difiere, límite `MAX`).
54
54
  - **Compact/resume**; **artefactos como log vivo** (`CHECKPOINT` siempre; `BACKLOG` solo si difiere).
55
55
 
@@ -95,10 +95,12 @@ Distinción por **ejecución**, no por archivo (ver el esquema `SCRIPTS.sql`):
95
95
  - Validación que **corre y falla** → vuelve a la tarea (gap); no avanza.
96
96
  - **Validación dependiente de una migración no aplicada**: como la IA no ejecuta el DML, **no puede correr read-only** → se **difiere** (handoff a DBA), **no bloquea el avance**. Se registra en `Open questions` del plan + `BACKLOG`, marcando "verificación pendiente tras aplicar SQL". (Reusa el patrón degradar/diferir + límite `MAX` del chasis → evita el bucle "vuelve a la tarea".)
97
97
 
98
+ > La **validación final** es el **convergence gate** de PLAN-exec (análogo al *analyze gate* de SPEC y al *coherence gate* de `plan-new`): el plan no se marca *done* hasta que pasa o queda explícitamente diferida (handoff de SQL).
99
+
98
100
  ## Delta 5 — Completitud / cierre
99
101
 
100
102
  - Una fase cierra **done** cuando sus tareas están `- [x]` y su validación pasó **o** quedó diferida (handoff de SQL). Estado posible: **"done — SQL pendiente de aplicar"**.
101
- - Todas las fases done → `AskUserQuestion` final (contenido: `Marcar plan done` / `Preguntar algo más`; flow: `Compactar`/`Cerrar`).
103
+ - Todas las fases done → *structured-choice* final (contenido: `Marcar plan done` / `Preguntar algo más`; flow: `Compactar`/`Cerrar`).
102
104
  - **Sin export automático**: los artefactos (`SCRIPTS.sql`, `DECISION`, …) quedan en la session. Promoverlos a `docs/` (scripts, manuals, …) es un paso aparte vía `export-*`.
103
105
 
104
106
  ## Sequence
@@ -120,7 +122,7 @@ plan-exec-loop(PPP-plan-<slug>.md):
120
122
  si consulta BD read-only → SCRIPTS.sql + ejecutar read-only
121
123
  si cambio BD (DDL/DML) → redactar en SCRIPTS.sql (artefacto session, NO ejecutar)
122
124
  si decisión no obvia → DECISION (etiquetado por fase/tarea, en el ÚNICO DECISION)
123
- si duda/gap → research inline ó AskUserQuestion # chasis
125
+ si duda/gap → research inline ó structured-choice # chasis
124
126
  marcar Task - [x] + estado EN EL PLAN # DESPUÉS de completar la Task (el plan-doc es la fuente de verdad por tarea)
125
127
  validación de la fase:
126
128
  la que corre y falla → volver a la tarea
@@ -130,7 +132,7 @@ plan-exec-loop(PPP-plan-<slug>.md):
130
132
  si rechazado → cambios quedan; registrar "fase sin commitear"
131
133
  precondición siguiente fase: working tree limpio o reconocido
132
134
  validación final (lo que se pueda; lo dependiente de SQL queda como handoff)
133
- AskUserQuestion(contenido: [Marcar plan done, Preguntar algo más], flow: [Compactar, Cerrar])
135
+ structured_choice(contenido: [Marcar plan done, Preguntar algo más], flow: [Compactar, Cerrar])
134
136
  marcar plan done (o "done — SQL pendiente de aplicar")
135
137
  # NO export: los artefactos quedan en la session; un export-* los promueve aparte
136
138
  finalize: CHECKPOINT (+ BACKLOG si difiere) + cerrar session + reportar
@@ -153,11 +155,11 @@ flowchart TD
153
155
  CM -->|aprobado| P
154
156
  CM -->|rechazado| RJ["cambios quedan · registrar 'sin commitear'"]
155
157
  RJ --> P
156
- V2 --> FIN["AskUserQuestion[Marcar plan done · Preguntar más]<br/>plan done (sin auto-export)"]
158
+ V2 --> FIN["structured-choice[Marcar plan done · Preguntar más]<br/>plan done (sin auto-export)"]
157
159
  ```
158
160
 
159
161
  ## Convergence / exit
160
162
 
161
163
  - Plan completo + validación OK (o diferida con handoff) → `Marcar plan done`.
162
- - `Cerrar` (tab flow, en cualquier momento) → `finalize` persiste `CHECKPOINT` (y `BACKLOG` solo si quedó algo sin ejecutar / sin commitear / sin aplicar), cierra la session, reporta.
164
+ - `Cerrar` (control `flow`, en cualquier momento) → `finalize` persiste `CHECKPOINT` (y `BACKLOG` solo si quedó algo sin ejecutar / sin commitear / sin aplicar), cierra la session, reporta.
163
165
  - La promoción de artefactos a `docs/` (vía `export-*`) es **siempre** un paso posterior y explícito, fuera de este loop.
@@ -4,7 +4,7 @@ description: >-
4
4
  Genera un plan de implementación rico (docs/plans/PPP-plan-<slug>.md) a partir
5
5
  de un spec (docs/specs/NNN-spec-<slug>.md). Heir del chasis spec-refine-loop:
6
6
  reusa íntegro su motor gap-driven convergente, su única session por run,
7
- research INLINE, AskUserQuestion con ≤3 tabs de contenido + 1 tab flow
7
+ research INLINE, structured-choice con ≤3 preguntas de contenido + 1 control flow
8
8
  (Compactar/Cerrar) siempre presente, research autónomo con regla BD read-only,
9
9
  y artefactos como log vivo (CHECKPOINT siempre, BACKLOG solo si difiere). Sus
10
10
  deltas: el plan absorbe inline el nivel TECHNICAL-NOTE
@@ -19,10 +19,10 @@ description: >-
19
19
 
20
20
  # plan-new-loop
21
21
 
22
- > **Heir** del chasis [`spec-refine-loop`](../spec-refine-loop/SKILL.md). Aquí **solo** los deltas. El motor (gap-driven, sesión única, AskUserQuestion + tab `flow`, research inline + regla BD, compact/resume, artefactos como log vivo) vive en el chasis — no se repite.
22
+ > **Heir** del chasis [`spec-refine-loop`](../spec-refine-loop/SKILL.md). Aquí **solo** los deltas. El motor (gap-driven, sesión única, structured-choice + control `flow`, research inline + regla BD, compact/resume, artefactos como log vivo) vive en el chasis — no se repite.
23
23
 
24
24
  ## Flow
25
- PLANIFICATION
25
+ PLAN
26
26
 
27
27
  ## Layer
28
28
  2 — la IA lo corre entero.
@@ -31,7 +31,7 @@ PLANIFICATION
31
31
  `/w:plan-new` — **reanudable** (mismo mecanismo del chasis, keyado off CHECKPOINT).
32
32
 
33
33
  ## Reads
34
- `docs/specs/NNN-spec-*.md` (glob — localiza el spec por número; o la ruta exacta de `$ARGUMENTS`). **Refinado vs borrador** se distingue por la **presencia** de `## Refinement decisions` / `## Q&A traceability` en el spec: si faltan → **soft-suggest** correr `/w:spec-refine` primero (planificar sobre un spec sólido produce mejores planes), pero el usuario puede proceder.
34
+ `docs/specs/NNN-spec-*.md` (glob — localiza el spec por número; o la ruta exacta del argumento del comando). **Refinado vs borrador** se distingue por la **presencia** de `## Refinement decisions` / `## Q&A traceability` en el spec: si faltan → **soft-suggest** correr `/w:spec-refine` primero (planificar sobre un spec sólido produce mejores planes), pero el usuario puede proceder.
35
35
 
36
36
  ## Writes
37
37
  `docs/plans/PPP-plan-<slug>.md` (`generate`; **sobrescribe con confirmación** si existe). Solo escribe `docs/plans` — nunca otras carpetas `docs/` ni auto-export.
@@ -44,7 +44,7 @@ Del chasis [`spec-refine-loop`](../spec-refine-loop/SKILL.md), sin cambios:
44
44
 
45
45
  - Motor **gap-driven convergente** + **ciclo artifact-first** del chasis (sembrar `CHECKPOINT.Pending/Next` ANTES → `detect_gaps` → resolver → integrar → actualizar `Pending→Completed` DESPUÉS; gaps agotados con límite `MAX` no se re-disparan).
46
46
  - **Una sola session por run**: descriptor `plan-new` → `NNN-plan-new` (Type = `refine`): `SESSION` + `CHECKPOINT` (+ `BACKLOG` solo si difiere). La **investigación es inline** dentro de esta session (produce `ANALYSIS-FILE`/`CONCLUSIONS` + `SCRIPTS.sql` read-only en su propia carpeta), no una session aparte.
47
- - **AskUserQuestion**: ≤3 tabs de contenido + 1 tab `flow` (`Compactar`/`Cerrar`) siempre.
47
+ - **Structured-choice**: ≤3 preguntas de contenido + 1 control `flow` (`Compactar`/`Cerrar`) siempre (capacidad del arnés — ver [`../../harness/SKILL.md`](../../harness/SKILL.md); en Claude Code es `AskUserQuestion`).
48
48
  - **Ask-vs-research rule** + **research autónomo inline** + **regla BD** (pregunta MCP si >1 sin default → queries a `SCRIPTS.sql` → ejecuta read-only, `sql-mutation-guard`) + manejo de research **inconclusa** (degrada a humano / difiere a `Open questions` + límite `MAX`).
49
49
  - **Compact / resume** y **artefactos como log vivo (ciclo artifact-first)** (`CHECKPOINT` siempre; `BACKLOG` solo si difiere).
50
50
  - **Naming + numeración global** del chasis: `<run>` = descriptor `plan-new`. El CLI antepone el `NNN` global y secuencial (sin reiniciar por tipo); el caller pasa solo el descriptor.
@@ -59,22 +59,24 @@ El plan absorbe el nivel `TECHNICAL-NOTE` **inline** (decisión del usuario) + r
59
59
  > Derivado de docs/specs/NNN-spec-<slug>.md · generado por plan-new-loop
60
60
 
61
61
  ## Origin spec fuente (o prompt, si se bootstrapeó vía spec-new)
62
- ## Summary el cómo, en 1–2 frases
63
- ## Solution explicación técnica/funcional de cómo se implementará
64
- ## Impacted FE · BE · BD (esquemas/tablas/funciones) · APIs · integraciones
65
- ## Dependencies docs / fuentes / bases / sesiones
66
- ## Current state (AS-IS) wiring actual (interfaces y métodos), resumido
67
- ## Target state (TO-BE) wiring objetivo
68
- ## Final behavior cómo se comporta el flujo al final (alineado con criterios del spec)
69
- ## Phases fases agrupadoras (complejidad XS–S)
70
- ## Tasks tareas por fase (≤XS), con deps y estado vivo (- [ ])
71
- ## Validations validaciones / restricciones / lógica de negocio
72
- ## Risks / impact riesgos e impactos técnicos
73
- ## Assumptions supuestos
74
- ## Estimated time sizing XS–XL (desarrollo + pruebas internas)
75
- ## Open questions pendientes
62
+ ## Summary el cómo, en 1–2 frases (core)
63
+ ## Solution explicación técnica/funcional de cómo se implementará (core)
64
+ ## Impacted FE · BE · BD (esquemas/tablas/funciones) · APIs · integr. (core)
65
+ ## Dependencies docs / fuentes / bases / sesiones (opt.)
66
+ ## Current state (AS-IS) wiring actual (interfaces y métodos), resumido (opt.)
67
+ ## Target state (TO-BE) wiring objetivo (opt.)
68
+ ## Final behavior cómo se comporta el flujo al final (alineado con criterios del spec) (core)
69
+ ## Phases fases agrupadoras (complejidad XS–S) (core)
70
+ ## Tasks tareas por fase (≤XS), con deps y estado vivo (- [ ]) (core)
71
+ ## Validations validaciones / restricciones / lógica de negocio (core)
72
+ ## Risks / impact riesgos e impactos técnicos (opt.)
73
+ ## Assumptions supuestos (opt.)
74
+ ## Estimated time sizing XS–XL (desarrollo + pruebas internas) (opt.)
75
+ ## Open questions pendientes (core)
76
76
  ```
77
77
 
78
+ > **Escala con complejidad:** las `(core)` van **siempre**; las `(opt.)` solo si el plan lo amerita — un plan chico puede omitir `Dependencies`, AS-IS/TO-BE, `Risks`, `Assumptions`, `Estimated time`. Conciso > exhaustivo.
79
+
78
80
  > **Implicación de catálogo:** `TECHNICAL-NOTE` deja de ser artefacto de session y se vuelve **secciones del plan-doc**. Reconciliado en [`plan-exec-loop`](../plan-exec-loop/SKILL.md): la única plan-exec session **no** lleva `TECHNICAL-NOTE` ni `TASKS` propios; el detalle técnico y el progreso viven inline en el plan-doc (living).
79
81
 
80
82
  ## Delta 2 — Gap taxonomy (de "plan")
@@ -90,12 +92,12 @@ Reemplaza la gap taxonomy de spec por una orientada a planificación:
90
92
  | Tarea no atómica | complejidad > XS | la IA re-parte |
91
93
  | Deps faltantes | orden no claro | research / humano |
92
94
  | Criterios del spec sin cubrir | tareas no trazan a acceptance criteria | la IA deriva + humano confirma |
93
- | Riesgos sin atender | | humano |
95
+ | Riesgos sin atender | riesgos técnicos sin mitigar/declarar | humano |
94
96
 
95
97
  ## Delta 3 — What research investigates here
96
98
 
97
- El research **inline** del chasis se especializa: mapear **código/impacto** — componentes FE/BE/BD afectados, wiring AS-IS, dependencias. Alimenta las secciones `Solution`, `Impacted`, `Current state (AS-IS)`. La regla BD del chasis aplica igual (queries read-only a `SCRIPTS.sql`, MCP elegido vía tab de contenido si >1 sin default).
99
+ El research **inline** del chasis se especializa: mapear **código/impacto** — componentes FE/BE/BD afectados, wiring AS-IS, dependencias. Alimenta las secciones `Solution`, `Impacted`, `Current state (AS-IS)`. La regla BD del chasis aplica igual (queries read-only a `SCRIPTS.sql`, MCP elegido vía pregunta de contenido si >1 sin default).
98
100
 
99
101
  ## Convergence / exit
100
102
 
101
- Sin gaps materiales → `AskUserQuestion` (contenido: `Guardar plan` / `Preguntar algo más`; flow: `Compactar`/`Cerrar`) → al `Guardar`, escribe `docs/plans/PPP-plan-<slug>.md` (con confirmación si existe) → `finalize` (persiste `CHECKPOINT`, y `BACKLOG` solo si difiere; cierra la session, reporta). `Cerrar` en cualquier momento → `finalize` igual.
103
+ Sin gaps materiales → **coherence gate** (read-only; es el "convergence gate" del chasis para PLAN-new): cada `acceptance criterion` del spec **traza** a una fase/tarea, `Final behavior` los cubre, fases XS–S / tareas XS, `deps` sin ciclos, `Impacted` consistente con `Solution`. Lo que falle **vuelve como gap** — la trazabilidad criterio→tarea es una **invariante chequeada**, no una sección aparte. Si pasa → *structured-choice* (contenido: `Guardar plan` / `Preguntar algo más`; flow: `Compactar`/`Cerrar`) → al `Guardar`, escribe `docs/plans/PPP-plan-<slug>.md` (con confirmación si existe) → `finalize` (persiste `CHECKPOINT`, y `BACKLOG` solo si difiere; cierra la session, reporta). `Cerrar` en cualquier momento → `finalize` igual.