@saulwade/swl-ses 2.3.0 → 2.4.1

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 (327) hide show
  1. package/CLAUDE.md +241 -199
  2. package/README.md +597 -597
  3. package/agentes/_intent-spec.md +73 -73
  4. package/agentes/_propose-step.md +90 -90
  5. package/agentes/accesibilidad-wcag-swl.md +2 -2
  6. package/agentes/arquitecto-swl.md +2 -2
  7. package/agentes/auto-evolucion-swl.md +2 -2
  8. package/agentes/backend-api-swl.md +2 -2
  9. package/agentes/backend-csharp-swl.md +2 -2
  10. package/agentes/backend-go-swl.md +2 -2
  11. package/agentes/backend-java-swl.md +2 -2
  12. package/agentes/backend-node-swl.md +2 -2
  13. package/agentes/backend-python-swl.md +2 -2
  14. package/agentes/backend-rust-swl.md +2 -2
  15. package/agentes/backend-workers-swl.md +2 -2
  16. package/agentes/cloud-infra-swl.md +2 -2
  17. package/agentes/consolidador-swl.md +2 -2
  18. package/agentes/datos-swl.md +2 -2
  19. package/agentes/depurador-swl.md +2 -2
  20. package/agentes/devops-ci-swl.md +2 -2
  21. package/agentes/disenador-ui-swl.md +2 -2
  22. package/agentes/documentador-swl.md +2 -2
  23. package/agentes/frontend-angular-swl.md +2 -2
  24. package/agentes/frontend-css-swl.md +2 -2
  25. package/agentes/frontend-react-swl.md +2 -2
  26. package/agentes/frontend-swl.md +2 -2
  27. package/agentes/frontend-tailwind-swl.md +2 -2
  28. package/agentes/gh-fix-ci-swl.md +275 -275
  29. package/agentes/implementador-swl.md +2 -2
  30. package/agentes/investigador-swl.md +2 -2
  31. package/agentes/investigador-ux-swl.md +2 -2
  32. package/agentes/llm-apps-swl.md +2 -2
  33. package/agentes/migrador-swl.md +2 -2
  34. package/agentes/mobile-android-swl.md +2 -2
  35. package/agentes/mobile-cross-swl.md +2 -2
  36. package/agentes/mobile-ios-swl.md +2 -2
  37. package/agentes/mobile-testing-swl.md +2 -2
  38. package/agentes/nemesis-auditor-swl.md +1 -1
  39. package/agentes/notificador-swl.md +2 -2
  40. package/agentes/observabilidad-swl.md +2 -2
  41. package/agentes/orquestador-swl.md +41 -14
  42. package/agentes/pagos-swl.md +2 -2
  43. package/agentes/perfilador-usuario-swl.md +2 -2
  44. package/agentes/planificador-swl.md +2 -2
  45. package/agentes/producto-prd-swl.md +2 -2
  46. package/agentes/red-team-swl.md +218 -218
  47. package/agentes/release-manager-swl.md +2 -2
  48. package/agentes/rendimiento-swl.md +2 -2
  49. package/agentes/resolutor-build-swl.md +2 -2
  50. package/agentes/revisor-angular-swl.md +2 -2
  51. package/agentes/revisor-codigo-swl.md +36 -3
  52. package/agentes/revisor-csharp-swl.md +2 -2
  53. package/agentes/revisor-go-swl.md +2 -2
  54. package/agentes/revisor-java-swl.md +2 -2
  55. package/agentes/revisor-kotlin-swl.md +2 -2
  56. package/agentes/revisor-nextjs-swl.md +2 -2
  57. package/agentes/revisor-php-swl.md +2 -2
  58. package/agentes/revisor-react-swl.md +2 -2
  59. package/agentes/revisor-rust-swl.md +2 -2
  60. package/agentes/revisor-seguridad-swl.md +2 -2
  61. package/agentes/revisor-swift-swl.md +2 -2
  62. package/agentes/revisor-typescript-swl.md +2 -2
  63. package/agentes/sre-swl.md +2 -2
  64. package/agentes/tdd-qa-swl.md +2 -2
  65. package/comandos/swl/briefing.md +119 -119
  66. package/comandos/swl/contexto.md +0 -2
  67. package/comandos/swl/contribuir.md +233 -233
  68. package/comandos/swl/deuda-codigo.md +97 -0
  69. package/comandos/swl/predecir.md +139 -139
  70. package/comandos/swl/sesiones.md +1 -1
  71. package/gateway/agent-executor.js +1 -1
  72. package/gateway/lib/event-channel.js +191 -191
  73. package/habilidades/agent-deep-links/SKILL.md +148 -148
  74. package/habilidades/agentes-como-servicio/SKILL.md +2 -2
  75. package/habilidades/angular-moderno/SKILL.md +24 -1
  76. package/habilidades/auto-evolucion-protocolo/SKILL.md +276 -276
  77. package/habilidades/backend-async-postgres-testing/SKILL.md +215 -215
  78. package/habilidades/backend-error-design/SKILL.md +221 -221
  79. package/habilidades/backend-production-resilience/SKILL.md +288 -288
  80. package/habilidades/benchmark-memoria/SKILL.md +186 -186
  81. package/habilidades/calidad-anti-patrones-universales/SKILL.md +368 -368
  82. package/habilidades/calidad-contract-testing/SKILL.md +165 -165
  83. package/habilidades/calidad-mutation-testing/SKILL.md +170 -170
  84. package/habilidades/changelog-generator/scripts/parse-commits.js +367 -367
  85. package/habilidades/checklist-seguridad/recursos/stride-cobertura.md +60 -60
  86. package/habilidades/contenedores-docker/SKILL.md +3 -1
  87. package/habilidades/diagrama-arquitectura/assets/template.html +276 -276
  88. package/habilidades/doubt-driven-review/recursos/EXAMPLES.md +130 -130
  89. package/habilidades/drift-detection/SKILL.md +179 -179
  90. package/habilidades/estructura-proyecto-claude/recursos/frontmatter-y-hooks-referencia.md +1 -1
  91. package/habilidades/estructura-proyecto-claude/recursos/mcp-json-template.json +57 -57
  92. package/habilidades/eval-framework/SKILL.md +212 -212
  93. package/habilidades/feynman-auditor-swl/recursos/preguntas-language-agnostic.md +108 -108
  94. package/habilidades/harness-claude-code/SKILL.md +4 -4
  95. package/habilidades/harness-claude-code/recursos/disciplina-harness-regla.md +253 -252
  96. package/habilidades/legacy-code-rescue/SKILL.md +268 -267
  97. package/habilidades/meta-skills-estandar/SKILL.md +1 -1
  98. package/habilidades/meta-skills-estandar/recursos/convencion-examples.md +93 -93
  99. package/habilidades/meta-skills-estandar/recursos/skills-as-agents.md +2 -2
  100. package/habilidades/patrones-python/recursos/patrones-avanzados.md +469 -469
  101. package/habilidades/perfil-usuario/SKILL.md +200 -200
  102. package/habilidades/postgresql-experto/SKILL.md +3 -1
  103. package/habilidades/prevencion-sobreingenieria/SKILL.md +70 -92
  104. package/habilidades/prevencion-sobreingenieria/recursos/EXAMPLES.md +580 -580
  105. package/habilidades/prevencion-sobreingenieria/recursos/soluciones-nativas.md +166 -0
  106. package/habilidades/prevencion-sobreingenieria/recursos/variables-residuales-post-refactor.md +85 -0
  107. package/habilidades/proceso-ddia-fundamentos/SKILL.md +255 -255
  108. package/habilidades/proceso-ddia-streaming/SKILL.md +231 -231
  109. package/habilidades/proceso-debate-adversarial/recursos/personas.md +105 -105
  110. package/habilidades/proceso-discovery-machote/SKILL.md +157 -157
  111. package/habilidades/proceso-dynamic-workflows/SKILL.md +138 -138
  112. package/habilidades/proceso-dynamic-workflows/recursos/template-adversarial-verify.js +65 -65
  113. package/habilidades/proceso-dynamic-workflows/recursos/template-triage.js +65 -65
  114. package/habilidades/proceso-intent-engineering/SKILL.md +269 -269
  115. package/habilidades/proceso-modular-split/SKILL.md +256 -256
  116. package/habilidades/prompt-engineering/recursos/patrones-avanzados.md +2 -2
  117. package/habilidades/state-inconsistency-auditor-swl/recursos/coupled-state-patterns.md +147 -147
  118. package/habilidades/structured-outputs/SKILL.md +2 -2
  119. package/habilidades/swl-claudemd/recursos/contrato-aprender.md +83 -83
  120. package/habilidades/swl-claudemd/recursos/duplicacion-reglas-globales.md +85 -85
  121. package/habilidades/swl-claudemd/recursos/plantillas-init.md +94 -94
  122. package/habilidades/swl-dashboard/SKILL.md +2 -2
  123. package/habilidades/tdd-workflow/recursos/gherkin-bdd.md +111 -111
  124. package/habilidades/validacion-ci-sistema/recursos/validadores-completos.md +1 -1
  125. package/habilidades/validacion-ci-sistema/scripts/validar-sistema.sh +1 -1
  126. package/hooks/audit-trail.js +4 -4
  127. package/hooks/calidad-pre-commit.js +15 -11
  128. package/hooks/captura-acciones-post.js +3 -2
  129. package/hooks/captura-acciones-session.js +3 -2
  130. package/hooks/ciclo-evolucion-subagente.js +26 -26
  131. package/hooks/ciclo-evolucion.js +26 -26
  132. package/hooks/claudemd-bloat-detector.js +161 -161
  133. package/hooks/claudemd-duplicacion-detector.js +170 -170
  134. package/hooks/contexto-iteracion.js +145 -144
  135. package/hooks/contexto-subagente.js +68 -0
  136. package/hooks/guardrail-modelo.js +14 -4
  137. package/hooks/inyeccion-contexto.js +12 -12
  138. package/hooks/lib/agent-routing.js +107 -107
  139. package/hooks/lib/auto-consolidator.js +335 -335
  140. package/hooks/lib/autonomia.js +208 -208
  141. package/hooks/lib/ciclo-evolucion.js +47 -47
  142. package/hooks/lib/deep-links.js +185 -185
  143. package/hooks/lib/error-classifier.js +308 -308
  144. package/hooks/lib/etapa-auto-evolucion.js +701 -701
  145. package/hooks/lib/etapa-metricas.js +388 -388
  146. package/hooks/lib/etapa-perfil-usuario.js +376 -376
  147. package/hooks/lib/loop-telemetry.js +321 -321
  148. package/hooks/lib/merkle-audit.js +96 -96
  149. package/hooks/lib/model-router.js +2 -2
  150. package/hooks/lib/propose-step.js +358 -358
  151. package/hooks/lib/provenance-tracker.js +191 -191
  152. package/hooks/lib/rate-limit-tracker.js +253 -253
  153. package/hooks/lib/resource-quota.js +122 -122
  154. package/hooks/lib/retry-jitter.js +165 -165
  155. package/hooks/lib/security-net.js +201 -201
  156. package/hooks/lib/skill-auditor.js +588 -588
  157. package/hooks/lib/sync-status.js +228 -228
  158. package/hooks/lib/taint-tracker.js +107 -107
  159. package/hooks/lib/text-similarity.js +241 -241
  160. package/hooks/lib/token-estimator.js +1 -0
  161. package/hooks/lib/toon-compressor.js +245 -245
  162. package/hooks/lib/usage-model.js +1 -1
  163. package/hooks/registro-turnos.js +210 -209
  164. package/hooks/session-briefing.js +98 -98
  165. package/hooks/spec-gate.js +212 -211
  166. package/hooks/sugerir-contribuir.js +2 -1
  167. package/hooks/sugerir-regenerar-inventario.js +171 -170
  168. package/hooks/tdd-gate.js +242 -241
  169. package/hooks/telemetria-skill-routing.js +100 -100
  170. package/hooks/validar-formato-post-subagente.js +140 -140
  171. package/hooks/validar-intent-spec.js +242 -242
  172. package/hooks/validar-memoria-hook.js +218 -218
  173. package/hooks/validar-planning-paths.js +134 -134
  174. package/instintos/autonomia.yaml +27 -27
  175. package/instintos/prompt-appendices.yaml +57 -57
  176. package/llms.txt +29 -29
  177. package/manifiestos/agent-output-schemas.json +57 -57
  178. package/manifiestos/canonical-hashes.json +2948 -1964
  179. package/manifiestos/hook-profiles.json +0 -2
  180. package/manifiestos/hooks-config.json +469 -477
  181. package/manifiestos/invariantes-criticos.json +30 -0
  182. package/manifiestos/modulos.json +1390 -1390
  183. package/manifiestos/planning-paths.json +44 -44
  184. package/manifiestos/skills-lock.json +1282 -1282
  185. package/package.json +93 -93
  186. package/plantillas/auditor-veto-template.md +105 -105
  187. package/plantillas/github-workflows/README.md +47 -47
  188. package/plantillas/github-workflows/release-please.yml +44 -44
  189. package/plantillas/github-workflows/swl-ci.yml +107 -107
  190. package/plantillas/github-workflows/swl-security.yml +51 -51
  191. package/plugin.json +369 -371
  192. package/reglas/accesibilidad.md +10 -10
  193. package/reglas/analisis-previo-tareas-grandes.md +172 -172
  194. package/reglas/api-diseno.md +9 -9
  195. package/reglas/arreglar-al-detectar.md +240 -240
  196. package/reglas/auditorias-documentales-estructurales.md +7 -7
  197. package/reglas/cloud-infra.md +8 -8
  198. package/reglas/consultar-vault-primero.md +195 -195
  199. package/reglas/debatir-antes-de-aceptar.md +158 -158
  200. package/reglas/fragmentos-compartidos.md +183 -183
  201. package/reglas/hooks.md +6 -6
  202. package/reglas/intent-engineering.md +218 -218
  203. package/reglas/markitdown.md +8 -8
  204. package/reglas/monitor-ci.md +309 -309
  205. package/reglas/patrones.md +6 -6
  206. package/reglas/sesiones-paralelas.md +180 -180
  207. package/reglas/sin-duplicacion-reglas-globales.md +182 -182
  208. package/reglas/skills-estandar.md +6 -6
  209. package/reglas/testing.md +7 -7
  210. package/reglas/tests-cleanup.md +224 -224
  211. package/reglas/usar-code-review-graph.md +155 -155
  212. package/reglas/usar-context7.md +226 -226
  213. package/reglas/verificar-citas-normativas.md +548 -548
  214. package/schemas/agent-frontmatter.schema.json +5 -3
  215. package/schemas/agent-message.schema.json +73 -73
  216. package/schemas/agent-output-implementacion.schema.json +114 -114
  217. package/schemas/agent-output-planificacion.schema.json +150 -150
  218. package/schemas/agent-output-review.schema.json +98 -98
  219. package/schemas/diary-entry.schema.json +112 -112
  220. package/schemas/hook-profiles.schema.json +54 -54
  221. package/schemas/hooks-config.schema.json +89 -89
  222. package/schemas/modulos.schema.json +38 -38
  223. package/schemas/perfiles.schema.json +36 -36
  224. package/schemas/plugin.schema.json +77 -77
  225. package/schemas/skill-evals.schema.json +119 -119
  226. package/schemas/skill-frontmatter.schema.json +245 -245
  227. package/scripts/audit-tools/audit-history.js +330 -330
  228. package/scripts/audit-tools/bundle-tracker.js +290 -290
  229. package/scripts/audit-tools/canary-monitor.js +352 -352
  230. package/scripts/audit-tools/code-profiler.js +605 -605
  231. package/scripts/audit-tools/dep-doctor.js +320 -320
  232. package/scripts/audit-tools/env-validator.js +206 -206
  233. package/scripts/audit-tools/lib/fs-walk.js +48 -48
  234. package/scripts/audit-tools/lib/output.js +23 -23
  235. package/scripts/audit-tools/migration-checker.js +392 -392
  236. package/scripts/audit-tools/pentest-scanner.js +1436 -1436
  237. package/scripts/benchmark-memoria.js +167 -167
  238. package/scripts/cli/aprobar-plan.js +73 -73
  239. package/scripts/cli/briefing.js +23 -23
  240. package/scripts/cli/ciclo-evolucion.js +26 -26
  241. package/scripts/cli/configurar-ci.js +40 -40
  242. package/scripts/cli/derivar-feature-list.js +25 -25
  243. package/scripts/cli/detectar-host.js +27 -27
  244. package/scripts/cli/diary-entry.js +69 -69
  245. package/scripts/cli/execution-state.js +18 -18
  246. package/scripts/cli/gateway-notify.js +41 -41
  247. package/scripts/cli/liberar-fase.js +42 -42
  248. package/scripts/cli/loop-telemetry.js +125 -125
  249. package/scripts/cli/mark-evolved.js +56 -56
  250. package/scripts/cli/metricas-dora.js +26 -26
  251. package/scripts/cli/near-duplicate.js +55 -55
  252. package/scripts/cli/notificaciones.js +123 -123
  253. package/scripts/cli/propose-step.js +29 -29
  254. package/scripts/cli/schedule-parse.js +19 -19
  255. package/scripts/cli/sugerir-modelo.js +20 -20
  256. package/scripts/cli/verificar-plan.js +36 -36
  257. package/scripts/cli/verificar-trazabilidad.js +35 -35
  258. package/scripts/configurar-branch-protection.js +418 -418
  259. package/scripts/detectar-aprendizajes-duplicados.js +151 -151
  260. package/scripts/field-report.js +199 -199
  261. package/scripts/generar-checklists-consolidados.js +273 -273
  262. package/scripts/generar-matriz-lenguajes.js +271 -271
  263. package/scripts/instalador.js +4 -1
  264. package/scripts/lib/artefactos-python.js +43 -43
  265. package/scripts/lib/auditar-invocaciones-comandos.js +104 -104
  266. package/scripts/lib/benchmark-metrics.js +160 -160
  267. package/scripts/lib/budget-enforcer.js +252 -252
  268. package/scripts/lib/ci-reader.js +193 -193
  269. package/scripts/lib/claude-sessions.js +1 -0
  270. package/scripts/lib/configurar-ci.js +380 -380
  271. package/scripts/lib/contadores-inventario.js +217 -217
  272. package/scripts/lib/detectar-host-swl.js +175 -175
  273. package/scripts/lib/detectar-stack-detallado.js +307 -307
  274. package/scripts/lib/detector-autoduplicacion-intra-archivo.js +234 -234
  275. package/scripts/lib/detector-reglas-duplicadas.js +220 -220
  276. package/scripts/lib/diary-entry.js +234 -234
  277. package/scripts/lib/eval-metrics-store.js +218 -218
  278. package/scripts/lib/eval-quality.js +171 -171
  279. package/scripts/lib/eval-schemas.js +144 -144
  280. package/scripts/lib/eval-self-correct.js +106 -106
  281. package/scripts/lib/eval-validator.js +185 -185
  282. package/scripts/lib/evidencia-release.js +322 -322
  283. package/scripts/lib/gate-hooks-requires.js +249 -249
  284. package/scripts/lib/gate-licencias.js +212 -212
  285. package/scripts/lib/git-metricas.js +257 -257
  286. package/scripts/lib/jaccard-similarity.js +98 -98
  287. package/scripts/lib/longmemeval-runner.js +125 -125
  288. package/scripts/lib/metricas-dora.js +204 -204
  289. package/scripts/lib/npm-version.js +261 -261
  290. package/scripts/lib/paquetes-conocidos.js +50 -50
  291. package/scripts/lib/plan-lock.js +275 -275
  292. package/scripts/lib/pr-analyzer.js +399 -399
  293. package/scripts/lib/preservar-usuario.js +39 -5
  294. package/scripts/lib/prompt-builder.js +264 -264
  295. package/scripts/lib/reglas-globales-conocidas.json +180 -180
  296. package/scripts/lib/resolver-plan-fase.js +37 -37
  297. package/scripts/lib/rrf-fusion.js +175 -175
  298. package/scripts/lib/schema-version.js +164 -164
  299. package/scripts/lib/scoring-instintos.js +277 -277
  300. package/scripts/lib/semantic-search.js +252 -252
  301. package/scripts/lib/tool-cost-analyzer.js +1 -0
  302. package/scripts/limpiar-artefactos-python.js +131 -131
  303. package/scripts/migrar-csv-a-array.js +168 -168
  304. package/scripts/migrar-fase-dominio.js +200 -200
  305. package/scripts/publicar.js +497 -497
  306. package/scripts/run-eval.js +141 -141
  307. package/scripts/tui/componentes/selector-multi.js +189 -189
  308. package/scripts/tui/componentes/selector-unico.js +158 -158
  309. package/scripts/tui/ejecutores.js +375 -375
  310. package/scripts/tui/index.js +162 -162
  311. package/scripts/tui/lib/colores.js +129 -129
  312. package/scripts/tui/lib/render.js +264 -264
  313. package/scripts/tui/lib/teclas.js +113 -113
  314. package/scripts/tui/pantallas/inspect.js +173 -173
  315. package/scripts/tui/pantallas/install-wizard.js +334 -334
  316. package/scripts/tui/pantallas/menu-principal.js +52 -52
  317. package/scripts/tui/pantallas/progreso.js +274 -274
  318. package/scripts/tui/pantallas/resumen.js +132 -132
  319. package/scripts/tui/pantallas/uninstall-wizard.js +208 -208
  320. package/scripts/tui/pantallas/update-wizard.js +232 -232
  321. package/scripts/tui/pantallas/welcome.js +187 -187
  322. package/scripts/validar-userland-vacio.js +110 -110
  323. package/scripts/validar.js +1 -1
  324. package/scripts/verificar-release.js +51 -0
  325. package/hooks/lib/context-compressor.js +0 -657
  326. package/hooks/linea-estado.js +0 -326
  327. package/hooks/monitor-contexto.js +0 -373
