@saulwade/swl-ses 1.9.0 → 2.1.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 (142) hide show
  1. package/CLAUDE.md +196 -196
  2. package/README.md +579 -579
  3. package/agentes/_propose-step.md +90 -0
  4. package/agentes/accesibilidad-wcag-swl.md +3 -3
  5. package/agentes/auto-evolucion-swl.md +908 -908
  6. package/agentes/disenador-ui-swl.md +6 -5
  7. package/agentes/frontend-angular-swl.md +2 -2
  8. package/agentes/frontend-css-swl.md +2 -2
  9. package/agentes/frontend-react-swl.md +4 -4
  10. package/agentes/frontend-swl.md +6 -6
  11. package/agentes/implementador-swl.md +2 -0
  12. package/agentes/investigador-ux-swl.md +5 -5
  13. package/agentes/orquestador-swl.md +9 -7
  14. package/agentes/perfilador-usuario-swl.md +321 -308
  15. package/agentes/producto-prd-swl.md +1 -1
  16. package/agentes/red-team-swl.md +218 -218
  17. package/agentes/tdd-qa-swl.md +17 -1
  18. package/bin/swl-ses.js +1 -1
  19. package/comandos/swl/actualizar.md +1 -1
  20. package/comandos/swl/aprender.md +2 -2
  21. package/comandos/swl/aprobar-plan.md +153 -0
  22. package/comandos/swl/ayuda.md +3 -3
  23. package/comandos/swl/briefing.md +122 -0
  24. package/comandos/swl/compactar.md +29 -2
  25. package/comandos/swl/discutir-fase.md +23 -2
  26. package/comandos/swl/ejecutar-fase.md +59 -6
  27. package/comandos/swl/evolucionar.md +1 -1
  28. package/comandos/swl/inbox.md +1 -1
  29. package/comandos/swl/instalar.md +1 -1
  30. package/comandos/swl/nemesis.md +1 -1
  31. package/comandos/swl/planear-fase.md +19 -1
  32. package/comandos/swl/plugins.md +1 -1
  33. package/comandos/swl/release.md +47 -1
  34. package/comandos/swl/status.md +348 -0
  35. package/comandos/swl/verificar.md +27 -1
  36. package/habilidades/ai-runtime-security/SKILL.md +1 -1
  37. package/habilidades/auto-evolucion-protocolo/SKILL.md +276 -276
  38. package/habilidades/benchmark-memoria/SKILL.md +1 -1
  39. package/habilidades/calidad-contract-testing/SKILL.md +165 -0
  40. package/habilidades/changelog-generator/SKILL.md +9 -2
  41. package/habilidades/changelog-generator/scripts/parse-commits.js +13 -1
  42. package/habilidades/diagrama-arquitectura/SKILL.md +1 -1
  43. package/habilidades/drift-detection/SKILL.md +179 -179
  44. package/habilidades/ejecutar-fase/SKILL.md +541 -468
  45. package/habilidades/estructura-proyecto-claude/SKILL.md +17 -14
  46. package/habilidades/estructura-proyecto-claude/recursos/configuracion-y-extensiones.md +34 -23
  47. package/habilidades/estructura-proyecto-claude/recursos/frontmatter-y-hooks-referencia.md +70 -53
  48. package/habilidades/estructura-proyecto-claude/recursos/mcp-json-template.json +57 -77
  49. package/habilidades/extractor-de-aprendizajes/SKILL.md +9 -5
  50. package/habilidades/harness-claude-code/SKILL.md +10 -7
  51. package/{reglas/harness-claude-code.md → habilidades/harness-claude-code/recursos/disciplina-harness-regla.md} +2 -2
  52. package/habilidades/instalar-sistema/SKILL.md +3 -3
  53. package/habilidades/meta-skills-estandar/recursos/frameworks-seguridad.md +1 -1
  54. package/habilidades/perfil-usuario/SKILL.md +200 -200
  55. package/habilidades/planear-fase/SKILL.md +26 -4
  56. package/habilidades/proceso-ddia-fundamentos/SKILL.md +1 -1
  57. package/habilidades/proceso-ddia-streaming/SKILL.md +4 -4
  58. package/habilidades/proceso-debate-adversarial/SKILL.md +2 -2
  59. package/habilidades/protocolo-revision-swl/SKILL.md +1 -1
  60. package/habilidades/seguridad-skills-ia/SKILL.md +1 -1
  61. package/habilidades/swl-claudemd/SKILL.md +50 -210
  62. package/habilidades/swl-claudemd/recursos/contrato-aprender.md +83 -0
  63. package/habilidades/swl-claudemd/recursos/duplicacion-reglas-globales.md +85 -0
  64. package/habilidades/swl-claudemd/recursos/plantillas-init.md +94 -0
  65. package/habilidades/swl-dashboard/SKILL.md +9 -9
  66. package/habilidades/swl-revisar-impacto/SKILL.md +1 -1
  67. package/habilidades/tdd-workflow/SKILL.md +715 -673
  68. package/habilidades/validacion-ci-sistema/SKILL.md +20 -4
  69. package/hooks/calidad-pre-commit.js +344 -3
  70. package/hooks/check-update.js +39 -1
  71. package/hooks/ciclo-evolucion-subagente.js +26 -0
  72. package/hooks/ciclo-evolucion.js +26 -0
  73. package/hooks/extraccion-aprendizajes.js +13 -0
  74. package/hooks/lib/autonomia.js +208 -0
  75. package/hooks/lib/briefing.js +474 -0
  76. package/hooks/lib/ciclo-evolucion.js +47 -0
  77. package/hooks/{auto-evolucion.js → lib/etapa-auto-evolucion.js} +701 -700
  78. package/hooks/{metricas-evolucion.js → lib/etapa-metricas.js} +388 -376
  79. package/hooks/{actualizar-perfil-usuario.js → lib/etapa-perfil-usuario.js} +376 -364
  80. package/hooks/lib/evolution-tracker.js +24 -3
  81. package/hooks/lib/propose-step.js +357 -0
  82. package/hooks/session-briefing.js +98 -0
  83. package/hooks/spec-gate.js +211 -0
  84. package/hooks/tdd-gate.js +241 -0
  85. package/hooks/telemetria-skill-routing.js +100 -0
  86. package/hooks/validar-intent-spec.js +30 -10
  87. package/instintos/autonomia.yaml +27 -0
  88. package/llms.txt +6 -6
  89. package/manifiestos/hooks-config.json +44 -17
  90. package/manifiestos/modulos.json +40 -15
  91. package/manifiestos/skills-lock.json +64 -57
  92. package/package.json +93 -93
  93. package/plugin.json +371 -375
  94. package/reglas/accesibilidad.md +10 -0
  95. package/reglas/analizar-directorios-antes-de-escribir.md +228 -0
  96. package/reglas/api-diseno.md +9 -0
  97. package/reglas/auditorias-documentales-estructurales.md +7 -0
  98. package/reglas/cloud-infra.md +8 -0
  99. package/reglas/consultar-vault-primero.md +195 -0
  100. package/reglas/debatir-antes-de-aceptar.md +158 -0
  101. package/reglas/fragmentos-compartidos.md +5 -0
  102. package/reglas/git-coauthor.md +100 -0
  103. package/reglas/gobernanza.md +4 -4
  104. package/reglas/hooks.md +6 -0
  105. package/reglas/intent-engineering.md +4 -0
  106. package/reglas/markitdown.md +8 -0
  107. package/reglas/memoria-consolidada.md +1 -1
  108. package/reglas/monitor-ci.md +309 -0
  109. package/reglas/patrones.md +6 -0
  110. package/reglas/registro-componentes-nuevos.md +39 -2
  111. package/reglas/seguridad-agentes.md +1 -1
  112. package/reglas/sesiones-paralelas.md +180 -0
  113. package/reglas/skills-estandar.md +6 -0
  114. package/reglas/testing.md +7 -0
  115. package/reglas/tests-cleanup.md +4 -0
  116. package/reglas/usar-code-review-graph.md +155 -0
  117. package/reglas/usar-sistema-swl.md +1 -1
  118. package/reglas/verificar-citas-normativas.md +548 -0
  119. package/scripts/instalador.js +52 -6
  120. package/scripts/lib/ci-reader.js +193 -0
  121. package/scripts/lib/detectar-host-swl.js +175 -0
  122. package/scripts/lib/evidencia-release.js +322 -0
  123. package/scripts/lib/gate-hooks-requires.js +249 -0
  124. package/scripts/lib/gate-licencias.js +212 -0
  125. package/scripts/lib/git-metricas.js +257 -0
  126. package/scripts/lib/gitignore-manifest.js +29 -1
  127. package/scripts/lib/metricas-dora.js +204 -0
  128. package/scripts/lib/plan-lock.js +275 -0
  129. package/scripts/migrar-fase-dominio.js +0 -1
  130. package/scripts/tui/ejecutores.js +1 -1
  131. package/scripts/validar-manifest.js +92 -1
  132. package/scripts/verificar-evolucion.js +54 -4
  133. package/scripts/verificar-release.js +102 -0
  134. package/scripts/verificar-trazabilidad.js +298 -0
  135. package/agentes/ux-disenador-swl.md +0 -503
  136. package/comandos/swl/dashboard.md +0 -146
  137. package/comandos/swl/evolucion-estado.md +0 -191
  138. package/comandos/swl/metricas.md +0 -376
  139. package/comandos/swl/salud.md +0 -481
  140. package/reglas/arquitectura.evolved.json +0 -7
  141. package/reglas/seguridad.evolved.json +0 -7
  142. package/reglas/verificar-citas-temporales.md +0 -139
