@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,314 +1,315 @@
1
- ---
2
- name: harness-claude-code
3
- description: >
4
- Disciplina operacional del harness de Claude Code para reducir consumo de
5
- tokens y proteger el cache de prompt. Cubre las 4 causas raíz de quemar
6
- cuota antes de tiempo (cache misses, context bloat, modelo/effort
7
- incorrecto, formato de input ineficiente), 5 session moves (compact,
8
- clear, rewind, sub-agentes, skills as agents), variables de entorno
9
- recomendadas, tag files con @, /effort per-prompt y route-out a OpenRouter.
10
- Cargar cuando el usuario reporte "se acabó la cuota", se prepare una
11
- sesión Opus larga (>2h), se planifique adopción de MCP servers, o se
12
- detecte context-rot recurrente.
13
- version: "1.0.6"
14
- evolved: false
15
- herramientasPermitidas: [Read]
16
- exclusiones:
17
- - "No cargar para teoría general de context-rot y compactación — usar `compactacion-contexto`. Este skill cubre operación day-to-day del harness Claude Code; aquel cubre principios de gestión de contexto independientes de la herramienta."
18
- - "No cargar para diseño/escritura de skills SWL usar `meta-skills-estandar` y `reglas/skills-estandar.md`. Este skill cubre uso eficiente de skills, no su construcción."
19
- - "No cargar para resolución de errores específicos del runtime (CLI no arranca, MCP no conecta) esos son problemas técnicos del CLI, no del harness operacional."
20
- - "No cargar para análisis de costo histórico o dashboards — usar `swl-dashboard` o `/swl:status metricas`. Este skill cubre PREVENCIÓN del gasto excesivo, no el reporte post-hoc."
21
- evolvable: true
22
- ---
23
-
24
- # Harness Claude Code — disciplina operacional
25
-
26
- Origen: artículo "Claude Code's Limits Are Generous. The Problem Is Your
27
- Harness." más experiencia operativa SWL.
28
-
29
- Tesis: los límites de Claude Code Max son generosos. Si te quedaste sin
30
- cuota antes de tiempo, no es Anthropic es tu harness (configuración +
31
- sesión + tools + modelo + formato de input). Cuatro causas raíz, todas
32
- del lado del usuario.
33
-
34
- ## Cuándo cargar
35
-
36
- - El usuario reporta "se acabó la cuota antes de tiempo".
37
- - Se diagnostica una sesión con context-rot recurrente o alertas críticas
38
- falsas/persistentes.
39
- - Se prepara una sesión Opus larga (>2h) o adopción de MCP servers nuevos.
40
- - Se va a ejecutar un workflow agéntico complejo y se quiere protección
41
- proactiva del cache.
42
-
43
- ## Cuándo NO cargar
44
-
45
- - La tarea es entender principios generales de compactación de contexto
46
- independientes del tool — usar `compactacion-contexto`.
47
- - Se va a escribir un skill SWL nuevo usar `meta-skills-estandar`.
48
- - El problema es un error del runtime (CLI no inicia, MCP no responde) —
49
- ese es problema técnico, no operacional.
50
- - Se quiere ver costo histórico — usar `swl-dashboard` o `/swl:status metricas`.
51
-
52
- ---
53
-
54
- ## Las 4 causas raíz
55
-
56
- ### 1. Cache misses
57
-
58
- El prompt cache es la palanca económica más grande:
59
-
60
- | Operación | Costo |
61
- |-----------|-------|
62
- | Cache read | 0.1× (90% descuento) |
63
- | Cache write 5min | 1.25× |
64
- | Cache write 1h | (solo API) |
65
- | Cache refresh on hit | gratis |
66
-
67
- Cada hit resetea el TTL sin costo. El prefijo se mantiene caliente mientras
68
- no cambie. **Hit rate sano: ~90% en 5-min default.**
69
-
70
- **Reglas operacionales** (detalle completo en
71
- [disciplina-harness-regla](recursos/disciplina-harness-regla.md) ex-regla
72
- `reglas/harness-claude-code.md`, absorbida aquí porque su propio texto decía
73
- "no es de carga obligatoria global" y este skill es su canal bajo demanda):
74
-
75
- - NO agregar/quitar MCP servers mid-session
76
- - NO usar `/model` mid-session
77
- - NO modificar tools permitidos mid-session
78
- - Si necesitas cambio: `/clear` y reinicia
79
-
80
- Si el hit rate cae bajo 80%, algo en el harness está invalidando el prefijo
81
- entre turnos. Investigar antes de seguir trabajando.
82
-
83
- ### 2. Context bloat
84
-
85
- Para Opus 4.8 el default es 1M context. Es caro y rara vez necesario.
86
-
87
- **Variables de entorno recomendadas** para sesiones largas:
88
-
89
- ```jsonc
90
- // .claude/settings.json
91
- {
92
- "env": {
93
- "CLAUDE_CODE_DISABLE_1M_CONTEXT": "1", // 200K en lugar de 1M
94
- "CLAUDE_AUTOCOMPACT_PCT_OVERRIDE": "80" // auto-compact al 80%
95
- }
96
- }
97
- ```
98
-
99
- NO son universales solo si el codebase no requiere 1M y se ve context
100
- bloat real. Para sesiones que sí necesitan 1M (análisis de codebase
101
- masivo), dejar el default.
102
-
103
- ### 3. Modelo y effort incorrectos
104
-
105
- **3 dials separados**: modelo de sesión, modelo de delegación, effort por prompt.
106
-
107
- **Modelo de sesión** (lock al inicio):
108
- - Sonnet session: barato; sin acceso a Opus en padre. Bueno si todo cabe en Sonnet.
109
- - Opus session + delegate: padre con Opus para planning/tradeoffs; sub-agentes
110
- Sonnet/Haiku para tactical work. Default para trabajo mixto.
111
-
112
- **`/effort` per-prompt** (no per-session):
113
-
114
- | Level | Cuándo |
115
- |-------|--------|
116
- | `/effort low` | fixes rápidos, tareas mecánicas |
117
- | `/effort medium` | la mayoría de prompts (gran ahorro vs default) |
118
- | `/effort high` | razonamiento exigente |
119
- | `/effort xhigh` | default para coding agéntico Opus 4.8 |
120
- | `/effort max` | diminishing returns; raramente vale 2× costo extra |
121
-
122
- ### 4. Formato de input ineficiente
123
-
124
- | Input | Costo bruto | Solución |
125
- |-------|-------------|----------|
126
- | PDF directo via Read tool | Carga como imagen, ~10× tokens | `pdftotext` o `markitdown` ANTES |
127
- | Página web dinámica | Playwright + screenshots | `agent-browser` (~82% menos tokens) |
128
- | Codebase grande (>500 archivos) | Re-lectura completa cada review | `code-review-graph` pip (6.8-49× menos tokens) |
129
- | Vague prompt | Múltiples turnos para clarificar | Spec prompt: rutas, componentes, I/O, restricciones |
130
-
131
- ---
132
-
133
- ## Las 5 session moves
134
-
135
- ### Move 1 — `/compact` proactivo al 50% o tras cada tarea grande
136
-
137
- NO esperes al auto-compact. El auto dispara tarde, empuja el contexto
138
- sobre el threshold y obliga a recargar prefijo.
139
-
140
- ### Move 2 — `/clear` entre tareas no relacionadas
141
-
142
- Sesión nueva = prefijo fresco. Si pasas de frontend a backend, abre nueva.
143
-
144
- ### Move 3 — `/rewind` cuando un turno salió mal
145
-
146
- Más barato que pelear con contexto contaminado. Especialmente útil tras
147
- una respuesta del modelo que tomó dirección incorrecta.
148
-
149
- ### Move 4 — Sub-agentes para trabajo paralelizable o bulk
150
-
151
- Bloque a copiar en CLAUDE.md del proyecto:
152
-
153
- ```markdown
154
- ## Task Delegation
155
-
156
- Spawn sub-agentes para aislar contexto, paralelizar trabajo
157
- independiente o procesar tareas bulk-mecánicas. NO spawnear cuando el
158
- padre necesita el razonamiento, cuando la síntesis requiere mantener
159
- todo junto, o cuando el spawn overhead domina.
160
-
161
- Modelo más barato que pueda hacer la subtarea bien:
162
- - Haiku: bulk mecánico, sin juicio
163
- - Sonnet: research scoped, exploración de código, síntesis in-scope
164
- - Opus: subtareas con planning real o tradeoffs
165
-
166
- Si un sub-agente detecta que necesita un tier más alto que el suyo,
167
- regresa al padre. El padre es dueño del output final y la síntesis
168
- cross-spawn.
169
- ```
170
-
171
- ### Move 5 — Skills as agents (`agent: true` + `model:`)
172
-
173
- Patrón Anthropic nativo: agregar `agent: true` y `model:` al frontmatter
174
- de un SKILL.md y el skill se ejecuta en su propio sub-agente con su
175
- propio modelo.
176
-
177
- Ejemplo: skill `tldr-pdf` con `agent: true, model: sonnet`. El padre le
178
- pasa una ruta de PDF; el skill extrae con `pdftotext`, lee el output,
179
- devuelve 200 palabras al padre. El PDF completo nunca toca el contexto
180
- del padre.
181
-
182
- Útil para: procesamiento de archivos grandes, búsqueda en codebase,
183
- extracción de bullets de docs largos. Ver detalles en
184
- `Skill("meta-skills-estandar")` sección "Skills as agents".
185
-
186
- ---
187
-
188
- ## Tag files con `@`
189
-
190
- En lugar de pedirle a Claude que busque, dale la ruta directamente:
191
- `@ docs/diseno.md ¿qué cambios hace falta para X?` evita tool calls de
192
- Glob/Grep — es 1 sola lectura.
193
-
194
- ---
195
-
196
- ## Route in vs route out
197
-
198
- ### Route in — modelo del padre en CLAUDE.md
199
-
200
- Documenta delegación explícita en CLAUDE.md del proyecto. Opus 4.8
201
- delega menos por defecto que 4.6, hay que pedirlo de forma explícita
202
- (ver bloque de Task Delegation arriba).
203
-
204
- ### Route out — usar otro provider
205
-
206
- Si llegas al límite de Pro/Max/Team pero quieres mantener la interfaz de
207
- Claude Code:
208
-
209
- ```jsonc
210
- // .claude/settings.json
211
- {
212
- "env": {
213
- "ANTHROPIC_BASE_URL": "https://openrouter.ai/api",
214
- "ANTHROPIC_AUTH_TOKEN": "{API-KEY}",
215
- "ANTHROPIC_API_KEY": ""
216
- },
217
- "model": "z-ai/glm-5.1"
218
- }
219
- ```
220
-
221
- GLM-5.1 Opus a ~1/12× del costo. Trade-off: cambias de modelo, sí o
222
- sí pierdes el cache cuando vuelves a Anthropic.
223
-
224
- ---
225
-
226
- ## Watch the number — cómo medir
227
-
228
- | Necesidad | Herramienta |
229
- |-----------|-------------|
230
- | Histórico Pro/Max/Team | `/swl:status dashboard` (basado en `phuryn/claude-usage`) |
231
- | Tokens/costo de la sesión actual | `/swl:status metricas` |
232
- | Porcentaje de contexto usado en vivo | statusline nativo del CLI (`ctx: N%`) |
233
- | Guardar estado antes de compactar | `hooks/preservar-estado-pre-compact.js` (PreCompact, dispara en toda compactación manual o automática) |
234
- | Hit rate de cache (API users) | `platform.claude.com/usage/cache` |
235
-
236
- Sin observar la métrica, no puedes optimizarla.
237
-
238
- ---
239
-
240
- ## Carga lean — qué desactivar
241
-
242
- - MCP servers que no se usan en el proyecto actual.
243
- - Skills oficiales de Anthropic que no aplican al stack.
244
- - Tools permitidos: solo los necesarios. Cada tool extra alarga el
245
- system prompt y reduce el ratio cache hit.
246
- - Reglas largas en CLAUDE.md → mover a skills (progressive disclosure
247
- SWL ya lo hace por defecto).
248
-
249
- ---
250
-
251
- ## Anti-patrones
252
-
253
- - **Invocar Claude Code y luego decidir el modelo**: invalida cache.
254
- - **MCP server "temporal" agregado durante la sesión**: el costo de
255
- invalidar el prefijo supera lo que el server aporta.
256
- - **`/effort max` por reflejo**: 2× costo sin mejora observable salvo
257
- en tareas de razonamiento profundo.
258
- - **PDFs vía Read sin pre-procesar**: ~10× tokens vs `markitdown`.
259
- - **Pedir a Claude que busque archivos que ya conoces**: gasta tool
260
- calls innecesarios. Usa `@ ruta.md`.
261
- - **No usar `/compact`** y esperar al auto-compact: dispara tarde y caro.
262
- - **Cambiar de modelo a media sesión**: invalida cache + pierde
263
- contexto coherente.
264
-
265
- ---
266
-
267
- ## Gotchas / Errores comunes no obvios
268
-
269
- - **La frontera de escritura/seguridad de un hook es la raíz del repo git, no el CWD de la sesión** [doble caso real 2026-07-10]: (1) `proteccion-rutas` bloqueó la escritura de `.planning/audit/` en SIGM porque la sesión corría en `sigm/backend/` — el destino estaba dentro del proyecto pero un nivel arriba del CWD; (2) en sistema-verificacion-oic, los hooks de telemetría anclados a `process.cwd()` crearon TRES árboles `.planning/` (raíz + backend + frontend) fragmentando la memoria del proyecto. Causa común: tratar el CWD de arranque como frontera del proyecto — en monorepos la sesión se abre en subdirectorios rutinariamente. Fix de clase: ascender hasta `.git` (directorio o archivo — worktrees) y usar esa raíz como frontera de permisos y como ancla de escritura; si la detección falla → conservador (bloquear / caer al CWD). Aplicado a `proteccion-rutas` con boundary checks (repos ajenos y siblings `repo-evil` siguen bloqueados); el resto de hooks en DT-HOOKS-RAIZ-GIT.
270
-
271
- - **`node --test <directorio>` en Windows intenta ejecutar el directorio como test y falla en milisegundos sin correr nada** [caso real 2026-07-10: `node --test tests/ciclo-autonomo/` reportó 1 fail en 42ms cuando el glob equivalente corría 21 tests]: la duración es la delatora — <100ms para una suite que debería tardar segundos significa que el runner no encontró tests, no que fallaron. Fix: glob explícito entre comillas — `node --test "tests/ciclo-autonomo/*.test.js"`.
272
-
273
- - **El exit code de un pipeline es el del ÚLTIMO comando — verificar suites con `cmd | grep` enmascara fallos** [caso real 2026-07-09: `npm run test:all | grep ℹ | head` reportó "verde" durante horas sobre una suite que fallaba; el único runner sin máscara fue el `prepublishOnly` del usuario, que tumbó el publish]: en bash, `a | b` sale con el código de `b` (grep=0 si matcheó algo). Patrón correcto para verificar comandos largos: `cmd > /tmp/x.log 2>&1; echo "exit=$?"` y decidir por el exit explícito; el grep va DESPUÉS, sobre el log. Alternativa: `set -o pipefail` al inicio del script. Aplica a todo: suites, builds, linters, gates.
274
-
275
- - **Matriz de canales de hooks — stderr con exit 0 es un canal INVISIBLE** [origen: check-update 2026-07-08, el aviso de nuevas versiones se emitió al vacío desde su creación]: en Claude Code, el canal correcto depende del exit code. **exit 0 (éxito)**: solo el stdout llega — como contexto del turno en UserPromptSubmit/SessionStart (o `hookSpecificOutput.additionalContext`); el stderr no lo lee nadie. **exit 2 (bloqueo)**: solo el stderr llega al modelo con la razón del bloqueo; stdout con exit 2 = bloqueo ciego (regla ya conocida, L1 #4 de APRENDIZAJES). Anti-patrón resultante: "hook que funciona perfecto y nadie ve" — todo aviso al usuario desde un hook exitoso DEBE ir a stdout, idealmente con instrucción explícita ("INFORMA AL USUARIO...") para que el modelo lo retransmita. Verificación: correr el hook a mano con un flag de forzado y confirmar en qué canal aparece el mensaje.
276
-
277
- - **El payload de los hooks PostToolUse NO trae `model` ni `usage` pero `transcript_path` viene y contiene ambos**: un hook que necesite el contexto real o el modelo activo no debe estimarlos por heurística (un contador de invocaciones × tokens promedio divergió >2x del contexto real y nunca se corregía tras `/compact` — caso swl-ses 2026-07-03). Fuente exacta: leer la cola del JSONL de `transcript_path`, tomar el último mensaje `type: 'assistant'` del hilo principal (filtrar `isSidechain: true` — los subagentes tienen OTRO context window) y sumar `usage.input_tokens + cache_read_input_tokens + cache_creation_input_tokens` = tamaño exacto del contexto de esa llamada; `message.model` da el modelo real. Tras `/compact` la siguiente entrada refleja el contexto compactado — la medición se auto-corrige sin resets.
278
- - **`CLAUDE_CODE_DISABLE_1M_CONTEXT=1` aplicado por default a todos los proyectos**: causa truncado de contexto en sesiones que requieren 1M (análisis masivo de codebase, refactor cross-module). Causa: tomar la recomendación del artículo como universal. Solución: aplicar SOLO en proyectos donde se observe context bloat real. Para análisis profundos, dejar el default 1M.
279
- - **Sub-agentes Sonnet/Haiku que delegan al padre Opus pidiendo "más razonamiento"**: el padre acaba haciendo el trabajo que se quería offloadear. Causa: spec del sub-agente vaga. Solución: el padre debe hacer una spec clara con criterios de aceptación; sub-agentes solo escalan si encuentran tradeoff arquitectónico explícito, no por dificultad genérica.
280
- - **`/clear` mid-session destruye el plan en curso**: usuario pierde el roadmap acumulado. Causa: confundir `/clear` con `/compact`. Solución: `/compact` resume manteniendo conocimiento; `/clear` empieza desde cero. Antes de `/clear`, escribir un handoff a `.planning/COMPACTACION.md` con `/swl:compactar`.
281
- - **Tag files con `@` apuntando a archivos enormes**: Claude carga el archivo completo en contexto aunque solo necesite una sección. Causa: usar `@` con archivos >500 líneas. Solución: para archivos grandes, citar sección específica en el prompt (`@ src/auth.py líneas 100-150`) o pre-extraer con `Read offset/limit`.
282
- - **`/effort high` que se queda activo en prompts simples**: el siguiente prompt trivial gasta tokens innecesarios. Causa: el effort se interpreta como "session-wide" cuando es per-prompt. Solución: explícito `/effort medium` (o lo que aplique) en el siguiente prompt si la complejidad bajó.
283
- - **`child_process.spawn(cmd, args, { env: {} })` REEMPLAZA el env del padre con vacío, NO hereda** [CONFIRMADO 2026-05-18]: el cliente MCP de Claude Code (y el de Cursor) lee `mcpServers.X.env` del config JSON y lo pasa literal al spawn. Si la config tiene `"env": {}` explícito, el binario hijo arranca SIN ninguna variable de entorno del padre — rompe la herencia de apiKeys que viven en HKCU/registry. Síntoma: MCP server da `40101 Authorization required` aunque `setx OBSIDIAN_API_KEY` esté correcto en HKCU y curl con esa key responda HTTP 200 al plugin. Causa: Node `child_process.spawn` con `env: {}` ≠ sin `env` option. Solución: **OMITIR la clave `env` por completo en el JSON** (no dejarla vacía). Verificado empíricamente con `spawn(binario, [], { /* sin env */ })` binario heredó `OBSIDIAN_API_KEY`; `spawn(binario, [], { env: {} })` → binario sin env. El patch SWL para Python (`scripts/lib/mcp_config.py::build_stdio_env`) merge `os.environ + overrides` para corregir el mismo síntoma en el lado Python.
284
- - **MCP server devuelve auth error con apiKey correcta en disco el proceso vivo arrancó con apiKey vieja** [CONFIRMADO 2026-05-18]: aunque `~/.cursor/mcp.json` y `~/.claude/settings.json` tengan la apiKey actual del plugin, los procesos del binario MCP (ej. `mcp-obsidian.exe`) que ya están corriendo retuvieron la apiKey del momento de su spawn. Síntoma: actualizar JSONs no soluciona 40101. Solución: `taskkill /F /IM mcp-obsidian.exe /T` (Windows) o `pkill mcp-obsidian` (Unix) + **quit total del cliente parent** (Cursor.exe / claude.exe) no basta reload de ventana. Al reabrir, el cliente respawnea el binario con env actual. Verificar con `ps -W | grep mcp-obsidian` que solo haya procesos con timestamp posterior al reinicio.
285
- - **Cursor y Claude Code CLI dentro de Cursor son clientes MCP DISTINTOS con procesos independientes** [CONFIRMADO 2026-05-18]: cuando se ejecuta Claude Code CLI en una terminal embebida de Cursor, hay DOS procesos del binario MCP corriendo simultáneamente uno por cliente. Cada uno lee SU PROPIA config: Cursor lee `~/.cursor/mcp.json`, Claude Code CLI lee `~/.claude/settings.json` + `<proyecto>/.claude/settings.local.json`. Una apiKey actualizada en uno no propaga al otro. Síntoma observado: el agente AI de Cursor responde MCP OK pero Claude Code CLI da 40101 (o viceversa). Solución: usar variable de entorno persistente del SO (`setx OBSIDIAN_API_KEY` HKCU\Environment) como single source of truth y dejar configs JSON sin clave `env` para heredar del padre. Cada regeneración de apiKey requiere un solo `setx` + reiniciar Cursor (que reinicia ambos clientes).
286
-
287
- ---
288
-
289
- ## Integración con SWL
290
-
291
- Componentes SWL que cubren necesidades de harness: `/swl:compactar`,
292
- `/swl:checkpoint`, `/swl:status dashboard`, `/swl:status metricas`, `/swl:modelo`,
293
- `/swl:contexto`, hook `preservar-estado-pre-compact.js` (PreCompact),
294
- `/swl:revisar-impacto` (meta-grafo del sistema SWL) y `code-review-graph`
295
- pip (opt-in para codebase del usuario, ver `MANUAL_USO.md`).
296
-
297
- Cargar este skill cuando esos componentes no son suficientes y hace falta
298
- el modelo mental completo del harness.
299
-
300
- ---
301
-
302
- ## Checklist antes de iniciar sesión Opus larga
303
-
304
- - [ ] `.claude/settings.json` con todos los MCP necesarios YA configurados
305
- - [ ] Modelo elegido y bloqueado (no se cambiará durante la sesión)
306
- - [ ] Tools permitidos definidos antes de iniciar
307
- - [ ] `CLAUDE_CODE_DISABLE_1M_CONTEXT` y `CLAUDE_AUTOCOMPACT_PCT_OVERRIDE`
308
- configurados si la sesión es larga sin necesidad de 1M
309
- - [ ] Plan de delegación claro (qué se manda a sub-agente, qué se mantiene
310
- en el padre)
311
- - [ ] PDFs/Office docs pre-procesados con `markitdown`
312
- - [ ] Para repos grandes: `code-review-graph` instalado y `build` ejecutado
313
- - [ ] CLAUDE.md del proyecto con bloque de Task Delegation
314
- - [ ] Saber dónde ver métricas durante la sesión (`/swl:status metricas`)
1
+ ---
2
+ name: harness-claude-code
3
+ description: >
4
+ Disciplina operacional del harness de Claude Code para reducir consumo de
5
+ tokens y proteger el cache de prompt. Cubre las 4 causas raíz de quemar
6
+ cuota antes de tiempo (cache misses, context bloat, modelo/effort
7
+ incorrecto, formato de input ineficiente), 5 session moves (compact,
8
+ clear, rewind, sub-agentes, skills as agents), variables de entorno
9
+ recomendadas, tag files con @, /effort per-prompt y route-out a OpenRouter.
10
+ Cargar cuando el usuario reporte "se acabó la cuota", se prepare una
11
+ sesión Opus larga (>2h), se planifique adopción de MCP servers, o se
12
+ detecte context-rot recurrente.
13
+ version: "1.0.7"
14
+ herramientasPermitidas: [Read]
15
+ exclusiones:
16
+ - "No cargar para teoría general de context-rot y compactación — usar `compactacion-contexto`. Este skill cubre operación day-to-day del harness Claude Code; aquel cubre principios de gestión de contexto independientes de la herramienta."
17
+ - "No cargar para diseño/escritura de skills SWL — usar `meta-skills-estandar` y `reglas/skills-estandar.md`. Este skill cubre uso eficiente de skills, no su construcción."
18
+ - "No cargar para resolución de errores específicos del runtime (CLI no arranca, MCP no conecta) esos son problemas técnicos del CLI, no del harness operacional."
19
+ - "No cargar para análisis de costo histórico o dashboards usar `swl-dashboard` o `/swl:status metricas`. Este skill cubre PREVENCIÓN del gasto excesivo, no el reporte post-hoc."
20
+ evolvable: true
21
+ ---
22
+
23
+ # Harness Claude Code — disciplina operacional
24
+
25
+ Origen: artículo "Claude Code's Limits Are Generous. The Problem Is Your
26
+ Harness." más experiencia operativa SWL.
27
+
28
+ Tesis: los límites de Claude Code Max son generosos. Si te quedaste sin
29
+ cuota antes de tiempo, no es Anthropic es tu harness (configuración +
30
+ sesión + tools + modelo + formato de input). Cuatro causas raíz, todas
31
+ del lado del usuario.
32
+
33
+ ## Cuándo cargar
34
+
35
+ - El usuario reporta "se acabó la cuota antes de tiempo".
36
+ - Se diagnostica una sesión con context-rot recurrente o alertas críticas
37
+ falsas/persistentes.
38
+ - Se prepara una sesión Opus larga (>2h) o adopción de MCP servers nuevos.
39
+ - Se va a ejecutar un workflow agéntico complejo y se quiere protección
40
+ proactiva del cache.
41
+
42
+ ## Cuándo NO cargar
43
+
44
+ - La tarea es entender principios generales de compactación de contexto
45
+ independientes del tool usar `compactacion-contexto`.
46
+ - Se va a escribir un skill SWL nuevo — usar `meta-skills-estandar`.
47
+ - El problema es un error del runtime (CLI no inicia, MCP no responde) —
48
+ ese es problema técnico, no operacional.
49
+ - Se quiere ver costo histórico — usar `swl-dashboard` o `/swl:status metricas`.
50
+
51
+ ---
52
+
53
+ ## Las 4 causas raíz
54
+
55
+ ### 1. Cache misses
56
+
57
+ El prompt cache es la palanca económica más grande:
58
+
59
+ | Operación | Costo |
60
+ |-----------|-------|
61
+ | Cache read | 0.1× (90% descuento) |
62
+ | Cache write 5min | 1.25× |
63
+ | Cache write 1h | 2× (solo API) |
64
+ | Cache refresh on hit | gratis |
65
+
66
+ Cada hit resetea el TTL sin costo. El prefijo se mantiene caliente mientras
67
+ no cambie. **Hit rate sano: ~90% en 5-min default.**
68
+
69
+ **Reglas operacionales** (detalle completo en
70
+ [disciplina-harness-regla](recursos/disciplina-harness-regla.md) ex-regla
71
+ `reglas/harness-claude-code.md`, absorbida aquí porque su propio texto decía
72
+ "no es de carga obligatoria global" y este skill es su canal bajo demanda):
73
+
74
+ - NO agregar/quitar MCP servers mid-session
75
+ - NO usar `/model` mid-session
76
+ - NO modificar tools permitidos mid-session
77
+ - Si necesitas cambio: `/clear` y reinicia
78
+
79
+ Si el hit rate cae bajo 80%, algo en el harness está invalidando el prefijo
80
+ entre turnos. Investigar antes de seguir trabajando.
81
+
82
+ ### 2. Context bloat
83
+
84
+ Para Opus 4.8 el default es 1M context. Es caro y rara vez necesario.
85
+
86
+ **Variables de entorno recomendadas** para sesiones largas:
87
+
88
+ ```jsonc
89
+ // .claude/settings.json
90
+ {
91
+ "env": {
92
+ "CLAUDE_CODE_DISABLE_1M_CONTEXT": "1", // 200K en lugar de 1M
93
+ "CLAUDE_AUTOCOMPACT_PCT_OVERRIDE": "80" // auto-compact al 80%
94
+ }
95
+ }
96
+ ```
97
+
98
+ NO son universales — solo si el codebase no requiere 1M y se ve context
99
+ bloat real. Para sesiones que necesitan 1M (análisis de codebase
100
+ masivo), dejar el default.
101
+
102
+ ### 3. Modelo y effort incorrectos
103
+
104
+ **3 dials separados**: modelo de sesión, modelo de delegación, effort por prompt.
105
+
106
+ **Modelo de sesión** (lock al inicio):
107
+ - Sonnet session: barato; sin acceso a Opus en padre. Bueno si todo cabe en Sonnet.
108
+ - Opus session + delegate: padre con Opus para planning/tradeoffs; sub-agentes
109
+ Sonnet/Haiku para tactical work. Default para trabajo mixto.
110
+
111
+ **`/effort` per-prompt** (no per-session):
112
+
113
+ | Level | Cuándo |
114
+ |-------|--------|
115
+ | `/effort low` | fixes rápidos, tareas mecánicas |
116
+ | `/effort medium` | la mayoría de prompts (gran ahorro vs default) |
117
+ | `/effort high` | razonamiento exigente |
118
+ | `/effort xhigh` | default para coding agéntico Opus 4.8 |
119
+ | `/effort max` | diminishing returns; raramente vale costo extra |
120
+
121
+ ### 4. Formato de input ineficiente
122
+
123
+ | Input | Costo bruto | Solución |
124
+ |-------|-------------|----------|
125
+ | PDF directo via Read tool | Carga como imagen, ~10× tokens | `pdftotext` o `markitdown` ANTES |
126
+ | Página web dinámica | Playwright + screenshots | `agent-browser` (~82% menos tokens) |
127
+ | Codebase grande (>500 archivos) | Re-lectura completa cada review | `code-review-graph` pip (6.8-49× menos tokens) |
128
+ | Vague prompt | Múltiples turnos para clarificar | Spec prompt: rutas, componentes, I/O, restricciones |
129
+
130
+ ---
131
+
132
+ ## Las 5 session moves
133
+
134
+ ### Move 1 — `/compact` proactivo al 50% o tras cada tarea grande
135
+
136
+ NO esperes al auto-compact. El auto dispara tarde, empuja el contexto
137
+ sobre el threshold y obliga a recargar prefijo.
138
+
139
+ ### Move 2 — `/clear` entre tareas no relacionadas
140
+
141
+ Sesión nueva = prefijo fresco. Si pasas de frontend a backend, abre nueva.
142
+
143
+ ### Move 3 — `/rewind` cuando un turno salió mal
144
+
145
+ Más barato que pelear con contexto contaminado. Especialmente útil tras
146
+ una respuesta del modelo que tomó dirección incorrecta.
147
+
148
+ ### Move 4 — Sub-agentes para trabajo paralelizable o bulk
149
+
150
+ Bloque a copiar en CLAUDE.md del proyecto:
151
+
152
+ ```markdown
153
+ ## Task Delegation
154
+
155
+ Spawn sub-agentes para aislar contexto, paralelizar trabajo
156
+ independiente o procesar tareas bulk-mecánicas. NO spawnear cuando el
157
+ padre necesita el razonamiento, cuando la síntesis requiere mantener
158
+ todo junto, o cuando el spawn overhead domina.
159
+
160
+ Modelo más barato que pueda hacer la subtarea bien:
161
+ - Haiku: bulk mecánico, sin juicio
162
+ - Sonnet: research scoped, exploración de código, síntesis in-scope
163
+ - Opus: subtareas con planning real o tradeoffs
164
+
165
+ Si un sub-agente detecta que necesita un tier más alto que el suyo,
166
+ regresa al padre. El padre es dueño del output final y la síntesis
167
+ cross-spawn.
168
+ ```
169
+
170
+ ### Move 5 — Skills as agents (`agent: true` + `model:`)
171
+
172
+ Patrón Anthropic nativo: agregar `agent: true` y `model:` al frontmatter
173
+ de un SKILL.md y el skill se ejecuta en su propio sub-agente con su
174
+ propio modelo.
175
+
176
+ Ejemplo: skill `tldr-pdf` con `agent: true, model: sonnet`. El padre le
177
+ pasa una ruta de PDF; el skill extrae con `pdftotext`, lee el output,
178
+ devuelve 200 palabras al padre. El PDF completo nunca toca el contexto
179
+ del padre.
180
+
181
+ Útil para: procesamiento de archivos grandes, búsqueda en codebase,
182
+ extracción de bullets de docs largos. Ver detalles en
183
+ `Skill("meta-skills-estandar")` sección "Skills as agents".
184
+
185
+ ---
186
+
187
+ ## Tag files con `@`
188
+
189
+ En lugar de pedirle a Claude que busque, dale la ruta directamente:
190
+ `@ docs/diseno.md ¿qué cambios hace falta para X?` evita tool calls de
191
+ Glob/Grep es 1 sola lectura.
192
+
193
+ ---
194
+
195
+ ## Route in vs route out
196
+
197
+ ### Route in — modelo del padre en CLAUDE.md
198
+
199
+ Documenta delegación explícita en CLAUDE.md del proyecto. Opus 4.8
200
+ delega menos por defecto que 4.6, hay que pedirlo de forma explícita
201
+ (ver bloque de Task Delegation arriba).
202
+
203
+ ### Route out — usar otro provider
204
+
205
+ Si llegas al límite de Pro/Max/Team pero quieres mantener la interfaz de
206
+ Claude Code:
207
+
208
+ ```jsonc
209
+ // .claude/settings.json
210
+ {
211
+ "env": {
212
+ "ANTHROPIC_BASE_URL": "https://openrouter.ai/api",
213
+ "ANTHROPIC_AUTH_TOKEN": "{API-KEY}",
214
+ "ANTHROPIC_API_KEY": ""
215
+ },
216
+ "model": "z-ai/glm-5.1"
217
+ }
218
+ ```
219
+
220
+ GLM-5.1 ≈ Opus a ~1/12× del costo. Trade-off: cambias de modelo, sí o
221
+ pierdes el cache cuando vuelves a Anthropic.
222
+
223
+ ---
224
+
225
+ ## Watch the number — cómo medir
226
+
227
+ | Necesidad | Herramienta |
228
+ |-----------|-------------|
229
+ | Histórico Pro/Max/Team | `/swl:status dashboard` (basado en `phuryn/claude-usage`) |
230
+ | Tokens/costo de la sesión actual | `/swl:status metricas` |
231
+ | Porcentaje de contexto usado en vivo | statusline nativo del CLI (`ctx: N%`) |
232
+ | Guardar estado antes de compactar | `hooks/preservar-estado-pre-compact.js` (PreCompact, dispara en toda compactación manual o automática) |
233
+ | Hit rate de cache (API users) | `platform.claude.com/usage/cache` |
234
+
235
+ Sin observar la métrica, no puedes optimizarla.
236
+
237
+ ---
238
+
239
+ ## Carga lean — qué desactivar
240
+
241
+ - MCP servers que no se usan en el proyecto actual.
242
+ - Skills oficiales de Anthropic que no aplican al stack.
243
+ - Tools permitidos: solo los necesarios. Cada tool extra alarga el
244
+ system prompt y reduce el ratio cache hit.
245
+ - Reglas largas en CLAUDE.md mover a skills (progressive disclosure
246
+ SWL ya lo hace por defecto).
247
+
248
+ ---
249
+
250
+ ## Anti-patrones
251
+
252
+ - **Invocar Claude Code y luego decidir el modelo**: invalida cache.
253
+ - **MCP server "temporal" agregado durante la sesión**: el costo de
254
+ invalidar el prefijo supera lo que el server aporta.
255
+ - **`/effort max` por reflejo**: costo sin mejora observable salvo
256
+ en tareas de razonamiento profundo.
257
+ - **PDFs vía Read sin pre-procesar**: ~10× tokens vs `markitdown`.
258
+ - **Pedir a Claude que busque archivos que ya conoces**: gasta tool
259
+ calls innecesarios. Usa `@ ruta.md`.
260
+ - **No usar `/compact`** y esperar al auto-compact: dispara tarde y caro.
261
+ - **Cambiar de modelo a media sesión**: invalida cache + pierde
262
+ contexto coherente.
263
+
264
+ ---
265
+
266
+ ## Gotchas / Errores comunes no obvios
267
+
268
+ - **La frontera de escritura/seguridad de un hook es la raíz del repo git, no el CWD de la sesión** [doble caso real 2026-07-10]: (1) `proteccion-rutas` bloqueó la escritura de `.planning/audit/` en SIGM porque la sesión corría en `sigm/backend/` — el destino estaba dentro del proyecto pero un nivel arriba del CWD; (2) en sistema-verificacion-oic, los hooks de telemetría anclados a `process.cwd()` crearon TRES árboles `.planning/` (raíz + backend + frontend) fragmentando la memoria del proyecto. Causa común: tratar el CWD de arranque como frontera del proyecto — en monorepos la sesión se abre en subdirectorios rutinariamente. Fix de clase: ascender hasta `.git` (directorio o archivo — worktrees) y usar esa raíz como frontera de permisos y como ancla de escritura; si la detección falla → conservador (bloquear / caer al CWD). Aplicado a `proteccion-rutas` con boundary checks (repos ajenos y siblings `repo-evil` siguen bloqueados); el resto de hooks en DT-HOOKS-RAIZ-GIT.
269
+
270
+ - **`node --test <directorio>` en Windows intenta ejecutar el directorio como test y falla en milisegundos sin correr nada** [caso real 2026-07-10: `node --test tests/ciclo-autonomo/` reportó 1 fail en 42ms cuando el glob equivalente corría 21 tests]: la duración es la delatora — <100ms para una suite que debería tardar segundos significa que el runner no encontró tests, no que fallaron. Fix: glob explícito entre comillas — `node --test "tests/ciclo-autonomo/*.test.js"`.
271
+
272
+ - **El exit code de un pipeline es el del ÚLTIMO comando — verificar suites con `cmd | grep` enmascara fallos** [caso real 2026-07-09: `npm run test:all | grep ℹ | head` reportó "verde" durante horas sobre una suite que fallaba; el único runner sin máscara fue el `prepublishOnly` del usuario, que tumbó el publish]: en bash, `a | b` sale con el código de `b` (grep=0 si matcheó algo). Patrón correcto para verificar comandos largos: `cmd > /tmp/x.log 2>&1; echo "exit=$?"` y decidir por el exit explícito; el grep va DESPUÉS, sobre el log. Alternativa: `set -o pipefail` al inicio del script. Aplica a todo: suites, builds, linters, gates.
273
+
274
+ - **Matriz de canales de hooks — stderr con exit 0 es un canal INVISIBLE** [origen: check-update 2026-07-08, el aviso de nuevas versiones se emitió al vacío desde su creación]: en Claude Code, el canal correcto depende del exit code. **exit 0 (éxito)**: solo el stdout llega — como contexto del turno en UserPromptSubmit/SessionStart (o `hookSpecificOutput.additionalContext`); el stderr no lo lee nadie. **exit 2 (bloqueo)**: solo el stderr llega al modelo con la razón del bloqueo; stdout con exit 2 = bloqueo ciego (regla ya conocida, L1 #4 de APRENDIZAJES). Anti-patrón resultante: "hook que funciona perfecto y nadie ve" — todo aviso al usuario desde un hook exitoso DEBE ir a stdout, idealmente con instrucción explícita ("INFORMA AL USUARIO...") para que el modelo lo retransmita. Verificación: correr el hook a mano con un flag de forzado y confirmar en qué canal aparece el mensaje.
275
+
276
+ - **El payload de los hooks PostToolUse NO trae `model` ni `usage` — pero `transcript_path` SÍ viene y contiene ambos**: un hook que necesite el contexto real o el modelo activo no debe estimarlos por heurística (un contador de invocaciones × tokens promedio divergió >2x del contexto real y nunca se corregía tras `/compact` — caso swl-ses 2026-07-03). Fuente exacta: leer la cola del JSONL de `transcript_path`, tomar el último mensaje `type: 'assistant'` del hilo principal (filtrar `isSidechain: true` — los subagentes tienen OTRO context window) y sumar `usage.input_tokens + cache_read_input_tokens + cache_creation_input_tokens` = tamaño exacto del contexto de esa llamada; `message.model` da el modelo real. Tras `/compact` la siguiente entrada refleja el contexto compactado — la medición se auto-corrige sin resets.
277
+ - **`CLAUDE_CODE_DISABLE_1M_CONTEXT=1` aplicado por default a todos los proyectos**: causa truncado de contexto en sesiones que requieren 1M (análisis masivo de codebase, refactor cross-module). Causa: tomar la recomendación del artículo como universal. Solución: aplicar SOLO en proyectos donde se observe context bloat real. Para análisis profundos, dejar el default 1M.
278
+ - **Sub-agentes Sonnet/Haiku que delegan al padre Opus pidiendo "más razonamiento"**: el padre acaba haciendo el trabajo que se quería offloadear. Causa: spec del sub-agente vaga. Solución: el padre debe hacer una spec clara con criterios de aceptación; sub-agentes solo escalan si encuentran tradeoff arquitectónico explícito, no por dificultad genérica.
279
+ - **`/clear` mid-session destruye el plan en curso**: usuario pierde el roadmap acumulado. Causa: confundir `/clear` con `/compact`. Solución: `/compact` resume manteniendo conocimiento; `/clear` empieza desde cero. Antes de `/clear`, escribir un handoff a `.planning/COMPACTACION.md` con `/swl:compactar`.
280
+ - **Tag files con `@` apuntando a archivos enormes**: Claude carga el archivo completo en contexto aunque solo necesite una sección. Causa: usar `@` con archivos >500 líneas. Solución: para archivos grandes, citar sección específica en el prompt (`@ src/auth.py líneas 100-150`) o pre-extraer con `Read offset/limit`.
281
+ - **`/effort high` que se queda activo en prompts simples**: el siguiente prompt trivial gasta tokens innecesarios. Causa: el effort se interpreta como "session-wide" cuando es per-prompt. Solución: explícito `/effort medium` (o lo que aplique) en el siguiente prompt si la complejidad bajó.
282
+ - **`child_process.spawn(cmd, args, { env: {} })` REEMPLAZA el env del padre con vacío, NO hereda** [CONFIRMADO 2026-05-18]: el cliente MCP de Claude Code (y el de Cursor) lee `mcpServers.X.env` del config JSON y lo pasa literal al spawn. Si la config tiene `"env": {}` explícito, el binario hijo arranca SIN ninguna variable de entorno del padre — rompe la herencia de apiKeys que viven en HKCU/registry. Síntoma: MCP server da `40101 Authorization required` aunque `setx OBSIDIAN_API_KEY` esté correcto en HKCU y curl con esa key responda HTTP 200 al plugin. Causa: Node `child_process.spawn` con `env: {}` sin `env` option. Solución: **OMITIR la clave `env` por completo en el JSON** (no dejarla vacía). Verificado empíricamente con `spawn(binario, [], { /* sin env */ })` binario heredó `OBSIDIAN_API_KEY`; `spawn(binario, [], { env: {} })` → binario sin env. El patch SWL para Python (`scripts/lib/mcp_config.py::build_stdio_env`) merge `os.environ + overrides` para corregir el mismo síntoma en el lado Python.
283
+ - **MCP server devuelve auth error con apiKey correcta en disco → el proceso vivo arrancó con apiKey vieja** [CONFIRMADO 2026-05-18]: aunque `~/.cursor/mcp.json` y `~/.claude/settings.json` tengan la apiKey actual del plugin, los procesos del binario MCP (ej. `mcp-obsidian.exe`) que ya están corriendo retuvieron la apiKey del momento de su spawn. Síntoma: actualizar JSONs no soluciona 40101. Solución: `taskkill /F /IM mcp-obsidian.exe /T` (Windows) o `pkill mcp-obsidian` (Unix) + **quit total del cliente parent** (Cursor.exe / claude.exe) no basta reload de ventana. Al reabrir, el cliente respawnea el binario con env actual. Verificar con `ps -W | grep mcp-obsidian` que solo haya procesos con timestamp posterior al reinicio.
284
+ - **Cursor y Claude Code CLI dentro de Cursor son clientes MCP DISTINTOS con procesos independientes** [CONFIRMADO 2026-05-18]: cuando se ejecuta Claude Code CLI en una terminal embebida de Cursor, hay DOS procesos del binario MCP corriendo simultáneamente — uno por cliente. Cada uno lee SU PROPIA config: Cursor lee `~/.cursor/mcp.json`, Claude Code CLI lee `~/.claude/settings.json` + `<proyecto>/.claude/settings.local.json`. Una apiKey actualizada en uno no propaga al otro. Síntoma observado: el agente AI de Cursor responde MCP OK pero Claude Code CLI da 40101 (o viceversa). Solución: usar variable de entorno persistente del SO (`setx OBSIDIAN_API_KEY` → HKCU\Environment) como single source of truth y dejar configs JSON sin clave `env` para heredar del padre. Cada regeneración de apiKey requiere un solo `setx` + reiniciar Cursor (que reinicia ambos clientes).
285
+ - **Un comando encadenado con `&&` donde un paso intermedio es bloqueado por un hook de risk-scoring aborta TODO el resto en silencio** (caso real 2026-07-17): `rm -rf <dir-scratch> && git add .gitignore && git status` el `rm -rf` fue bloqueado por el hook de risk-scoring (score 0.65 > umbral), y como bash corta la cadena `&&` en el primer fallo, el `git add .gitignore` nunca se ejecutó. El `git status` final tampoco corrió, así que no había señal inmediata de que el segundo paso se hubiera saltado solo se detectó al revisar el estado real del working tree y notar que `.gitignore` seguía sin stage. Regla: cuando cualquier paso de una cadena `&&` puede ser bloqueado por un hook (destructivo, escritura fuera de scope, comando de alto riesgo), correr los pasos como llamadas Bash separadas nunca asumir que los pasos posteriores corrieron solo porque el tool call "se completó".
286
+ - **Un timeout de Bash en tu propia verificación NO es evidencia de que el fix falló**: tras corregir un bug de aislamiento en un motor de mutation testing (F32-T07), dos intentos de reproducir la corrida completa vía `node -e` con timeout de 2 y 5 minutos expiraron sin dar resultado — pero eso mide el tiempo de la corrida real (56 min para 2275 mutantes), no la corrección del fix. Tratar el timeout como "no pude confirmarlo, quizá sigue roto" habría sido un falso negativo. La verificación correcta ante un timeout: leer el diff exacto del fix, correr el test de regresión específico por una vía alternativa que no dependa del runner que dio timeout (aquí: `require()` + `--test-name-pattern` en vez de `node --test`), y correr la suite completa (rápida) en vez de forzar la reproducción lenta. Un timeout es una limitación del método de verificación elegido, no del artefacto verificado — cambiar de método antes de degradar la confianza en el fix.
287
+
288
+ ---
289
+
290
+ ## Integración con SWL
291
+
292
+ Componentes SWL que cubren necesidades de harness: `/swl:compactar`,
293
+ `/swl:checkpoint`, `/swl:status dashboard`, `/swl:status metricas`, `/swl:modelo`,
294
+ `/swl:contexto`, hook `preservar-estado-pre-compact.js` (PreCompact),
295
+ `/swl:revisar-impacto` (meta-grafo del sistema SWL) y `code-review-graph`
296
+ pip (opt-in para codebase del usuario, ver `MANUAL_USO.md`).
297
+
298
+ Cargar este skill cuando esos componentes no son suficientes y hace falta
299
+ el modelo mental completo del harness.
300
+
301
+ ---
302
+
303
+ ## Checklist antes de iniciar sesión Opus larga
304
+
305
+ - [ ] `.claude/settings.json` con todos los MCP necesarios YA configurados
306
+ - [ ] Modelo elegido y bloqueado (no se cambiará durante la sesión)
307
+ - [ ] Tools permitidos definidos antes de iniciar
308
+ - [ ] `CLAUDE_CODE_DISABLE_1M_CONTEXT` y `CLAUDE_AUTOCOMPACT_PCT_OVERRIDE`
309
+ configurados si la sesión es larga sin necesidad de 1M
310
+ - [ ] Plan de delegación claro (qué se manda a sub-agente, qué se mantiene
311
+ en el padre)
312
+ - [ ] PDFs/Office docs pre-procesados con `markitdown`
313
+ - [ ] Para repos grandes: `code-review-graph` instalado y `build` ejecutado
314
+ - [ ] CLAUDE.md del proyecto con bloque de Task Delegation
315
+ - [ ] Saber dónde ver métricas durante la sesión (`/swl:status metricas`)