@saulwade/swl-ses 2.6.0 → 2.8.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 (435) hide show
  1. package/CLAUDE.md +209 -197
  2. package/README.md +647 -600
  3. package/agentes/accesibilidad-wcag-swl.md +690 -690
  4. package/agentes/arquitecto-swl.md +267 -267
  5. package/agentes/auto-evolucion-swl.md +932 -932
  6. package/agentes/backend-csharp-swl.md +420 -420
  7. package/agentes/backend-go-swl.md +390 -390
  8. package/agentes/backend-java-swl.md +281 -281
  9. package/agentes/backend-rust-swl.md +364 -364
  10. package/agentes/backend-workers-swl.md +482 -482
  11. package/agentes/cloud-infra-swl.md +509 -509
  12. package/agentes/consolidador-swl.md +541 -541
  13. package/agentes/depurador-swl.md +352 -352
  14. package/agentes/devops-ci-swl.md +400 -400
  15. package/agentes/disenador-ui-swl.md +569 -569
  16. package/agentes/documentador-swl.md +345 -345
  17. package/agentes/frontend-angular-swl.md +621 -621
  18. package/agentes/frontend-css-swl.md +716 -716
  19. package/agentes/frontend-react-swl.md +692 -692
  20. package/agentes/frontend-swl.md +496 -496
  21. package/agentes/frontend-tailwind-swl.md +826 -826
  22. package/agentes/investigador-swl.md +432 -432
  23. package/agentes/investigador-ux-swl.md +505 -505
  24. package/agentes/migrador-swl.md +442 -442
  25. package/agentes/mobile-android-swl.md +511 -511
  26. package/agentes/mobile-cross-swl.md +541 -541
  27. package/agentes/mobile-ios-swl.md +502 -502
  28. package/agentes/mobile-testing-swl.md +302 -302
  29. package/agentes/nemesis-auditor-swl.md +285 -285
  30. package/agentes/observabilidad-swl.md +438 -438
  31. package/agentes/pagos-swl.md +310 -310
  32. package/agentes/perfilador-usuario-swl.md +321 -321
  33. package/agentes/planificador-swl.md +399 -399
  34. package/agentes/producto-prd-swl.md +589 -589
  35. package/agentes/red-team-swl.md +218 -218
  36. package/agentes/release-manager-swl.md +590 -590
  37. package/agentes/rendimiento-swl.md +713 -713
  38. package/agentes/revisor-angular-swl.md +278 -278
  39. package/agentes/revisor-csharp-swl.md +264 -264
  40. package/agentes/revisor-go-swl.md +259 -259
  41. package/agentes/revisor-java-swl.md +257 -257
  42. package/agentes/revisor-kotlin-swl.md +273 -273
  43. package/agentes/revisor-nextjs-swl.md +281 -281
  44. package/agentes/revisor-php-swl.md +271 -271
  45. package/agentes/revisor-react-swl.md +278 -278
  46. package/agentes/revisor-rust-swl.md +346 -346
  47. package/agentes/revisor-seguridad-swl.md +399 -399
  48. package/agentes/revisor-swift-swl.md +268 -268
  49. package/agentes/revisor-typescript-swl.md +346 -346
  50. package/agentes/tdd-qa-swl.md +393 -393
  51. package/bin/swl-ses.js +10 -0
  52. package/comandos/swl/actualizar.md +174 -174
  53. package/comandos/swl/adoptar-proyecto.md +265 -265
  54. package/comandos/swl/aprender.md +836 -836
  55. package/comandos/swl/aprobar-plan.md +146 -146
  56. package/comandos/swl/auditar-deps.md +134 -134
  57. package/comandos/swl/autoresearch.md +264 -264
  58. package/comandos/swl/ayuda.md +224 -224
  59. package/comandos/swl/brainstorm.md +52 -51
  60. package/comandos/swl/checkpoint.md +325 -325
  61. package/comandos/swl/claudemd.md +234 -234
  62. package/comandos/swl/compactar.md +310 -310
  63. package/comandos/swl/configurar-ci.md +235 -235
  64. package/comandos/swl/contexto.md +110 -110
  65. package/comandos/swl/crear-skill.md +292 -292
  66. package/comandos/swl/cron.md +194 -194
  67. package/comandos/swl/deuda-codigo.md +97 -97
  68. package/comandos/swl/discutir-fase.md +169 -169
  69. package/comandos/swl/ejecutar-fase.md +233 -233
  70. package/comandos/swl/evaluar-skill.md +520 -520
  71. package/comandos/swl/evolucion-continua.md +73 -73
  72. package/comandos/swl/evolucionar.md +267 -267
  73. package/comandos/swl/exportar-vault.md +583 -583
  74. package/comandos/swl/fix.md +118 -118
  75. package/comandos/swl/gateway.md +158 -158
  76. package/comandos/swl/inbox.md +116 -116
  77. package/comandos/swl/instalar.md +220 -220
  78. package/comandos/swl/instintos.md +86 -86
  79. package/comandos/swl/mapear-codebase.md +312 -312
  80. package/comandos/swl/mcp-status.md +176 -175
  81. package/comandos/swl/modelo.md +100 -100
  82. package/comandos/swl/nemesis.md +433 -433
  83. package/comandos/swl/notificaciones.md +299 -299
  84. package/comandos/swl/nuevo-proyecto.md +251 -251
  85. package/comandos/swl/planear-fase.md +263 -263
  86. package/comandos/swl/plugins.md +256 -256
  87. package/comandos/swl/predecir.md +169 -169
  88. package/comandos/swl/reflect-skills.md +125 -125
  89. package/comandos/swl/release.md +450 -450
  90. package/comandos/swl/revisar-impacto.md +201 -201
  91. package/comandos/swl/revisar.md +330 -330
  92. package/comandos/swl/seguridad.md +189 -189
  93. package/comandos/swl/sesiones.md +200 -200
  94. package/comandos/swl/skill-search.md +113 -113
  95. package/comandos/swl/status.md +345 -345
  96. package/comandos/swl/verificar.md +817 -817
  97. package/comandos/swl/wiki.md +620 -620
  98. package/gateway/cron/jobs.example.json +12 -12
  99. package/gateway/lib/event-channel.js +191 -191
  100. package/habilidades/agent-deep-links/SKILL.md +148 -148
  101. package/habilidades/auto-evolucion-protocolo/SKILL.md +294 -294
  102. package/habilidades/backend-async-postgres-testing/SKILL.md +216 -215
  103. package/habilidades/backend-error-design/SKILL.md +221 -221
  104. package/habilidades/backend-production-resilience/SKILL.md +288 -288
  105. package/habilidades/calidad-anti-patrones-universales/SKILL.md +105 -1
  106. package/habilidades/calidad-contract-testing/SKILL.md +165 -165
  107. package/habilidades/calidad-mutation-testing/SKILL.md +25 -1
  108. package/habilidades/changelog-generator/SKILL.md +174 -174
  109. package/habilidades/checklist-seguridad/recursos/stride-cobertura.md +60 -60
  110. package/habilidades/ci-cd-pipelines/SKILL.md +5 -1
  111. package/habilidades/compactacion-contexto/SKILL.md +2 -1
  112. package/habilidades/contenedores-docker/SKILL.md +4 -2
  113. package/habilidades/css-moderno/SKILL.md +7 -1
  114. package/habilidades/diagrama-arquitectura/assets/template.html +276 -276
  115. package/habilidades/doubt-driven-review/SKILL.md +207 -207
  116. package/habilidades/doubt-driven-review/recursos/EXAMPLES.md +130 -130
  117. package/habilidades/drift-detection/SKILL.md +1 -1
  118. package/habilidades/ejecutar-task-iterativo/SKILL.md +278 -278
  119. package/habilidades/estructura-proyecto-claude/recursos/mcp-json-template.json +57 -57
  120. package/habilidades/extractor-de-aprendizajes/SKILL.md +12 -2
  121. package/habilidades/feynman-auditor-swl/recursos/preguntas-language-agnostic.md +108 -108
  122. package/habilidades/git-worktrees-paralelo/SKILL.md +19 -1
  123. package/habilidades/harness-claude-code/SKILL.md +315 -314
  124. package/habilidades/instalar-sistema/SKILL.md +227 -227
  125. package/habilidades/meta-skills-estandar/recursos/convencion-examples.md +93 -93
  126. package/habilidades/patrones-python/recursos/patrones-avanzados.md +469 -469
  127. package/habilidades/perfil-usuario/SKILL.md +200 -200
  128. package/habilidades/planear-fase/SKILL.md +358 -358
  129. package/habilidades/prevencion-sobreingenieria/recursos/EXAMPLES.md +580 -580
  130. package/habilidades/proceso-ddia-streaming/SKILL.md +231 -231
  131. package/habilidades/proceso-discovery-machote/SKILL.md +157 -157
  132. package/habilidades/proceso-dynamic-workflows/SKILL.md +60 -0
  133. package/habilidades/proceso-dynamic-workflows/recursos/template-adversarial-verify.js +65 -65
  134. package/habilidades/proceso-dynamic-workflows/recursos/template-triage.js +65 -65
  135. package/habilidades/proceso-ingenieria-requerimientos/SKILL.md +147 -147
  136. package/habilidades/proceso-intent-engineering/SKILL.md +269 -269
  137. package/habilidades/proceso-modular-split/SKILL.md +256 -256
  138. package/habilidades/release-semver/SKILL.md +2 -2
  139. package/habilidades/state-inconsistency-auditor-swl/recursos/coupled-state-patterns.md +147 -147
  140. package/habilidades/swl-claudemd/recursos/contrato-aprender.md +83 -83
  141. package/habilidades/swl-claudemd/recursos/duplicacion-reglas-globales.md +85 -85
  142. package/habilidades/swl-claudemd/recursos/plantillas-init.md +94 -94
  143. package/habilidades/tdd-workflow/SKILL.md +749 -749
  144. package/habilidades/tdd-workflow/recursos/gherkin-bdd.md +111 -111
  145. package/hooks/agente-lifecycle.js +1 -1
  146. package/hooks/audit-trail.js +1 -1
  147. package/hooks/auto-consolidacion.js +1 -1
  148. package/hooks/calidad-pre-commit.js +159 -10
  149. package/hooks/captura-acciones-post.js +1 -1
  150. package/hooks/captura-acciones-session.js +1 -1
  151. package/hooks/captura-feedback-usuario.js +1 -1
  152. package/hooks/ciclo-evolucion-subagente.js +26 -26
  153. package/hooks/ciclo-evolucion.js +26 -26
  154. package/hooks/contexto-iteracion.js +1 -1
  155. package/hooks/degradacion-instintos.js +1 -1
  156. package/hooks/grafo-contexto.js +1 -1
  157. package/hooks/guardrail-modelo.js +1 -1
  158. package/hooks/inbox-aviso.js +1 -1
  159. package/hooks/inyeccion-contexto.js +1 -1
  160. package/hooks/lib/agent-matcher.js +1 -1
  161. package/hooks/lib/agent-routing.js +1 -1
  162. package/hooks/lib/auto-consolidator.js +335 -335
  163. package/hooks/lib/captura-acciones.js +1 -1
  164. package/hooks/lib/ciclo-evolucion.js +47 -47
  165. package/hooks/lib/deep-links.js +185 -185
  166. package/hooks/lib/error-classifier.js +308 -308
  167. package/hooks/lib/etapa-metricas.js +1 -1
  168. package/hooks/lib/evolution-tracker.js +1 -1
  169. package/hooks/lib/gateway-notify.js +193 -193
  170. package/hooks/lib/mcp-health.js +1 -1
  171. package/hooks/lib/notificacion-formato.js +92 -0
  172. package/hooks/lib/nudge-tracker.js +1 -1
  173. package/hooks/lib/otlp-exporter.js +1 -1
  174. package/hooks/lib/propose-step.js +1 -1
  175. package/hooks/lib/provenance-tracker.js +191 -191
  176. package/hooks/lib/raiz-proyecto.js +158 -102
  177. package/hooks/lib/resource-quota.js +122 -122
  178. package/hooks/lib/retry-jitter.js +165 -165
  179. package/hooks/lib/run-log.js +1 -1
  180. package/hooks/lib/security-net.js +201 -201
  181. package/hooks/lib/singleton-guard.js +20 -13
  182. package/hooks/lib/skill-auditor.js +588 -588
  183. package/hooks/lib/sync-status.js +228 -228
  184. package/hooks/lib/taint-tracker.js +107 -107
  185. package/hooks/lib/telegram-cliente.js +11 -3
  186. package/hooks/lib/text-similarity.js +241 -241
  187. package/hooks/lib/toon-compressor.js +245 -245
  188. package/hooks/notificacion-telegram.js +17 -13
  189. package/hooks/preservar-estado-pre-compact.js +1 -1
  190. package/hooks/registro-turnos.js +1 -1
  191. package/hooks/resumen-sesion.js +1 -1
  192. package/hooks/risk-scoring.js +1 -1
  193. package/hooks/session-briefing.js +13 -5
  194. package/hooks/spec-gate.js +1 -1
  195. package/hooks/sugerir-regenerar-inventario.js +1 -1
  196. package/hooks/tdd-gate.js +1 -1
  197. package/hooks/telemetria-agentes.js +1 -1
  198. package/hooks/telemetria-skill-routing.js +1 -1
  199. package/hooks/tracking-costos.js +1 -1
  200. package/hooks/validar-formato-post-subagente.js +1 -1
  201. package/hooks/validar-intent-spec.js +1 -1
  202. package/hooks/validar-planning-paths.js +1 -1
  203. package/instintos/autonomia.yaml +27 -27
  204. package/instintos/prompt-appendices.yaml +57 -57
  205. package/llms.txt +29 -29
  206. package/manifiestos/agent-output-schemas.json +57 -57
  207. package/manifiestos/canonical-hashes.json +6250 -5257
  208. package/manifiestos/harness-ir.json +47536 -0
  209. package/manifiestos/modulos.json +1429 -1428
  210. package/manifiestos/policy-bundle.json +2065 -0
  211. package/manifiestos/policy-corpus-w2.json +3926 -0
  212. package/manifiestos/runtime-adapters-core3.json +208 -0
  213. package/manifiestos/runtime-conformance.json +139 -0
  214. package/manifiestos/skills-lock.json +1275 -1275
  215. package/package.json +94 -94
  216. package/plantillas/auditor-veto-template.md +105 -105
  217. package/plantillas/github-workflows/release-please.yml +44 -44
  218. package/plantillas/github-workflows/swl-ci.yml +107 -107
  219. package/plantillas/github-workflows/swl-security.yml +51 -51
  220. package/plugin.json +369 -369
  221. package/reglas/accesibilidad.md +10 -10
  222. package/reglas/auditorias-documentales-estructurales.md +7 -7
  223. package/reglas/cloud-infra.md +8 -8
  224. package/reglas/consultar-vault-primero.md +195 -195
  225. package/reglas/git-workflow.md +1 -0
  226. package/reglas/hooks.md +6 -6
  227. package/reglas/intent-engineering.md +218 -218
  228. package/reglas/markitdown.md +8 -8
  229. package/reglas/monitor-ci.md +12 -0
  230. package/reglas/patrones.md +6 -6
  231. package/reglas/testing.md +7 -7
  232. package/reglas/tests-cleanup.md +224 -224
  233. package/schemas/agent-message.schema.json +73 -73
  234. package/schemas/agent-output-implementacion.schema.json +114 -114
  235. package/schemas/agent-output-planificacion.schema.json +150 -150
  236. package/schemas/agent-output-review.schema.json +98 -98
  237. package/schemas/diary-entry.schema.json +112 -112
  238. package/schemas/gate-state.schema.json +76 -0
  239. package/schemas/harness-ir.schema.json +369 -0
  240. package/schemas/hook-profiles.schema.json +54 -54
  241. package/schemas/hooks-config.schema.json +89 -89
  242. package/schemas/legacy-gates.schema.json +45 -0
  243. package/schemas/modulos.schema.json +38 -38
  244. package/schemas/perfiles.schema.json +36 -36
  245. package/schemas/plugin.schema.json +77 -77
  246. package/schemas/policy-bundle.schema.json +140 -0
  247. package/schemas/policy-enforcement.schema.json +117 -0
  248. package/schemas/policy-operation.schema.json +261 -0
  249. package/schemas/runtime-adapter.schema.json +176 -0
  250. package/schemas/runtime-build-attestation.schema.json +100 -0
  251. package/schemas/runtime-conformance.schema.json +239 -0
  252. package/schemas/runtime-diagnostic.schema.json +395 -0
  253. package/schemas/skill-evals.schema.json +119 -119
  254. package/schemas/skill-frontmatter.schema.json +245 -245
  255. package/schemas/w4-certification-request.schema.json +72 -0
  256. package/schemas/w4-certification-verdict.schema.json +224 -0
  257. package/schemas/w4-corpus.schema.json +172 -0
  258. package/schemas/w4-mutation-report.schema.json +116 -0
  259. package/schemas/w4-replay-result.schema.json +164 -0
  260. package/schemas/w4-scoring-report.schema.json +89 -0
  261. package/scripts/audit-tools/audit-history.js +330 -330
  262. package/scripts/audit-tools/bundle-tracker.js +290 -290
  263. package/scripts/audit-tools/canary-monitor.js +352 -352
  264. package/scripts/audit-tools/code-profiler.js +605 -605
  265. package/scripts/audit-tools/dep-doctor.js +320 -320
  266. package/scripts/audit-tools/env-validator.js +206 -206
  267. package/scripts/audit-tools/lib/fs-walk.js +48 -48
  268. package/scripts/audit-tools/lib/output.js +23 -23
  269. package/scripts/audit-tools/migration-checker.js +392 -392
  270. package/scripts/audit-tools/pentest-scanner.js +1436 -1436
  271. package/scripts/auditar-clases-conocidas.js +134 -134
  272. package/scripts/bootstrap-instintos.js +88 -14
  273. package/scripts/canario-hooks.js +166 -166
  274. package/scripts/cli/aprobar-plan.js +73 -73
  275. package/scripts/cli/autonomia.js +23 -23
  276. package/scripts/cli/benchmark-memoria.js +37 -37
  277. package/scripts/cli/briefing.js +23 -23
  278. package/scripts/cli/ciclo-autonomo.js +73 -73
  279. package/scripts/cli/ciclo-evolucion.js +26 -26
  280. package/scripts/cli/ciclo-fase-b.js +102 -102
  281. package/scripts/cli/derivar-feature-list.js +25 -25
  282. package/scripts/cli/detectar-host.js +27 -27
  283. package/scripts/cli/diary-entry.js +69 -69
  284. package/scripts/cli/execution-state.js +18 -18
  285. package/scripts/cli/gateway-notify.js +41 -41
  286. package/scripts/cli/guardrail-metrics.js +39 -39
  287. package/scripts/cli/liberar-fase.js +42 -42
  288. package/scripts/cli/mark-evolved.js +56 -56
  289. package/scripts/cli/memoria-search.js +69 -69
  290. package/scripts/cli/metricas-dora.js +26 -26
  291. package/scripts/cli/near-duplicate.js +55 -55
  292. package/scripts/cli/notificaciones.js +123 -123
  293. package/scripts/cli/nudge-accionar.js +39 -39
  294. package/scripts/cli/propose-step.js +29 -29
  295. package/scripts/cli/run-eval.js +38 -38
  296. package/scripts/cli/schedule-parse.js +19 -19
  297. package/scripts/cli/sugerir-modelo.js +20 -20
  298. package/scripts/cli/verificar-plan.js +36 -36
  299. package/scripts/cli/verificar-trazabilidad.js +35 -35
  300. package/scripts/comandos/install-asistido.js +8 -7
  301. package/scripts/configurar-branch-protection.js +418 -418
  302. package/scripts/detectar-aprendizajes-duplicados.js +151 -151
  303. package/scripts/doctor.js +61 -13
  304. package/scripts/evidencia-valor.js +101 -101
  305. package/scripts/field-report.js +16 -16
  306. package/scripts/generar-checklists-consolidados.js +273 -273
  307. package/scripts/generar-claims-runtime.js +1342 -0
  308. package/scripts/generar-harness-ir.js +257 -0
  309. package/scripts/generar-inventario.js +52 -54
  310. package/scripts/generar-policy-bundle.js +202 -0
  311. package/scripts/instalador.js +39 -7
  312. package/scripts/lib/activar-hooks-proyecto.js +116 -116
  313. package/scripts/lib/approval-receipts.js +190 -0
  314. package/scripts/lib/artefactos-python.js +43 -43
  315. package/scripts/lib/benchmark-metrics.js +160 -160
  316. package/scripts/lib/budget-enforcer.js +252 -252
  317. package/scripts/lib/certificacion-loop-state.js +421 -0
  318. package/scripts/lib/ci-reader.js +193 -193
  319. package/scripts/lib/ciclo-autonomo/candidatos.js +174 -174
  320. package/scripts/lib/ciclo-autonomo/config.js +165 -165
  321. package/scripts/lib/ciclo-autonomo/drenador-feedback.js +174 -174
  322. package/scripts/lib/ciclo-autonomo/fallback.js +77 -77
  323. package/scripts/lib/ciclo-autonomo/guard-convivencia.js +139 -139
  324. package/scripts/lib/ciclo-autonomo/higiene-nudges.js +112 -112
  325. package/scripts/lib/ciclo-autonomo/index.js +301 -301
  326. package/scripts/lib/ciclo-autonomo/lock.js +124 -124
  327. package/scripts/lib/ciclo-autonomo/presupuesto.js +122 -122
  328. package/scripts/lib/ciclo-autonomo/puente-degradacion.js +240 -240
  329. package/scripts/lib/ciclo-autonomo/runner-fase-b.js +248 -248
  330. package/scripts/lib/ciclo-autonomo/writer-instintos.js +190 -190
  331. package/scripts/lib/ciclo-autonomo/yaml-instintos.js +591 -535
  332. package/scripts/lib/clasificar-directorio.js +92 -0
  333. package/scripts/lib/contadores-inventario.js +217 -217
  334. package/scripts/lib/detectar-host-swl.js +175 -175
  335. package/scripts/lib/detectar-runtime.js +29 -20
  336. package/scripts/lib/detectar-stack-detallado.js +307 -307
  337. package/scripts/lib/detector-autoduplicacion-intra-archivo.js +234 -234
  338. package/scripts/lib/detector-reglas-duplicadas.js +220 -220
  339. package/scripts/lib/eval-metrics-store.js +218 -218
  340. package/scripts/lib/eval-quality.js +171 -171
  341. package/scripts/lib/eval-schemas.js +144 -144
  342. package/scripts/lib/eval-self-correct.js +106 -106
  343. package/scripts/lib/eval-validator.js +185 -185
  344. package/scripts/lib/evidence-verifier.js +192 -0
  345. package/scripts/lib/evidencia-release.js +322 -322
  346. package/scripts/lib/evidencia-valor.js +228 -228
  347. package/scripts/lib/expandir-targets.js +71 -71
  348. package/scripts/lib/frontmatter-canonico.js +509 -0
  349. package/scripts/lib/gate-engine.js +871 -0
  350. package/scripts/lib/gate-hooks-requires.js +249 -249
  351. package/scripts/lib/gate-licencias.js +212 -212
  352. package/scripts/lib/git-config-preflight.js +48 -0
  353. package/scripts/lib/git-metricas.js +257 -257
  354. package/scripts/lib/harness-ir.js +778 -0
  355. package/scripts/lib/harness-source-snapshot.js +309 -0
  356. package/scripts/lib/integrity-ledger.js +1147 -0
  357. package/scripts/lib/jaccard-similarity.js +98 -98
  358. package/scripts/lib/legacy-gate-migration.js +324 -0
  359. package/scripts/lib/limpiar-basura-global.js +204 -0
  360. package/scripts/lib/longmemeval-runner.js +125 -125
  361. package/scripts/lib/metricas-dora.js +204 -204
  362. package/scripts/lib/notificaciones-telegram.js +1 -0
  363. package/scripts/lib/npm-version.js +1 -0
  364. package/scripts/lib/paquetes-conocidos.js +50 -50
  365. package/scripts/lib/plan-lock.js +61 -13
  366. package/scripts/lib/policy-broker.js +338 -0
  367. package/scripts/lib/policy-bundle.js +342 -0
  368. package/scripts/lib/policy-context-provider.js +310 -0
  369. package/scripts/lib/policy-contract.js +479 -0
  370. package/scripts/lib/policy-verifier-utils.js +65 -0
  371. package/scripts/lib/pr-analyzer.js +399 -399
  372. package/scripts/lib/principal-verifier.js +178 -0
  373. package/scripts/lib/prompt-builder.js +264 -264
  374. package/scripts/lib/resolver-plan-fase.js +37 -37
  375. package/scripts/lib/rrf-fusion.js +175 -175
  376. package/scripts/lib/runtime-adapter-contract.js +267 -0
  377. package/scripts/lib/runtime-artifact-verifier.js +426 -0
  378. package/scripts/lib/runtime-build-attestation.js +127 -0
  379. package/scripts/lib/runtime-bundle-installer.js +586 -0
  380. package/scripts/lib/runtime-compiler.js +327 -0
  381. package/scripts/lib/runtime-conformance.js +202 -0
  382. package/scripts/lib/runtime-doctor-core3.js +567 -0
  383. package/scripts/lib/runtime-doctor-input.js +59 -0
  384. package/scripts/lib/runtime-operation-adapter.js +267 -0
  385. package/scripts/lib/schema-version.js +164 -164
  386. package/scripts/lib/semantic-search.js +252 -252
  387. package/scripts/lib/signed-envelope.js +545 -0
  388. package/scripts/lib/single-use-store.js +359 -0
  389. package/scripts/lib/skills-externas.js +31 -0
  390. package/scripts/lib/toml-merge.js +204 -204
  391. package/scripts/lib/transformadores/codex.js +15 -8
  392. package/scripts/lib/transformadores/gemini.js +79 -5
  393. package/scripts/lib/w4-attestation-adapter.js +158 -0
  394. package/scripts/lib/w4-canario.js +337 -0
  395. package/scripts/lib/w4-claims.js +182 -0
  396. package/scripts/lib/w4-corpus-generador.js +542 -0
  397. package/scripts/lib/w4-gate-c5.js +115 -0
  398. package/scripts/lib/w4-harness-bajo-prueba.js +155 -0
  399. package/scripts/lib/w4-matriz-combos.js +55 -0
  400. package/scripts/lib/w4-motor-mutacion.js +1348 -0
  401. package/scripts/lib/w4-motor-replay.js +735 -0
  402. package/scripts/lib/w4-pin-origen.js +54 -0
  403. package/scripts/lib/w4-publicar-request.js +132 -0
  404. package/scripts/lib/w4-revocacion.js +62 -0
  405. package/scripts/lib/w4-runtimes-core3.js +38 -0
  406. package/scripts/lib/w4-scorer-certificacion.js +692 -0
  407. package/scripts/lib/w4-superficie-candidato.js +49 -0
  408. package/scripts/lib/w4-veredicto.js +452 -0
  409. package/scripts/lib/w4-verificar-veredicto.js +302 -0
  410. package/scripts/limpiar-artefactos-python.js +131 -131
  411. package/scripts/mcp-server/auth.js +105 -105
  412. package/scripts/mcp-server/cache.js +106 -106
  413. package/scripts/migrar-csv-a-array.js +168 -168
  414. package/scripts/migrar-fase-dominio.js +200 -200
  415. package/scripts/migrar-gates-legacy.js +108 -0
  416. package/scripts/publicar-certification-request.js +115 -0
  417. package/scripts/runtime-doctor.js +107 -0
  418. package/scripts/tui/componentes/selector-multi.js +189 -189
  419. package/scripts/tui/componentes/selector-unico.js +158 -158
  420. package/scripts/tui/ejecutores.js +375 -375
  421. package/scripts/tui/lib/colores.js +129 -129
  422. package/scripts/tui/lib/render.js +264 -264
  423. package/scripts/tui/lib/teclas.js +113 -113
  424. package/scripts/tui/pantallas/install-wizard.js +408 -403
  425. package/scripts/tui/pantallas/menu-principal.js +52 -52
  426. package/scripts/tui/pantallas/progreso.js +274 -274
  427. package/scripts/tui/pantallas/resumen.js +132 -132
  428. package/scripts/validar-userland-vacio.js +110 -110
  429. package/scripts/verificar-aislamiento-swl-eval.js +87 -0
  430. package/scripts/verificar-empaquetado-downstream.js +375 -0
  431. package/scripts/verificar-loop-constructor.js +215 -0
  432. package/scripts/verificar-trazabilidad.js +13 -6
  433. package/scripts/verificar-veredicto-real.js +84 -0
  434. package/instintos/.backups/perfil-usuario.yaml.2026-07-10-165128.bak +0 -53
  435. package/instintos/.backups/proyecto.yaml.2026-07-10-165128.bak +0 -372