@@ -0,0 +1,153 @@
1
+ ---
2
+ name: swl:aprobar-plan
3
+ description: Aprueba el PLAN.md de una fase y lo firma con un lock SHA256 (gate G1 de SDD). Transiciona el frontmatter de estado borrador a aprobado y escribe .planning/locks/<plan>.lock. Es la única vía válida de aprobación — ejecutar-fase verifica este lock antes de implementar y detiene la ejecución si el plan fue mutado tras la firma.
4
+ allowed_tools: ["Read", "Write", "Edit", "Bash", "Glob"]
5
+ ---
6
+
7
+ # /swl:aprobar-plan <n> — Aprobar y firmar el plan de una fase (Gate G1)
8
+
9
+ Eres el guardián del gate G1 del enforcement SDD. Tu trabajo es transicionar un
10
+ PLAN de `borrador` a `aprobado` Y firmarlo con un lock SHA256, de modo que
11
+ cualquier mutación posterior del plan sea detectable por `/swl:ejecutar-fase`.
12
+
13
+ Este comando es la **única vía documentada de aprobación**. Editar el frontmatter
14
+ a mano (`estado: aprobado`) deja el plan en modo legacy (cláusula de gracia D-05):
15
+ se ejecuta con advertencia pero sin protección de integridad. Usar este comando
16
+ es lo que activa el gate real.
17
+
18
+ ## Uso
19
+
20
+ ```
21
+ /swl:aprobar-plan 9
22
+ ```
23
+
24
+ El argumento `<n>` es el número de la fase cuyo PLAN se aprueba.
25
+
26
+ ## Paso 1 — Localizar el PLAN
27
+
28
+ Resuelve la ruta `.planning/fases/0N-PLAN.md` (N con cero a la izquierda si N < 10).
29
+
30
+ - Si no existe: detente con "No existe el PLAN de la fase N. Ejecuta `/swl:planear-fase N` primero."
31
+ - Lee el archivo completo.
32
+
33
+ ## Paso 2 — Validar el estado actual del frontmatter
34
+
35
+ Lee el campo `estado:` del frontmatter:
36
+
37
+ - Si `estado: borrador` → continúa al Paso 3 (caso normal).
38
+ - Si `estado: aprobado` → ya está aprobado. Verifica si existe el lock:
39
+ ```bash
40
+ node -e "const {verificarPlan}=require('./scripts/lib/plan-lock'); console.log(JSON.stringify(verificarPlan('.planning/fases/0N-PLAN.md')))"
41
+ ```
42
+ - Si `modo: "firmado"` → informa "El plan ya está aprobado y firmado." y termina.
43
+ - Si `modo: "legacy"` (aprobado sin lock) → pregunta al usuario: "El plan está
44
+ aprobado pero sin firmar (modo legacy). ¿Lo firmo ahora para activar el gate
45
+ G1?" Si confirma, salta al Paso 4 (firmar sin re-transicionar).
46
+ - Si `modo: "mutado"` → el plan cambió tras una firma previa. Informa el
47
+ `hashEsperado` vs `hashActual` y pregunta si re-aprobar (re-firmar el estado
48
+ actual). Procede solo con confirmación explícita.
49
+ - Si no hay campo `estado` → detente: "El PLAN no tiene campo `estado` en el
50
+ frontmatter. Revisa que sea un plan válido generado por `/swl:planear-fase`."
51
+
52
+ ## Paso 2.5 — Validar la matriz REQ×T (trazabilidad G4)
53
+
54
+ Lee `.planning/fases/0N-CONTEXTO.md` y extrae los IDs `REQ-NN:` (fases 01-11) o
55
+ `REQ-<fase>-NN:` (namespaceados, fases ≥12) de la sección de criterios de
56
+ aceptación. `verificar-trazabilidad.js` reconoce ambos formatos.
57
+
58
+ - **CONTEXTO sin REQ-IDs** (fases legacy 01-09): advertencia informativa
59
+ ("CONTEXTO sin REQ-IDs — trazabilidad no exigible, gracia legacy") y continúa.
60
+ - **CONTEXTO con REQ-IDs**: verifica que el PLAN cubra TODOS:
61
+ ```bash
62
+ node scripts/verificar-trazabilidad.js --fase=N --solo-plan
63
+ ```
64
+ - Exit 0 → continúa al Paso 3.
65
+ - Exit 1 (REQ huérfanos) → **RECHAZA la aprobación**. Lista los REQ sin tarea y
66
+ remite a `/swl:planear-fase N` para cubrirlos (o a retirar el REQ del CONTEXTO
67
+ con marca "RETIRADO — razón"). NO firmes un plan con REQ huérfanos.
68
+
69
+ ## Paso 3 — Confirmar con el usuario antes de aprobar
70
+
71
+ NUNCA apruebes sin confirmación explícita. Presenta un resumen breve del plan
72
+ (número de slices, tareas, slices HITL) y pregunta:
73
+
74
+ ```
75
+ El plan de la fase N tiene [X] slices y [Y] tareas ([Z] HITL).
76
+ ¿Confirmas la aprobación? Al aprobar se firma con SHA256 y queda inmutable:
77
+ cualquier edición posterior detendrá /swl:ejecutar-fase.
78
+ ```
79
+
80
+ Espera respuesta afirmativa. Si el usuario pide cambios, NO apruebes — remítelo
81
+ a `/swl:planear-fase N` para refinar.
82
+
83
+ ## Paso 4 — Transicionar y firmar
84
+
85
+ 1. **Transicionar** (omitir si el plan ya estaba `aprobado` en modo legacy):
86
+ edita el frontmatter `estado: borrador` → `estado: aprobado` y agrega
87
+ `aprobadoPor: usuario (<nombre>) — <fecha>, via /swl:aprobar-plan`.
88
+
89
+ 2. **Firmar** — escribe el lock SHA256:
90
+ ```bash
91
+ node -e "const {firmarPlan}=require('./scripts/lib/plan-lock'); const r=firmarPlan('.planning/fases/0N-PLAN.md'); console.log(JSON.stringify(r))"
92
+ ```
93
+ Verifica que el resultado sea `ok: true` y que exista
94
+ `.planning/locks/0N-PLAN.md.lock`.
95
+
96
+ 3. **Verificar** la firma de inmediato:
97
+ ```bash
98
+ node -e "const {verificarPlan}=require('./scripts/lib/plan-lock'); console.log(JSON.stringify(verificarPlan('.planning/fases/0N-PLAN.md')))"
99
+ ```
100
+ Debe retornar `modo: "firmado"`, `ok: true`.
101
+
102
+ 4. **Marcar la fase como activa** (gate G0 — `hooks/spec-gate.js` consume este
103
+ archivo): escribe `.planning/locks/fase-activa.json` con el sha256 devuelto
104
+ por `firmarPlan`:
105
+ ```bash
106
+ node -e "
107
+ const {atomicWriteJSON} = require('./hooks/lib/atomic-write');
108
+ const {verificarPlan} = require('./scripts/lib/plan-lock');
109
+ const v = verificarPlan('.planning/fases/0N-PLAN.md');
110
+ atomicWriteJSON('.planning/locks/fase-activa.json', {
111
+ numero: N,
112
+ planPath: '.planning/fases/0N-PLAN.md',
113
+ sha256: v.hashEsperado,
114
+ aprobadoEn: new Date().toISOString(),
115
+ aprobadoPor: 'usuario via /swl:aprobar-plan'
116
+ });
117
+ console.log('fase activa: 0N');
118
+ "
119
+ ```
120
+ Este archivo es runtime local (gitignored — a diferencia del `.lock`, que SÍ
121
+ se versiona como evidencia). `/swl:ejecutar-fase` lo elimina al cerrar la fase.
122
+ Si se re-firma un plan (re-aprobación tras mutación), re-escribir también
123
+ fase-activa.json para que el hash quede alineado.
124
+
125
+ ## Paso 5 — Reporte
126
+
127
+ ```
128
+ Plan de la fase N aprobado y firmado (gate G1 activo).
129
+
130
+ estado: borrador -> aprobado
131
+ lock: .planning/locks/0N-PLAN.md.lock
132
+ fase activa: .planning/locks/fase-activa.json (gate G0 cubierto)
133
+ sha256: <hash corto>
134
+
135
+ Cualquier edición del PLAN tras esta firma detendrá /swl:ejecutar-fase con un
136
+ mensaje de "plan mutado tras aprobación". Para cambiar el plan: edítalo y vuelve
137
+ a ejecutar /swl:aprobar-plan N.
138
+
139
+ Próximo paso: /swl:ejecutar-fase N
140
+ ```
141
+
142
+ ## Reglas de comportamiento
143
+
144
+ - NUNCA apruebes un plan sin confirmación explícita del usuario.
145
+ - NUNCA modifiques el contenido del plan al aprobarlo — solo el campo `estado`
146
+ del frontmatter y la línea `aprobadoPor`. El cuerpo es lo que se firma.
147
+ - El lock vive en `.planning/locks/` y SÍ se versiona en git (es evidencia de
148
+ aprobación, parte del audit trail de SDD).
149
+ - Si el usuario quiere cambiar el plan después de aprobado, el flujo correcto es
150
+ editar el PLAN y re-ejecutar `/swl:aprobar-plan N` (re-firma). NUNCA editar el
151
+ lock a mano.
152
+ - El número de versión del release que publique esta fase lo decide el usuario
153
+ (regla CLAUDE.md) — este comando no toca versiones.
@@ -44,7 +44,7 @@ Formato: tabla compacta con nombre, descripción corta y flags principales.
44
44
  | `/swl:revisar [stack\|archivo]` | Revisión de código por tecnología (auto-detect) |
