@tacuchi/agent-workflow-cli 9.3.0 → 10.0.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 (30) hide show
  1. package/dist/application/auto-plan.d.ts +15 -2
  2. package/dist/application/auto-plan.d.ts.map +1 -1
  3. package/dist/application/auto-plan.js +70 -9
  4. package/dist/application/auto-plan.js.map +1 -1
  5. package/dist/application/host-doctor-service.d.ts +21 -0
  6. package/dist/application/host-doctor-service.d.ts.map +1 -0
  7. package/dist/application/host-doctor-service.js +101 -0
  8. package/dist/application/host-doctor-service.js.map +1 -0
  9. package/dist/cli/commands/auto-plan-decide.d.ts.map +1 -1
  10. package/dist/cli/commands/auto-plan-decide.js +56 -3
  11. package/dist/cli/commands/auto-plan-decide.js.map +1 -1
  12. package/dist/cli/commands/host-doctor.d.ts +3 -0
  13. package/dist/cli/commands/host-doctor.d.ts.map +1 -0
  14. package/dist/cli/commands/host-doctor.js +10 -0
  15. package/dist/cli/commands/host-doctor.js.map +1 -0
  16. package/dist/cli/main.js +2 -0
  17. package/dist/cli/main.js.map +1 -1
  18. package/package.json +1 -1
  19. package/skills/agent-workflow/commands/export-scripts.md +36 -19
  20. package/skills/agent-workflow/doctrine/implement/references/rollback-guide.md +5 -3
  21. package/skills/agent-workflow/exports/export-scripts/SKILL.md +97 -76
  22. package/skills/agent-workflow/exports/export-scripts/references/lexico-tecnico.md +20 -6
  23. package/skills/agent-workflow/exports/export-scripts/references/manifest-template.md +13 -1
  24. package/skills/agent-workflow/exports/export-scripts/references/readme-template.md +252 -42
  25. package/skills/agent-workflow/exports/export-scripts/references/theme-handling.md +45 -72
  26. package/skills/agent-workflow/exports/export-scripts/references/validations.md +119 -71
  27. package/skills/agent-workflow/standards/sql-rollback-generator/SKILL.md +77 -62
  28. package/skills/agent-workflow/standards/sql-rollback-generator/references/release-rollback.md +4 -2
  29. package/skills/agent-workflow/standards/sql-rollback-generator/references/rollback-patterns.md +5 -3
  30. package/skills/agent-workflow/standards/sql-script-organizer/SKILL.md +16 -16
@@ -1,41 +1,68 @@
1
- # Validations — V1-V6 para `/agent-workflow:export-scripts`
1
+ # Validations — V1-V6 para `/agent-workflow:export-scripts` (v4.0.0)
2
2
 
3
- Checks post-render que se aplican antes de escribir el bundle al filesystem. Adaptados del canon de la familia export-* (export-arq + export-report) con foco en bundle SQL + informe.
3
+ Checks post-render que se aplican antes de escribir el bundle al filesystem. Adaptados del canon de la familia export-* (export-arq + export-report) con foco en bundle SQL + informe único.
4
4
 
5
5
  Niveles de severidad:
6
6
  - **Hard-fail**: aborta la escritura, devuelve `ok: false` con error report. No se crea el directorio.
7
7
  - **Warning**: emite mensaje, pide confirmación del usuario para continuar.
8
8
 
9
- ## V1 — Estructura del bundle
9
+ ## V1 — Estructura del bundle (layout plano cross-session)
10
10
 
11
- **Severidad**: hard-fail si falta archivo obligatorio o sub-dir esperado.
11
+ **Severidad**: hard-fail si falta archivo obligatorio O aparece archivo/sub-dir vetado.
12
12
 
13
- **Archivos obligatorios siempre**:
14
- - `manifest.md`
15
- - `README.md`
16
- - `ORDER.md`
17
- - `rollback-global.sql`
18
- - `por-sesion/` con ≥1 sesión
13
+ ### Archivos obligatorios siempre
19
14
 
20
- **Archivos condicionales**:
21
- - `por-tema/` con ≥1 tema — sólo si la activación de Paso 6 dio positivo (themes declarados, `## Temas` en OBJECTIVE, o `--themes infer`).
15
+ - `README.md` — único informe + índice + how-to-execute.
16
+ - `00-ROLLBACK.sql` — sólo si al menos una categoría 01-04 tiene contenido (si todo el corpus está vacío, no se escribe el bundle).
22
17
 
23
- **Cómo validar**: listar el output dir antes de escribir el manifest final; verificar que todos los archivos obligatorios estarán presentes.
18
+ ### Archivos por categoría (skip silencioso si vacío)
19
+
20
+ - `01-DDL-TABLES.sql` — sólo si hay sentencias `@category: 01` en el corpus.
21
+ - `02-DDL-FUNCTIONS.sql` — sólo si hay sentencias `@category: 02`.
22
+ - `03-DML.sql` — sólo si hay sentencias `@category: 03`.
23
+ - `04-INSERTS.sql` — sólo si hay sentencias `@category: 04`.
24
+
25
+ ### Archivos condicionales
26
+
27
+ - `_queries/<sessionXXX>/` — sólo si la sesión origen tenía `queries/`.
28
+ - `por-tema/<slug>/` — sólo si `--themes` activado, `## Temas` declarado, o `--themes infer`.
29
+
30
+ ### Archivos VETADOS (presencia → hard-fail)
31
+
32
+ Layout v3.x eliminado desde v4.0.0:
33
+ - `manifest.md` (absorbido por `README.md`).
34
+ - `ORDER.md` (absorbido por §4 del `README.md`).
35
+ - `rollback-global.sql` separado (reemplazado por `00-ROLLBACK.sql`).
36
+ - `por-sesion/` y todo su contenido (consolidación es cross-session al root).
37
+ - `<file>.rollback.sql` companions por sentencia (eliminado en sql-rollback-generator v2.0.0).
38
+ - `<session>/rollback/` sub-carpetas per-sesión (eliminado en sql-rollback-generator v2.0.0).
39
+
40
+ **Cómo validar**: listar el output dir antes de escribir el bundle final; verificar que (a) archivos obligatorios están presentes y (b) no aparece nada del set vetado.
24
41
 