@@ -1,134 +1,134 @@
1
- #!/usr/bin/env node
2
- 'use strict';
3
-
4
- /**
5
- * auditar-clases-conocidas.js — Gate de clases de bug ya documentadas.
6
- *
7
- * "El conocimiento documentado no previene — solo los gates previenen."
8
- * Cada clase de este gate mordió al proyecto en producción pese a estar
9
- * escrita como regla/aprendizaje. El gate la vuelve imposible de reintroducir:
10
- *
11
- * C1 — Fecha UTC truncada: toISOString + slice(0,10) fecha artefactos
12
- * "mañana" desde México (23 instancias corregidas 2026-07-08/09).
13
- * Correcto: `toLocaleDateString('sv')`. Escape: `// fecha-utc-ok`.
14
- * (El patrón no se escribe literal aquí: el gate escanea este archivo
15
- * también — se auto-detectó en el publish v2.5.1.)
16
- * C2 — Comparación byte a byte en modos --check: comparar texto leído de
17
- * disco sin normalizar EOL revienta con CRLF tras checkout/reset de
18
- * git (tumbó el publish v2.5.0). Un script con modo --check que lee
19
- * texto debe normalizar `\r\n` o comparar estructuras (JSON.parse).
20
- * Escape: `// eol-ok: <razón>`.
21
- * C3 — Bloqueo ciego en hooks: exit(2) sin console.error deja al modelo
22
- * sin la razón del bloqueo (el canal de exit 2 es stderr).
23
- * C4 — Ancla .planning/instintos al CWD crudo en hooks: en monorepos con
24
- * sesión abierta en un subdirectorio fragmenta la memoria del proyecto
25
- * en árboles huérfanos (DT-HOOKS-RAIZ-GIT, reportes de campo oic+sigm
26
- * 2026-07-10; flota completa migrada el mismo día). Correcto:
27
- * `raizProyecto(process.cwd())` de hooks/lib/raiz-proyecto.js.
28
- * Escape: `// raiz-ok: <razón>`. Solo hooks/** — los scripts CLI se
29
- * invocan desde la raíz del proyecto por contrato, y el instalador
30
- * ancla al cwd DELIBERADAMENTE (instala hacia ese proyecto; saltar a
31
- * un repo padre sería un bug).
32
- *
33
- * Alcance: archivos .js versionados en scripts/, hooks/, bin/, gateway/ y
34
- * los scripts ejecutables de skills (habilidades/<skill>/scripts/) —
35
- * parse-commits.js escapó al gate C1 hasta 2026-07-10 por no estar en el alcance.
36
- * (tests/ excluido: los tests DEBEN poder citar el patrón para validarlo.)
37
- * Exit: 0 limpio · 1 con hallazgos.
38
- */
39
-
40
- const { execFileSync } = require('child_process');
41
- const fs = require('fs');
42
- const path = require('path');
43
-
44
- const RAIZ = path.resolve(__dirname, '..');
45
-
46
- const RX_UTC = /toISOString\(\)\s*\.\s*(?:slice|substring)\s*\(\s*0\s*,\s*10\s*\)/;
47
- const RX_ESCAPE_UTC = /fecha-utc-ok/;
48
- const RX_ESCAPE_EOL = /eol-ok:/;
49
- // C4: join directo del cwd crudo con .planning o instintos. El patrón se
50
- // construye por concatenación para que el gate no se detecte a sí mismo.
51
- const RX_CWD_PLANNING = new RegExp(
52
- 'join\\(\\s*process\\.cwd\\(\\)\\s*,\\s*[\'"]' + '(?:\\.plan' + 'ning|instin' + 'tos)'
53
- );
54
- const RX_ESCAPE_RAIZ = /raiz-ok:/;
55
-
56
- function archivosObjetivo() {
57
- const salida = execFileSync('git', [
58
- 'ls-files', '--',
59
- 'scripts/*.js', 'scripts/**/*.js',
60
- 'hooks/*.js', 'hooks/**/*.js',
61
- 'bin/*.js',
62
- 'gateway/*.js', 'gateway/**/*.js',
63
- 'habilidades/*/scripts/*.js', 'habilidades/*/scripts/**/*.js',
64
- ], { cwd: RAIZ, encoding: 'utf8' });
65
- return salida.split(/\r?\n/).filter(f => f && !f.includes('vendor/'));
66
- }
67
-
68
- function auditarUtc(ruta, lineas, hallazgos) {
69
- lineas.forEach((linea, i) => {
70
- if (RX_UTC.test(linea) && !RX_ESCAPE_UTC.test(linea)) {
71
- hallazgos.push(`[C1 fecha-UTC] ${ruta}:${i + 1} — toISOString().slice(0,10) fecha "mañana" desde UTC-6; usar toLocaleDateString('sv') o marcar \`// fecha-utc-ok\` si la semántica UTC es deliberada`);
72
- }
73
- });
74
- }
75
-
76
- function auditarEolCheck(ruta, contenido, hallazgos) {
77
- // Aplica solo a GENERADORES con modo --check (escriben el artefacto y en
78
- // check comparan lo regenerado contra disco). Un --check selector de
79
- // sub-checks (verificar-docs) no compara texto por igualdad — no aplica.
80
- if (!contenido.includes("'--check'") && !contenido.includes('"--check"')) return;
81
- if (!/atomicWrite|writeFileSync/.test(contenido)) return;
82
- if (!/readFileSync\([^)]*utf-?8/i.test(contenido)) return;
83
- const normaliza = contenido.includes('\\r\\n') || contenido.includes('\\r?\\n');
84
- const comparaEstructura = contenido.includes('JSON.parse');
85
- const escape = RX_ESCAPE_EOL.test(contenido);
86
- if (!normaliza && !comparaEstructura && !escape) {
87
- hallazgos.push(`[C2 EOL] ${ruta} — modo --check que lee texto sin normalizar \\r\\n ni comparar estructuras: reventará con CRLF tras checkout/reset de git (caso publish v2.5.0). Normalizar EOL antes de comparar o marcar \`// eol-ok: <razón>\``);
88
- }
89
- }
90
-
91
- function auditarBloqueoCiego(ruta, contenido, hallazgos) {
92
- if (!ruta.startsWith('hooks/') || ruta.startsWith('hooks/lib/')) return;
93
- const usaExit2 = /exit\(2\)|exitCode\s*=\s*2/.test(contenido);
94
- const escribeStderr = contenido.includes('console.error') || contenido.includes('process.stderr.write');
95
- if (usaExit2 && !escribeStderr) {
96
- hallazgos.push(`[C3 bloqueo-ciego] ${ruta} — usa exit 2 sin escribir a stderr (console.error/process.stderr.write): el modelo recibe el bloqueo sin la razón`);
97
- }
98
- }
99
-
100
- function auditarCwdPlanning(ruta, lineas, hallazgos) {
101
- if (!ruta.startsWith('hooks/')) return;
102
- lineas.forEach((linea, i) => {
103
- if (RX_CWD_PLANNING.test(linea) && !RX_ESCAPE_RAIZ.test(linea)) {
104
- hallazgos.push(`[C4 raiz-proyecto] ${ruta}:${i + 1} — ancla .planning/instintos a process.cwd() crudo: fragmenta la memoria en monorepos (DT-HOOKS-RAIZ-GIT); usar raizProyecto(process.cwd()) de hooks/lib/raiz-proyecto.js o marcar \`// raiz-ok: <razón>\``);
105
- }
106
- });
107
- }
108
-
109
- function main() {
110
- const hallazgos = [];
111
- const archivos = archivosObjetivo();
112
- for (const ruta of archivos) {
113
- let contenido;
114
- try {
115
- contenido = fs.readFileSync(path.join(RAIZ, ruta), 'utf8');
116
- } catch { continue; }
117
- const lineas = contenido.split(/\r?\n/);
118
- auditarUtc(ruta, lineas, hallazgos);
119
- auditarEolCheck(ruta, contenido, hallazgos);
120
- auditarBloqueoCiego(ruta, contenido, hallazgos);
121
- auditarCwdPlanning(ruta, lineas, hallazgos);
122
- }
123
-
124
- if (hallazgos.length === 0) {
125
- console.log(`[clases-conocidas] OK — ${archivos.length} archivos, 0 reincidencias de clases documentadas (C1 UTC, C2 EOL, C3 bloqueo ciego, C4 ancla cwd)`);
126
- return;
127
- }
128
- console.error(`[clases-conocidas] ${hallazgos.length} reincidencia(s) de clases de bug documentadas:`);
129
- for (const h of hallazgos) console.error(' ' + h);
130
- process.exitCode = 1;
131
- }
132
-
133
- module.exports = { auditarUtc, auditarEolCheck, auditarBloqueoCiego, auditarCwdPlanning };
134
- if (require.main === module) main();
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ /**
5
+ * auditar-clases-conocidas.js — Gate de clases de bug ya documentadas.
6
+ *
7
+ * "El conocimiento documentado no previene — solo los gates previenen."
8
+ * Cada clase de este gate mordió al proyecto en producción pese a estar
9
+ * escrita como regla/aprendizaje. El gate la vuelve imposible de reintroducir:
10
+ *
11
+ * C1 — Fecha UTC truncada: toISOString + slice(0,10) fecha artefactos
12
+ * "mañana" desde México (23 instancias corregidas 2026-07-08/09).
13
+ * Correcto: `toLocaleDateString('sv')`. Escape: `// fecha-utc-ok`.
14
+ * (El patrón no se escribe literal aquí: el gate escanea este archivo
15
+ * también — se auto-detectó en el publish v2.5.1.)
16
+ * C2 — Comparación byte a byte en modos --check: comparar texto leído de
17
+ * disco sin normalizar EOL revienta con CRLF tras checkout/reset de
18
+ * git (tumbó el publish v2.5.0). Un script con modo --check que lee
19
+ * texto debe normalizar `\r\n` o comparar estructuras (JSON.parse).
20
+ * Escape: `// eol-ok: <razón>`.
21
+ * C3 — Bloqueo ciego en hooks: exit(2) sin console.error deja al modelo
22
+ * sin la razón del bloqueo (el canal de exit 2 es stderr).
23
+ * C4 — Ancla .planning/instintos al CWD crudo en hooks: en monorepos con
24
+ * sesión abierta en un subdirectorio fragmenta la memoria del proyecto
25
+ * en árboles huérfanos (DT-HOOKS-RAIZ-GIT, reportes de campo oic+sigm
26
+ * 2026-07-10; flota completa migrada el mismo día). Correcto:
27
+ * `raizProyecto(process.cwd())` de hooks/lib/raiz-proyecto.js.
28
+ * Escape: `// raiz-ok: <razón>`. Solo hooks/** — los scripts CLI se
29
+ * invocan desde la raíz del proyecto por contrato, y el instalador
30
+ * ancla al cwd DELIBERADAMENTE (instala hacia ese proyecto; saltar a
31
+ * un repo padre sería un bug).
32
+ *
33
+ * Alcance: archivos .js versionados en scripts/, hooks/, bin/, gateway/ y
34
+ * los scripts ejecutables de skills (habilidades/<skill>/scripts/) —
35
+ * parse-commits.js escapó al gate C1 hasta 2026-07-10 por no estar en el alcance.
36
+ * (tests/ excluido: los tests DEBEN poder citar el patrón para validarlo.)
37
+ * Exit: 0 limpio · 1 con hallazgos.
38
+ */
39
+
40
+ const { execFileSync } = require('child_process');
41
+ const fs = require('fs');
42
+ const path = require('path');
43
+
44
+ const RAIZ = path.resolve(__dirname, '..');
45
+
46
+ const RX_UTC = /toISOString\(\)\s*\.\s*(?:slice|substring)\s*\(\s*0\s*,\s*10\s*\)/;
47
+ const RX_ESCAPE_UTC = /fecha-utc-ok/;
48
+ const RX_ESCAPE_EOL = /eol-ok:/;
49
+ // C4: join directo del cwd crudo con .planning o instintos. El patrón se
50
+ // construye por concatenación para que el gate no se detecte a sí mismo.
51
+ const RX_CWD_PLANNING = new RegExp(
52
+ 'join\\(\\s*process\\.cwd\\(\\)\\s*,\\s*[\'"]' + '(?:\\.plan' + 'ning|instin' + 'tos)'
53
+ );
54
+ const RX_ESCAPE_RAIZ = /raiz-ok:/;
55
+
56
+ function archivosObjetivo() {
57
+ const salida = execFileSync('git', [
58
+ 'ls-files', '--',
59
+ 'scripts/*.js', 'scripts/**/*.js',
60
+ 'hooks/*.js', 'hooks/**/*.js',
61
+ 'bin/*.js',
62
+ 'gateway/*.js', 'gateway/**/*.js',
63
+ 'habilidades/*/scripts/*.js', 'habilidades/*/scripts/**/*.js',
64
+ ], { cwd: RAIZ, encoding: 'utf8' });
65
+ return salida.split(/\r?\n/).filter(f => f && !f.includes('vendor/'));
66
+ }
67
+
68
+ function auditarUtc(ruta, lineas, hallazgos) {
69
+ lineas.forEach((linea, i) => {
70
+ if (RX_UTC.test(linea) && !RX_ESCAPE_UTC.test(linea)) {
71
+ hallazgos.push(`[C1 fecha-UTC] ${ruta}:${i + 1} — toISOString().slice(0,10) fecha "mañana" desde UTC-6; usar toLocaleDateString('sv') o marcar \`// fecha-utc-ok\` si la semántica UTC es deliberada`);
72
+ }
73
+ });
74
+ }
75
+
76
+ function auditarEolCheck(ruta, contenido, hallazgos) {
77
+ // Aplica solo a GENERADORES con modo --check (escriben el artefacto y en
78
+ // check comparan lo regenerado contra disco). Un --check selector de
79
+ // sub-checks (verificar-docs) no compara texto por igualdad — no aplica.
80
+ if (!contenido.includes("'--check'") && !contenido.includes('"--check"')) return;
81
+ if (!/atomicWrite|writeFileSync/.test(contenido)) return;
82
+ if (!/readFileSync\([^)]*utf-?8/i.test(contenido)) return;
83
+ const normaliza = contenido.includes('\\r\\n') || contenido.includes('\\r?\\n');
84
+ const comparaEstructura = contenido.includes('JSON.parse');
85
+ const escape = RX_ESCAPE_EOL.test(contenido);
86
+ if (!normaliza && !comparaEstructura && !escape) {
87
+ hallazgos.push(`[C2 EOL] ${ruta} — modo --check que lee texto sin normalizar \\r\\n ni comparar estructuras: reventará con CRLF tras checkout/reset de git (caso publish v2.5.0). Normalizar EOL antes de comparar o marcar \`// eol-ok: <razón>\``);
88
+ }
89
+ }
90
+
91
+ function auditarBloqueoCiego(ruta, contenido, hallazgos) {
92
+ if (!ruta.startsWith('hooks/') || ruta.startsWith('hooks/lib/')) return;
93
+ const usaExit2 = /exit\(2\)|exitCode\s*=\s*2/.test(contenido);
94
+ const escribeStderr = contenido.includes('console.error') || contenido.includes('process.stderr.write');
95
+ if (usaExit2 && !escribeStderr) {
96
+ hallazgos.push(`[C3 bloqueo-ciego] ${ruta} — usa exit 2 sin escribir a stderr (console.error/process.stderr.write): el modelo recibe el bloqueo sin la razón`);
97
+ }
98
+ }
99
+
100
+ function auditarCwdPlanning(ruta, lineas, hallazgos) {
101
+ if (!ruta.startsWith('hooks/')) return;
102
+ lineas.forEach((linea, i) => {
103
+ if (RX_CWD_PLANNING.test(linea) && !RX_ESCAPE_RAIZ.test(linea)) {
104
+ hallazgos.push(`[C4 raiz-proyecto] ${ruta}:${i + 1} — ancla .planning/instintos a process.cwd() crudo: fragmenta la memoria en monorepos (DT-HOOKS-RAIZ-GIT); usar raizProyecto(process.cwd()) de hooks/lib/raiz-proyecto.js o marcar \`// raiz-ok: <razón>\``);
105
+ }
106
+ });
107
+ }
108
+
109
+ function main() {
110
+ const hallazgos = [];
111
+ const archivos = archivosObjetivo();
112
+ for (const ruta of archivos) {
113
+ let contenido;
114
+ try {
115
+ contenido = fs.readFileSync(path.join(RAIZ, ruta), 'utf8');
116
+ } catch { continue; }
117
+ const lineas = contenido.split(/\r?\n/);
118
+ auditarUtc(ruta, lineas, hallazgos);
119
+ auditarEolCheck(ruta, contenido, hallazgos);
120
+ auditarBloqueoCiego(ruta, contenido, hallazgos);
121
+ auditarCwdPlanning(ruta, lineas, hallazgos);
122
+ }
123
+
124
+ if (hallazgos.length === 0) {
125
+ console.log(`[clases-conocidas] OK — ${archivos.length} archivos, 0 reincidencias de clases documentadas (C1 UTC, C2 EOL, C3 bloqueo ciego, C4 ancla cwd)`);
126
+ return;
127
+ }
128
+ console.error(`[clases-conocidas] ${hallazgos.length} reincidencia(s) de clases de bug documentadas:`);
129
+ for (const h of hallazgos) console.error(' ' + h);
130
+ process.exitCode = 1;
131
+ }
132
+
133
+ module.exports = { auditarUtc, auditarEolCheck, auditarBloqueoCiego, auditarCwdPlanning };
134
+ if (require.main === module) main();
@@ -5,9 +5,23 @@
5
5
  * bootstrap-instintos.js