45
45
  | `/swl:revisar-impacto` | Análisis de blast radius y risk score |
46
46
  | `/swl:evaluar-skill [nombre]` | Evaluación PluginEval de 2 capas con badge |
47
- | `/swl:salud` | Diagnóstico de integridad del sistema |
47
+ | `/swl:status salud` | Diagnóstico de integridad del sistema |
48
48
  | `/swl:auditar-deps` | Auditoría de dependencias (CVEs) |
49
49
 
50
50
  #### Aprendizaje y evolución
@@ -70,8 +70,8 @@ Formato: tabla compacta con nombre, descripción corta y flags principales.
70
70
 
71
71
  | Comando | Descripción |
72
72
  |---------|------------|
73
- | `/swl:metricas [resumen\|detalle]` | Métricas de sesión (tokens, costo) |
74
- | `/swl:dashboard [today\|stats]` | Dashboard histórico multi-sesión |
73
+ | `/swl:status metricas [resumen\|detalle]` | Métricas de sesión (tokens, costo) |
74
+ | `/swl:status dashboard [today\|stats]` | Dashboard histórico multi-sesión |
75
75
  | `/swl:mcp-status` | Estado de servidores MCP conectados |
76
76
 
77
77
  #### Instalación y sistema
@@ -0,0 +1,122 @@
1
+ ---
2
+ name: swl:briefing
3
+ description: Briefing proactivo del proyecto bajo demanda. Re-presenta las señales baratas del hook SessionStart (ADRs Propuestos con reevaluación vencida, deuda con trigger por fecha cumplido, nudges sin accionar, gates en calibración, retoma pendiente) y agrega el análisis profundo opt-in que el hook no puede pagar: audit de dependencias del proyecto destino, cobertura vs umbral, hubs del grafo tocados sin revisión, drift de feature-list, y triggers de deuda en prosa libre. Cargar cuando el usuario pide "¿qué hay pendiente?", "¿qué riesgos hay?", "ponme al día", o cuando el digest de sesión sugiere el análisis completo por volumen de señales.
4
+ allowed_tools: ["Read", "Bash", "Glob", "Grep"]
5
+ ---
6
+
7
+ # /swl:briefing — Briefing proactivo bajo demanda
8
+
9
+ Análisis no solicitado del estado del proyecto destino (Fase 12, ADR-0036). El
10
+ hook `session-briefing.js` da el digest barato al abrir sesión; este comando es
11
+ el nivel profundo: re-presenta esas señales Y agrega las que cuestan (deps, grafo,
12
+ cobertura) con degradación funcional si la herramienta no está instalada.
13
+
14
+ Principio rector: **proponer es barato y siempre permitido; actuar requiere
15
+ autorización del usuario**. Este comando solo propone y analiza — nunca aplica
16
+ cambios sin que el usuario los pida.
17
+
18
+ ## Uso
19
+
20
+ ```
21
+ /swl:briefing # señales baratas + análisis profundo completo
22
+ /swl:briefing rapido # solo las 5 señales del hook (sin deps/grafo/cobertura)
23
+ ```
24
+
25
+ ## Paso 1 — Señales baratas (mismas del hook)
26
+
27
+ Ejecuta los recolectores de filesystem y presenta el digest sin tope de 5 (aquí
28
+ sí caben todas, no hay presupuesto de latencia de arranque):
29
+
30
+ ```bash
31
+ node -e "
32
+ const b = require('./hooks/lib/briefing.js');
33
+ const items = b.recolectarTodo(process.cwd(), new Date());
34
+ for (const it of items) console.log('— [' + it.categoria + '] ' + it.titulo + ' → ' + it.accion);
35
+ if (items.length === 0) console.log('(sin señales baratas)');
36
+ "
37
+ ```
38
+
39
+ Las 5 categorías: `adr-vencido`, `deuda-trigger`, `nudges-pendientes`,
40
+ `gate-calibracion`, `continue-here`. Si `rapido`, terminar aquí.
41
+
42
+ ## Paso 2 — Análisis profundo (opt-in, con degradación)
43
+
44
+ Para cada herramienta, **validar antes de invocar** (patrón "validar antes de
45
+ invocar"): si no está disponible, reportar "no disponible, omitido" y continuar —
46
+ nunca fallar el briefing por una herramienta ausente.
47
+
48
+ ### 2.1 — Audit de dependencias del proyecto destino
49
+
50
+ Detectar el ecosistema y correr el audit nativo:
51
+
52
+ ```bash
53
+ # Node
54
+ [ -f package.json ] && npm audit --omit=dev 2>/dev/null | tail -5
55
+ # Python
56
+ [ -f requirements.txt -o -f pyproject.toml ] && (command -v pip-audit >/dev/null && pip-audit 2>/dev/null | tail -5 || echo "pip-audit no instalado — omitido")
57
+ ```
58
+
59
+ Reportar CVEs HIGH/CRITICAL con la acción concreta (`npm audit fix`, bump de
60
+ versión). Sin lockfile o sin gestor → omitir.
61
+
62
+ ### 2.2 — Cobertura vs umbral
63
+
64
+ Si el proyecto define cobertura, comparar contra el umbral del proyecto (80% por
65
+ defecto). Si no hay reporte reciente, indicar el comando para generarlo en vez de
66
+ correrlo (puede ser caro):
67
+
68
+ ```
69
+ Para medir cobertura: <runner del proyecto> --coverage
70
+ ```
71
+
72
+ ### 2.3 — Hubs del grafo tocados sin revisión
73
+
74
+ Si el MCP `code-review-graph` está disponible (tools `mcp__code-review-graph__*`
75
+ registradas o deferred), consultar los nodos hub modificados en los últimos N
76
+ commits sin revisión asociada. Si no está disponible → omitir con nota.
77
+
78
+ ### 2.4 — Drift de feature-list
79
+
80
+ ```bash
81
+ node scripts/derivar-feature-list.js --check 2>/dev/null; echo "exit: $?"
82
+ ```
83
+
84
+ Exit 2 → reportar que `HOJA-RUTA.md` y `feature-list.json` divergieron, con la
85
+ acción `node scripts/derivar-feature-list.js` para regenerar.
86
+
87
+ ### 2.5 — Deuda con trigger en prosa libre
88
+
89
+ El hook solo evalúa triggers verificables por fecha (D-16). Aquí, leer
90
+ `.planning/DEUDA-TECNICA.md` y evaluar con criterio los triggers en prosa
91
+ ("≥2 clientes reportan", "p95 > 60s documentado") contra el estado real del
92
+ proyecto. Reportar los que parezcan cumplidos para revisión del usuario.
93
+
94
+ ## Paso 3 — Presentación y telemetría
95
+
96
+ Presenta el briefing agrupado por prioridad (continue-here → gates → deuda →
97
+ ADRs → nudges → hallazgos profundos). Cada ítem con su acción ejecutable.
98
+
99
+ Tras presentar, el usuario decide qué accionar. NO ejecutar acciones de mutación
100
+ (cerrar deuda, promover gates, aplicar fixes) sin que el usuario lo pida — este
101
+ comando es propositivo (separación PROPONER/ACTUAR, ADR-0037 pendiente).
102
+
103
+ Si el usuario acciona una señal en esta sesión (ejecuta el comando sugerido), esa
104
+ resolución la captura la telemetría de aceptación del hook en la siguiente sesión
105
+ (la señal desaparece del recolector → cuenta como "actuada", D-18).
106
+
107
+ ## Cuándo NO usar este comando
108
+
109
+ - En cada turno de una sesión: el briefing es por sesión, no por mensaje. El hook
110
+ ya cubre el inicio; este comando es para cuando el usuario pide el detalle.
111
+ - Para aplicar las acciones propuestas: este comando propone, no ejecuta. Usar el
112
+ comando concreto de cada señal (`/swl:evolucion-estado`, `/swl:verificar`, etc.).
113
+ - En proyectos sin `.planning/`: no hay señales que recolectar.
114
+
115
+ ## Gotchas
116
+
117
+ - **Herramienta ausente ≠ error**: si `npm audit`, `pip-audit` o el grafo no están,
118
+ el briefing los omite con nota y sigue. Nunca abortar por una dependencia opt-in.
119
+ - **No re-listar lo que el hook ya mostró hoy**: el hook aplica dedupe diario; este
120
+ comando ignora el dedupe a propósito (lo invoca el usuario, quiere ver todo).
121
+ - **`code-review-graph` deferred ≠ ausente**: si las tools aparecen como deferred,
122
+ cargar su schema con `ToolSearch` antes de concluir que no está disponible.
@@ -269,10 +269,37 @@ Archivos actualizados:
269
269
  - .planning/COMPACTACION.md (creado/actualizado)
270
270
  - .planning/ESTADO.md (referencia agregada)
271
271
 
272
- El contexto está listo para continuar con sesión fresca.
273
- Próximo comando: [comando exacto]
272
+ El estado está a salvo en disco. IMPORTANTE: este comando NO compacta la
273
+ ventana de contexto — eso es una operación del harness que el agente no
274
+ puede ejecutar. Para compactar de verdad, AHORA ejecuta TÚ una de estas:
275
+
276
+ /compact ← built-in de Claude Code: trunca la ventana usando
277
+ el estado ya persistido (recomendado para seguir
278
+ en la misma sesión)
279
+ /clear o sesión nueva ← arranque limpio; pega la instrucción de arranque
280
+ del Paso 7
281
+
282
+ Próximo comando de trabajo (tras compactar): [comando exacto]
274
283
  ```
275
284
 
285
+ ## Paso 9 — Por qué este comando NO compacta la ventana (límite del harness)
286
+
287
+ La compactación REAL del contexto (truncar la conversación) es una operación
288
+ exclusiva del harness de Claude Code: el `/compact` built-in o el auto-compact.
289
+ Un comando `/swl:*` corre DENTRO de la conversación y el modelo no tiene
290
+ ninguna herramienta para truncar su propia ventana — por diseño.
291
+
292
+ División de responsabilidades:
293
+
294
+ | Mitad | Quién | Qué hace |
295
+ |-------|-------|----------|
296
+ | `/swl:compactar` | el agente | Persiste el estado a disco (COMPACTACION.md + ESTADO.md) para que NADA se pierda al truncar |
297
+ | `/compact` | el usuario (harness) | Trunca la ventana de verdad. Sin la mitad anterior, perdería las decisiones no escritas |
298
+
299
+ El error a prevenir: ejecutar `/compact` SIN haber corrido `/swl:compactar`
300
+ antes (estado solo en la memoria de la conversación → se pierde). El orden
301
+ correcto siempre es: `/swl:compactar` → `/compact`.
302
+
276
303
  ## Reglas de comportamiento
277
304
 
278
305
  - El COMPACTACION.md debe reemplazar la necesidad de releer toda la conversación. Si alguien lo lee, debe poder continuar el trabajo.
@@ -178,6 +178,12 @@ Espera confirmación. Si hay correcciones, ajusta y presenta el resumen nuevamen
178
178
 
179
179
  Una vez confirmado, crea `.planning/fases/0N-CONTEXTO.md` (donde N es el número de fase con cero a la izquierda si N < 10, ej: `01-CONTEXTO.md`, `02-CONTEXTO.md`).
180
180
 
181
+ **TDD es default ON** (gate G2, decisión D-07 vNext): NO preguntes "¿quieres TDD?".
182
+ La fase se ejecuta con ciclo RED→GREEN→REFACTOR y evidencia en telemetría salvo que
183
+ el usuario pida desactivarlo explícitamente. Si lo desactiva: exige la razón, regístrala
184
+ en el campo `**TDD**` del CONTEXTO y anota la excepción en `.planning/AUDITORIA.md`
185
+ (el opt-out se declara y registra — nunca es silencioso).
186
+
181
187
  Estructura del archivo:
182
188
 
183
189
  ```markdown
@@ -187,6 +193,8 @@ Estructura del archivo:
187
193
  **Fase**: N de M (total de fases en el roadmap)
188
194
  **Fecha de discusión**: [fecha actual]
189
195
  **Estado**: Listo para planear
196
+ **TDD**: on <!-- default. Si el usuario lo desactiva: `off — razón: [...]` + entry en AUDITORIA.md -->
197
+
190
198
 
191
199
  ## Objetivo de la fase
192
200
  [descripción clara del objetivo]
@@ -209,8 +217,21 @@ Estructura del archivo:
209
217
  ## Pantallas / vistas (si aplica)
210
218
  [descripción de pantallas]
211
219
 
212
- ## Criterios de aceptación
213
- [lista medible de criterios]
220
+ ## Criterios de aceptación (REQ)
221
+ [criterios binarios y verificables con ID estable namespaceado por fase
222
+ `REQ-<fase>-NN` (DT-IDS-NAMESPACE, fases ≥12) — trazabilidad G4:
223
+ - **REQ-12-01**: [criterio binario verificable]
224
+ - **REQ-12-02**: [criterio binario verificable]
225
+ Las fases 01-11 conservan el formato plano `REQ-NN` (gracia legacy permanente,
226
+ no se renumeran). `verificar-trazabilidad.js` acepta ambos formatos.
227
+ Un REQ emitido NUNCA se renumera ni se reusa: si un criterio se descarta, marcarlo
228
+ "RETIRADO — razón" conservando el número. planear-fase exige que cada tarea T-NN
229
+ declare qué REQ verifica (matriz REQ×T) y aprobar-plan rechaza planes con REQ
230
+ huérfanos. verificar-trazabilidad.js valida la cadena REQ→T→commit→test al cierre.
231
+ Método de verificación: por default cada REQ exige un test con marker
232
+ `verifica: REQ-<fase>-NN`; los REQ satisfechos por prosa/docs/configuración llevan
233
+ la anotación `(verificación: inspección)` en el criterio — exigen tarea y commit
234
+ pero no test automatizado.]
214
235
 
215
236
  ## Riesgos identificados
216
237
  [lista con nivel de impacto: ALTO/MEDIO/BAJO]
@@ -18,6 +18,7 @@ Eres el coordinador de ejecución SWL. Orquestas la implementación real del có
18
18
  ```
19
19
  /swl:ejecutar-fase 1 # modo default — oleadas paralelas
20
20
  /swl:ejecutar-fase 2 --iterative # modo iterativo — 1 tarea, review per-task, auto-debug
21
+ /swl:ejecutar-fase 3 --sin-verify # omite el verify automático del cierre (desviación registrada)
21
22
  ```
22
23
 
23
24
  ### Cuándo usar `--iterative` (modo opt-in)
@@ -48,7 +49,7 @@ Si NO hay `--iterative`, carga el flujo default:
48
49
  Skill("ejecutar-fase")
49
50
  ```
50
51
 
51
- El skill define el protocolo completo de ejecución por tarea (leer > verificar dependencias > implementar > verificar > commit > actualizar ESTADO.md), el formato de commit atómico, las 3 reglas de desviación (menor/moderada/mayor), el manejo de tareas HITL, TDD opcional, el formato de ESTADO.md y el checklist de cierre de fase.
52
+ El skill define el protocolo completo de ejecución por tarea (leer > verificar dependencias > implementar > verificar > commit > actualizar ESTADO.md), el formato de commit atómico, las 3 reglas de desviación (menor/moderada/mayor), el manejo de tareas HITL, TDD por default con evidencia RED en telemetría de loops (opt-out solo si el CONTEXTO declara `**TDD**: off` con razón — gate G2, ADR-0035), el formato de ESTADO.md y el checklist de cierre de fase.
52
53
 
53
54
  Luego carga habilidades específicas del stack detectado en PLAN.md o PROYECTO.md:
54
55
  - Backend Python: `Skill("fastapi-experto")`, `Skill("patrones-python")`
@@ -75,10 +76,33 @@ Verifica en orden:
75
76
  5. **Requirement Freeze**: verifica que el frontmatter del PLAN.md contenga
76
77
  `estado: aprobado`. Si contiene `estado: borrador` o no tiene campo `estado`:
77
78
  - DETENER ejecución
78
- - Reportar: "El PLAN.md no está aprobado. Ejecuta `/swl:planear-fase N` y
79
- confirma el plan antes de ejecutar."
79
+ - Reportar: "El PLAN.md no está aprobado. Ejecuta `/swl:aprobar-plan N` para
80
+ aprobarlo y firmarlo antes de ejecutar."
80
81
  - NO proceder sin aprobación explícita del usuario
81
82
 
83
+ 6. **Gate G1 — verificación de integridad del plan firmado**: tras confirmar
84
+ `estado: aprobado`, recomputa el hash del PLAN y compáralo contra su lock:
85
+ ```bash
86
+ node -e "const {verificarPlan}=require('./scripts/lib/plan-lock'); console.log(JSON.stringify(verificarPlan('.planning/fases/0N-PLAN.md')))"
87
+ ```
88
+ Interpreta el resultado:
89
+ - `ok: true, modo: "firmado"` → el plan no fue mutado tras su aprobación.
90
+ Continúa con normalidad.
91
+ - `ok: true, modo: "legacy"` → plan aprobado SIN lock (creado antes de la
92
+ Fase 09, cláusula de gracia D-05). Muestra una **advertencia visible** al
93
+ usuario: "Plan en modo legacy (sin firma SHA256). Se ejecuta sin
94
+ verificación de integridad. Para firmarlo: `/swl:aprobar-plan N`." y
95
+ continúa.
96
+ - `ok: false, modo: "mutado"` → **DETENER ejecución**. El plan cambió tras la
97
+ firma. Reporta `hashEsperado` y `hashActual` y di: "El PLAN fue modificado
98
+ después de su aprobación. Revisa los cambios y vuelve a aprobarlo con
99
+ `/swl:aprobar-plan N` antes de ejecutar." NO proceder.
100
+ - `ok: false` con cualquier otro modo (`lock-corrupto`, `sin-firmar`,
101
+ `no-existe`) → DETENER y reportar el `motivo` exacto.
102
+
103
+ Repite esta verificación al inicio de cada slice (el plan no debe mutar
104
+ durante la ejecución — Requirement Freeze).
105
+
82
106
  Lee los tres archivos completos. Verifica estado de Git (`git status`, `git log --oneline -5`). Si hay cambios no commiteados, pregunta cómo proceder.
83
107
 
84
108
  **Nota sobre Requirement Freeze**: una vez que el plan está aprobado y la ejecución
@@ -143,11 +167,40 @@ Según tipo de error:
143
167
 
144
168
  Al completar todos los slices, genera `.planning/fases/0N-RESUMEN.md` con: slices implementados (commits, archivos), resultados de tests, desviaciones del plan, decisiones técnicas, deuda técnica, estado final, criterios de aceptación verificados, próximos pasos.
145
169
 
170
+ **Anexo propositivo (Fase 13, ADR-0037)**: antes de cerrar, ejecuta el propose-step
171
+ sobre el diff de la fase (`node hooks/lib/propose-step.js --rango=<base>..HEAD`) e
172
+ incluye una sección "Anexo propositivo" en el RESUMEN.md **solo si hay ≥1 señal** de
173
+ adyacencia (auth/PII/pagos, migración de schema). Si no hay señal, omite la sección
174
+ (silencio, no sección vacía). El anexo propone, nunca bloquea. Opt-out `SWL_PROPOSE=0`.
175
+
146
176
  ## Paso 7 — Actualización de HOJA-RUTA.md y ESTADO.md
147
177
 
148
178
  Marca fase completada en HOJA-RUTA.md con fecha. Actualiza ESTADO.md con estado general.
149
179
 
150
- ## Paso 8 Reporte final
180
+ **Liberar la fase activa** (gate G0): elimina `.planning/locks/fase-activa.json` —
181
+ la fase ya no está en ejecución y `hooks/spec-gate.js` debe volver a advertir si se
182
+ escribe código sin una nueva fase aprobada:
183
+
184
+ ```bash
185
+ node -e "const fs=require('fs'); const p='.planning/locks/fase-activa.json'; if(fs.existsSync(p)){fs.unlinkSync(p); console.log('fase activa liberada')} else {console.log('sin fase activa que liberar')}"
186
+ ```
187
+
188
+ NO eliminar el `.lock` del plan (`0N-PLAN.md.lock`) — ese es evidencia de
189
+ aprobación versionada, no runtime.
190
+
191
+ ## Paso 8 — Verificación automática y reporte final
192
+
193
+ **Verify automático (gate G4)**: tras generar RESUMEN.md y liberar la fase activa,
194
+ invoca `/swl:verificar --until-converge` automáticamente — el cierre de fase ya no
195
+ es un paso manual recomendado, es parte del flujo.
196
+
197
+ - Opt-out: si el usuario invocó `/swl:ejecutar-fase N --sin-verify`, omite la
198
+ verificación y registra la desviación en el RESUMEN.md ("verificación diferida
199
+ por --sin-verify — razón: [la que dé el usuario]").
200
+ - Si la verificación converge (Señal A): el VERIFICACION.md queda generado y el
201
+ reporte final lo incluye.
202
+ - Si NO converge (Señal B/C) o queda abortada: reportar el estado del loop al
203
+ usuario — la fase NO se declara verificada.
151
204
 
152
205
  ```
153
206
  Fase N — [nombre] completada.
@@ -156,13 +209,13 @@ Slices implementados: [N de N]
156
209
  Commits creados: [N]
157
210
  Tests pasando: [N de N]
158
211
  Desviaciones del plan: [N, o "ninguna"]
212
+ Verificación: [convergió en pasada K | diferida por --sin-verify | NO convergió — ver detalle]
159
213
 
160
214
  Archivos generados:
161
215
  - .planning/fases/0N-RESUMEN.md
216
+ - .planning/fases/0N-VERIFICACION.md (verify automático)
162
217
  - .planning/ESTADO.md (actualizado)
163
218
  - .planning/HOJA-RUTA.md (actualizado)
164
-
165
- Próximo paso recomendado: /swl:verificar
166
219
  ```
167
220
 
168
221
  ## Reglas de comportamiento
@@ -215,7 +215,7 @@ score_after = (evals_pass / evals_total) * 100 × factor_peso
215
215
  | `score_baseline - 5 <= score_after < score_baseline` | **Requiere revisión humana** — reportar diferencia; usuario decide si acepta la regresión menor o revierte |
216
216
 
217
217
  Los 3 casos registran evento en `.planning/evolution/evoluciones.jsonl` para el
218
- dashboard `/swl:evolucion-estado`.
218
+ dashboard `/swl:status evolucion`.
219
219
 
220
220
  ### Regla de oro
221
221
 
@@ -43,7 +43,7 @@ Por cada comando en la cola, decidir:
43
43
  | Tipo de contenido | Acción |
44
44
  |-------------------|--------|
45
45
  | Instrucción de trabajo clara ("arregla el bug X", "ejecuta pruebas") | Procesar como prompt del usuario. Ejecutar la tarea siguiendo el flujo normal SWL. |
46
- | Slash command (`/swl:salud`, `/swl:metricas`, etc.) | Invocar ese comando directamente. |
46
+ | Slash command (`/swl:status salud`, `/swl:status metricas`, etc.) | Invocar ese comando directamente. |
47
47
  | Pregunta/consulta ("¿cómo va X?", "estado del release") | Responder con la información solicitada. Enviar respuesta al gateway si aplica. |
48
48
  | Feedback/corrección ("no uses Y", "prefiero Z") | Escribir a `.planning/evolution/feedback-queue.jsonl` con tipo correspondiente y marcar como procesado. |
49
49
  | Contenido ambiguo o sospechoso | Marcar como descartado con razón registrada. |
@@ -185,7 +185,7 @@ Doctor: <resultado>
185
185
  Siguiente paso:
186
186
  /swl:nuevo-proyecto → si es un proyecto nuevo
187
187
  /swl:mapear-codebase → si ya hay código existente
188
- /swl:salud → para diagnóstico profundo del sistema
188
+ /swl:status salud → para diagnóstico profundo del sistema
189
189
  ```
190
190
 
191
191
  Si la instalación fue local, menciona: "Para instalar SWL en otro proyecto, abre Claude Code en ese proyecto y ejecuta `/swl:instalar` nuevamente."
@@ -236,7 +236,7 @@ En modo `--remediar`, además de los `iter-N/` el comando registra la
236
236
  trayectoria en el formato estándar de telemetría de loops
237
237
  (`hooks/lib/loop-telemetry.js`). Esto habilita: inyección de estado por el
238
238
  hook `contexto-iteracion.js` durante las ejecuciones largas (8-30 turnos),
239
- detección de plateau, y lectura de la corrida por `/swl:metricas`.
239
+ detección de plateau, y lectura de la corrida por `/swl:status metricas`.
240
240
 
241
241
  - Al iniciar iter-1: `iniciarCorrida({tipo: 'nemesis', direccion: 'lower_is_better', config: {modulo, maxIter: 3}})`.
242
242
  - Tras cada iteración: `registrarIteracion(dir, {iteracion: N, metrica: criticos+altos, delta, estado: 'keep', descripcion: 'iter N: status=<status>, X criticos, Y altos'})`.
@@ -146,7 +146,12 @@ El agente planificador-swl debe generar el plan con esta estructura exacta:
146
146
  ...
147
147
 
148
148
  ## Modelos y esquemas de datos
149
- [tablas, campos, tipos, constraints — si la fase introduce datos nuevos]
149
+ [tablas, campos, tipos, constraints — si la fase introduce datos nuevos.
150
+ Los schemas declarados aquí (Pydantic/Zod/JSON Schema/OpenAPI) son **contrato
151
+ verificable**, parte de la spec: la tarea que los implementa se verifica con
152
+ contract testing (`Skill("calidad-contract-testing")`), no solo con tests
153
+ unitarios. Declarar el schema con la estrictez de la promesa real (requeridos
154
+ marcados, sin campos extra implícitos).]
150
155
 
151
156
  ## Endpoints a implementar
152
157
  | Método | Ruta | Descripción | Roles permitidos |
@@ -173,6 +178,18 @@ fases técnicas puras — Gherkin sin lector de negocio es ceremonia.]
173
178
  | Riesgo | Impacto | Probabilidad | Mitigación |
