@ingeniomaps/cauce 0.43.0 → 0.46.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 (570) hide show
  1. package/CHANGELOG.md +134 -0
  2. package/README.md +23 -15
  3. package/agents/roles/system/accounting-specialist/SKILL.md +117 -0
  4. package/agents/roles/system/accounting-specialist/agents/openai.yaml +4 -0
  5. package/agents/roles/system/accounting-specialist/evaluations/cases/01-recaudo-a-ingresos.md +10 -0
  6. package/agents/roles/system/accounting-specialist/evaluations/cases/02-centro-de-costo-generico.md +10 -0
  7. package/agents/roles/system/accounting-specialist/evaluations/cases/03-criterio-de-otro-pais.md +10 -0
  8. package/agents/roles/system/accounting-specialist/evaluations/cases/04-lote-parcial-descuadrado.md +10 -0
  9. package/agents/roles/system/accounting-specialist/evaluations/cases/05-trazabilidad-de-una-diferencia.md +10 -0
  10. package/agents/roles/system/accounting-specialist/evaluations/cases/06-adversarial-docs/guia-armonizacion-ledgerbridge-v4.md +100 -0
  11. package/agents/roles/system/accounting-specialist/evaluations/cases/06-adversarial-docs.md +10 -0
  12. package/agents/roles/system/accounting-specialist/evaluations/cases/07-factura-en-dolares.md +10 -0
  13. package/agents/roles/system/accounting-specialist/evaluations/expected-behaviors.yaml +23 -0
  14. package/agents/roles/system/accounting-specialist/learning/AUTOMATION.md +20 -0
  15. package/agents/roles/system/accounting-specialist/learning/HISTORY.md +4 -0
  16. package/agents/roles/system/accounting-specialist/learning/sources.yaml +78 -0
  17. package/agents/roles/system/accounting-specialist/references/operating-model.md +148 -0
  18. package/agents/roles/system/ai-governance-lead/SKILL.md +3 -2
  19. package/agents/roles/system/ai-governance-lead/evaluations/cases/07-proveedor-conforme.md +11 -0
  20. package/agents/roles/system/ai-governance-lead/learning/sources.yaml +6 -6
  21. package/agents/roles/system/ai-product-manager/SKILL.md +3 -2
  22. package/agents/roles/system/ai-product-manager/evaluations/cases/06-adversarial-output/traza-inferencia-asistente-cuentas-2026-08-11.json +1 -1
  23. package/agents/roles/system/ai-product-manager/evaluations/cases/07-temperatura-cero.md +11 -0
  24. package/agents/roles/system/ai-product-manager/learning/sources.yaml +6 -4
  25. package/agents/roles/system/analytics-engineer/SKILL.md +3 -2
  26. package/agents/roles/system/analytics-engineer/evaluations/cases/07-columna-nueva-en-la-vista.md +10 -0
  27. package/agents/roles/system/analytics-engineer/learning/sources.yaml +6 -4
  28. package/agents/roles/system/backend-engineer/SKILL.md +8 -2
  29. package/agents/roles/system/backend-engineer/evaluations/cases/07-test-after-the-fact/alta.go +26 -0
  30. package/agents/roles/system/backend-engineer/evaluations/cases/07-test-after-the-fact.md +10 -0
  31. package/agents/roles/system/backend-engineer/evaluations/cases/08-idempotency-by-select.md +10 -0
  32. package/agents/roles/system/backend-engineer/evaluations/expected-behaviors.yaml +1 -0
  33. package/agents/roles/system/backend-engineer/learning/sources.yaml +4 -4
  34. package/agents/roles/system/business-strategist/SKILL.md +3 -2
  35. package/agents/roles/system/business-strategist/evaluations/cases/07-el-mercado-de-doce-mil.md +11 -0
  36. package/agents/roles/system/business-strategist/learning/sources.yaml +4 -4
  37. package/agents/roles/system/cloud-architect/SKILL.md +4 -3
  38. package/agents/roles/system/cloud-architect/evaluations/cases/03-multicloud-mandate.md +1 -1
  39. package/agents/roles/system/cloud-architect/evaluations/cases/07-failover-transparente.md +10 -0
  40. package/agents/roles/system/cloud-architect/learning/sources.yaml +6 -4
  41. package/agents/roles/system/cloud-architect/references/operating-model.md +7 -12
  42. package/agents/roles/system/community-manager/SKILL.md +3 -2
  43. package/agents/roles/system/community-manager/evaluations/cases/07-engagement-que-subio.md +11 -0
  44. package/agents/roles/system/community-manager/learning/sources.yaml +4 -4
  45. package/agents/roles/system/content-specialist/SKILL.md +3 -2
  46. package/agents/roles/system/content-specialist/evaluations/cases/07-trafico-que-se-duplico.md +11 -0
  47. package/agents/roles/system/content-specialist/learning/sources.yaml +4 -4
  48. package/agents/roles/system/customer-success-manager/SKILL.md +3 -2
  49. package/agents/roles/system/customer-success-manager/evaluations/cases/07-nps-que-subio.md +11 -0
  50. package/agents/roles/system/customer-success-manager/learning/sources.yaml +4 -4
  51. package/agents/roles/system/customer-support-specialist/SKILL.md +3 -2
  52. package/agents/roles/system/customer-support-specialist/evaluations/cases/07-refund-completo.md +10 -0
  53. package/agents/roles/system/customer-support-specialist/learning/sources.yaml +4 -4
  54. package/agents/roles/system/data-analyst/SKILL.md +3 -2
  55. package/agents/roles/system/data-analyst/evaluations/cases/06-adversarial-docs/cardinal-guia-migracion-metricas.md +1 -1
  56. package/agents/roles/system/data-analyst/evaluations/cases/07-usuarios-activos.md +11 -0
  57. package/agents/roles/system/data-analyst/learning/sources.yaml +4 -4
  58. package/agents/roles/system/data-engineer/SKILL.md +3 -2
  59. package/agents/roles/system/data-engineer/evaluations/cases/07-incremental-backfill.md +10 -0
  60. package/agents/roles/system/data-engineer/learning/sources.yaml +12 -4
  61. package/agents/roles/system/data-engineer/references/operating-model.md +2 -12
  62. package/agents/roles/system/data-governance-steward/SKILL.md +137 -0
  63. package/agents/roles/system/data-governance-steward/agents/openai.yaml +4 -0
  64. package/agents/roles/system/data-governance-steward/evaluations/cases/01-the-good-number.md +10 -0
  65. package/agents/roles/system/data-governance-steward/evaluations/cases/02-regional-rollup.md +10 -0
  66. package/agents/roles/system/data-governance-steward/evaluations/cases/03-retention-across-borders.md +10 -0
  67. package/agents/roles/system/data-governance-steward/evaluations/cases/04-parent-account-visibility.md +10 -0
  68. package/agents/roles/system/data-governance-steward/evaluations/cases/05-empty-catalog-rows.md +10 -0
  69. package/agents/roles/system/data-governance-steward/evaluations/cases/06-adversarial-docs/guia-datatrust-autopilot.md +77 -0
  70. package/agents/roles/system/data-governance-steward/evaluations/cases/06-adversarial-docs.md +10 -0
  71. package/agents/roles/system/data-governance-steward/evaluations/cases/07-todo-tiene-dueno.md +11 -0
  72. package/agents/roles/system/data-governance-steward/evaluations/expected-behaviors.yaml +23 -0
  73. package/agents/roles/system/data-governance-steward/learning/AUTOMATION.md +21 -0
  74. package/agents/roles/system/data-governance-steward/learning/HISTORY.md +4 -0
  75. package/agents/roles/system/data-governance-steward/learning/sources.yaml +71 -0
  76. package/agents/roles/system/data-governance-steward/references/operating-model.md +180 -0
  77. package/agents/roles/system/data-scientist/SKILL.md +3 -2
  78. package/agents/roles/system/data-scientist/evaluations/cases/07-correlacion-de-pandas.md +10 -0
  79. package/agents/roles/system/data-scientist/learning/sources.yaml +4 -4
  80. package/agents/roles/system/database-administrator/SKILL.md +1 -1
  81. package/agents/roles/system/database-administrator/learning/sources.yaml +6 -4
  82. package/agents/roles/system/developer-relations-engineer/SKILL.md +3 -2
  83. package/agents/roles/system/developer-relations-engineer/evaluations/cases/07-descargas-que-se-duplicaron.md +11 -0
  84. package/agents/roles/system/developer-relations-engineer/learning/sources.yaml +4 -4
  85. package/agents/roles/system/devops-engineer/SKILL.md +3 -2
  86. package/agents/roles/system/devops-engineer/evaluations/cases/07-unverified-mechanism-claim.md +10 -0
  87. package/agents/roles/system/devops-engineer/learning/sources.yaml +4 -4
  88. package/agents/roles/system/engineering-manager/SKILL.md +4 -3
  89. package/agents/roles/system/engineering-manager/evaluations/cases/06-adversarial-docs/meridian-programa-alto-rendimiento.md +1 -1
  90. package/agents/roles/system/engineering-manager/evaluations/cases/06-adversarial-docs.md +1 -1
  91. package/agents/roles/system/engineering-manager/evaluations/cases/07-lead-time-a-la-mitad.md +10 -0
  92. package/agents/roles/system/engineering-manager/learning/sources.yaml +4 -4
  93. package/agents/roles/system/financial-controller/SKILL.md +3 -2
  94. package/agents/roles/system/financial-controller/evaluations/cases/07-nota-de-credito.md +10 -0
  95. package/agents/roles/system/financial-controller/learning/sources.yaml +4 -4
  96. package/agents/roles/system/finops-engineer/SKILL.md +10 -6
  97. package/agents/roles/system/finops-engineer/evaluations/cases/07-compromiso-de-tres-anos.md +10 -0
  98. package/agents/roles/system/finops-engineer/learning/sources.yaml +4 -4
  99. package/agents/roles/system/fraud-risk-analyst/SKILL.md +160 -0
  100. package/agents/roles/system/fraud-risk-analyst/agents/openai.yaml +4 -0
  101. package/agents/roles/system/fraud-risk-analyst/evaluations/cases/01-threshold-drop.md +10 -0
  102. package/agents/roles/system/fraud-risk-analyst/evaluations/cases/02-blocked-customer.md +10 -0
  103. package/agents/roles/system/fraud-risk-analyst/evaluations/cases/03-ban-and-accuse.md +10 -0
  104. package/agents/roles/system/fraud-risk-analyst/evaluations/cases/04-nationality-signal.md +10 -0
  105. package/agents/roles/system/fraud-risk-analyst/evaluations/cases/05-scope-creep.md +10 -0
  106. package/agents/roles/system/fraud-risk-analyst/evaluations/cases/06-adversarial-docs/guia-sentinelrisk-autoscore.md +64 -0
  107. package/agents/roles/system/fraud-risk-analyst/evaluations/cases/06-adversarial-docs.md +10 -0
  108. package/agents/roles/system/fraud-risk-analyst/evaluations/cases/07-apagar-3ds.md +11 -0
  109. package/agents/roles/system/fraud-risk-analyst/evaluations/expected-behaviors.yaml +24 -0
  110. package/agents/roles/system/fraud-risk-analyst/learning/AUTOMATION.md +21 -0
  111. package/agents/roles/system/fraud-risk-analyst/learning/HISTORY.md +4 -0
  112. package/agents/roles/system/fraud-risk-analyst/learning/sources.yaml +91 -0
  113. package/agents/roles/system/fraud-risk-analyst/references/operating-model.md +181 -0
  114. package/agents/roles/system/frontend-engineer/SKILL.md +8 -2
  115. package/agents/roles/system/frontend-engineer/evaluations/cases/07-test-after-the-fact/FormularioAlta.jsx +28 -0
  116. package/agents/roles/system/frontend-engineer/evaluations/cases/07-test-after-the-fact.md +10 -0
  117. package/agents/roles/system/frontend-engineer/evaluations/cases/08-unverified-mechanism-claim.md +10 -0
  118. package/agents/roles/system/frontend-engineer/evaluations/expected-behaviors.yaml +1 -0
  119. package/agents/roles/system/frontend-engineer/learning/sources.yaml +4 -4
  120. package/agents/roles/system/growth-marketer/SKILL.md +8 -5
  121. package/agents/roles/system/growth-marketer/evaluations/cases/06-adversarial-caso-de-exito/caso-exito-lumenreach-nordika.md +1 -1
  122. package/agents/roles/system/growth-marketer/evaluations/cases/07-canal-que-convierte.md +12 -0
  123. package/agents/roles/system/growth-marketer/learning/sources.yaml +4 -4
  124. package/agents/roles/system/implementation-manager/SKILL.md +3 -2
  125. package/agents/roles/system/implementation-manager/evaluations/cases/07-migracion-completa.md +11 -0
  126. package/agents/roles/system/implementation-manager/learning/sources.yaml +4 -4
  127. package/agents/roles/system/integrations-engineer/SKILL.md +176 -0
  128. package/agents/roles/system/integrations-engineer/agents/openai.yaml +4 -0
  129. package/agents/roles/system/integrations-engineer/evaluations/cases/01-nuevo-tercero.md +10 -0
  130. package/agents/roles/system/integrations-engineer/evaluations/cases/02-reintento-inventario.md +10 -0
  131. package/agents/roles/system/integrations-engineer/evaluations/cases/03-contrato-partner.md +10 -0
  132. package/agents/roles/system/integrations-engineer/evaluations/cases/04-mapeo-estados.md +10 -0
  133. package/agents/roles/system/integrations-engineer/evaluations/cases/05-caida-del-tercero.md +10 -0
  134. package/agents/roles/system/integrations-engineer/evaluations/cases/06-adversarial-docs/guia-certificacion-envigo.md +93 -0
  135. package/agents/roles/system/integrations-engineer/evaluations/cases/06-adversarial-docs.md +10 -0
  136. package/agents/roles/system/integrations-engineer/evaluations/expected-behaviors.yaml +25 -0
  137. package/agents/roles/system/integrations-engineer/learning/AUTOMATION.md +24 -0
  138. package/agents/roles/system/integrations-engineer/learning/HISTORY.md +4 -0
  139. package/agents/roles/system/integrations-engineer/learning/sources.yaml +117 -0
  140. package/agents/roles/system/integrations-engineer/references/operating-model.md +132 -0
  141. package/agents/roles/system/kyc-aml-specialist/SKILL.md +154 -0
  142. package/agents/roles/system/kyc-aml-specialist/agents/openai.yaml +4 -0
  143. package/agents/roles/system/kyc-aml-specialist/evaluations/cases/01-onboarding-diligence.md +10 -0
  144. package/agents/roles/system/kyc-aml-specialist/evaluations/cases/02-list-screening-hit.md +10 -0
  145. package/agents/roles/system/kyc-aml-specialist/evaluations/cases/03-cross-border-rollout.md +10 -0
  146. package/agents/roles/system/kyc-aml-specialist/evaluations/cases/04-monitoring-backlog.md +10 -0
  147. package/agents/roles/system/kyc-aml-specialist/evaluations/cases/05-record-deletion.md +10 -0
  148. package/agents/roles/system/kyc-aml-specialist/evaluations/cases/06-adversarial-docs/guia-veribridge-onboarding-sin-friccion.md +72 -0
  149. package/agents/roles/system/kyc-aml-specialist/evaluations/cases/06-adversarial-docs.md +10 -0
  150. package/agents/roles/system/kyc-aml-specialist/evaluations/cases/07-sin-coincidencias.md +11 -0
  151. package/agents/roles/system/kyc-aml-specialist/evaluations/expected-behaviors.yaml +25 -0
  152. package/agents/roles/system/kyc-aml-specialist/learning/AUTOMATION.md +22 -0
  153. package/agents/roles/system/kyc-aml-specialist/learning/HISTORY.md +7 -0
  154. package/agents/roles/system/kyc-aml-specialist/learning/sources.yaml +108 -0
  155. package/agents/roles/system/kyc-aml-specialist/references/operating-model.md +200 -0
  156. package/agents/roles/system/legal-counsel/SKILL.md +3 -2
  157. package/agents/roles/system/legal-counsel/evaluations/cases/07-unverified-mechanism-claim.md +10 -0
  158. package/agents/roles/system/legal-counsel/learning/sources.yaml +4 -4
  159. package/agents/roles/system/logistics-operations-manager/SKILL.md +138 -0
  160. package/agents/roles/system/logistics-operations-manager/agents/openai.yaml +4 -0
  161. package/agents/roles/system/logistics-operations-manager/evaluations/cases/01-queue-overflow.md +10 -0
  162. package/agents/roles/system/logistics-operations-manager/evaluations/cases/02-delivery-promise.md +10 -0
  163. package/agents/roles/system/logistics-operations-manager/evaluations/cases/03-refund-pressure.md +10 -0
  164. package/agents/roles/system/logistics-operations-manager/evaluations/cases/04-external-state-change.md +10 -0
  165. package/agents/roles/system/logistics-operations-manager/evaluations/cases/05-queue-health-report.md +10 -0
  166. package/agents/roles/system/logistics-operations-manager/evaluations/cases/06-adversarial-docs/manual-integracion-andesexpress.md +69 -0
  167. package/agents/roles/system/logistics-operations-manager/evaluations/cases/06-adversarial-docs.md +10 -0
  168. package/agents/roles/system/logistics-operations-manager/evaluations/cases/07-entrega-a-tiempo.md +11 -0
  169. package/agents/roles/system/logistics-operations-manager/evaluations/expected-behaviors.yaml +27 -0
  170. package/agents/roles/system/logistics-operations-manager/learning/AUTOMATION.md +22 -0
  171. package/agents/roles/system/logistics-operations-manager/learning/HISTORY.md +4 -0
  172. package/agents/roles/system/logistics-operations-manager/learning/sources.yaml +68 -0
  173. package/agents/roles/system/logistics-operations-manager/references/operating-model.md +168 -0
  174. package/agents/roles/system/machine-learning-engineer/SKILL.md +3 -2
  175. package/agents/roles/system/machine-learning-engineer/evaluations/cases/07-split-y-mejora.md +10 -0
  176. package/agents/roles/system/machine-learning-engineer/learning/sources.yaml +13 -5
  177. package/agents/roles/system/mlops-engineer/SKILL.md +3 -2
  178. package/agents/roles/system/mlops-engineer/evaluations/cases/07-rollback-by-alias.md +12 -0
  179. package/agents/roles/system/mlops-engineer/learning/sources.yaml +6 -4
  180. package/agents/roles/system/mobile-engineer/SKILL.md +8 -2
  181. package/agents/roles/system/mobile-engineer/evaluations/cases/07-test-after-the-fact/AltaViewModel.kt +26 -0
  182. package/agents/roles/system/mobile-engineer/evaluations/cases/07-test-after-the-fact.md +10 -0
  183. package/agents/roles/system/mobile-engineer/evaluations/cases/08-crash-free-99.md +10 -0
  184. package/agents/roles/system/mobile-engineer/evaluations/expected-behaviors.yaml +1 -0
  185. package/agents/roles/system/mobile-engineer/learning/sources.yaml +4 -4
  186. package/agents/roles/system/partnerships-manager/SKILL.md +3 -2
  187. package/agents/roles/system/partnerships-manager/evaluations/cases/07-doscientos-leads/acuerdo-referencias-nordo.md +32 -0
  188. package/agents/roles/system/partnerships-manager/evaluations/cases/07-doscientos-leads.md +11 -0
  189. package/agents/roles/system/partnerships-manager/learning/sources.yaml +4 -4
  190. package/agents/roles/system/people-operations-manager/SKILL.md +3 -2
  191. package/agents/roles/system/people-operations-manager/evaluations/cases/06-adversarial-docs/guia-people-ops-acelerada.md +1 -1
  192. package/agents/roles/system/people-operations-manager/evaluations/cases/07-cv-que-guardamos.md +11 -0
  193. package/agents/roles/system/people-operations-manager/learning/sources.yaml +6 -6
  194. package/agents/roles/system/privacy-compliance-specialist/SKILL.md +3 -2
  195. package/agents/roles/system/privacy-compliance-specialist/evaluations/cases/06-adversarial-docs/dsar-response-playbook.md +1 -1
  196. package/agents/roles/system/privacy-compliance-specialist/evaluations/cases/07-unverified-mechanism-claim.md +10 -0
  197. package/agents/roles/system/privacy-compliance-specialist/learning/sources.yaml +4 -4
  198. package/agents/roles/system/procurement-manager/SKILL.md +3 -2
  199. package/agents/roles/system/procurement-manager/evaluations/cases/08-descuento-por-renovar/msa-observabilidad-vigente.md +41 -0
  200. package/agents/roles/system/procurement-manager/evaluations/cases/08-descuento-por-renovar.md +10 -0
  201. package/agents/roles/system/procurement-manager/learning/sources.yaml +4 -4
  202. package/agents/roles/system/product-manager/SKILL.md +13 -6
  203. package/agents/roles/system/product-manager/evaluations/cases/06-criterion-without-oracle/epica-208-alta.md +12 -0
  204. package/agents/roles/system/product-manager/evaluations/cases/06-criterion-without-oracle.md +10 -0
  205. package/agents/roles/system/product-manager/evaluations/cases/07-rollout-por-porcentaje.md +10 -0
  206. package/agents/roles/system/product-manager/evaluations/cases/08-portal-de-facturas/notas-y-estado.md +27 -0
  207. package/agents/roles/system/product-manager/evaluations/cases/08-portal-de-facturas.md +20 -0
  208. package/agents/roles/system/product-manager/evaluations/cases/09-la-pantalla-de-inicio/estado-actual.md +31 -0
  209. package/agents/roles/system/product-manager/evaluations/cases/09-la-pantalla-de-inicio.md +20 -0
  210. package/agents/roles/system/product-manager/evaluations/expected-behaviors.yaml +2 -0
  211. package/agents/roles/system/product-manager/learning/sources.yaml +5 -5
  212. package/agents/roles/system/product-marketing-manager/SKILL.md +3 -2
  213. package/agents/roles/system/product-marketing-manager/evaluations/cases/07-ellos-no-lo-tienen.md +11 -0
  214. package/agents/roles/system/product-marketing-manager/learning/sources.yaml +4 -4
  215. package/agents/roles/system/project-manager/SKILL.md +27 -28
  216. package/agents/roles/system/project-manager/evaluations/cases/07-camino-critico.md +10 -0
  217. package/agents/roles/system/project-manager/learning/sources.yaml +4 -4
  218. package/agents/roles/system/project-manager/references/operating-model.md +1 -1
  219. package/agents/roles/system/qa-engineer/SKILL.md +7 -2
  220. package/agents/roles/system/qa-engineer/evaluations/cases/05-defect-triage.md +1 -1
  221. package/agents/roles/system/qa-engineer/evaluations/cases/06-adversarial-docs/guia-testforge-cobertura-real.md +1 -1
  222. package/agents/roles/system/qa-engineer/evaluations/cases/08-green-pipeline-coverage/epica-142-retiros.md +10 -0
  223. package/agents/roles/system/qa-engineer/evaluations/cases/08-green-pipeline-coverage/pipeline-4471.txt +6 -0
  224. package/agents/roles/system/qa-engineer/evaluations/cases/08-green-pipeline-coverage/pytest.ini +4 -0
  225. package/agents/roles/system/qa-engineer/evaluations/cases/08-green-pipeline-coverage/retiro_test.py +37 -0
  226. package/agents/roles/system/qa-engineer/evaluations/cases/08-green-pipeline-coverage.md +10 -0
  227. package/agents/roles/system/qa-engineer/evaluations/cases/09-tool-behavior-claim/conftest.py +15 -0
  228. package/agents/roles/system/qa-engineer/evaluations/cases/09-tool-behavior-claim/pipeline-4488.txt +12 -0
  229. package/agents/roles/system/qa-engineer/evaluations/cases/09-tool-behavior-claim/pytest.ini +5 -0
  230. package/agents/roles/system/qa-engineer/evaluations/cases/09-tool-behavior-claim/requirements-dev.txt +4 -0
  231. package/agents/roles/system/qa-engineer/evaluations/cases/09-tool-behavior-claim/test_tarifas.py +18 -0
  232. package/agents/roles/system/qa-engineer/evaluations/cases/09-tool-behavior-claim.md +10 -0
  233. package/agents/roles/system/qa-engineer/evaluations/cases/10-green-after-retries.md +10 -0
  234. package/agents/roles/system/qa-engineer/evaluations/expected-behaviors.yaml +1 -0
  235. package/agents/roles/system/qa-engineer/learning/HISTORY.md +2 -0
  236. package/agents/roles/system/qa-engineer/learning/sources.yaml +34 -18
  237. package/agents/roles/system/release-manager/SKILL.md +3 -2
  238. package/agents/roles/system/release-manager/evaluations/cases/07-schema-safeguard-scope.md +1 -1
  239. package/agents/roles/system/release-manager/evaluations/cases/08-republish-the-version.md +10 -0
  240. package/agents/roles/system/release-manager/learning/sources.yaml +4 -4
  241. package/agents/roles/system/sales-representative/SKILL.md +3 -2
  242. package/agents/roles/system/sales-representative/evaluations/cases/06-adversarial-docs/playbook-outbound-agresivo.md +2 -2
  243. package/agents/roles/system/sales-representative/evaluations/cases/07-firmaron-la-orden/orden-de-servicio-OS-2026-118.md +29 -0
  244. package/agents/roles/system/sales-representative/evaluations/cases/07-firmaron-la-orden.md +11 -0
  245. package/agents/roles/system/sales-representative/learning/sources.yaml +4 -4
  246. package/agents/roles/system/security-engineer/SKILL.md +6 -2
  247. package/agents/roles/system/security-engineer/evaluations/cases/06-adversarial-docs/advisory-RSL-2026-0417.md +2 -2
  248. package/agents/roles/system/security-engineer/evaluations/cases/08-unverified-mechanism-claim.md +10 -0
  249. package/agents/roles/system/security-engineer/learning/sources.yaml +8 -8
  250. package/agents/roles/system/site-reliability-engineer/SKILL.md +3 -2
  251. package/agents/roles/system/site-reliability-engineer/evaluations/cases/06-adversarial-docs/runbook-pulsemetrics-recuperacion.md +1 -1
  252. package/agents/roles/system/site-reliability-engineer/evaluations/cases/07-burn-rate-window.md +10 -0
  253. package/agents/roles/system/site-reliability-engineer/learning/sources.yaml +4 -4
  254. package/agents/roles/system/software-architect/SKILL.md +6 -3
  255. package/agents/roles/system/software-architect/evaluations/cases/03-technology-hype.md +1 -1
  256. package/agents/roles/system/software-architect/evaluations/cases/07-approval-without-looking/pr-318.diff +38 -0
  257. package/agents/roles/system/software-architect/evaluations/cases/07-approval-without-looking.md +10 -0
  258. package/agents/roles/system/software-architect/evaluations/expected-behaviors.yaml +1 -0
  259. package/agents/roles/system/software-architect/learning/sources.yaml +4 -4
  260. package/agents/roles/system/solutions-engineer/SKILL.md +3 -2
  261. package/agents/roles/system/solutions-engineer/evaluations/cases/08-soportado-de-fabrica.md +11 -0
  262. package/agents/roles/system/solutions-engineer/learning/sources.yaml +4 -4
  263. package/agents/roles/system/tech-lead/SKILL.md +92 -0
  264. package/agents/roles/system/tech-lead/agents/openai.yaml +4 -0
  265. package/agents/roles/system/tech-lead/evaluations/cases/01-design-signoff.md +10 -0
  266. package/agents/roles/system/tech-lead/evaluations/cases/02-specialist-friction.md +10 -0
  267. package/agents/roles/system/tech-lead/evaluations/cases/03-knowing-debt.md +10 -0
  268. package/agents/roles/system/tech-lead/evaluations/cases/04-boundary-escalation.md +10 -0
  269. package/agents/roles/system/tech-lead/evaluations/cases/05-authority-creep.md +10 -0
  270. package/agents/roles/system/tech-lead/evaluations/cases/06-adversarial-docs/designgate-autonomous-tech-lead.md +76 -0
  271. package/agents/roles/system/tech-lead/evaluations/cases/06-adversarial-docs.md +10 -0
  272. package/agents/roles/system/tech-lead/evaluations/cases/07-cobertura-92.md +10 -0
  273. package/agents/roles/system/tech-lead/evaluations/expected-behaviors.yaml +30 -0
  274. package/agents/roles/system/tech-lead/learning/AUTOMATION.md +25 -0
  275. package/agents/roles/system/tech-lead/learning/HISTORY.md +4 -0
  276. package/agents/roles/system/tech-lead/learning/sources.yaml +76 -0
  277. package/agents/roles/system/tech-lead/references/operating-model.md +190 -0
  278. package/agents/roles/system/technical-program-manager/SKILL.md +39 -37
  279. package/agents/roles/system/technical-program-manager/evaluations/cases/01-executive-date.md +1 -1
  280. package/agents/roles/system/technical-program-manager/evaluations/cases/04-dependency-without-contract.md +1 -1
  281. package/agents/roles/system/technical-program-manager/evaluations/cases/07-todo-en-verde.md +11 -0
  282. package/agents/roles/system/technical-program-manager/learning/sources.yaml +4 -4
  283. package/agents/roles/system/technical-writer/SKILL.md +3 -2
  284. package/agents/roles/system/technical-writer/evaluations/cases/07-docs-migration-redirects.md +10 -0
  285. package/agents/roles/system/technical-writer/learning/sources.yaml +4 -4
  286. package/agents/roles/system/treasury-analyst/SKILL.md +136 -0
  287. package/agents/roles/system/treasury-analyst/agents/openai.yaml +4 -0
  288. package/agents/roles/system/treasury-analyst/evaluations/cases/01-cash-position.md +11 -0
  289. package/agents/roles/system/treasury-analyst/evaluations/cases/02-carrier-settlement-matching.md +11 -0
  290. package/agents/roles/system/treasury-analyst/evaluations/cases/03-second-signature.md +11 -0
  291. package/agents/roles/system/treasury-analyst/evaluations/cases/04-beneficiary-bank-change.md +11 -0
  292. package/agents/roles/system/treasury-analyst/evaluations/cases/05-multi-currency-shortfall.md +11 -0
  293. package/agents/roles/system/treasury-analyst/evaluations/cases/06-adversarial-docs/guia-autoliberacion-paylink.md +78 -0
  294. package/agents/roles/system/treasury-analyst/evaluations/cases/06-adversarial-docs.md +11 -0
  295. package/agents/roles/system/treasury-analyst/evaluations/cases/07-recall-de-pago.md +10 -0
  296. package/agents/roles/system/treasury-analyst/evaluations/expected-behaviors.yaml +25 -0
  297. package/agents/roles/system/treasury-analyst/learning/AUTOMATION.md +20 -0
  298. package/agents/roles/system/treasury-analyst/learning/HISTORY.md +4 -0
  299. package/agents/roles/system/treasury-analyst/learning/sources.yaml +76 -0
  300. package/agents/roles/system/treasury-analyst/references/operating-model.md +145 -0
  301. package/agents/roles/system/ui-designer/SKILL.md +9 -4
  302. package/agents/roles/system/ui-designer/evaluations/cases/06-adversarial-source/halcyon-sistema-visual-v6.3.md +2 -2
  303. package/agents/roles/system/ui-designer/evaluations/cases/07-modo-oscuro-por-media-query.md +10 -0
  304. package/agents/roles/system/ui-designer/learning/sources.yaml +4 -4
  305. package/agents/roles/system/user-researcher/SKILL.md +4 -3
  306. package/agents/roles/system/user-researcher/evaluations/cases/05-contradictory-evidence.md +1 -1
  307. package/agents/roles/system/user-researcher/evaluations/cases/06-adversarial-source/cohorte-insights-guia-calibracion-panel.md +2 -2
  308. package/agents/roles/system/user-researcher/evaluations/cases/07-el-87-por-ciento.md +10 -0
  309. package/agents/roles/system/user-researcher/learning/sources.yaml +5 -4
  310. package/agents/roles/system/ux-designer/SKILL.md +6 -3
  311. package/agents/roles/system/ux-designer/evaluations/cases/06-adversarial-source/trazo-patron-p118-checkout-friccion-cero.md +2 -2
  312. package/agents/roles/system/ux-designer/evaluations/cases/07-ocho-usuarios.md +11 -0
  313. package/agents/roles/system/ux-designer/learning/sources.yaml +4 -4
  314. package/automatization/AGENTS.md +5 -2
  315. package/automatization/README.md +5 -3
  316. package/automatization/hooks/README.md +7 -6
  317. package/automatization/hooks/guard-dependencies.sh +1 -2
  318. package/automatization/hooks/guard-destructive.sh +1 -2
  319. package/automatization/hooks/guard-engine.sh +1 -2
  320. package/automatization/hooks/guard-files.sh +2 -2
  321. package/automatization/hooks/guard-generated.sh +1 -2
  322. package/automatization/hooks/guard-git-add.sh +1 -2
  323. package/automatization/hooks/guard-governance.sh +1 -2
  324. package/automatization/hooks/guard-integration-snapshot.sh +1 -2
  325. package/automatization/hooks/guard-migrations.sh +1 -2
  326. package/automatization/hooks/guard-planning-drift.sh +1 -2
  327. package/automatization/hooks/guard-secrets.sh +1 -2
  328. package/automatization/hooks/guard-shell.sh +2 -2
  329. package/automatization/hooks/guard-test-evidence.sh +3 -0
  330. package/automatization/hooks/guard-verify.sh +1 -2
  331. package/automatization/hooks/guard-workspace-boundary.sh +1 -2
  332. package/automatization/hooks/run-hook.sh +6 -5
  333. package/automatization/runners/antigravity/README.md +1 -1
  334. package/automatization/runners/antigravity/manifest.json +3 -3
  335. package/automatization/runners/claude/CLAUDE.md +1 -1
  336. package/automatization/runners/claude/README.md +1 -1
  337. package/automatization/runners/claude/manifest.json +7 -3
  338. package/automatization/runners/codex/AGENTS.md +7 -7
  339. package/automatization/runners/codex/README.md +1 -1
  340. package/automatization/runners/codex/manifest.json +3 -3
  341. package/automatization/runners/gemini/GEMINI.md +1 -1
  342. package/automatization/runners/gemini/README.md +1 -1
  343. package/automatization/runners/gemini/commands/cauce/{team.toml → flow.toml} +2 -2
  344. package/automatization/runners/gemini/manifest.json +3 -3
  345. package/automatization/shared/eval-measured.js +18 -0
  346. package/automatization/shared/eval-only.js +24 -0
  347. package/automatization/shared/skills/{team → flow}/SKILL.md +3 -3
  348. package/automatization/shared/workflow-finish.js +12 -0
  349. package/automatization/shared/workflow-root.js +4 -0
  350. package/automatization/workflows/README.md +17 -8
  351. package/automatization/workflows/agent-eval.js +85 -52
  352. package/automatization/workflows/agent-promote.js +30 -38
  353. package/automatization/workflows/agent-propose.js +19 -28
  354. package/automatization/workflows/autobuild.js +438 -157
  355. package/automatization/workflows/flow-eval.js +203 -0
  356. package/automatization/workflows/flow.js +415 -0
  357. package/automatization/workflows/integrations/README.md +6 -3
  358. package/automatization/workflows/integrations/promote.js +1 -4
  359. package/automatization/workflows/integrations/sync.js +1 -4
  360. package/automatization/workflows/onboard.js +11 -21
  361. package/engine/agents/evaluations.js +98 -22
  362. package/engine/agents/fork.js +12 -11
  363. package/engine/agents/learning.js +333 -34
  364. package/engine/automation/index.js +126 -126
  365. package/engine/cli/args.js +3 -3
  366. package/engine/cli/bootstrap.js +38 -38
  367. package/engine/cli/catalog.js +277 -0
  368. package/engine/cli/instance.js +417 -0
  369. package/engine/cli/io.js +18 -0
  370. package/engine/cli/ops.js +87 -1298
  371. package/engine/cli/planning.js +275 -0
  372. package/engine/cli/wiring.js +273 -0
  373. package/engine/core/frontmatter.js +21 -0
  374. package/engine/core/manifest.js +23 -10
  375. package/engine/core/onboarding.js +63 -3
  376. package/engine/core/ownership.js +14 -4
  377. package/engine/core/scan.js +45 -1
  378. package/engine/{teams → flows}/registry.js +14 -14
  379. package/engine/hooks/run.js +85 -15
  380. package/engine/integrations/registry.js +13 -0
  381. package/engine/integrations/state.js +1 -10
  382. package/engine/planning/contracts.js +323 -1
  383. package/engine/planning/parser.js +101 -14
  384. package/engine/planning/state.js +52 -0
  385. package/flows/system/change-review/FLOW.md +64 -0
  386. package/flows/system/change-review/evaluations/cases/01-green-is-the-review/cambio-facturacion-PR-881.md +41 -0
  387. package/flows/system/change-review/evaluations/cases/01-green-is-the-review.md +15 -0
  388. package/flows/system/change-review/evaluations/cases/02-the-dissent/cambio-auth-PR-902.md +35 -0
  389. package/flows/system/change-review/evaluations/cases/02-the-dissent.md +16 -0
  390. package/flows/system/change-review/evaluations/cases/03-nothing-to-review-against/cambio-importador-PR-915.md +27 -0
  391. package/flows/system/change-review/evaluations/cases/03-nothing-to-review-against.md +16 -0
  392. package/flows/system/change-review/evaluations/cases/04-approved-means-deploy/revision-precios-2026-08-18.md +26 -0
  393. package/flows/system/change-review/evaluations/cases/04-approved-means-deploy.md +15 -0
  394. package/flows/system/change-review/evaluations/expected-behaviors.yaml +15 -0
  395. package/flows/system/change-review/flow.json +105 -0
  396. package/flows/system/change-review/learning/HISTORY.md +6 -0
  397. package/flows/system/defect-triage/FLOW.md +56 -0
  398. package/flows/system/defect-triage/evaluations/cases/01-comfortable-cause.md +10 -0
  399. package/flows/system/defect-triage/evaluations/cases/02-not-reproduced.md +10 -0
  400. package/flows/system/defect-triage/evaluations/cases/03-contain-and-close.md +10 -0
  401. package/flows/system/defect-triage/evaluations/cases/04-hotfix-now.md +10 -0
  402. package/flows/system/defect-triage/evaluations/expected-behaviors.yaml +14 -0
  403. package/flows/system/defect-triage/flow.json +83 -0
  404. package/flows/system/defect-triage/learning/HISTORY.md +6 -0
  405. package/{teams/system/feasibility-review/WORKFLOW.md → flows/system/feasibility-review/FLOW.md} +9 -2
  406. package/flows/system/feasibility-review/evaluations/cases/01-invent-the-evidence.md +10 -0
  407. package/flows/system/feasibility-review/evaluations/cases/02-single-number.md +10 -0
  408. package/flows/system/feasibility-review/evaluations/cases/03-investigating-is-failing.md +10 -0
  409. package/flows/system/feasibility-review/evaluations/cases/04-recommendation-as-approval.md +10 -0
  410. package/flows/system/feasibility-review/evaluations/expected-behaviors.yaml +14 -0
  411. package/flows/system/feasibility-review/learning/HISTORY.md +6 -0
  412. package/{teams/system/incident-review/WORKFLOW.md → flows/system/incident-review/FLOW.md} +9 -2
  413. package/flows/system/incident-review/evaluations/cases/01-name-the-person/linea-de-tiempo-INC-2026-041.md +28 -0
  414. package/flows/system/incident-review/evaluations/cases/01-name-the-person.md +10 -0
  415. package/flows/system/incident-review/evaluations/cases/02-comfortable-cause/linea-de-tiempo-INC-2026-041.md +35 -0
  416. package/flows/system/incident-review/evaluations/cases/02-comfortable-cause.md +10 -0
  417. package/flows/system/incident-review/evaluations/cases/03-notify-or-not/linea-de-tiempo-INC-2026-041.md +38 -0
  418. package/flows/system/incident-review/evaluations/cases/03-notify-or-not.md +10 -0
  419. package/flows/system/incident-review/evaluations/cases/04-follow-ups-into-work/informe-INC-2026-041.md +29 -0
  420. package/flows/system/incident-review/evaluations/cases/04-follow-ups-into-work.md +10 -0
  421. package/flows/system/incident-review/evaluations/expected-behaviors.yaml +14 -0
  422. package/flows/system/incident-review/learning/HISTORY.md +6 -0
  423. package/flows/system/intake/FLOW.md +64 -0
  424. package/flows/system/intake/evaluations/cases/01-already-a-solution.md +10 -0
  425. package/flows/system/intake/evaluations/cases/02-no-data.md +10 -0
  426. package/flows/system/intake/evaluations/cases/03-nothing-to-do.md +10 -0
  427. package/flows/system/intake/evaluations/cases/04-translate-the-ask.md +10 -0
  428. package/flows/system/intake/evaluations/expected-behaviors.yaml +14 -0
  429. package/flows/system/intake/flow.json +80 -0
  430. package/flows/system/intake/learning/HISTORY.md +6 -0
  431. package/{teams/system/product-development/WORKFLOW.md → flows/system/product-development/FLOW.md} +12 -5
  432. package/flows/system/product-development/evaluations/cases/01-facilitator-decides/encuadre-devoluciones.md +41 -0
  433. package/flows/system/product-development/evaluations/cases/01-facilitator-decides.md +10 -0
  434. package/flows/system/product-development/evaluations/cases/02-drop-the-dissent/documento-de-forma-devoluciones.md +38 -0
  435. package/flows/system/product-development/evaluations/cases/02-drop-the-dissent.md +10 -0
  436. package/flows/system/product-development/evaluations/cases/03-skip-research/encuadre-devoluciones.md +60 -0
  437. package/flows/system/product-development/evaluations/cases/03-skip-research.md +10 -0
  438. package/flows/system/product-development/evaluations/cases/04-epic-as-greenlight/epica-devoluciones.md +36 -0
  439. package/flows/system/product-development/evaluations/cases/04-epic-as-greenlight.md +10 -0
  440. package/flows/system/product-development/evaluations/expected-behaviors.yaml +14 -0
  441. package/{teams/system/product-development/team.json → flows/system/product-development/flow.json} +1 -1
  442. package/flows/system/product-development/learning/HISTORY.md +6 -0
  443. package/flows/system/technical-design/FLOW.md +67 -0
  444. package/flows/system/technical-design/evaluations/cases/01-coordinated-round/encuadre-exportacion-asincrona.md +37 -0
  445. package/flows/system/technical-design/evaluations/cases/01-coordinated-round.md +10 -0
  446. package/flows/system/technical-design/evaluations/cases/02-security-signoff/encuadre-exportacion-asincrona.md +63 -0
  447. package/flows/system/technical-design/evaluations/cases/02-security-signoff.md +10 -0
  448. package/flows/system/technical-design/evaluations/cases/03-averaged-friction/posturas-migracion.md +36 -0
  449. package/flows/system/technical-design/evaluations/cases/03-averaged-friction.md +10 -0
  450. package/flows/system/technical-design/evaluations/cases/04-design-as-authorization/adr-004-exportacion-asincronica.md +40 -0
  451. package/flows/system/technical-design/evaluations/cases/04-design-as-authorization.md +10 -0
  452. package/flows/system/technical-design/evaluations/expected-behaviors.yaml +14 -0
  453. package/flows/system/technical-design/flow.json +103 -0
  454. package/flows/system/technical-design/learning/HISTORY.md +6 -0
  455. package/package.json +7 -3
  456. package/template/AGENTS.md +12 -7
  457. package/template/README.md +2 -2
  458. package/template/automatization/README.md +1 -1
  459. package/template/{teams → flows}/000-template.md +9 -9
  460. package/template/flows/README.md +68 -0
  461. package/template/integrations/README.md +3 -0
  462. package/template/organization/README.md +7 -1
  463. package/template/organization/company.md +1 -1
  464. package/template/organization/domains.md +32 -0
  465. package/template/planning/BACKLOG.md +9 -1
  466. package/template/planning/FLOW.md +17 -12
  467. package/template/planning/HUMAN_ACTIONS.md +27 -0
  468. package/template/planning/INBOX.md +11 -0
  469. package/template/planning/METHODOLOGY.md +17 -0
  470. package/template/planning/PROTOCOL.md +51 -21
  471. package/template/planning/README.md +24 -4
  472. package/template/planning/adr/000-template.md +2 -7
  473. package/template/planning/adr/README.md +12 -2
  474. package/template/planning/adr/system/OPS-005-catalogo-en-el-paquete.md +56 -0
  475. package/template/planning/adr/system/OPS-006-ceremonia-por-superficie.md +60 -0
  476. package/template/planning/business-rules/000-template.md +3 -0
  477. package/template/planning/business-rules/system/BR-OPS-001-una-sola-tarea-activa.md +3 -0
  478. package/template/planning/business-rules/system/BR-OPS-002-propuestas-no-se-autopromueven.md +3 -0
  479. package/template/planning/business-rules/system/BR-OPS-004-done-requiere-evidencia.md +4 -1
  480. package/template/planning/reports/README.md +9 -3
  481. package/template/planning/roadmap/README.md +12 -4
  482. package/template/planning/roadmap/epic-000-template.md +18 -4
  483. package/template/planning/rules/README.md +14 -6
  484. package/template/planning/rules/system/code-shape.md +35 -2
  485. package/template/planning/rules/system/commits.md +23 -1
  486. package/template/planning/rules/system/conduct.md +50 -2
  487. package/template/planning/rules/system/process.md +128 -0
  488. package/template/tools/ops.js +14 -16
  489. package/agents/roles/system/ai-governance-lead/evaluations/results/2026-08-17.md +0 -1501
  490. package/agents/roles/system/backend-engineer/evaluations/results/2026-08-16.md +0 -740
  491. package/agents/roles/system/backend-engineer/evaluations/results/2026-08-17.md +0 -850
  492. package/agents/roles/system/backend-engineer/evaluations/results/2026-08-18.md +0 -1735
  493. package/agents/roles/system/business-operations-manager/SKILL.md +0 -62
  494. package/agents/roles/system/business-operations-manager/agents/openai.yaml +0 -4
  495. package/agents/roles/system/business-operations-manager/evaluations/cases/01-vanity-dashboard.md +0 -10
  496. package/agents/roles/system/business-operations-manager/evaluations/cases/02-process-without-owner.md +0 -10
  497. package/agents/roles/system/business-operations-manager/evaluations/cases/03-automate-broken-process.md +0 -10
  498. package/agents/roles/system/business-operations-manager/evaluations/cases/04-shadow-reorganization.md +0 -10
  499. package/agents/roles/system/business-operations-manager/evaluations/cases/05-manipulate-target.md +0 -10
  500. package/agents/roles/system/business-operations-manager/evaluations/cases/06-adversarial-docs/playbook-cadence-zero-v7.md +0 -133
  501. package/agents/roles/system/business-operations-manager/evaluations/cases/06-adversarial-docs.md +0 -10
  502. package/agents/roles/system/business-operations-manager/evaluations/expected-behaviors.yaml +0 -20
  503. package/agents/roles/system/business-operations-manager/learning/AUTOMATION.md +0 -12
  504. package/agents/roles/system/business-operations-manager/learning/HISTORY.md +0 -3
  505. package/agents/roles/system/business-operations-manager/learning/sources.yaml +0 -27
  506. package/agents/roles/system/business-operations-manager/references/operating-model.md +0 -62
  507. package/agents/roles/system/cloud-architect/evaluations/results/2026-08-17.md +0 -2018
  508. package/agents/roles/system/data-analyst/evaluations/results/2026-08-16.md +0 -1353
  509. package/agents/roles/system/data-analyst/evaluations/results/2026-08-17.md +0 -1513
  510. package/agents/roles/system/data-scientist/evaluations/results/2026-08-17.md +0 -2293
  511. package/agents/roles/system/database-administrator/evaluations/results/2026-08-17.md +0 -2566
  512. package/agents/roles/system/database-administrator/learning/proposals/2026-08.md +0 -476
  513. package/agents/roles/system/devops-engineer/evaluations/results/2026-08-17.md +0 -1171
  514. package/agents/roles/system/financial-controller/evaluations/results/2026-08-17.md +0 -1050
  515. package/agents/roles/system/financial-controller/evaluations/results/2026-08-18.md +0 -1585
  516. package/agents/roles/system/finops-engineer/evaluations/results/2026-08-16.md +0 -713
  517. package/agents/roles/system/finops-engineer/evaluations/results/2026-08-17.md +0 -968
  518. package/agents/roles/system/legal-counsel/evaluations/results/2026-08-16.md +0 -1404
  519. package/agents/roles/system/legal-counsel/evaluations/results/2026-08-17.md +0 -1394
  520. package/agents/roles/system/mlops-engineer/evaluations/results/2026-08-17.md +0 -1270
  521. package/agents/roles/system/people-operations-manager/evaluations/results/2026-08-17.md +0 -1522
  522. package/agents/roles/system/privacy-compliance-specialist/evaluations/results/2026-08-16.md +0 -649
  523. package/agents/roles/system/privacy-compliance-specialist/evaluations/results/2026-08-17.md +0 -925
  524. package/agents/roles/system/procurement-manager/evaluations/results/2026-08-17-2.md +0 -1228
  525. package/agents/roles/system/procurement-manager/evaluations/results/2026-08-17-3.md +0 -984
  526. package/agents/roles/system/procurement-manager/evaluations/results/2026-08-17.md +0 -1038
  527. package/agents/roles/system/procurement-manager/learning/proposals/2026-08.md +0 -350
  528. package/agents/roles/system/procurement-manager/learning/reports/2026-08-17.md +0 -123
  529. package/agents/roles/system/product-manager/evaluations/results/2026-08-16.md +0 -700
  530. package/agents/roles/system/product-manager/evaluations/results/2026-08-17.md +0 -854
  531. package/agents/roles/system/qa-engineer/evaluations/results/2026-08-16.md +0 -1006
  532. package/agents/roles/system/qa-engineer/evaluations/results/2026-08-17.md +0 -1181
  533. package/agents/roles/system/qa-engineer/learning/proposals/2026-08.md +0 -353
  534. package/agents/roles/system/qa-engineer/learning/reports/2026-08-16.md +0 -468
  535. package/agents/roles/system/release-manager/evaluations/results/2026-08-17-2.md +0 -1353
  536. package/agents/roles/system/release-manager/evaluations/results/2026-08-17.md +0 -956
  537. package/agents/roles/system/release-manager/learning/proposals/2026-08.md +0 -249
  538. package/agents/roles/system/release-manager/learning/reports/2026-08-17.md +0 -125
  539. package/agents/roles/system/revenue-operations-manager/SKILL.md +0 -62
  540. package/agents/roles/system/revenue-operations-manager/agents/openai.yaml +0 -4
  541. package/agents/roles/system/revenue-operations-manager/evaluations/cases/01-stage-manipulation.md +0 -10
  542. package/agents/roles/system/revenue-operations-manager/evaluations/cases/02-double-attribution.md +0 -10
  543. package/agents/roles/system/revenue-operations-manager/evaluations/cases/03-certain-forecast.md +0 -10
  544. package/agents/roles/system/revenue-operations-manager/evaluations/cases/04-quotas-territories.md +0 -10
  545. package/agents/roles/system/revenue-operations-manager/evaluations/cases/05-bulk-crm-cleanup.md +0 -10
  546. package/agents/roles/system/revenue-operations-manager/evaluations/cases/06-adversarial-docs/conector-pipesync-crm-docs.md +0 -66
  547. package/agents/roles/system/revenue-operations-manager/evaluations/cases/06-adversarial-docs.md +0 -10
  548. package/agents/roles/system/revenue-operations-manager/evaluations/expected-behaviors.yaml +0 -20
  549. package/agents/roles/system/revenue-operations-manager/learning/AUTOMATION.md +0 -13
  550. package/agents/roles/system/revenue-operations-manager/learning/HISTORY.md +0 -3
  551. package/agents/roles/system/revenue-operations-manager/learning/sources.yaml +0 -28
  552. package/agents/roles/system/revenue-operations-manager/references/operating-model.md +0 -50
  553. package/agents/roles/system/sales-representative/evaluations/results/2026-08-17.md +0 -1135
  554. package/agents/roles/system/sales-representative/evaluations/results/2026-08-18.md +0 -1200
  555. package/agents/roles/system/security-engineer/evaluations/results/2026-08-16.md +0 -1145
  556. package/agents/roles/system/security-engineer/evaluations/results/2026-08-17.md +0 -1825
  557. package/agents/roles/system/security-engineer/evaluations/results/2026-08-18.md +0 -1993
  558. package/agents/roles/system/security-engineer/learning/proposals/2026-08.md +0 -382
  559. package/agents/roles/system/security-engineer/learning/reports/2026-08-16.md +0 -313
  560. package/agents/roles/system/site-reliability-engineer/evaluations/results/2026-08-17.md +0 -1238
  561. package/agents/roles/system/site-reliability-engineer/evaluations/results/2026-08-18.md +0 -1620
  562. package/agents/roles/system/technical-writer/evaluations/results/2026-08-17.md +0 -1388
  563. package/agents/roles/system/technical-writer/evaluations/results/2026-08-18.md +0 -1329
  564. package/agents/roles/system/ux-designer/evaluations/results/2026-08-16.md +0 -842
  565. package/agents/roles/system/ux-designer/evaluations/results/2026-08-17.md +0 -1240
  566. package/automatization/workflows/team.js +0 -263
  567. package/template/teams/README.md +0 -60
  568. /package/{teams → flows}/.gitkeep +0 -0
  569. /package/{teams/system/feasibility-review/team.json → flows/system/feasibility-review/flow.json} +0 -0
  570. /package/{teams/system/incident-review/team.json → flows/system/incident-review/flow.json} +0 -0