6
6
  *
7
7
  * Pobla instintos/proyecto.yaml inicial a partir de las entradas de
8
- * .planning/APRENDIZAJES.md. Cada entrada `### [YYYY-MM-DD] título` se
9
- * convierte en un instinto con confidence inicial según la sección que lo
10
- * contiene:
8
+ * .planning/APRENDIZAJES.md. Reconoce dos formatos de entrada:
9
+ *
10
+ * ### [YYYY-MM-DD] Título (formato histórico)
11
+ * ### L-NNN: Título (RATING, Tipo X → destino) (formato /swl:aprender actual)
12
+ *
13
+ * Para el formato L-NNN, la fecha se toma de una línea `**valid_at**: YYYY-MM-DD`
14
+ * dentro del cuerpo de la entrada (o de la fecha del encabezado `## [YYYY-MM-DD] ...`
15
+ * que la contiene, si la trae); si ninguna aparece, se usa la fecha de generación.
16
+ * El rating (HIGH/MEDIUM/LOW) y el Tipo (A/B/C/D) del título, cuando existen,
17
+ * tienen prioridad sobre la confidence/tags inferidas de la sección — son más
18
+ * específicos a la entrada individual que el título de la sección que la contiene.
19
+ *
20
+ * Gap conocido, no cubierto: entradas registradas como ítem de lista numerada
21
+ * dentro de un bloque de sesión (`4. **[L-285]** ...`) sin encabezado `###`
22
+ * propio — requieren un parser de listas dedicado, fuera del alcance de este fix.
23
+ *
24
+ * Cada instinto recibe confidence inicial según la sección que lo contiene:
11
25
  *