174
179
  |--------|---------|-------------|-----------|
175
180
 
181
+ ## Matriz REQ×T (obligatoria si el CONTEXTO tiene criterios REQ-NN)
182
+ [tabla REQ → tareas que lo verifican. Cada tarea declara `**Verifica REQ**: REQ-XX`.
183
+ Todo REQ sin tarea = plan NO apto para aprobación (aprobar-plan lo rechaza).
184
+ La convención de cierre de cadena (fases ≥12, IDs namespaceados por fase): commits
185
+ con prefijo `[F<fase>·T-NN]` y footer `Refs: REQ-<fase>-NN`, tests con marker
186
+ `# verifica: REQ-<fase>-NN` (Python) / `// verifica: REQ-<fase>-NN` (JS/TS) —
187
+ validada por `scripts/verificar-trazabilidad.js` (acepta también el formato plano
188
+ `REQ-NN`/`[T-NN]` de fases 01-11). Omitir solo en CONTEXTOs legacy sin REQ-IDs.]
189
+
190
+ | REQ | Tareas que lo verifican |
191
+ |-----|------------------------|
192
+
176
193
  ## Criterios de aceptación de la fase
177
194
  [copia del CONTEXTO.md, verificados contra el plan]
178
195
 
@@ -190,6 +207,7 @@ Una vez que el agente planificador-swl produce el PLAN.md, ejecuta una revisión
190
207
  - [ ] ¿El orden de implementación respeta las dependencias (BD → service → endpoint → frontend)?