25
42
  **Error report (hard-fail)**:
26
43
  ```
27
- V1 FAILED: bundle incompleto
28
- esperado: manifest.md, README.md, ORDER.md, rollback-global.sql, por-sesion/
29
- encontrado: manifest.md, README.md, por-sesion/
30
- faltantes: ORDER.md, rollback-global.sql
31
- acción: regenerar pasos 7 y 9
44
+ V1 FAILED: estructura del bundle incompatible con v4.0.0
45
+ esperado al root: README.md + 0X-*.sql (categorías con contenido)
46
+ encontrado vetado: por-sesion/ (4 sub-carpetas), manifest.md, rollback-global.sql
47
+ acción: el generador está produciendo layout v3.x — revisar export-scripts v4.0.0 + sql-rollback-generator v2.0.0
32
48
  ```
33
49
 
34
- ## V2 — Noise vetado
50
+ ## V2 — Noise vetado + anti-redundancia v4.0.0
51
+
52
+ **Severidad**: hard-fail si hay ≥1 ocurrencia.
53
+
54
+ **Scope**: body-only del `README.md` — líneas después de `# Bundle export-scripts NNN` (h1 inicial) y antes de `## 10. Metadata`.
35
55
 
36
- **Severidad**: hard-fail si hay ≥1 ocurrencia en el cuerpo del `manifest.md` (header y sección Metadata exentos).
56
+ **Patrones vetados** (catálogo en `references/lexico-tecnico.md` + reglas anti-redundancia v4.0.0):
37
57
 
38
- **Scope**: body-only líneas después de `# Informe del bundle NNN` (h1 inicial) y antes de `## 10. Metadata`.
58
+ 1. Placeholders sin reemplazar: `NNN`, `YYYY-MM-DD`, `[entre corchetes]`, `<placeholder>`.
59
+ 2. Paths absolutos del developer: `/Users/`, `/home/`, `C:\\`.
60
+ 3. Referencias residuales al layout v3.x dentro de prosa generada (no en bloques deprecation explicit):
61
+ - `por-sesion/` en `## 4. Secuencia de ejecución` o `## 5. Rollback` (esos paths fueron eliminados).
62
+ - `manifest.md` como recurso vigente del bundle (sólo válido si se cita el template DEPRECATED).
63
+ - `ORDER.md` como archivo del bundle (eliminado).
64
+ - `rollback-global.sql` como path activo (renombrado a `00-ROLLBACK.sql`).
65
+ - `<file>.rollback.sql` companions.
39
66
 
40
67
  **Cómo validar**:
41
68
  ```bash
@@ -44,40 +71,43 @@ awk '
44
71
  /^## 10\. Metadata/ { body=0 }
45
72
  body { print }
46
73
  /^# / && !/Metadata/ { body=1 }
47
- ' manifest.md > /tmp/body.md
74
+ ' README.md > /tmp/body.md
48
75
  grep -n -F -f references/lexico-tecnico.md /tmp/body.md
76
+ # Plus anti-redundancia v4.0.0:
77
+ grep -nE 'por-sesion/|rollback-global\.sql|\.rollback\.sql|ORDER\.md|manifest\.md' /tmp/body.md
49
78
  ```
50
79
 
51
80
  **Error report (hard-fail)**:
52
81
  ```
53
- V2 FAILED: noise vetado detectado en cuerpo del manifest
82
+ V2 FAILED: noise vetado / redundancia v3.x detectados en README.md
54
83
  ocurrencias:
55
84
  línea 12: "NNN-export-scripts-YYYY-MM-DD" → placeholder sin reemplazar
56
85
  línea 28: "/Users/tacuchi/" → path absoluto del developer
57
- línea 41: "DEC-NNN" placeholder sin reemplazar
86
+ línea 65: "por-sesion/session001-*/" layout v3.x deprecated
58
87
  total: 3 ocurrencias
59
- acción: completar render y stripear paths absolutos
88
+ acción: completar render con paths v4.0.0 y stripear referencias legacy
60
89
  ```
61
90
 
62
- ## V3 — Secciones obligatorias del manifest
91
+ ## V3 — Secciones obligatorias del README único
63
92
 
64
93
  **Severidad**: hard-fail si falta una sección obligatoria.
65
94
 
66
- **Secciones obligatorias** (todas siempre presentes en `manifest.md`):
95
+ **Secciones obligatorias** (todas siempre presentes en `README.md`):
96
+
67
97
  1. `## 1. Resumen ejecutivo`
68
98
  2. `## 2. Sesiones incluidas`
69
99
  3. `## 3. Acciones manuales previas a producción`
70
- 4. `## 4. Base de datos`
71
- 5. `## 5. Código fuente — hallazgos del escaneo`
72
- 6. `## 6. Git y ramas`
73
- 7. `## 7. Documentación graduada`
74
- 8. `## 8. Checklist final de producción`
75
- 9. `## 9. Advertencias`
100
+ 4. `## 4. Secuencia de ejecución (01 → 04)`
101
+ 5. `## 5. Rollback (\`00-ROLLBACK.sql\`)`
102
+ 6. `## 6. Código fuente — hallazgos del escaneo`
103
+ 7. `## 7. Git y ramas`
104
+ 8. `## 8. Documentación graduada`
105
+ 9. `## 9. Checklist final de producción`
76
106
  10. `## 10. Metadata`
77
107
 
78
108
  **Cómo validar**:
79
109
  ```bash
80
- grep -c '^## [0-9]\+\. ' manifest.md # debe dar exactamente 10
110
+ grep -c '^## [0-9]\+\. ' README.md # debe dar exactamente 10
81
111
  ```
82
112
 
83
113
  **Error report (hard-fail)**:
@@ -85,34 +115,34 @@ grep -c '^## [0-9]\+\. ' manifest.md # debe dar exactamente 10
85
115
  V3 FAILED: secciones obligatorias faltantes
86
116
  esperadas: 10
87
117
  encontradas: 8
88
- faltantes: "## 5. Código fuente — hallazgos del escaneo", "## 9. Advertencias"
89
- acción: regenerar manifest con secciones completas
118
+ faltantes: "## 5. Rollback (`00-ROLLBACK.sql`)", "## 9. Checklist final de producción"
119
+ acción: regenerar README con secciones completas
90
120
  ```
91
121
 
92
122
  ## V4 — Secciones condicionales honored
93
123
 
94
124
  **Severidad**: hard-fail si una sub-sección condicional aparece sin justificación o falta cuando debería estar.
95
125
 
96
- ### V4.a — Vista por tema (`## 4.4 Vista por tema`)
126
+ ### V4.a — Mapping por tema (`## 4.1 Mapping sesión tema ↔ scripts`)
97
127
 
98
- - **Patrón A — activada**: temas declarados (CLI flag o `## Temas`) sub-sección `## 4.4 Vista por tema` presente con conteo + paths a `por-tema/`.
99
- - **Patrón B — no activada**: sin temas sub-sección `## 4.4 Vista por tema` **ausente** (no aparece header ni placeholder).
128
+ - **Patrón A — `--themes` activado**: sub-sección `## 4.1 Mapping sesión tema ↔ scripts` presente con tabla de mapping.
129
+ - **Patrón B — sin temas**: sub-sección `## 4.1` **ausente** (no aparece header ni placeholder).
100
130
 
101
131
  **Error report (Patrón B esperado pero sección presente sin contenido)**:
102
132
  ```
103
- V4.a FAILED: sin temas declarados pero sección "## 4.4 Vista por tema" presente
133
+ V4.a FAILED: sin temas declarados pero sección "## 4.1 Mapping" presente
104
134
  themes: []
105
135
  acción: omitir sección cuando no hay temas (no dejar placeholder)
106
136
  ```
107
137
 
108
- ### V4.b — Code scan skip (`## 5`)
138
+ ### V4.b — Code scan skip (`## 6`)
109
139
 
110
- - **Patrón A — escaneo ejecutado**: sección 5 contiene resumen con counts (`X críticos · Y medios · Z bajos`).
111
- - **Patrón B — `--skip-code-scan`**: sección 5 contiene **nota inline explícita** `_(Escaneo omitido por --skip-code-scan)_` y no hay tabla de hallazgos.
140
+ - **Patrón A — escaneo ejecutado**: sección 6 contiene resumen con counts (`X críticos · Y medios · Z bajos`).
141
+ - **Patrón B — `--skip-code-scan`**: sección 6 contiene **nota inline explícita** `_(Escaneo omitido por --skip-code-scan)_` y no hay tabla de hallazgos.
112
142
 
113
143
  **Error report (Patrón B esperado pero tabla presente)**:
114
144
  ```
115
- V4.b FAILED: --skip-code-scan declarado pero sección 5 tiene tabla de hallazgos
145
+ V4.b FAILED: --skip-code-scan declarado pero sección 6 tiene tabla de hallazgos
116
146
  args: --skip-code-scan
117
147
  acción: reemplazar tabla por nota inline
118
148
  ```
@@ -129,17 +159,32 @@ V4.c FAILED: sesiones activas detectadas pero no marcadas con ⚠
129
159
  acción: marcar con ⚠ en tabla y documentar motivo en columna Resumen
130
160
  ```
131
161
 
132
- ## V5Header bien formado
162
+ ### V4.dCategorías SQL vacías
163
+
164
+ - **Patrón A — categoría con contenido**: archivo `0X-*.sql` presente al root + referencia en §4 del README.
165
+ - **Patrón B — categoría vacía**: archivo `0X-*.sql` **ausente** + comando psql correspondiente **omitido** del bloque de §4 (no aparece línea con archivo inexistente).
166
+
167
+ **Error report (Patrón B con referencia)**:
168
+ ```
169
+ V4.d FAILED: categoría 03-DML vacía pero referenciada en §4
170
+ corpus_dml_count: 0
171
+ archivo presente: false
172
+ referencia README: línea 88 → "psql ... -f 03-DML.sql"
173
+ acción: omitir comando psql cuando la categoría está vacía
174
+ ```
175
+
176
+ ## V5 — Header del README bien formado
133
177
 
134
178
  **Severidad**: warning.
135
179
 
136
- **Checks** (líneas 1-5 del `manifest.md`):
137
- - Línea 1: `# Informe del bundle NNN — <YYYY-MM-DD>` con NNN reemplazado.
180
+ **Checks** (líneas 1-7 del `README.md`):
181
+
182
+ - Línea 1: `# Bundle export-scripts NNN — <YYYY-MM-DD>` con NNN reemplazado.
138
183
  - Línea 3: `- **Rama actual:** \`<nombre-rama>\``
139
184
  - Línea 4: `- **Rama destino:** \`certificacion\``
140
185
  - Línea 5: `- **Sesiones incluidas:** <N>`
141
186
  - Línea 6: `- **Readiness:** 🟢 verde | 🟡 amarillo | 🔴 rojo` (una sola opción seleccionada).
142
- - Línea 7: `- **Generado por:** agent-workflow · skill \`export-scripts\``
187
+ - Línea 7: `- **Generado por:** agent-workflow · skill \`export-scripts\` v4.0.0`
143
188
 