12
26
  * ## Anti-patrones detectados → confidence 0.7, tags: [anti-patron]
13
27
  * ## Patrones exitosos → confidence 0.6, tags: [patron]
@@ -81,21 +95,54 @@ function detectarConfidence(seccion) {
81
95
  return { confidence: 0.5, tags: [] };
82
96
  }
83
97
 
98
+ /**
99
+ * Detecta un rating (HIGH/MEDIUM/LOW) en el título de una entrada `### L-NNN: ...`.
100
+ * Más específico que la confidence por sección — prioridad cuando existe.
101
+ * @param {string} titulo
102
+ * @returns {number|null}
103
+ */
104
+ function detectarConfidenceDeTitulo(titulo) {
105
+ const t = titulo || '';
106
+ if (/\bHIGH\b/i.test(t)) return 0.8;
107
+ if (/\bMEDIUM\b/i.test(t)) return 0.6;
108
+ if (/\bLOW\b/i.test(t)) return 0.4;
109
+ return null;
110
+ }
111
+
112
+ /**
113
+ * Detecta el Tipo (A/B/C/D, taxonomía de /swl:aprender § Paso 4) en el título
114
+ * de una entrada `### L-NNN: ...` y lo mapea a un tag. Más específico que los
115
+ * tags por sección — prioridad cuando existe al menos un match.
116
+ * @param {string} titulo
117
+ * @returns {string[]}
118
+ */
119
+ function detectarTagsDeTitulo(titulo) {
120
+ const t = titulo || '';
121
+ const tags = [];
122
+ if (/\bTipo\s*A\b/.test(t)) tags.push('regla-proyecto');
123
+ if (/\bTipo\s*B\b/.test(t)) tags.push('anti-patron');
124
+ if (/\bTipo\s*C\b/.test(t)) tags.push('nueva-habilidad');
125
+ if (/\bTipo\s*D\b/.test(t)) tags.push('metodologia');
126
+ return tags;
127
+ }
128
+
84
129
  // ---------------------------------------------------------------------------