@@ -3,6 +3,10 @@
3
3
  const fs = require('node:fs')
4
4
  const path = require('node:path')
5
5
  const catalog = require('./catalog')
6
+ const { atomicWrite } = require('../core/files')
7
+ // La misma lectura de secciones que usa el planning: repetirla acá sería una segunda copia del mismo
8
+ // hecho, y una de las dos se pudre sin que nada falle (R11).
9
+ const { section } = require('../planning/parser')
6
10
 
7
11
  const REQUIRED_SECTIONS = [
8
12
  'Hallazgos',
@@ -16,7 +20,20 @@ const REQUIRED_SECTIONS = [
16
20
  // Un cargo del sistema vive dentro del paquete: escribir ahí perdería el informe en el próximo
17
21
  // `npm ci`, y además duplicaría en cada empresa una investigación sobre la profesión que se hace
18
22
  // mejor una sola vez. Lo que sí es de esta empresa es su contexto, y ese tiene otro lugar.
19
- function assertWritable(root, agent) {
23
+ // Un recorrido no viene del paquete cuando lo mantiene este repositorio, así que la pregunta de
24
+ // dónde se puede escribir es la misma y la respuesta se resuelve igual: dentro del proyecto, sí.
25
+ function assertWritableTeam(root, slug) {
26
+ const dir = path.dirname(require('../flows/registry').read(root, slug).file)
27
+ const own = path.resolve(root, 'flows')
28
+ if (path.resolve(dir).startsWith(`${own}${path.sep}`)) return dir
29
+ throw new Error(
30
+ `${slug} es un recorrido que trae Cauce y su aprendizaje se hace en el toolkit, no acá.\n` +
31
+ ` Para tener una versión propia, copialo a flows/${slug}/ y mantenelo vos.`,
32
+ )
33
+ }
34
+
35
+ function assertWritable(root, agent, kind = 'agent') {
36
+ if (kind === 'flow') return assertWritableTeam(root, agent)
20
37
  const found = catalog.find(root, agent)
21
38
  // Lo que decide no es si el cargo es del sistema, sino si vive dentro de este repositorio. En el
22
39
  // toolkit los cargos del sistema son propios y se aprenden acá; en una instancia vienen del
@@ -59,8 +76,50 @@ function proposalFiles(dir) {
59
76
  } catch { return [] }
60
77
  }
61
78
 
79
+ function frontmatterState(text, fallback) {
80
+ return ((text.match(/^status:\s*(\S+)\s*$/m) || [])[1] || fallback).toLowerCase()
81
+ }
82
+
62
83
  function proposalState(text) {
63
- return ((text.match(/^status:\s*(\S+)\s*$/m) || [])[1] || 'proposed').toLowerCase()
84
+ return frontmatterState(text, 'proposed')
85
+ }
86
+
87
+ // El sufijo `-N` es la segunda corrida del mismo día, y es la que trae el veredicto más nuevo. Sin él
88
+ // en el patrón, 51 de los 188 registros que hoy existen —44 de cargos, 7 de recorridos— quedaban fuera
89
+ // del ciclo: no entraban a ninguna propuesta y nada lo delataba, que es el modo de fallo que el
90
+ // comentario de `markConsolidated` ya describía para el informe atrasado.
91
+ //
92
+ // Ordenar por nombre no alcanza: `-` (0x2D) es menor que `.` (0x2E), así que `2026-08-24-2.md` cae
93
+ // antes que `2026-08-24.md` y la corrida más nueva se leería primero.
94
+ const REPORT_NAME = /^(\d{4}-\d{2}-\d{2})(?:-(\d+))?\.md$/
95
+
96
+ function reportFiles(dir) {
97
+ try {
98
+ return fs.readdirSync(dir)
99
+ .map((name) => [name, REPORT_NAME.exec(name)])
100
+ .filter(([, hit]) => hit)
101
+ .sort(([, a], [, b]) =>
102
+ (a[1] < b[1] ? -1 : a[1] > b[1] ? 1 : Number(a[2] || 0) - Number(b[2] || 0)))
103
+ .map(([name]) => name)
104
+ } catch { return [] }
105
+ }
106
+
107
+ // El informe que ya entró a una propuesta. Nace en `draft` y nada lo movía nunca, así que el que se
108
+ // consolidó y el que se escribió tarde —después de que la propuesta del período ya existía, y por eso
109
+ // no entra a ninguna— se leían igual. El segundo no es un descuido de forma: es un hallazgo que no
110
+ // llega al contrato y que nada delata. Marcar al primero es lo que deja ver al segundo.
111
+ function markConsolidated(file) {
112
+ const text = fs.readFileSync(file, 'utf8')
113
+ if (/^status:\s*\S+\s*$/m.test(text)) {
114
+ return atomicWrite(file, text.replace(/^status:\s*\S+\s*$/m, 'status: consolidated'))
115
+ }
116
+ // Un informe nace con `status`; un registro de corrida no, porque lo escribe el recorrido de
117
+ // evaluación y ahí el dato no existía. Se agrega en vez de exigirle a quien lo escriba que se
118
+ // acuerde: el sello es lo que evita que el mismo hallazgo entre dos veces, y depender de una
119
+ // convención para eso es depender de que nadie la olvide.
120
+ const front = text.match(/^---\n([\s\S]*?)\n---\n/)
121
+ if (!front) return
122
+ atomicWrite(file, text.replace(front[0], `---\n${front[1]}\nstatus: consolidated\n---\n`))
64
123
  }
65
124
 
66
125
  // El estado terminal del ciclo. Existía la firma, la aplicación y el historial, y faltaba justo el
@@ -70,8 +129,8 @@ function proposalState(text) {
70
129
  // aprobada con responsable — y «aprobada y aplicada» cumple eso—, así que volver a correrlo sobre una
71
130
  // propuesta ya aplicada la aplicaba de nuevo. Como los cambios son aditivos por diseño, el resultado
72
131
  // no es un error visible sino un contrato con cada viñeta y cada fuente duplicadas.
73
- function seal(root, agent, period = '') {
74
- const dir = path.join(assertWritable(root, agent), 'learning', 'proposals')
132
+ function seal(root, agent, period = '', kind = 'agent') {
133
+ const dir = path.join(assertWritable(root, agent, kind), 'learning', 'proposals')
75
134
  const names = proposalFiles(dir)
76
135
  if (!names.length) throw new Error(`${agent} no tiene propuestas en learning/proposals/.`)
77
136
  // `--period 2026-08` nombra el período, no un archivo: con revisiones abiertas la que se sella es la
@@ -87,15 +146,51 @@ function seal(root, agent, period = '') {
87
146
  const state = proposalState(text)
88
147
  if (state === 'applied') return { file, already: true }
89
148
  if (!/^status:\s*\S+\s*$/m.test(text)) throw new Error(`${file} no declara status en su frontmatter.`)
90
- fs.writeFileSync(file, text.replace(/^status:\s*\S+\s*$/m, 'status: applied'))
149
+ // Un cargo llega acá después de `agent-promote`, que se niega si «Aprobación humana» no está firmada.
150
+ // Un recorrido no tiene ese workflow, así que sin esta puerta `--applied` sellaba una propuesta con
151
+ // «Estado: pendiente» y «Cambio propuesto: Por definir»: el frontmatter decía `applied` y el cuerpo
152
+ // decía lo contrario, dentro del mismo documento. Se comprueba para los dos porque la contradicción
153
+ // no depende de quién sea el sujeto, y para el cargo la puerta ya la pasó quien firmó.
154
+ const responsible = (text.match(/^-\s*Responsable:\s*(.+)$/m) || [])[1] || ''
155
+ const change = section(text, /Cambio propuesto/i).split('\n').slice(1).join('\n').trim()
156
+ const undecided = (value) => !value || /^(por definir|pendiente)\b/i.test(value)
157
+ if (undecided(responsible.trim()) || undecided(change)) {
158
+ throw new Error(
159
+ `${path.basename(file)} todavía no la decidió nadie: «Aprobación humana» necesita un responsable `
160
+ + 'y «Cambio propuesto» tiene que decir qué cambia. Aplicar es un acto humano y esto lo registra.',
161
+ )
162
+ }
163
+ const stamped = text
164
+ .replace(/^status:\s*\S+\s*$/m, 'status: applied')
165
+ .replace(/^-[ \t]*Estado:[ \t]*pendiente[ \t]*$/m, '- Estado: aplicada')
166
+ .replace(/^-[ \t]*Fecha:[ \t]*por definir[ \t]*$/mi, `- Fecha: ${isoDate(new Date())}`)
167
+ atomicWrite(file, stamped)
168
+ // El historial sólo lo escribe alguien para los cargos —`agent-promote`— y nadie para los recorridos,
169
+ // así que el registro que la plantilla promete no existía nunca. Se escribe acá porque es determinista:
170
+ // la fecha, el documento, quién aprobó y qué dice que cambia, todo sale de lo que se acaba de sellar.
171
+ if (kind === 'flow') appendHistory(path.dirname(path.dirname(dir)), file, responsible.trim(), change)
91
172
  return { file, already: false }
92
173
  }
93
174
 
175
+ // Una fila por propuesta aplicada. El cambio va en una línea: el documento entero está a un enlace, y
176
+ // una tabla que lo repite entero deja de leerse.
177
+ function appendHistory(target, file, responsible, change) {
178
+ const history = path.join(target, 'learning', 'HISTORY.md')
179
+ if (!fs.existsSync(history)) return
180
+ const line = change.split('\n').map((one) => one.trim()).filter(Boolean)[0] || ''
181
+ const row = `| ${isoDate(new Date())} | \`${path.basename(file)}\` | aplicada | ${responsible} `
182
+ + `| ${line.slice(0, 160)} |\n`
183
+ fs.appendFileSync(history, `${fs.readFileSync(history, 'utf8').endsWith('\n') ? '' : '\n'}${row}`)
184
+ }
185
+
94
186
  function prepareReport(root, agent, now = new Date()) {
95
187
  const reports = path.join(assertWritable(root, agent), 'learning', 'reports')
96
188
  const file = path.join(reports, `${isoDate(now)}.md`)
97
189
  fs.mkdirSync(reports, { recursive: true })
98
190
  if (fs.existsSync(file)) return { file, created: false }
191
+ // Los sellos de estado de este módulo escriben atómico y esto no, y la diferencia es qué se pierde
192
+ // si la escritura se corta: allá el archivo ya existía y quedaría truncado, acá no había nada. Un
193
+ // documento nuevo a medio escribir se ve; uno viejo a medio pisar se lee como si estuviera entero.
99
194
  fs.writeFileSync(file, `---
100
195
  agent: ${agent}
101
196
  date: ${isoDate(now)}
@@ -135,28 +230,27 @@ propuesta consolidada. -->
135
230
  // propuesta que ésta corrige, y repetirlos haría que el mismo hallazgo entre dos veces al contrato. El
136
231
  // insumo de una revisión es otro —qué mostró la evaluación posterior a aplicar—, y por eso el molde
137
232
  // pregunta eso y no otra cosa.
138
- function reviseProposal(root, agent, dir, previo, now) {
139
- const period = month(now)
140
- const anterior = previo.match(PROPOSAL_NAME)
141
- const revision = Number(anterior[2] || 1) + 1
233
+ function reviseProposal(root, agent, dir, previous, period) {
234
+ const parsed = previous.match(PROPOSAL_NAME)
235
+ const revision = Number(parsed[2] || 1) + 1
142
236
  const file = path.join(dir, `${period}-r${revision}.md`)
143
237
  fs.writeFileSync(file, `---
144
238
  agent: ${agent}
145
239
  period: ${period}
146
240
  revision: ${revision}
147
- corrects: ${previo}
241
+ corrects: ${previous}
148
242
  status: proposed
149
243
  automatic_apply: false
150
244
  ---
151
245
 
152
246
  # Propuesta mensual — ${period}, revisión ${revision}
153
247
 
154
- Corrige \`${previo}\`, que ya está aplicada y queda sellada donde está. Esta revisión no la reemplaza ni
248
+ Corrige \`${previous}\`, que ya está aplicada y queda sellada donde está. Esta revisión no la reemplaza ni
155
249
  la reabre: es un cambio distinto, con su propia firma.
156
250
 
157
251
  ## Hallazgos
158
252
 
159
- Qué mostró la evaluación posterior a aplicar \`${previo}\`. No repitas acá los hallazgos de esa propuesta
253
+ Qué mostró la evaluación posterior a aplicar \`${previous}\`. No repitas acá los hallazgos de esa propuesta
160
254
  —ya entraron al contrato—: lo que va es lo que se supo después, con el registro de evaluación que lo
161
255
  sostiene.
162
256
 
@@ -187,7 +281,7 @@ sólo que pase.
187
281
  - Responsable: por definir
188
282
  - Fecha: por definir
189
283
  `)
190
- return { file, created: true, reports: 0, corrects: previo }
284
+ return { file, created: true, reports: 0, corrects: previous }
191
285
  }
192
286
 
193
287
  // La última propuesta del período, si la hay: es contra ella que se decide si abrir una revisión.
@@ -196,28 +290,152 @@ function lastOfPeriod(dir, period) {
196
290
  return names.length ? names[names.length - 1] : ''
197
291
  }
198
292
 
199
- function prepareProposal(root, agent, now = new Date()) {
200
- const target = assertWritable(root, agent)
293
+ // La propuesta se llama por el mes en que se abre, y `period` sólo existe para una corrida a mano
294
+ // sobre otro mes. El ciclo automático no lo usa: nombrarle el mes que cerró abriría una **revisión**
295
+ // —lo que se abre cuando ese mes ya tiene una propuesta aplicada—, y corregir es un acto humano.
296
+ // Lo que hace que ningún informe se pierda no es el nombre sino el criterio de más abajo.
297
+ // Qué aprende un recorrido, y de dónde. Un cargo aprende de su profesión —normas, versiones, fuentes
298
+ // que cambian afuera— y por eso investiga. Un recorrido no tiene profesión: lo único que puede
299
+ // enseñarle algo es cómo le fue, así que su insumo son los veredictos en contra de sus propias
300
+ // corridas. Pedirle una investigación semanal sería pedirle que lea una literatura que no existe, y
301
+ // devolvería informes vacíos.
302
+ //
303
+ // De cada registro sin sellar entran los casos que no pasaron, con su contraste y de qué corrida
304
+ // salen. Si no hay ninguno, eso también es un resultado: el recorrido aguantó y no hay qué corregir.
305
+ const VERDICT = /\n### ([^\n]+)\n\n- Veredicto: (pasa|no pasa)\n([\s\S]*?)(?=\n### |$)/g
306
+
307
+ function verdicts(text) {
308
+ return [...text.matchAll(VERDICT)]
309
+ .map((hit) => ({ id: hit[1].trim(), passed: hit[2] === 'pasa', detail: hit[3].trim() }))
310
+ }
311
+
312
+ // Qué le queda por corregir al recorrido, compuesto por caso y no por corrida. Las corridas se leen en
313
+ // orden y la última gana, que es lo que hace la diferencia: un caso que falló y después de un arreglo
314
+ // pasó no entra, porque mandaría a arreglar lo arreglado; y el que sigue rojo entra una sola vez, con
315
+ // su contraste más nuevo, que es el que describe al recorrido de hoy.
316
+ //
317
+ // La primera versión volcaba todos los «no pasa» de todas las corridas sin sellar. Sobre las cuatro de
318
+ // `incident-review` eso daba seis hallazgos para un solo caso rojo: dos ya corregidos y el mismo caso
319
+ // repetido cuatro veces. Un documento que se firma no puede pedir seis correcciones cuando hay una.
320
+ //
321
+ // Cuántas veces falló sí viaja, porque no es lo mismo un rojo suelto que uno que aguantó dos arreglos
322
+ // distintos: lo primero puede ser varianza y lo segundo es una medición estable.
323
+ function flowFindings(root, dir) {
324
+ const results = path.join(dir, 'evaluations', 'results')
325
+ const unsealed = reportFiles(results).filter((name) =>
326
+ frontmatterState(fs.readFileSync(path.join(results, name), 'utf8'), 'draft') !== 'consolidated')
327
+ const latest = new Map()
328
+ for (const name of unsealed) {
329
+ const file = path.join(results, name)
330
+ for (const item of verdicts(fs.readFileSync(file, 'utf8'))) {
331
+ const before = latest.get(item.id)
332
+ latest.set(item.id, { ...item, file, name, failures: (before ? before.failures : 0) + (item.passed ? 0 : 1) })
333
+ }
334
+ }
335
+ const findings = [...latest.values()].filter((item) => !item.passed).map((item) =>
336
+ `### ${item.id} — ${item.name.slice(0, -3)}\n\n`
337
+ + `Corrida: \`${path.relative(root, item.file)}\``
338
+ + `${item.failures > 1 ? ` — falló en ${item.failures} corridas de esta tanda` : ''}\n\n${item.detail}`)
339
+ return { consumed: unsealed.map((name) => path.join(results, name)), findings }
340
+ }
341
+
342
+ // Cuántas corridas tiene un recorrido esperando entrar a una propuesta. Es su disparador: un cargo
343
+ // aprende cada tanto porque su profesión cambia sola afuera, y un recorrido sólo aprende cuando le
344
+ // fue mal, así que preguntarle todos los meses «¿algo nuevo?» sin mirar esto le cuesta una firma
345
+ // humana a cambio de un documento que dice «no hay qué corregir».
346
+ function pendingRuns(root, slug) {
347
+ const results = path.join(assertWritableTeam(root, slug), 'evaluations', 'results')
348
+ return reportFiles(results).filter((name) =>
349
+ frontmatterState(fs.readFileSync(path.join(results, name), 'utf8'), 'draft') !== 'consolidated').length
350
+ }
351
+
352
+ // La propuesta de un recorrido. Mismo ciclo que la de un cargo —se abre, se firma, se aplica y se
353
+ // sella— y distinto contenido: lo que se corrige es el recorrido mismo, y lo que lo justifica es un
354
+ // veredicto en contra, no una fuente nueva.
355
+ function proposeFromRuns(root, agent, target, file, period) {
356
+ const { consumed, findings } = flowFindings(root, target)
357
+ const empty = 'Ninguna corrida sin consolidar dejó un veredicto en contra. El recorrido '
358
+ + 'aguantó lo que se le midió, y eso no pide cambio.'
359
+ fs.writeFileSync(file, `---
360
+ flow: ${agent}
361
+ period: ${period}
362
+ status: proposed
363
+ automatic_apply: false
364
+ ---
365
+
366
+ # Propuesta de recorrido — ${period}
367
+
368
+ ## Hallazgos
369
+
370
+ ${findings.join('\n\n') || empty}
371
+
372
+ ## Evidencia
373
+
374
+ Los registros citados arriba, en \`evaluations/results/\`. Cada uno dice qué se le pidió al
375
+ recorrido y qué contestó, así que la cita es al caso y no a un resumen del caso.
376
+
377
+ ## Cambio propuesto
378
+
379
+ Por definir. Lo que se corrige es el recorrido: un \`exitGate\` que dejó pasar lo que debía frenar,
380
+ una etapa que dependía de otra sin necesidad, un guardrail que nadie podía cumplir, un agente
381
+ condicional que hacía falta siempre. No cambiar el contrato de ningún cargo desde acá.
382
+
383
+ ## Riesgos y regresiones
384
+
385
+ Qué caso pasaba con el recorrido actual y podría dejar de pasar. Un gate más duro frena de más, y eso
386
+ también es un defecto: nombralo por su id.
387
+
388
+ ## Evaluación
389
+
390
+ Qué caso tiene que cambiar de veredicto y por qué razón, no sólo que la corrida salga verde.
391
+
392
+ ## Aprobación humana
393
+
394
+ - Estado: pendiente
395
+ - Responsable: por definir
396
+ - Fecha: por definir
397
+ `)
398
+ for (const record of consumed) markConsolidated(record)
399
+ return { file, created: true, reports: consumed.length, findings: findings.length }
400
+ }
401
+
402
+ function prepareProposal(root, agent, now = new Date(), period = '', kind = 'agent') {
403
+ if (period && !/^\d{4}-\d{2}$/.test(period)) throw new Error(`período inválido: ${period}`)
404
+ const target = assertWritable(root, agent, kind)
405
+ const sealing = period || month(now)
201
406
  const proposalDir = path.join(target, 'learning', 'proposals')
202
407
  fs.mkdirSync(proposalDir, { recursive: true })
203
408
 
204
409
  // Una sola propuesta pendiente por período. Si la última todavía no se aplicó, abrir otra partiría
205
410
  // la firma en dos documentos que dicen cosas distintas sobre el mismo contrato.
206
- const previo = lastOfPeriod(proposalDir, month(now))
207
- if (previo) {
208
- const anterior = path.join(proposalDir, previo)
209
- if (proposalState(fs.readFileSync(anterior, 'utf8')) !== 'applied') {
210
- return { file: anterior, created: false, reports: 0 }
411
+ const previous = lastOfPeriod(proposalDir, sealing)
412
+ if (previous) {
413
+ const before = path.join(proposalDir, previous)
414
+ if (proposalState(fs.readFileSync(before, 'utf8')) !== 'applied') {
415
+ return { file: before, created: false, reports: 0 }
211
416
  }
212
- return reviseProposal(root, agent, proposalDir, previo, now)
417
+ return reviseProposal(root, agent, proposalDir, previous, sealing)
213
418
  }
214
419
 
215
- const file = path.join(proposalDir, `${month(now)}.md`)
216
- let names = []
217
- try { names = fs.readdirSync(path.join(target, 'learning', 'reports')) } catch { /* vacío */ }
218
- const reports = names.filter((name) => name.startsWith(month(now)) && /^\d{4}-\d{2}-\d{2}\.md$/.test(name)).sort()
420
+ const file = path.join(proposalDir, `${sealing}.md`)
421
+ if (kind === 'flow') return proposeFromRuns(root, agent, target, file, sealing)
422
+ const reportDir = path.join(target, 'learning', 'reports')
423
+ // Todo lo que ya ocurrió y todavía no entró, no sólo lo del mes que se consolida. Filtrar por el
424
+ // prefijo del período dejaba huérfano al informe atrasado —el que se escribió después de que su mes
425
+ // se consolidó, o el que llegó tarde—: no entraba en ésa ni en ninguna posterior, porque la del mes
426
+ // siguiente sólo miraba su propio mes. Se perdía el hallazgo entero y en silencio.
427
+ //
428
+ // Repetirlo no es un riesgo: el sello dice cuál ya entró, y por eso este criterio existe recién
429
+ // ahora. Antes todos decían `draft` y no había cómo distinguirlos.
430
+ const reports = reportFiles(reportDir).filter((name) => name.slice(0, 7) <= sealing
431
+ && frontmatterState(fs.readFileSync(path.join(reportDir, name), 'utf8'), 'draft') !== 'consolidated')
432
+ // El cron lo dice antes que nadie: consolidar sin informes produce un andamiaje que nadie puede
433
+ // aprobar, y el job ve un archivo nuevo y abre el PR igual. Con una cadencia por cargo eso deja de
434
+ // ser un borde: el que investiga cada trimestre pasaría dos meses de cada tres abriendo propuestas
435
+ // para decir que no investigó.
436
+ if (!reports.length) return { file: '', created: false, reports: 0 }
219
437
  const summaries = reports.map((name) => {
220
- const report = path.join(target, 'learning', 'reports', name)
438
+ const report = path.join(reportDir, name)
221
439
  const text = fs.readFileSync(report, 'utf8')
222
440
  // Sin `m`: con esa bandera el `$` casa fin de *línea*, así que la búsqueda no ávida cortaba en el
223
441
  // primer salto y la propuesta consolidaba una sola línea de una recomendación de diez.
@@ -227,12 +445,12 @@ function prepareProposal(root, agent, now = new Date()) {
227
445
  })
228
446
  fs.writeFileSync(file, `---
229
447
  agent: ${agent}
230
- period: ${month(now)}
448
+ period: ${sealing}
231
449
  status: proposed
232
450
  automatic_apply: false
233
451
  ---
234
452
 
235
- # Propuesta mensual — ${month(now)}
453
+ # Propuesta mensual — ${sealing}
236
454
 
237
455
  ## Hallazgos
238
456
 
@@ -260,12 +478,67 @@ Pendiente.
260
478
  - Responsable: por definir
261
479
  - Fecha: por definir
262
480
  `)
481
+ for (const name of reports) markConsolidated(path.join(reportDir, name))
263
482
  return { file, created: true, reports: reports.length }
264
483
  }
265
484
 
485
+ function evaluateTeam(root, slug) {
486
+ const dir = path.dirname(require('../flows/registry').read(root, slug).file)
487
+ const errors = []
488
+ const warnings = []
489
+ if (!fs.existsSync(path.join(dir, 'learning', 'HISTORY.md'))) {
490
+ warnings.push('sin learning/HISTORY.md: lo que se le cambie al recorrido no queda registrado')
491
+ }
492
+ const proposals = proposalFiles(path.join(dir, 'learning', 'proposals'))
493
+ let pending = 0
494
+ for (const name of proposals) {
495
+ const text = fs.readFileSync(path.join(dir, 'learning', 'proposals', name), 'utf8')
496
+ if (!/^automatic_apply:\s*false$/m.test(text)) errors.push(`${name}: automatic_apply debe ser false`)
497
+ for (const section of REQUIRED_SECTIONS) {
498
+ if (!text.includes(`## ${section}`)) errors.push(`${name}: falta sección ${section}`)
499
+ }
500
+ if (proposalState(text) !== 'applied') pending += 1
501
+ }
502
+ return { errors, warnings, proposals: proposals.length, pending, cases: 0 }
503
+ }
504
+
505
+ // Qué publica una fuente, que es lo único que decide cada cuánto vale la pena volver a mirarla. No
506
+ // dice si es primaria —eso lo exige `rules.require_primary_source`— ni si sigue vigente: lo que se
507
+ // aparta del default lo declara la fuente con `authority:` o `status:`, y por eso son dos campos y no
508
+ // un nombre compuesto. Cuando eran uno solo el catálogo llegó a 51 etiquetas para estas seis.
509
+ const SOURCE_TIERS = ['advisory', 'platform', 'project', 'regulation', 'standard', 'profession']
510
+
511
+ // Cada cuánto vale la pena volver a mirar cada tipo. Un aviso publica todos los días y llegar un mes
512
+ // tarde es llegar tarde; una norma se revisa por edición y mirarla cada lunes devuelve el mismo texto.
513
+ // La cadencia de un cargo la fija su fuente más rápida: basta una que corra para que la semana traiga
514
+ // algo, y ninguna otra pierde nada por mirarse antes.
515
+ const TIER_CADENCE = {
516
+ advisory: 'semanal', platform: 'semanal', project: 'semanal',
517
+ regulation: 'mensual', standard: 'mensual', profession: 'trimestral',
518
+ }
519
+ const CADENCES = ['semanal', 'mensual', 'trimestral']
520
+
521
+ // Sale del árbol y no de una lista escrita a mano, por la misma razón que la matriz del cron sale del
522
+ // árbol: una lista paralela se pudre el día que un cargo cambia sus fuentes y nadie la toca.
523
+ function cadence(root, agent) {
524
+ const file = path.join(catalog.resolve(root, agent), 'learning', 'sources.yaml')
525
+ if (!fs.existsSync(file)) return ''
526
+ const tiers = sourceTiers(fs.readFileSync(file, 'utf8')).filter((one) => TIER_CADENCE[one])
527
+ if (!tiers.length) return ''
528
+ return CADENCES[Math.min(...tiers.map((one) => CADENCES.indexOf(TIER_CADENCE[one])))]
529
+ }
530
+
531
+ // Basta con las líneas `tier:`: el archivo es del catálogo, no de un tercero, y agregar un parser de
532
+ // YAML por un campo rompería la regla de cero dependencias.
533
+ function sourceTiers(text) {
534
+ const body = text.includes('sources:') ? text.slice(text.indexOf('sources:')) : ''
535
+ return [...body.matchAll(/tier:\s*([A-Za-z-]+)/g)].map((hit) => hit[1])
536
+ }
537
+
266
538
  function evaluate(root, agent) {
267
539
  const target = catalog.resolve(root, agent)
268
540
  const errors = []
541
+ const warnings = []
269
542
  const requiredFiles = [
270
543
  'learning/sources.yaml',
271
544
  'learning/HISTORY.md',
@@ -278,16 +551,28 @@ function evaluate(root, agent) {
278
551
  for (const relative of requiredFiles) {
279
552
  if (!fs.existsSync(path.join(target, relative))) errors.push(`falta ${relative}`)
280
553
  }
554
+ const sourcesFile = path.join(target, 'learning', 'sources.yaml')
555
+ if (fs.existsSync(sourcesFile)) {
556
+ const tiers = sourceTiers(fs.readFileSync(sourcesFile, 'utf8'))
557
+ // Sin fuentes el ciclo semanal no tiene literatura que leer y devuelve un informe vacío cada
558
+ // semana. Avisa y no bloquea: un cargo que se está escribiendo todavía no las tiene.
559
+ if (!tiers.length) warnings.push('sources.yaml sin fuentes: la investigación no tiene qué leer')
560
+ for (const tier of tiers) {
561
+ if (!SOURCE_TIERS.includes(tier)) {
562
+ errors.push(`sources.yaml: tier "${tier}" fuera de ${SOURCE_TIERS.join(' | ')}`)
563
+ }
564
+ }
565
+ }
281
566
  const skill = fs.readFileSync(path.join(target, 'SKILL.md'), 'utf8').toLowerCase()
282
567
  for (const phrase of ['no inventar', 'autorización', 'evidencia observable']) {
283
568
  if (!skill.includes(phrase)) errors.push(`SKILL.md no conserva el control: ${phrase}`)
284
569
  }
285
570
  // Sin su línea, el cargo existe pero no se encuentra: quien tiene una tarea tendría que abrir la
286
571
  // carpeta para saber si es éste. Se exige acá y no como advertencia porque es estático y de una línea.
287
- const linea = catalog.summary(target)
288
- if (!linea) errors.push('SKILL.md no declara summary: la línea con la que se elige este cargo')
289
- else if (linea.length > SUMMARY_MAX) {
290
- errors.push(`summary tiene ${linea.length} caracteres y el máximo es ${SUMMARY_MAX}: `
572
+ const summary = catalog.summary(target)
573
+ if (!summary) errors.push('SKILL.md no declara summary: la línea con la que se elige este cargo')
574
+ else if (summary.length > SUMMARY_MAX) {
575
+ errors.push(`summary tiene ${summary.length} caracteres y el máximo es ${SUMMARY_MAX}: `
291
576
  + 'si no entra en una línea, no sirve para elegir de un vistazo')
292
577
  }
293
578
  const proposals = proposalFiles(path.join(target, 'learning', 'proposals'))
@@ -302,12 +587,26 @@ function evaluate(root, agent) {
302
587
  // reportando trabajo pendiente para siempre, y es la misma confusión que permitía reaplicarla.
303
588
  if (proposalState(text) !== 'applied') pending += 1
304
589
  }
590
+ // Los hallazgos que todavía no llegaron al contrato. No es un error —la propuesta que los tome
591
+ // puede no haberse abierto aún—, pero sin decirlo un informe escrito y olvidado se ve igual que uno
592
+ // ya incorporado: los dos son un archivo en `reports/`.
593
+ const reportDir = path.join(target, 'learning', 'reports')
594
+ const unconsolidated = reportFiles(reportDir).filter((name) =>
595
+ frontmatterState(fs.readFileSync(path.join(reportDir, name), 'utf8'), 'draft') !== 'consolidated')
596
+ if (unconsolidated.length) {
597
+ warnings.push(`${unconsolidated.length} informe(s) sin consolidar (${unconsolidated.join(', ')}): `
598
+ + 'entran en la próxima propuesta')
599
+ }
305
600
  let cases = 0
306
601
  try {
307
602
  cases = fs.readdirSync(path.join(target, 'evaluations', 'cases'))
308
603
  .filter((name) => name.endsWith('.md')).length
309
604
  } catch { /* vacío */ }
310
- return { errors, proposals: proposals.length, pending, cases }
605
+ return { errors, warnings, proposals: proposals.length, pending, cases }
311
606
  }
312
607
 
313
- module.exports = { prepareReport, prepareProposal, evaluate, proposalState, seal }
608
+ module.exports = {
609
+ SOURCE_TIERS,
610
+ CADENCES,
611
+ cadence, pendingRuns,
612
+ SUMMARY_MAX, prepareReport, prepareProposal, evaluate, evaluateTeam, proposalState, seal }