144
189
  **Error report (warning)**:
145
190
  ```
@@ -154,11 +199,11 @@ V5 WARNING: header incompleto o malformado
154
199
 
155
200
  **Severidad**: warning.
156
201
 
157
- **Checks**: cada link en cualquier sección del manifest apunta a un path existente en filesystem al momento de generar.
202
+ **Checks**: cada link en cualquier sección del README apunta a un path existente en filesystem al momento de generar.
158
203
 
159
204
  **Cómo validar**:
160
205
  ```bash
161
- grep -Eo '`[^`]+\.(md|sql)`|\[.+?\]\([^)]+\)' manifest.md | \
206
+ grep -Eo '`[^`]+\.(md|sql)`|\[.+?\]\([^)]+\)' README.md | \
162
207
  sed -E 's/^`(.+)`$/\1/; s/^\[.+?\]\((.+)\)$/\1/' | \
163
208
  while read p; do
164
209
  if [ ! -e "$p" ] && [ ! -e "<output_dir>/$p" ]; then echo "MISSING: $p"; fi
@@ -171,16 +216,16 @@ grep -Eo '`[^`]+\.(md|sql)`|\[.+?\]\([^)]+\)' manifest.md | \
171
216
  ```
172
217
  V6 WARNING: 2 referencias apuntan a paths inexistentes
173
218
  - docs/decisiones/005-tipos-cobranza.md → no existe en workspace
174
- - por-sesion/session999/01-ddl-tablas/ → no existe en output dir
175
- acción sugerida: corregir paths o omitir referencias placeholder
219
+ - 03-DML.sql → no existe en output dir (categoría vacía)
220
+ acción sugerida: corregir paths u omitir referencias a categorías vacías
176
221
  ¿continuar de todas formas? (s/n)
177
222
  ```
178
223
 
179
224
  ## Orden de aplicación
180
225
 
181
- 1. V1 (estructura del bundle) — primero, barato.
182
- 2. V3 (secciones del manifest) — segundo, barato.
183
- 3. V2 (noise vetado) — tercero, requiere lectura del body.
226
+ 1. V1 (estructura del bundle, anti-redundancia layout) — primero, barato.
227
+ 2. V3 (secciones del README) — segundo, barato.
228
+ 3. V2 (noise vetado + redundancia v3.x en prosa) — tercero, requiere lectura del body.
184
229
  4. V4 (condicionales) — cuarto, requiere reconstruir contexto de flags + corpus.
185
230
  5. V5 (header) — quinto.
186
231
  6. V6 (referencias resolubles) — último.
@@ -198,23 +243,26 @@ Al final del flujo, el skill devuelve:
198
243
  "ok": true,
199
244
  "output_dir": "docs/scripts/NNN-export-scripts-YYYY-MM-DD/",
200
245
  "files_written": [
201
- "manifest.md", "README.md", "ORDER.md", "rollback-global.sql",
202
- "por-sesion/session057-export-func/...",
203
- "por-sesion/session058-export-arq/...",
204
- "por-tema/tema-rbac/01-ddl-tablas.sql",
246
+ "README.md",
247
+ "00-ROLLBACK.sql",
248
+ "01-DDL-TABLES.sql",
249
+ "02-DDL-FUNCTIONS.sql",
250
+ "04-INSERTS.sql",
251
+ "por-tema/tema-rbac/01-DDL-TABLES.sql",
205
252
  "..."
206
253
  ],
254
+ "categories_empty": ["03-DML"],
207
255
  "themes_resolved": ["rbac", "lista-negra-blanca"],
208
256
  "sessions_included": ["057", "058", "059", "060"],
209
257
  "validations": {
210
- "V1": { "status": "pass" },
211
- "V2": { "status": "pass", "noise_hits": 0 },
258
+ "V1": { "status": "pass", "forbidden_artifacts": 0 },
259
+ "V2": { "status": "pass", "noise_hits": 0, "v3_legacy_refs": 0 },
212
260
  "V3": { "status": "pass", "sections_found": 10 },
213
- "V4": { "status": "pass", "conditionals": { "por_tema": "presente (2 temas)", "code_scan": "ejecutado", "sesiones_abiertas": "0" } },
261
+ "V4": { "status": "pass", "conditionals": { "mapping_tema": "presente (2 temas)", "code_scan": "ejecutado", "sesiones_abiertas": "0", "categorias_vacias": "1 (03-DML)" } },
214
262
  "V5": { "status": "pass" },
215
263
  "V6": { "status": "warning", "missing_refs": ["docs/decisiones/005-...md"] }
216
264
  },
217
- "summary": "Bundle escrito. 1 warning (V6) aceptado."
265
+ "summary": "Bundle escrito (layout v4.0.0). 1 warning (V6) aceptado."
218
266
  }
219
267
  ```
220
268
 
@@ -224,8 +272,8 @@ Si hard-fail:
224
272
  {
225
273
  "ok": false,
226
274
  "stage": "validation",
227
- "failed_at": "V3",
228
- "details": "secciones obligatorias faltantes: ## 5. Código fuente hallazgos del escaneo",
275
+ "failed_at": "V1",
276
+ "details": "estructura v3.x detectada: por-sesion/ presente. El generador no debería emitir ese sub-dir desde v4.0.0.",
229
277
  "no_files_written": true
230
278
  }
231
279
  ```
@@ -234,9 +282,9 @@ Si hard-fail:
234
282
 
235
283
  | Validación | export-arq | export-scripts |
236
284
  |---|---|---|