191
208
  - [ ] ¿Hay criterios de verificación para cada slice?
192
209
  - [ ] ¿Los criterios de aceptación de la fase están cubiertos por los slices?
210
+ - [ ] Si el CONTEXTO tiene REQ-IDs: ¿la matriz REQ×T cubre TODOS los REQ (cero huérfanos)?
193
211
  - [ ] ¿Los riesgos ALTO del CONTEXTO.md están mitigados en el plan?
194
212
  - [ ] ¿Hay tests especificados para cada área crítica?
195
213
  - [ ] ¿Hay tareas HITL claramente marcadas?
@@ -122,7 +122,7 @@ echo "Plugin <nombre> v<version> instalado en _userland/plugins/<nombre>/"
122
122
  echo "Componentes: agentes=$(count), skills=$(count), reglas=$(count), hooks=$(count)"
123
123
  ```
124
124
 
125
- Indicar al usuario que ejecute `/swl:salud` para verificar integridad global.
125
+ Indicar al usuario que ejecute `/swl:status salud` para verificar integridad global.
126
126
 
127
127
  ---
128
128
 
@@ -167,7 +167,7 @@ node scripts/generar-skills-lock.js
167
167
  git add manifiestos/skills-lock.json
168
168
  ```
169
169
 
170
- El lock contiene SHA256 de cada SKILL.md y permite que `/swl:salud` detecte
170
+ El lock contiene SHA256 de cada SKILL.md y permite que `/swl:status salud` detecte
171
171
  drift silencioso entre releases. Si el lock no cambió respecto al anterior,