@@ -1,231 +1,231 @@
1
- ---
2
- name: proceso-ddia-streaming
3
- description: >
4
- Patrones de Stream Processing del libro DDIA (Cap 11, Martin Kleppmann)
5
- aplicados a archivos JSONL append-only de SWL: event sourcing, idempotencia,
6
- exactly-once vs at-least-once, replay desde offset. Cargar al diseñar hooks
7
- que persistan eventos, modificar evolucion/*.jsonl, audit-trail.jsonl o
8
- nudges.jsonl, o cuando un consumidor de JSONL deba ser idempotente.
9
- when_to_use: >
10
- Usar cuando el usuario menciona JSONL append-only, event sourcing, audit
11
- trail, idempotencia, exactly-once, replay, offset, consumidor de stream,
12
- evolucion/, nudges, telemetria, hooks que escriben eventos.
13
- ---
14
-
15
- # DDIA Streaming — event sourcing aplicado a JSONL de SWL
16
-
17
- Adaptado de Martin Kleppmann, *"Designing Data-Intensive Applications"*
18
- Capítulo 11 — Stream Processing. SWL no tiene Kafka ni stream processor
19
- real, pero opera con archivos JSONL append-only que se comportan como
20
- streams locales. Los patrones del Cap 11 aplican directamente.
21
-
22
- ## Cuándo cargar
23
-
24
- - Crear un hook que persiste eventos en JSONL (telemetría, audit, evolución).
25
- - Diseñar un consumidor de `.planning/evolution/*.jsonl`,
26
- `.planning/audit.jsonl`, `.planning/comms/nudges.jsonl`.
27
- - Diagnosticar duplicación de eventos en JSONL.
28
- - Decidir si un hook debe ser idempotente o si basta con append.
29
- - Implementar replay de eventos desde un offset.
30
-
31
- ## Cuándo NO cargar
32
-
33
- - Trabajo síncrono request/response sin event log → no aplica.
34
- - Sistema sin JSONL (sin streams locales) → cargar `proceso-ddia-fundamentos`.
35
- - Discusiones sobre Kafka/Flink/Spark reales → SWL no opera con esos.
36
-
37
- ## Cita textual base (DDIA Cap 11, p.439-479)
38
-
39
- ### Event Sourcing (p.457, línea 21753-21798)
40
-
41
- > "Event sourcing is a powerful technique for data modeling: from an
42
- > application point of view [...]"
43
-
44
- El libro distingue event sourcing de change data capture (CDC):
45
- - **CDC**: captura cambios de una base de datos relacional como stream.
46
- - **Event Sourcing**: la aplicación misma emite eventos como log primario;
47
- el estado se deriva replicando los eventos.
48
-
49
- **SWL aplica event sourcing** (no CDC): no hay BD relacional intermedia.
50
- Los archivos JSONL son el log primario; cualquier proyección (instintos,
51
- métricas, dashboard) se deriva replicándolos.
52
-
53
- ### Exactly-Once vs Effectively-Once (p.476, línea 22755)
54
-
55
- > "This principle is known as exactly-once semantics, although
56
- > effectively-once would be a more descriptive term."
57
-
58
- Distinción clave del libro:
59
- - **Exactly-once teórico**: el sistema garantiza que cada evento se
60
- procesa una y solo una vez.
61
- - **Effectively-once práctico**: el evento puede llegar N veces, pero
62
- el efecto visible es el de procesarlo 1 vez. Se logra con idempotencia.
63
-
64
- ### Idempotencia (p.478, línea 22828-22845)
65
-
66
- > "An idempotent operation is one that you can perform multiple times,
67
- > and it has the same effect as if you performed it only once. For
68
- > example, setting a key in a key-value store to some fixed value is
69
- > idempotent (writing the value again simply overwrites the value with
70
- > an identical value), whereas incrementing a counter is not idempotent
71
- > (performing the increment again means the value is incremented twice)."
72
-
73
- Operación clave del libro: incluso operaciones no-idempotentes pueden
74
- hacerse idempotentes con metadata adicional (el offset del mensaje
75
- fuente).
76
-
77
- ---
78
-
79
- ## Aplicación a SWL — archivos JSONL del sistema
80
-
81
- | Archivo | Productor | Consumidores | ¿Es event source? |
82
- |---|---|---|---|
83
- | `.planning/evolution/evoluciones.jsonl` | `/swl:evolucionar`, hook `evolucion-detector` | `/swl:status evolucion`, dashboard | Sí |
84
- | `.planning/evolution/nudges.jsonl` | hooks varios | `/swl:status salud`, `red-team-swl` | Sí |
85
- | `.planning/evolution/agentes.jsonl` | hook `telemetria-agentes` | `/swl:status metricas` | Sí |
86
- | `.planning/audit.jsonl` | hook `audit-trail` | auditorías, post-mortems | Sí (con Merkle) |
87
- | `.planning/comms/*.jsonl` | `notificador-swl` | inbox, gateway | Sí |
88
-
89
- Todos son **append-only logs** — escritura por `fs.appendFileSync` (regla
90
- CLAUDE.md). Nadie modifica ni borra entradas existentes.
91
-
92
- ## Patrón 1 — Idempotencia con event ID
93
-
94
- **Problema**: un hook se ejecuta dos veces (re-trigger, retry) y emite el
95
- mismo evento. El consumidor lo procesa 2 veces, produciendo doble efecto.
96
-
97
- **Solución aplicada en SWL**: cada evento JSONL incluye un campo `id` único
98
- (UUID v4 o `timestamp + hash de payload`). El consumidor mantiene un
99
- set de IDs procesados (en `.planning/.processed-ids/`) y descarta
100
- duplicados.
101
-
102
- Ejemplo en hooks/lib (idiomático SWL):
103
-
104
- ```js
105
- // Productor (hook)
106
- const crypto = require('crypto');
107
- const evento = {
108
- id: crypto.randomUUID(),
109
- ts: new Date().toISOString(),
110
- type: 'agent.completed',
111
- payload: { ... }
112
- };
113
- fs.appendFileSync(ruta, JSON.stringify(evento) + '\n');
114
-
115
- // Consumidor
116
- const procesados = cargarSetIds(); // del filesystem
117
- for (const linea of leerJSONL(ruta)) {
118
- const e = JSON.parse(linea);
119
- if (procesados.has(e.id)) continue; // idempotencia
120
- aplicar(e);
121
- procesados.add(e.id);
122
- guardarSetIds(procesados);
123
- }
124
- ```
125
-
126
- **Cuándo aplicar**: consumidores que ejecutan side-effects no-idempotentes
127
- (notificaciones, mutaciones de estado, incrementos de contador).
128
-
129
- **Cuándo NO aplicar**: consumidores que solo proyectan estado (instintos,
130
- métricas) — la idempotencia natural (re-procesar produce mismo estado)
131
- es suficiente.
132
-
133
- ## Patrón 2 — Replay desde offset
134
-
135
- **Problema**: un consumidor crashea a mitad del JSONL. Al reiniciar,
136
- ¿desde dónde continúa?
137
-
138
- **Solución aplicada en SWL**: persistir el byte-offset del último evento
139
- procesado en archivo separado (`.planning/.offsets/consumidor-X.offset`).
140
- Al iniciar, leer desde ese offset.
141
-
142
- ```js
143
- const offsetFile = `.planning/.offsets/${consumidor}.offset`;
144
- const offset = fs.existsSync(offsetFile)
145
- ? parseInt(fs.readFileSync(offsetFile, 'utf-8'), 10)
146
- : 0;
147
-
148
- const fd = fs.openSync(ruta, 'r');
149
- // leer desde offset, procesar evento por evento
150
- // tras cada evento procesado: fs.writeFileSync(offsetFile, nuevoOffset)
151
- ```
152
-
153
- **Garantía**: at-least-once. Si crashea entre procesar y guardar offset,
154
- el evento se reprocesa. Combinado con idempotencia (Patrón 1), se logra
155
- **effectively-once** (DDIA p.476).
156
-
157
- ## Patrón 3 — Append-only sin borrado
158
-
159
- **Regla operacional SWL**: los archivos JSONL NUNCA se reescriben enteros
160
- ni se editan entradas pasadas. Compactación (eliminar duplicados, agrupar)
161
- se hace creando un archivo `.jsonl.compacted` separado, dejando el
162
- original como audit trail.
163
-
164
- **Por qué importa**: si un hook reescribiera `audit.jsonl` con un nuevo
165
- contenido (incluso con razón válida), perderíamos la garantía de
166
- inmutabilidad que `audit-trail.js` con Merkle hash depende. El audit
167
- trail roto deja de ser auditable.
168
-
169
- ## Patrón 4 — Schema evolution en eventos JSONL
170
-
171
- Los eventos JSONL evolucionan: campos nuevos, payloads modificados. Los
172
- consumidores deben tolerar eventos viejos sin romperse.
173
-
174
- Aplicar las reglas de `Skill("proceso-ddia-fundamentos")` § Schema
175
- Evolution:
176
- - Campos nuevos siempre opcionales.
177
- - `schemaVersion: "1.0.0"` por evento opcional pero recomendado.
178
- - Consumidores ignoran campos desconocidos (forward-compat).
179
-
180
- ## Patrón 5 — Backpressure (cuándo NO aplica a SWL)
181
-
182
- DDIA trata extensamente backpressure: cuando el productor escribe más
183
- rápido que el consumidor. **SWL NO sufre este problema** porque:
184
- - Volumen de eventos por sesión: ~10²-10³ líneas, no millones.
185
- - Consumidores son sincrónicos bajo demanda (`/swl:status salud`, dashboard).
186
- - No hay productor continuo de alta frecuencia.
187
-
188
- NO implementar backpressure / rate-limiting en JSONL writers. Es
189
- sobre-ingeniería.
190
-
191
- ## Anti-patrones específicos a evitar
192
-
193
- - **Compactar JSONL en mismo archivo**: rompe inmutabilidad. Crear
194
- `.compacted` separado.
195
- - **Confiar en orden de líneas para totalidad**: dos hooks concurrentes
196
- pueden escribir entrelazado. Usar IDs únicos + timestamps, NO orden.
197
- - **Indexar JSONL en disco como BD**: el archivo es secuencial por
198
- diseño. Si necesitas índice, proyecta a otra estructura (instintos,
199
- métricas agregadas).
200
- - **Bloquear el productor durante write**: `fs.appendFileSync` es atómico
201
- para writes ≤4096 bytes en sistemas POSIX (no aplica Windows, donde
202
- hay carrera de race). Para Windows usar `atomicAppend` de
203
- `hooks/lib/atomic-write.js` cuando el evento supera 4KB.
204
-
205
- ## Gotchas no obvios
206
-
207
- - **`fs.appendFileSync` no es atómico en Windows con escrituras grandes**:
208
- Node usa `WriteFile` que no garantiza atomicity para >4KB. Si el
209
- evento JSON serializado supera 4KB, usar buffer + `atomicAppend`.
210
- - **Lectura de JSONL con `fs.readFileSync` carga todo a memoria**: si
211
- un archivo crece a 100MB+, usar `readline` con stream. Pero para
212
- swl-ses (volumen bajo), `readFileSync` es aceptable.
213
- - **`JSON.parse` en línea malformada lanza**: envolver en try/catch +
214
- log de línea problemática. NUNCA dejar que un evento corrupto rompa
215
- todo el replay.
216
-
217
- ## Resumen — del libro a SWL
218
-
219
- | Concepto DDIA Cap 11 | Aplicación SWL |
220
- |---|---|
221
- | Event sourcing | Todos los `.planning/*.jsonl` |
222
- | Exactly-once → effectively-once | Idempotencia + at-least-once delivery |
223
- | Idempotencia con offset | Patrón 1 de este skill |
224
- | Replay desde offset | Patrón 2 de este skill |
225
- | Append-only inmutable | Regla operacional SWL |
226
- | Backpressure | NO aplica (volumen bajo) |
227
-
228
- ## Origen
229
-
230
- Skill creado el 2026-05-18 como parte de Opción B (ver ADR-0025). Skill
231
- hermano: `proceso-ddia-fundamentos` (Cap 1, 4, 12 del mismo libro).
1
+ ---
2
+ name: proceso-ddia-streaming
3
+ description: >
4
+ Patrones de Stream Processing del libro DDIA (Cap 11, Martin Kleppmann)
5
+ aplicados a archivos JSONL append-only de SWL: event sourcing, idempotencia,
6
+ exactly-once vs at-least-once, replay desde offset. Cargar al diseñar hooks
7
+ que persistan eventos, modificar evolucion/*.jsonl, audit-trail.jsonl o
8
+ nudges.jsonl, o cuando un consumidor de JSONL deba ser idempotente.
9
+ when_to_use: >
10
+ Usar cuando el usuario menciona JSONL append-only, event sourcing, audit
11
+ trail, idempotencia, exactly-once, replay, offset, consumidor de stream,
12
+ evolucion/, nudges, telemetria, hooks que escriben eventos.
13
+ ---
14
+
15
+ # DDIA Streaming — event sourcing aplicado a JSONL de SWL
16
+
17
+ Adaptado de Martin Kleppmann, *"Designing Data-Intensive Applications"*
18
+ Capítulo 11 — Stream Processing. SWL no tiene Kafka ni stream processor
19
+ real, pero opera con archivos JSONL append-only que se comportan como
20
+ streams locales. Los patrones del Cap 11 aplican directamente.
21
+
22
+ ## Cuándo cargar
23
+
24
+ - Crear un hook que persiste eventos en JSONL (telemetría, audit, evolución).
25
+ - Diseñar un consumidor de `.planning/evolution/*.jsonl`,
26
+ `.planning/audit.jsonl`, `.planning/comms/nudges.jsonl`.
27
+ - Diagnosticar duplicación de eventos en JSONL.
28
+ - Decidir si un hook debe ser idempotente o si basta con append.
29
+ - Implementar replay de eventos desde un offset.
30
+
31
+ ## Cuándo NO cargar
32
+
33
+ - Trabajo síncrono request/response sin event log → no aplica.
34
+ - Sistema sin JSONL (sin streams locales) → cargar `proceso-ddia-fundamentos`.
35
+ - Discusiones sobre Kafka/Flink/Spark reales → SWL no opera con esos.
36
+
37
+ ## Cita textual base (DDIA Cap 11, p.439-479)
38
+
39
+ ### Event Sourcing (p.457, línea 21753-21798)
40
+
41
+ > "Event sourcing is a powerful technique for data modeling: from an
42
+ > application point of view [...]"
43
+
44
+ El libro distingue event sourcing de change data capture (CDC):
45
+ - **CDC**: captura cambios de una base de datos relacional como stream.
46
+ - **Event Sourcing**: la aplicación misma emite eventos como log primario;
47
+ el estado se deriva replicando los eventos.
48
+
49
+ **SWL aplica event sourcing** (no CDC): no hay BD relacional intermedia.
50
+ Los archivos JSONL son el log primario; cualquier proyección (instintos,
51
+ métricas, dashboard) se deriva replicándolos.
52
+
53
+ ### Exactly-Once vs Effectively-Once (p.476, línea 22755)
54
+
55
+ > "This principle is known as exactly-once semantics, although
56
+ > effectively-once would be a more descriptive term."
57
+
58
+ Distinción clave del libro:
59
+ - **Exactly-once teórico**: el sistema garantiza que cada evento se
60
+ procesa una y solo una vez.
61
+ - **Effectively-once práctico**: el evento puede llegar N veces, pero
62
+ el efecto visible es el de procesarlo 1 vez. Se logra con idempotencia.
63
+
64
+ ### Idempotencia (p.478, línea 22828-22845)
65
+
66
+ > "An idempotent operation is one that you can perform multiple times,
67
+ > and it has the same effect as if you performed it only once. For
68
+ > example, setting a key in a key-value store to some fixed value is
69
+ > idempotent (writing the value again simply overwrites the value with
70
+ > an identical value), whereas incrementing a counter is not idempotent
71
+ > (performing the increment again means the value is incremented twice)."
72
+
73
+ Operación clave del libro: incluso operaciones no-idempotentes pueden
74
+ hacerse idempotentes con metadata adicional (el offset del mensaje
75
+ fuente).
76
+
77
+ ---
78
+
79
+ ## Aplicación a SWL — archivos JSONL del sistema
80
+
81
+ | Archivo | Productor | Consumidores | ¿Es event source? |
82
+ |---|---|---|---|
83
+ | `.planning/evolution/evoluciones.jsonl` | `/swl:evolucionar`, hook `evolucion-detector` | `/swl:status evolucion`, dashboard | Sí |
84
+ | `.planning/evolution/nudges.jsonl` | hooks varios | `/swl:status salud`, `red-team-swl` | Sí |
85
+ | `.planning/evolution/agentes.jsonl` | hook `telemetria-agentes` | `/swl:status metricas` | Sí |
86
+ | `.planning/audit.jsonl` | hook `audit-trail` | auditorías, post-mortems | Sí (con Merkle) |
87
+ | `.planning/comms/*.jsonl` | `notificador-swl` | inbox, gateway | Sí |
88
+
89
+ Todos son **append-only logs** — escritura por `fs.appendFileSync` (regla
90
+ CLAUDE.md). Nadie modifica ni borra entradas existentes.
91
+
92
+ ## Patrón 1 — Idempotencia con event ID
93
+
94
+ **Problema**: un hook se ejecuta dos veces (re-trigger, retry) y emite el
95
+ mismo evento. El consumidor lo procesa 2 veces, produciendo doble efecto.
96
+
97
+ **Solución aplicada en SWL**: cada evento JSONL incluye un campo `id` único
98
+ (UUID v4 o `timestamp + hash de payload`). El consumidor mantiene un
99
+ set de IDs procesados (en `.planning/.processed-ids/`) y descarta
100
+ duplicados.
101
+
102
+ Ejemplo en hooks/lib (idiomático SWL):
103
+
104
+ ```js
105
+ // Productor (hook)
106
+ const crypto = require('crypto');
107
+ const evento = {
108
+ id: crypto.randomUUID(),
109
+ ts: new Date().toISOString(),
110
+ type: 'agent.completed',
111
+ payload: { ... }
112
+ };
113
+ fs.appendFileSync(ruta, JSON.stringify(evento) + '\n');
114
+
115
+ // Consumidor
116
+ const procesados = cargarSetIds(); // del filesystem
117
+ for (const linea of leerJSONL(ruta)) {
118
+ const e = JSON.parse(linea);
119
+ if (procesados.has(e.id)) continue; // idempotencia
120
+ aplicar(e);
121
+ procesados.add(e.id);
122
+ guardarSetIds(procesados);
123
+ }
124
+ ```
125
+
126
+ **Cuándo aplicar**: consumidores que ejecutan side-effects no-idempotentes
127
+ (notificaciones, mutaciones de estado, incrementos de contador).
128
+
129
+ **Cuándo NO aplicar**: consumidores que solo proyectan estado (instintos,
130
+ métricas) — la idempotencia natural (re-procesar produce mismo estado)
131
+ es suficiente.
132
+
133
+ ## Patrón 2 — Replay desde offset
134
+
135
+ **Problema**: un consumidor crashea a mitad del JSONL. Al reiniciar,
136
+ ¿desde dónde continúa?
137
+
138
+ **Solución aplicada en SWL**: persistir el byte-offset del último evento
139
+ procesado en archivo separado (`.planning/.offsets/consumidor-X.offset`).
140
+ Al iniciar, leer desde ese offset.
141
+
142
+ ```js
143
+ const offsetFile = `.planning/.offsets/${consumidor}.offset`;
144
+ const offset = fs.existsSync(offsetFile)
145
+ ? parseInt(fs.readFileSync(offsetFile, 'utf-8'), 10)
146
+ : 0;
147
+
148
+ const fd = fs.openSync(ruta, 'r');
149
+ // leer desde offset, procesar evento por evento
150
+ // tras cada evento procesado: fs.writeFileSync(offsetFile, nuevoOffset)
151
+ ```
152
+
153
+ **Garantía**: at-least-once. Si crashea entre procesar y guardar offset,
154
+ el evento se reprocesa. Combinado con idempotencia (Patrón 1), se logra
155
+ **effectively-once** (DDIA p.476).
156
+
157
+ ## Patrón 3 — Append-only sin borrado
158
+
159
+ **Regla operacional SWL**: los archivos JSONL NUNCA se reescriben enteros
160
+ ni se editan entradas pasadas. Compactación (eliminar duplicados, agrupar)
161
+ se hace creando un archivo `.jsonl.compacted` separado, dejando el
162
+ original como audit trail.
163
+
164
+ **Por qué importa**: si un hook reescribiera `audit.jsonl` con un nuevo
165
+ contenido (incluso con razón válida), perderíamos la garantía de
166
+ inmutabilidad que `audit-trail.js` con Merkle hash depende. El audit
167
+ trail roto deja de ser auditable.
168
+
169
+ ## Patrón 4 — Schema evolution en eventos JSONL
170
+
171
+ Los eventos JSONL evolucionan: campos nuevos, payloads modificados. Los
172
+ consumidores deben tolerar eventos viejos sin romperse.
173
+
174
+ Aplicar las reglas de `Skill("proceso-ddia-fundamentos")` § Schema
175
+ Evolution:
176
+ - Campos nuevos siempre opcionales.
177
+ - `schemaVersion: "1.0.0"` por evento opcional pero recomendado.
178
+ - Consumidores ignoran campos desconocidos (forward-compat).
179
+
180
+ ## Patrón 5 — Backpressure (cuándo NO aplica a SWL)
181
+
182
+ DDIA trata extensamente backpressure: cuando el productor escribe más
183
+ rápido que el consumidor. **SWL NO sufre este problema** porque:
184
+ - Volumen de eventos por sesión: ~10²-10³ líneas, no millones.
185
+ - Consumidores son sincrónicos bajo demanda (`/swl:status salud`, dashboard).
186
+ - No hay productor continuo de alta frecuencia.
187
+
188
+ NO implementar backpressure / rate-limiting en JSONL writers. Es
189
+ sobre-ingeniería.
190
+
191
+ ## Anti-patrones específicos a evitar
192
+
193
+ - **Compactar JSONL en mismo archivo**: rompe inmutabilidad. Crear
194
+ `.compacted` separado.
195
+ - **Confiar en orden de líneas para totalidad**: dos hooks concurrentes
196
+ pueden escribir entrelazado. Usar IDs únicos + timestamps, NO orden.
197
+ - **Indexar JSONL en disco como BD**: el archivo es secuencial por
198
+ diseño. Si necesitas índice, proyecta a otra estructura (instintos,
199
+ métricas agregadas).
200
+ - **Bloquear el productor durante write**: `fs.appendFileSync` es atómico
201
+ para writes ≤4096 bytes en sistemas POSIX (no aplica Windows, donde
202
+ hay carrera de race). Para Windows usar `atomicAppend` de
203
+ `hooks/lib/atomic-write.js` cuando el evento supera 4KB.
204
+
205
+ ## Gotchas no obvios
206
+
207
+ - **`fs.appendFileSync` no es atómico en Windows con escrituras grandes**:
208
+ Node usa `WriteFile` que no garantiza atomicity para >4KB. Si el
209
+ evento JSON serializado supera 4KB, usar buffer + `atomicAppend`.
210
+ - **Lectura de JSONL con `fs.readFileSync` carga todo a memoria**: si
211
+ un archivo crece a 100MB+, usar `readline` con stream. Pero para
212
+ swl-ses (volumen bajo), `readFileSync` es aceptable.
213
+ - **`JSON.parse` en línea malformada lanza**: envolver en try/catch +
214
+ log de línea problemática. NUNCA dejar que un evento corrupto rompa
215
+ todo el replay.
216
+
217
+ ## Resumen — del libro a SWL
218
+
219
+ | Concepto DDIA Cap 11 | Aplicación SWL |
220
+ |---|---|
221
+ | Event sourcing | Todos los `.planning/*.jsonl` |
222
+ | Exactly-once → effectively-once | Idempotencia + at-least-once delivery |
223
+ | Idempotencia con offset | Patrón 1 de este skill |
224
+ | Replay desde offset | Patrón 2 de este skill |
225
+ | Append-only inmutable | Regla operacional SWL |
226
+ | Backpressure | NO aplica (volumen bajo) |
227
+
228
+ ## Origen
229
+
230
+ Skill creado el 2026-05-18 como parte de Opción B (ver ADR-0025). Skill
231
+ hermano: `proceso-ddia-fundamentos` (Cap 1, 4, 12 del mismo libro).