237
- | V1 | estructura de secciones por `--scope` | estructura del bundle (archivos + sub-dirs) |
238
- | V2 | noise interno (~25 términos) | noise + placeholders (~45 términos) |
239
- | V3 | secciones por scope | 10 secciones fijas del manifest |
240
- | V4 | Modelo de datos + Decisiones condicionales | Vista por tema + code-scan skip + sesiones abiertas |
241
- | V5 | header con snapshot + fuentes + diagrams engine | header con rama + readiness + counts |
242
- | V6 | referencias resolubles | referencias resolubles |
285
+ | V1 | estructura de secciones por `--scope` | estructura del bundle (archivos al root + sub-dirs opt-in) + anti-redundancia v4.0.0 |
286
+ | V2 | noise interno (~25 términos) | noise + placeholders + referencias residuales al layout v3.x |
287
+ | V3 | secciones por scope | 10 secciones fijas del README único |
288
+ | V4 | Modelo de datos + Decisiones condicionales | Mapping tema + code-scan skip + sesiones abiertas + categorías vacías |
289
+ | V5 | header con snapshot + fuentes + diagrams engine | header con rama + readiness + counts + versión skill |
290
+ | V6 | referencias resolubles | referencias resolubles (incl. archivos de categoría skipped) |
@@ -1,14 +1,14 @@
1
1
  ---
2
2
  name: sql-rollback-generator
3
- description: "Genera rollback **post-hoc** desde SCRIPTS.sql consolidado (v1.0.0 BREAKING — F-D session062): cuando /agent-workflow:export-scripts separa el bundle, este skill produce `.rollback.sql` por sentencia forward + `rollback-global.sql` encadenado en orden inverso (04→03→02→01). Cubre DDL (DROP IF EXISTS), migraciones con backup en esq_audit, e inserts. Marca operaciones irreversibles (DROP COLUMN, TRUNCATE, DROP CASCADE) con header WARNING. BREAKING desde v1.0.0: deja de generar rollbacks durante exec por archivo; la generación ocurre exclusivamente al exportar."
4
- version: 1.0.0
3
+ description: "Genera rollback **post-hoc** desde SCRIPTS.sql consolidado (v2.0.0 BREAKING — session093): cuando /agent-workflow:export-scripts produce el bundle, este skill emite un único archivo `00-ROLLBACK.sql` al root del bundle, encadenado cross-session en orden inverso (última sesión → primera, 04→03→02→01 dentro de cada una). NO genera `.rollback.sql` companions por sentencia ni `<session>/rollback/` per-sesión (ambos eliminados desde v2.0.0). Cubre DDL (DROP IF EXISTS), migraciones con backup en esq_audit, e inserts. Marca operaciones irreversibles (DROP COLUMN, TRUNCATE, DROP CASCADE) con header WARNING en bloque separado al final del archivo, después del `COMMIT;`."
4
+ version: 2.0.0
5
5
  ---
6
6
 
7
- # SQL Rollback Generator (v1.0.0 — on-export)
7
+ # SQL Rollback Generator (v2.0.0 — `00-ROLLBACK.sql` único cross-session)
8
8
 
9
- Generación de rollbacks **post-hoc** desde el archivo único `SCRIPTS.sql` de cada sesión. Disparado por `/agent-workflow:export-scripts` v3.0.0+ al producir el bundle de release.
9
+ Generación de rollback **post-hoc** desde los archivos `SCRIPTS.sql` de las sesiones incluidas en el bundle de export. Disparado por `/agent-workflow:export-scripts` v4.0.0+ al consolidar el bundle.
10
10
 
11
- > **BREAKING desde v1.0.0**: este skill ya NO genera `.rollback.sql` durante la sesión. La política previa "on-write per archivo" (v0.x) generaba un rollback acoplado por cada forward; la política nueva "on-export" agrupa la generación al consolidar el bundle. Razón: el flujo SQL durante exec ahora es un único `SCRIPTS.sql` (ver `sql-script-organizer` v1.0.0); no hay archivos individuales que parear con rollbacks. Layouts legacy se migran con `/agent-workflow:migrate --upgrade-topology`.
11
+ > **BREAKING desde v2.0.0**: este skill ya NO produce companions `.rollback.sql` por sentencia ni sub-carpetas `<session>/rollback/` per-sesión (comportamiento v1.0.0 eliminado). El output canónico es un único `00-ROLLBACK.sql` al root del bundle. Razón: el bundle se ejecuta atomic (todo o nada) múltiples archivos rollback agregaban ruido sin valor operacional. Layouts v1.0.0 quedan como histórico; bundles generados con export-scripts v3.x no se reescriben.
12
12
 
13
13
  ## When to use
14
14
 
@@ -20,45 +20,66 @@ Generación de rollbacks **post-hoc** desde el archivo único `SCRIPTS.sql` de c
20
20
 
21
21
  Reglas en `../session/references/sandbox-readonly-rules.md`. En plan mode describir estrategia por sentencia forward (sin crear `.rollback.sql`); irreversibles se anotan para revisión.
22
22
 
23
- ## Principios (v1.0.0)
23
+ ## Principios (v2.0.0)
24
24
 
25
25
  - **Input**: `SCRIPTS.sql` de cada sesión incluida en el corpus de export, parseado vía markers `@category`/`@stmt` (ver `sql-script-organizer/references/scripts-sql-format.md`).