85
130
  // Parser de APRENDIZAJES.md
86
131
  // ---------------------------------------------------------------------------
87
132
 
88
133
  /**
89
134
  * Parsea el markdown en objetos de instinto.
90
- * Formato esperado por entrada:
135
+ * Formatos reconocidos por entrada:
91
136
  * ## Sección
92
- * ### [YYYY-MM-DD] Título
93
- * Párrafo de descripción (puede ser multi-línea hasta el siguiente ###)
137
+ * ### [YYYY-MM-DD] Título — histórico
138
+ * ### L-NNN: Título (RATING, Tipo X destino) actual (/swl:aprender)
139
+ * Párrafo de descripción (puede ser multi-línea hasta el siguiente ### o ##).
94
140
  */
95
141
  function parsearAprendizajes(texto) {
96
142
  const lineas = texto.split(/\r?\n/);
97
143
  const entradas = [];
98
144
  let seccionActual = '';
145
+ let fechaSeccionActual = null;
99
146
  let actual = null;
100
147
 
101
148
  const flushActual = () => {
@@ -110,15 +157,17 @@ function parsearAprendizajes(texto) {
110
157
  for (const raw of lineas) {
111
158
  const linea = raw.replace(/\s+$/, '');
112
159
 
113
- // Sección (##)
160
+ // Sección (## sin ser ###) — puede traer su propia fecha "## [YYYY-MM-DD] ..."
114
161
  const mSec = linea.match(/^##\s+(.+)$/);
115
162
  if (mSec && !linea.startsWith('###')) {
116
163
  flushActual();
117
164
  seccionActual = mSec[1].trim();
165
+ const mFechaSec = seccionActual.match(/^\[(\d{4}-\d{2}-\d{2})\]/);
166
+ fechaSeccionActual = mFechaSec ? mFechaSec[1] : null;
118
167
  continue;
119
168
  }
120
169
 
121
- // Entrada (### [YYYY-MM-DD] Título)
170
+ // Entrada formato histórico: ### [YYYY-MM-DD] Título
122
171
  const mEntry = linea.match(/^###\s+\[(\d{4}-\d{2}-\d{2})\]\s+(.+)$/);
123
172
  if (mEntry) {
124
173
  flushActual();
@@ -131,9 +180,26 @@ function parsearAprendizajes(texto) {
131
180
  continue;
132
181
  }
133
182
 
134
- // Acumular descripción si tenemos entrada activa
183
+ // Entrada formato actual: ### L-NNN: Título (RATING, Tipo X → destino)
184
+ const mEntryL = linea.match(/^###\s+L-\d+:\s*(.+)$/);
185
+ if (mEntryL) {
186
+ flushActual();
187
+ actual = {
188
+ fecha: fechaSeccionActual, // se corrige abajo con **valid_at** si aparece
189
+ titulo: mEntryL[1].trim(),
190
+ seccion: seccionActual,
191
+ _descParts: [],
192
+ };
193
+ continue;
194
+ }
195
+
196
+ // Acumular descripción / capturar valid_at si tenemos entrada activa
135
197
  if (actual) {
136
198
  const t = linea.trim();
199
+ if (t) {
200
+ const mValidAt = t.match(/\*\*valid_at\*\*:\s*(\d{4}-\d{2}-\d{2})/);
201
+ if (mValidAt) actual.fecha = mValidAt[1];
202
+ }
137
203
  if (t && !t.startsWith('#') && !t.startsWith('---')) {
138
204
  actual._descParts.push(t);
139
205
  }
@@ -161,9 +227,14 @@ function truncate(s, n) {
161
227
  function generarInstintos(entradas) {
162
228
  const hoy = new Date().toLocaleDateString('sv');
163
229
  return entradas.map((e, idx) => {
164
- const { confidence, tags } = detectarConfidence(e.seccion);
230
+ const base = detectarConfidence(e.seccion);
231
+ const confidenceTitulo = detectarConfidenceDeTitulo(e.titulo);
232
+ const tagsTitulo = detectarTagsDeTitulo(e.titulo);
233
+ const confidence = confidenceTitulo != null ? confidenceTitulo : base.confidence;
234
+ const tags = tagsTitulo.length > 0 ? tagsTitulo : base.tags;
165
235
  const pattern = truncate(e.titulo, 200);
166
236
  const description = truncate(e.description || e.titulo, 500);
237
+ const fecha = e.fecha || hoy;
167
238
  return {
168
239
  id: `inst-${String(idx + 1).padStart(3, '0')}`,
169
240
  pattern,
@@ -172,8 +243,8 @@ function generarInstintos(entradas) {
172
243
  scope: 'project',
173
244
  source: 'APRENDIZAJES.md',
174
245
  evidence_count: 1,
175
- last_validated: e.fecha,
176
- last_validated_at: e.fecha,
246
+ last_validated: fecha,
247
+ last_validated_at: fecha,
177
248
  contradictions: 0,
178
249
  status: 'active',
179
250
  tags,
@@ -242,7 +313,7 @@ function main() {
242
313
  const entradas = parsearAprendizajes(texto);
243
314
 
244
315
  if (entradas.length === 0) {
245
- console.log('No se detectaron entradas en APRENDIZAJES.md (patrón "### [YYYY-MM-DD] Título").');
316
+ console.log('No se detectaron entradas en APRENDIZAJES.md (patrones "### [YYYY-MM-DD] Título" o "### L-NNN: Título").');
246
317
  return;
247
318
  }
248
319
 
@@ -277,6 +348,9 @@ function main() {
277
348
  }
278
349
  }
279
350
 
351
+ const dirInstintos = path.dirname(INSTINTOS_PATH);
352
+ if (!fs.existsSync(dirInstintos)) fs.mkdirSync(dirInstintos, { recursive: true });
353
+
280
354
  const yaml = serializarYaml(instintos);
281
355
  atomicWriteSync(INSTINTOS_PATH, yaml, 'utf8');
282
356
  console.log(`\nOK: ${instintos.length} instintos escritos en ${INSTINTOS_PATH}`);
@@ -284,4 +358,4 @@ function main() {
284
358
 
285
359
  if (require.main === module) main();
286
360
 
287
- module.exports = { parsearAprendizajes, generarInstintos, detectarConfidence, inferirTipoMemoria, main };
361
+ module.exports = { parsearAprendizajes, generarInstintos, detectarConfidence, detectarConfidenceDeTitulo, detectarTagsDeTitulo, inferirTipoMemoria, main };