172
172
  el commit lo refleja como no-op (idempotente). El archivo es pequeño (~37KB)
173
173
  y debe versionarse.
@@ -254,6 +254,52 @@ Usar tags anotados siempre (regla del skill).
254
254
 
255
255
  Crea `RELEASE-NOTES-v[nueva-versión].md` con: resumen, cambios, instrucciones de actualización y guía de migración si hay breaking changes.
256
256
 
257
+ ## Paso 9.5 — Evidencia de procedencia (cadena de suministro, ADR-0038)
258
+
259
+ Genera la evidencia de cadena de suministro del release: SBOM CycloneDX del
260
+ árbol runtime + SHA256SUMS del tarball. No publica nada; produce artefactos
261
+ versionados en `releases/v[nueva-versión]/`.
262
+
263
+ ```bash
264
+ node scripts/lib/evidencia-release.js --version [nueva-versión]
265
+ ```
266
+
267
+ Esto escribe (vía `scripts/lib/evidencia-release.js`):
268
+ - `releases/v[nueva-versión]/sbom-v[nueva-versión].cdx.json` — SBOM CycloneDX
269
+ runtime-only (`npm sbom --sbom-format cyclonedx --omit dev`).
270
+ - `releases/v[nueva-versión]/SHA256SUMS` — checksum del tarball de `npm pack`.
271
+
272
+ Luego:
273
+
274
+ 1. **Insertar la sección "Integridad y verificación"** en
275
+ `RELEASE-NOTES-v[nueva-versión].md`, justo después de la sección de
276
+ correcciones. La genera `seccionVerificacionNotas` de la lib:
277
+
278
+ ```bash
279
+ node -e "const {seccionVerificacionNotas}=require('./scripts/lib/evidencia-release');const fs=require('fs');const v='[nueva-versión]';const sums=fs.readFileSync('releases/v'+v+'/SHA256SUMS','utf8').trim().split(/\s+/);const md=seccionVerificacionNotas({version:v,hash:sums[0],tarball:sums[1]});console.log(md)"
280
+ ```
281
+
282
+ Copiar ese markdown a RELEASE-NOTES (tras "Correcciones").
283
+
284
+ 2. **Copiar las RELEASE-NOTES** a la carpeta del release como evidencia
285
+ versionada:
286
+
287
+ ```bash
288
+ cp RELEASE-NOTES-v[nueva-versión].md releases/v[nueva-versión]/
289
+ git add releases/v[nueva-versión]/
290
+ ```
291
+
292
+ `releases/` NO viaja en el tarball npm (`package.json#files` es allowlist y no
293
+ lo incluye) — es evidencia del repo, no del paquete. Verificar con
294
+ `npm pack --dry-run | grep -c "releases/"` → debe ser `0`.
295
+
296
+ **Provenance (opt-in)**: el publish default sigue siendo local
297
+ (`scripts/publicar.js`). Para publicar a npmjs con `npm publish --provenance`
298
+ (que exige OIDC desde CI) usar el workflow opt-in
299
+ `.github/workflows/publish-npm.yml` (trigger `workflow_dispatch`, `dry_run`
300
+ default true). GitHub Packages permanece local. Runbook de verificación para
301
+ el consumidor: `docs/verificacion-consumidor.md`.
302
+
257
303
  ## Paso 10 — Verificación final
258
304
 
259
305
  ### 10.1 Gate automática anti-gap (OBLIGATORIA antes del push)