26
- - **Output**: archivos `.rollback.sql` ubicados junto al forward separado en el bundle export (`por-sesion/sessionXXX/<categoria>/NNN-*.rollback.sql`).
27
- - **Global**: `por-sesion/sessionXXX/rollback/00-rollback-global.sql` encadena los rollbacks en orden inverso (04 → 03 → 02 → 01), todo en `BEGIN; ... COMMIT;` único.
26
+ - **Output único**: `<bundle-root>/00-ROLLBACK.sql` un solo archivo cross-session al root del bundle.
27
+ - **NO se generan** companions `.rollback.sql` por sentencia (eliminado en v2.0.0).
28
+ - **NO se genera** sub-carpeta `<session>/rollback/` per-sesión (eliminado en v2.0.0).
29
+ - **NO se genera** `rollback-global.sql` separado del root (eliminado en v2.0.0).
30
+ - **Orden interno**: encadenado en orden inverso global — última sesión → primera; dentro de cada sesión 04 → 03 → 02 → 01.
31
+ - **Estructura del archivo**:
32
+ - Header del archivo: corpus + fecha + sesiones cubiertas + versión del CLI.
33
+ - Bloque transaccional único `BEGIN; ... COMMIT;` con sub-bloques por sesión.
34
+ - Cada sub-bloque preserva header canónico del rollback de su sentencia (Script / Sesion / Objeto / Alcance) como comentario.
35
+ - Bloque final **fuera de la transacción**: "Fase 5 — Cleanup irreversible" con header `-- WARNING: IRREVERSIBLE` listando operaciones que no son revertibles automáticamente (decisión manual del operador).
28
36
  - **Idempotencia obligatoria**: `DROP ... IF EXISTS`, `CREATE OR REPLACE`, `ON CONFLICT DO NOTHING`.
29
- - **Transacción obligatoria** en cada rollback individual.
30
- - **Header del rollback** reusa el del forward (4 líneas Script/Sesion/Objeto/Alcance) con `Objeto:` describiendo la reversa.
31
- - **Irreversibles** (DROP COLUMN, TRUNCATE, DROP CASCADE, datos sin backup) marcados con `-- WARNING: IRREVERSIBLE` debajo del header.
32
- - **Datos**: si el forward es UPDATE/DELETE masivo sin backup, generar un `000-backup-*.sql` previo en el bundle (Categoría 03-migracion) + rollback que restaure desde `esq_audit.tb_bkp_<x>_sNNN`.
37
+ - **Datos**: si el forward es UPDATE/DELETE masivo sin backup, generar un `000-backup-*.sql` previo en `03-DML.sql` del bundle + el rollback que restaura desde `esq_audit.tb_bkp_<x>_sNNN` vive dentro de `00-ROLLBACK.sql`.
33
38
 
34
- ## Header del rollback
39
+ ## Estructura del `00-ROLLBACK.sql`
35
40
 
36
- El `.rollback.sql` reusa el mismo formato canónico definido en `sql-script-organizer/SKILL.md#header-canónico`:
41
+ Header global del archivo:
37
42
 
38
43
  ```sql
39
44
  -- ============================================================================
40
- -- Script: NNN-tipo-objetivo.rollback.sql
41
- -- Sesion: sNNN
42
- -- Objeto: Revierte los cambios de NNN-tipo-objetivo.sql (<resumen de la reversa>).
43
- -- Alcance: <mismo alcance que el forward>
45
+ -- Script: 00-ROLLBACK.sql
46
+ -- Bundle: NNN-export-scripts-YYYY-MM-DD
47
+ -- Sesiones: sNNN, sNNN, ...
48
+ -- Objeto: Revierte el bundle completo en orden inverso (última sesión → primera, 04→01).
49
+ -- Alcance: <enumeración cross-session>
44
50
  -- ============================================================================
45
51
  ```
46
52
 
47
- - `Objeto:` describe la reversa, no el forward (ej. "Repone tb_x.cod_usuario al valor de esq_audit.tb_bkp_x_sNNN").
48
- - `Alcance:` repite literal el del forward para que quede explícito que la reversa cubre exactamente el mismo set.
49
- - Si el forward es irreversible, agregar **debajo del header** una línea suelta:
53
+ Sub-bloque por sentencia (dentro del `BEGIN; ... COMMIT;` único):
54
+
55
+ ```sql
56
+ -- ----------------------------------------------------------------------------
57
+ -- Rollback de sesion sNNN — <categoria>: NNN-tipo-objetivo
58
+ -- Objeto: <resumen de la reversa>
59
+ -- Alcance: <mismo alcance que el forward>
60
+ -- ----------------------------------------------------------------------------
61
+ DROP TABLE IF EXISTS esq_.tb_x;
62
+ -- ...
63
+ ```
64
+
65
+ - `Objeto:` del sub-bloque describe la reversa (ej. "Repone tb_x.cod_usuario al valor de esq_audit.tb_bkp_x_sNNN").
66
+ - `Alcance:` repite literal el del forward.
67
+
68
+ Bloque irreversibles al final del archivo (después del `COMMIT;`, **fuera de la transacción**):
69
+
70
+ ```sql
71
+ COMMIT;
50
72
 
51
- ```sql
52
- -- ============================================================================
53
- -- Script: ...
54
- -- Sesion: ...
55
- -- Objeto: ...
56
- -- Alcance: ...
57
- -- ============================================================================
58
- -- WARNING: IRREVERSIBLE — best-effort, ver DECISIONS.md DEC-NNN (legacy: DECISIONES.md).
59
- ```
73
+ -- ============================================================================
74
+ -- Fase 5 — Cleanup irreversible (manual)
75
+ -- WARNING: IRREVERSIBLE — best-effort. Ver DECISIONS.md de la sesión origen.
76
+ -- ============================================================================
77
+ -- sesion sNNN — DROP COLUMN esq_.tb_x.col_y (no hay backup automático)
78
+ -- sesion sMMM — TRUNCATE esq_.tb_z
79
+ -- ...
80
+ ```
60
81
 
61
- El bloque WARNING explica qué no se puede recuperar y referencia la decisión.
82
+ El bloque WARNING explica qué no se puede recuperar y referencia la decisión de la sesión donde se introdujo.
62
83
 
63
84
  ## Estrategias por tipo de operación
64
85
 
@@ -129,39 +150,33 @@ Protocolo:
129
150
 
130
151
  Lista completa en `references/irreversible-checklist.md`.
131
152
 
132
- ## Layout (post-export-scripts v3.0.0)
133
-
134
- ### Par acoplado
153
+ ## Layout (post-export-scripts v4.0.0)
135
154
 
136
- `export-scripts` produce los archivos separados desde SCRIPTS.sql y este skill genera el rollback junto a cada forward:
155
+ Output canónico un solo archivo al root del bundle:
137
156
 
138
157
  ```
139
- <docs>/scripts/NNN-export-scripts-YYYY-MM-DD/por-sesion/sessionXXX/01-ddl-tablas/
140
- ├── 001-crea-tb-x.sql (forward, derivado de @stmt en SCRIPTS.sql)
141
- └── 001-crea-tb-x.rollback.sql (rollback, generado por este skill)
158
+ <docs>/scripts/NNN-export-scripts-YYYY-MM-DD/
159
+ └── 00-ROLLBACK.sql # único rollback cross-session (este skill lo genera)
142
160
  ```
143
161
 
144
- ### Bundle global
162
+ Para context: el bundle plano del export incluye además `01-DDL-TABLES.sql`, `02-DDL-FUNCTIONS.sql`, `03-DML.sql`, `04-INSERTS.sql`, `README.md` — todos al root, generados por `export-scripts` (no por este skill).
145
163
 
146
- ```
147
- <docs>/scripts/NNN-export-scripts-YYYY-MM-DD/por-sesion/sessionXXX/rollback/
148
- ├── 00-rollback-global.sql (encadena todos 04→01 con BEGIN/COMMIT único)
149
- ├── 04-inserts-rollback.sql
150
- ├── 03-migracion-rollback.sql
151
- ├── 02-ddl-funciones-rollback.sql
152
- └── 01-ddl-tablas-rollback.sql
153
- ```
164
+ **No se generan** (eliminados desde v2.0.0):
165
+ - Companions `.rollback.sql` por sentencia.
166
+ - Sub-carpeta `<session>/rollback/` per-sesión.
167
+ - Archivo `rollback-global.sql` separado.
168
+ - Archivos `04-inserts-rollback.sql`, `03-migracion-rollback.sql`, etc. (categorías por separado).
154
169
 
155
- Layout pre-v1.0.0 (`scripts/bundle/...` dentro de la sesión durante exec) ya no se genera. Layouts legacy se migran con `/agent-workflow:migrate --upgrade-topology`.
170
+ Layouts v1.0.0 quedan como histórico en bundles ya generados (`docs/scripts/00X-export-scripts-*` previos). No se migran retroactivamente. Layouts legacy v0.x se migran con `/agent-workflow:migrate --upgrade-topology`.
156
171
 
157
- ## Proceso
172
+ ## Proceso (v2.0.0)
158
173
 
159
- 1. Leer el forward identificar tipo.
160
- 2. Clasificar seleccionar estrategia.
161
- 3. Generar rollback acoplado.
162
- 4. Verificar irreversibilidades warning + DECISIÓN + confirmación si aplica.
163
- 5. Actualizar bundle global.
164
- 6. Verificar cobertura antes de graduar.
174
+ 1. Parsear todos los `SCRIPTS.sql` del corpus de export (markers `@category`/`@stmt`).
175
+ 2. Para cada sentencia forward, clasificar el tipo y seleccionar estrategia (DDL / migración / inserts / irreversible).
176
+ 3. Generar el bloque rollback correspondiente — sin escribir todavía a disco.
177
+ 4. Identificar irreversibles moverlos al bloque "Fase 5" final.
178
+ 5. Componer el `00-ROLLBACK.sql` único con orden inverso global (última sesión → primera, 04→01) + bloque "Fase 5" al final.
179
+ 6. Escribir el archivo único al root del bundle.
165
180
 
166
181
  ## Notas de portabilidad (PostgreSQL como motor primario)
167
182
 
@@ -176,19 +191,19 @@ Si el destino no es Postgres, indicarlo en `Objeto:` o como nota libre debajo de
176
191
 
177
192
  ## Graduación al cierre
178
193
 
179
- `rollback/` viaja junto al bundle forward bajo `docs/scripts/NNN-sessionXXX-nombre/rollback/`.
194
+ Este skill **NO se invoca al cerrar una sesión**. La graduación de scripts de una sesión individual produce `docs/scripts/NNN-sessionXXX-nombre/` con el `SCRIPTS.sql` curado; el rollback consolidado vive **exclusivamente en el bundle de export** (`docs/scripts/NNN-export-scripts-YYYY-MM-DD/00-ROLLBACK.sql`).
180
195
 
181
- ## Modo release (cross-session + por tema)
196
+ ## Modo release (LEGACY deprecation Fase 1)
182
197
 
183
- `release` y `release-scripts` invocan este skill para producir rollback global del release y rollback por tema. Algoritmo detallado (3 niveles, principios, qué NO hacer, verificación) en **`references/release-rollback.md`**.
198
+ `release` y `release-scripts` (legacy en deprecation Fase 1) consumían el algoritmo v1.0.0 (companions `.rollback.sql` + per-sesión rollback + global). Ese código y output **no se actualizan a v2.0.0**: se conserva como histórico en `references/release-rollback.md` mientras los workspaces dejan de invocarlos. El reemplazo canónico es `/agent-workflow:export-scripts` v4.0.0+ que invoca este skill en v2.0.0.
184
199
 
185
200
  ## Integración con otros skills
186
201
 
187
- - **`sql-script-organizer`** — companion: organiza el bundle forward y coordina rollbacks. En modo release, provee bundle consolidado.
188
- - **`release`** — consume rollback global de release.
189
- - **`release-scripts`** — consume rollback por tema.
202
+ - **`sql-script-organizer`** — companion: organiza el `SCRIPTS.sql` por sesión que este skill consume al exportar.
203
+ - **`export-scripts`** v4.0.0+ único invocador activo de este skill (genera `00-ROLLBACK.sql` único).
204
+ - **`release`** / **`release-scripts`** — legacy en deprecation Fase 1; consumen `references/release-rollback.md` (no se actualiza).
190
205
  - **`coding-standards`** — reglas de estilo SQL en `database-conventions.md#estilo-de-scripts-sql`.
191
- - **`session`** — Fase 3 invoca este skill junto a `sql-script-organizer` al escribir el primer `.sql`.
206
+ - **`session`** — este skill NO se invoca al cerrar una sesión individual; sólo desde export-scripts.
192
207
 
193
208
  ## Recursos adicionales
194
209
 
@@ -1,6 +1,8 @@
1
- # Rollback global de release y por tema
1
+ # Rollback global de release y por tema (LEGACY — deprecation Fase 1)
2
2
 
3
- Algoritmos detallados para rollbacks consolidados en modo release. El SKILL.md tiene el resumen; este archivo tiene el procedimiento completo paso a paso.
3
+ > **Estado**: legacy. Aplica solo a `release` / `release-scripts` legacy (deprecation Fase 1). El reemplazo canónico es `/agent-workflow:export-scripts` v4.0.0+, que produce un único `00-ROLLBACK.sql` cross-session al root del bundle (algoritmo en `SKILL.md` v2.0.0).
4
+
5
+ Algoritmos detallados para rollbacks consolidados en modo release legacy. El SKILL.md tiene el resumen; este archivo tiene el procedimiento completo paso a paso.
4
6
 
5
7
  ## Rollback global de release (cross-session)
6
8
 
@@ -210,11 +210,13 @@ COMMIT;
210
210
 
211
211
  ---
212
212
 
213
- ## Bundle global (`00-rollback-global.sql`)
213
+ ## Bloque rollback de una sesión dentro de `00-ROLLBACK.sql`
214
214
 
215
215
  ```sql
216
- -- ROLLBACK GLOBAL — sessionXXX-[nombre]
217
- -- Revierte TODOS los cambios en orden inverso. Ejecutar sólo para deshacer la sesión completa.
216
+ -- ----------------------------------------------------------------------------
217
+ -- ROLLBACK de sessionXXX-[nombre] — revierte los cambios en orden inverso.
218
+ -- Forma parte del 00-ROLLBACK.sql cross-session del bundle.
219
+ -- ----------------------------------------------------------------------------
218
220
  BEGIN;
219
221
 
220
222
  -- Paso 4 invertido: deshacer inserts
@@ -143,27 +143,27 @@ Cada sección del cuerpo se introduce con una línea de comentario corta envuelt
143
143
 
144
144
  El usuario revisa el SCRIPTS.sql periódicamente; la separación 01-04 final y la verificación de dependencias cruzadas la hace `/agent-workflow:export-scripts` post-hoc.
145
145
 
146
- ## Layout del bundle (post-export-scripts v3.0.0)
146
+ ## Layout del bundle (post-export-scripts v4.0.0)
147
147
 
148
- `/agent-workflow:export-scripts` produce el bundle al ejecutarse, no este skill:
148
+ `/agent-workflow:export-scripts` v4.0.0+ produce el bundle al ejecutarse, no este skill. Layout plano cross-session al root:
149
149
 
150
150
  ```
151
- <docs>/scripts/NNN-export-scripts-YYYY-MM-DD/por-sesion/sessionXXX-nombre/
152
- ├── README.md (generado por export-scripts)
153
- ├── 01-ddl-tablas/
154
- ├── 001-crea-tb-x.sql (derivado de @stmt: 001-crea-tb-x)
155
- │ └── ...
156
- ├── 02-ddl-funciones/
157
- ├── 03-migracion/
158
- │ ├── 000-backup-tb-x.sql (auto-generado por sql-rollback-generator si UPDATE/DELETE masivo)
159
- └── ...
160
- ├── 04-inserts/
161
- └── rollback/
162
- ├── 00-rollback-global.sql (encadenado 04→03→02→01)
163
- └── NNN-*.rollback.sql (1 por @stmt forward)
151
+ <docs>/scripts/NNN-export-scripts-YYYY-MM-DD/
152
+ ├── 00-ROLLBACK.sql (único rollback cross-session — sql-rollback-generator v2.0.0)
153
+ ├── 01-DDL-TABLES.sql (consolidado cross-session, skip si vacío)
154
+ ├── 02-DDL-FUNCTIONS.sql (idem)
155
+ ├── 03-DML.sql (UPDATE/DELETE/migración + backup en esq_audit cuando aplica)
156
+ ├── 04-INSERTS.sql (idem)
157
+ ├── README.md (único informe + índice + how-to-execute)
158
+ └── por-tema/ (opt-in capa adicional encima del root)
159
+ └── tema-<slug>/01-04-*.sql
164
160
  ```
165
161
 
166
- Layout **legacy** pre-v1.0.0 (`scripts/01-04/*.sql + .rollback.sql` directo en sesión) ya **no se genera**; sesiones nuevas usan SCRIPTS.sql. Layouts legacy en sesiones cerradas se migran con `/agent-workflow:migrate --upgrade-topology`.
162
+ Sentencias individuales del `SCRIPTS.sql` per-sesión se consolidan **cross-session** al archivo de su categoría no se crea sub-carpeta por sesión.
163
+
164
+ Layout **v3.x** (`por-sesion/<sessionXXX>/01-04/*.sql + .rollback.sql` companions + per-sesión `rollback/`) ya **no se genera** desde v4.0.0. Bundles ya escritos con v3.x quedan como histórico.
165
+
166
+ Layout **legacy** pre-SCRIPTS.sql (`scripts/01-04/*.sql + .rollback.sql` directo en sesión) tampoco se genera; sesiones nuevas usan SCRIPTS.sql. Layouts legacy en sesiones cerradas se migran con `/agent-workflow:migrate --upgrade-topology`.
167
167
 
168
168
  ## Graduación al cierre (vía `/agent-workflow:release`)
169
169